From b42610267b8dc667009937920f533d4c13638f43 Mon Sep 17 00:00:00 2001 From: drishlekh Date: Sun, 29 Jun 2025 14:57:07 +0530 Subject: [PATCH] Added Call feature using Twilio --- __pycache__/metrics_logger.cpython-312.pyc | Bin 6066 -> 6066 bytes __pycache__/twilio_stream.cpython-312.pyc | Bin 0 -> 4672 bytes call_twilio.py | 55 + requirements.txt | Bin 714 -> 786 bytes twilio_stream.py | 102 + .../__pycache__/deprecation.cpython-312.pyc | Bin 10670 -> 10670 bytes .../mypy_extensions.cpython-312.pyc | Bin 10282 -> 10282 bytes .../__pycache__/six.cpython-312.pyc | Bin 41395 -> 41395 bytes .../typing_extensions.cpython-312.pyc | Bin 162184 -> 162184 bytes .../typing_inspect.cpython-312.pyc | Bin 32452 -> 32452 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1301 -> 1301 bytes .../aenum/__pycache__/_common.cpython-312.pyc | Bin 15274 -> 15274 bytes .../__pycache__/_constant.cpython-312.pyc | Bin 8423 -> 8423 bytes .../aenum/__pycache__/_enum.cpython-312.pyc | Bin 137433 -> 137433 bytes .../aenum/__pycache__/_py3.cpython-312.pyc | Bin 822 -> 822 bytes .../aenum/__pycache__/_tuple.cpython-312.pyc | Bin 22935 -> 22935 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 510 -> 510 bytes .../aiofiles/__pycache__/base.cpython-312.pyc | Bin 4033 -> 4033 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 8372 -> 8372 bytes .../__pycache__/temptypes.cpython-312.pyc | Bin 3736 -> 3736 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4496 -> 4496 bytes .../__pycache__/binary.cpython-312.pyc | Bin 2878 -> 2878 bytes .../__pycache__/text.cpython-312.pyc | Bin 1524 -> 1524 bytes .../__pycache__/utils.cpython-312.pyc | Bin 3913 -> 3913 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 497 -> 497 bytes .../__pycache__/_staggered.cpython-312.pyc | Bin 7999 -> 7999 bytes .../__pycache__/impl.cpython-312.pyc | Bin 10110 -> 10110 bytes .../__pycache__/types.cpython-312.pyc | Bin 593 -> 593 bytes .../__pycache__/utils.cpython-312.pyc | Bin 3705 -> 3705 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5309 -> 5309 bytes .../_cookie_helpers.cpython-312.pyc | Bin 7666 -> 7666 bytes .../aiohttp/__pycache__/abc.cpython-312.pyc | Bin 12473 -> 12473 bytes .../__pycache__/base_protocol.cpython-312.pyc | Bin 4515 -> 4515 bytes .../__pycache__/client.cpython-312.pyc | Bin 55477 -> 55477 bytes .../client_exceptions.cpython-312.pyc | Bin 17968 -> 17968 bytes ...ent_middleware_digest_auth.cpython-312.pyc | Bin 16260 -> 16260 bytes .../client_middlewares.cpython-312.pyc | Bin 2268 -> 2268 bytes .../__pycache__/client_proto.cpython-312.pyc | Bin 13373 -> 13373 bytes .../__pycache__/client_reqrep.cpython-312.pyc | Bin 64686 -> 64686 bytes .../__pycache__/client_ws.cpython-312.pyc | Bin 22500 -> 22500 bytes .../compression_utils.cpython-312.pyc | Bin 15144 -> 15144 bytes .../__pycache__/connector.cpython-312.pyc | Bin 75617 -> 75617 bytes .../__pycache__/cookiejar.cpython-312.pyc | Bin 21453 -> 21453 bytes .../__pycache__/formdata.cpython-312.pyc | Bin 7610 -> 7610 bytes .../aiohttp/__pycache__/hdrs.cpython-312.pyc | Bin 8474 -> 8474 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 41723 -> 41723 bytes .../aiohttp/__pycache__/http.cpython-312.pyc | Bin 1675 -> 1675 bytes .../http_exceptions.cpython-312.pyc | Bin 6144 -> 6144 bytes .../__pycache__/http_parser.cpython-312.pyc | Bin 35632 -> 35632 bytes .../http_websocket.cpython-312.pyc | Bin 963 -> 963 bytes .../__pycache__/http_writer.cpython-312.pyc | Bin 14525 -> 14525 bytes .../aiohttp/__pycache__/log.cpython-312.pyc | Bin 712 -> 712 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 52655 -> 52655 bytes .../__pycache__/payload.cpython-312.pyc | Bin 48456 -> 48456 bytes .../payload_streamer.cpython-312.pyc | Bin 4400 -> 4400 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 10922 -> 10922 bytes .../__pycache__/streams.cpython-312.pyc | Bin 30957 -> 30957 bytes .../__pycache__/tcp_helpers.cpython-312.pyc | Bin 1771 -> 1771 bytes .../__pycache__/tracing.cpython-312.pyc | Bin 22543 -> 22543 bytes .../__pycache__/typedefs.cpython-312.pyc | Bin 2264 -> 2264 bytes .../aiohttp/__pycache__/web.cpython-312.pyc | Bin 16479 -> 16479 bytes .../__pycache__/web_app.cpython-312.pyc | Bin 27329 -> 27329 bytes .../web_exceptions.cpython-312.pyc | Bin 14996 -> 14996 bytes .../web_fileresponse.cpython-312.pyc | Bin 17196 -> 17196 bytes .../__pycache__/web_log.cpython-312.pyc | Bin 10668 -> 10668 bytes .../web_middlewares.cpython-312.pyc | Bin 5620 -> 5620 bytes .../__pycache__/web_protocol.cpython-312.pyc | Bin 31271 -> 31271 bytes .../__pycache__/web_request.cpython-312.pyc | Bin 38582 -> 38582 bytes .../__pycache__/web_response.cpython-312.pyc | Bin 39178 -> 39178 bytes .../__pycache__/web_routedef.cpython-312.pyc | Bin 11891 -> 11891 bytes .../__pycache__/web_runner.cpython-312.pyc | Bin 19031 -> 19031 bytes .../__pycache__/web_server.cpython-312.pyc | Bin 4899 -> 4899 bytes .../web_urldispatcher.cpython-312.pyc | Bin 68652 -> 68652 bytes .../__pycache__/web_ws.cpython-312.pyc | Bin 31569 -> 31569 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 235 -> 235 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 5982 -> 5982 bytes .../__pycache__/models.cpython-312.pyc | Bin 3445 -> 3445 bytes .../__pycache__/reader.cpython-312.pyc | Bin 731 -> 731 bytes .../__pycache__/writer.cpython-312.pyc | Bin 6354 -> 6354 bytes .../aiohttp_retry-2.9.1.dist-info/AUTHORS | 1 + .../INSTALLER | 0 .../aiohttp_retry-2.9.1.dist-info/LICENSE | 8 + .../aiohttp_retry-2.9.1.dist-info/METADATA | 261 + .../aiohttp_retry-2.9.1.dist-info/RECORD | 16 + .../aiohttp_retry-2.9.1.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/aiohttp_retry/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 234 bytes .../__pycache__/client.cpython-312.pyc | Bin 0 -> 14787 bytes .../__pycache__/retry_options.cpython-312.pyc | Bin 0 -> 8763 bytes .../__pycache__/types.cpython-312.pyc | Bin 0 -> 349 bytes .../Lib/site-packages/aiohttp_retry/client.py | 415 ++ .../REQUESTED => aiohttp_retry/py.typed} | 0 .../aiohttp_retry/retry_options.py | 228 + venv/Lib/site-packages/aiohttp_retry/types.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 1657 -> 1657 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 18611 -> 18611 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3573 -> 3573 bytes .../__pycache__/from_thread.cpython-312.pyc | Bin 24081 -> 24081 bytes .../__pycache__/lowlevel.cpython-312.pyc | Bin 6956 -> 6956 bytes .../__pycache__/to_thread.cpython-312.pyc | Bin 2929 -> 2929 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 180 -> 180 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 132751 -> 132751 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 176 -> 176 bytes .../__pycache__/_eventloop.cpython-312.pyc | Bin 6334 -> 6334 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 6048 -> 6048 bytes .../_core/__pycache__/_fileio.cpython-312.pyc | Bin 41607 -> 41607 bytes .../__pycache__/_resources.cpython-312.pyc | Bin 929 -> 929 bytes .../__pycache__/_signals.cpython-312.pyc | Bin 1261 -> 1261 bytes .../__pycache__/_sockets.cpython-312.pyc | Bin 31535 -> 31535 bytes .../__pycache__/_streams.cpython-312.pyc | Bin 2324 -> 2324 bytes .../__pycache__/_subprocesses.cpython-312.pyc | Bin 9636 -> 9636 bytes .../_synchronization.cpython-312.pyc | Bin 32175 -> 32175 bytes .../_core/__pycache__/_tasks.cpython-312.pyc | Bin 6981 -> 6981 bytes .../__pycache__/_tempfile.cpython-312.pyc | Bin 28128 -> 28128 bytes .../__pycache__/_testing.cpython-312.pyc | Bin 3556 -> 3556 bytes .../__pycache__/_typedattr.cpython-312.pyc | Bin 3826 -> 3826 bytes .../abc/__pycache__/__init__.cpython-312.pyc | Bin 2216 -> 2216 bytes .../__pycache__/_eventloop.cpython-312.pyc | Bin 14965 -> 14965 bytes .../__pycache__/_resources.cpython-312.pyc | Bin 1623 -> 1623 bytes .../abc/__pycache__/_sockets.cpython-312.pyc | Bin 9871 -> 9871 bytes .../abc/__pycache__/_streams.cpython-312.pyc | Bin 8427 -> 8427 bytes .../__pycache__/_subprocesses.cpython-312.pyc | Bin 3231 -> 3231 bytes .../abc/__pycache__/_tasks.cpython-312.pyc | Bin 4507 -> 4507 bytes .../abc/__pycache__/_testing.cpython-312.pyc | Bin 2826 -> 2826 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 178 -> 178 bytes .../__pycache__/memory.cpython-312.pyc | Bin 14939 -> 14939 bytes .../__pycache__/stapled.cpython-312.pyc | Bin 7539 -> 7539 bytes .../streams/__pycache__/tls.cpython-312.pyc | Bin 17562 -> 17562 bytes .../attr/__pycache__/__init__.cpython-312.pyc | Bin 2606 -> 2606 bytes .../attr/__pycache__/_cmp.cpython-312.pyc | Bin 5070 -> 5070 bytes .../attr/__pycache__/_compat.cpython-312.pyc | Bin 3496 -> 3496 bytes .../attr/__pycache__/_config.cpython-312.pyc | Bin 1102 -> 1102 bytes .../attr/__pycache__/_funcs.cpython-312.pyc | Bin 13625 -> 13625 bytes .../attr/__pycache__/_make.cpython-312.pyc | Bin 99480 -> 99480 bytes .../__pycache__/_next_gen.cpython-312.pyc | Bin 24348 -> 24348 bytes .../__pycache__/_version_info.cpython-312.pyc | Bin 3116 -> 3116 bytes .../__pycache__/converters.cpython-312.pyc | Bin 4620 -> 4620 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 3573 -> 3573 bytes .../attr/__pycache__/filters.cpython-312.pyc | Bin 2987 -> 2987 bytes .../attr/__pycache__/setters.cpython-312.pyc | Bin 1907 -> 1907 bytes .../__pycache__/validators.cpython-312.pyc | Bin 26217 -> 26217 bytes .../av/__pycache__/__init__.cpython-312.pyc | Bin 2892 -> 2892 bytes .../av/__pycache__/about.cpython-312.pyc | Bin 191 -> 191 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 259 -> 259 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 409 -> 409 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 344 -> 344 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 370 -> 370 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 176 -> 176 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 259 -> 259 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 299 -> 299 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 3184 -> 3184 bytes .../INSTALLER | 1 + .../METADATA | 731 +++ .../charset_normalizer-3.4.2.dist-info/RECORD | 35 + .../charset_normalizer-3.4.2.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../licenses/LICENSE | 21 + .../top_level.txt | 1 + .../charset_normalizer/__init__.py | 48 + .../charset_normalizer/__main__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1765 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 340 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 18154 bytes .../__pycache__/cd.cpython-312.pyc | Bin 0 -> 13281 bytes .../__pycache__/constant.cpython-312.pyc | Bin 0 -> 40795 bytes .../__pycache__/legacy.cpython-312.pyc | Bin 0 -> 2765 bytes .../__pycache__/md.cpython-312.pyc | Bin 0 -> 24332 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 17112 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 13741 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 367 bytes .../site-packages/charset_normalizer/api.py | 668 +++ .../site-packages/charset_normalizer/cd.py | 395 ++ .../charset_normalizer/cli/__init__.py | 8 + .../charset_normalizer/cli/__main__.py | 381 ++ .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 328 bytes .../cli/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 14389 bytes .../charset_normalizer/constant.py | 2015 ++++++++ .../charset_normalizer/legacy.py | 64 + .../charset_normalizer/md.cp312-win_amd64.pyd | Bin 0 -> 10752 bytes .../site-packages/charset_normalizer/md.py | 635 +++ .../md__mypyc.cp312-win_amd64.pyd | Bin 0 -> 125952 bytes .../charset_normalizer/models.py | 360 ++ .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 414 ++ .../charset_normalizer/version.py | 8 + .../__pycache__/__init__.cpython-312.pyc | Bin 4056 -> 4056 bytes .../click/__pycache__/_compat.cpython-312.pyc | Bin 24178 -> 24178 bytes .../__pycache__/_textwrap.cpython-312.pyc | Bin 2409 -> 2409 bytes .../__pycache__/_winconsole.cpython-312.pyc | Bin 11754 -> 11754 bytes .../click/__pycache__/core.cpython-312.pyc | Bin 127654 -> 127654 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 22121 -> 22121 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 14760 -> 14760 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 13656 -> 13656 bytes .../click/__pycache__/globals.cpython-312.pyc | Bin 2949 -> 2949 bytes .../click/__pycache__/parser.cpython-312.pyc | Bin 20189 -> 20189 bytes .../click/__pycache__/termui.cpython-312.pyc | Bin 34507 -> 34507 bytes .../click/__pycache__/types.cpython-312.pyc | Bin 48943 -> 48943 bytes .../click/__pycache__/utils.cpython-312.pyc | Bin 24863 -> 24863 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 473 -> 473 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 3931 -> 3931 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 16402 -> 16402 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 3531 -> 3531 bytes .../__pycache__/win32.cpython-312.pyc | Bin 8107 -> 8107 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 9069 -> 9069 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 607 -> 607 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 323 -> 323 bytes .../__pycache__/api.cpython-312.pyc | Bin 6675 -> 6675 bytes .../__pycache__/cfg.cpython-312.pyc | Bin 4003 -> 4003 bytes .../__pycache__/core.cpython-312.pyc | Bin 20662 -> 20662 bytes .../__pycache__/mm.cpython-312.pyc | Bin 19611 -> 19611 bytes .../__pycache__/stringcase.cpython-312.pyc | Bin 3281 -> 3281 bytes .../__pycache__/undefined.cpython-312.pyc | Bin 13144 -> 13144 bytes .../__pycache__/utils.cpython-312.pyc | Bin 8919 -> 8919 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1119 -> 1119 bytes .../__pycache__/_common.cpython-312.pyc | Bin 1916 -> 1916 bytes .../__pycache__/_version.cpython-312.pyc | Bin 295 -> 295 bytes .../__pycache__/relativedelta.cpython-312.pyc | Bin 28352 -> 28352 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2645 -> 2645 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 61838 -> 61838 bytes .../__pycache__/isoparser.cpython-312.pyc | Bin 15571 -> 15571 bytes .../tz/__pycache__/__init__.cpython-312.pyc | Bin 698 -> 698 bytes .../tz/__pycache__/_common.cpython-312.pyc | Bin 14151 -> 14151 bytes .../tz/__pycache__/_factories.cpython-312.pyc | Bin 4584 -> 4584 bytes .../tz/__pycache__/tz.cpython-312.pyc | Bin 65998 -> 65998 bytes .../tz/__pycache__/win.cpython-312.pyc | Bin 17254 -> 17254 bytes venv/Lib/site-packages/deepgram/__init__.py | 420 +- .../__pycache__/__init__.cpython-312.pyc | Bin 6601 -> 3895 bytes .../__pycache__/_constants.cpython-312.pyc | Bin 0 -> 229 bytes .../__pycache__/_enums.cpython-312.pyc | Bin 0 -> 710 bytes .../__pycache__/_types.cpython-312.pyc | Bin 0 -> 16327 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 11014 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 201 bytes .../__pycache__/billing.cpython-312.pyc | Bin 0 -> 1570 bytes .../__pycache__/client.cpython-312.pyc | Bin 18277 -> 0 bytes .../__pycache__/errors.cpython-312.pyc | Bin 838 -> 4023 bytes .../__pycache__/extra.cpython-312.pyc | Bin 0 -> 4027 bytes .../__pycache__/invitations.cpython-312.pyc | Bin 0 -> 2581 bytes .../deepgram/__pycache__/keys.cpython-312.pyc | Bin 0 -> 2634 bytes .../__pycache__/members.cpython-312.pyc | Bin 0 -> 1582 bytes .../__pycache__/options.cpython-312.pyc | Bin 11442 -> 0 bytes .../__pycache__/projects.cpython-312.pyc | Bin 0 -> 2625 bytes .../__pycache__/scopes.cpython-312.pyc | Bin 0 -> 1792 bytes .../__pycache__/transcription.cpython-312.pyc | Bin 0 -> 18412 bytes .../__pycache__/usage.cpython-312.pyc | Bin 0 -> 2952 bytes venv/Lib/site-packages/deepgram/_constants.py | 1 + venv/Lib/site-packages/deepgram/_enums.py | 12 + venv/Lib/site-packages/deepgram/_types.py | 474 ++ venv/Lib/site-packages/deepgram/_utils.py | 242 + venv/Lib/site-packages/deepgram/_version.py | 1 + .../site-packages/deepgram/audio/__init__.py | 22 - .../__pycache__/__init__.cpython-312.pyc | Bin 670 -> 0 bytes .../deepgram/audio/microphone/__init__.py | 7 - .../__pycache__/__init__.cpython-312.pyc | Bin 390 -> 0 bytes .../__pycache__/constants.cpython-312.pyc | Bin 357 -> 0 bytes .../__pycache__/errors.cpython-312.pyc | Bin 1102 -> 0 bytes .../__pycache__/microphone.cpython-312.pyc | Bin 13027 -> 0 bytes .../deepgram/audio/microphone/constants.py | 11 - .../deepgram/audio/microphone/errors.py | 21 - .../deepgram/audio/microphone/microphone.py | 302 -- .../deepgram/audio/speaker/__init__.py | 7 - .../__pycache__/__init__.cpython-312.pyc | Bin 403 -> 0 bytes .../__pycache__/constants.cpython-312.pyc | Bin 413 -> 0 bytes .../__pycache__/errors.cpython-312.pyc | Bin 1087 -> 0 bytes .../__pycache__/speaker.cpython-312.pyc | Bin 19045 -> 0 bytes .../deepgram/audio/speaker/constants.py | 15 - .../deepgram/audio/speaker/errors.py | 21 - .../deepgram/audio/speaker/speaker.py | 380 -- venv/Lib/site-packages/deepgram/billing.py | 21 + venv/Lib/site-packages/deepgram/client.py | 667 --- .../deepgram/clients/__init__.py | 379 -- .../__pycache__/__init__.cpython-312.pyc | Bin 6004 -> 0 bytes .../__pycache__/agent_router.cpython-312.pyc | Bin 5817 -> 0 bytes .../__pycache__/errors.cpython-312.pyc | Bin 845 -> 0 bytes .../__pycache__/listen_router.cpython-312.pyc | Bin 9593 -> 0 bytes .../__pycache__/read_router.cpython-312.pyc | Bin 5777 -> 0 bytes .../__pycache__/speak_router.cpython-312.pyc | Bin 7503 -> 0 bytes .../deepgram/clients/agent/__init__.py | 54 - .../__pycache__/__init__.cpython-312.pyc | Bin 1225 -> 0 bytes .../agent/__pycache__/client.cpython-312.pyc | Bin 2328 -> 0 bytes .../agent/__pycache__/enums.cpython-312.pyc | Bin 1382 -> 0 bytes .../deepgram/clients/agent/client.py | 98 - .../deepgram/clients/agent/enums.py | 36 - .../deepgram/clients/agent/v1/__init__.py | 58 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 1271 -> 0 bytes .../clients/agent/v1/websocket/__init__.py | 49 - .../__pycache__/__init__.cpython-312.pyc | Bin 1254 -> 0 bytes .../__pycache__/async_client.cpython-312.pyc | Bin 33340 -> 0 bytes .../__pycache__/client.cpython-312.pyc | Bin 30688 -> 0 bytes .../__pycache__/options.cpython-312.pyc | Bin 17741 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 3941 -> 0 bytes .../agent/v1/websocket/async_client.py | 685 --- .../clients/agent/v1/websocket/client.py | 669 --- .../clients/agent/v1/websocket/options.py | 368 -- .../clients/agent/v1/websocket/response.py | 109 - .../deepgram/clients/agent_router.py | 130 - .../deepgram/clients/analyze/__init__.py | 40 - .../__pycache__/__init__.cpython-312.pyc | Bin 989 -> 0 bytes .../__pycache__/client.cpython-312.pyc | Bin 1840 -> 0 bytes .../deepgram/clients/analyze/client.py | 87 - .../deepgram/clients/analyze/v1/__init__.py | 46 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 959 -> 0 bytes .../__pycache__/async_client.cpython-312.pyc | Bin 15266 -> 0 bytes .../v1/__pycache__/client.cpython-312.pyc | Bin 14855 -> 0 bytes .../v1/__pycache__/helpers.cpython-312.pyc | Bin 915 -> 0 bytes .../v1/__pycache__/options.cpython-312.pyc | Bin 4156 -> 0 bytes .../v1/__pycache__/response.cpython-312.pyc | Bin 5989 -> 0 bytes .../clients/analyze/v1/async_client.py | 346 -- .../deepgram/clients/analyze/v1/client.py | 346 -- .../deepgram/clients/analyze/v1/helpers.py | 26 - .../deepgram/clients/analyze/v1/options.py | 83 - .../deepgram/clients/analyze/v1/response.py | 143 - .../deepgram/clients/auth/__init__.py | 9 - .../auth/__pycache__/__init__.cpython-312.pyc | Bin 323 -> 0 bytes .../auth/__pycache__/client.cpython-312.pyc | Bin 456 -> 0 bytes .../deepgram/clients/auth/client.py | 11 - .../deepgram/clients/auth/v1/__init__.py | 8 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 350 -> 0 bytes .../__pycache__/async_client.cpython-312.pyc | Bin 3063 -> 0 bytes .../v1/__pycache__/client.cpython-312.pyc | Bin 2980 -> 0 bytes .../v1/__pycache__/response.cpython-312.pyc | Bin 940 -> 0 bytes .../deepgram/clients/auth/v1/async_client.py | 51 - .../deepgram/clients/auth/v1/client.py | 51 - .../deepgram/clients/auth/v1/response.py | 24 - .../deepgram/clients/common/__init__.py | 85 - .../__pycache__/__init__.cpython-312.pyc | Bin 1798 -> 0 bytes .../deepgram/clients/common/v1/__init__.py | 53 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 1321 -> 0 bytes .../abstract_async_rest.cpython-312.pyc | Bin 13934 -> 0 bytes .../abstract_async_websocket.cpython-312.pyc | Bin 26918 -> 0 bytes .../abstract_sync_rest.cpython-312.pyc | Bin 13054 -> 0 bytes .../abstract_sync_websocket.cpython-312.pyc | Bin 25574 -> 0 bytes .../v1/__pycache__/enums.cpython-312.pyc | Bin 663 -> 0 bytes .../v1/__pycache__/errors.cpython-312.pyc | Bin 3830 -> 0 bytes .../v1/__pycache__/helpers.cpython-312.pyc | Bin 2348 -> 0 bytes .../v1/__pycache__/options.cpython-312.pyc | Bin 2379 -> 0 bytes .../__pycache__/rest_response.cpython-312.pyc | Bin 6701 -> 0 bytes .../shared_response.cpython-312.pyc | Bin 3712 -> 0 bytes .../websocket_events.cpython-312.pyc | Bin 736 -> 0 bytes .../websocket_response.cpython-312.pyc | Bin 2050 -> 0 bytes .../clients/common/v1/abstract_async_rest.py | 383 -- .../common/v1/abstract_async_websocket.py | 537 -- .../clients/common/v1/abstract_sync_rest.py | 375 -- .../common/v1/abstract_sync_websocket.py | 527 -- .../deepgram/clients/common/v1/enums.py | 18 - .../deepgram/clients/common/v1/errors.py | 77 - .../deepgram/clients/common/v1/helpers.py | 53 - .../deepgram/clients/common/v1/options.py | 65 - .../clients/common/v1/rest_response.py | 181 - .../clients/common/v1/shared_response.py | 86 - .../clients/common/v1/websocket_events.py | 19 - .../clients/common/v1/websocket_response.py | 64 - .../site-packages/deepgram/clients/errors.py | 16 - .../deepgram/clients/listen/__init__.py | 108 - .../__pycache__/__init__.cpython-312.pyc | Bin 2035 -> 0 bytes .../listen/__pycache__/client.cpython-312.pyc | Bin 3869 -> 0 bytes .../listen/__pycache__/enums.cpython-312.pyc | Bin 945 -> 0 bytes .../deepgram/clients/listen/client.py | 180 - .../deepgram/clients/listen/enums.py | 24 - .../deepgram/clients/listen/v1/__init__.py | 131 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 2079 -> 0 bytes .../clients/listen/v1/rest/__init__.py | 59 - .../rest/__pycache__/__init__.cpython-312.pyc | Bin 1363 -> 0 bytes .../__pycache__/async_client.cpython-312.pyc | Bin 15526 -> 0 bytes .../rest/__pycache__/client.cpython-312.pyc | Bin 15133 -> 0 bytes .../rest/__pycache__/helpers.cpython-312.pyc | Bin 926 -> 0 bytes .../rest/__pycache__/options.cpython-312.pyc | Bin 11081 -> 0 bytes .../rest/__pycache__/response.cpython-312.pyc | Bin 21936 -> 0 bytes .../clients/listen/v1/rest/async_client.py | 347 -- .../deepgram/clients/listen/v1/rest/client.py | 348 -- .../clients/listen/v1/rest/helpers.py | 26 - .../clients/listen/v1/rest/options.py | 181 - .../clients/listen/v1/rest/response.py | 470 -- .../clients/listen/v1/websocket/__init__.py | 31 - .../__pycache__/__init__.cpython-312.pyc | Bin 834 -> 0 bytes .../__pycache__/async_client.cpython-312.pyc | Bin 29504 -> 0 bytes .../__pycache__/client.cpython-312.pyc | Bin 27976 -> 0 bytes .../__pycache__/options.cpython-312.pyc | Bin 8975 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 9523 -> 0 bytes .../listen/v1/websocket/async_client.py | 587 --- .../clients/listen/v1/websocket/client.py | 590 --- .../clients/listen/v1/websocket/options.py | 153 - .../clients/listen/v1/websocket/response.py | 217 - .../deepgram/clients/listen_router.py | 225 - .../deepgram/clients/live/__init__.py | 20 - .../live/__pycache__/__init__.cpython-312.pyc | Bin 627 -> 0 bytes .../deepgram/clients/live/v1/__init__.py | 20 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 641 -> 0 bytes .../v1/__pycache__/client.cpython-312.pyc | Bin 1011 -> 0 bytes .../live/v1/__pycache__/enums.cpython-312.pyc | Bin 245 -> 0 bytes .../deepgram/clients/live/v1/client.py | 38 - .../deepgram/clients/live/v1/enums.py | 5 - .../deepgram/clients/manage/__init__.py | 53 - .../__pycache__/__init__.cpython-312.pyc | Bin 1321 -> 0 bytes .../manage/__pycache__/client.cpython-312.pyc | Bin 2644 -> 0 bytes .../deepgram/clients/manage/client.py | 110 - .../deepgram/clients/manage/v1/__init__.py | 54 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 1357 -> 0 bytes .../__pycache__/async_client.cpython-312.pyc | Bin 57789 -> 0 bytes .../v1/__pycache__/client.cpython-312.pyc | Bin 56106 -> 0 bytes .../v1/__pycache__/options.cpython-312.pyc | Bin 9435 -> 0 bytes .../v1/__pycache__/response.cpython-312.pyc | Bin 28224 -> 0 bytes .../clients/manage/v1/async_client.py | 1176 ----- .../deepgram/clients/manage/v1/client.py | 1179 ----- .../deepgram/clients/manage/v1/options.py | 177 - .../deepgram/clients/manage/v1/response.py | 682 --- .../deepgram/clients/prerecorded/__init__.py | 18 - .../__pycache__/__init__.cpython-312.pyc | Bin 572 -> 0 bytes .../clients/prerecorded/v1/__init__.py | 18 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 579 -> 0 bytes .../v1/__pycache__/client.cpython-312.pyc | Bin 931 -> 0 bytes .../v1/__pycache__/errors.cpython-312.pyc | Bin 1792 -> 0 bytes .../deepgram/clients/prerecorded/v1/client.py | 37 - .../deepgram/clients/prerecorded/v1/errors.py | 37 - .../deepgram/clients/read_router.py | 130 - .../deepgram/clients/selfhosted/__init__.py | 6 - .../__pycache__/__init__.cpython-312.pyc | Bin 343 -> 0 bytes .../__pycache__/client.cpython-312.pyc | Bin 435 -> 0 bytes .../deepgram/clients/selfhosted/client.py | 15 - .../clients/selfhosted/v1/__init__.py | 6 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 306 -> 0 bytes .../__pycache__/async_client.cpython-312.pyc | Bin 8803 -> 0 bytes .../v1/__pycache__/client.cpython-312.pyc | Bin 8485 -> 0 bytes .../clients/selfhosted/v1/async_client.py | 170 - .../deepgram/clients/selfhosted/v1/client.py | 172 - .../deepgram/clients/speak/__init__.py | 53 - .../__pycache__/__init__.cpython-312.pyc | Bin 1101 -> 0 bytes .../speak/__pycache__/client.cpython-312.pyc | Bin 1828 -> 0 bytes .../speak/__pycache__/enums.cpython-312.pyc | Bin 1309 -> 0 bytes .../deepgram/clients/speak/client.py | 95 - .../deepgram/clients/speak/enums.py | 34 - .../deepgram/clients/speak/v1/__init__.py | 48 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 1026 -> 0 bytes .../clients/speak/v1/rest/__init__.py | 21 - .../rest/__pycache__/__init__.cpython-312.pyc | Bin 601 -> 0 bytes .../__pycache__/async_client.cpython-312.pyc | Bin 13221 -> 0 bytes .../rest/__pycache__/client.cpython-312.pyc | Bin 12581 -> 0 bytes .../rest/__pycache__/helpers.cpython-312.pyc | Bin 715 -> 0 bytes .../rest/__pycache__/options.cpython-312.pyc | Bin 2901 -> 0 bytes .../rest/__pycache__/response.cpython-312.pyc | Bin 1836 -> 0 bytes .../clients/speak/v1/rest/async_client.py | 309 -- .../deepgram/clients/speak/v1/rest/client.py | 309 -- .../deepgram/clients/speak/v1/rest/helpers.py | 19 - .../deepgram/clients/speak/v1/rest/options.py | 64 - .../clients/speak/v1/rest/response.py | 45 - .../clients/speak/v1/websocket/__init__.py | 19 - .../__pycache__/__init__.cpython-312.pyc | Bin 660 -> 0 bytes .../__pycache__/async_client.cpython-312.pyc | Bin 35302 -> 0 bytes .../__pycache__/client.cpython-312.pyc | Bin 32846 -> 0 bytes .../__pycache__/options.cpython-312.pyc | Bin 3106 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 1752 -> 0 bytes .../speak/v1/websocket/async_client.py | 706 --- .../clients/speak/v1/websocket/client.py | 686 --- .../clients/speak/v1/websocket/options.py | 65 - .../clients/speak/v1/websocket/response.py | 58 - .../deepgram/clients/speak_router.py | 171 - venv/Lib/site-packages/deepgram/errors.py | 94 +- venv/Lib/site-packages/deepgram/extra.py | 113 + .../Lib/site-packages/deepgram/invitations.py | 47 + venv/Lib/site-packages/deepgram/keys.py | 39 + venv/Lib/site-packages/deepgram/members.py | 24 + venv/Lib/site-packages/deepgram/options.py | 245 - venv/Lib/site-packages/deepgram/projects.py | 43 + venv/Lib/site-packages/deepgram/scopes.py | 34 + .../site-packages/deepgram/transcription.py | 391 ++ venv/Lib/site-packages/deepgram/usage.py | 54 + .../site-packages/deepgram/utils/__init__.py | 19 - .../__pycache__/__init__.cpython-312.pyc | Bin 473 -> 0 bytes .../deepgram/utils/verboselogs/__init__.py | 168 - .../__pycache__/__init__.cpython-312.pyc | Bin 5455 -> 0 bytes .../deepgram_sdk-2.12.0.dist-info/INSTALLER | 1 + .../LICENSE | 0 .../deepgram_sdk-2.12.0.dist-info/METADATA | 1021 ++++ .../deepgram_sdk-2.12.0.dist-info/RECORD | 39 + .../deepgram_sdk-2.12.0.dist-info/REQUESTED | 0 .../deepgram_sdk-2.12.0.dist-info/WHEEL | 5 + .../top_level.txt | 0 .../deepgram_sdk-4.2.0.dist-info/METADATA | 844 --- .../deepgram_sdk-4.2.0.dist-info/RECORD | 223 - .../__pycache__/__init__.cpython-312.pyc | Bin 941 -> 941 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 53826 -> 53826 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1680 -> 1680 bytes .../dotenv/__pycache__/main.cpython-312.pyc | Bin 16853 -> 16853 bytes .../dotenv/__pycache__/parser.cpython-312.pyc | Bin 9986 -> 9986 bytes .../__pycache__/variables.cpython-312.pyc | Bin 5017 -> 5017 bytes .../fastapi-0.115.14.dist-info/INSTALLER | 1 + .../fastapi-0.115.14.dist-info/METADATA | 563 ++ .../fastapi-0.115.14.dist-info/RECORD | 97 + .../fastapi-0.115.14.dist-info/REQUESTED | 0 .../fastapi-0.115.14.dist-info/WHEEL | 4 + .../entry_points.txt | 5 + .../licenses/LICENSE | 21 + venv/Lib/site-packages/fastapi/__init__.py | 25 + venv/Lib/site-packages/fastapi/__main__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1088 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 234 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 28302 bytes .../__pycache__/applications.cpython-312.pyc | Bin 0 -> 84254 bytes .../__pycache__/background.cpython-312.pyc | Bin 0 -> 2360 bytes .../fastapi/__pycache__/cli.cpython-312.pyc | Bin 0 -> 648 bytes .../__pycache__/concurrency.cpython-312.pyc | Bin 0 -> 1661 bytes .../datastructures.cpython-312.pyc | Bin 0 -> 8133 bytes .../__pycache__/encoders.cpython-312.pyc | Bin 0 -> 10914 bytes .../exception_handlers.cpython-312.pyc | Bin 0 -> 2062 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7153 bytes .../__pycache__/logger.cpython-312.pyc | Bin 0 -> 274 bytes .../param_functions.cpython-312.pyc | Bin 0 -> 35085 bytes .../__pycache__/params.cpython-312.pyc | Bin 0 -> 25028 bytes .../__pycache__/requests.cpython-312.pyc | Bin 0 -> 263 bytes .../__pycache__/responses.cpython-312.pyc | Bin 0 -> 2391 bytes .../__pycache__/routing.cpython-312.pyc | Bin 0 -> 82167 bytes .../__pycache__/staticfiles.cpython-312.pyc | Bin 0 -> 235 bytes .../__pycache__/templating.cpython-312.pyc | Bin 0 -> 237 bytes .../__pycache__/testclient.cpython-312.pyc | Bin 0 -> 232 bytes .../fastapi/__pycache__/types.cpython-312.pyc | Bin 0 -> 743 bytes .../fastapi/__pycache__/utils.cpython-312.pyc | Bin 0 -> 8371 bytes .../__pycache__/websockets.cpython-312.pyc | Bin 0 -> 312 bytes venv/Lib/site-packages/fastapi/_compat.py | 664 +++ .../Lib/site-packages/fastapi/applications.py | 4588 +++++++++++++++++ venv/Lib/site-packages/fastapi/background.py | 59 + venv/Lib/site-packages/fastapi/cli.py | 13 + venv/Lib/site-packages/fastapi/concurrency.py | 39 + .../site-packages/fastapi/datastructures.py | 204 + .../fastapi/dependencies/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 185 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 2728 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 38752 bytes .../fastapi/dependencies/models.py | 37 + .../fastapi/dependencies/utils.py | 1001 ++++ venv/Lib/site-packages/fastapi/encoders.py | 343 ++ .../fastapi/exception_handlers.py | 34 + venv/Lib/site-packages/fastapi/exceptions.py | 176 + venv/Lib/site-packages/fastapi/logger.py | 3 + .../fastapi/middleware/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 241 bytes .../__pycache__/cors.cpython-312.pyc | Bin 0 -> 246 bytes .../__pycache__/gzip.cpython-312.pyc | Bin 0 -> 246 bytes .../__pycache__/httpsredirect.cpython-312.pyc | Bin 0 -> 275 bytes .../__pycache__/trustedhost.cpython-312.pyc | Bin 0 -> 269 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 246 bytes .../site-packages/fastapi/middleware/cors.py | 1 + .../site-packages/fastapi/middleware/gzip.py | 1 + .../fastapi/middleware/httpsredirect.py | 3 + .../fastapi/middleware/trustedhost.py | 3 + .../site-packages/fastapi/middleware/wsgi.py | 1 + .../site-packages/fastapi/openapi/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 180 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 350 bytes .../openapi/__pycache__/docs.cpython-312.pyc | Bin 0 -> 10804 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 22988 bytes .../openapi/__pycache__/utils.cpython-312.pyc | Bin 0 -> 21076 bytes .../fastapi/openapi/constants.py | 3 + .../Lib/site-packages/fastapi/openapi/docs.py | 344 ++ .../site-packages/fastapi/openapi/models.py | 445 ++ .../site-packages/fastapi/openapi/utils.py | 569 ++ .../site-packages/fastapi/param_functions.py | 2360 +++++++++ venv/Lib/site-packages/fastapi/params.py | 786 +++ venv/Lib/site-packages/fastapi/py.typed | 0 venv/Lib/site-packages/fastapi/requests.py | 2 + venv/Lib/site-packages/fastapi/responses.py | 48 + venv/Lib/site-packages/fastapi/routing.py | 4439 ++++++++++++++++ .../fastapi/security/__init__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 837 bytes .../__pycache__/api_key.cpython-312.pyc | Bin 0 -> 9688 bytes .../security/__pycache__/base.cpython-312.pyc | Bin 0 -> 499 bytes .../security/__pycache__/http.cpython-312.pyc | Bin 0 -> 13626 bytes .../__pycache__/oauth2.cpython-312.pyc | Bin 0 -> 18445 bytes .../open_id_connect_url.cpython-312.pyc | Bin 0 -> 3210 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 592 bytes .../site-packages/fastapi/security/api_key.py | 288 ++ .../site-packages/fastapi/security/base.py | 6 + .../site-packages/fastapi/security/http.py | 423 ++ .../site-packages/fastapi/security/oauth2.py | 653 +++ .../fastapi/security/open_id_connect_url.py | 84 + .../site-packages/fastapi/security/utils.py | 10 + venv/Lib/site-packages/fastapi/staticfiles.py | 1 + venv/Lib/site-packages/fastapi/templating.py | 1 + venv/Lib/site-packages/fastapi/testclient.py | 1 + venv/Lib/site-packages/fastapi/types.py | 10 + venv/Lib/site-packages/fastapi/utils.py | 220 + venv/Lib/site-packages/fastapi/websockets.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 4052 -> 4052 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 209 -> 209 bytes .../__pycache__/descriptor.cpython-312.pyc | Bin 58295 -> 58295 bytes .../descriptor_database.cpython-312.pyc | Bin 7275 -> 7275 bytes .../descriptor_pool.cpython-312.pyc | Bin 56827 -> 56827 bytes .../__pycache__/duration_pb2.cpython-312.pyc | Bin 1911 -> 1911 bytes .../__pycache__/empty_pb2.cpython-312.pyc | Bin 1832 -> 1832 bytes .../__pycache__/json_format.cpython-312.pyc | Bin 43648 -> 43648 bytes .../__pycache__/message.cpython-312.pyc | Bin 16134 -> 16134 bytes .../message_factory.cpython-312.pyc | Bin 6775 -> 6775 bytes .../__pycache__/reflection.cpython-312.pyc | Bin 1041 -> 1041 bytes .../runtime_version.cpython-312.pyc | Bin 4221 -> 4221 bytes .../symbol_database.cpython-312.pyc | Bin 7293 -> 7293 bytes .../__pycache__/text_encoding.cpython-312.pyc | Bin 4175 -> 4175 bytes .../__pycache__/text_format.cpython-312.pyc | Bin 75669 -> 75669 bytes .../__pycache__/timestamp_pb2.cpython-312.pyc | Bin 1921 -> 1921 bytes .../unknown_fields.cpython-312.pyc | Bin 4292 -> 4292 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 189 -> 189 bytes .../api_implementation.cpython-312.pyc | Bin 3310 -> 3310 bytes .../__pycache__/builder.cpython-312.pyc | Bin 5385 -> 5385 bytes .../__pycache__/containers.cpython-312.pyc | Bin 33017 -> 33017 bytes .../__pycache__/decoder.cpython-312.pyc | Bin 37029 -> 37029 bytes .../__pycache__/encoder.cpython-312.pyc | Bin 32640 -> 32640 bytes .../enum_type_wrapper.cpython-312.pyc | Bin 4825 -> 4825 bytes .../extension_dict.cpython-312.pyc | Bin 8725 -> 8725 bytes .../__pycache__/field_mask.cpython-312.pyc | Bin 14009 -> 14009 bytes .../message_listener.cpython-312.pyc | Bin 2418 -> 2418 bytes .../python_edition_defaults.cpython-312.pyc | Bin 520 -> 520 bytes .../python_message.cpython-312.pyc | Bin 65284 -> 65284 bytes .../__pycache__/type_checkers.cpython-312.pyc | Bin 20128 -> 20128 bytes .../well_known_types.cpython-312.pyc | Bin 31864 -> 31864 bytes .../__pycache__/wire_format.cpython-312.pyc | Bin 8287 -> 8287 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 186 -> 186 bytes .../__pycache__/cpp_message.cpython-312.pyc | Bin 1668 -> 1668 bytes .../h11/__pycache__/__init__.cpython-312.pyc | Bin 1059 -> 1059 bytes .../h11/__pycache__/_abnf.cpython-312.pyc | Bin 1765 -> 1765 bytes .../__pycache__/_connection.cpython-312.pyc | Bin 23115 -> 23115 bytes .../h11/__pycache__/_events.cpython-312.pyc | Bin 13210 -> 13210 bytes .../h11/__pycache__/_headers.cpython-312.pyc | Bin 7986 -> 7986 bytes .../h11/__pycache__/_readers.cpython-312.pyc | Bin 9642 -> 9642 bytes .../_receivebuffer.cpython-312.pyc | Bin 4688 -> 4688 bytes .../h11/__pycache__/_state.cpython-312.pyc | Bin 8452 -> 8452 bytes .../h11/__pycache__/_util.cpython-312.pyc | Bin 4703 -> 4703 bytes .../h11/__pycache__/_version.cpython-312.pyc | Bin 197 -> 197 bytes .../h11/__pycache__/_writers.cpython-312.pyc | Bin 6279 -> 6279 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3155 -> 3155 bytes .../httpcore/__pycache__/_api.cpython-312.pyc | Bin 3759 -> 3759 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 3174 -> 3174 bytes .../__pycache__/_models.cpython-312.pyc | Bin 23105 -> 23105 bytes .../httpcore/__pycache__/_ssl.cpython-312.pyc | Bin 594 -> 594 bytes .../_synchronization.cpython-312.pyc | Bin 14169 -> 14169 bytes .../__pycache__/_trace.cpython-312.pyc | Bin 5586 -> 5586 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 1274 -> 1274 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1607 -> 1607 bytes .../__pycache__/connection.cpython-312.pyc | Bin 11784 -> 11784 bytes .../connection_pool.cpython-312.pyc | Bin 19664 -> 19664 bytes .../_async/__pycache__/http11.cpython-312.pyc | Bin 20226 -> 20226 bytes .../_async/__pycache__/http2.cpython-312.pyc | Bin 31429 -> 31429 bytes .../__pycache__/http_proxy.cpython-312.pyc | Bin 17984 -> 17984 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 5738 -> 5738 bytes .../__pycache__/socks_proxy.cpython-312.pyc | Bin 16881 -> 16881 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 183 -> 183 bytes .../__pycache__/anyio.cpython-312.pyc | Bin 8613 -> 8613 bytes .../__pycache__/auto.cpython-312.pyc | Bin 2675 -> 2675 bytes .../__pycache__/base.cpython-312.pyc | Bin 4877 -> 4877 bytes .../__pycache__/mock.cpython-312.pyc | Bin 7141 -> 7141 bytes .../__pycache__/sync.cpython-312.pyc | Bin 11414 -> 11414 bytes .../__pycache__/trio.cpython-312.pyc | Bin 8950 -> 8950 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1561 -> 1561 bytes .../__pycache__/connection.cpython-312.pyc | Bin 10404 -> 10404 bytes .../connection_pool.cpython-312.pyc | Bin 18743 -> 18743 bytes .../_sync/__pycache__/http11.cpython-312.pyc | Bin 17770 -> 17770 bytes .../_sync/__pycache__/http2.cpython-312.pyc | Bin 27434 -> 27434 bytes .../__pycache__/http_proxy.cpython-312.pyc | Bin 17167 -> 17167 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 5285 -> 5285 bytes .../__pycache__/socks_proxy.cpython-312.pyc | Bin 15632 -> 15632 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2109 -> 2109 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 299 -> 299 bytes .../httpx/__pycache__/_api.cpython-312.pyc | Bin 10334 -> 10334 bytes .../httpx/__pycache__/_auth.cpython-312.pyc | Bin 15586 -> 15586 bytes .../httpx/__pycache__/_client.cpython-312.pyc | Bin 64171 -> 64171 bytes .../httpx/__pycache__/_config.cpython-312.pyc | Bin 10967 -> 10967 bytes .../__pycache__/_content.cpython-312.pyc | Bin 10392 -> 10392 bytes .../__pycache__/_decoders.cpython-312.pyc | Bin 16744 -> 16744 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 12069 -> 12069 bytes .../httpx/__pycache__/_main.cpython-312.pyc | Bin 20607 -> 20607 bytes .../httpx/__pycache__/_models.cpython-312.pyc | Bin 58581 -> 58581 bytes .../__pycache__/_multipart.cpython-312.pyc | Bin 13592 -> 13592 bytes .../__pycache__/_status_codes.cpython-312.pyc | Bin 7179 -> 7179 bytes .../httpx/__pycache__/_types.cpython-312.pyc | Bin 3811 -> 3811 bytes .../__pycache__/_urlparse.cpython-312.pyc | Bin 17472 -> 17472 bytes .../httpx/__pycache__/_urls.cpython-312.pyc | Bin 27915 -> 27915 bytes .../httpx/__pycache__/_utils.cpython-312.pyc | Bin 9348 -> 9348 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 428 -> 428 bytes .../__pycache__/asgi.cpython-312.pyc | Bin 7565 -> 7565 bytes .../__pycache__/base.cpython-312.pyc | Bin 3858 -> 3858 bytes .../__pycache__/default.cpython-312.pyc | Bin 17111 -> 17111 bytes .../__pycache__/mock.cpython-312.pyc | Bin 1926 -> 1926 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 6800 -> 6800 bytes .../idna/__pycache__/__init__.cpython-312.pyc | Bin 867 -> 867 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16157 -> 16157 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 99457 -> 99457 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2619 -> 2619 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 198 -> 198 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 330 -> 330 bytes .../jwt/__pycache__/__init__.cpython-312.pyc | Bin 1631 -> 1631 bytes .../__pycache__/algorithms.cpython-312.pyc | Bin 34488 -> 34488 bytes .../jwt/__pycache__/api_jwk.cpython-312.pyc | Bin 6672 -> 6672 bytes .../jwt/__pycache__/api_jws.cpython-312.pyc | Bin 13532 -> 13532 bytes .../jwt/__pycache__/api_jwt.cpython-312.pyc | Bin 14854 -> 14854 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 3587 -> 3587 bytes .../__pycache__/jwk_set_cache.cpython-312.pyc | Bin 1738 -> 1738 bytes .../__pycache__/jwks_client.cpython-312.pyc | Bin 5611 -> 5611 bytes .../jwt/__pycache__/types.cpython-312.pyc | Bin 322 -> 322 bytes .../jwt/__pycache__/utils.cpython-312.pyc | Bin 5593 -> 5593 bytes .../jwt/__pycache__/warnings.cpython-312.pyc | Bin 377 -> 377 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3235 -> 3235 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 3666 -> 3666 bytes .../__pycache__/http_server.cpython-312.pyc | Bin 3068 -> 3068 bytes .../inference_runner.cpython-312.pyc | Bin 2132 -> 2132 bytes .../agents/__pycache__/job.cpython-312.pyc | Bin 25734 -> 25734 bytes .../agents/__pycache__/log.cpython-312.pyc | Bin 386 -> 386 bytes .../agents/__pycache__/plugin.cpython-312.pyc | Bin 2703 -> 2703 bytes .../agents/__pycache__/types.cpython-312.pyc | Bin 2801 -> 2801 bytes .../agents/__pycache__/vad.cpython-312.pyc | Bin 9529 -> 9529 bytes .../__pycache__/version.cpython-312.pyc | Bin 207 -> 207 bytes .../agents/__pycache__/worker.cpython-312.pyc | Bin 52741 -> 52741 bytes .../cli/__pycache__/__init__.cpython-312.pyc | Bin 460 -> 460 bytes .../cli/__pycache__/_run.cpython-312.pyc | Bin 8044 -> 8044 bytes .../cli/__pycache__/cli.cpython-312.pyc | Bin 8590 -> 8590 bytes .../cli/__pycache__/log.cpython-312.pyc | Bin 11515 -> 11515 bytes .../cli/__pycache__/proto.cpython-312.pyc | Bin 4973 -> 4973 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 513 -> 513 bytes .../debug/__pycache__/tracing.cpython-312.pyc | Bin 10602 -> 10602 bytes .../ipc/__pycache__/__init__.cpython-312.pyc | Bin 619 -> 619 bytes .../ipc/__pycache__/channel.cpython-312.pyc | Bin 6865 -> 6865 bytes .../inference_executor.cpython-312.pyc | Bin 680 -> 680 bytes .../inference_proc_executor.cpython-312.pyc | Bin 4805 -> 4805 bytes .../inference_proc_lazy_main.cpython-312.pyc | Bin 6550 -> 6550 bytes .../__pycache__/job_executor.cpython-312.pyc | Bin 2770 -> 2770 bytes .../job_proc_executor.cpython-312.pyc | Bin 10193 -> 10193 bytes .../job_proc_lazy_main.cpython-312.pyc | Bin 18540 -> 18540 bytes .../job_thread_executor.cpython-312.pyc | Bin 19483 -> 19483 bytes .../ipc/__pycache__/log_queue.cpython-312.pyc | Bin 5322 -> 5322 bytes .../__pycache__/proc_client.cpython-312.pyc | Bin 9690 -> 9690 bytes .../ipc/__pycache__/proc_pool.cpython-312.pyc | Bin 12145 -> 12145 bytes .../ipc/__pycache__/proto.cpython-312.pyc | Bin 13530 -> 13530 bytes .../supervised_proc.cpython-312.pyc | Bin 22632 -> 22632 bytes .../llm/__pycache__/__init__.cpython-312.pyc | Bin 1825 -> 1825 bytes .../llm/__pycache__/_strict.cpython-312.pyc | Bin 7299 -> 7299 bytes .../__pycache__/chat_context.cpython-312.pyc | Bin 16903 -> 16903 bytes .../fallback_adapter.cpython-312.pyc | Bin 10972 -> 10972 bytes .../llm/__pycache__/llm.cpython-312.pyc | Bin 13482 -> 13482 bytes .../llm/__pycache__/realtime.cpython-312.pyc | Bin 8348 -> 8348 bytes .../remote_chat_context.cpython-312.pyc | Bin 3921 -> 3921 bytes .../__pycache__/tool_context.cpython-312.pyc | Bin 11021 -> 11021 bytes .../llm/__pycache__/utils.cpython-312.pyc | Bin 15598 -> 15598 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 791 -> 791 bytes .../metrics/__pycache__/base.cpython-312.pyc | Bin 4280 -> 4280 bytes .../usage_collector.cpython-312.pyc | Bin 3094 -> 3094 bytes .../metrics/__pycache__/utils.cpython-312.pyc | Bin 2611 -> 2611 bytes .../stt/__pycache__/__init__.cpython-312.pyc | Bin 901 -> 901 bytes .../fallback_adapter.cpython-312.pyc | Bin 18813 -> 18813 bytes .../stream_adapter.cpython-312.pyc | Bin 7033 -> 7033 bytes .../stt/__pycache__/stt.cpython-312.pyc | Bin 18673 -> 18673 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 760 -> 760 bytes .../_basic_hyphenator.cpython-312.pyc | Bin 36782 -> 36782 bytes .../_basic_paragraph.cpython-312.pyc | Bin 1652 -> 1652 bytes .../__pycache__/_basic_sent.cpython-312.pyc | Bin 3649 -> 3649 bytes .../__pycache__/_basic_word.cpython-312.pyc | Bin 2290 -> 2290 bytes .../__pycache__/basic.cpython-312.pyc | Bin 4802 -> 4802 bytes .../__pycache__/token_stream.cpython-312.pyc | Bin 6496 -> 6496 bytes .../__pycache__/tokenizer.cpython-312.pyc | Bin 5795 -> 5795 bytes .../__pycache__/utils.cpython-312.pyc | Bin 3474 -> 3474 bytes .../tts/__pycache__/__init__.cpython-312.pyc | Bin 945 -> 945 bytes .../fallback_adapter.cpython-312.pyc | Bin 28577 -> 28577 bytes .../stream_adapter.cpython-312.pyc | Bin 6011 -> 6011 bytes .../tts/__pycache__/tts.cpython-312.pyc | Bin 24610 -> 24610 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1145 -> 1145 bytes .../utils/__pycache__/audio.cpython-312.pyc | Bin 8859 -> 8859 bytes .../connection_pool.cpython-312.pyc | Bin 8724 -> 8724 bytes .../__pycache__/exp_filter.cpython-312.pyc | Bin 1787 -> 1787 bytes .../__pycache__/http_context.cpython-312.pyc | Bin 2612 -> 2612 bytes .../utils/__pycache__/log.cpython-312.pyc | Bin 2321 -> 2321 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 1180 -> 1180 bytes .../moving_average.cpython-312.pyc | Bin 1996 -> 1996 bytes .../__pycache__/participant.cpython-312.pyc | Bin 2373 -> 2373 bytes .../aio/__pycache__/__init__.cpython-312.pyc | Bin 977 -> 977 bytes .../aio/__pycache__/channel.cpython-312.pyc | Bin 9322 -> 9322 bytes .../aio/__pycache__/debug.cpython-312.pyc | Bin 1306 -> 1306 bytes .../__pycache__/duplex_unix.cpython-312.pyc | Bin 6435 -> 6435 bytes .../aio/__pycache__/interval.cpython-312.pyc | Bin 3120 -> 3120 bytes .../aio/__pycache__/itertools.cpython-312.pyc | Bin 5728 -> 5728 bytes .../aio/__pycache__/sleep.cpython-312.pyc | Bin 3532 -> 3532 bytes .../aio/__pycache__/task_set.cpython-312.pyc | Bin 2017 -> 2017 bytes .../aio/__pycache__/utils.cpython-312.pyc | Bin 1752 -> 1752 bytes .../__pycache__/wait_group.cpython-312.pyc | Bin 1760 -> 1760 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 519 -> 519 bytes .../__pycache__/decoder.cpython-312.pyc | Bin 13716 -> 13716 bytes .../hw/__pycache__/__init__.cpython-312.pyc | Bin 573 -> 573 bytes .../utils/hw/__pycache__/cpu.cpython-312.pyc | Bin 4589 -> 4589 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 518 -> 518 bytes .../images/__pycache__/image.cpython-312.pyc | Bin 6925 -> 6925 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1142 -> 1142 bytes .../voice/__pycache__/agent.cpython-312.pyc | Bin 30227 -> 30227 bytes .../agent_activity.cpython-312.pyc | Bin 76201 -> 76201 bytes .../__pycache__/agent_session.cpython-312.pyc | Bin 33412 -> 33412 bytes .../audio_recognition.cpython-312.pyc | Bin 21461 -> 21461 bytes .../background_audio.cpython-312.pyc | Bin 23983 -> 23983 bytes .../__pycache__/chat_cli.cpython-312.pyc | Bin 24900 -> 24900 bytes .../voice/__pycache__/events.cpython-312.pyc | Bin 6949 -> 6949 bytes .../__pycache__/generation.cpython-312.pyc | Bin 26775 -> 26775 bytes .../voice/__pycache__/io.cpython-312.pyc | Bin 18576 -> 18576 bytes .../__pycache__/speech_handle.cpython-312.pyc | Bin 7778 -> 7778 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 788 -> 788 bytes .../_datastream_io.cpython-312.pyc | Bin 11772 -> 11772 bytes .../__pycache__/_queue_io.cpython-312.pyc | Bin 3534 -> 3534 bytes .../__pycache__/_runner.cpython-312.pyc | Bin 10961 -> 10961 bytes .../avatar/__pycache__/_types.cpython-312.pyc | Bin 2649 -> 2649 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 704 -> 704 bytes .../__pycache__/_input.cpython-312.pyc | Bin 15929 -> 15929 bytes .../__pycache__/_output.cpython-312.pyc | Bin 23594 -> 23594 bytes .../_pre_connect_audio.cpython-312.pyc | Bin 9742 -> 9742 bytes .../__pycache__/room_io.cpython-312.pyc | Bin 22950 -> 22950 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 566 -> 566 bytes .../_speaking_rate.cpython-312.pyc | Bin 12830 -> 12830 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 1552 -> 1552 bytes .../__pycache__/synchronizer.cpython-312.pyc | Bin 30658 -> 30658 bytes .../api/__pycache__/__init__.cpython-312.pyc | Bin 1245 -> 1245 bytes .../api/__pycache__/_service.cpython-312.pyc | Bin 1665 -> 1665 bytes .../__pycache__/access_token.cpython-312.pyc | Bin 11847 -> 11847 bytes .../agent_dispatch_service.cpython-312.pyc | Bin 5008 -> 5008 bytes .../egress_service.cpython-312.pyc | Bin 6171 -> 6171 bytes .../ingress_service.cpython-312.pyc | Bin 3089 -> 3089 bytes .../__pycache__/livekit_api.cpython-312.pyc | Bin 5218 -> 5218 bytes .../__pycache__/room_service.cpython-312.pyc | Bin 13495 -> 13495 bytes .../__pycache__/sip_service.cpython-312.pyc | Bin 15424 -> 15424 bytes .../__pycache__/twirp_client.cpython-312.pyc | Bin 5830 -> 5830 bytes .../api/__pycache__/version.cpython-312.pyc | Bin 201 -> 201 bytes .../api/__pycache__/webhook.cpython-312.pyc | Bin 1622 -> 1622 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1482 -> 1482 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 3352 -> 3352 bytes .../deepgram/__pycache__/log.cpython-312.pyc | Bin 306 -> 306 bytes .../__pycache__/models.cpython-312.pyc | Bin 1021 -> 1021 bytes .../deepgram/__pycache__/stt.cpython-312.pyc | Bin 35997 -> 35997 bytes .../deepgram/__pycache__/tts.cpython-312.pyc | Bin 21512 -> 21512 bytes .../__pycache__/version.cpython-312.pyc | Bin 217 -> 217 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1521 -> 1521 bytes .../__pycache__/log.cpython-312.pyc | Bin 310 -> 310 bytes .../__pycache__/models.cpython-312.pyc | Bin 550 -> 550 bytes .../__pycache__/stt.cpython-312.pyc | Bin 5948 -> 5948 bytes .../__pycache__/tts.cpython-312.pyc | Bin 27906 -> 27906 bytes .../__pycache__/version.cpython-312.pyc | Bin 219 -> 219 bytes .../groq/__pycache__/__init__.cpython-312.pyc | Bin 1404 -> 1404 bytes .../groq/__pycache__/log.cpython-312.pyc | Bin 298 -> 298 bytes .../groq/__pycache__/models.cpython-312.pyc | Bin 1040 -> 1040 bytes .../groq/__pycache__/services.cpython-312.pyc | Bin 3285 -> 3285 bytes .../groq/__pycache__/tts.cpython-312.pyc | Bin 9334 -> 9334 bytes .../groq/__pycache__/version.cpython-312.pyc | Bin 213 -> 213 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1911 -> 1911 bytes .../__pycache__/embeddings.cpython-312.pyc | Bin 2592 -> 2592 bytes .../openai/__pycache__/llm.cpython-312.pyc | Bin 25233 -> 25233 bytes .../openai/__pycache__/log.cpython-312.pyc | Bin 302 -> 302 bytes .../openai/__pycache__/models.cpython-312.pyc | Bin 5142 -> 5142 bytes .../openai/__pycache__/stt.cpython-312.pyc | Bin 23884 -> 23884 bytes .../openai/__pycache__/tts.cpython-312.pyc | Bin 10679 -> 10679 bytes .../openai/__pycache__/utils.cpython-312.pyc | Bin 9284 -> 9284 bytes .../__pycache__/version.cpython-312.pyc | Bin 215 -> 215 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 531 -> 531 bytes .../realtime_model.cpython-312.pyc | Bin 67355 -> 67355 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1314 -> 1314 bytes .../silero/__pycache__/log.cpython-312.pyc | Bin 302 -> 302 bytes .../__pycache__/onnx_model.cpython-312.pyc | Bin 4870 -> 4870 bytes .../silero/__pycache__/vad.cpython-312.pyc | Bin 19174 -> 19174 bytes .../__pycache__/version.cpython-312.pyc | Bin 215 -> 215 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 254 -> 254 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 537 -> 537 bytes .../__pycache__/agent.cpython-312.pyc | Bin 6061 -> 6061 bytes .../agent_dispatch.cpython-312.pyc | Bin 3055 -> 3055 bytes .../__pycache__/analytics.cpython-312.pyc | Bin 9744 -> 9744 bytes .../__pycache__/egress.cpython-312.pyc | Bin 16008 -> 16008 bytes .../__pycache__/ingress.cpython-312.pyc | Bin 7254 -> 7254 bytes .../__pycache__/metrics.cpython-312.pyc | Bin 3588 -> 3588 bytes .../__pycache__/models.cpython-312.pyc | Bin 19754 -> 19754 bytes .../protocol/__pycache__/room.cpython-312.pyc | Bin 7775 -> 7775 bytes .../protocol/__pycache__/sip.cpython-312.pyc | Bin 25509 -> 25509 bytes .../__pycache__/version.cpython-312.pyc | Bin 206 -> 206 bytes .../__pycache__/webhook.cpython-312.pyc | Bin 2066 -> 2066 bytes .../rtc/__pycache__/__init__.cpython-312.pyc | Bin 3433 -> 3433 bytes .../__pycache__/_ffi_client.cpython-312.pyc | Bin 12729 -> 12729 bytes .../rtc/__pycache__/_utils.cpython-312.pyc | Bin 8031 -> 8031 bytes .../rtc/__pycache__/apm.cpython-312.pyc | Bin 6842 -> 6842 bytes .../__pycache__/audio_filter.cpython-312.pyc | Bin 1454 -> 1454 bytes .../__pycache__/audio_frame.cpython-312.pyc | Bin 10654 -> 10654 bytes .../__pycache__/audio_mixer.cpython-312.pyc | Bin 11202 -> 11202 bytes .../audio_resampler.cpython-312.pyc | Bin 8950 -> 8950 bytes .../__pycache__/audio_source.cpython-312.pyc | Bin 9391 -> 9391 bytes .../__pycache__/audio_stream.cpython-312.pyc | Bin 13739 -> 13739 bytes .../__pycache__/data_stream.cpython-312.pyc | Bin 19272 -> 19272 bytes .../rtc/__pycache__/e2ee.cpython-312.pyc | Bin 14017 -> 14017 bytes .../__pycache__/event_emitter.cpython-312.pyc | Bin 8010 -> 8010 bytes .../rtc/__pycache__/log.cpython-312.pyc | Bin 275 -> 275 bytes .../__pycache__/participant.cpython-312.pyc | Bin 39701 -> 39701 bytes .../rtc/__pycache__/room.cpython-312.pyc | Bin 46306 -> 46306 bytes .../rtc/__pycache__/rpc.cpython-312.pyc | Bin 5865 -> 5865 bytes .../__pycache__/synchronizer.cpython-312.pyc | Bin 10701 -> 10701 bytes .../rtc/__pycache__/track.cpython-312.pyc | Bin 9431 -> 9431 bytes .../track_publication.cpython-312.pyc | Bin 7615 -> 7615 bytes .../__pycache__/transcription.cpython-312.pyc | Bin 949 -> 949 bytes .../rtc/__pycache__/utils.cpython-312.pyc | Bin 3058 -> 3058 bytes .../rtc/__pycache__/version.cpython-312.pyc | Bin 201 -> 201 bytes .../__pycache__/video_frame.cpython-312.pyc | Bin 17424 -> 17424 bytes .../__pycache__/video_source.cpython-312.pyc | Bin 2780 -> 2780 bytes .../__pycache__/video_stream.cpython-312.pyc | Bin 8245 -> 8245 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 183 -> 183 bytes .../audio_frame_pb2.cpython-312.pyc | Bin 11345 -> 11345 bytes .../data_stream_pb2.cpython-312.pyc | Bin 13172 -> 13172 bytes .../__pycache__/e2ee_pb2.cpython-312.pyc | Bin 6947 -> 6947 bytes .../__pycache__/ffi_pb2.cpython-312.pyc | Bin 15040 -> 15040 bytes .../__pycache__/handle_pb2.cpython-312.pyc | Bin 1326 -> 1326 bytes .../participant_pb2.cpython-312.pyc | Bin 2767 -> 2767 bytes .../__pycache__/room_pb2.cpython-312.pyc | Bin 26828 -> 26828 bytes .../__pycache__/rpc_pb2.cpython-312.pyc | Bin 3297 -> 3297 bytes .../__pycache__/stats_pb2.cpython-312.pyc | Bin 16372 -> 16372 bytes .../__pycache__/track_pb2.cpython-312.pyc | Bin 5878 -> 5878 bytes .../track_publication_pb2.cpython-312.pyc | Bin 2011 -> 2011 bytes .../video_frame_pb2.cpython-312.pyc | Bin 6862 -> 6862 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 243 -> 243 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2567 -> 2567 bytes .../__pycache__/base.cpython-312.pyc | Bin 2491 -> 2491 bytes .../class_registry.cpython-312.pyc | Bin 3512 -> 3512 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 9253 -> 9253 bytes .../__pycache__/error_store.cpython-312.pyc | Bin 2673 -> 2673 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 3700 -> 3700 bytes .../__pycache__/fields.cpython-312.pyc | Bin 89528 -> 89528 bytes .../__pycache__/orderedset.cpython-312.pyc | Bin 3546 -> 3546 bytes .../__pycache__/schema.cpython-312.pyc | Bin 49736 -> 49736 bytes .../__pycache__/types.cpython-312.pyc | Bin 1975 -> 1975 bytes .../__pycache__/utils.cpython-312.pyc | Bin 17321 -> 17321 bytes .../__pycache__/validate.cpython-312.pyc | Bin 33025 -> 33025 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 702 -> 702 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1383 -> 1383 bytes .../__pycache__/_abc.cpython-312.pyc | Bin 5256 -> 5256 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 646 -> 646 bytes venv/Lib/site-packages/multipart/__init__.py | 24 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1421 bytes .../__pycache__/decoders.cpython-312.pyc | Bin 0 -> 221 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 225 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 0 -> 223 bytes venv/Lib/site-packages/multipart/decoders.py | 1 + .../Lib/site-packages/multipart/exceptions.py | 1 + venv/Lib/site-packages/multipart/multipart.py | 1 + .../__pycache__/__config__.cpython-312.pyc | Bin 5241 -> 5241 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 28187 -> 28187 bytes .../_array_api_info.cpython-312.pyc | Bin 11029 -> 11029 bytes .../_distributor_init.cpython-312.pyc | Bin 648 -> 648 bytes .../_expired_attrs_2_0.cpython-312.pyc | Bin 4284 -> 4284 bytes .../__pycache__/_globals.cpython-312.pyc | Bin 3883 -> 3883 bytes .../__pycache__/_pytesttester.cpython-312.pyc | Bin 6716 -> 6716 bytes .../numpy/__pycache__/dtypes.cpython-312.pyc | Bin 1528 -> 1528 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 8723 -> 8723 bytes .../numpy/__pycache__/version.cpython-312.pyc | Bin 537 -> 537 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5660 -> 5660 bytes .../__pycache__/_add_newdocs.cpython-312.pyc | Bin 200233 -> 200233 bytes .../_add_newdocs_scalars.cpython-312.pyc | Bin 13209 -> 13209 bytes .../__pycache__/_asarray.cpython-312.pyc | Bin 4270 -> 4270 bytes .../_core/__pycache__/_dtype.cpython-312.pyc | Bin 13458 -> 13458 bytes .../__pycache__/_dtype_ctypes.cpython-312.pyc | Bin 4832 -> 4832 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 8279 -> 8279 bytes .../__pycache__/_internal.cpython-312.pyc | Bin 34866 -> 34866 bytes .../_core/__pycache__/_machar.cpython-312.pyc | Bin 11675 -> 11675 bytes .../__pycache__/_methods.cpython-312.pyc | Bin 11427 -> 11427 bytes .../_string_helpers.cpython-312.pyc | Bin 3280 -> 3280 bytes .../__pycache__/_type_aliases.cpython-312.pyc | Bin 3746 -> 3746 bytes .../__pycache__/_ufunc_config.cpython-312.pyc | Bin 16583 -> 16583 bytes .../__pycache__/arrayprint.cpython-312.pyc | Bin 72486 -> 72486 bytes .../__pycache__/einsumfunc.cpython-312.pyc | Bin 50061 -> 50061 bytes .../__pycache__/fromnumeric.cpython-312.pyc | Bin 150424 -> 150424 bytes .../__pycache__/function_base.cpython-312.pyc | Bin 20791 -> 20791 bytes .../__pycache__/getlimits.cpython-312.pyc | Bin 28435 -> 28435 bytes .../_core/__pycache__/memmap.cpython-312.pyc | Bin 13319 -> 13319 bytes .../__pycache__/multiarray.cpython-312.pyc | Bin 58647 -> 58647 bytes .../_core/__pycache__/numeric.cpython-312.pyc | Bin 91181 -> 91181 bytes .../__pycache__/numerictypes.cpython-312.pyc | Bin 17677 -> 17677 bytes .../__pycache__/overrides.cpython-312.pyc | Bin 7890 -> 7890 bytes .../__pycache__/printoptions.cpython-312.pyc | Bin 929 -> 929 bytes .../_core/__pycache__/records.cpython-312.pyc | Bin 39462 -> 39462 bytes .../__pycache__/shape_base.cpython-312.pyc | Bin 34444 -> 34444 bytes .../_core/__pycache__/umath.cpython-312.pyc | Bin 1998 -> 1998 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5101 -> 5101 bytes .../__pycache__/_array_like.cpython-312.pyc | Bin 5784 -> 5784 bytes .../__pycache__/_char_codes.cpython-312.pyc | Bin 7063 -> 7063 bytes .../__pycache__/_dtype_like.cpython-312.pyc | Bin 3907 -> 3907 bytes .../_typing/__pycache__/_nbit.cpython-312.pyc | Bin 954 -> 954 bytes .../__pycache__/_nbit_base.cpython-312.pyc | Bin 3864 -> 3864 bytes .../_nested_sequence.cpython-312.pyc | Bin 3399 -> 3399 bytes .../__pycache__/_scalars.cpython-312.pyc | Bin 1414 -> 1414 bytes .../__pycache__/_shape.cpython-312.pyc | Bin 519 -> 519 bytes .../__pycache__/_ufunc.cpython-312.pyc | Bin 360 -> 360 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4170 -> 4170 bytes .../__pycache__/_convertions.cpython-312.pyc | Bin 824 -> 824 bytes .../__pycache__/_inspect.cpython-312.pyc | Bin 9421 -> 9421 bytes .../fft/__pycache__/__init__.cpython-312.pyc | Bin 8393 -> 8393 bytes .../fft/__pycache__/_helper.cpython-312.pyc | Bin 8074 -> 8074 bytes .../__pycache__/_pocketfft.cpython-312.pyc | Bin 64749 -> 64749 bytes .../fft/__pycache__/helper.cpython-312.pyc | Bin 911 -> 911 bytes .../lib/__pycache__/__init__.cpython-312.pyc | Bin 2998 -> 2998 bytes .../_array_utils_impl.cpython-312.pyc | Bin 2149 -> 2149 bytes .../_arraypad_impl.cpython-312.pyc | Bin 28966 -> 28966 bytes .../_arraysetops_impl.cpython-312.pyc | Bin 43146 -> 43146 bytes .../_arrayterator_impl.cpython-312.pyc | Bin 9615 -> 9615 bytes .../__pycache__/_datasource.cpython-312.pyc | Bin 25635 -> 25635 bytes .../__pycache__/_format_impl.cpython-312.pyc | Bin 35970 -> 35970 bytes .../_function_base_impl.cpython-312.pyc | Bin 207874 -> 207874 bytes .../_histograms_impl.cpython-312.pyc | Bin 40766 -> 40766 bytes .../_index_tricks_impl.cpython-312.pyc | Bin 36299 -> 36299 bytes .../lib/__pycache__/_iotools.cpython-312.pyc | Bin 35178 -> 35178 bytes .../_nanfunctions_impl.cpython-312.pyc | Bin 76004 -> 76004 bytes .../__pycache__/_npyio_impl.cpython-312.pyc | Bin 96600 -> 96600 bytes .../_polynomial_impl.cpython-312.pyc | Bin 53594 -> 53594 bytes .../__pycache__/_scimath_impl.cpython-312.pyc | Bin 18323 -> 18323 bytes .../_shape_base_impl.cpython-312.pyc | Bin 44003 -> 44003 bytes .../_stride_tricks_impl.cpython-312.pyc | Bin 19584 -> 19584 bytes .../_twodim_base_impl.cpython-312.pyc | Bin 38470 -> 38470 bytes .../_type_check_impl.cpython-312.pyc | Bin 22196 -> 22196 bytes .../_ufunclike_impl.cpython-312.pyc | Bin 7258 -> 7258 bytes .../__pycache__/_utils_impl.cpython-312.pyc | Bin 25596 -> 25596 bytes .../lib/__pycache__/_version.cpython-312.pyc | Bin 6631 -> 6631 bytes .../__pycache__/array_utils.cpython-312.pyc | Bin 338 -> 338 bytes .../lib/__pycache__/format.cpython-312.pyc | Bin 776 -> 776 bytes .../__pycache__/introspect.cpython-312.pyc | Bin 3278 -> 3278 bytes .../lib/__pycache__/mixins.cpython-312.pyc | Bin 8965 -> 8965 bytes .../lib/__pycache__/npyio.cpython-312.pyc | Bin 259 -> 259 bytes .../lib/__pycache__/scimath.cpython-312.pyc | Bin 399 -> 399 bytes .../__pycache__/stride_tricks.cpython-312.pyc | Bin 287 -> 287 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2328 -> 2328 bytes .../__pycache__/_linalg.cpython-312.pyc | Bin 126131 -> 126131 bytes .../linalg/__pycache__/linalg.cpython-312.pyc | Bin 891 -> 891 bytes .../ma/__pycache__/__init__.cpython-312.pyc | Bin 1669 -> 1669 bytes .../numpy/ma/__pycache__/core.cpython-312.pyc | Bin 311694 -> 311694 bytes .../ma/__pycache__/extras.cpython-312.pyc | Bin 83186 -> 83186 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 474 -> 474 bytes .../__pycache__/defmatrix.cpython-312.pyc | Bin 36105 -> 36105 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 7495 -> 7495 bytes .../__pycache__/_pickle.cpython-312.pyc | Bin 2911 -> 2911 bytes .../rec/__pycache__/__init__.cpython-312.pyc | Bin 267 -> 267 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 13531 -> 13531 bytes .../capi/__pycache__/__init__.cpython-312.pyc | Bin 181 -> 181 bytes .../__pycache__/_ld_preload.cpython-312.pyc | Bin 184 -> 184 bytes .../__pycache__/_pybind_state.cpython-312.pyc | Bin 1256 -> 1256 bytes .../build_and_package_info.cpython-312.pyc | Bin 258 -> 258 bytes ...ntime_inference_collection.cpython-312.pyc | Bin 57297 -> 57297 bytes .../onnxruntime_validation.cpython-312.pyc | Bin 5609 -> 5609 bytes .../__pycache__/version_info.cpython-312.pyc | Bin 219 -> 219 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 11673 -> 11673 bytes .../__pycache__/_base_client.cpython-312.pyc | Bin 71316 -> 71316 bytes .../__pycache__/_client.cpython-312.pyc | Bin 45470 -> 45470 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 8253 -> 8253 bytes .../__pycache__/_constants.cpython-312.pyc | Bin 701 -> 701 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 7238 -> 7238 bytes .../openai/__pycache__/_files.cpython-312.pyc | Bin 6120 -> 6120 bytes .../_legacy_response.cpython-312.pyc | Bin 22730 -> 22730 bytes .../__pycache__/_models.cpython-312.pyc | Bin 30404 -> 30404 bytes .../_module_client.cpython-312.pyc | Bin 8434 -> 8434 bytes .../openai/__pycache__/_qs.cpython-312.pyc | Bin 5827 -> 5827 bytes .../__pycache__/_resource.cpython-312.pyc | Bin 2133 -> 2133 bytes .../__pycache__/_response.cpython-312.pyc | Bin 37212 -> 37212 bytes .../__pycache__/_streaming.cpython-312.pyc | Bin 17241 -> 17241 bytes .../openai/__pycache__/_types.cpython-312.pyc | Bin 7192 -> 7192 bytes .../__pycache__/_version.cpython-312.pyc | Bin 228 -> 228 bytes .../__pycache__/pagination.cpython-312.pyc | Bin 4595 -> 4595 bytes .../__pycache__/version.cpython-312.pyc | Bin 279 -> 279 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 341 -> 341 bytes .../__pycache__/_common.cpython-312.pyc | Bin 836 -> 836 bytes .../__pycache__/numpy_proxy.cpython-312.pyc | Bin 1380 -> 1380 bytes .../__pycache__/pandas_proxy.cpython-312.pyc | Bin 1168 -> 1168 bytes .../sounddevice_proxy.cpython-312.pyc | Bin 1201 -> 1201 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1778 -> 1778 bytes .../_utils/__pycache__/_logs.cpython-312.pyc | Bin 2582 -> 2582 bytes .../_utils/__pycache__/_proxy.cpython-312.pyc | Bin 3337 -> 3337 bytes .../__pycache__/_reflection.cpython-312.pyc | Bin 2237 -> 2237 bytes .../_resources_proxy.cpython-312.pyc | Bin 1175 -> 1175 bytes .../__pycache__/_streams.cpython-312.pyc | Bin 743 -> 743 bytes .../_utils/__pycache__/_sync.cpython-312.pyc | Bin 3830 -> 3830 bytes .../__pycache__/_transform.cpython-312.pyc | Bin 15055 -> 15055 bytes .../__pycache__/_typing.cpython-312.pyc | Bin 5200 -> 5200 bytes .../_utils/__pycache__/_utils.cpython-312.pyc | Bin 17191 -> 17191 bytes .../lib/__pycache__/__init__.cpython-312.pyc | Bin 280 -> 280 bytes .../lib/__pycache__/_old_api.cpython-312.pyc | Bin 2650 -> 2650 bytes .../lib/__pycache__/_pydantic.cpython-312.pyc | Bin 6531 -> 6531 bytes .../lib/__pycache__/_tools.cpython-312.pyc | Bin 2821 -> 2821 bytes .../lib/__pycache__/azure.cpython-312.pyc | Bin 23191 -> 23191 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 535 -> 535 bytes .../__pycache__/_completions.cpython-312.pyc | Bin 9904 -> 9904 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 436 -> 436 bytes .../__pycache__/_assistants.cpython-312.pyc | Bin 46117 -> 46117 bytes .../__pycache__/_deltas.cpython-312.pyc | Bin 2486 -> 2486 bytes .../chat/__pycache__/__init__.cpython-312.pyc | Bin 1002 -> 1002 bytes .../__pycache__/_completions.cpython-312.pyc | Bin 30996 -> 30996 bytes .../chat/__pycache__/_events.cpython-312.pyc | Bin 4033 -> 4033 bytes .../chat/__pycache__/_types.cpython-312.pyc | Bin 677 -> 677 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4078 -> 4078 bytes .../__pycache__/batches.cpython-312.pyc | Bin 14383 -> 14383 bytes .../__pycache__/completions.cpython-312.pyc | Bin 27638 -> 27638 bytes .../__pycache__/embeddings.cpython-312.pyc | Bin 9989 -> 9989 bytes .../__pycache__/files.cpython-312.pyc | Bin 20753 -> 20753 bytes .../__pycache__/images.cpython-312.pyc | Bin 21408 -> 21408 bytes .../__pycache__/models.cpython-312.pyc | Bin 9210 -> 9210 bytes .../__pycache__/moderations.cpython-312.pyc | Bin 7111 -> 7111 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1294 -> 1294 bytes .../audio/__pycache__/audio.cpython-312.pyc | Bin 8468 -> 8468 bytes .../audio/__pycache__/speech.cpython-312.pyc | Bin 8152 -> 8152 bytes .../transcriptions.cpython-312.pyc | Bin 23606 -> 23606 bytes .../__pycache__/translations.cpython-312.pyc | Bin 12355 -> 12355 bytes .../beta/__pycache__/__init__.cpython-312.pyc | Bin 976 -> 976 bytes .../__pycache__/assistants.cpython-312.pyc | Bin 26978 -> 26978 bytes .../beta/__pycache__/beta.cpython-312.pyc | Bin 8839 -> 8839 bytes .../chat/__pycache__/__init__.cpython-312.pyc | Bin 370 -> 370 bytes .../chat/__pycache__/chat.cpython-312.pyc | Bin 1221 -> 1221 bytes .../__pycache__/completions.cpython-312.pyc | Bin 22538 -> 22538 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1098 -> 1098 bytes .../__pycache__/realtime.cpython-312.pyc | Bin 44728 -> 44728 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 14517 -> 14517 bytes .../transcription_sessions.cpython-312.pyc | Bin 10170 -> 10170 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 970 -> 970 bytes .../__pycache__/messages.cpython-312.pyc | Bin 20033 -> 20033 bytes .../__pycache__/threads.cpython-312.pyc | Bin 51756 -> 51756 bytes .../runs/__pycache__/__init__.cpython-312.pyc | Bin 700 -> 700 bytes .../runs/__pycache__/runs.cpython-312.pyc | Bin 79555 -> 79555 bytes .../runs/__pycache__/steps.cpython-312.pyc | Bin 12447 -> 12447 bytes .../chat/__pycache__/__init__.cpython-312.pyc | Bin 729 -> 729 bytes .../chat/__pycache__/chat.cpython-312.pyc | Bin 5027 -> 5027 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 769 -> 769 bytes .../__pycache__/completions.cpython-312.pyc | Bin 57107 -> 57107 bytes .../__pycache__/messages.cpython-312.pyc | Bin 7282 -> 7282 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 735 -> 735 bytes .../__pycache__/containers.cpython-312.pyc | Bin 15258 -> 15258 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 720 -> 720 bytes .../files/__pycache__/content.cpython-312.pyc | Bin 6395 -> 6395 bytes .../files/__pycache__/files.cpython-312.pyc | Bin 16529 -> 16529 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 688 -> 688 bytes .../evals/__pycache__/evals.cpython-312.pyc | Bin 19004 -> 19004 bytes .../runs/__pycache__/__init__.cpython-312.pyc | Bin 736 -> 736 bytes .../__pycache__/output_items.cpython-312.pyc | Bin 10155 -> 10155 bytes .../runs/__pycache__/runs.cpython-312.pyc | Bin 18382 -> 18382 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1252 -> 1252 bytes .../__pycache__/fine_tuning.cpython-312.pyc | Bin 8562 -> 8562 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 721 -> 721 bytes .../alpha/__pycache__/alpha.cpython-312.pyc | Bin 4987 -> 4987 bytes .../alpha/__pycache__/graders.cpython-312.pyc | Bin 8964 -> 8964 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 797 -> 797 bytes .../__pycache__/checkpoints.cpython-312.pyc | Bin 5197 -> 5197 bytes .../__pycache__/permissions.cpython-312.pyc | Bin 12514 -> 12514 bytes .../jobs/__pycache__/__init__.cpython-312.pyc | Bin 741 -> 741 bytes .../__pycache__/checkpoints.cpython-312.pyc | Bin 6947 -> 6947 bytes .../jobs/__pycache__/jobs.cpython-312.pyc | Bin 24355 -> 24355 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 711 -> 711 bytes .../uploads/__pycache__/parts.cpython-312.pyc | Bin 7484 -> 7484 bytes .../__pycache__/uploads.cpython-312.pyc | Bin 21457 -> 21457 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1036 -> 1036 bytes .../__pycache__/file_batches.cpython-312.pyc | Bin 25285 -> 25285 bytes .../__pycache__/files.cpython-312.pyc | Bin 27692 -> 27692 bytes .../__pycache__/vector_stores.cpython-312.pyc | Bin 25469 -> 25469 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5251 -> 5251 bytes .../__pycache__/audio_model.cpython-312.pyc | Bin 407 -> 407 bytes .../audio_response_format.cpython-312.pyc | Bin 410 -> 410 bytes ...le_chunking_strategy_param.cpython-312.pyc | Bin 650 -> 650 bytes .../types/__pycache__/batch.cpython-312.pyc | Bin 2121 -> 2121 bytes .../batch_create_params.cpython-312.pyc | Bin 982 -> 982 bytes .../__pycache__/batch_error.cpython-312.pyc | Bin 707 -> 707 bytes .../batch_list_params.cpython-312.pyc | Bin 596 -> 596 bytes .../batch_request_counts.cpython-312.pyc | Bin 550 -> 550 bytes .../__pycache__/chat_model.cpython-312.pyc | Bin 298 -> 298 bytes .../__pycache__/completion.cpython-312.pyc | Bin 1007 -> 1007 bytes .../completion_choice.cpython-312.pyc | Bin 1253 -> 1253 bytes .../completion_create_params.cpython-312.pyc | Bin 2246 -> 2246 bytes .../completion_usage.cpython-312.pyc | Bin 1531 -> 1531 bytes .../container_create_params.cpython-312.pyc | Bin 1006 -> 1006 bytes .../container_create_response.cpython-312.pyc | Bin 1101 -> 1101 bytes .../container_list_params.cpython-312.pyc | Bin 678 -> 678 bytes .../container_list_response.cpython-312.pyc | Bin 1097 -> 1097 bytes ...ontainer_retrieve_response.cpython-312.pyc | Bin 1105 -> 1105 bytes .../create_embedding_response.cpython-312.pyc | Bin 1005 -> 1005 bytes .../__pycache__/embedding.cpython-312.pyc | Bin 664 -> 664 bytes .../embedding_create_params.cpython-312.pyc | Bin 1031 -> 1031 bytes .../embedding_model.cpython-312.pyc | Bin 434 -> 434 bytes .../eval_create_params.cpython-312.pyc | Bin 4738 -> 4738 bytes .../eval_create_response.cpython-312.pyc | Bin 3037 -> 3037 bytes ..._custom_data_source_config.cpython-312.pyc | Bin 794 -> 794 bytes .../eval_delete_response.cpython-312.pyc | Bin 543 -> 543 bytes .../eval_list_params.cpython-312.pyc | Bin 732 -> 732 bytes .../eval_list_response.cpython-312.pyc | Bin 3033 -> 3033 bytes .../eval_retrieve_response.cpython-312.pyc | Bin 3041 -> 3041 bytes ...letions_data_source_config.cpython-312.pyc | Bin 970 -> 970 bytes .../eval_update_params.cpython-312.pyc | Bin 715 -> 715 bytes .../eval_update_response.cpython-312.pyc | Bin 3037 -> 3037 bytes .../file_chunking_strategy.cpython-312.pyc | Bin 728 -> 728 bytes ...le_chunking_strategy_param.cpython-312.pyc | Bin 661 -> 661 bytes .../__pycache__/file_content.cpython-312.pyc | Bin 325 -> 325 bytes .../file_create_params.cpython-312.pyc | Bin 750 -> 750 bytes .../__pycache__/file_deleted.cpython-312.pyc | Bin 599 -> 599 bytes .../file_list_params.cpython-312.pyc | Bin 699 -> 699 bytes .../__pycache__/file_object.cpython-312.pyc | Bin 1049 -> 1049 bytes .../__pycache__/file_purpose.cpython-312.pyc | Bin 411 -> 411 bytes .../types/__pycache__/image.cpython-312.pyc | Bin 654 -> 654 bytes ...ge_create_variation_params.cpython-312.pyc | Bin 1095 -> 1095 bytes .../image_edit_params.cpython-312.pyc | Bin 1422 -> 1422 bytes .../image_generate_params.cpython-312.pyc | Bin 1561 -> 1561 bytes .../__pycache__/image_model.cpython-312.pyc | Bin 386 -> 386 bytes .../images_response.cpython-312.pyc | Bin 1298 -> 1298 bytes .../types/__pycache__/model.cpython-312.pyc | Bin 630 -> 630 bytes .../__pycache__/model_deleted.cpython-312.pyc | Bin 525 -> 525 bytes .../__pycache__/moderation.cpython-312.pyc | Bin 3918 -> 3918 bytes .../moderation_create_params.cpython-312.pyc | Bin 951 -> 951 bytes ...moderation_create_response.cpython-312.pyc | Bin 670 -> 670 bytes ...tion_image_url_input_param.cpython-312.pyc | Bin 899 -> 899 bytes .../moderation_model.cpython-312.pyc | Bin 468 -> 468 bytes ...on_multi_modal_input_param.cpython-312.pyc | Bin 642 -> 642 bytes ...oderation_text_input_param.cpython-312.pyc | Bin 681 -> 681 bytes ...e_chunking_strategy_object.cpython-312.pyc | Bin 592 -> 592 bytes ...tic_file_chunking_strategy.cpython-312.pyc | Bin 574 -> 574 bytes ...e_chunking_strategy_object.cpython-312.pyc | Bin 702 -> 702 bytes ...king_strategy_object_param.cpython-312.pyc | Bin 833 -> 833 bytes ...le_chunking_strategy_param.cpython-312.pyc | Bin 687 -> 687 bytes .../types/__pycache__/upload.cpython-312.pyc | Bin 966 -> 966 bytes .../upload_complete_params.cpython-312.pyc | Bin 675 -> 675 bytes .../upload_create_params.cpython-312.pyc | Bin 785 -> 785 bytes .../__pycache__/vector_store.cpython-312.pyc | Bin 1712 -> 1712 bytes ...vector_store_create_params.cpython-312.pyc | Bin 1270 -> 1270 bytes .../vector_store_deleted.cpython-312.pyc | Bin 633 -> 633 bytes .../vector_store_list_params.cpython-312.pyc | Bin 715 -> 715 bytes ...vector_store_search_params.cpython-312.pyc | Bin 1379 -> 1379 bytes ...ctor_store_search_response.cpython-312.pyc | Bin 1126 -> 1126 bytes ...vector_store_update_params.cpython-312.pyc | Bin 1110 -> 1110 bytes ...bsocket_connection_options.cpython-312.pyc | Bin 1300 -> 1300 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1329 -> 1329 bytes .../speech_create_params.cpython-312.pyc | Bin 1116 -> 1116 bytes .../__pycache__/speech_model.cpython-312.pyc | Bin 395 -> 395 bytes .../__pycache__/transcription.cpython-312.pyc | Bin 975 -> 975 bytes ...ranscription_create_params.cpython-312.pyc | Bin 2424 -> 2424 bytes ...nscription_create_response.cpython-312.pyc | Bin 543 -> 543 bytes .../transcription_include.cpython-312.pyc | Bin 388 -> 388 bytes .../transcription_segment.cpython-312.pyc | Bin 855 -> 855 bytes ...transcription_stream_event.cpython-312.pyc | Bin 720 -> 720 bytes ...scription_text_delta_event.cpython-312.pyc | Bin 1129 -> 1129 bytes ...nscription_text_done_event.cpython-312.pyc | Bin 1125 -> 1125 bytes .../transcription_verbose.cpython-312.pyc | Bin 910 -> 910 bytes .../transcription_word.cpython-312.pyc | Bin 552 -> 552 bytes .../__pycache__/translation.cpython-312.pyc | Bin 476 -> 476 bytes .../translation_create_params.cpython-312.pyc | Bin 1019 -> 1019 bytes ...ranslation_create_response.cpython-312.pyc | Bin 531 -> 531 bytes .../translation_verbose.cpython-312.pyc | Bin 778 -> 778 bytes .../beta/__pycache__/__init__.cpython-312.pyc | Bin 2084 -> 2084 bytes .../__pycache__/assistant.cpython-312.pyc | Bin 2303 -> 2303 bytes .../assistant_create_params.cpython-312.pyc | Bin 3752 -> 3752 bytes .../assistant_deleted.cpython-312.pyc | Bin 630 -> 630 bytes .../assistant_list_params.cpython-312.pyc | Bin 715 -> 715 bytes ...ant_response_format_option.cpython-312.pyc | Bin 716 -> 716 bytes ...sponse_format_option_param.cpython-312.pyc | Bin 800 -> 800 bytes .../assistant_stream_event.cpython-312.pyc | Bin 7091 -> 7091 bytes .../assistant_tool.cpython-312.pyc | Bin 707 -> 707 bytes .../assistant_tool_choice.cpython-312.pyc | Bin 794 -> 794 bytes ...stant_tool_choice_function.cpython-312.pyc | Bin 514 -> 514 bytes ...tool_choice_function_param.cpython-312.pyc | Bin 628 -> 628 bytes ...sistant_tool_choice_option.cpython-312.pyc | Bin 540 -> 540 bytes ...t_tool_choice_option_param.cpython-312.pyc | Bin 614 -> 614 bytes ...ssistant_tool_choice_param.cpython-312.pyc | Bin 815 -> 815 bytes .../assistant_tool_param.cpython-312.pyc | Bin 669 -> 669 bytes .../assistant_update_params.cpython-312.pyc | Bin 2903 -> 2903 bytes .../code_interpreter_tool.cpython-312.pyc | Bin 583 -> 583 bytes ...ode_interpreter_tool_param.cpython-312.pyc | Bin 656 -> 656 bytes .../file_search_tool.cpython-312.pyc | Bin 1312 -> 1312 bytes .../file_search_tool_param.cpython-312.pyc | Bin 1229 -> 1229 bytes .../__pycache__/function_tool.cpython-312.pyc | Bin 655 -> 655 bytes .../function_tool_param.cpython-312.pyc | Bin 771 -> 771 bytes .../beta/__pycache__/thread.cpython-312.pyc | Bin 1697 -> 1697 bytes ...read_create_and_run_params.cpython-312.pyc | Bin 7026 -> 7026 bytes .../thread_create_params.cpython-312.pyc | Bin 4179 -> 4179 bytes .../thread_deleted.cpython-312.pyc | Bin 621 -> 621 bytes .../thread_update_params.cpython-312.pyc | Bin 1439 -> 1439 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 6037 -> 6037 bytes ...conversation_created_event.cpython-312.pyc | Bin 1038 -> 1038 bytes .../conversation_item.cpython-312.pyc | Bin 1401 -> 1401 bytes .../conversation_item_content.cpython-312.pyc | Bin 915 -> 915 bytes ...rsation_item_content_param.cpython-312.pyc | Bin 796 -> 796 bytes ...ersation_item_create_event.cpython-312.pyc | Bin 882 -> 882 bytes ...on_item_create_event_param.cpython-312.pyc | Bin 901 -> 901 bytes ...rsation_item_created_event.cpython-312.pyc | Bin 794 -> 794 bytes ...ersation_item_delete_event.cpython-312.pyc | Bin 752 -> 752 bytes ...on_item_delete_event_param.cpython-312.pyc | Bin 772 -> 772 bytes ...rsation_item_deleted_event.cpython-312.pyc | Bin 684 -> 684 bytes ...nscription_completed_event.cpython-312.pyc | Bin 1254 -> 1254 bytes ..._transcription_delta_event.cpython-312.pyc | Bin 1280 -> 1280 bytes ...transcription_failed_event.cpython-312.pyc | Bin 1243 -> 1243 bytes .../conversation_item_param.cpython-312.pyc | Bin 1211 -> 1211 bytes ...sation_item_retrieve_event.cpython-312.pyc | Bin 758 -> 758 bytes ..._item_retrieve_event_param.cpython-312.pyc | Bin 778 -> 778 bytes ...sation_item_truncate_event.cpython-312.pyc | Bin 842 -> 842 bytes ..._item_truncate_event_param.cpython-312.pyc | Bin 872 -> 872 bytes ...ation_item_truncated_event.cpython-312.pyc | Bin 768 -> 768 bytes ...sation_item_with_reference.cpython-312.pyc | Bin 1445 -> 1445 bytes ..._item_with_reference_param.cpython-312.pyc | Bin 1257 -> 1257 bytes .../__pycache__/error_event.cpython-312.pyc | Bin 1034 -> 1034 bytes ..._audio_buffer_append_event.cpython-312.pyc | Bin 756 -> 756 bytes ..._buffer_append_event_param.cpython-312.pyc | Bin 776 -> 776 bytes ...t_audio_buffer_clear_event.cpython-312.pyc | Bin 722 -> 722 bytes ...o_buffer_clear_event_param.cpython-312.pyc | Bin 726 -> 726 bytes ...audio_buffer_cleared_event.cpython-312.pyc | Bin 659 -> 659 bytes ..._audio_buffer_commit_event.cpython-312.pyc | Bin 725 -> 725 bytes ..._buffer_commit_event_param.cpython-312.pyc | Bin 729 -> 729 bytes ...dio_buffer_committed_event.cpython-312.pyc | Bin 733 -> 733 bytes ...uffer_speech_started_event.cpython-312.pyc | Bin 754 -> 754 bytes ...uffer_speech_stopped_event.cpython-312.pyc | Bin 752 -> 752 bytes .../rate_limits_updated_event.cpython-312.pyc | Bin 1179 -> 1179 bytes .../realtime_client_event.cpython-312.pyc | Bin 1899 -> 1899 bytes ...ealtime_client_event_param.cpython-312.pyc | Bin 1911 -> 1911 bytes .../realtime_connect_params.cpython-312.pyc | Bin 611 -> 611 bytes .../realtime_response.cpython-312.pyc | Bin 1999 -> 1999 bytes .../realtime_response_status.cpython-312.pyc | Bin 1166 -> 1166 bytes .../realtime_response_usage.cpython-312.pyc | Bin 1509 -> 1509 bytes .../realtime_server_event.cpython-312.pyc | Bin 4945 -> 4945 bytes ...response_audio_delta_event.cpython-312.pyc | Bin 806 -> 806 bytes .../response_audio_done_event.cpython-312.pyc | Bin 776 -> 776 bytes ...dio_transcript_delta_event.cpython-312.pyc | Bin 840 -> 840 bytes ...udio_transcript_done_event.cpython-312.pyc | Bin 842 -> 842 bytes .../response_cancel_event.cpython-312.pyc | Bin 754 -> 754 bytes ...esponse_cancel_event_param.cpython-312.pyc | Bin 735 -> 735 bytes ...e_content_part_added_event.cpython-312.pyc | Bin 1275 -> 1275 bytes ...se_content_part_done_event.cpython-312.pyc | Bin 1272 -> 1272 bytes .../response_create_event.cpython-312.pyc | Bin 2548 -> 2548 bytes ...esponse_create_event_param.cpython-312.pyc | Bin 2238 -> 2238 bytes .../response_created_event.cpython-312.pyc | Bin 729 -> 729 bytes .../response_done_event.cpython-312.pyc | Bin 719 -> 719 bytes ...call_arguments_delta_event.cpython-312.pyc | Bin 853 -> 853 bytes ..._call_arguments_done_event.cpython-312.pyc | Bin 854 -> 854 bytes ...se_output_item_added_event.cpython-312.pyc | Bin 829 -> 829 bytes ...nse_output_item_done_event.cpython-312.pyc | Bin 824 -> 824 bytes .../response_text_delta_event.cpython-312.pyc | Bin 803 -> 803 bytes .../response_text_done_event.cpython-312.pyc | Bin 799 -> 799 bytes .../__pycache__/session.cpython-312.pyc | Bin 4392 -> 4392 bytes .../session_create_params.cpython-312.pyc | Bin 3974 -> 3974 bytes .../session_create_response.cpython-312.pyc | Bin 3544 -> 3544 bytes .../session_created_event.cpython-312.pyc | Bin 702 -> 702 bytes .../session_update_event.cpython-312.pyc | Bin 5376 -> 5376 bytes ...session_update_event_param.cpython-312.pyc | Bin 4367 -> 4367 bytes .../session_updated_event.cpython-312.pyc | Bin 702 -> 702 bytes .../transcription_session.cpython-312.pyc | Bin 2079 -> 2079 bytes ...tion_session_create_params.cpython-312.pyc | Bin 2596 -> 2596 bytes ...anscription_session_update.cpython-312.pyc | Bin 3579 -> 3579 bytes ...ption_session_update_param.cpython-312.pyc | Bin 2967 -> 2967 bytes ...tion_session_updated_event.cpython-312.pyc | Bin 780 -> 780 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2796 -> 2796 bytes .../__pycache__/annotation.cpython-312.pyc | Bin 663 -> 663 bytes .../annotation_delta.cpython-312.pyc | Bin 701 -> 701 bytes .../file_citation_annotation.cpython-312.pyc | Bin 905 -> 905 bytes ..._citation_delta_annotation.cpython-312.pyc | Bin 1165 -> 1165 bytes .../file_path_annotation.cpython-312.pyc | Bin 889 -> 889 bytes ...file_path_delta_annotation.cpython-312.pyc | Bin 1098 -> 1098 bytes .../__pycache__/image_file.cpython-312.pyc | Bin 681 -> 681 bytes .../image_file_content_block.cpython-312.pyc | Bin 653 -> 653 bytes ...e_file_content_block_param.cpython-312.pyc | Bin 778 -> 778 bytes .../image_file_delta.cpython-312.pyc | Bin 717 -> 717 bytes .../image_file_delta_block.cpython-312.pyc | Bin 770 -> 770 bytes .../image_file_param.cpython-312.pyc | Bin 689 -> 689 bytes .../__pycache__/image_url.cpython-312.pyc | Bin 675 -> 675 bytes .../image_url_content_block.cpython-312.pyc | Bin 649 -> 649 bytes ...ge_url_content_block_param.cpython-312.pyc | Bin 771 -> 771 bytes .../image_url_delta.cpython-312.pyc | Bin 711 -> 711 bytes .../image_url_delta_block.cpython-312.pyc | Bin 765 -> 765 bytes .../image_url_param.cpython-312.pyc | Bin 683 -> 683 bytes .../__pycache__/message.cpython-312.pyc | Bin 2498 -> 2498 bytes .../message_content.cpython-312.pyc | Bin 821 -> 821 bytes .../message_content_delta.cpython-312.pyc | Bin 814 -> 814 bytes ...message_content_part_param.cpython-312.pyc | Bin 715 -> 715 bytes .../message_create_params.cpython-312.pyc | Bin 1748 -> 1748 bytes .../message_deleted.cpython-312.pyc | Bin 639 -> 639 bytes .../__pycache__/message_delta.cpython-312.pyc | Bin 810 -> 810 bytes .../message_delta_event.cpython-312.pyc | Bin 713 -> 713 bytes .../message_list_params.cpython-312.pyc | Bin 749 -> 749 bytes .../message_update_params.cpython-312.pyc | Bin 762 -> 762 bytes .../refusal_content_block.cpython-312.pyc | Bin 601 -> 601 bytes .../refusal_delta_block.cpython-312.pyc | Bin 700 -> 700 bytes ..._action_function_tool_call.cpython-312.pyc | Bin 891 -> 891 bytes .../threads/__pycache__/run.cpython-312.pyc | Bin 4122 -> 4122 bytes .../run_create_params.cpython-312.pyc | Bin 4235 -> 4235 bytes .../run_list_params.cpython-312.pyc | Bin 711 -> 711 bytes .../__pycache__/run_status.cpython-312.pyc | Bin 471 -> 471 bytes ...submit_tool_outputs_params.cpython-312.pyc | Bin 1558 -> 1558 bytes .../run_update_params.cpython-312.pyc | Bin 754 -> 754 bytes .../threads/__pycache__/text.cpython-312.pyc | Bin 615 -> 615 bytes .../text_content_block.cpython-312.pyc | Bin 629 -> 629 bytes .../text_content_block_param.cpython-312.pyc | Bin 688 -> 688 bytes .../__pycache__/text_delta.cpython-312.pyc | Bin 709 -> 709 bytes .../text_delta_block.cpython-312.pyc | Bin 741 -> 741 bytes .../runs/__pycache__/__init__.cpython-312.pyc | Bin 1555 -> 1555 bytes .../code_interpreter_logs.cpython-312.pyc | Bin 708 -> 708 bytes ...e_interpreter_output_image.cpython-312.pyc | Bin 946 -> 946 bytes ...code_interpreter_tool_call.cpython-312.pyc | Bin 1949 -> 1949 bytes ...nterpreter_tool_call_delta.cpython-312.pyc | Bin 1543 -> 1543 bytes .../file_search_tool_call.cpython-312.pyc | Bin 1985 -> 1985 bytes ...ile_search_tool_call_delta.cpython-312.pyc | Bin 763 -> 763 bytes .../function_tool_call.cpython-312.pyc | Bin 961 -> 961 bytes .../function_tool_call_delta.cpython-312.pyc | Bin 1107 -> 1107 bytes ...sage_creation_step_details.cpython-312.pyc | Bin 841 -> 841 bytes .../runs/__pycache__/run_step.cpython-312.pyc | Bin 2441 -> 2441 bytes .../run_step_delta.cpython-312.pyc | Bin 1007 -> 1007 bytes .../run_step_delta_event.cpython-312.pyc | Bin 721 -> 721 bytes ...n_step_delta_message_delta.cpython-312.pyc | Bin 939 -> 939 bytes .../run_step_include.cpython-312.pyc | Bin 438 -> 438 bytes .../step_list_params.cpython-312.pyc | Bin 935 -> 935 bytes .../step_retrieve_params.cpython-312.pyc | Bin 786 -> 786 bytes .../__pycache__/tool_call.cpython-312.pyc | Bin 738 -> 738 bytes .../tool_call_delta.cpython-312.pyc | Bin 785 -> 785 bytes .../tool_call_delta_object.cpython-312.pyc | Bin 777 -> 777 bytes .../tool_calls_step_details.cpython-312.pyc | Bin 721 -> 721 bytes .../chat/__pycache__/__init__.cpython-312.pyc | Bin 3428 -> 3428 bytes .../chat_completion.cpython-312.pyc | Bin 1952 -> 1952 bytes ...on_assistant_message_param.cpython-312.pyc | Bin 1960 -> 1960 bytes .../chat_completion_audio.cpython-312.pyc | Bin 598 -> 598 bytes ...hat_completion_audio_param.cpython-312.pyc | Bin 884 -> 884 bytes .../chat_completion_chunk.cpython-312.pyc | Bin 3341 -> 3341 bytes ...n_content_part_image_param.cpython-312.pyc | Bin 975 -> 975 bytes ...ent_part_input_audio_param.cpython-312.pyc | Bin 996 -> 996 bytes ...pletion_content_part_param.cpython-312.pyc | Bin 1425 -> 1425 bytes ...content_part_refusal_param.cpython-312.pyc | Bin 720 -> 720 bytes ...on_content_part_text_param.cpython-312.pyc | Bin 708 -> 708 bytes .../chat_completion_deleted.cpython-312.pyc | Bin 660 -> 660 bytes ...on_developer_message_param.cpython-312.pyc | Bin 963 -> 963 bytes ...function_call_option_param.cpython-312.pyc | Bin 639 -> 639 bytes ...ion_function_message_param.cpython-312.pyc | Bin 808 -> 808 bytes .../chat_completion_message.cpython-312.pyc | Bin 1991 -> 1991 bytes ...t_completion_message_param.cpython-312.pyc | Bin 1073 -> 1073 bytes ...mpletion_message_tool_call.cpython-312.pyc | Bin 881 -> 881 bytes ...on_message_tool_call_param.cpython-312.pyc | Bin 982 -> 982 bytes .../chat_completion_modality.cpython-312.pyc | Bin 397 -> 397 bytes ...on_named_tool_choice_param.cpython-312.pyc | Bin 911 -> 911 bytes ...n_prediction_content_param.cpython-312.pyc | Bin 936 -> 936 bytes ...ompletion_reasoning_effort.cpython-312.pyc | Bin 343 -> 343 bytes .../chat_completion_role.cpython-312.pyc | Bin 429 -> 429 bytes ...t_completion_store_message.cpython-312.pyc | Bin 539 -> 539 bytes ...etion_stream_options_param.cpython-312.pyc | Bin 611 -> 611 bytes ...etion_system_message_param.cpython-312.pyc | Bin 954 -> 954 bytes ...t_completion_token_logprob.cpython-312.pyc | Bin 1052 -> 1052 bytes ...n_tool_choice_option_param.cpython-312.pyc | Bin 652 -> 652 bytes ...pletion_tool_message_param.cpython-312.pyc | Bin 965 -> 965 bytes ...chat_completion_tool_param.cpython-312.pyc | Bin 786 -> 786 bytes ...pletion_user_message_param.cpython-312.pyc | Bin 935 -> 935 bytes .../completion_create_params.cpython-312.pyc | Bin 5462 -> 5462 bytes .../completion_list_params.cpython-312.pyc | Bin 860 -> 860 bytes .../completion_update_params.cpython-312.pyc | Bin 728 -> 728 bytes .../parsed_chat_completion.cpython-312.pyc | Bin 1501 -> 1501 bytes .../parsed_function_tool_call.cpython-312.pyc | Bin 868 -> 868 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 312 -> 312 bytes .../message_list_params.cpython-312.pyc | Bin 683 -> 683 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 552 -> 552 bytes .../file_create_params.cpython-312.pyc | Bin 650 -> 650 bytes .../file_create_response.cpython-312.pyc | Bin 769 -> 769 bytes .../file_list_params.cpython-312.pyc | Bin 679 -> 679 bytes .../file_list_response.cpython-312.pyc | Bin 765 -> 765 bytes .../file_retrieve_response.cpython-312.pyc | Bin 773 -> 773 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1113 -> 1113 bytes ...ompletions_run_data_source.cpython-312.pyc | Bin 4690 -> 4690 bytes ...ions_run_data_source_param.cpython-312.pyc | Bin 4395 -> 4395 bytes ...eval_jsonl_run_data_source.cpython-312.pyc | Bin 1781 -> 1781 bytes ...sonl_run_data_source_param.cpython-312.pyc | Bin 1707 -> 1707 bytes .../eval_api_error.cpython-312.pyc | Bin 513 -> 513 bytes .../run_cancel_response.cpython-312.pyc | Bin 7632 -> 7632 bytes .../run_create_params.cpython-312.pyc | Bin 6214 -> 6214 bytes .../run_create_response.cpython-312.pyc | Bin 7632 -> 7632 bytes .../run_delete_response.cpython-312.pyc | Bin 668 -> 668 bytes .../run_list_params.cpython-312.pyc | Bin 767 -> 767 bytes .../run_list_response.cpython-312.pyc | Bin 7628 -> 7628 bytes .../run_retrieve_response.cpython-312.pyc | Bin 7636 -> 7636 bytes .../runs/__pycache__/__init__.cpython-312.pyc | Bin 467 -> 467 bytes .../output_item_list_params.cpython-312.pyc | Bin 804 -> 804 bytes .../output_item_list_response.cpython-312.pyc | Bin 2502 -> 2502 bytes ...put_item_retrieve_response.cpython-312.pyc | Bin 2510 -> 2510 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1661 -> 1661 bytes .../dpo_hyperparameters.cpython-312.pyc | Bin 933 -> 933 bytes .../dpo_hyperparameters_param.cpython-312.pyc | Bin 821 -> 821 bytes .../__pycache__/dpo_method.cpython-312.pyc | Bin 639 -> 639 bytes .../dpo_method_param.cpython-312.pyc | Bin 660 -> 660 bytes .../fine_tuning_job.cpython-312.pyc | Bin 3141 -> 3141 bytes .../fine_tuning_job_event.cpython-312.pyc | Bin 982 -> 982 bytes ...ine_tuning_job_integration.cpython-312.pyc | Bin 350 -> 350 bytes ...ning_job_wandb_integration.cpython-312.pyc | Bin 772 -> 772 bytes ...b_wandb_integration_object.cpython-312.pyc | Bin 734 -> 734 bytes .../job_create_params.cpython-312.pyc | Bin 2723 -> 2723 bytes .../job_list_events_params.cpython-312.pyc | Bin 611 -> 611 bytes .../job_list_params.cpython-312.pyc | Bin 712 -> 712 bytes ...nforcement_hyperparameters.cpython-312.pyc | Bin 1266 -> 1266 bytes ...ment_hyperparameters_param.cpython-312.pyc | Bin 1013 -> 1013 bytes .../reinforcement_method.cpython-312.pyc | Bin 1203 -> 1203 bytes ...reinforcement_method_param.cpython-312.pyc | Bin 1310 -> 1310 bytes ...supervised_hyperparameters.cpython-312.pyc | Bin 869 -> 869 bytes ...ised_hyperparameters_param.cpython-312.pyc | Bin 804 -> 804 bytes .../supervised_method.cpython-312.pyc | Bin 666 -> 666 bytes .../supervised_method_param.cpython-312.pyc | Bin 686 -> 686 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 511 -> 511 bytes .../grader_run_params.cpython-312.pyc | Bin 1246 -> 1246 bytes .../grader_run_response.cpython-312.pyc | Bin 2483 -> 2483 bytes .../grader_validate_params.cpython-312.pyc | Bin 1166 -> 1166 bytes .../grader_validate_response.cpython-312.pyc | Bin 1083 -> 1083 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 637 -> 637 bytes .../permission_create_params.cpython-312.pyc | Bin 674 -> 674 bytes ...permission_create_response.cpython-312.pyc | Bin 717 -> 717 bytes ...permission_delete_response.cpython-312.pyc | Bin 685 -> 685 bytes ...permission_retrieve_params.cpython-312.pyc | Bin 746 -> 746 bytes ...rmission_retrieve_response.cpython-312.pyc | Bin 1158 -> 1158 bytes .../jobs/__pycache__/__init__.cpython-312.pyc | Bin 393 -> 393 bytes .../checkpoint_list_params.cpython-312.pyc | Bin 617 -> 617 bytes ...fine_tuning_job_checkpoint.cpython-312.pyc | Bin 1466 -> 1466 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1007 -> 1007 bytes .../label_model_grader.cpython-312.pyc | Bin 1645 -> 1645 bytes .../label_model_grader_param.cpython-312.pyc | Bin 1737 -> 1737 bytes .../__pycache__/multi_grader.cpython-312.pyc | Bin 1114 -> 1114 bytes .../multi_grader_param.cpython-312.pyc | Bin 1278 -> 1278 bytes .../__pycache__/python_grader.cpython-312.pyc | Bin 719 -> 719 bytes .../python_grader_param.cpython-312.pyc | Bin 741 -> 741 bytes .../score_model_grader.cpython-312.pyc | Bin 1708 -> 1708 bytes .../score_model_grader_param.cpython-312.pyc | Bin 1728 -> 1728 bytes .../string_check_grader.cpython-312.pyc | Bin 733 -> 733 bytes .../string_check_grader_param.cpython-312.pyc | Bin 833 -> 833 bytes .../text_similarity_grader.cpython-312.pyc | Bin 825 -> 825 bytes ...xt_similarity_grader_param.cpython-312.pyc | Bin 936 -> 936 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 10665 -> 10665 bytes .../__pycache__/computer_tool.cpython-312.pyc | Bin 743 -> 743 bytes .../computer_tool_param.cpython-312.pyc | Bin 841 -> 841 bytes .../easy_input_message.cpython-312.pyc | Bin 905 -> 905 bytes .../easy_input_message_param.cpython-312.pyc | Bin 970 -> 970 bytes .../file_search_tool.cpython-312.pyc | Bin 1482 -> 1482 bytes .../file_search_tool_param.cpython-312.pyc | Bin 1441 -> 1441 bytes .../__pycache__/function_tool.cpython-312.pyc | Bin 861 -> 861 bytes .../function_tool_param.cpython-312.pyc | Bin 913 -> 913 bytes .../input_item_list_params.cpython-312.pyc | Bin 877 -> 877 bytes .../parsed_response.cpython-312.pyc | Bin 3576 -> 3576 bytes .../__pycache__/response.cpython-312.pyc | Bin 3823 -> 3823 bytes ...response_audio_delta_event.cpython-312.pyc | Bin 678 -> 678 bytes .../response_audio_done_event.cpython-312.pyc | Bin 641 -> 641 bytes ...dio_transcript_delta_event.cpython-312.pyc | Bin 710 -> 710 bytes ...udio_transcript_done_event.cpython-312.pyc | Bin 675 -> 675 bytes ...eter_call_code_delta_event.cpython-312.pyc | Bin 773 -> 773 bytes ...reter_call_code_done_event.cpython-312.pyc | Bin 769 -> 769 bytes ...reter_call_completed_event.cpython-312.pyc | Bin 885 -> 885 bytes ...ter_call_in_progress_event.cpython-312.pyc | Bin 890 -> 890 bytes ...er_call_interpreting_event.cpython-312.pyc | Bin 894 -> 894 bytes ...code_interpreter_tool_call.cpython-312.pyc | Bin 1896 -> 1896 bytes ...nterpreter_tool_call_param.cpython-312.pyc | Bin 1845 -> 1845 bytes .../response_completed_event.cpython-312.pyc | Bin 717 -> 717 bytes ...esponse_computer_tool_call.cpython-312.pyc | Bin 4041 -> 4041 bytes ...uter_tool_call_output_item.cpython-312.pyc | Bin 1363 -> 1363 bytes ...ool_call_output_screenshot.cpython-312.pyc | Bin 798 -> 798 bytes ...ll_output_screenshot_param.cpython-312.pyc | Bin 778 -> 778 bytes ...e_computer_tool_call_param.cpython-312.pyc | Bin 4126 -> 4126 bytes ...e_content_part_added_event.cpython-312.pyc | Bin 1195 -> 1195 bytes ...se_content_part_done_event.cpython-312.pyc | Bin 1192 -> 1192 bytes .../response_create_params.cpython-312.pyc | Bin 2968 -> 2968 bytes .../response_created_event.cpython-312.pyc | Bin 711 -> 711 bytes .../response_error.cpython-312.pyc | Bin 975 -> 975 bytes .../response_error_event.cpython-312.pyc | Bin 797 -> 797 bytes .../response_failed_event.cpython-312.pyc | Bin 708 -> 708 bytes ...earch_call_completed_event.cpython-312.pyc | Bin 758 -> 758 bytes ...rch_call_in_progress_event.cpython-312.pyc | Bin 763 -> 763 bytes ...earch_call_searching_event.cpython-312.pyc | Bin 758 -> 758 bytes ...onse_file_search_tool_call.cpython-312.pyc | Bin 1449 -> 1449 bytes ...ile_search_tool_call_param.cpython-312.pyc | Bin 1407 -> 1407 bytes ...esponse_format_text_config.cpython-312.pyc | Bin 827 -> 827 bytes ...e_format_text_config_param.cpython-312.pyc | Bin 780 -> 780 bytes ...at_text_json_schema_config.cpython-312.pyc | Bin 1001 -> 1001 bytes ...t_json_schema_config_param.cpython-312.pyc | Bin 942 -> 942 bytes ...call_arguments_delta_event.cpython-312.pyc | Bin 798 -> 798 bytes ..._call_arguments_done_event.cpython-312.pyc | Bin 790 -> 790 bytes ...esponse_function_tool_call.cpython-312.pyc | Bin 884 -> 884 bytes ...se_function_tool_call_item.cpython-312.pyc | Bin 557 -> 557 bytes ...tion_tool_call_output_item.cpython-312.pyc | Bin 861 -> 861 bytes ...e_function_tool_call_param.cpython-312.pyc | Bin 884 -> 884 bytes ...sponse_function_web_search.cpython-312.pyc | Bin 717 -> 717 bytes ..._function_web_search_param.cpython-312.pyc | Bin 814 -> 814 bytes ...e_gen_call_completed_event.cpython-312.pyc | Bin 759 -> 759 bytes ..._gen_call_generating_event.cpython-312.pyc | Bin 762 -> 762 bytes ...gen_call_in_progress_event.cpython-312.pyc | Bin 764 -> 764 bytes ...n_call_partial_image_event.cpython-312.pyc | Bin 856 -> 856 bytes ...response_in_progress_event.cpython-312.pyc | Bin 724 -> 724 bytes .../response_includable.cpython-312.pyc | Bin 543 -> 543 bytes .../response_incomplete_event.cpython-312.pyc | Bin 720 -> 720 bytes .../response_input_content.cpython-312.pyc | Bin 745 -> 745 bytes ...sponse_input_content_param.cpython-312.pyc | Bin 704 -> 704 bytes .../response_input_file.cpython-312.pyc | Bin 789 -> 789 bytes .../response_input_file_param.cpython-312.pyc | Bin 802 -> 802 bytes .../response_input_image.cpython-312.pyc | Bin 804 -> 804 bytes ...response_input_image_param.cpython-312.pyc | Bin 848 -> 848 bytes .../response_input_item_param.cpython-312.pyc | Bin 7042 -> 7042 bytes ...input_message_content_list.cpython-312.pyc | Bin 496 -> 496 bytes ...message_content_list_param.cpython-312.pyc | Bin 817 -> 817 bytes ...esponse_input_message_item.cpython-312.pyc | Bin 998 -> 998 bytes .../response_input_param.cpython-312.pyc | Bin 7106 -> 7106 bytes .../response_input_text.cpython-312.pyc | Bin 608 -> 608 bytes .../response_input_text_param.cpython-312.pyc | Bin 693 -> 693 bytes .../__pycache__/response_item.cpython-312.pyc | Bin 5136 -> 5136 bytes .../response_item_list.cpython-312.pyc | Bin 810 -> 810 bytes ...call_arguments_delta_event.cpython-312.pyc | Bin 787 -> 787 bytes ..._call_arguments_done_event.cpython-312.pyc | Bin 789 -> 789 bytes ...e_mcp_call_completed_event.cpython-312.pyc | Bin 666 -> 666 bytes ...onse_mcp_call_failed_event.cpython-312.pyc | Bin 657 -> 657 bytes ...mcp_call_in_progress_event.cpython-312.pyc | Bin 740 -> 740 bytes ...list_tools_completed_event.cpython-312.pyc | Bin 683 -> 683 bytes ...cp_list_tools_failed_event.cpython-312.pyc | Bin 674 -> 674 bytes ...st_tools_in_progress_event.cpython-312.pyc | Bin 688 -> 688 bytes .../response_output_item.cpython-312.pyc | Bin 4140 -> 4140 bytes ...se_output_item_added_event.cpython-312.pyc | Bin 799 -> 799 bytes ...nse_output_item_done_event.cpython-312.pyc | Bin 796 -> 796 bytes .../response_output_message.cpython-312.pyc | Bin 1208 -> 1208 bytes ...ponse_output_message_param.cpython-312.pyc | Bin 1221 -> 1221 bytes .../response_output_refusal.cpython-312.pyc | Bin 607 -> 607 bytes ...ponse_output_refusal_param.cpython-312.pyc | Bin 701 -> 701 bytes .../response_output_text.cpython-312.pyc | Bin 2900 -> 2900 bytes ...ext_annotation_added_event.cpython-312.pyc | Bin 880 -> 880 bytes ...response_output_text_param.cpython-312.pyc | Bin 2880 -> 2880 bytes .../response_queued_event.cpython-312.pyc | Bin 708 -> 708 bytes ...onse_reasoning_delta_event.cpython-312.pyc | Bin 798 -> 798 bytes ...ponse_reasoning_done_event.cpython-312.pyc | Bin 786 -> 786 bytes .../response_reasoning_item.cpython-312.pyc | Bin 1150 -> 1150 bytes ...ponse_reasoning_item_param.cpython-312.pyc | Bin 1204 -> 1204 bytes ...soning_summary_delta_event.cpython-312.pyc | Bin 825 -> 825 bytes ...asoning_summary_done_event.cpython-312.pyc | Bin 809 -> 809 bytes ...g_summary_part_added_event.cpython-312.pyc | Bin 1076 -> 1076 bytes ...ng_summary_part_done_event.cpython-312.pyc | Bin 1073 -> 1073 bytes ...g_summary_text_delta_event.cpython-312.pyc | Bin 827 -> 827 bytes ...ng_summary_text_done_event.cpython-312.pyc | Bin 823 -> 823 bytes ...sponse_refusal_delta_event.cpython-312.pyc | Bin 784 -> 784 bytes ...esponse_refusal_done_event.cpython-312.pyc | Bin 783 -> 783 bytes .../response_retrieve_params.cpython-312.pyc | Bin 1331 -> 1331 bytes .../response_status.cpython-312.pyc | Bin 435 -> 435 bytes .../response_stream_event.cpython-312.pyc | Bin 6253 -> 6253 bytes .../response_text_config.cpython-312.pyc | Bin 662 -> 662 bytes ...response_text_config_param.cpython-312.pyc | Bin 682 -> 682 bytes .../response_text_delta_event.cpython-312.pyc | Bin 782 -> 782 bytes .../response_text_done_event.cpython-312.pyc | Bin 778 -> 778 bytes .../response_usage.cpython-312.pyc | Bin 1084 -> 1084 bytes ...earch_call_completed_event.cpython-312.pyc | Bin 755 -> 755 bytes ...rch_call_in_progress_event.cpython-312.pyc | Bin 760 -> 760 bytes ...earch_call_searching_event.cpython-312.pyc | Bin 755 -> 755 bytes .../__pycache__/tool.cpython-312.pyc | Bin 4882 -> 4882 bytes .../tool_choice_function.cpython-312.pyc | Bin 608 -> 608 bytes ...tool_choice_function_param.cpython-312.pyc | Bin 693 -> 693 bytes .../tool_choice_options.cpython-312.pyc | Bin 402 -> 402 bytes .../tool_choice_types.cpython-312.pyc | Bin 699 -> 699 bytes .../tool_choice_types_param.cpython-312.pyc | Bin 780 -> 780 bytes .../__pycache__/tool_param.cpython-312.pyc | Bin 4544 -> 4544 bytes .../web_search_tool.cpython-312.pyc | Bin 1277 -> 1277 bytes .../web_search_tool_param.cpython-312.pyc | Bin 1221 -> 1221 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 983 -> 983 bytes .../__pycache__/all_models.cpython-312.pyc | Bin 558 -> 558 bytes .../__pycache__/chat_model.cpython-312.pyc | Bin 1413 -> 1413 bytes .../comparison_filter.cpython-312.pyc | Bin 731 -> 731 bytes .../compound_filter.cpython-312.pyc | Bin 836 -> 836 bytes .../__pycache__/error_object.cpython-312.pyc | Bin 643 -> 643 bytes .../function_definition.cpython-312.pyc | Bin 806 -> 806 bytes .../function_parameters.cpython-312.pyc | Bin 411 -> 411 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 379 -> 379 bytes .../__pycache__/reasoning.cpython-312.pyc | Bin 853 -> 853 bytes .../reasoning_effort.cpython-312.pyc | Bin 438 -> 438 bytes ...esponse_format_json_object.cpython-312.pyc | Bin 592 -> 592 bytes ...esponse_format_json_schema.cpython-312.pyc | Bin 1192 -> 1192 bytes .../response_format_text.cpython-312.pyc | Bin 571 -> 571 bytes .../responses_model.cpython-312.pyc | Bin 569 -> 569 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 896 -> 896 bytes .../__pycache__/chat_model.cpython-312.pyc | Bin 1469 -> 1469 bytes .../comparison_filter.cpython-312.pyc | Bin 812 -> 812 bytes .../compound_filter.cpython-312.pyc | Bin 920 -> 920 bytes .../function_definition.cpython-312.pyc | Bin 850 -> 850 bytes .../function_parameters.cpython-312.pyc | Bin 470 -> 470 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 438 -> 438 bytes .../__pycache__/reasoning.cpython-312.pyc | Bin 838 -> 838 bytes .../reasoning_effort.cpython-312.pyc | Bin 497 -> 497 bytes ...esponse_format_json_object.cpython-312.pyc | Bin 662 -> 662 bytes ...esponse_format_json_schema.cpython-312.pyc | Bin 1114 -> 1114 bytes .../response_format_text.cpython-312.pyc | Bin 642 -> 642 bytes .../responses_model.cpython-312.pyc | Bin 635 -> 635 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 348 -> 348 bytes .../part_create_params.cpython-312.pyc | Bin 649 -> 649 bytes .../__pycache__/upload_part.cpython-312.pyc | Bin 661 -> 661 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 838 -> 838 bytes .../file_batch_create_params.cpython-312.pyc | Bin 931 -> 931 bytes ...le_batch_list_files_params.cpython-312.pyc | Bin 900 -> 900 bytes .../file_content_response.cpython-312.pyc | Bin 630 -> 630 bytes .../file_create_params.cpython-312.pyc | Bin 898 -> 898 bytes .../file_list_params.cpython-312.pyc | Bin 808 -> 808 bytes .../file_update_params.cpython-312.pyc | Bin 774 -> 774 bytes .../vector_store_file.cpython-312.pyc | Bin 1531 -> 1531 bytes .../vector_store_file_batch.cpython-312.pyc | Bin 1136 -> 1136 bytes .../vector_store_file_deleted.cpython-312.pyc | Bin 661 -> 661 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 539 -> 539 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3222 -> 3222 bytes .../__pycache__/version.cpython-312.pyc | Bin 20449 -> 20449 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 8299 -> 8299 bytes .../__pycache__/_typing.cpython-312.pyc | Bin 14679 -> 14679 bytes .../_version_meson.cpython-312.pyc | Bin 271 -> 271 bytes .../__pycache__/testing.cpython-312.pyc | Bin 437 -> 437 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1770 -> 1770 bytes .../__pycache__/config.cpython-312.pyc | Bin 32448 -> 32448 bytes .../_config/__pycache__/dates.cpython-312.pyc | Bin 985 -> 985 bytes .../__pycache__/display.cpython-312.pyc | Bin 2050 -> 2050 bytes .../__pycache__/localization.cpython-312.pyc | Bin 6077 -> 6077 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 570 -> 570 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1932 -> 1932 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 184 -> 184 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 20025 -> 20025 bytes .../_testing/__pycache__/_io.cpython-312.pyc | Bin 5484 -> 5484 bytes .../__pycache__/_warnings.cpython-312.pyc | Bin 8554 -> 8554 bytes .../__pycache__/asserters.cpython-312.pyc | Bin 51289 -> 51289 bytes .../__pycache__/compat.cpython-312.pyc | Bin 1118 -> 1118 bytes .../__pycache__/contexts.cpython-312.pyc | Bin 8233 -> 8233 bytes .../api/__pycache__/__init__.cpython-312.pyc | Bin 393 -> 393 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 772 -> 772 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 506 -> 506 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 452 -> 452 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 592 -> 592 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1123 -> 1123 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1352 -> 1352 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5887 -> 5887 bytes .../__pycache__/_constants.cpython-312.pyc | Bin 977 -> 977 bytes .../__pycache__/_optional.cpython-312.pyc | Bin 5440 -> 5440 bytes .../__pycache__/compressors.cpython-312.pyc | Bin 2304 -> 2304 bytes .../__pycache__/pickle_compat.cpython-312.pyc | Bin 8320 -> 8320 bytes .../__pycache__/pyarrow.cpython-312.pyc | Bin 1538 -> 1538 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1871 -> 1871 bytes .../__pycache__/function.cpython-312.pyc | Bin 13210 -> 13210 bytes .../core/__pycache__/__init__.cpython-312.pyc | Bin 176 -> 176 bytes .../core/__pycache__/accessor.cpython-312.pyc | Bin 13090 -> 13090 bytes .../__pycache__/algorithms.cpython-312.pyc | Bin 55565 -> 55565 bytes .../core/__pycache__/api.cpython-312.pyc | Bin 2718 -> 2718 bytes .../core/__pycache__/apply.cpython-312.pyc | Bin 75740 -> 75740 bytes .../__pycache__/arraylike.cpython-312.pyc | Bin 21129 -> 21129 bytes .../core/__pycache__/base.cpython-312.pyc | Bin 47252 -> 47252 bytes .../core/__pycache__/common.cpython-312.pyc | Bin 23011 -> 23011 bytes .../__pycache__/config_init.cpython-312.pyc | Bin 28454 -> 28454 bytes .../__pycache__/construction.cpython-312.pyc | Bin 27284 -> 27284 bytes .../core/__pycache__/flags.cpython-312.pyc | Bin 5040 -> 5040 bytes .../core/__pycache__/frame.cpython-312.pyc | Bin 457378 -> 457378 bytes .../core/__pycache__/generic.cpython-312.pyc | Bin 475759 -> 475759 bytes .../core/__pycache__/indexing.cpython-312.pyc | Bin 104044 -> 104044 bytes .../core/__pycache__/missing.cpython-312.pyc | Bin 36407 -> 36407 bytes .../core/__pycache__/nanops.cpython-312.pyc | Bin 58304 -> 58304 bytes .../core/__pycache__/resample.cpython-312.pyc | Bin 101640 -> 101640 bytes .../__pycache__/roperator.cpython-312.pyc | Bin 2184 -> 2184 bytes .../core/__pycache__/sample.cpython-312.pyc | Bin 5175 -> 5175 bytes .../core/__pycache__/series.cpython-312.pyc | Bin 224902 -> 224902 bytes .../__pycache__/shared_docs.cpython-312.pyc | Bin 30373 -> 30373 bytes .../core/__pycache__/sorting.cpython-312.pyc | Bin 26991 -> 26991 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 183 -> 183 bytes .../__pycache__/executor.cpython-312.pyc | Bin 9761 -> 9761 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 609 -> 609 bytes ...datetimelike_accumulations.cpython-312.pyc | Bin 2977 -> 2977 bytes .../masked_accumulations.cpython-312.pyc | Bin 3647 -> 3647 bytes .../masked_reductions.cpython-312.pyc | Bin 6246 -> 6246 bytes .../__pycache__/putmask.cpython-312.pyc | Bin 4821 -> 4821 bytes .../__pycache__/quantile.cpython-312.pyc | Bin 6648 -> 6648 bytes .../__pycache__/replace.cpython-312.pyc | Bin 5594 -> 5594 bytes .../__pycache__/take.cpython-312.pyc | Bin 22565 -> 22565 bytes .../__pycache__/transforms.cpython-312.pyc | Bin 1532 -> 1532 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1390 -> 1390 bytes .../_arrow_string_mixins.cpython-312.pyc | Bin 19521 -> 19521 bytes .../__pycache__/_mixins.cpython-312.pyc | Bin 20625 -> 20625 bytes .../__pycache__/_ranges.cpython-312.pyc | Bin 7300 -> 7300 bytes .../arrays/__pycache__/_utils.cpython-312.pyc | Bin 2461 -> 2461 bytes .../arrays/__pycache__/base.cpython-312.pyc | Bin 88853 -> 88853 bytes .../__pycache__/boolean.cpython-312.pyc | Bin 16247 -> 16247 bytes .../__pycache__/categorical.cpython-312.pyc | Bin 108648 -> 108648 bytes .../__pycache__/datetimelike.cpython-312.pyc | Bin 98277 -> 98277 bytes .../__pycache__/datetimes.cpython-312.pyc | Bin 90338 -> 90338 bytes .../__pycache__/floating.cpython-312.pyc | Bin 5348 -> 5348 bytes .../__pycache__/integer.cpython-312.pyc | Bin 9107 -> 9107 bytes .../__pycache__/interval.cpython-312.pyc | Bin 70602 -> 70602 bytes .../arrays/__pycache__/masked.cpython-312.pyc | Bin 66307 -> 66307 bytes .../__pycache__/numeric.cpython-312.pyc | Bin 11801 -> 11801 bytes .../arrays/__pycache__/numpy_.cpython-312.pyc | Bin 20429 -> 20429 bytes .../arrays/__pycache__/period.cpython-312.pyc | Bin 46816 -> 46816 bytes .../__pycache__/string_.cpython-312.pyc | Bin 41246 -> 41246 bytes .../__pycache__/string_arrow.cpython-312.pyc | Bin 23767 -> 23767 bytes .../__pycache__/timedeltas.cpython-312.pyc | Bin 43167 -> 43167 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 406 -> 406 bytes .../__pycache__/accessors.cpython-312.pyc | Bin 16230 -> 16230 bytes .../arrow/__pycache__/array.cpython-312.pyc | Bin 138149 -> 138149 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 497 -> 497 bytes .../__pycache__/accessor.cpython-312.pyc | Bin 16128 -> 16128 bytes .../sparse/__pycache__/array.cpython-312.pyc | Bin 71946 -> 71946 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 188 -> 188 bytes .../__pycache__/align.cpython-312.pyc | Bin 9516 -> 9516 bytes .../__pycache__/api.cpython-312.pyc | Bin 270 -> 270 bytes .../__pycache__/check.cpython-312.pyc | Bin 435 -> 435 bytes .../__pycache__/common.cpython-312.pyc | Bin 1980 -> 1980 bytes .../__pycache__/engines.cpython-312.pyc | Bin 5323 -> 5323 bytes .../__pycache__/eval.cpython-312.pyc | Bin 14110 -> 14110 bytes .../__pycache__/expr.cpython-312.pyc | Bin 35264 -> 35264 bytes .../__pycache__/expressions.cpython-312.pyc | Bin 8547 -> 8547 bytes .../__pycache__/ops.cpython-312.pyc | Bin 23666 -> 23666 bytes .../__pycache__/parsing.cpython-312.pyc | Bin 6899 -> 6899 bytes .../__pycache__/pytables.cpython-312.pyc | Bin 29865 -> 29865 bytes .../__pycache__/scope.cpython-312.pyc | Bin 12187 -> 12187 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 183 -> 183 bytes .../dtypes/__pycache__/api.cpython-312.pyc | Bin 1338 -> 1338 bytes .../dtypes/__pycache__/astype.cpython-312.pyc | Bin 10241 -> 10241 bytes .../dtypes/__pycache__/base.cpython-312.pyc | Bin 21082 -> 21082 bytes .../dtypes/__pycache__/cast.cpython-312.pyc | Bin 64783 -> 64783 bytes .../dtypes/__pycache__/common.cpython-312.pyc | Bin 52166 -> 52166 bytes .../dtypes/__pycache__/concat.cpython-312.pyc | Bin 13228 -> 13228 bytes .../dtypes/__pycache__/dtypes.cpython-312.pyc | Bin 86670 -> 86670 bytes .../__pycache__/generic.cpython-312.pyc | Bin 4196 -> 4196 bytes .../__pycache__/inference.cpython-312.pyc | Bin 10933 -> 10933 bytes .../__pycache__/missing.cpython-312.pyc | Bin 28858 -> 28858 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 478 -> 478 bytes .../groupby/__pycache__/base.cpython-312.pyc | Bin 1633 -> 1633 bytes .../__pycache__/categorical.cpython-312.pyc | Bin 3200 -> 3200 bytes .../__pycache__/generic.cpython-312.pyc | Bin 104550 -> 104550 bytes .../__pycache__/groupby.cpython-312.pyc | Bin 207480 -> 207480 bytes .../__pycache__/grouper.cpython-312.pyc | Bin 39961 -> 39961 bytes .../__pycache__/indexing.cpython-312.pyc | Bin 12246 -> 12246 bytes .../__pycache__/numba_.cpython-312.pyc | Bin 6155 -> 6155 bytes .../groupby/__pycache__/ops.cpython-312.pyc | Bin 43688 -> 43688 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 727 -> 727 bytes .../__pycache__/objects.cpython-312.pyc | Bin 16298 -> 16298 bytes .../__pycache__/utils.cpython-312.pyc | Bin 17315 -> 17315 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 184 -> 184 bytes .../__pycache__/accessors.cpython-312.pyc | Bin 23014 -> 23014 bytes .../indexes/__pycache__/api.cpython-312.pyc | Bin 13026 -> 13026 bytes .../indexes/__pycache__/base.cpython-312.pyc | Bin 275403 -> 275403 bytes .../__pycache__/category.cpython-312.pyc | Bin 18070 -> 18070 bytes .../__pycache__/datetimelike.cpython-312.pyc | Bin 33461 -> 33461 bytes .../__pycache__/datetimes.cpython-312.pyc | Bin 41925 -> 41925 bytes .../__pycache__/extension.cpython-312.pyc | Bin 7088 -> 7088 bytes .../__pycache__/frozen.cpython-312.pyc | Bin 5001 -> 5001 bytes .../__pycache__/interval.cpython-312.pyc | Bin 42022 -> 42022 bytes .../indexes/__pycache__/multi.cpython-312.pyc | Bin 152527 -> 152527 bytes .../__pycache__/period.cpython-312.pyc | Bin 22242 -> 22242 bytes .../indexes/__pycache__/range.cpython-312.pyc | Bin 46988 -> 46988 bytes .../__pycache__/timedeltas.cpython-312.pyc | Bin 12071 -> 12071 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 188 -> 188 bytes .../dataframe_protocol.cpython-312.pyc | Bin 18753 -> 18753 bytes .../from_dataframe.cpython-312.pyc | Bin 19574 -> 19574 bytes .../__pycache__/utils.cpython-312.pyc | Bin 6421 -> 6421 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1833 -> 1833 bytes .../internals/__pycache__/api.cpython-312.pyc | Bin 4053 -> 4053 bytes .../__pycache__/array_manager.cpython-312.pyc | Bin 54384 -> 54384 bytes .../__pycache__/base.cpython-312.pyc | Bin 14283 -> 14283 bytes .../__pycache__/blocks.cpython-312.pyc | Bin 95619 -> 95619 bytes .../__pycache__/concat.cpython-312.pyc | Bin 22196 -> 22196 bytes .../__pycache__/construction.cpython-312.pyc | Bin 35878 -> 35878 bytes .../__pycache__/managers.cpython-312.pyc | Bin 91432 -> 91432 bytes .../internals/__pycache__/ops.cpython-312.pyc | Bin 4975 -> 4975 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 184 -> 184 bytes .../__pycache__/describe.cpython-312.pyc | Bin 15069 -> 15069 bytes .../__pycache__/selectn.cpython-312.pyc | Bin 9196 -> 9196 bytes .../ops/__pycache__/__init__.cpython-312.pyc | Bin 1492 -> 1492 bytes .../ops/__pycache__/array_ops.cpython-312.pyc | Bin 18505 -> 18505 bytes .../ops/__pycache__/common.cpython-312.pyc | Bin 4302 -> 4302 bytes .../ops/__pycache__/dispatch.cpython-312.pyc | Bin 972 -> 972 bytes .../__pycache__/docstrings.cpython-312.pyc | Bin 16403 -> 16403 bytes .../ops/__pycache__/invalid.cpython-312.pyc | Bin 2278 -> 2278 bytes .../ops/__pycache__/mask_ops.cpython-312.pyc | Bin 5355 -> 5355 bytes .../ops/__pycache__/missing.cpython-312.pyc | Bin 5615 -> 5615 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 184 -> 184 bytes .../reshape/__pycache__/api.cpython-312.pyc | Bin 810 -> 810 bytes .../__pycache__/concat.cpython-312.pyc | Bin 30607 -> 30607 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 19705 -> 19705 bytes .../reshape/__pycache__/melt.cpython-312.pyc | Bin 20791 -> 20791 bytes .../reshape/__pycache__/merge.cpython-312.pyc | Bin 99837 -> 99837 bytes .../reshape/__pycache__/pivot.cpython-312.pyc | Bin 31276 -> 31276 bytes .../reshape/__pycache__/tile.cpython-312.pyc | Bin 23888 -> 23888 bytes .../reshape/__pycache__/util.cpython-312.pyc | Bin 3075 -> 3075 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1021 -> 1021 bytes .../__pycache__/accessor.cpython-312.pyc | Bin 122102 -> 122102 bytes .../strings/__pycache__/base.cpython-312.pyc | Bin 12513 -> 12513 bytes .../__pycache__/object_array.cpython-312.pyc | Bin 32413 -> 32413 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 182 -> 182 bytes .../__pycache__/datetimes.cpython-312.pyc | Bin 45621 -> 45621 bytes .../tools/__pycache__/numeric.cpython-312.pyc | Bin 11068 -> 11068 bytes .../__pycache__/timedeltas.cpython-312.pyc | Bin 8911 -> 8911 bytes .../tools/__pycache__/times.cpython-312.pyc | Bin 5752 -> 5752 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 181 -> 181 bytes .../util/__pycache__/hashing.cpython-312.pyc | Bin 11938 -> 11938 bytes .../util/__pycache__/numba_.cpython-312.pyc | Bin 3154 -> 3154 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 560 -> 560 bytes .../window/__pycache__/common.cpython-312.pyc | Bin 7442 -> 7442 bytes .../window/__pycache__/doc.cpython-312.pyc | Bin 4876 -> 4876 bytes .../window/__pycache__/ewm.cpython-312.pyc | Bin 37537 -> 37537 bytes .../__pycache__/expanding.cpython-312.pyc | Bin 24800 -> 24800 bytes .../window/__pycache__/numba_.cpython-312.pyc | Bin 11949 -> 11949 bytes .../window/__pycache__/online.cpython-312.pyc | Bin 4854 -> 4854 bytes .../__pycache__/rolling.cpython-312.pyc | Bin 98824 -> 98824 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 30940 -> 30940 bytes .../io/__pycache__/__init__.cpython-312.pyc | Bin 339 -> 339 bytes .../io/__pycache__/_util.cpython-312.pyc | Bin 4204 -> 4204 bytes .../pandas/io/__pycache__/api.cpython-312.pyc | Bin 1371 -> 1371 bytes .../io/__pycache__/clipboards.cpython-312.pyc | Bin 6839 -> 6839 bytes .../io/__pycache__/common.cpython-312.pyc | Bin 40609 -> 40609 bytes .../feather_format.cpython-312.pyc | Bin 4788 -> 4788 bytes .../pandas/io/__pycache__/gbq.cpython-312.pyc | Bin 9437 -> 9437 bytes .../io/__pycache__/html.cpython-312.pyc | Bin 45858 -> 45858 bytes .../pandas/io/__pycache__/orc.cpython-312.pyc | Bin 8771 -> 8771 bytes .../io/__pycache__/parquet.cpython-312.pyc | Bin 23864 -> 23864 bytes .../io/__pycache__/pickle.cpython-312.pyc | Bin 6894 -> 6894 bytes .../io/__pycache__/pytables.cpython-312.pyc | Bin 207341 -> 207341 bytes .../io/__pycache__/spss.cpython-312.pyc | Bin 2669 -> 2669 bytes .../pandas/io/__pycache__/sql.cpython-312.pyc | Bin 106365 -> 106365 bytes .../io/__pycache__/stata.cpython-312.pyc | Bin 161147 -> 161147 bytes .../pandas/io/__pycache__/xml.cpython-312.pyc | Bin 42913 -> 42913 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 698 -> 698 bytes .../excel/__pycache__/_base.cpython-312.pyc | Bin 58882 -> 58882 bytes .../__pycache__/_calamine.cpython-312.pyc | Bin 5041 -> 5041 bytes .../__pycache__/_odfreader.cpython-312.pyc | Bin 10426 -> 10426 bytes .../__pycache__/_odswriter.cpython-312.pyc | Bin 13306 -> 13306 bytes .../__pycache__/_openpyxl.cpython-312.pyc | Bin 23685 -> 23685 bytes .../excel/__pycache__/_pyxlsb.cpython-312.pyc | Bin 5378 -> 5378 bytes .../excel/__pycache__/_util.cpython-312.pyc | Bin 10037 -> 10037 bytes .../excel/__pycache__/_xlrd.cpython-312.pyc | Bin 5574 -> 5574 bytes .../__pycache__/_xlsxwriter.cpython-312.pyc | Bin 8591 -> 8591 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 320 -> 320 bytes .../__pycache__/console.cpython-312.pyc | Bin 2446 -> 2446 bytes .../formats/__pycache__/csvs.cpython-312.pyc | Bin 15398 -> 15398 bytes .../__pycache__/format.cpython-312.pyc | Bin 82875 -> 82875 bytes .../formats/__pycache__/info.cpython-312.pyc | Bin 45623 -> 45623 bytes .../__pycache__/printing.cpython-312.pyc | Bin 22017 -> 22017 bytes .../json/__pycache__/__init__.cpython-312.pyc | Bin 430 -> 430 bytes .../io/json/__pycache__/_json.cpython-312.pyc | Bin 54767 -> 54767 bytes .../__pycache__/_normalize.cpython-312.pyc | Bin 17905 -> 17905 bytes .../__pycache__/_table_schema.cpython-312.pyc | Bin 13746 -> 13746 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 361 -> 361 bytes .../arrow_parser_wrapper.cpython-312.pyc | Bin 12723 -> 12723 bytes .../__pycache__/base_parser.cpython-312.pyc | Bin 53573 -> 53573 bytes .../c_parser_wrapper.cpython-312.pyc | Bin 14780 -> 14780 bytes .../__pycache__/python_parser.cpython-312.pyc | Bin 49949 -> 49949 bytes .../__pycache__/readers.cpython-312.pyc | Bin 82903 -> 82903 bytes .../sas/__pycache__/__init__.cpython-312.pyc | Bin 264 -> 264 bytes .../sas/__pycache__/sasreader.cpython-312.pyc | Bin 5826 -> 5826 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2838 -> 2838 bytes .../__pycache__/_core.cpython-312.pyc | Bin 66578 -> 66578 bytes .../__pycache__/_misc.cpython-312.pyc | Bin 23138 -> 23138 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 350 -> 350 bytes .../tseries/__pycache__/api.cpython-312.pyc | Bin 436 -> 436 bytes .../__pycache__/frequencies.cpython-312.pyc | Bin 21207 -> 21207 bytes .../__pycache__/offsets.cpython-312.pyc | Bin 1444 -> 1444 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 1046 -> 1046 bytes .../__pycache__/_decorators.cpython-312.pyc | Bin 19512 -> 19512 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 3826 -> 3826 bytes .../_print_versions.cpython-312.pyc | Bin 5869 -> 5869 bytes .../util/__pycache__/_tester.cpython-312.pyc | Bin 2061 -> 2061 bytes .../__pycache__/_validators.cpython-312.pyc | Bin 14985 -> 14985 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 22028 -> 22028 bytes .../pip/__pycache__/__init__.cpython-312.pyc | Bin 677 -> 677 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 779 -> 779 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 14286 -> 14286 bytes .../__pycache__/cache.cpython-312.pyc | Bin 12657 -> 12657 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 17658 -> 17658 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 33276 -> 33276 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 4963 -> 4963 bytes .../self_outdated_check.cpython-312.pyc | Bin 10544 -> 10544 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 13641 -> 13641 bytes .../cli/__pycache__/__init__.cpython-312.pyc | Bin 270 -> 270 bytes .../autocompletion.cpython-312.pyc | Bin 8457 -> 8457 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 10447 -> 10447 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 30366 -> 30366 bytes .../command_context.cpython-312.pyc | Bin 1773 -> 1773 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 2290 -> 2290 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 4897 -> 4897 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 15014 -> 15014 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 2612 -> 2612 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 18844 -> 18844 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 7832 -> 7832 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 367 -> 367 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3994 -> 3994 bytes .../__pycache__/install.cpython-312.pyc | Bin 28905 -> 28905 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 4718 -> 4718 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 933 -> 933 bytes .../__pycache__/base.cpython-312.pyc | Bin 2854 -> 2854 bytes .../__pycache__/installed.cpython-312.pyc | Bin 1692 -> 1692 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 8480 -> 8480 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 2240 -> 2240 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 224 -> 224 bytes .../__pycache__/collector.cpython-312.pyc | Bin 21878 -> 21878 bytes .../package_finder.cpython-312.pyc | Bin 40727 -> 40727 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 12596 -> 12596 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 16768 -> 16768 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 8003 -> 8003 bytes .../__pycache__/base.cpython-312.pyc | Bin 3773 -> 3773 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5874 -> 5874 bytes .../__pycache__/_json.cpython-312.pyc | Bin 2867 -> 2867 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 35704 -> 35704 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 15782 -> 15782 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 350 -> 350 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 3325 -> 3325 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 13417 -> 13417 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 11172 -> 11172 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 258 -> 258 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 1897 -> 1897 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 11191 -> 11191 bytes .../format_control.cpython-312.pyc | Bin 4219 -> 4219 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 1686 -> 1686 bytes .../installation_report.cpython-312.pyc | Bin 2264 -> 2264 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 25994 -> 25994 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 1161 -> 1161 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 5080 -> 5080 bytes .../selection_prefs.cpython-312.pyc | Bin 1843 -> 1843 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 4946 -> 4946 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 5772 -> 5772 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 246 -> 246 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 21988 -> 21988 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 6510 -> 6510 bytes .../__pycache__/download.cpython-312.pyc | Bin 8545 -> 8545 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 11655 -> 11655 bytes .../__pycache__/session.cpython-312.pyc | Bin 18766 -> 18766 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 2245 -> 2245 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 189 -> 189 bytes .../__pycache__/check.cpython-312.pyc | Bin 7571 -> 7571 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 25739 -> 25739 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 195 -> 195 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 7815 -> 7815 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 1872 -> 1872 bytes .../metadata_editable.cpython-312.pyc | Bin 1906 -> 1906 bytes .../metadata_legacy.cpython-312.pyc | Bin 3057 -> 3057 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 1676 -> 1676 bytes .../wheel_editable.cpython-312.pyc | Bin 2017 -> 2017 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 3921 -> 3921 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 258 -> 258 bytes .../editable_legacy.cpython-312.pyc | Bin 1809 -> 1809 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 33851 -> 33851 bytes .../req/__pycache__/__init__.cpython-312.pyc | Bin 3735 -> 3735 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 21574 -> 21574 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 21453 -> 21453 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 38406 -> 38406 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 7210 -> 7210 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 32969 -> 32969 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 189 -> 189 bytes .../__pycache__/base.cpython-312.pyc | Bin 1177 -> 1177 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 200 -> 200 bytes .../__pycache__/base.cpython-312.pyc | Bin 8329 -> 8329 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 30390 -> 30390 bytes .../__pycache__/factory.cpython-312.pyc | Bin 32106 -> 32106 bytes .../found_candidates.cpython-312.pyc | Bin 6200 -> 6200 bytes .../__pycache__/provider.cpython-312.pyc | Bin 10370 -> 10370 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 4927 -> 4927 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 11421 -> 11421 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 12343 -> 12343 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 184 -> 184 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 4525 -> 4525 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 1855 -> 1855 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 2399 -> 2399 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 2202 -> 2202 bytes .../compatibility_tags.cpython-312.pyc | Bin 5550 -> 5550 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 4175 -> 4175 bytes .../direct_url_helpers.cpython-312.pyc | Bin 3552 -> 3552 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 3215 -> 3215 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2147 -> 2147 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 3982 -> 3982 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 7447 -> 7447 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 1153 -> 1153 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 2331 -> 2331 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 7543 -> 7543 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 13546 -> 13546 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 34110 -> 34110 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 2701 -> 2701 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 2572 -> 2572 bytes .../setuptools_build.cpython-312.pyc | Bin 4539 -> 4539 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 8707 -> 8707 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 12051 -> 12051 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 11097 -> 11097 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 2394 -> 2394 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 4469 -> 4469 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 5915 -> 5915 bytes .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 523 -> 523 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 5015 -> 5015 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 18984 -> 18984 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 7604 -> 7604 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 12476 -> 12476 bytes .../versioncontrol.cpython-312.pyc | Bin 29002 -> 29002 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4685 -> 4685 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 895 -> 895 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 6457 -> 6457 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3802 -> 3802 bytes .../__pycache__/controller.cpython-312.pyc | Bin 16160 -> 16160 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 4340 -> 4340 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 6398 -> 6398 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 1667 -> 1667 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 428 -> 428 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 7703 -> 7703 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 2731 -> 2731 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 311 -> 311 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 2842 -> 2842 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4561 -> 4561 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 27192 -> 27192 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 1380 -> 1380 bytes .../chardistribution.cpython-312.pyc | Bin 9631 -> 9631 bytes .../charsetgroupprober.cpython-312.pyc | Bin 4115 -> 4115 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 5011 -> 5011 bytes .../codingstatemachine.cpython-312.pyc | Bin 3871 -> 3871 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 782 -> 782 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 1389 -> 1389 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 2989 -> 2989 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 4559 -> 4559 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 15303 -> 15303 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 4376 -> 4376 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 12075 -> 12075 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 1383 -> 1383 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 27197 -> 27197 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 1383 -> 1383 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 19119 -> 19119 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 1396 -> 1396 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 5815 -> 5815 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 22148 -> 22148 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 82996 -> 82996 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 1387 -> 1387 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 39542 -> 39542 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 83115 -> 83115 bytes .../langgreekmodel.cpython-312.pyc | Bin 76981 -> 76981 bytes .../langhebrewmodel.cpython-312.pyc | Bin 77492 -> 77492 bytes .../langrussianmodel.cpython-312.pyc | Bin 105244 -> 105244 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 77670 -> 77670 bytes .../langturkishmodel.cpython-312.pyc | Bin 77509 -> 77509 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 6995 -> 6995 bytes .../macromanprober.cpython-312.pyc | Bin 7175 -> 7175 bytes .../mbcharsetprober.cpython-312.pyc | Bin 3896 -> 3896 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 1581 -> 1581 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 38638 -> 38638 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 625 -> 625 bytes .../sbcharsetprober.cpython-312.pyc | Bin 6380 -> 6380 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 2350 -> 2350 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 4488 -> 4488 bytes .../universaldetector.cpython-312.pyc | Bin 12262 -> 12262 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 9972 -> 9972 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 3168 -> 3168 bytes .../__pycache__/version.cpython-312.pyc | Bin 481 -> 481 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1262 -> 1262 bytes .../__pycache__/compat.cpython-312.pyc | Bin 45598 -> 45598 bytes .../__pycache__/resources.cpython-312.pyc | Bin 17318 -> 17318 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 19573 -> 19573 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 88249 -> 88249 bytes .../idna/__pycache__/__init__.cpython-312.pyc | Bin 874 -> 874 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16275 -> 16275 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 38375 -> 38375 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2631 -> 2631 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 209 -> 209 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1824 -> 1824 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2018 -> 2018 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 8661 -> 8661 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 43569 -> 43569 bytes .../__pycache__/__about__.cpython-312.pyc | Bin 623 -> 623 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 459 -> 459 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 12069 -> 12069 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 6903 -> 6903 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3234 -> 3234 bytes .../__pycache__/markers.cpython-312.pyc | Bin 14051 -> 14051 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 6939 -> 6939 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 31240 -> 31240 bytes .../__pycache__/tags.cpython-312.pyc | Bin 18949 -> 18949 bytes .../__pycache__/utils.cpython-312.pyc | Bin 5861 -> 5861 bytes .../__pycache__/version.cpython-312.pyc | Bin 19932 -> 19932 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 146467 -> 146467 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 18022 -> 18022 bytes .../__pycache__/api.cpython-312.pyc | Bin 9665 -> 9665 bytes .../__pycache__/version.cpython-312.pyc | Bin 304 -> 304 bytes .../__pycache__/windows.cpython-312.pyc | Bin 12992 -> 12992 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3482 -> 3482 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3226 -> 3226 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38323 -> 38323 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1562 -> 1562 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 3390 -> 3390 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4075 -> 4075 bytes .../__pycache__/style.cpython-312.pyc | Bin 6668 -> 6668 bytes .../__pycache__/token.cpython-312.pyc | Bin 8136 -> 8136 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 13975 -> 13975 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 37930 -> 37930 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 14646 -> 14646 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 64398 -> 64398 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4442 -> 4442 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 7905 -> 7905 bytes .../__pycache__/actions.cpython-312.pyc | Bin 8389 -> 8389 bytes .../__pycache__/common.cpython-312.pyc | Bin 13408 -> 13408 bytes .../__pycache__/core.cpython-312.pyc | Bin 267702 -> 267702 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 12988 -> 12988 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 48495 -> 48495 bytes .../__pycache__/results.cpython-312.pyc | Bin 34104 -> 34104 bytes .../__pycache__/testing.cpython-312.pyc | Bin 17182 -> 17182 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 13178 -> 13178 bytes .../__pycache__/util.cpython-312.pyc | Bin 14898 -> 14898 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 607 -> 607 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 14719 -> 14719 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1074 -> 1074 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5447 -> 5447 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 578 -> 578 bytes .../_internal_utils.cpython-312.pyc | Bin 2018 -> 2018 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 21274 -> 21274 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7198 -> 7198 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13917 -> 13917 bytes .../__pycache__/certs.cpython-312.pyc | Bin 916 -> 916 bytes .../__pycache__/compat.cpython-312.pyc | Bin 1501 -> 1501 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25240 -> 25240 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7041 -> 7041 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1046 -> 1046 bytes .../__pycache__/models.cpython-312.pyc | Bin 35442 -> 35442 bytes .../__pycache__/packages.cpython-312.pyc | Bin 766 -> 766 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27751 -> 27751 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 5953 -> 5953 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5611 -> 5611 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36263 -> 36263 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 628 -> 628 bytes .../__pycache__/providers.cpython-312.pyc | Bin 6845 -> 6845 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 2648 -> 2648 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 25891 -> 25891 bytes .../__pycache__/structs.cpython-312.pyc | Bin 10500 -> 10500 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 194 -> 194 bytes .../collections_abc.cpython-312.pyc | Bin 414 -> 414 bytes .../rich/__pycache__/__init__.cpython-312.pyc | Bin 7009 -> 7009 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7815 -> 7815 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 205970 -> 205970 bytes .../_emoji_replace.cpython-312.pyc | Bin 1723 -> 1723 bytes .../_export_format.cpython-312.pyc | Bin 2315 -> 2315 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 531 -> 531 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 849 -> 849 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4141 -> 4141 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1879 -> 1879 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3614 -> 3614 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5154 -> 5154 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 720 -> 720 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6573 -> 6573 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13173 -> 13173 bytes .../_win32_console.cpython-312.pyc | Bin 28970 -> 28970 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 2484 -> 2484 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 2354 -> 2354 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1602 -> 1602 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12316 -> 12316 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9100 -> 9100 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11852 -> 11852 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5612 -> 5612 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26564 -> 26564 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1695 -> 1695 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 8581 -> 8581 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 113787 -> 113787 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2252 -> 2252 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9220 -> 9220 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10923 -> 10923 bytes .../default_styles.cpython-312.pyc | Bin 10367 -> 10367 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4203 -> 4203 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1839 -> 1839 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3571 -> 3571 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3076 -> 3076 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9892 -> 9892 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5203 -> 5203 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 19137 -> 19137 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4888 -> 4888 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 13548 -> 13548 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9292 -> 9292 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6370 -> 6370 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 7128 -> 7128 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1814 -> 1814 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5308 -> 5308 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12091 -> 12091 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40050 -> 40050 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 75072 -> 75072 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10383 -> 10383 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1786 -> 1786 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 561 -> 561 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6620 -> 6620 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3824 -> 3824 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2478 -> 2478 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28155 -> 28155 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 6058 -> 6058 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33508 -> 33508 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2133 -> 2133 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 39606 -> 39606 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43578 -> 43578 bytes .../terminal_theme.cpython-312.pyc | Bin 3342 -> 3342 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 58957 -> 58957 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6334 -> 6334 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 308 -> 308 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 31542 -> 31542 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 27080 -> 27080 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 4800 -> 4800 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 2309 -> 2309 bytes .../__pycache__/after.cpython-312.pyc | Bin 1618 -> 1618 bytes .../__pycache__/before.cpython-312.pyc | Bin 1458 -> 1458 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 2296 -> 2296 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 1406 -> 1406 bytes .../__pycache__/retry.cpython-312.pyc | Bin 14275 -> 14275 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 5562 -> 5562 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 12407 -> 12407 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 378 -> 378 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 26921 -> 26921 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 3902 -> 3902 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 360 -> 360 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3399 -> 3399 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 15925 -> 15925 bytes .../__pycache__/_version.cpython-312.pyc | Bin 212 -> 212 bytes .../__pycache__/connection.cpython-312.pyc | Bin 20401 -> 20401 bytes .../connectionpool.cpython-312.pyc | Bin 36273 -> 36273 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13487 -> 13487 bytes .../__pycache__/fields.cpython-312.pyc | Bin 10407 -> 10407 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 4012 -> 4012 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 20296 -> 20296 bytes .../__pycache__/request.cpython-312.pyc | Bin 7288 -> 7288 bytes .../__pycache__/response.cpython-312.pyc | Bin 33962 -> 33962 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 192 -> 192 bytes .../_appengine_environ.cpython-312.pyc | Bin 1842 -> 1842 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 7505 -> 7505 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 193 -> 193 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 41313 -> 41313 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 1140 -> 1140 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4750 -> 4750 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1546 -> 1546 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 1346 -> 1346 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 4177 -> 4177 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 2983 -> 2983 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 21691 -> 21691 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 15097 -> 15097 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5065 -> 5065 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 10766 -> 10766 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11133 -> 11133 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 15789 -> 15789 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 4397 -> 4397 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1272 -> 1272 bytes .../__pycache__/_helpers.cpython-312.pyc | Bin 1015 -> 1015 bytes .../propcache/__pycache__/api.cpython-312.pyc | Bin 333 -> 333 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 88177 -> 88177 bytes .../__pycache__/_common.cpython-312.pyc | Bin 33580 -> 33580 bytes .../__pycache__/_pswindows.cpython-312.pyc | Bin 43086 -> 43086 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 14178 -> 14178 bytes .../__pycache__/_migration.cpython-312.pyc | Bin 10851 -> 10851 bytes .../__pycache__/aliases.cpython-312.pyc | Bin 6560 -> 6560 bytes .../annotated_handlers.cpython-312.pyc | Bin 5484 -> 5484 bytes .../__pycache__/color.cpython-312.pyc | Bin 30141 -> 30141 bytes .../__pycache__/config.cpython-312.pyc | Bin 7045 -> 7045 bytes .../__pycache__/errors.cpython-312.pyc | Bin 7619 -> 7619 bytes .../__pycache__/fields.cpython-312.pyc | Bin 63901 -> 63901 bytes .../functional_validators.cpython-312.pyc | Bin 32158 -> 32158 bytes .../__pycache__/json_schema.cpython-312.pyc | Bin 113868 -> 113868 bytes .../pydantic/__pycache__/main.cpython-312.pyc | Bin 74323 -> 74323 bytes .../__pycache__/networks.cpython-312.pyc | Bin 49552 -> 49552 bytes .../__pycache__/type_adapter.cpython-312.pyc | Bin 31885 -> 31885 bytes .../__pycache__/types.cpython-312.pyc | Bin 96469 -> 96469 bytes .../__pycache__/version.cpython-312.pyc | Bin 3903 -> 3903 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 5730 -> 5730 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 183 -> 183 bytes .../__pycache__/_config.cpython-312.pyc | Bin 15121 -> 15121 bytes .../_core_metadata.cpython-312.pyc | Bin 4603 -> 4603 bytes .../__pycache__/_core_utils.cpython-312.pyc | Bin 8052 -> 8052 bytes .../__pycache__/_decorators.cpython-312.pyc | Bin 35542 -> 35542 bytes .../_discriminated_union.cpython-312.pyc | Bin 20849 -> 20849 bytes .../_docs_extraction.cpython-312.pyc | Bin 5198 -> 5198 bytes .../__pycache__/_fields.cpython-312.pyc | Bin 18254 -> 18254 bytes .../__pycache__/_forward_ref.cpython-312.pyc | Bin 1292 -> 1292 bytes .../_generate_schema.cpython-312.pyc | Bin 132946 -> 132946 bytes .../__pycache__/_generics.cpython-312.pyc | Bin 24323 -> 24323 bytes .../__pycache__/_import_utils.cpython-312.pyc | Bin 811 -> 811 bytes .../_internal_dataclass.cpython-312.pyc | Bin 332 -> 332 bytes .../_known_annotated_metadata.cpython-312.pyc | Bin 13960 -> 13960 bytes .../__pycache__/_mock_val_ser.cpython-312.pyc | Bin 11093 -> 11093 bytes .../_model_construction.cpython-312.pyc | Bin 33930 -> 33930 bytes .../_namespace_utils.cpython-312.pyc | Bin 12294 -> 12294 bytes .../__pycache__/_repr.cpython-312.pyc | Bin 7683 -> 7683 bytes .../_schema_gather.cpython-312.pyc | Bin 7683 -> 7683 bytes .../_schema_generation_shared.cpython-312.pyc | Bin 6209 -> 6209 bytes .../__pycache__/_serializers.cpython-312.pyc | Bin 2104 -> 2104 bytes .../__pycache__/_signature.cpython-312.pyc | Bin 6752 -> 6752 bytes .../__pycache__/_typing_extra.cpython-312.pyc | Bin 27377 -> 27377 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 19609 -> 19609 bytes .../__pycache__/_validators.cpython-312.pyc | Bin 22999 -> 22999 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 8501 -> 8501 bytes .../__pycache__/_loader.cpython-312.pyc | Bin 2400 -> 2400 bytes .../_schema_validator.cpython-312.pyc | Bin 6926 -> 6926 bytes .../v1/__pycache__/__init__.cpython-312.pyc | Bin 2207 -> 2207 bytes .../annotated_types.cpython-312.pyc | Bin 3860 -> 3860 bytes .../class_validators.cpython-312.pyc | Bin 19659 -> 19659 bytes .../v1/__pycache__/color.cpython-312.pyc | Bin 25814 -> 25814 bytes .../v1/__pycache__/config.cpython-312.pyc | Bin 8387 -> 8387 bytes .../__pycache__/dataclasses.cpython-312.pyc | Bin 22757 -> 22757 bytes .../datetime_parse.cpython-312.pyc | Bin 10333 -> 10333 bytes .../v1/__pycache__/decorator.cpython-312.pyc | Bin 13916 -> 13916 bytes .../__pycache__/env_settings.cpython-312.pyc | Bin 17723 -> 17723 bytes .../error_wrappers.cpython-312.pyc | Bin 8916 -> 8916 bytes .../v1/__pycache__/errors.cpython-312.pyc | Bin 29585 -> 29585 bytes .../v1/__pycache__/fields.cpython-312.pyc | Bin 57414 -> 57414 bytes .../v1/__pycache__/json.cpython-312.pyc | Bin 5217 -> 5217 bytes .../v1/__pycache__/main.cpython-312.pyc | Bin 48257 -> 48257 bytes .../v1/__pycache__/networks.cpython-312.pyc | Bin 29546 -> 29546 bytes .../v1/__pycache__/parse.cpython-312.pyc | Bin 2734 -> 2734 bytes .../v1/__pycache__/schema.cpython-312.pyc | Bin 48486 -> 48486 bytes .../v1/__pycache__/tools.cpython-312.pyc | Bin 3867 -> 3867 bytes .../v1/__pycache__/types.cpython-312.pyc | Bin 48489 -> 48489 bytes .../v1/__pycache__/typing.cpython-312.pyc | Bin 22594 -> 22594 bytes .../v1/__pycache__/utils.cpython-312.pyc | Bin 35271 -> 35271 bytes .../v1/__pycache__/validators.cpython-312.pyc | Bin 30885 -> 30885 bytes .../v1/__pycache__/version.cpython-312.pyc | Bin 1946 -> 1946 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3089 -> 3089 bytes .../__pycache__/core_schema.cpython-312.pyc | Bin 150554 -> 150554 bytes .../INSTALLER | 1 + .../METADATA | 40 + .../python_multipart-0.0.20.dist-info/RECORD | 23 + .../REQUESTED | 0 .../python_multipart-0.0.20.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 14 + .../python_multipart/__init__.py | 25 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 573 bytes .../__pycache__/decoders.cpython-312.pyc | Bin 0 -> 8321 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 1742 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 0 -> 67803 bytes .../python_multipart/decoders.py | 185 + .../python_multipart/exceptions.py | 34 + .../python_multipart/multipart.py | 1873 +++++++ .../site-packages/python_multipart/py.typed | 0 .../pytz/__pycache__/__init__.cpython-312.pyc | Bin 30519 -> 30519 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2294 -> 2294 bytes .../pytz/__pycache__/lazy.cpython-312.pyc | Bin 7687 -> 7687 bytes .../pytz/__pycache__/tzfile.cpython-312.pyc | Bin 5264 -> 5264 bytes .../pytz/__pycache__/tzinfo.cpython-312.pyc | Bin 19279 -> 19279 bytes .../requests-2.32.4.dist-info/INSTALLER | 1 + .../requests-2.32.4.dist-info/METADATA | 133 + .../requests-2.32.4.dist-info/RECORD | 42 + .../WHEEL | 0 .../licenses/LICENSE | 175 + .../requests-2.32.4.dist-info/top_level.txt | 1 + venv/Lib/site-packages/requests/__init__.py | 184 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5402 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 566 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2006 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 28346 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7186 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13905 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 648 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 2362 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25258 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7567 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4309 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1034 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35483 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 1121 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27864 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 6013 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5599 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36160 bytes .../Lib/site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 50 + venv/Lib/site-packages/requests/adapters.py | 719 +++ venv/Lib/site-packages/requests/api.py | 157 + venv/Lib/site-packages/requests/auth.py | 314 ++ venv/Lib/site-packages/requests/certs.py | 17 + venv/Lib/site-packages/requests/compat.py | 106 + venv/Lib/site-packages/requests/cookies.py | 561 ++ venv/Lib/site-packages/requests/exceptions.py | 151 + venv/Lib/site-packages/requests/help.py | 134 + venv/Lib/site-packages/requests/hooks.py | 33 + venv/Lib/site-packages/requests/models.py | 1039 ++++ venv/Lib/site-packages/requests/packages.py | 23 + venv/Lib/site-packages/requests/sessions.py | 831 +++ .../site-packages/requests/status_codes.py | 128 + venv/Lib/site-packages/requests/structures.py | 99 + venv/Lib/site-packages/requests/utils.py | 1086 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 448 -> 448 bytes .../sniffio/__pycache__/_impl.cpython-312.pyc | Bin 3159 -> 3159 bytes .../__pycache__/_version.cpython-312.pyc | Bin 200 -> 200 bytes .../starlette-0.46.2.dist-info/INSTALLER | 1 + .../starlette-0.46.2.dist-info/METADATA | 176 + .../starlette-0.46.2.dist-info/RECORD | 74 + .../starlette-0.46.2.dist-info/WHEEL | 4 + .../licenses/LICENSE.md | 27 + venv/Lib/site-packages/starlette/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 201 bytes .../_exception_handler.cpython-312.pyc | Bin 0 -> 3078 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 5337 bytes .../__pycache__/applications.cpython-312.pyc | Bin 0 -> 13016 bytes .../authentication.cpython-312.pyc | Bin 0 -> 7842 bytes .../__pycache__/background.cpython-312.pyc | Bin 0 -> 2599 bytes .../__pycache__/concurrency.cpython-312.pyc | Bin 0 -> 3263 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 7530 bytes .../__pycache__/convertors.cpython-312.pyc | Bin 0 -> 4771 bytes .../datastructures.cpython-312.pyc | Bin 0 -> 39281 bytes .../__pycache__/endpoints.cpython-312.pyc | Bin 0 -> 7826 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2385 bytes .../__pycache__/formparsers.cpython-312.pyc | Bin 0 -> 14254 bytes .../__pycache__/requests.cpython-312.pyc | Bin 0 -> 16284 bytes .../__pycache__/responses.cpython-312.pyc | Bin 0 -> 29331 bytes .../__pycache__/routing.cpython-312.pyc | Bin 0 -> 44047 bytes .../__pycache__/schemas.cpython-312.pyc | Bin 0 -> 7047 bytes .../__pycache__/staticfiles.cpython-312.pyc | Bin 0 -> 11583 bytes .../__pycache__/status.cpython-312.pyc | Bin 0 -> 3628 bytes .../__pycache__/templating.cpython-312.pyc | Bin 0 -> 10027 bytes .../__pycache__/testclient.cpython-312.pyc | Bin 0 -> 33374 bytes .../__pycache__/types.cpython-312.pyc | Bin 0 -> 1775 bytes .../__pycache__/websockets.cpython-312.pyc | Bin 0 -> 11807 bytes .../starlette/_exception_handler.py | 65 + venv/Lib/site-packages/starlette/_utils.py | 100 + .../site-packages/starlette/applications.py | 249 + .../site-packages/starlette/authentication.py | 147 + .../Lib/site-packages/starlette/background.py | 41 + .../site-packages/starlette/concurrency.py | 62 + venv/Lib/site-packages/starlette/config.py | 138 + .../Lib/site-packages/starlette/convertors.py | 89 + .../site-packages/starlette/datastructures.py | 674 +++ venv/Lib/site-packages/starlette/endpoints.py | 122 + .../Lib/site-packages/starlette/exceptions.py | 33 + .../site-packages/starlette/formparsers.py | 275 + .../starlette/middleware/__init__.py | 42 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2530 bytes .../authentication.cpython-312.pyc | Bin 0 -> 2862 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 11318 bytes .../__pycache__/cors.cpython-312.pyc | Bin 0 -> 7417 bytes .../__pycache__/errors.cpython-312.pyc | Bin 0 -> 9954 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 4080 bytes .../__pycache__/gzip.cpython-312.pyc | Bin 0 -> 8553 bytes .../__pycache__/httpsredirect.cpython-312.pyc | Bin 0 -> 1760 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 4640 bytes .../__pycache__/trustedhost.cpython-312.pyc | Bin 0 -> 3115 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 8567 bytes .../starlette/middleware/authentication.py | 52 + .../starlette/middleware/base.py | 222 + .../starlette/middleware/cors.py | 172 + .../starlette/middleware/errors.py | 260 + .../starlette/middleware/exceptions.py | 72 + .../starlette/middleware/gzip.py | 141 + .../starlette/middleware/httpsredirect.py | 19 + .../starlette/middleware/sessions.py | 85 + .../starlette/middleware/trustedhost.py | 60 + .../starlette/middleware/wsgi.py | 152 + venv/Lib/site-packages/starlette/py.typed | 0 venv/Lib/site-packages/starlette/requests.py | 322 ++ venv/Lib/site-packages/starlette/responses.py | 536 ++ venv/Lib/site-packages/starlette/routing.py | 874 ++++ venv/Lib/site-packages/starlette/schemas.py | 147 + .../site-packages/starlette/staticfiles.py | 220 + venv/Lib/site-packages/starlette/status.py | 95 + .../Lib/site-packages/starlette/templating.py | 216 + .../Lib/site-packages/starlette/testclient.py | 731 +++ venv/Lib/site-packages/starlette/types.py | 24 + .../Lib/site-packages/starlette/websockets.py | 195 + .../twilio-9.6.3.dist-info/INSTALLER | 1 + .../twilio-9.6.3.dist-info/METADATA | 362 ++ .../twilio-9.6.3.dist-info/RECORD | 1368 +++++ .../twilio-9.6.3.dist-info/REQUESTED | 0 .../twilio-9.6.3.dist-info/WHEEL | 6 + .../licenses/AUTHORS.md | 41 + .../twilio-9.6.3.dist-info/licenses/LICENSE | 21 + .../twilio-9.6.3.dist-info/top_level.txt | 1 + venv/Lib/site-packages/twilio/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 278 bytes .../request_validator.cpython-312.pyc | Bin 0 -> 5663 bytes .../twilio/auth_strategy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 185 bytes .../__pycache__/auth_strategy.cpython-312.pyc | Bin 0 -> 1347 bytes .../__pycache__/auth_type.cpython-312.pyc | Bin 0 -> 708 bytes .../no_auth_strategy.cpython-312.pyc | Bin 0 -> 1101 bytes .../token_auth_strategy.cpython-312.pyc | Bin 0 -> 3466 bytes .../twilio/auth_strategy/auth_strategy.py | 19 + .../twilio/auth_strategy/auth_type.py | 12 + .../twilio/auth_strategy/no_auth_strategy.py | 13 + .../auth_strategy/token_auth_strategy.py | 55 + .../Lib/site-packages/twilio/base/__init__.py | 0 .../base/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 176 bytes .../__pycache__/client_base.cpython-312.pyc | Bin 0 -> 10994 bytes .../__pycache__/deserialize.cpython-312.pyc | Bin 0 -> 3273 bytes .../base/__pycache__/domain.cpython-312.pyc | Bin 0 -> 3778 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 4138 bytes .../instance_context.cpython-312.pyc | Bin 0 -> 613 bytes .../instance_resource.cpython-312.pyc | Bin 0 -> 616 bytes .../__pycache__/list_resource.cpython-312.pyc | Bin 0 -> 604 bytes .../base/__pycache__/obsolete.cpython-312.pyc | Bin 0 -> 2463 bytes .../base/__pycache__/page.cpython-312.pyc | Bin 0 -> 7679 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 3520 bytes .../base/__pycache__/values.cpython-312.pyc | Bin 0 -> 713 bytes .../base/__pycache__/version.cpython-312.pyc | Bin 0 -> 14920 bytes .../site-packages/twilio/base/client_base.py | 271 + .../site-packages/twilio/base/deserialize.py | 75 + venv/Lib/site-packages/twilio/base/domain.py | 93 + .../site-packages/twilio/base/exceptions.py | 82 + .../twilio/base/instance_context.py | 6 + .../twilio/base/instance_resource.py | 6 + .../twilio/base/list_resource.py | 6 + .../Lib/site-packages/twilio/base/obsolete.py | 47 + venv/Lib/site-packages/twilio/base/page.py | 173 + .../site-packages/twilio/base/serialize.py | 93 + venv/Lib/site-packages/twilio/base/values.py | 13 + venv/Lib/site-packages/twilio/base/version.py | 489 ++ .../twilio/credential/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 182 bytes ...client_credential_provider.cpython-312.pyc | Bin 0 -> 1901 bytes .../credential_provider.cpython-312.pyc | Bin 0 -> 1078 bytes .../orgs_credential_provider.cpython-312.pyc | Bin 0 -> 1888 bytes .../credential/client_credential_provider.py | 28 + .../twilio/credential/credential_provider.py | 13 + .../credential/orgs_credential_provider.py | 28 + .../Lib/site-packages/twilio/http/__init__.py | 104 + .../http/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5098 bytes .../async_http_client.cpython-312.pyc | Bin 0 -> 5792 bytes .../client_token_manager.cpython-312.pyc | Bin 0 -> 1884 bytes .../__pycache__/http_client.cpython-312.pyc | Bin 0 -> 5349 bytes .../orgs_token_manager.cpython-312.pyc | Bin 0 -> 1871 bytes .../http/__pycache__/request.cpython-312.pyc | Bin 0 -> 5130 bytes .../http/__pycache__/response.cpython-312.pyc | Bin 0 -> 1303 bytes .../__pycache__/token_manager.cpython-312.pyc | Bin 0 -> 587 bytes .../validation_client.cpython-312.pyc | Bin 0 -> 5745 bytes .../twilio/http/async_http_client.py | 135 + .../twilio/http/client_token_manager.py | 41 + .../site-packages/twilio/http/http_client.py | 119 + .../twilio/http/orgs_token_manager.py | 41 + venv/Lib/site-packages/twilio/http/request.py | 91 + .../Lib/site-packages/twilio/http/response.py | 22 + .../twilio/http/token_manager.py | 7 + .../twilio/http/validation_client.py | 138 + venv/Lib/site-packages/twilio/jwt/__init__.py | 161 + .../jwt/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6359 bytes .../twilio/jwt/access_token/__init__.py | 81 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4302 bytes .../__pycache__/grants.cpython-312.pyc | Bin 0 -> 6928 bytes .../twilio/jwt/access_token/grants.py | 183 + .../twilio/jwt/client/__init__.py | 117 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5758 bytes .../twilio/jwt/taskrouter/__init__.py | 142 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 8453 bytes .../__pycache__/capabilities.cpython-312.pyc | Bin 0 -> 6844 bytes .../twilio/jwt/taskrouter/capabilities.py | 116 + .../twilio/jwt/validation/__init__.py | 92 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4318 bytes .../site-packages/twilio/request_validator.py | 137 + .../Lib/site-packages/twilio/rest/__init__.py | 772 +++ .../rest/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 28111 bytes .../twilio/rest/accounts/AccountsBase.py | 44 + .../twilio/rest/accounts/__init__.py | 35 + .../__pycache__/AccountsBase.cpython-312.pyc | Bin 0 -> 1999 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1887 bytes .../twilio/rest/accounts/v1/__init__.py | 83 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4022 bytes .../auth_token_promotion.cpython-312.pyc | Bin 0 -> 7617 bytes .../__pycache__/bulk_consents.cpython-312.pyc | Bin 0 -> 7061 bytes .../__pycache__/bulk_contacts.cpython-312.pyc | Bin 0 -> 6307 bytes .../v1/__pycache__/safelist.cpython-312.pyc | Bin 0 -> 7854 bytes .../secondary_auth_token.cpython-312.pyc | Bin 0 -> 8934 bytes .../rest/accounts/v1/auth_token_promotion.py | 181 + .../twilio/rest/accounts/v1/bulk_consents.py | 114 + .../twilio/rest/accounts/v1/bulk_contacts.py | 114 + .../rest/accounts/v1/credential/__init__.py | 65 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2683 bytes .../__pycache__/aws.cpython-312.pyc | Bin 0 -> 25329 bytes .../__pycache__/public_key.cpython-312.pyc | Bin 0 -> 25761 bytes .../twilio/rest/accounts/v1/credential/aws.py | 609 +++ .../rest/accounts/v1/credential/public_key.py | 613 +++ .../twilio/rest/accounts/v1/safelist.py | 204 + .../rest/accounts/v1/secondary_auth_token.py | 215 + .../site-packages/twilio/rest/api/ApiBase.py | 44 + .../site-packages/twilio/rest/api/__init__.py | 258 + .../api/__pycache__/ApiBase.cpython-312.pyc | Bin 0 -> 1958 bytes .../api/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 11385 bytes .../twilio/rest/api/v2010/__init__.py | 59 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2784 bytes .../twilio/rest/api/v2010/account/__init__.py | 1136 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 44249 bytes .../__pycache__/application.cpython-312.pyc | Bin 0 -> 46971 bytes .../authorized_connect_app.cpython-312.pyc | Bin 0 -> 20061 bytes .../__pycache__/balance.cpython-312.pyc | Bin 0 -> 5146 bytes .../__pycache__/connect_app.cpython-312.pyc | Bin 0 -> 28258 bytes .../account/__pycache__/key.cpython-312.pyc | Bin 0 -> 23233 bytes .../__pycache__/new_key.cpython-312.pyc | Bin 0 -> 6815 bytes .../new_signing_key.cpython-312.pyc | Bin 0 -> 6876 bytes .../__pycache__/notification.cpython-312.pyc | Bin 0 -> 31602 bytes .../outgoing_caller_id.cpython-312.pyc | Bin 0 -> 26967 bytes .../__pycache__/short_code.cpython-312.pyc | Bin 0 -> 29042 bytes .../__pycache__/signing_key.cpython-312.pyc | Bin 0 -> 22789 bytes .../account/__pycache__/token.cpython-312.pyc | Bin 0 -> 6927 bytes .../__pycache__/transcription.cpython-312.pyc | Bin 0 -> 21742 bytes .../validation_request.cpython-312.pyc | Bin 0 -> 9143 bytes .../api/v2010/account/address/__init__.py | 913 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 40227 bytes .../dependent_phone_number.cpython-312.pyc | Bin 0 -> 17112 bytes .../account/address/dependent_phone_number.py | 374 ++ .../rest/api/v2010/account/application.py | 984 ++++ .../v2010/account/authorized_connect_app.py | 458 ++ .../__init__.py | 612 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26822 bytes .../__pycache__/local.cpython-312.pyc | Bin 0 -> 48377 bytes .../machine_to_machine.cpython-312.pyc | Bin 0 -> 48385 bytes .../__pycache__/mobile.cpython-312.pyc | Bin 0 -> 48003 bytes .../__pycache__/national.cpython-312.pyc | Bin 0 -> 48082 bytes .../__pycache__/shared_cost.cpython-312.pyc | Bin 0 -> 48157 bytes .../__pycache__/toll_free.cpython-312.pyc | Bin 0 -> 48083 bytes .../__pycache__/voip.cpython-312.pyc | Bin 0 -> 47926 bytes .../available_phone_number_country/local.py | 664 +++ .../machine_to_machine.py | 664 +++ .../available_phone_number_country/mobile.py | 664 +++ .../national.py | 664 +++ .../shared_cost.py | 664 +++ .../toll_free.py | 664 +++ .../available_phone_number_country/voip.py | 664 +++ .../twilio/rest/api/v2010/account/balance.py | 111 + .../rest/api/v2010/account/call/__init__.py | 1400 +++++ .../call/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 89522 bytes .../call/__pycache__/event.cpython-312.pyc | Bin 0 -> 13849 bytes .../__pycache__/notification.cpython-312.pyc | Bin 0 -> 32224 bytes .../call/__pycache__/payment.cpython-312.pyc | Bin 0 -> 24468 bytes .../__pycache__/recording.cpython-312.pyc | Bin 0 -> 40853 bytes .../call/__pycache__/siprec.cpython-312.pyc | Bin 0 -> 77599 bytes .../call/__pycache__/stream.cpython-312.pyc | Bin 0 -> 77619 bytes .../__pycache__/transcription.cpython-312.pyc | Bin 0 -> 18890 bytes .../user_defined_message.cpython-312.pyc | Bin 0 -> 7167 bytes ...fined_message_subscription.cpython-312.pyc | Bin 0 -> 13773 bytes .../rest/api/v2010/account/call/event.py | 298 ++ .../api/v2010/account/call/notification.py | 562 ++ .../rest/api/v2010/account/call/payment.py | 503 ++ .../rest/api/v2010/account/call/recording.py | 822 +++ .../rest/api/v2010/account/call/siprec.py | 1561 ++++++ .../rest/api/v2010/account/call/stream.py | 1563 ++++++ .../api/v2010/account/call/transcription.py | 439 ++ .../account/call/user_defined_message.py | 159 + .../call/user_defined_message_subscription.py | 300 ++ .../api/v2010/account/conference/__init__.py | 791 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 49281 bytes .../__pycache__/participant.cpython-312.pyc | Bin 0 -> 75133 bytes .../__pycache__/recording.cpython-312.pyc | Bin 0 -> 34599 bytes .../v2010/account/conference/participant.py | 1201 +++++ .../api/v2010/account/conference/recording.py | 718 +++ .../rest/api/v2010/account/connect_app.py | 690 +++ .../account/incoming_phone_number/__init__.py | 1310 +++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 65081 bytes .../__pycache__/local.cpython-312.pyc | Bin 0 -> 36395 bytes .../__pycache__/mobile.cpython-312.pyc | Bin 0 -> 36443 bytes .../__pycache__/toll_free.cpython-312.pyc | Bin 0 -> 36525 bytes .../assigned_add_on/__init__.py | 602 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 25974 bytes .../assigned_add_on_extension.cpython-312.pyc | Bin 0 -> 22097 bytes .../assigned_add_on_extension.py | 484 ++ .../account/incoming_phone_number/local.py | 672 +++ .../account/incoming_phone_number/mobile.py | 676 +++ .../incoming_phone_number/toll_free.py | 676 +++ .../twilio/rest/api/v2010/account/key.py | 566 ++ .../api/v2010/account/message/__init__.py | 1014 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 60823 bytes .../__pycache__/feedback.cpython-312.pyc | Bin 0 -> 6460 bytes .../message/__pycache__/media.cpython-312.pyc | Bin 0 -> 31706 bytes .../api/v2010/account/message/feedback.py | 170 + .../rest/api/v2010/account/message/media.py | 564 ++ .../twilio/rest/api/v2010/account/new_key.py | 144 + .../rest/api/v2010/account/new_signing_key.py | 144 + .../rest/api/v2010/account/notification.py | 540 ++ .../api/v2010/account/outgoing_caller_id.py | 620 +++ .../rest/api/v2010/account/queue/__init__.py | 687 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 28051 bytes .../queue/__pycache__/member.cpython-312.pyc | Bin 0 -> 23309 bytes .../rest/api/v2010/account/queue/member.py | 564 ++ .../api/v2010/account/recording/__init__.py | 720 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 39695 bytes .../__pycache__/transcription.cpython-312.pyc | Bin 0 -> 22454 bytes .../recording/add_on_result/__init__.py | 553 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 23093 bytes .../add_on_result/payload/__init__.py | 566 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 24394 bytes .../payload/__pycache__/data.cpython-312.pyc | Bin 0 -> 9580 bytes .../recording/add_on_result/payload/data.py | 247 + .../v2010/account/recording/transcription.py | 524 ++ .../rest/api/v2010/account/short_code.py | 650 +++ .../rest/api/v2010/account/signing_key.py | 572 ++ .../rest/api/v2010/account/sip/__init__.py | 89 + .../sip/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3750 bytes .../account/sip/credential_list/__init__.py | 653 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26977 bytes .../__pycache__/credential.cpython-312.pyc | Bin 0 -> 27728 bytes .../account/sip/credential_list/credential.py | 666 +++ .../api/v2010/account/sip/domain/__init__.py | 977 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 45420 bytes .../credential_list_mapping.cpython-312.pyc | Bin 0 -> 24965 bytes ...ccess_control_list_mapping.cpython-312.pyc | Bin 0 -> 25143 bytes .../account/sip/domain/auth_types/__init__.py | 86 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3521 bytes .../auth_types/auth_type_calls/__init__.py | 96 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3837 bytes ...ls_credential_list_mapping.cpython-312.pyc | Bin 0 -> 25279 bytes ...ccess_control_list_mapping.cpython-312.pyc | Bin 0 -> 25703 bytes .../auth_calls_credential_list_mapping.py | 582 +++ ...th_calls_ip_access_control_list_mapping.py | 586 +++ .../auth_type_registrations/__init__.py | 71 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3145 bytes ...ns_credential_list_mapping.cpython-312.pyc | Bin 0 -> 25856 bytes ...h_registrations_credential_list_mapping.py | 582 +++ .../sip/domain/credential_list_mapping.py | 568 ++ .../domain/ip_access_control_list_mapping.py | 574 +++ .../sip/ip_access_control_list/__init__.py | 657 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27468 bytes .../__pycache__/ip_address.cpython-312.pyc | Bin 0 -> 29957 bytes .../sip/ip_access_control_list/ip_address.py | 724 +++ .../twilio/rest/api/v2010/account/token.py | 146 + .../rest/api/v2010/account/transcription.py | 504 ++ .../rest/api/v2010/account/usage/__init__.py | 74 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3108 bytes .../usage/__pycache__/trigger.cpython-312.pyc | Bin 0 -> 78178 bytes .../v2010/account/usage/record/__init__.py | 1316 +++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 70500 bytes .../__pycache__/all_time.cpython-312.pyc | Bin 0 -> 66444 bytes .../record/__pycache__/daily.cpython-312.pyc | Bin 0 -> 66356 bytes .../__pycache__/last_month.cpython-312.pyc | Bin 0 -> 66539 bytes .../__pycache__/monthly.cpython-312.pyc | Bin 0 -> 66443 bytes .../__pycache__/this_month.cpython-312.pyc | Bin 0 -> 66539 bytes .../record/__pycache__/today.cpython-312.pyc | Bin 0 -> 66356 bytes .../record/__pycache__/yearly.cpython-312.pyc | Bin 0 -> 66401 bytes .../__pycache__/yesterday.cpython-312.pyc | Bin 0 -> 66538 bytes .../v2010/account/usage/record/all_time.py | 1211 +++++ .../api/v2010/account/usage/record/daily.py | 1211 +++++ .../v2010/account/usage/record/last_month.py | 1211 +++++ .../api/v2010/account/usage/record/monthly.py | 1211 +++++ .../v2010/account/usage/record/this_month.py | 1211 +++++ .../api/v2010/account/usage/record/today.py | 1211 +++++ .../api/v2010/account/usage/record/yearly.py | 1211 +++++ .../v2010/account/usage/record/yesterday.py | 1211 +++++ .../rest/api/v2010/account/usage/trigger.py | 1611 ++++++ .../api/v2010/account/validation_request.py | 173 + .../twilio/rest/assistants/AssistantsBase.py | 44 + .../twilio/rest/assistants/__init__.py | 56 + .../AssistantsBase.cpython-312.pyc | Bin 0 -> 2023 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2583 bytes .../twilio/rest/assistants/v1/__init__.py | 75 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3529 bytes .../v1/__pycache__/policy.cpython-312.pyc | Bin 0 -> 15451 bytes .../v1/__pycache__/tool.cpython-312.pyc | Bin 0 -> 34511 bytes .../rest/assistants/v1/assistant/__init__.py | 1036 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 38466 bytes .../assistants_knowledge.cpython-312.pyc | Bin 0 -> 23386 bytes .../assistants_tool.cpython-312.pyc | Bin 0 -> 22828 bytes .../__pycache__/feedback.cpython-312.pyc | Bin 0 -> 18062 bytes .../__pycache__/message.cpython-312.pyc | Bin 0 -> 8014 bytes .../v1/assistant/assistants_knowledge.py | 520 ++ .../v1/assistant/assistants_tool.py | 518 ++ .../rest/assistants/v1/assistant/feedback.py | 404 ++ .../rest/assistants/v1/assistant/message.py | 186 + .../rest/assistants/v1/knowledge/__init__.py | 962 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37069 bytes .../__pycache__/chunk.cpython-312.pyc | Bin 0 -> 14370 bytes .../knowledge_status.cpython-312.pyc | Bin 0 -> 8639 bytes .../rest/assistants/v1/knowledge/chunk.py | 297 ++ .../v1/knowledge/knowledge_status.py | 196 + .../twilio/rest/assistants/v1/policy.py | 332 ++ .../rest/assistants/v1/session/__init__.py | 439 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 19334 bytes .../__pycache__/message.cpython-312.pyc | Bin 0 -> 15063 bytes .../rest/assistants/v1/session/message.py | 309 ++ .../twilio/rest/assistants/v1/tool.py | 916 ++++ .../rest/bulkexports/BulkexportsBase.py | 44 + .../twilio/rest/bulkexports/__init__.py | 25 + .../BulkexportsBase.cpython-312.pyc | Bin 0 -> 2035 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1437 bytes .../twilio/rest/bulkexports/v1/__init__.py | 51 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2477 bytes .../export_configuration.cpython-312.pyc | Bin 0 -> 13003 bytes .../rest/bulkexports/v1/export/__init__.py | 250 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 10005 bytes .../v1/export/__pycache__/day.cpython-312.pyc | Bin 0 -> 19009 bytes .../export_custom_job.cpython-312.pyc | Bin 0 -> 20586 bytes .../v1/export/__pycache__/job.cpython-312.pyc | Bin 0 -> 11353 bytes .../twilio/rest/bulkexports/v1/export/day.py | 431 ++ .../v1/export/export_custom_job.py | 400 ++ .../twilio/rest/bulkexports/v1/export/job.py | 253 + .../bulkexports/v1/export_configuration.py | 312 ++ .../twilio/rest/chat/ChatBase.py | 66 + .../twilio/rest/chat/__init__.py | 35 + .../chat/__pycache__/ChatBase.cpython-312.pyc | Bin 0 -> 2651 bytes .../chat/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1696 bytes .../twilio/rest/chat/v1/__init__.py | 51 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2384 bytes .../v1/__pycache__/credential.cpython-312.pyc | Bin 0 -> 30948 bytes .../twilio/rest/chat/v1/credential.py | 711 +++ .../twilio/rest/chat/v1/service/__init__.py | 1359 +++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 72645 bytes .../service/__pycache__/role.cpython-312.pyc | Bin 0 -> 26904 bytes .../rest/chat/v1/service/channel/__init__.py | 790 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 32738 bytes .../__pycache__/invite.cpython-312.pyc | Bin 0 -> 27724 bytes .../__pycache__/member.cpython-312.pyc | Bin 0 -> 32485 bytes .../__pycache__/message.cpython-312.pyc | Bin 0 -> 29807 bytes .../rest/chat/v1/service/channel/invite.py | 598 +++ .../rest/chat/v1/service/channel/member.py | 716 +++ .../rest/chat/v1/service/channel/message.py | 731 +++ .../twilio/rest/chat/v1/service/role.py | 645 +++ .../rest/chat/v1/service/user/__init__.py | 723 +++ .../user/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 31598 bytes .../__pycache__/user_channel.cpython-312.pyc | Bin 0 -> 14942 bytes .../rest/chat/v1/service/user/user_channel.py | 322 ++ .../twilio/rest/chat/v2/__init__.py | 51 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2384 bytes .../v2/__pycache__/credential.cpython-312.pyc | Bin 0 -> 30698 bytes .../twilio/rest/chat/v2/credential.py | 711 +++ .../twilio/rest/chat/v2/service/__init__.py | 1128 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 57157 bytes .../__pycache__/binding.cpython-312.pyc | Bin 0 -> 25877 bytes .../service/__pycache__/role.cpython-312.pyc | Bin 0 -> 27060 bytes .../twilio/rest/chat/v2/service/binding.py | 536 ++ .../rest/chat/v2/service/channel/__init__.py | 962 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 40381 bytes .../__pycache__/invite.cpython-312.pyc | Bin 0 -> 27745 bytes .../__pycache__/member.cpython-312.pyc | Bin 0 -> 40193 bytes .../__pycache__/message.cpython-312.pyc | Bin 0 -> 37596 bytes .../__pycache__/webhook.cpython-312.pyc | Bin 0 -> 35346 bytes .../rest/chat/v2/service/channel/invite.py | 598 +++ .../rest/chat/v2/service/channel/member.py | 905 ++++ .../rest/chat/v2/service/channel/message.py | 905 ++++ .../rest/chat/v2/service/channel/webhook.py | 800 +++ .../twilio/rest/chat/v2/service/role.py | 645 +++ .../rest/chat/v2/service/user/__init__.py | 804 +++ .../user/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 31183 bytes .../__pycache__/user_binding.cpython-312.pyc | Bin 0 -> 24902 bytes .../__pycache__/user_channel.cpython-312.pyc | Bin 0 -> 28260 bytes .../rest/chat/v2/service/user/user_binding.py | 552 ++ .../rest/chat/v2/service/user/user_channel.py | 708 +++ .../twilio/rest/chat/v3/__init__.py | 43 + .../v3/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1996 bytes .../v3/__pycache__/channel.cpython-312.pyc | Bin 0 -> 12016 bytes .../twilio/rest/chat/v3/channel.py | 325 ++ .../twilio/rest/content/ContentBase.py | 55 + .../twilio/rest/content/__init__.py | 35 + .../__pycache__/ContentBase.cpython-312.pyc | Bin 0 -> 2346 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1870 bytes .../twilio/rest/content/v1/__init__.py | 59 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2869 bytes .../content_and_approvals.cpython-312.pyc | Bin 0 -> 14886 bytes .../legacy_content.cpython-312.pyc | Bin 0 -> 15109 bytes .../rest/content/v1/content/__init__.py | 2766 ++++++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 92411 bytes .../approval_create.cpython-312.pyc | Bin 0 -> 7120 bytes .../approval_fetch.cpython-312.pyc | Bin 0 -> 8554 bytes .../content/v1/content/approval_create.py | 172 + .../rest/content/v1/content/approval_fetch.py | 193 + .../rest/content/v1/content_and_approvals.py | 298 ++ .../twilio/rest/content/v1/legacy_content.py | 300 ++ .../twilio/rest/content/v2/__init__.py | 51 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2458 bytes .../v2/__pycache__/content.cpython-312.pyc | Bin 0 -> 24656 bytes .../content_and_approvals.cpython-312.pyc | Bin 0 -> 25074 bytes .../twilio/rest/content/v2/content.py | 464 ++ .../rest/content/v2/content_and_approvals.py | 464 ++ .../rest/conversations/ConversationsBase.py | 44 + .../twilio/rest/conversations/__init__.py | 87 + .../ConversationsBase.cpython-312.pyc | Bin 0 -> 2059 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4108 bytes .../twilio/rest/conversations/v1/__init__.py | 115 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5387 bytes .../address_configuration.cpython-312.pyc | Bin 0 -> 37883 bytes ...ersation_with_participants.cpython-312.pyc | Bin 0 -> 12894 bytes .../v1/__pycache__/credential.cpython-312.pyc | Bin 0 -> 31079 bytes .../participant_conversation.cpython-312.pyc | Bin 0 -> 19109 bytes .../v1/__pycache__/role.cpython-312.pyc | Bin 0 -> 25933 bytes .../conversations/v1/address_configuration.py | 859 +++ .../v1/configuration/__init__.py | 325 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 12982 bytes .../__pycache__/webhook.cpython-312.pyc | Bin 0 -> 12751 bytes .../conversations/v1/configuration/webhook.py | 327 ++ .../conversations/v1/conversation/__init__.py | 1025 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 48834 bytes .../__pycache__/participant.cpython-312.pyc | Bin 0 -> 38233 bytes .../__pycache__/webhook.cpython-312.pyc | Bin 0 -> 31254 bytes .../v1/conversation/message/__init__.py | 912 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37106 bytes .../delivery_receipt.cpython-312.pyc | Bin 0 -> 21069 bytes .../conversation/message/delivery_receipt.py | 482 ++ .../v1/conversation/participant.py | 895 ++++ .../conversations/v1/conversation/webhook.py | 758 +++ .../v1/conversation_with_participants.py | 251 + .../rest/conversations/v1/credential.py | 723 +++ .../v1/participant_conversation.py | 366 ++ .../twilio/rest/conversations/v1/role.py | 610 +++ .../rest/conversations/v1/service/__init__.py | 667 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27387 bytes .../__pycache__/binding.cpython-312.pyc | Bin 0 -> 26133 bytes ...ersation_with_participants.cpython-312.pyc | Bin 0 -> 13923 bytes .../participant_conversation.cpython-312.pyc | Bin 0 -> 20238 bytes .../service/__pycache__/role.cpython-312.pyc | Bin 0 -> 27201 bytes .../rest/conversations/v1/service/binding.py | 536 ++ .../v1/service/configuration/__init__.py | 375 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16328 bytes .../__pycache__/notification.cpython-312.pyc | Bin 0 -> 20943 bytes .../__pycache__/webhook.cpython-312.pyc | Bin 0 -> 14170 bytes .../v1/service/configuration/notification.py | 463 ++ .../v1/service/configuration/webhook.py | 340 ++ .../v1/service/conversation/__init__.py | 1069 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 50294 bytes .../__pycache__/participant.cpython-312.pyc | Bin 0 -> 39411 bytes .../__pycache__/webhook.cpython-312.pyc | Bin 0 -> 32310 bytes .../service/conversation/message/__init__.py | 943 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 38241 bytes .../delivery_receipt.cpython-312.pyc | Bin 0 -> 21944 bytes .../conversation/message/delivery_receipt.py | 505 ++ .../v1/service/conversation/participant.py | 925 ++++ .../v1/service/conversation/webhook.py | 788 +++ .../service/conversation_with_participants.py | 272 + .../v1/service/participant_conversation.py | 383 ++ .../rest/conversations/v1/service/role.py | 645 +++ .../conversations/v1/service/user/__init__.py | 818 +++ .../user/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 31164 bytes .../user_conversation.cpython-312.pyc | Bin 0 -> 27994 bytes .../v1/service/user/user_conversation.py | 684 +++ .../rest/conversations/v1/user/__init__.py | 780 +++ .../user/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 29820 bytes .../user_conversation.cpython-312.pyc | Bin 0 -> 27105 bytes .../v1/user/user_conversation.py | 658 +++ .../twilio/rest/events/EventsBase.py | 44 + .../twilio/rest/events/__init__.py | 45 + .../__pycache__/EventsBase.cpython-312.pyc | Bin 0 -> 1975 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2170 bytes .../twilio/rest/events/v1/__init__.py | 67 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3146 bytes .../v1/__pycache__/event_type.cpython-312.pyc | Bin 0 -> 20305 bytes .../twilio/rest/events/v1/event_type.py | 437 ++ .../twilio/rest/events/v1/schema/__init__.py | 221 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 9280 bytes .../schema_version.cpython-312.pyc | Bin 0 -> 19444 bytes .../rest/events/v1/schema/schema_version.py | 432 ++ .../twilio/rest/events/v1/sink/__init__.py | 703 +++ .../sink/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 28678 bytes .../__pycache__/sink_test.cpython-312.pyc | Bin 0 -> 4858 bytes .../__pycache__/sink_validate.cpython-312.pyc | Bin 0 -> 5428 bytes .../twilio/rest/events/v1/sink/sink_test.py | 105 + .../rest/events/v1/sink/sink_validate.py | 123 + .../rest/events/v1/subscription/__init__.py | 665 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 28575 bytes .../subscribed_event.cpython-312.pyc | Bin 0 -> 25727 bytes .../v1/subscription/subscribed_event.py | 641 +++ .../twilio/rest/flex_api/FlexApiBase.py | 55 + .../twilio/rest/flex_api/__init__.py | 185 + .../__pycache__/FlexApiBase.cpython-312.pyc | Bin 0 -> 2350 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 8582 bytes .../twilio/rest/flex_api/v1/__init__.py | 245 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 11514 bytes .../__pycache__/assessments.cpython-312.pyc | Bin 0 -> 26616 bytes .../v1/__pycache__/channel.cpython-312.pyc | Bin 0 -> 25005 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13956 bytes .../v1/__pycache__/flex_flow.cpython-312.pyc | Bin 0 -> 44627 bytes ...sights_assessments_comment.cpython-312.pyc | Bin 0 -> 20146 bytes .../insights_conversations.cpython-312.pyc | Bin 0 -> 15595 bytes .../insights_questionnaires.cpython-312.pyc | Bin 0 -> 32734 bytes ...ts_questionnaires_category.cpython-312.pyc | Bin 0 -> 25667 bytes ...ts_questionnaires_question.cpython-312.pyc | Bin 0 -> 30731 bytes .../insights_segments.cpython-312.pyc | Bin 0 -> 18821 bytes .../insights_session.cpython-312.pyc | Bin 0 -> 7384 bytes ...ights_settings_answer_sets.cpython-312.pyc | Bin 0 -> 5071 bytes .../insights_settings_comment.cpython-312.pyc | Bin 0 -> 4682 bytes .../insights_user_roles.cpython-312.pyc | Bin 0 -> 7194 bytes .../plugin_archive.cpython-312.pyc | Bin 0 -> 10491 bytes ...ugin_configuration_archive.cpython-312.pyc | Bin 0 -> 10503 bytes .../plugin_release.cpython-312.pyc | Bin 0 -> 22413 bytes .../plugin_version_archive.cpython-312.pyc | Bin 0 -> 11295 bytes .../provisioning_status.cpython-312.pyc | Bin 0 -> 6715 bytes .../__pycache__/web_channel.cpython-312.pyc | Bin 0 -> 25597 bytes .../twilio/rest/flex_api/v1/assessments.py | 685 +++ .../twilio/rest/flex_api/v1/channel.py | 575 +++ .../twilio/rest/flex_api/v1/configuration.py | 439 ++ .../twilio/rest/flex_api/v1/flex_flow.py | 965 ++++ .../v1/insights_assessments_comment.py | 469 ++ .../flex_api/v1/insights_conversations.py | 333 ++ .../flex_api/v1/insights_questionnaires.py | 813 +++ .../v1/insights_questionnaires_category.py | 631 +++ .../v1/insights_questionnaires_question.py | 749 +++ .../rest/flex_api/v1/insights_segments.py | 395 ++ .../rest/flex_api/v1/insights_session.py | 190 + .../v1/insights_settings_answer_sets.py | 118 + .../flex_api/v1/insights_settings_comment.py | 112 + .../rest/flex_api/v1/insights_user_roles.py | 202 + .../rest/flex_api/v1/interaction/__init__.py | 386 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 15683 bytes .../interaction_channel/__init__.py | 644 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26728 bytes ...interaction_channel_invite.cpython-312.pyc | Bin 0 -> 17567 bytes ...action_channel_participant.cpython-312.pyc | Bin 0 -> 24292 bytes .../interaction_transfer.cpython-312.pyc | Bin 0 -> 15437 bytes .../interaction_channel_invite.py | 372 ++ .../interaction_channel_participant.py | 599 +++ .../interaction_transfer.py | 423 ++ .../rest/flex_api/v1/plugin/__init__.py | 707 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27977 bytes .../plugin_versions.cpython-312.pyc | Bin 0 -> 25965 bytes .../flex_api/v1/plugin/plugin_versions.py | 612 +++ .../twilio/rest/flex_api/v1/plugin_archive.py | 230 + .../v1/plugin_configuration/__init__.py | 583 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 25300 bytes .../configured_plugin.cpython-312.pyc | Bin 0 -> 23432 bytes .../plugin_configuration/configured_plugin.py | 524 ++ .../v1/plugin_configuration_archive.py | 234 + .../twilio/rest/flex_api/v1/plugin_release.py | 537 ++ .../flex_api/v1/plugin_version_archive.py | 256 + .../rest/flex_api/v1/provisioning_status.py | 181 + .../twilio/rest/flex_api/v1/web_channel.py | 651 +++ .../twilio/rest/flex_api/v2/__init__.py | 51 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2418 bytes .../v2/__pycache__/flex_user.cpython-312.pyc | Bin 0 -> 13833 bytes .../__pycache__/web_channels.cpython-312.pyc | Bin 0 -> 7294 bytes .../twilio/rest/flex_api/v2/flex_user.py | 358 ++ .../twilio/rest/flex_api/v2/web_channels.py | 154 + .../rest/frontline_api/FrontlineApiBase.py | 44 + .../twilio/rest/frontline_api/__init__.py | 15 + .../FrontlineApiBase.cpython-312.pyc | Bin 0 -> 2050 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 940 bytes .../twilio/rest/frontline_api/v1/__init__.py | 43 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2028 bytes .../v1/__pycache__/user.cpython-312.pyc | Bin 0 -> 12710 bytes .../twilio/rest/frontline_api/v1/user.py | 326 ++ .../site-packages/twilio/rest/iam/IamBase.py | 44 + .../site-packages/twilio/rest/iam/__init__.py | 25 + .../iam/__pycache__/IamBase.cpython-312.pyc | Bin 0 -> 1939 bytes .../iam/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1316 bytes .../twilio/rest/iam/v1/__init__.py | 67 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3117 bytes .../v1/__pycache__/api_key.cpython-312.pyc | Bin 0 -> 14155 bytes .../__pycache__/get_api_keys.cpython-312.pyc | Bin 0 -> 14723 bytes .../__pycache__/new_api_key.cpython-312.pyc | Bin 0 -> 6887 bytes .../iam/v1/__pycache__/token.cpython-312.pyc | Bin 0 -> 6994 bytes .../twilio/rest/iam/v1/api_key.py | 342 ++ .../twilio/rest/iam/v1/get_api_keys.py | 304 ++ .../twilio/rest/iam/v1/new_api_key.py | 157 + .../site-packages/twilio/rest/iam/v1/token.py | 170 + .../twilio/rest/insights/InsightsBase.py | 44 + .../twilio/rest/insights/__init__.py | 55 + .../__pycache__/InsightsBase.cpython-312.pyc | Bin 0 -> 1999 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2573 bytes .../twilio/rest/insights/v1/__init__.py | 75 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3498 bytes .../call_summaries.cpython-312.pyc | Bin 0 -> 68809 bytes .../v1/__pycache__/setting.cpython-312.pyc | Bin 0 -> 10944 bytes .../twilio/rest/insights/v1/call/__init__.py | 275 + .../call/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 10439 bytes .../__pycache__/annotation.cpython-312.pyc | Bin 0 -> 16489 bytes .../__pycache__/call_summary.cpython-312.pyc | Bin 0 -> 11972 bytes .../v1/call/__pycache__/event.cpython-312.pyc | Bin 0 -> 16073 bytes .../call/__pycache__/metric.cpython-312.pyc | Bin 0 -> 17306 bytes .../rest/insights/v1/call/annotation.py | 395 ++ .../rest/insights/v1/call/call_summary.py | 321 ++ .../twilio/rest/insights/v1/call/event.py | 337 ++ .../twilio/rest/insights/v1/call/metric.py | 352 ++ .../twilio/rest/insights/v1/call_summaries.py | 973 ++++ .../rest/insights/v1/conference/__init__.py | 732 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 33438 bytes .../conference_participant.cpython-312.pyc | Bin 0 -> 27647 bytes .../v1/conference/conference_participant.py | 655 +++ .../twilio/rest/insights/v1/room/__init__.py | 664 +++ .../room/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 29668 bytes .../__pycache__/participant.cpython-312.pyc | Bin 0 -> 21688 bytes .../rest/insights/v1/room/participant.py | 516 ++ .../twilio/rest/insights/v1/setting.py | 318 ++ .../rest/intelligence/IntelligenceBase.py | 44 + .../twilio/rest/intelligence/__init__.py | 13 + .../IntelligenceBase.cpython-312.pyc | Bin 0 -> 2047 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1083 bytes .../twilio/rest/intelligence/v2/__init__.py | 99 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4963 bytes .../custom_operator.cpython-312.pyc | Bin 0 -> 29281 bytes .../v2/__pycache__/operator.cpython-312.pyc | Bin 0 -> 21361 bytes .../operator_attachment.cpython-312.pyc | Bin 0 -> 10250 bytes .../operator_attachments.cpython-312.pyc | Bin 0 -> 8350 bytes .../__pycache__/operator_type.cpython-312.pyc | Bin 0 -> 20085 bytes .../prebuilt_operator.cpython-312.pyc | Bin 0 -> 22022 bytes .../v2/__pycache__/service.cpython-312.pyc | Bin 0 -> 34936 bytes .../rest/intelligence/v2/custom_operator.py | 716 +++ .../twilio/rest/intelligence/v2/operator.py | 476 ++ .../intelligence/v2/operator_attachment.py | 247 + .../intelligence/v2/operator_attachments.py | 192 + .../rest/intelligence/v2/operator_type.py | 458 ++ .../rest/intelligence/v2/prebuilt_operator.py | 488 ++ .../twilio/rest/intelligence/v2/service.py | 787 +++ .../intelligence/v2/transcript/__init__.py | 775 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 32717 bytes .../__pycache__/media.cpython-312.pyc | Bin 0 -> 9160 bytes .../operator_result.cpython-312.pyc | Bin 0 -> 23187 bytes .../__pycache__/sentence.cpython-312.pyc | Bin 0 -> 17881 bytes .../rest/intelligence/v2/transcript/media.py | 221 + .../v2/transcript/operator_result.py | 531 ++ .../intelligence/v2/transcript/sentence.py | 348 ++ .../rest/ip_messaging/IpMessagingBase.py | 55 + .../twilio/rest/ip_messaging/__init__.py | 25 + .../IpMessagingBase.cpython-312.pyc | Bin 0 -> 2410 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1393 bytes .../twilio/rest/ip_messaging/v1/__init__.py | 51 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2438 bytes .../v1/__pycache__/credential.cpython-312.pyc | Bin 0 -> 27251 bytes .../twilio/rest/ip_messaging/v1/credential.py | 711 +++ .../rest/ip_messaging/v1/service/__init__.py | 1359 +++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 56127 bytes .../service/__pycache__/role.cpython-312.pyc | Bin 0 -> 25250 bytes .../v1/service/channel/__init__.py | 790 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 30236 bytes .../__pycache__/invite.cpython-312.pyc | Bin 0 -> 24028 bytes .../__pycache__/member.cpython-312.pyc | Bin 0 -> 27338 bytes .../__pycache__/message.cpython-312.pyc | Bin 0 -> 27186 bytes .../ip_messaging/v1/service/channel/invite.py | 598 +++ .../ip_messaging/v1/service/channel/member.py | 716 +++ .../v1/service/channel/message.py | 731 +++ .../rest/ip_messaging/v1/service/role.py | 645 +++ .../ip_messaging/v1/service/user/__init__.py | 723 +++ .../user/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27234 bytes .../__pycache__/user_channel.cpython-312.pyc | Bin 0 -> 14759 bytes .../v1/service/user/user_channel.py | 322 ++ .../twilio/rest/ip_messaging/v2/__init__.py | 51 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2438 bytes .../v2/__pycache__/credential.cpython-312.pyc | Bin 0 -> 27251 bytes .../twilio/rest/ip_messaging/v2/credential.py | 711 +++ .../rest/ip_messaging/v2/service/__init__.py | 1128 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 44564 bytes .../__pycache__/binding.cpython-312.pyc | Bin 0 -> 23158 bytes .../service/__pycache__/role.cpython-312.pyc | Bin 0 -> 25250 bytes .../rest/ip_messaging/v2/service/binding.py | 536 ++ .../v2/service/channel/__init__.py | 962 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 35273 bytes .../__pycache__/invite.cpython-312.pyc | Bin 0 -> 24028 bytes .../__pycache__/member.cpython-312.pyc | Bin 0 -> 32572 bytes .../__pycache__/message.cpython-312.pyc | Bin 0 -> 32441 bytes .../__pycache__/webhook.cpython-312.pyc | Bin 0 -> 30757 bytes .../ip_messaging/v2/service/channel/invite.py | 598 +++ .../ip_messaging/v2/service/channel/member.py | 905 ++++ .../v2/service/channel/message.py | 905 ++++ .../v2/service/channel/webhook.py | 800 +++ .../rest/ip_messaging/v2/service/role.py | 645 +++ .../ip_messaging/v2/service/user/__init__.py | 804 +++ .../user/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 29091 bytes .../__pycache__/user_binding.cpython-312.pyc | Bin 0 -> 22834 bytes .../__pycache__/user_channel.cpython-312.pyc | Bin 0 -> 25499 bytes .../v2/service/user/user_binding.py | 552 ++ .../v2/service/user/user_channel.py | 666 +++ .../twilio/rest/lookups/LookupsBase.py | 55 + .../twilio/rest/lookups/__init__.py | 15 + .../__pycache__/LookupsBase.cpython-312.pyc | Bin 0 -> 2346 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 950 bytes .../twilio/rest/lookups/v1/__init__.py | 43 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2044 bytes .../__pycache__/phone_number.cpython-312.pyc | Bin 0 -> 13816 bytes .../twilio/rest/lookups/v1/phone_number.py | 272 + .../twilio/rest/lookups/v2/__init__.py | 43 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2044 bytes .../__pycache__/phone_number.cpython-312.pyc | Bin 0 -> 19773 bytes .../twilio/rest/lookups/v2/phone_number.py | 443 ++ .../rest/marketplace/MarketplaceBase.py | 44 + .../twilio/rest/marketplace/__init__.py | 9 + .../MarketplaceBase.cpython-312.pyc | Bin 0 -> 2035 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 835 bytes .../twilio/rest/marketplace/v1/__init__.py | 75 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3759 bytes .../__pycache__/module_data.cpython-312.pyc | Bin 0 -> 8190 bytes .../module_data_management.cpython-312.pyc | Bin 0 -> 16500 bytes .../referral_conversion.cpython-312.pyc | Bin 0 -> 5833 bytes .../v1/available_add_on/__init__.py | 438 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 19687 bytes ...available_add_on_extension.cpython-312.pyc | Bin 0 -> 20220 bytes .../available_add_on_extension.py | 445 ++ .../v1/installed_add_on/__init__.py | 694 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 29552 bytes ...installed_add_on_extension.cpython-312.pyc | Bin 0 -> 23008 bytes .../installed_add_on_usage.cpython-312.pyc | Bin 0 -> 10013 bytes .../installed_add_on_extension.py | 533 ++ .../installed_add_on_usage.py | 234 + .../twilio/rest/marketplace/v1/module_data.py | 176 + .../marketplace/v1/module_data_management.py | 367 ++ .../marketplace/v1/referral_conversion.py | 143 + .../twilio/rest/messaging/MessagingBase.py | 55 + .../twilio/rest/messaging/__init__.py | 99 + .../__pycache__/MessagingBase.cpython-312.pyc | Bin 0 -> 2376 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4711 bytes .../twilio/rest/messaging/v1/__init__.py | 151 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6960 bytes .../__pycache__/deactivations.cpython-312.pyc | Bin 0 -> 7558 bytes .../__pycache__/domain_certs.cpython-312.pyc | Bin 0 -> 13551 bytes .../__pycache__/domain_config.cpython-312.pyc | Bin 0 -> 15173 bytes ...n_config_messaging_service.cpython-312.pyc | Bin 0 -> 10194 bytes .../external_campaign.cpython-312.pyc | Bin 0 -> 7041 bytes ...ortening_messaging_service.cpython-312.pyc | Bin 0 -> 11208 bytes ...service_domain_association.cpython-312.pyc | Bin 0 -> 9363 bytes .../request_managed_cert.cpython-312.pyc | Bin 0 -> 9807 bytes .../tollfree_verification.cpython-312.pyc | Bin 0 -> 54658 bytes .../v1/__pycache__/usecase.cpython-312.pyc | Bin 0 -> 3917 bytes .../v1/brand_registration/__init__.py | 673 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 28241 bytes .../brand_registration_otp.cpython-312.pyc | Bin 0 -> 5419 bytes .../__pycache__/brand_vetting.cpython-312.pyc | Bin 0 -> 22954 bytes .../brand_registration_otp.py | 121 + .../v1/brand_registration/brand_vetting.py | 561 ++ .../twilio/rest/messaging/v1/deactivations.py | 199 + .../twilio/rest/messaging/v1/domain_certs.py | 337 ++ .../twilio/rest/messaging/v1/domain_config.py | 339 ++ .../v1/domain_config_messaging_service.py | 222 + .../rest/messaging/v1/external_campaign.py | 143 + .../v1/linkshortening_messaging_service.py | 258 + ...ng_messaging_service_domain_association.py | 217 + .../rest/messaging/v1/request_managed_cert.py | 213 + .../rest/messaging/v1/service/__init__.py | 1115 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 52556 bytes .../__pycache__/alpha_sender.cpython-312.pyc | Bin 0 -> 23809 bytes .../channel_sender.cpython-312.pyc | Bin 0 -> 23899 bytes .../destination_alpha_sender.cpython-312.pyc | Bin 0 -> 26917 bytes .../__pycache__/phone_number.cpython-312.pyc | Bin 0 -> 23873 bytes .../__pycache__/short_code.cpython-312.pyc | Bin 0 -> 23637 bytes .../us_app_to_person.cpython-312.pyc | Bin 0 -> 47506 bytes .../us_app_to_person_usecase.cpython-312.pyc | Bin 0 -> 5777 bytes .../rest/messaging/v1/service/alpha_sender.py | 542 ++ .../messaging/v1/service/channel_sender.py | 556 ++ .../v1/service/destination_alpha_sender.py | 574 +++ .../rest/messaging/v1/service/phone_number.py | 544 ++ .../rest/messaging/v1/service/short_code.py | 542 ++ .../messaging/v1/service/us_app_to_person.py | 866 ++++ .../v1/service/us_app_to_person_usecase.py | 137 + .../messaging/v1/tollfree_verification.py | 1173 +++++ .../twilio/rest/messaging/v1/usecase.py | 94 + .../twilio/rest/messaging/v2/__init__.py | 43 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2074 bytes .../channels_sender.cpython-312.pyc | Bin 0 -> 42672 bytes .../rest/messaging/v2/channels_sender.py | 1104 ++++ .../twilio/rest/microvisor/MicrovisorBase.py | 44 + .../twilio/rest/microvisor/__init__.py | 43 + .../MicrovisorBase.cpython-312.pyc | Bin 0 -> 2023 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2215 bytes .../twilio/rest/microvisor/v1/__init__.py | 67 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3168 bytes .../account_config.cpython-312.pyc | Bin 0 -> 23821 bytes .../account_secret.cpython-312.pyc | Bin 0 -> 23693 bytes .../rest/microvisor/v1/account_config.py | 585 +++ .../rest/microvisor/v1/account_secret.py | 583 +++ .../twilio/rest/microvisor/v1/app/__init__.py | 485 ++ .../app/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 20913 bytes .../__pycache__/app_manifest.cpython-312.pyc | Bin 0 -> 8188 bytes .../rest/microvisor/v1/app/app_manifest.py | 193 + .../rest/microvisor/v1/device/__init__.py | 588 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 25389 bytes .../__pycache__/device_config.cpython-312.pyc | Bin 0 -> 24986 bytes .../__pycache__/device_secret.cpython-312.pyc | Bin 0 -> 24855 bytes .../microvisor/v1/device/device_config.py | 622 +++ .../microvisor/v1/device/device_secret.py | 620 +++ .../twilio/rest/monitor/MonitorBase.py | 44 + .../twilio/rest/monitor/__init__.py | 25 + .../__pycache__/MonitorBase.cpython-312.pyc | Bin 0 -> 1987 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1272 bytes .../twilio/rest/monitor/v1/__init__.py | 51 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2329 bytes .../v1/__pycache__/alert.cpython-312.pyc | Bin 0 -> 27226 bytes .../v1/__pycache__/event.cpython-312.pyc | Bin 0 -> 29614 bytes .../twilio/rest/monitor/v1/alert.py | 501 ++ .../twilio/rest/monitor/v1/event.py | 541 ++ .../twilio/rest/notify/NotifyBase.py | 44 + .../twilio/rest/notify/__init__.py | 25 + .../__pycache__/NotifyBase.cpython-312.pyc | Bin 0 -> 1975 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1344 bytes .../twilio/rest/notify/v1/__init__.py | 51 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2398 bytes .../v1/__pycache__/credential.cpython-312.pyc | Bin 0 -> 31012 bytes .../twilio/rest/notify/v1/credential.py | 711 +++ .../twilio/rest/notify/v1/service/__init__.py | 948 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 44672 bytes .../__pycache__/binding.cpython-312.pyc | Bin 0 -> 33930 bytes .../__pycache__/notification.cpython-312.pyc | Bin 0 -> 24286 bytes .../twilio/rest/notify/v1/service/binding.py | 681 +++ .../rest/notify/v1/service/notification.py | 285 + .../twilio/rest/numbers/NumbersBase.py | 55 + .../twilio/rest/numbers/__init__.py | 15 + .../__pycache__/NumbersBase.cpython-312.pyc | Bin 0 -> 2346 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1001 bytes .../twilio/rest/numbers/v1/__init__.py | 135 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5814 bytes .../bulk_eligibility.cpython-312.pyc | Bin 0 -> 11360 bytes .../__pycache__/eligibility.cpython-312.pyc | Bin 0 -> 5064 bytes .../porting_port_in.cpython-312.pyc | Bin 0 -> 14317 bytes ...rting_port_in_phone_number.cpython-312.pyc | Bin 0 -> 15028 bytes .../porting_portability.cpython-312.pyc | Bin 0 -> 10666 bytes ...ting_webhook_configuration.cpython-312.pyc | Bin 0 -> 5508 bytes ...bhook_configuration_delete.cpython-312.pyc | Bin 0 -> 5410 bytes ...ebhook_configuration_fetch.cpython-312.pyc | Bin 0 -> 5606 bytes ...ning_request_configuration.cpython-312.pyc | Bin 0 -> 18954 bytes .../rest/numbers/v1/bulk_eligibility.py | 257 + .../twilio/rest/numbers/v1/eligibility.py | 108 + .../twilio/rest/numbers/v1/porting_port_in.py | 325 ++ .../v1/porting_port_in_phone_number.py | 310 ++ .../rest/numbers/v1/porting_portability.py | 265 + .../v1/porting_webhook_configuration.py | 116 + .../porting_webhook_configuration_delete.py | 124 + .../v1/porting_webhook_configuration_fetch.py | 109 + .../v1/signing_request_configuration.py | 375 ++ .../twilio/rest/numbers/v2/__init__.py | 75 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3831 bytes .../bulk_hosted_number_order.cpython-312.pyc | Bin 0 -> 12192 bytes .../__pycache__/bundle_clone.cpython-312.pyc | Bin 0 -> 10865 bytes .../hosted_number_order.cpython-312.pyc | Bin 0 -> 42544 bytes .../v2/authorization_document/__init__.py | 629 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 30327 bytes ...endent_hosted_number_order.cpython-312.pyc | Bin 0 -> 22732 bytes .../dependent_hosted_number_order.py | 439 ++ .../numbers/v2/bulk_hosted_number_order.py | 305 ++ .../twilio/rest/numbers/v2/bundle_clone.py | 268 + .../rest/numbers/v2/hosted_number_order.py | 887 ++++ .../v2/regulatory_compliance/__init__.py | 113 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4979 bytes .../__pycache__/end_user.cpython-312.pyc | Bin 0 -> 25446 bytes .../__pycache__/end_user_type.cpython-312.pyc | Bin 0 -> 18679 bytes .../__pycache__/regulation.cpython-312.pyc | Bin 0 -> 24324 bytes .../supporting_document.cpython-312.pyc | Bin 0 -> 27001 bytes .../supporting_document_type.cpython-312.pyc | Bin 0 -> 19280 bytes .../regulatory_compliance/bundle/__init__.py | 1013 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 50874 bytes .../__pycache__/bundle_copy.cpython-312.pyc | Bin 0 -> 16883 bytes .../__pycache__/evaluation.cpython-312.pyc | Bin 0 -> 20723 bytes .../item_assignment.cpython-312.pyc | Bin 0 -> 23249 bytes .../__pycache__/replace_items.cpython-312.pyc | Bin 0 -> 6779 bytes .../bundle/bundle_copy.py | 382 ++ .../bundle/evaluation.py | 487 ++ .../bundle/item_assignment.py | 540 ++ .../bundle/replace_items.py | 163 + .../v2/regulatory_compliance/end_user.py | 638 +++ .../v2/regulatory_compliance/end_user_type.py | 408 ++ .../v2/regulatory_compliance/regulation.py | 525 ++ .../supporting_document.py | 658 +++ .../supporting_document_type.py | 410 ++ .../twilio/rest/oauth/OauthBase.py | 44 + .../twilio/rest/oauth/__init__.py | 16 + .../__pycache__/OauthBase.cpython-312.pyc | Bin 0 -> 1963 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 889 bytes .../twilio/rest/oauth/v1/__init__.py | 51 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2363 bytes .../v1/__pycache__/authorize.cpython-312.pyc | Bin 0 -> 5159 bytes .../v1/__pycache__/token.cpython-312.pyc | Bin 0 -> 7047 bytes .../twilio/rest/oauth/v1/authorize.py | 130 + .../twilio/rest/oauth/v1/token.py | 170 + .../twilio/rest/preview/PreviewBase.py | 66 + .../twilio/rest/preview/__init__.py | 88 + .../__pycache__/PreviewBase.cpython-312.pyc | Bin 0 -> 2951 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4199 bytes .../rest/preview/hosted_numbers/__init__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2651 bytes .../hosted_number_order.cpython-312.pyc | Bin 0 -> 47910 bytes .../authorization_document/__init__.py | 755 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 35540 bytes ...endent_hosted_number_order.cpython-312.pyc | Bin 0 -> 25126 bytes .../dependent_hosted_number_order.py | 477 ++ .../hosted_numbers/hosted_number_order.py | 985 ++++ .../rest/preview/marketplace/__init__.py | 51 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2546 bytes .../marketplace/available_add_on/__init__.py | 438 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 19722 bytes ...available_add_on_extension.cpython-312.pyc | Bin 0 -> 20241 bytes .../available_add_on_extension.py | 445 ++ .../marketplace/installed_add_on/__init__.py | 671 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 28804 bytes ...installed_add_on_extension.cpython-312.pyc | Bin 0 -> 23029 bytes .../installed_add_on_extension.py | 533 ++ .../twilio/rest/preview/wireless/__init__.py | 59 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2826 bytes .../__pycache__/command.cpython-312.pyc | Bin 0 -> 23733 bytes .../__pycache__/rate_plan.cpython-312.pyc | Bin 0 -> 27963 bytes .../twilio/rest/preview/wireless/command.py | 595 +++ .../twilio/rest/preview/wireless/rate_plan.py | 699 +++ .../rest/preview/wireless/sim/__init__.py | 833 +++ .../sim/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 31984 bytes .../sim/__pycache__/usage.cpython-312.pyc | Bin 0 -> 9220 bytes .../twilio/rest/preview/wireless/sim/usage.py | 249 + .../twilio/rest/preview_iam/PreviewIamBase.py | 44 + .../twilio/rest/preview_iam/__init__.py | 26 + .../PreviewIamBase.cpython-312.pyc | Bin 0 -> 2026 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1455 bytes .../twilio/rest/preview_iam/v1/__init__.py | 51 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2477 bytes .../v1/__pycache__/authorize.cpython-312.pyc | Bin 0 -> 5229 bytes .../v1/__pycache__/token.cpython-312.pyc | Bin 0 -> 7098 bytes .../twilio/rest/preview_iam/v1/authorize.py | 130 + .../twilio/rest/preview_iam/v1/token.py | 170 + .../rest/preview_iam/versionless/__init__.py | 43 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2222 bytes .../versionless/organization/__init__.py | 128 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5517 bytes .../__pycache__/account.cpython-312.pyc | Bin 0 -> 18912 bytes .../role_assignment.cpython-312.pyc | Bin 0 -> 24415 bytes .../__pycache__/user.cpython-312.pyc | Bin 0 -> 39824 bytes .../versionless/organization/account.py | 438 ++ .../organization/role_assignment.py | 574 +++ .../versionless/organization/user.py | 1050 ++++ .../twilio/rest/pricing/PricingBase.py | 55 + .../twilio/rest/pricing/__init__.py | 55 + .../__pycache__/PricingBase.cpython-312.pyc | Bin 0 -> 2346 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2554 bytes .../twilio/rest/pricing/v1/__init__.py | 59 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2777 bytes .../rest/pricing/v1/messaging/__init__.py | 54 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2221 bytes .../__pycache__/country.cpython-312.pyc | Bin 0 -> 18820 bytes .../rest/pricing/v1/messaging/country.py | 415 ++ .../rest/pricing/v1/phone_number/__init__.py | 54 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2242 bytes .../__pycache__/country.cpython-312.pyc | Bin 0 -> 18418 bytes .../rest/pricing/v1/phone_number/country.py | 413 ++ .../twilio/rest/pricing/v1/voice/__init__.py | 65 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2629 bytes .../voice/__pycache__/country.cpython-312.pyc | Bin 0 -> 18680 bytes .../voice/__pycache__/number.cpython-312.pyc | Bin 0 -> 8399 bytes .../twilio/rest/pricing/v1/voice/country.py | 417 ++ .../twilio/rest/pricing/v1/voice/number.py | 197 + .../twilio/rest/pricing/v2/__init__.py | 59 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2738 bytes .../v2/__pycache__/country.cpython-312.pyc | Bin 0 -> 18704 bytes .../v2/__pycache__/number.cpython-312.pyc | Bin 0 -> 10558 bytes .../twilio/rest/pricing/v2/country.py | 417 ++ .../twilio/rest/pricing/v2/number.py | 236 + .../twilio/rest/pricing/v2/voice/__init__.py | 65 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2629 bytes .../voice/__pycache__/country.cpython-312.pyc | Bin 0 -> 18693 bytes .../voice/__pycache__/number.cpython-312.pyc | Bin 0 -> 10665 bytes .../twilio/rest/pricing/v2/voice/country.py | 417 ++ .../twilio/rest/pricing/v2/voice/number.py | 234 + .../twilio/rest/proxy/ProxyBase.py | 44 + .../twilio/rest/proxy/__init__.py | 15 + .../__pycache__/ProxyBase.cpython-312.pyc | Bin 0 -> 1963 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 907 bytes .../twilio/rest/proxy/v1/__init__.py | 43 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2002 bytes .../twilio/rest/proxy/v1/service/__init__.py | 844 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37037 bytes .../__pycache__/phone_number.cpython-312.pyc | Bin 0 -> 29491 bytes .../__pycache__/short_code.cpython-312.pyc | Bin 0 -> 27063 bytes .../rest/proxy/v1/service/phone_number.py | 662 +++ .../rest/proxy/v1/service/session/__init__.py | 784 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 32054 bytes .../__pycache__/interaction.cpython-312.pyc | Bin 0 -> 23585 bytes .../proxy/v1/service/session/interaction.py | 571 ++ .../service/session/participant/__init__.py | 634 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27762 bytes .../message_interaction.cpython-312.pyc | Bin 0 -> 26111 bytes .../participant/message_interaction.py | 622 +++ .../rest/proxy/v1/service/short_code.py | 638 +++ .../twilio/rest/routes/RoutesBase.py | 44 + .../twilio/rest/routes/__init__.py | 35 + .../__pycache__/RoutesBase.cpython-312.pyc | Bin 0 -> 1975 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1770 bytes .../twilio/rest/routes/v2/__init__.py | 59 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2785 bytes .../__pycache__/phone_number.cpython-312.pyc | Bin 0 -> 12358 bytes .../v2/__pycache__/sip_domain.cpython-312.pyc | Bin 0 -> 11307 bytes .../v2/__pycache__/trunk.cpython-312.pyc | Bin 0 -> 12124 bytes .../twilio/rest/routes/v2/phone_number.py | 311 ++ .../twilio/rest/routes/v2/sip_domain.py | 311 ++ .../twilio/rest/routes/v2/trunk.py | 311 ++ .../twilio/rest/serverless/ServerlessBase.py | 44 + .../twilio/rest/serverless/__init__.py | 15 + .../ServerlessBase.cpython-312.pyc | Bin 0 -> 2023 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 942 bytes .../twilio/rest/serverless/v1/__init__.py | 43 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2032 bytes .../rest/serverless/v1/service/__init__.py | 742 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 31540 bytes .../serverless/v1/service/asset/__init__.py | 649 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26361 bytes .../__pycache__/asset_version.cpython-312.pyc | Bin 0 -> 20118 bytes .../v1/service/asset/asset_version.py | 468 ++ .../serverless/v1/service/build/__init__.py | 614 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26541 bytes .../__pycache__/build_status.cpython-312.pyc | Bin 0 -> 8755 bytes .../v1/service/build/build_status.py | 221 + .../v1/service/environment/__init__.py | 623 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27076 bytes .../__pycache__/deployment.cpython-312.pyc | Bin 0 -> 23058 bytes .../__pycache__/log.cpython-312.pyc | Bin 0 -> 24034 bytes .../__pycache__/variable.cpython-312.pyc | Bin 0 -> 27683 bytes .../v1/service/environment/deployment.py | 540 ++ .../serverless/v1/service/environment/log.py | 538 ++ .../v1/service/environment/variable.py | 690 +++ .../v1/service/function/__init__.py | 651 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26669 bytes .../function/function_version/__init__.py | 498 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 21444 bytes .../function_version_content.cpython-312.pyc | Bin 0 -> 10029 bytes .../function_version_content.py | 234 + .../twilio/rest/studio/StudioBase.py | 55 + .../twilio/rest/studio/__init__.py | 25 + .../__pycache__/StudioBase.cpython-312.pyc | Bin 0 -> 2331 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1338 bytes .../twilio/rest/studio/v1/__init__.py | 43 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1992 bytes .../twilio/rest/studio/v1/flow/__init__.py | 513 ++ .../flow/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 21215 bytes .../studio/v1/flow/engagement/__init__.py | 612 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26211 bytes .../engagement_context.cpython-312.pyc | Bin 0 -> 9007 bytes .../v1/flow/engagement/engagement_context.py | 219 + .../v1/flow/engagement/step/__init__.py | 496 ++ .../step/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 21842 bytes .../__pycache__/step_context.cpython-312.pyc | Bin 0 -> 9580 bytes .../v1/flow/engagement/step/step_context.py | 236 + .../rest/studio/v1/flow/execution/__init__.py | 740 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 32070 bytes .../execution_context.cpython-312.pyc | Bin 0 -> 9186 bytes .../v1/flow/execution/execution_context.py | 219 + .../flow/execution/execution_step/__init__.py | 498 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 22594 bytes .../execution_step_context.cpython-312.pyc | Bin 0 -> 9919 bytes .../execution_step/execution_step_context.py | 236 + .../twilio/rest/studio/v2/__init__.py | 51 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2394 bytes .../__pycache__/flow_validate.cpython-312.pyc | Bin 0 -> 5432 bytes .../twilio/rest/studio/v2/flow/__init__.py | 746 +++ .../flow/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 28477 bytes .../__pycache__/flow_revision.cpython-312.pyc | Bin 0 -> 19820 bytes .../flow_test_user.cpython-312.pyc | Bin 0 -> 10862 bytes .../rest/studio/v2/flow/execution/__init__.py | 738 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 31991 bytes .../execution_context.cpython-312.pyc | Bin 0 -> 9186 bytes .../v2/flow/execution/execution_context.py | 219 + .../flow/execution/execution_step/__init__.py | 498 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 22465 bytes .../execution_step_context.cpython-312.pyc | Bin 0 -> 9919 bytes .../execution_step/execution_step_context.py | 236 + .../rest/studio/v2/flow/flow_revision.py | 451 ++ .../rest/studio/v2/flow/flow_test_user.py | 267 + .../twilio/rest/studio/v2/flow_validate.py | 143 + .../twilio/rest/supersim/SupersimBase.py | 44 + .../twilio/rest/supersim/__init__.py | 93 + .../__pycache__/SupersimBase.cpython-312.pyc | Bin 0 -> 1999 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4416 bytes .../twilio/rest/supersim/v1/__init__.py | 107 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5150 bytes .../__pycache__/esim_profile.cpython-312.pyc | Bin 0 -> 26947 bytes .../v1/__pycache__/fleet.cpython-312.pyc | Bin 0 -> 34213 bytes .../v1/__pycache__/ip_command.cpython-312.pyc | Bin 0 -> 29177 bytes .../v1/__pycache__/network.cpython-312.pyc | Bin 0 -> 22070 bytes .../settings_update.cpython-312.pyc | Bin 0 -> 16144 bytes .../__pycache__/sms_command.cpython-312.pyc | Bin 0 -> 26923 bytes .../__pycache__/usage_record.cpython-312.pyc | Bin 0 -> 26985 bytes .../twilio/rest/supersim/v1/esim_profile.py | 568 ++ .../twilio/rest/supersim/v1/fleet.py | 727 +++ .../twilio/rest/supersim/v1/ip_command.py | 614 +++ .../twilio/rest/supersim/v1/network.py | 460 ++ .../v1/network_access_profile/__init__.py | 593 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 25943 bytes ...ork_access_profile_network.cpython-312.pyc | Bin 0 -> 24096 bytes .../network_access_profile_network.py | 557 ++ .../rest/supersim/v1/settings_update.py | 337 ++ .../twilio/rest/supersim/v1/sim/__init__.py | 735 +++ .../sim/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 31897 bytes .../billing_period.cpython-312.pyc | Bin 0 -> 14743 bytes .../sim_ip_address.cpython-312.pyc | Bin 0 -> 13979 bytes .../rest/supersim/v1/sim/billing_period.py | 316 ++ .../rest/supersim/v1/sim/sim_ip_address.py | 295 ++ .../twilio/rest/supersim/v1/sms_command.py | 563 ++ .../twilio/rest/supersim/v1/usage_record.py | 458 ++ .../twilio/rest/sync/SyncBase.py | 44 + .../twilio/rest/sync/__init__.py | 15 + .../sync/__pycache__/SyncBase.cpython-312.pyc | Bin 0 -> 1951 bytes .../sync/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 900 bytes .../twilio/rest/sync/v1/__init__.py | 43 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1996 bytes .../twilio/rest/sync/v1/service/__init__.py | 846 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 39377 bytes .../rest/sync/v1/service/document/__init__.py | 723 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 31061 bytes .../document_permission.cpython-312.pyc | Bin 0 -> 26290 bytes .../service/document/document_permission.py | 617 +++ .../sync/v1/service/sync_list/__init__.py | 723 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 30820 bytes .../sync_list_item.cpython-312.pyc | Bin 0 -> 38185 bytes .../sync_list_permission.cpython-312.pyc | Bin 0 -> 26336 bytes .../v1/service/sync_list/sync_list_item.py | 835 +++ .../service/sync_list/sync_list_permission.py | 617 +++ .../rest/sync/v1/service/sync_map/__init__.py | 723 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 30514 bytes .../__pycache__/sync_map_item.cpython-312.pyc | Bin 0 -> 38882 bytes .../sync_map_permission.cpython-312.pyc | Bin 0 -> 26317 bytes .../sync/v1/service/sync_map/sync_map_item.py | 841 +++ .../service/sync_map/sync_map_permission.py | 615 +++ .../sync/v1/service/sync_stream/__init__.py | 671 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 28895 bytes .../stream_message.cpython-312.pyc | Bin 0 -> 6236 bytes .../v1/service/sync_stream/stream_message.py | 146 + .../twilio/rest/taskrouter/TaskrouterBase.py | 44 + .../twilio/rest/taskrouter/__init__.py | 15 + .../TaskrouterBase.cpython-312.pyc | Bin 0 -> 2023 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 954 bytes .../twilio/rest/taskrouter/v1/__init__.py | 43 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2048 bytes .../rest/taskrouter/v1/workspace/__init__.py | 979 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 44559 bytes .../__pycache__/activity.cpython-312.pyc | Bin 0 -> 31061 bytes .../__pycache__/event.cpython-312.pyc | Bin 0 -> 36392 bytes .../__pycache__/task_channel.cpython-312.pyc | Bin 0 -> 28483 bytes ...pace_cumulative_statistics.cpython-312.pyc | Bin 0 -> 17876 bytes ...space_real_time_statistics.cpython-312.pyc | Bin 0 -> 11081 bytes .../workspace_statistics.cpython-312.pyc | Bin 0 -> 13397 bytes .../rest/taskrouter/v1/workspace/activity.py | 686 +++ .../rest/taskrouter/v1/workspace/event.py | 658 +++ .../taskrouter/v1/workspace/task/__init__.py | 1050 ++++ .../task/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 57085 bytes .../__pycache__/reservation.cpython-312.pyc | Bin 0 -> 66836 bytes .../v1/workspace/task/reservation.py | 1351 +++++ .../taskrouter/v1/workspace/task_channel.py | 684 +++ .../v1/workspace/task_queue/__init__.py | 949 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 40289 bytes ..._bulk_real_time_statistics.cpython-312.pyc | Bin 0 -> 7303 bytes ...ueue_cumulative_statistics.cpython-312.pyc | Bin 0 -> 18385 bytes ...queue_real_time_statistics.cpython-312.pyc | Bin 0 -> 12881 bytes .../task_queue_statistics.cpython-312.pyc | Bin 0 -> 13542 bytes .../task_queues_statistics.cpython-312.pyc | Bin 0 -> 24013 bytes .../task_queue_bulk_real_time_statistics.py | 141 + .../task_queue_cumulative_statistics.py | 376 ++ .../task_queue_real_time_statistics.py | 291 ++ .../task_queue/task_queue_statistics.py | 306 ++ .../task_queue/task_queues_statistics.py | 409 ++ .../v1/workspace/worker/__init__.py | 1009 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 46806 bytes .../__pycache__/reservation.cpython-312.pyc | Bin 0 -> 64937 bytes .../worker_channel.cpython-312.pyc | Bin 0 -> 26078 bytes .../worker_statistics.cpython-312.pyc | Bin 0 -> 12502 bytes ...kers_cumulative_statistics.cpython-312.pyc | Bin 0 -> 14287 bytes ...rkers_real_time_statistics.cpython-312.pyc | Bin 0 -> 10011 bytes .../workers_statistics.cpython-312.pyc | Bin 0 -> 13619 bytes .../v1/workspace/worker/reservation.py | 1294 +++++ .../v1/workspace/worker/worker_channel.py | 594 +++ .../v1/workspace/worker/worker_statistics.py | 292 ++ .../worker/workers_cumulative_statistics.py | 308 ++ .../worker/workers_real_time_statistics.py | 239 + .../v1/workspace/worker/workers_statistics.py | 308 ++ .../v1/workspace/workflow/__init__.py | 837 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 36792 bytes ...flow_cumulative_statistics.cpython-312.pyc | Bin 0 -> 18722 bytes ...kflow_real_time_statistics.cpython-312.pyc | Bin 0 -> 11520 bytes .../workflow_statistics.cpython-312.pyc | Bin 0 -> 14239 bytes .../workflow_cumulative_statistics.py | 376 ++ .../workflow/workflow_real_time_statistics.py | 271 + .../workspace/workflow/workflow_statistics.py | 306 ++ .../workspace_cumulative_statistics.py | 356 ++ .../workspace_real_time_statistics.py | 259 + .../v1/workspace/workspace_statistics.py | 282 + .../twilio/rest/trunking/TrunkingBase.py | 44 + .../twilio/rest/trunking/__init__.py | 15 + .../__pycache__/TrunkingBase.cpython-312.pyc | Bin 0 -> 1999 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 914 bytes .../twilio/rest/trunking/v1/__init__.py | 43 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2009 bytes .../twilio/rest/trunking/v1/trunk/__init__.py | 887 ++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 39207 bytes .../credential_list.cpython-312.pyc | Bin 0 -> 23809 bytes .../ip_access_control_list.cpython-312.pyc | Bin 0 -> 24096 bytes .../origination_url.cpython-312.pyc | Bin 0 -> 31868 bytes .../__pycache__/phone_number.cpython-312.pyc | Bin 0 -> 24579 bytes .../__pycache__/recording.cpython-312.pyc | Bin 0 -> 11336 bytes .../rest/trunking/v1/trunk/credential_list.py | 538 ++ .../v1/trunk/ip_access_control_list.py | 542 ++ .../rest/trunking/v1/trunk/origination_url.py | 722 +++ .../rest/trunking/v1/trunk/phone_number.py | 589 +++ .../rest/trunking/v1/trunk/recording.py | 305 ++ .../twilio/rest/trusthub/TrusthubBase.py | 44 + .../twilio/rest/trusthub/__init__.py | 75 + .../__pycache__/TrusthubBase.cpython-312.pyc | Bin 0 -> 1999 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3695 bytes .../twilio/rest/trusthub/v1/__init__.py | 125 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5989 bytes .../compliance_inquiries.cpython-312.pyc | Bin 0 -> 13095 bytes ...nce_registration_inquiries.cpython-312.pyc | Bin 0 -> 28148 bytes ...pliance_tollfree_inquiries.cpython-312.pyc | Bin 0 -> 15640 bytes .../v1/__pycache__/end_user.cpython-312.pyc | Bin 0 -> 26222 bytes .../__pycache__/end_user_type.cpython-312.pyc | Bin 0 -> 18620 bytes .../v1/__pycache__/policies.cpython-312.pyc | Bin 0 -> 18056 bytes .../supporting_document.cpython-312.pyc | Bin 0 -> 26736 bytes .../supporting_document_type.cpython-312.pyc | Bin 0 -> 19217 bytes .../rest/trusthub/v1/compliance_inquiries.py | 304 ++ .../v1/compliance_registration_inquiries.py | 579 +++ .../v1/compliance_tollfree_inquiries.py | 274 + .../trusthub/v1/customer_profiles/__init__.py | 833 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 33910 bytes ...hannel_endpoint_assignment.cpython-312.pyc | Bin 0 -> 27430 bytes ...rofiles_entity_assignments.cpython-312.pyc | Bin 0 -> 26496 bytes ...tomer_profiles_evaluations.cpython-312.pyc | Bin 0 -> 22400 bytes ...er_profiles_channel_endpoint_assignment.py | 616 +++ .../customer_profiles_entity_assignments.py | 590 +++ .../customer_profiles_evaluations.py | 523 ++ .../twilio/rest/trusthub/v1/end_user.py | 633 +++ .../twilio/rest/trusthub/v1/end_user_type.py | 408 ++ .../twilio/rest/trusthub/v1/policies.py | 406 ++ .../rest/trusthub/v1/supporting_document.py | 652 +++ .../trusthub/v1/supporting_document_type.py | 408 ++ .../trusthub/v1/trust_products/__init__.py | 823 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 33491 bytes ...hannel_endpoint_assignment.cpython-312.pyc | Bin 0 -> 27196 bytes ...roducts_entity_assignments.cpython-312.pyc | Bin 0 -> 26250 bytes ...trust_products_evaluations.cpython-312.pyc | Bin 0 -> 22178 bytes ...st_products_channel_endpoint_assignment.py | 616 +++ .../trust_products_entity_assignments.py | 584 +++ .../trust_products_evaluations.py | 517 ++ .../twilio/rest/verify/VerifyBase.py | 44 + .../twilio/rest/verify/__init__.py | 67 + .../__pycache__/VerifyBase.cpython-312.pyc | Bin 0 -> 1975 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3132 bytes .../twilio/rest/verify/v2/__init__.py | 87 + .../v2/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4035 bytes .../v2/__pycache__/form.cpython-312.pyc | Bin 0 -> 7890 bytes .../v2/__pycache__/safelist.cpython-312.pyc | Bin 0 -> 11450 bytes .../v2/__pycache__/template.cpython-312.pyc | Bin 0 -> 14482 bytes .../verification_attempt.cpython-312.pyc | Bin 0 -> 32280 bytes ...ification_attempts_summary.cpython-312.pyc | Bin 0 -> 12193 bytes .../twilio/rest/verify/v2/form.py | 198 + .../twilio/rest/verify/v2/safelist.py | 290 ++ .../twilio/rest/verify/v2/service/__init__.py | 1157 +++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 59394 bytes .../__pycache__/access_token.cpython-312.pyc | Bin 0 -> 12483 bytes .../messaging_configuration.cpython-312.pyc | Bin 0 -> 28122 bytes .../__pycache__/verification.cpython-312.pyc | Bin 0 -> 25448 bytes .../verification_check.cpython-312.pyc | Bin 0 -> 9477 bytes .../__pycache__/webhook.cpython-312.pyc | Bin 0 -> 29660 bytes .../rest/verify/v2/service/access_token.py | 315 ++ .../rest/verify/v2/service/entity/__init__.py | 609 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26379 bytes .../entity/__pycache__/factor.cpython-312.pyc | Bin 0 -> 30218 bytes .../__pycache__/new_factor.cpython-312.pyc | Bin 0 -> 15592 bytes .../v2/service/entity/challenge/__init__.py | 810 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 36751 bytes .../__pycache__/notification.cpython-312.pyc | Bin 0 -> 8521 bytes .../service/entity/challenge/notification.py | 173 + .../rest/verify/v2/service/entity/factor.py | 728 +++ .../verify/v2/service/entity/new_factor.py | 282 + .../v2/service/messaging_configuration.py | 640 +++ .../verify/v2/service/rate_limit/__init__.py | 667 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27535 bytes .../__pycache__/bucket.cpython-312.pyc | Bin 0 -> 27487 bytes .../verify/v2/service/rate_limit/bucket.py | 692 +++ .../rest/verify/v2/service/verification.py | 517 ++ .../verify/v2/service/verification_check.py | 202 + .../twilio/rest/verify/v2/service/webhook.py | 739 +++ .../twilio/rest/verify/v2/template.py | 301 ++ .../rest/verify/v2/verification_attempt.py | 602 +++ .../v2/verification_attempts_summary.py | 296 ++ .../twilio/rest/video/VideoBase.py | 44 + .../twilio/rest/video/__init__.py | 65 + .../__pycache__/VideoBase.cpython-312.pyc | Bin 0 -> 1963 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3163 bytes .../twilio/rest/video/v1/__init__.py | 83 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4045 bytes .../__pycache__/composition.cpython-312.pyc | Bin 0 -> 37003 bytes .../composition_hook.cpython-312.pyc | Bin 0 -> 50505 bytes .../composition_settings.cpython-312.pyc | Bin 0 -> 13827 bytes .../v1/__pycache__/recording.cpython-312.pyc | Bin 0 -> 30423 bytes .../recording_settings.cpython-312.pyc | Bin 0 -> 13701 bytes .../twilio/rest/video/v1/composition.py | 695 +++ .../twilio/rest/video/v1/composition_hook.py | 882 ++++ .../rest/video/v1/composition_settings.py | 318 ++ .../twilio/rest/video/v1/recording.py | 621 +++ .../rest/video/v1/recording_settings.py | 318 ++ .../twilio/rest/video/v1/room/__init__.py | 867 ++++ .../room/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 41448 bytes .../recording_rules.cpython-312.pyc | Bin 0 -> 7763 bytes .../room_recording.cpython-312.pyc | Bin 0 -> 28000 bytes .../video/v1/room/participant/__init__.py | 717 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 32436 bytes .../__pycache__/anonymize.cpython-312.pyc | Bin 0 -> 9577 bytes .../published_track.cpython-312.pyc | Bin 0 -> 20362 bytes .../subscribe_rules.cpython-312.pyc | Bin 0 -> 8774 bytes .../subscribed_track.cpython-312.pyc | Bin 0 -> 20490 bytes .../video/v1/room/participant/anonymize.py | 245 + .../v1/room/participant/published_track.py | 472 ++ .../v1/room/participant/subscribe_rules.py | 205 + .../v1/room/participant/subscribed_track.py | 474 ++ .../rest/video/v1/room/recording_rules.py | 178 + .../rest/video/v1/room/room_recording.py | 602 +++ .../twilio/rest/voice/VoiceBase.py | 44 + .../twilio/rest/voice/__init__.py | 65 + .../__pycache__/VoiceBase.cpython-312.pyc | Bin 0 -> 1963 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3175 bytes .../twilio/rest/voice/v1/__init__.py | 83 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4092 bytes .../__pycache__/archived_call.cpython-312.pyc | Bin 0 -> 5120 bytes .../v1/__pycache__/byoc_trunk.cpython-312.pyc | Bin 0 -> 38037 bytes .../v1/__pycache__/ip_record.cpython-312.pyc | Bin 0 -> 26121 bytes .../source_ip_mapping.cpython-312.pyc | Bin 0 -> 25035 bytes .../twilio/rest/voice/v1/archived_call.py | 113 + .../twilio/rest/voice/v1/byoc_trunk.py | 787 +++ .../voice/v1/connection_policy/__init__.py | 629 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26340 bytes .../connection_policy_target.cpython-312.pyc | Bin 0 -> 33046 bytes .../connection_policy_target.py | 736 +++ .../voice/v1/dialing_permissions/__init__.py | 78 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3330 bytes .../bulk_country_update.cpython-312.pyc | Bin 0 -> 5407 bytes .../__pycache__/settings.cpython-312.pyc | Bin 0 -> 9189 bytes .../bulk_country_update.py | 118 + .../dialing_permissions/country/__init__.py | 570 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 30017 bytes .../highrisk_special_prefix.cpython-312.pyc | Bin 0 -> 14477 bytes .../country/highrisk_special_prefix.py | 290 ++ .../voice/v1/dialing_permissions/settings.py | 262 + .../twilio/rest/voice/v1/ip_record.py | 619 +++ .../twilio/rest/voice/v1/source_ip_mapping.py | 599 +++ .../twilio/rest/wireless/WirelessBase.py | 44 + .../twilio/rest/wireless/__init__.py | 43 + .../__pycache__/WirelessBase.cpython-312.pyc | Bin 0 -> 1999 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2190 bytes .../twilio/rest/wireless/v1/__init__.py | 67 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3157 bytes .../v1/__pycache__/command.cpython-312.pyc | Bin 0 -> 31555 bytes .../v1/__pycache__/rate_plan.cpython-312.pyc | Bin 0 -> 32958 bytes .../__pycache__/usage_record.cpython-312.pyc | Bin 0 -> 18079 bytes .../twilio/rest/wireless/v1/command.py | 669 +++ .../twilio/rest/wireless/v1/rate_plan.py | 728 +++ .../twilio/rest/wireless/v1/sim/__init__.py | 942 ++++ .../sim/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 42613 bytes .../__pycache__/data_session.cpython-312.pyc | Bin 0 -> 17860 bytes .../__pycache__/usage_record.cpython-312.pyc | Bin 0 -> 19908 bytes .../rest/wireless/v1/sim/data_session.py | 327 ++ .../rest/wireless/v1/sim/usage_record.py | 353 ++ .../twilio/rest/wireless/v1/usage_record.py | 340 ++ .../site-packages/twilio/twiml/__init__.py | 140 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6106 bytes .../__pycache__/fax_response.cpython-312.pyc | Bin 0 -> 2117 bytes .../messaging_response.cpython-312.pyc | Bin 0 -> 4786 bytes .../voice_response.cpython-312.pyc | Bin 0 -> 82907 bytes .../twilio/twiml/fax_response.py | 59 + .../twilio/twiml/messaging_response.py | 125 + .../twilio/twiml/voice_response.py | 3065 +++++++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 182 -> 182 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 17786 -> 17786 bytes .../typing_objects.cpython-312.pyc | Bin 17152 -> 17152 bytes .../urllib3-2.5.0.dist-info/INSTALLER | 1 + .../urllib3-2.5.0.dist-info/METADATA | 154 + .../urllib3-2.5.0.dist-info/RECORD | 79 + .../urllib3-2.5.0.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 21 + venv/Lib/site-packages/urllib3/__init__.py | 211 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7297 bytes .../_base_connection.cpython-312.pyc | Bin 0 -> 6835 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 22556 bytes .../_request_methods.cpython-312.pyc | Bin 0 -> 10589 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 633 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 38400 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 39722 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 16598 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 12009 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 3476 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 24390 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 52700 bytes .../site-packages/urllib3/_base_connection.py | 165 + .../Lib/site-packages/urllib3/_collections.py | 479 ++ .../site-packages/urllib3/_request_methods.py | 278 + venv/Lib/site-packages/urllib3/_version.py | 21 + venv/Lib/site-packages/urllib3/connection.py | 1093 ++++ .../site-packages/urllib3/connectionpool.py | 1178 +++++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 180 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 28203 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 8158 bytes .../urllib3/contrib/emscripten/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 888 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 10229 bytes .../__pycache__/fetch.cpython-312.pyc | Bin 0 -> 28619 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 1408 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 12202 bytes .../urllib3/contrib/emscripten/connection.py | 255 + .../emscripten/emscripten_fetch_worker.js | 110 + .../urllib3/contrib/emscripten/fetch.py | 728 +++ .../urllib3/contrib/emscripten/request.py | 22 + .../urllib3/contrib/emscripten/response.py | 277 + .../urllib3/contrib/pyopenssl.py | 564 ++ .../site-packages/urllib3/contrib/socks.py | 228 + venv/Lib/site-packages/urllib3/exceptions.py | 335 ++ venv/Lib/site-packages/urllib3/fields.py | 341 ++ venv/Lib/site-packages/urllib3/filepost.py | 89 + .../site-packages/urllib3/http2/__init__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1733 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 17040 bytes .../http2/__pycache__/probe.cpython-312.pyc | Bin 0 -> 3684 bytes .../site-packages/urllib3/http2/connection.py | 356 ++ venv/Lib/site-packages/urllib3/http2/probe.py | 87 + venv/Lib/site-packages/urllib3/poolmanager.py | 653 +++ venv/Lib/site-packages/urllib3/py.typed | 2 + venv/Lib/site-packages/urllib3/response.py | 1307 +++++ .../site-packages/urllib3/util/__init__.py | 42 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 993 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4683 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1205 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 8305 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 2861 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 20274 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 17157 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5545 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 13312 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11677 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 16214 bytes .../util/__pycache__/util.cpython-312.pyc | Bin 0 -> 1982 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 3428 bytes .../site-packages/urllib3/util/connection.py | 137 + venv/Lib/site-packages/urllib3/util/proxy.py | 43 + .../Lib/site-packages/urllib3/util/request.py | 266 + .../site-packages/urllib3/util/response.py | 101 + venv/Lib/site-packages/urllib3/util/retry.py | 533 ++ venv/Lib/site-packages/urllib3/util/ssl_.py | 524 ++ .../urllib3/util/ssl_match_hostname.py | 159 + .../urllib3/util/ssltransport.py | 271 + .../Lib/site-packages/urllib3/util/timeout.py | 275 + venv/Lib/site-packages/urllib3/util/url.py | 469 ++ venv/Lib/site-packages/urllib3/util/util.py | 42 + venv/Lib/site-packages/urllib3/util/wait.py | 124 + .../uvicorn-0.35.0.dist-info/INSTALLER | 1 + .../uvicorn-0.35.0.dist-info/METADATA | 186 + .../uvicorn-0.35.0.dist-info/RECORD | 87 + .../uvicorn-0.35.0.dist-info/REQUESTED | 0 .../uvicorn-0.35.0.dist-info/WHEEL | 4 + .../uvicorn-0.35.0.dist-info/entry_points.txt | 2 + .../licenses/LICENSE.md | 27 + venv/Lib/site-packages/uvicorn/__init__.py | 5 + venv/Lib/site-packages/uvicorn/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 370 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 290 bytes .../__pycache__/_subprocess.cpython-312.pyc | Bin 0 -> 2924 bytes .../__pycache__/_types.cpython-312.pyc | Bin 0 -> 11335 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 24839 bytes .../__pycache__/importer.cpython-312.pyc | Bin 0 -> 1768 bytes .../__pycache__/logging.cpython-312.pyc | Bin 0 -> 7794 bytes .../uvicorn/__pycache__/main.cpython-312.pyc | Bin 0 -> 20459 bytes .../__pycache__/server.cpython-312.pyc | Bin 0 -> 16645 bytes .../__pycache__/workers.cpython-312.pyc | Bin 0 -> 6712 bytes venv/Lib/site-packages/uvicorn/_subprocess.py | 84 + venv/Lib/site-packages/uvicorn/_types.py | 281 + venv/Lib/site-packages/uvicorn/config.py | 531 ++ venv/Lib/site-packages/uvicorn/importer.py | 34 + .../uvicorn/lifespan/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 181 bytes .../lifespan/__pycache__/off.cpython-312.pyc | Bin 0 -> 970 bytes .../lifespan/__pycache__/on.cpython-312.pyc | Bin 0 -> 7945 bytes .../Lib/site-packages/uvicorn/lifespan/off.py | 17 + venv/Lib/site-packages/uvicorn/lifespan/on.py | 137 + venv/Lib/site-packages/uvicorn/logging.py | 117 + .../site-packages/uvicorn/loops/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 178 bytes .../loops/__pycache__/asyncio.cpython-312.pyc | Bin 0 -> 741 bytes .../loops/__pycache__/auto.cpython-312.pyc | Bin 0 -> 645 bytes .../loops/__pycache__/uvloop.cpython-312.pyc | Bin 0 -> 531 bytes .../site-packages/uvicorn/loops/asyncio.py | 10 + venv/Lib/site-packages/uvicorn/loops/auto.py | 11 + .../Lib/site-packages/uvicorn/loops/uvloop.py | 7 + venv/Lib/site-packages/uvicorn/main.py | 604 +++ .../uvicorn/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 183 bytes .../__pycache__/asgi2.cpython-312.pyc | Bin 0 -> 993 bytes .../message_logger.cpython-312.pyc | Bin 0 -> 4389 bytes .../__pycache__/proxy_headers.cpython-312.pyc | Bin 0 -> 5804 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 9933 bytes .../site-packages/uvicorn/middleware/asgi2.py | 15 + .../uvicorn/middleware/message_logger.py | 87 + .../uvicorn/middleware/proxy_headers.py | 142 + .../site-packages/uvicorn/middleware/wsgi.py | 199 + .../uvicorn/protocols/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 182 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 2949 bytes .../uvicorn/protocols/http/__init__.py | 0 .../http/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 187 bytes .../http/__pycache__/auto.cpython-312.pyc | Bin 0 -> 598 bytes .../__pycache__/flow_control.cpython-312.pyc | Bin 0 -> 3028 bytes .../http/__pycache__/h11_impl.cpython-312.pyc | Bin 0 -> 27013 bytes .../httptools_impl.cpython-312.pyc | Bin 0 -> 29030 bytes .../uvicorn/protocols/http/auto.py | 15 + .../uvicorn/protocols/http/flow_control.py | 54 + .../uvicorn/protocols/http/h11_impl.py | 543 ++ .../uvicorn/protocols/http/httptools_impl.py | 570 ++ .../site-packages/uvicorn/protocols/utils.py | 56 + .../uvicorn/protocols/websockets/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 193 bytes .../__pycache__/auto.cpython-312.pyc | Bin 0 -> 793 bytes .../websockets_impl.cpython-312.pyc | Bin 0 -> 20523 bytes .../websockets_sansio_impl.cpython-312.pyc | Bin 0 -> 24573 bytes .../__pycache__/wsproto_impl.cpython-312.pyc | Bin 0 -> 21069 bytes .../uvicorn/protocols/websockets/auto.py | 21 + .../protocols/websockets/websockets_impl.py | 387 ++ .../websockets/websockets_sansio_impl.py | 417 ++ .../protocols/websockets/wsproto_impl.py | 377 ++ venv/Lib/site-packages/uvicorn/py.typed | 1 + venv/Lib/site-packages/uvicorn/server.py | 338 ++ .../uvicorn/supervisors/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 747 bytes .../__pycache__/basereload.cpython-312.pyc | Bin 0 -> 7055 bytes .../__pycache__/multiprocess.cpython-312.pyc | Bin 0 -> 13352 bytes .../__pycache__/statreload.cpython-312.pyc | Bin 0 -> 2849 bytes .../watchfilesreload.cpython-312.pyc | Bin 0 -> 4232 bytes .../uvicorn/supervisors/basereload.py | 126 + .../uvicorn/supervisors/multiprocess.py | 222 + .../uvicorn/supervisors/statreload.py | 53 + .../uvicorn/supervisors/watchfilesreload.py | 85 + venv/Lib/site-packages/uvicorn/workers.py | 114 + .../__pycache__/__init__.cpython-312.pyc | Bin 534 -> 534 bytes .../__pycache__/filters.cpython-312.pyc | Bin 7201 -> 7201 bytes .../__pycache__/main.cpython-312.pyc | Bin 17131 -> 17131 bytes .../__pycache__/run.cpython-312.pyc | Bin 19490 -> 19490 bytes .../__pycache__/version.cpython-312.pyc | Bin 268 -> 268 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4476 -> 4476 bytes .../__pycache__/client.cpython-312.pyc | Bin 16143 -> 16143 bytes .../datastructures.cpython-312.pyc | Bin 8888 -> 8888 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 17921 -> 17921 bytes .../__pycache__/frames.cpython-312.pyc | Bin 16007 -> 16007 bytes .../__pycache__/headers.cpython-312.pyc | Bin 18133 -> 18133 bytes .../__pycache__/http11.cpython-312.pyc | Bin 15475 -> 15475 bytes .../__pycache__/imports.cpython-312.pyc | Bin 3399 -> 3399 bytes .../__pycache__/protocol.cpython-312.pyc | Bin 25386 -> 25386 bytes .../__pycache__/server.cpython-312.pyc | Bin 23049 -> 23049 bytes .../__pycache__/streams.cpython-312.pyc | Bin 5438 -> 5438 bytes .../__pycache__/typing.cpython-312.pyc | Bin 1245 -> 1245 bytes .../__pycache__/uri.cpython-312.pyc | Bin 8116 -> 8116 bytes .../__pycache__/utils.cpython-312.pyc | Bin 2221 -> 2221 bytes .../__pycache__/version.cpython-312.pyc | Bin 2968 -> 2968 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 183 -> 183 bytes .../__pycache__/client.cpython-312.pyc | Bin 33740 -> 33740 bytes .../__pycache__/compatibility.cpython-312.pyc | Bin 1059 -> 1059 bytes .../__pycache__/connection.cpython-312.pyc | Bin 52265 -> 52265 bytes .../__pycache__/messages.cpython-312.pyc | Bin 13574 -> 13574 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 298 -> 298 bytes .../__pycache__/base.cpython-312.pyc | Bin 3912 -> 3912 bytes .../permessage_deflate.cpython-312.pyc | Bin 19426 -> 19426 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 468 -> 468 bytes .../legacy/__pycache__/client.cpython-312.pyc | Bin 27887 -> 27887 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 3316 -> 3316 bytes .../__pycache__/framing.cpython-312.pyc | Bin 8185 -> 8185 bytes .../__pycache__/handshake.cpython-312.pyc | Bin 6302 -> 6302 bytes .../legacy/__pycache__/http.cpython-312.pyc | Bin 7690 -> 7690 bytes .../__pycache__/protocol.cpython-312.pyc | Bin 64113 -> 64113 bytes .../legacy/__pycache__/server.cpython-312.pyc | Bin 46706 -> 46706 bytes .../sync/__pycache__/__init__.cpython-312.pyc | Bin 180 -> 180 bytes .../sync/__pycache__/client.cpython-312.pyc | Bin 24613 -> 24613 bytes .../__pycache__/connection.cpython-312.pyc | Bin 40025 -> 40025 bytes .../sync/__pycache__/messages.cpython-312.pyc | Bin 13543 -> 13543 bytes .../sync/__pycache__/utils.cpython-312.pyc | Bin 1649 -> 1649 bytes .../yarl/__pycache__/__init__.cpython-312.pyc | Bin 449 -> 449 bytes .../yarl/__pycache__/_parse.cpython-312.pyc | Bin 6946 -> 6946 bytes .../yarl/__pycache__/_path.cpython-312.pyc | Bin 1403 -> 1403 bytes .../yarl/__pycache__/_query.cpython-312.pyc | Bin 4770 -> 4770 bytes .../yarl/__pycache__/_quoters.cpython-312.pyc | Bin 1984 -> 1984 bytes .../yarl/__pycache__/_quoting.cpython-312.pyc | Bin 743 -> 743 bytes .../yarl/__pycache__/_url.cpython-312.pyc | Bin 60556 -> 60556 bytes venv/Scripts/fastapi.exe | Bin 0 -> 108404 bytes venv/Scripts/normalizer.exe | Bin 0 -> 108420 bytes venv/Scripts/uvicorn.exe | Bin 0 -> 108405 bytes 4100 files changed, 353778 insertions(+), 20272 deletions(-) create mode 100644 __pycache__/twilio_stream.cpython-312.pyc create mode 100644 call_twilio.py create mode 100644 twilio_stream.py create mode 100644 venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/AUTHORS rename venv/Lib/site-packages/{deepgram_sdk-4.2.0.dist-info => aiohttp_retry-2.9.1.dist-info}/INSTALLER (100%) create mode 100644 venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/aiohttp_retry/__init__.py create mode 100644 venv/Lib/site-packages/aiohttp_retry/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/aiohttp_retry/__pycache__/client.cpython-312.pyc create mode 100644 venv/Lib/site-packages/aiohttp_retry/__pycache__/retry_options.cpython-312.pyc create mode 100644 venv/Lib/site-packages/aiohttp_retry/__pycache__/types.cpython-312.pyc create mode 100644 venv/Lib/site-packages/aiohttp_retry/client.py rename venv/Lib/site-packages/{deepgram_sdk-4.2.0.dist-info/REQUESTED => aiohttp_retry/py.typed} (100%) create mode 100644 venv/Lib/site-packages/aiohttp_retry/retry_options.py create mode 100644 venv/Lib/site-packages/aiohttp_retry/types.py create mode 100644 venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/METADATA create mode 100644 venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/RECORD create mode 100644 venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/licenses/LICENSE create mode 100644 venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/charset_normalizer/__init__.py create mode 100644 venv/Lib/site-packages/charset_normalizer/__main__.py create mode 100644 venv/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/api.py create mode 100644 venv/Lib/site-packages/charset_normalizer/cd.py create mode 100644 venv/Lib/site-packages/charset_normalizer/cli/__init__.py create mode 100644 venv/Lib/site-packages/charset_normalizer/cli/__main__.py create mode 100644 venv/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/charset_normalizer/constant.py create mode 100644 venv/Lib/site-packages/charset_normalizer/legacy.py create mode 100644 venv/Lib/site-packages/charset_normalizer/md.cp312-win_amd64.pyd create mode 100644 venv/Lib/site-packages/charset_normalizer/md.py create mode 100644 venv/Lib/site-packages/charset_normalizer/md__mypyc.cp312-win_amd64.pyd create mode 100644 venv/Lib/site-packages/charset_normalizer/models.py create mode 100644 venv/Lib/site-packages/charset_normalizer/py.typed create mode 100644 venv/Lib/site-packages/charset_normalizer/utils.py create mode 100644 venv/Lib/site-packages/charset_normalizer/version.py create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/_constants.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/_enums.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/_types.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/_utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/_version.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/billing.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/__pycache__/client.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/extra.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/invitations.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/keys.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/members.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/__pycache__/options.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/projects.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/scopes.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/transcription.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/__pycache__/usage.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram/_constants.py create mode 100644 venv/Lib/site-packages/deepgram/_enums.py create mode 100644 venv/Lib/site-packages/deepgram/_types.py create mode 100644 venv/Lib/site-packages/deepgram/_utils.py create mode 100644 venv/Lib/site-packages/deepgram/_version.py delete mode 100644 venv/Lib/site-packages/deepgram/audio/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/audio/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/audio/microphone/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/constants.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/errors.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/microphone.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/audio/microphone/constants.py delete mode 100644 venv/Lib/site-packages/deepgram/audio/microphone/errors.py delete mode 100644 venv/Lib/site-packages/deepgram/audio/microphone/microphone.py delete mode 100644 venv/Lib/site-packages/deepgram/audio/speaker/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/constants.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/errors.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/speaker.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/audio/speaker/constants.py delete mode 100644 venv/Lib/site-packages/deepgram/audio/speaker/errors.py delete mode 100644 venv/Lib/site-packages/deepgram/audio/speaker/speaker.py create mode 100644 venv/Lib/site-packages/deepgram/billing.py delete mode 100644 venv/Lib/site-packages/deepgram/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/__pycache__/agent_router.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/__pycache__/errors.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/__pycache__/listen_router.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/__pycache__/read_router.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/__pycache__/speak_router.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/__pycache__/enums.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/enums.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/__pycache__/async_client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/__pycache__/options.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/__pycache__/response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/async_client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/options.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/agent_router.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/async_client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/helpers.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/options.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/async_client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/helpers.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/options.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/analyze/v1/response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/v1/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/v1/__pycache__/async_client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/v1/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/v1/__pycache__/response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/v1/async_client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/v1/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/auth/v1/response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/abstract_async_rest.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/abstract_async_websocket.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/abstract_sync_rest.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/abstract_sync_websocket.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/enums.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/errors.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/helpers.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/options.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/rest_response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/shared_response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/websocket_events.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/websocket_response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/abstract_async_rest.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/abstract_async_websocket.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/abstract_sync_rest.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/abstract_sync_websocket.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/enums.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/errors.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/helpers.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/options.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/rest_response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/shared_response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/websocket_events.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/common/v1/websocket_response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/errors.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/__pycache__/enums.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/enums.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/async_client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/helpers.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/options.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/async_client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/helpers.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/options.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/rest/response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/async_client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/options.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/async_client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/options.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/listen_router.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/live/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/live/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/live/v1/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/live/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/live/v1/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/live/v1/__pycache__/enums.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/live/v1/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/live/v1/enums.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/v1/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/async_client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/options.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/v1/async_client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/v1/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/v1/options.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/manage/v1/response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/prerecorded/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/prerecorded/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/prerecorded/v1/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/prerecorded/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/prerecorded/v1/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/prerecorded/v1/__pycache__/errors.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/prerecorded/v1/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/prerecorded/v1/errors.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/read_router.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/selfhosted/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/selfhosted/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/selfhosted/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/selfhosted/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/selfhosted/v1/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/selfhosted/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/selfhosted/v1/__pycache__/async_client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/selfhosted/v1/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/selfhosted/v1/async_client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/selfhosted/v1/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/__pycache__/enums.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/enums.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/async_client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/helpers.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/options.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/async_client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/helpers.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/options.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/rest/response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/async_client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/client.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/options.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/response.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/async_client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/client.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/options.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/response.py delete mode 100644 venv/Lib/site-packages/deepgram/clients/speak_router.py create mode 100644 venv/Lib/site-packages/deepgram/extra.py create mode 100644 venv/Lib/site-packages/deepgram/invitations.py create mode 100644 venv/Lib/site-packages/deepgram/keys.py create mode 100644 venv/Lib/site-packages/deepgram/members.py delete mode 100644 venv/Lib/site-packages/deepgram/options.py create mode 100644 venv/Lib/site-packages/deepgram/projects.py create mode 100644 venv/Lib/site-packages/deepgram/scopes.py create mode 100644 venv/Lib/site-packages/deepgram/transcription.py create mode 100644 venv/Lib/site-packages/deepgram/usage.py delete mode 100644 venv/Lib/site-packages/deepgram/utils/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/deepgram/utils/verboselogs/__init__.py delete mode 100644 venv/Lib/site-packages/deepgram/utils/verboselogs/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/INSTALLER rename venv/Lib/site-packages/{deepgram_sdk-4.2.0.dist-info/licenses => deepgram_sdk-2.12.0.dist-info}/LICENSE (100%) create mode 100644 venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/WHEEL rename venv/Lib/site-packages/{deepgram_sdk-4.2.0.dist-info => deepgram_sdk-2.12.0.dist-info}/top_level.txt (100%) delete mode 100644 venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/fastapi-0.115.14.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/fastapi-0.115.14.dist-info/METADATA create mode 100644 venv/Lib/site-packages/fastapi-0.115.14.dist-info/RECORD create mode 100644 venv/Lib/site-packages/fastapi-0.115.14.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/fastapi-0.115.14.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/fastapi-0.115.14.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/fastapi-0.115.14.dist-info/licenses/LICENSE create mode 100644 venv/Lib/site-packages/fastapi/__init__.py create mode 100644 venv/Lib/site-packages/fastapi/__main__.py create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/_compat.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/applications.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/background.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/cli.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/concurrency.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/datastructures.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/exception_handlers.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/logger.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/param_functions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/params.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/requests.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/responses.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/routing.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/templating.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/testclient.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/types.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/_compat.py create mode 100644 venv/Lib/site-packages/fastapi/applications.py create mode 100644 venv/Lib/site-packages/fastapi/background.py create mode 100644 venv/Lib/site-packages/fastapi/cli.py create mode 100644 venv/Lib/site-packages/fastapi/concurrency.py create mode 100644 venv/Lib/site-packages/fastapi/datastructures.py create mode 100644 venv/Lib/site-packages/fastapi/dependencies/__init__.py create mode 100644 venv/Lib/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/dependencies/__pycache__/utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/dependencies/models.py create mode 100644 venv/Lib/site-packages/fastapi/dependencies/utils.py create mode 100644 venv/Lib/site-packages/fastapi/encoders.py create mode 100644 venv/Lib/site-packages/fastapi/exception_handlers.py create mode 100644 venv/Lib/site-packages/fastapi/exceptions.py create mode 100644 venv/Lib/site-packages/fastapi/logger.py create mode 100644 venv/Lib/site-packages/fastapi/middleware/__init__.py create mode 100644 venv/Lib/site-packages/fastapi/middleware/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/middleware/__pycache__/cors.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/middleware/__pycache__/gzip.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/middleware/__pycache__/httpsredirect.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/middleware/__pycache__/trustedhost.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/middleware/__pycache__/wsgi.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/middleware/cors.py create mode 100644 venv/Lib/site-packages/fastapi/middleware/gzip.py create mode 100644 venv/Lib/site-packages/fastapi/middleware/httpsredirect.py create mode 100644 venv/Lib/site-packages/fastapi/middleware/trustedhost.py create mode 100644 venv/Lib/site-packages/fastapi/middleware/wsgi.py create mode 100644 venv/Lib/site-packages/fastapi/openapi/__init__.py create mode 100644 venv/Lib/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/openapi/__pycache__/constants.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/openapi/__pycache__/docs.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/openapi/__pycache__/models.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/openapi/__pycache__/utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/openapi/constants.py create mode 100644 venv/Lib/site-packages/fastapi/openapi/docs.py create mode 100644 venv/Lib/site-packages/fastapi/openapi/models.py create mode 100644 venv/Lib/site-packages/fastapi/openapi/utils.py create mode 100644 venv/Lib/site-packages/fastapi/param_functions.py create mode 100644 venv/Lib/site-packages/fastapi/params.py create mode 100644 venv/Lib/site-packages/fastapi/py.typed create mode 100644 venv/Lib/site-packages/fastapi/requests.py create mode 100644 venv/Lib/site-packages/fastapi/responses.py create mode 100644 venv/Lib/site-packages/fastapi/routing.py create mode 100644 venv/Lib/site-packages/fastapi/security/__init__.py create mode 100644 venv/Lib/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/security/__pycache__/http.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/security/__pycache__/utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/fastapi/security/api_key.py create mode 100644 venv/Lib/site-packages/fastapi/security/base.py create mode 100644 venv/Lib/site-packages/fastapi/security/http.py create mode 100644 venv/Lib/site-packages/fastapi/security/oauth2.py create mode 100644 venv/Lib/site-packages/fastapi/security/open_id_connect_url.py create mode 100644 venv/Lib/site-packages/fastapi/security/utils.py create mode 100644 venv/Lib/site-packages/fastapi/staticfiles.py create mode 100644 venv/Lib/site-packages/fastapi/templating.py create mode 100644 venv/Lib/site-packages/fastapi/testclient.py create mode 100644 venv/Lib/site-packages/fastapi/types.py create mode 100644 venv/Lib/site-packages/fastapi/utils.py create mode 100644 venv/Lib/site-packages/fastapi/websockets.py create mode 100644 venv/Lib/site-packages/multipart/__init__.py create mode 100644 venv/Lib/site-packages/multipart/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/multipart/__pycache__/decoders.cpython-312.pyc create mode 100644 venv/Lib/site-packages/multipart/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/multipart/__pycache__/multipart.cpython-312.pyc create mode 100644 venv/Lib/site-packages/multipart/decoders.py create mode 100644 venv/Lib/site-packages/multipart/exceptions.py create mode 100644 venv/Lib/site-packages/multipart/multipart.py create mode 100644 venv/Lib/site-packages/python_multipart-0.0.20.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/python_multipart-0.0.20.dist-info/METADATA create mode 100644 venv/Lib/site-packages/python_multipart-0.0.20.dist-info/RECORD create mode 100644 venv/Lib/site-packages/python_multipart-0.0.20.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/python_multipart-0.0.20.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/python_multipart-0.0.20.dist-info/licenses/LICENSE.txt create mode 100644 venv/Lib/site-packages/python_multipart/__init__.py create mode 100644 venv/Lib/site-packages/python_multipart/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/python_multipart/__pycache__/decoders.cpython-312.pyc create mode 100644 venv/Lib/site-packages/python_multipart/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/python_multipart/__pycache__/multipart.cpython-312.pyc create mode 100644 venv/Lib/site-packages/python_multipart/decoders.py create mode 100644 venv/Lib/site-packages/python_multipart/exceptions.py create mode 100644 venv/Lib/site-packages/python_multipart/multipart.py create mode 100644 venv/Lib/site-packages/python_multipart/py.typed create mode 100644 venv/Lib/site-packages/requests-2.32.4.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/requests-2.32.4.dist-info/METADATA create mode 100644 venv/Lib/site-packages/requests-2.32.4.dist-info/RECORD rename venv/Lib/site-packages/{deepgram_sdk-4.2.0.dist-info => requests-2.32.4.dist-info}/WHEEL (100%) create mode 100644 venv/Lib/site-packages/requests-2.32.4.dist-info/licenses/LICENSE create mode 100644 venv/Lib/site-packages/requests-2.32.4.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/requests/__init__.py create mode 100644 venv/Lib/site-packages/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/api.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/auth.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/certs.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/compat.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/help.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/models.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/packages.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/structures.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__pycache__/utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/requests/__version__.py create mode 100644 venv/Lib/site-packages/requests/_internal_utils.py create mode 100644 venv/Lib/site-packages/requests/adapters.py create mode 100644 venv/Lib/site-packages/requests/api.py create mode 100644 venv/Lib/site-packages/requests/auth.py create mode 100644 venv/Lib/site-packages/requests/certs.py create mode 100644 venv/Lib/site-packages/requests/compat.py create mode 100644 venv/Lib/site-packages/requests/cookies.py create mode 100644 venv/Lib/site-packages/requests/exceptions.py create mode 100644 venv/Lib/site-packages/requests/help.py create mode 100644 venv/Lib/site-packages/requests/hooks.py create mode 100644 venv/Lib/site-packages/requests/models.py create mode 100644 venv/Lib/site-packages/requests/packages.py create mode 100644 venv/Lib/site-packages/requests/sessions.py create mode 100644 venv/Lib/site-packages/requests/status_codes.py create mode 100644 venv/Lib/site-packages/requests/structures.py create mode 100644 venv/Lib/site-packages/requests/utils.py create mode 100644 venv/Lib/site-packages/starlette-0.46.2.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/starlette-0.46.2.dist-info/METADATA create mode 100644 venv/Lib/site-packages/starlette-0.46.2.dist-info/RECORD create mode 100644 venv/Lib/site-packages/starlette-0.46.2.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/starlette-0.46.2.dist-info/licenses/LICENSE.md create mode 100644 venv/Lib/site-packages/starlette/__init__.py create mode 100644 venv/Lib/site-packages/starlette/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/_exception_handler.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/_utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/applications.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/authentication.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/background.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/concurrency.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/config.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/convertors.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/datastructures.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/endpoints.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/formparsers.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/requests.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/responses.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/routing.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/schemas.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/staticfiles.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/status.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/templating.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/testclient.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/types.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/__pycache__/websockets.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/_exception_handler.py create mode 100644 venv/Lib/site-packages/starlette/_utils.py create mode 100644 venv/Lib/site-packages/starlette/applications.py create mode 100644 venv/Lib/site-packages/starlette/authentication.py create mode 100644 venv/Lib/site-packages/starlette/background.py create mode 100644 venv/Lib/site-packages/starlette/concurrency.py create mode 100644 venv/Lib/site-packages/starlette/config.py create mode 100644 venv/Lib/site-packages/starlette/convertors.py create mode 100644 venv/Lib/site-packages/starlette/datastructures.py create mode 100644 venv/Lib/site-packages/starlette/endpoints.py create mode 100644 venv/Lib/site-packages/starlette/exceptions.py create mode 100644 venv/Lib/site-packages/starlette/formparsers.py create mode 100644 venv/Lib/site-packages/starlette/middleware/__init__.py create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/authentication.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/base.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/cors.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/errors.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/gzip.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/httpsredirect.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/sessions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/trustedhost.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/__pycache__/wsgi.cpython-312.pyc create mode 100644 venv/Lib/site-packages/starlette/middleware/authentication.py create mode 100644 venv/Lib/site-packages/starlette/middleware/base.py create mode 100644 venv/Lib/site-packages/starlette/middleware/cors.py create mode 100644 venv/Lib/site-packages/starlette/middleware/errors.py create mode 100644 venv/Lib/site-packages/starlette/middleware/exceptions.py create mode 100644 venv/Lib/site-packages/starlette/middleware/gzip.py create mode 100644 venv/Lib/site-packages/starlette/middleware/httpsredirect.py create mode 100644 venv/Lib/site-packages/starlette/middleware/sessions.py create mode 100644 venv/Lib/site-packages/starlette/middleware/trustedhost.py create mode 100644 venv/Lib/site-packages/starlette/middleware/wsgi.py create mode 100644 venv/Lib/site-packages/starlette/py.typed create mode 100644 venv/Lib/site-packages/starlette/requests.py create mode 100644 venv/Lib/site-packages/starlette/responses.py create mode 100644 venv/Lib/site-packages/starlette/routing.py create mode 100644 venv/Lib/site-packages/starlette/schemas.py create mode 100644 venv/Lib/site-packages/starlette/staticfiles.py create mode 100644 venv/Lib/site-packages/starlette/status.py create mode 100644 venv/Lib/site-packages/starlette/templating.py create mode 100644 venv/Lib/site-packages/starlette/testclient.py create mode 100644 venv/Lib/site-packages/starlette/types.py create mode 100644 venv/Lib/site-packages/starlette/websockets.py create mode 100644 venv/Lib/site-packages/twilio-9.6.3.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/twilio-9.6.3.dist-info/METADATA create mode 100644 venv/Lib/site-packages/twilio-9.6.3.dist-info/RECORD create mode 100644 venv/Lib/site-packages/twilio-9.6.3.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/twilio-9.6.3.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/twilio-9.6.3.dist-info/licenses/AUTHORS.md create mode 100644 venv/Lib/site-packages/twilio-9.6.3.dist-info/licenses/LICENSE create mode 100644 venv/Lib/site-packages/twilio-9.6.3.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/twilio/__init__.py create mode 100644 venv/Lib/site-packages/twilio/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/__pycache__/request_validator.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/auth_strategy/__init__.py create mode 100644 venv/Lib/site-packages/twilio/auth_strategy/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/auth_strategy/__pycache__/auth_strategy.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/auth_strategy/__pycache__/auth_type.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/auth_strategy/__pycache__/no_auth_strategy.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/auth_strategy/__pycache__/token_auth_strategy.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/auth_strategy/auth_strategy.py create mode 100644 venv/Lib/site-packages/twilio/auth_strategy/auth_type.py create mode 100644 venv/Lib/site-packages/twilio/auth_strategy/no_auth_strategy.py create mode 100644 venv/Lib/site-packages/twilio/auth_strategy/token_auth_strategy.py create mode 100644 venv/Lib/site-packages/twilio/base/__init__.py create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/client_base.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/deserialize.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/domain.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/instance_context.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/instance_resource.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/list_resource.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/obsolete.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/page.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/serialize.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/values.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/__pycache__/version.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/base/client_base.py create mode 100644 venv/Lib/site-packages/twilio/base/deserialize.py create mode 100644 venv/Lib/site-packages/twilio/base/domain.py create mode 100644 venv/Lib/site-packages/twilio/base/exceptions.py create mode 100644 venv/Lib/site-packages/twilio/base/instance_context.py create mode 100644 venv/Lib/site-packages/twilio/base/instance_resource.py create mode 100644 venv/Lib/site-packages/twilio/base/list_resource.py create mode 100644 venv/Lib/site-packages/twilio/base/obsolete.py create mode 100644 venv/Lib/site-packages/twilio/base/page.py create mode 100644 venv/Lib/site-packages/twilio/base/serialize.py create mode 100644 venv/Lib/site-packages/twilio/base/values.py create mode 100644 venv/Lib/site-packages/twilio/base/version.py create mode 100644 venv/Lib/site-packages/twilio/credential/__init__.py create mode 100644 venv/Lib/site-packages/twilio/credential/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/credential/__pycache__/client_credential_provider.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/credential/__pycache__/credential_provider.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/credential/__pycache__/orgs_credential_provider.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/credential/client_credential_provider.py create mode 100644 venv/Lib/site-packages/twilio/credential/credential_provider.py create mode 100644 venv/Lib/site-packages/twilio/credential/orgs_credential_provider.py create mode 100644 venv/Lib/site-packages/twilio/http/__init__.py create mode 100644 venv/Lib/site-packages/twilio/http/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/http/__pycache__/async_http_client.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/http/__pycache__/client_token_manager.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/http/__pycache__/http_client.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/http/__pycache__/orgs_token_manager.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/http/__pycache__/request.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/http/__pycache__/response.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/http/__pycache__/token_manager.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/http/__pycache__/validation_client.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/http/async_http_client.py create mode 100644 venv/Lib/site-packages/twilio/http/client_token_manager.py create mode 100644 venv/Lib/site-packages/twilio/http/http_client.py create mode 100644 venv/Lib/site-packages/twilio/http/orgs_token_manager.py create mode 100644 venv/Lib/site-packages/twilio/http/request.py create mode 100644 venv/Lib/site-packages/twilio/http/response.py create mode 100644 venv/Lib/site-packages/twilio/http/token_manager.py create mode 100644 venv/Lib/site-packages/twilio/http/validation_client.py create mode 100644 venv/Lib/site-packages/twilio/jwt/__init__.py create mode 100644 venv/Lib/site-packages/twilio/jwt/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/jwt/access_token/__init__.py create mode 100644 venv/Lib/site-packages/twilio/jwt/access_token/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/jwt/access_token/__pycache__/grants.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/jwt/access_token/grants.py create mode 100644 venv/Lib/site-packages/twilio/jwt/client/__init__.py create mode 100644 venv/Lib/site-packages/twilio/jwt/client/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/jwt/taskrouter/__init__.py create mode 100644 venv/Lib/site-packages/twilio/jwt/taskrouter/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/jwt/taskrouter/__pycache__/capabilities.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/jwt/taskrouter/capabilities.py create mode 100644 venv/Lib/site-packages/twilio/jwt/validation/__init__.py create mode 100644 venv/Lib/site-packages/twilio/jwt/validation/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/request_validator.py create mode 100644 venv/Lib/site-packages/twilio/rest/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/AccountsBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/__pycache__/AccountsBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/auth_token_promotion.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/bulk_consents.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/bulk_contacts.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/safelist.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/secondary_auth_token.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/auth_token_promotion.py create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/bulk_consents.py create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/bulk_contacts.py create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__pycache__/aws.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__pycache__/public_key.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/credential/aws.py create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/credential/public_key.py create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/safelist.py create mode 100644 venv/Lib/site-packages/twilio/rest/accounts/v1/secondary_auth_token.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/ApiBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/__pycache__/ApiBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/application.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/authorized_connect_app.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/balance.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/connect_app.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/key.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/new_key.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/new_signing_key.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/notification.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/outgoing_caller_id.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/short_code.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/signing_key.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/token.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/transcription.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/validation_request.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/address/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/address/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/address/__pycache__/dependent_phone_number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/address/dependent_phone_number.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/application.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/authorized_connect_app.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/local.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/machine_to_machine.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/mobile.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/national.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/shared_cost.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/toll_free.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/voip.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/local.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/machine_to_machine.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/mobile.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/national.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/shared_cost.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/toll_free.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/voip.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/balance.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/event.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/notification.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/payment.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/recording.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/siprec.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/stream.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/transcription.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/user_defined_message.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/user_defined_message_subscription.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/event.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/notification.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/payment.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/recording.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/siprec.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/stream.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/transcription.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/user_defined_message.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/call/user_defined_message_subscription.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__pycache__/participant.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__pycache__/recording.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/participant.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/recording.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/connect_app.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/local.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/mobile.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/toll_free.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/assigned_add_on/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/assigned_add_on/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/assigned_add_on/__pycache__/assigned_add_on_extension.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/assigned_add_on/assigned_add_on_extension.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/local.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/mobile.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/toll_free.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/key.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__pycache__/feedback.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__pycache__/media.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/message/feedback.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/message/media.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/new_key.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/new_signing_key.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/notification.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/outgoing_caller_id.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/__pycache__/member.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/member.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/__pycache__/transcription.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/__pycache__/data.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/data.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/transcription.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/short_code.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/signing_key.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/__pycache__/credential.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/credential.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__pycache__/credential_list_mapping.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__pycache__/ip_access_control_list_mapping.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/auth_calls_credential_list_mapping.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/auth_calls_ip_access_control_list_mapping.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/auth_calls_credential_list_mapping.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/auth_calls_ip_access_control_list_mapping.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__pycache__/auth_registrations_credential_list_mapping.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/auth_registrations_credential_list_mapping.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/credential_list_mapping.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/ip_access_control_list_mapping.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/ip_access_control_list/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/ip_access_control_list/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/ip_access_control_list/__pycache__/ip_address.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/ip_access_control_list/ip_address.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/token.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/transcription.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/__pycache__/trigger.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/all_time.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/daily.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/last_month.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/monthly.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/this_month.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/today.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/yearly.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/yesterday.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/all_time.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/daily.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/last_month.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/monthly.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/this_month.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/today.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/yearly.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/yesterday.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/trigger.py create mode 100644 venv/Lib/site-packages/twilio/rest/api/v2010/account/validation_request.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/AssistantsBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/__pycache__/AssistantsBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/__pycache__/policy.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/__pycache__/tool.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/assistants_knowledge.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/assistants_tool.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/feedback.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/message.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/assistants_knowledge.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/assistants_tool.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/feedback.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/message.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__pycache__/chunk.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__pycache__/knowledge_status.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/chunk.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/knowledge_status.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/policy.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/session/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/session/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/session/__pycache__/message.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/session/message.py create mode 100644 venv/Lib/site-packages/twilio/rest/assistants/v1/tool.py create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/BulkexportsBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/__pycache__/BulkexportsBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/__pycache__/export_configuration.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/day.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/export_custom_job.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/job.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/day.py create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/export_custom_job.py create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/job.py create mode 100644 venv/Lib/site-packages/twilio/rest/bulkexports/v1/export_configuration.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/ChatBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/__pycache__/ChatBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/__pycache__/credential.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/credential.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/__pycache__/role.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/__pycache__/invite.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/__pycache__/member.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/__pycache__/message.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/invite.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/member.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/message.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/role.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/user/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/user/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/user/__pycache__/user_channel.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v1/service/user/user_channel.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/__pycache__/credential.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/credential.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/__pycache__/binding.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/__pycache__/role.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/binding.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/invite.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/member.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/message.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/webhook.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/invite.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/member.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/message.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/webhook.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/role.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__pycache__/user_binding.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__pycache__/user_channel.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/user/user_binding.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v2/service/user/user_channel.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v3/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v3/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v3/__pycache__/channel.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/chat/v3/channel.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/ContentBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/__pycache__/ContentBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/__pycache__/content_and_approvals.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/__pycache__/legacy_content.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/content/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/content/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/content/__pycache__/approval_create.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/content/__pycache__/approval_fetch.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/content/approval_create.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/content/approval_fetch.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/content_and_approvals.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/v1/legacy_content.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/v2/__pycache__/content.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/v2/__pycache__/content_and_approvals.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/content/v2/content.py create mode 100644 venv/Lib/site-packages/twilio/rest/content/v2/content_and_approvals.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/ConversationsBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/__pycache__/ConversationsBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/address_configuration.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/conversation_with_participants.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/credential.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/participant_conversation.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/role.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/address_configuration.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/__pycache__/webhook.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/webhook.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__pycache__/participant.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__pycache__/webhook.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/message/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/message/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/message/__pycache__/delivery_receipt.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/message/delivery_receipt.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/participant.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/webhook.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/conversation_with_participants.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/credential.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/participant_conversation.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/role.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/__pycache__/binding.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/__pycache__/conversation_with_participants.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/__pycache__/participant_conversation.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/__pycache__/role.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/binding.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/__pycache__/notification.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/__pycache__/webhook.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/notification.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/webhook.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__pycache__/participant.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__pycache__/webhook.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/__pycache__/delivery_receipt.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/delivery_receipt.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/participant.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/webhook.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation_with_participants.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/participant_conversation.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/role.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/__pycache__/user_conversation.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/user_conversation.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/user/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/user/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/user/__pycache__/user_conversation.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/conversations/v1/user/user_conversation.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/EventsBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/__pycache__/EventsBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/__pycache__/event_type.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/event_type.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/schema/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/schema/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/schema/__pycache__/schema_version.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/schema/schema_version.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/sink/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/sink/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/sink/__pycache__/sink_test.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/sink/__pycache__/sink_validate.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/sink/sink_test.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/sink/sink_validate.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/subscription/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/subscription/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/subscription/__pycache__/subscribed_event.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/events/v1/subscription/subscribed_event.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/FlexApiBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/__pycache__/FlexApiBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/assessments.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/channel.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/configuration.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/flex_flow.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_assessments_comment.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_conversations.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_questionnaires.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_questionnaires_category.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_questionnaires_question.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_segments.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_session.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_settings_answer_sets.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_settings_comment.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_user_roles.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_archive.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_configuration_archive.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_release.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_version_archive.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/provisioning_status.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/web_channel.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/assessments.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/channel.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/configuration.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/flex_flow.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_assessments_comment.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_conversations.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires_category.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires_question.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_segments.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_session.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_settings_answer_sets.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_settings_comment.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_user_roles.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/interaction_channel_invite.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/interaction_channel_participant.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/interaction_transfer.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_channel_invite.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_channel_participant.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_transfer.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/__pycache__/plugin_versions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/plugin_versions.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_archive.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration/__pycache__/configured_plugin.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration/configured_plugin.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration_archive.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_release.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_version_archive.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/provisioning_status.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v1/web_channel.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v2/__pycache__/flex_user.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v2/__pycache__/web_channels.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v2/flex_user.py create mode 100644 venv/Lib/site-packages/twilio/rest/flex_api/v2/web_channels.py create mode 100644 venv/Lib/site-packages/twilio/rest/frontline_api/FrontlineApiBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/frontline_api/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/frontline_api/__pycache__/FrontlineApiBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/frontline_api/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/frontline_api/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/frontline_api/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/frontline_api/v1/__pycache__/user.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/frontline_api/v1/user.py create mode 100644 venv/Lib/site-packages/twilio/rest/iam/IamBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/iam/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/iam/__pycache__/IamBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/iam/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/iam/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/api_key.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/get_api_keys.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/new_api_key.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/token.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/iam/v1/api_key.py create mode 100644 venv/Lib/site-packages/twilio/rest/iam/v1/get_api_keys.py create mode 100644 venv/Lib/site-packages/twilio/rest/iam/v1/new_api_key.py create mode 100644 venv/Lib/site-packages/twilio/rest/iam/v1/token.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/InsightsBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/__pycache__/InsightsBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/__pycache__/call_summaries.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/__pycache__/setting.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/annotation.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/call_summary.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/event.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/metric.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call/annotation.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call/call_summary.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call/event.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call/metric.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/call_summaries.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/conference/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/conference/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/conference/__pycache__/conference_participant.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/conference/conference_participant.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/room/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/room/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/room/__pycache__/participant.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/room/participant.py create mode 100644 venv/Lib/site-packages/twilio/rest/insights/v1/setting.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/IntelligenceBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/__pycache__/IntelligenceBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/custom_operator.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/operator.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/operator_attachment.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/operator_attachments.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/operator_type.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/prebuilt_operator.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/service.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/custom_operator.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/operator.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_attachment.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_attachments.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_type.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/prebuilt_operator.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/service.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__pycache__/media.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__pycache__/operator_result.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__pycache__/sentence.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/media.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/operator_result.py create mode 100644 venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/sentence.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/IpMessagingBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/__pycache__/IpMessagingBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/__pycache__/credential.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/credential.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/__pycache__/role.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/__pycache__/invite.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/__pycache__/member.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/__pycache__/message.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/invite.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/member.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/message.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/role.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/__pycache__/user_channel.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/user_channel.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/__pycache__/credential.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/credential.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__pycache__/binding.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__pycache__/role.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/binding.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/invite.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/member.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/message.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/webhook.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/invite.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/member.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/message.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/webhook.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/role.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__pycache__/user_binding.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__pycache__/user_channel.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/user_binding.py create mode 100644 venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/user_channel.py create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/LookupsBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/__pycache__/LookupsBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/v1/__pycache__/phone_number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/v1/phone_number.py create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/v2/__pycache__/phone_number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/lookups/v2/phone_number.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/MarketplaceBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/__pycache__/MarketplaceBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/__pycache__/module_data.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/__pycache__/module_data_management.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/__pycache__/referral_conversion.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/__pycache__/available_add_on_extension.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/available_add_on_extension.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__pycache__/installed_add_on_extension.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__pycache__/installed_add_on_usage.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/installed_add_on_extension.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/installed_add_on_usage.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/module_data.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/module_data_management.py create mode 100644 venv/Lib/site-packages/twilio/rest/marketplace/v1/referral_conversion.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/MessagingBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/__pycache__/MessagingBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/deactivations.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/domain_certs.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/domain_config.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/domain_config_messaging_service.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/external_campaign.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/linkshortening_messaging_service.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/linkshortening_messaging_service_domain_association.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/request_managed_cert.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/tollfree_verification.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/usecase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/__pycache__/brand_registration_otp.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/__pycache__/brand_vetting.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/brand_registration_otp.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/brand_vetting.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/deactivations.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/domain_certs.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/domain_config.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/domain_config_messaging_service.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/external_campaign.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/linkshortening_messaging_service.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/linkshortening_messaging_service_domain_association.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/request_managed_cert.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/alpha_sender.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/channel_sender.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/destination_alpha_sender.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/phone_number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/short_code.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/us_app_to_person.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/us_app_to_person_usecase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/alpha_sender.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/channel_sender.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/destination_alpha_sender.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/phone_number.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/short_code.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/us_app_to_person.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/service/us_app_to_person_usecase.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/tollfree_verification.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v1/usecase.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v2/__pycache__/channels_sender.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/messaging/v2/channels_sender.py create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/MicrovisorBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/__pycache__/MicrovisorBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/__pycache__/account_config.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/__pycache__/account_secret.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/account_config.py create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/account_secret.py create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/app/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/app/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/app/__pycache__/app_manifest.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/app/app_manifest.py create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__pycache__/device_config.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__pycache__/device_secret.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/device/device_config.py create mode 100644 venv/Lib/site-packages/twilio/rest/microvisor/v1/device/device_secret.py create mode 100644 venv/Lib/site-packages/twilio/rest/monitor/MonitorBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/monitor/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/monitor/__pycache__/MonitorBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/monitor/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/monitor/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/monitor/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/monitor/v1/__pycache__/alert.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/monitor/v1/__pycache__/event.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/monitor/v1/alert.py create mode 100644 venv/Lib/site-packages/twilio/rest/monitor/v1/event.py create mode 100644 venv/Lib/site-packages/twilio/rest/notify/NotifyBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/notify/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/notify/__pycache__/NotifyBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/notify/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/notify/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/notify/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/notify/v1/__pycache__/credential.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/notify/v1/credential.py create mode 100644 venv/Lib/site-packages/twilio/rest/notify/v1/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/notify/v1/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/notify/v1/service/__pycache__/binding.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/notify/v1/service/__pycache__/notification.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/notify/v1/service/binding.py create mode 100644 venv/Lib/site-packages/twilio/rest/notify/v1/service/notification.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/NumbersBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/__pycache__/NumbersBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/bulk_eligibility.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/eligibility.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_port_in.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_port_in_phone_number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_portability.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration_delete.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration_fetch.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/signing_request_configuration.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/bulk_eligibility.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/eligibility.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/porting_port_in.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/porting_port_in_phone_number.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/porting_portability.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration_delete.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration_fetch.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v1/signing_request_configuration.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/__pycache__/bulk_hosted_number_order.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/__pycache__/bundle_clone.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/__pycache__/hosted_number_order.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/__pycache__/dependent_hosted_number_order.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/dependent_hosted_number_order.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/bulk_hosted_number_order.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/bundle_clone.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/hosted_number_order.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/end_user.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/end_user_type.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/regulation.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/supporting_document.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/supporting_document_type.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/bundle_copy.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/evaluation.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/item_assignment.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/replace_items.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/bundle_copy.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/evaluation.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/item_assignment.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/replace_items.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/end_user.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/end_user_type.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/regulation.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/supporting_document.py create mode 100644 venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/supporting_document_type.py create mode 100644 venv/Lib/site-packages/twilio/rest/oauth/OauthBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/oauth/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/oauth/__pycache__/OauthBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/oauth/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/oauth/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/oauth/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/oauth/v1/__pycache__/authorize.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/oauth/v1/__pycache__/token.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/oauth/v1/authorize.py create mode 100644 venv/Lib/site-packages/twilio/rest/oauth/v1/token.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/PreviewBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/__pycache__/PreviewBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/__pycache__/hosted_number_order.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/__pycache__/dependent_hosted_number_order.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/dependent_hosted_number_order.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/hosted_number_order.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/marketplace/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/marketplace/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/__pycache__/available_add_on_extension.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/available_add_on_extension.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/marketplace/installed_add_on/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/marketplace/installed_add_on/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/marketplace/installed_add_on/__pycache__/installed_add_on_extension.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/marketplace/installed_add_on/installed_add_on_extension.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/wireless/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/wireless/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/wireless/__pycache__/command.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/wireless/__pycache__/rate_plan.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/wireless/command.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/wireless/rate_plan.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/wireless/sim/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview/wireless/sim/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/wireless/sim/__pycache__/usage.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview/wireless/sim/usage.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/PreviewIamBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/__pycache__/PreviewIamBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/v1/__pycache__/authorize.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/v1/__pycache__/token.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/v1/authorize.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/v1/token.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/versionless/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/versionless/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__pycache__/account.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__pycache__/role_assignment.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__pycache__/user.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/account.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/role_assignment.py create mode 100644 venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/user.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/PricingBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/__pycache__/PricingBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/__pycache__/country.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/country.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/__pycache__/country.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/country.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__pycache__/country.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__pycache__/number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/voice/country.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v1/voice/number.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/__pycache__/country.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/__pycache__/number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/country.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/number.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__pycache__/country.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__pycache__/number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/voice/country.py create mode 100644 venv/Lib/site-packages/twilio/rest/pricing/v2/voice/number.py create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/ProxyBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/__pycache__/ProxyBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/__pycache__/phone_number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/__pycache__/short_code.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/phone_number.py create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/__pycache__/interaction.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/interaction.py create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/__pycache__/message_interaction.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/message_interaction.py create mode 100644 venv/Lib/site-packages/twilio/rest/proxy/v1/service/short_code.py create mode 100644 venv/Lib/site-packages/twilio/rest/routes/RoutesBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/routes/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/routes/__pycache__/RoutesBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/routes/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/routes/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/routes/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/routes/v2/__pycache__/phone_number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/routes/v2/__pycache__/sip_domain.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/routes/v2/__pycache__/trunk.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/routes/v2/phone_number.py create mode 100644 venv/Lib/site-packages/twilio/rest/routes/v2/sip_domain.py create mode 100644 venv/Lib/site-packages/twilio/rest/routes/v2/trunk.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/ServerlessBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/__pycache__/ServerlessBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/asset/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/asset/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/asset/__pycache__/asset_version.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/asset/asset_version.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/build/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/build/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/build/__pycache__/build_status.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/build/build_status.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/environment/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/environment/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/environment/__pycache__/deployment.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/environment/__pycache__/log.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/environment/__pycache__/variable.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/environment/deployment.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/environment/log.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/environment/variable.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/function/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/function/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/function/function_version/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/function/function_version/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/function/function_version/__pycache__/function_version_content.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/serverless/v1/service/function/function_version/function_version_content.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/StudioBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/__pycache__/StudioBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/engagement/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/engagement/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/engagement/__pycache__/engagement_context.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/engagement/engagement_context.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/engagement/step/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/engagement/step/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/engagement/step/__pycache__/step_context.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/engagement/step/step_context.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/execution/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/execution/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/execution/__pycache__/execution_context.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/execution/execution_context.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/execution/execution_step/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/execution/execution_step/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/execution/execution_step/__pycache__/execution_step_context.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v1/flow/execution/execution_step/execution_step_context.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/__pycache__/flow_validate.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/__pycache__/flow_revision.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/__pycache__/flow_test_user.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/execution/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/execution/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/execution/__pycache__/execution_context.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/execution/execution_context.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/execution/execution_step/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/execution/execution_step/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/execution/execution_step/__pycache__/execution_step_context.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/execution/execution_step/execution_step_context.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/flow_revision.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow/flow_test_user.py create mode 100644 venv/Lib/site-packages/twilio/rest/studio/v2/flow_validate.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/SupersimBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/__pycache__/SupersimBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/__pycache__/esim_profile.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/__pycache__/fleet.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/__pycache__/ip_command.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/__pycache__/network.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/__pycache__/settings_update.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/__pycache__/sms_command.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/__pycache__/usage_record.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/esim_profile.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/fleet.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/ip_command.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/network.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/network_access_profile/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/network_access_profile/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/network_access_profile/__pycache__/network_access_profile_network.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/network_access_profile/network_access_profile_network.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/settings_update.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/sim/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/sim/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/sim/__pycache__/billing_period.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/sim/__pycache__/sim_ip_address.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/sim/billing_period.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/sim/sim_ip_address.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/sms_command.py create mode 100644 venv/Lib/site-packages/twilio/rest/supersim/v1/usage_record.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/SyncBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/__pycache__/SyncBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/document/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/document/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/document/__pycache__/document_permission.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/document/document_permission.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_list/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_list/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_list/__pycache__/sync_list_item.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_list/__pycache__/sync_list_permission.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_list/sync_list_item.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_list/sync_list_permission.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_map/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_map/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_map/__pycache__/sync_map_item.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_map/__pycache__/sync_map_permission.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_map/sync_map_item.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_map/sync_map_permission.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_stream/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_stream/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_stream/__pycache__/stream_message.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/sync/v1/service/sync_stream/stream_message.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/TaskrouterBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/__pycache__/TaskrouterBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/__pycache__/activity.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/__pycache__/event.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/__pycache__/task_channel.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/__pycache__/workspace_cumulative_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/__pycache__/workspace_real_time_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/__pycache__/workspace_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/activity.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/event.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task/__pycache__/reservation.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task/reservation.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_channel.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/task_queue_bulk_real_time_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/task_queue_cumulative_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/task_queue_real_time_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/task_queue_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/task_queues_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/task_queue_bulk_real_time_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/task_queue_cumulative_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/task_queue_real_time_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/task_queue_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/task_queue/task_queues_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/__pycache__/reservation.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/__pycache__/worker_channel.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/__pycache__/worker_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/__pycache__/workers_cumulative_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/__pycache__/workers_real_time_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/__pycache__/workers_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/reservation.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/worker_channel.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/worker_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/workers_cumulative_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/workers_real_time_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/worker/workers_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workflow/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workflow/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workflow/__pycache__/workflow_cumulative_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workflow/__pycache__/workflow_real_time_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workflow/__pycache__/workflow_statistics.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workflow/workflow_cumulative_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workflow/workflow_real_time_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workflow/workflow_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workspace_cumulative_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workspace_real_time_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/taskrouter/v1/workspace/workspace_statistics.py create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/TrunkingBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/__pycache__/TrunkingBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/__pycache__/credential_list.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/__pycache__/ip_access_control_list.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/__pycache__/origination_url.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/__pycache__/phone_number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/__pycache__/recording.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/credential_list.py create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/ip_access_control_list.py create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/origination_url.py create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/phone_number.py create mode 100644 venv/Lib/site-packages/twilio/rest/trunking/v1/trunk/recording.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/TrusthubBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/__pycache__/TrusthubBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/__pycache__/compliance_inquiries.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/__pycache__/compliance_registration_inquiries.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/__pycache__/compliance_tollfree_inquiries.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/__pycache__/end_user.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/__pycache__/end_user_type.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/__pycache__/policies.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/__pycache__/supporting_document.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/__pycache__/supporting_document_type.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/compliance_inquiries.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/compliance_registration_inquiries.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/compliance_tollfree_inquiries.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/customer_profiles/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/customer_profiles/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/customer_profiles/__pycache__/customer_profiles_channel_endpoint_assignment.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/customer_profiles/__pycache__/customer_profiles_entity_assignments.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/customer_profiles/__pycache__/customer_profiles_evaluations.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/customer_profiles/customer_profiles_channel_endpoint_assignment.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/customer_profiles/customer_profiles_entity_assignments.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/customer_profiles/customer_profiles_evaluations.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/end_user.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/end_user_type.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/policies.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/supporting_document.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/supporting_document_type.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/trust_products/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/trust_products/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/trust_products/__pycache__/trust_products_channel_endpoint_assignment.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/trust_products/__pycache__/trust_products_entity_assignments.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/trust_products/__pycache__/trust_products_evaluations.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/trust_products/trust_products_channel_endpoint_assignment.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/trust_products/trust_products_entity_assignments.py create mode 100644 venv/Lib/site-packages/twilio/rest/trusthub/v1/trust_products/trust_products_evaluations.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/VerifyBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/__pycache__/VerifyBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/__pycache__/form.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/__pycache__/safelist.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/__pycache__/template.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/__pycache__/verification_attempt.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/__pycache__/verification_attempts_summary.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/form.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/safelist.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/__pycache__/access_token.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/__pycache__/messaging_configuration.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/__pycache__/verification.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/__pycache__/verification_check.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/__pycache__/webhook.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/access_token.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/entity/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/entity/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/entity/__pycache__/factor.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/entity/__pycache__/new_factor.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/entity/challenge/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/entity/challenge/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/entity/challenge/__pycache__/notification.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/entity/challenge/notification.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/entity/factor.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/entity/new_factor.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/messaging_configuration.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/rate_limit/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/rate_limit/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/rate_limit/__pycache__/bucket.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/rate_limit/bucket.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/verification.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/verification_check.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/service/webhook.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/template.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/verification_attempt.py create mode 100644 venv/Lib/site-packages/twilio/rest/verify/v2/verification_attempts_summary.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/VideoBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/__pycache__/VideoBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/__pycache__/composition.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/__pycache__/composition_hook.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/__pycache__/composition_settings.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/__pycache__/recording.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/__pycache__/recording_settings.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/composition.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/composition_hook.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/composition_settings.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/recording.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/recording_settings.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/__pycache__/recording_rules.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/__pycache__/room_recording.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/participant/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/participant/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/participant/__pycache__/anonymize.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/participant/__pycache__/published_track.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/participant/__pycache__/subscribe_rules.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/participant/__pycache__/subscribed_track.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/participant/anonymize.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/participant/published_track.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/participant/subscribe_rules.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/participant/subscribed_track.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/recording_rules.py create mode 100644 venv/Lib/site-packages/twilio/rest/video/v1/room/room_recording.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/VoiceBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/__pycache__/VoiceBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/__pycache__/archived_call.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/__pycache__/byoc_trunk.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/__pycache__/ip_record.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/__pycache__/source_ip_mapping.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/archived_call.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/byoc_trunk.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/connection_policy/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/connection_policy/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/connection_policy/__pycache__/connection_policy_target.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/connection_policy/connection_policy_target.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/dialing_permissions/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/dialing_permissions/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/dialing_permissions/__pycache__/bulk_country_update.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/dialing_permissions/__pycache__/settings.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/dialing_permissions/bulk_country_update.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/dialing_permissions/country/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/dialing_permissions/country/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/dialing_permissions/country/__pycache__/highrisk_special_prefix.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/dialing_permissions/country/highrisk_special_prefix.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/dialing_permissions/settings.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/ip_record.py create mode 100644 venv/Lib/site-packages/twilio/rest/voice/v1/source_ip_mapping.py create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/WirelessBase.py create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/__pycache__/WirelessBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/__pycache__/command.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/__pycache__/rate_plan.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/__pycache__/usage_record.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/command.py create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/rate_plan.py create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/sim/__init__.py create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/sim/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/sim/__pycache__/data_session.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/sim/__pycache__/usage_record.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/sim/data_session.py create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/sim/usage_record.py create mode 100644 venv/Lib/site-packages/twilio/rest/wireless/v1/usage_record.py create mode 100644 venv/Lib/site-packages/twilio/twiml/__init__.py create mode 100644 venv/Lib/site-packages/twilio/twiml/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/twiml/__pycache__/fax_response.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/twiml/__pycache__/messaging_response.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/twiml/__pycache__/voice_response.cpython-312.pyc create mode 100644 venv/Lib/site-packages/twilio/twiml/fax_response.py create mode 100644 venv/Lib/site-packages/twilio/twiml/messaging_response.py create mode 100644 venv/Lib/site-packages/twilio/twiml/voice_response.py create mode 100644 venv/Lib/site-packages/urllib3-2.5.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/urllib3-2.5.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/urllib3-2.5.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/urllib3-2.5.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/urllib3-2.5.0.dist-info/licenses/LICENSE.txt create mode 100644 venv/Lib/site-packages/urllib3/__init__.py create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/_base_connection.py create mode 100644 venv/Lib/site-packages/urllib3/_collections.py create mode 100644 venv/Lib/site-packages/urllib3/_request_methods.py create mode 100644 venv/Lib/site-packages/urllib3/_version.py create mode 100644 venv/Lib/site-packages/urllib3/connection.py create mode 100644 venv/Lib/site-packages/urllib3/connectionpool.py create mode 100644 venv/Lib/site-packages/urllib3/contrib/__init__.py create mode 100644 venv/Lib/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/__init__.py create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/connection.py create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/fetch.py create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/request.py create mode 100644 venv/Lib/site-packages/urllib3/contrib/emscripten/response.py create mode 100644 venv/Lib/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 venv/Lib/site-packages/urllib3/contrib/socks.py create mode 100644 venv/Lib/site-packages/urllib3/exceptions.py create mode 100644 venv/Lib/site-packages/urllib3/fields.py create mode 100644 venv/Lib/site-packages/urllib3/filepost.py create mode 100644 venv/Lib/site-packages/urllib3/http2/__init__.py create mode 100644 venv/Lib/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/http2/__pycache__/connection.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/http2/connection.py create mode 100644 venv/Lib/site-packages/urllib3/http2/probe.py create mode 100644 venv/Lib/site-packages/urllib3/poolmanager.py create mode 100644 venv/Lib/site-packages/urllib3/py.typed create mode 100644 venv/Lib/site-packages/urllib3/response.py create mode 100644 venv/Lib/site-packages/urllib3/util/__init__.py create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 venv/Lib/site-packages/urllib3/util/connection.py create mode 100644 venv/Lib/site-packages/urllib3/util/proxy.py create mode 100644 venv/Lib/site-packages/urllib3/util/request.py create mode 100644 venv/Lib/site-packages/urllib3/util/response.py create mode 100644 venv/Lib/site-packages/urllib3/util/retry.py create mode 100644 venv/Lib/site-packages/urllib3/util/ssl_.py create mode 100644 venv/Lib/site-packages/urllib3/util/ssl_match_hostname.py create mode 100644 venv/Lib/site-packages/urllib3/util/ssltransport.py create mode 100644 venv/Lib/site-packages/urllib3/util/timeout.py create mode 100644 venv/Lib/site-packages/urllib3/util/url.py create mode 100644 venv/Lib/site-packages/urllib3/util/util.py create mode 100644 venv/Lib/site-packages/urllib3/util/wait.py create mode 100644 venv/Lib/site-packages/uvicorn-0.35.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/uvicorn-0.35.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/uvicorn-0.35.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/uvicorn-0.35.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/uvicorn-0.35.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/uvicorn-0.35.0.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/uvicorn-0.35.0.dist-info/licenses/LICENSE.md create mode 100644 venv/Lib/site-packages/uvicorn/__init__.py create mode 100644 venv/Lib/site-packages/uvicorn/__main__.py create mode 100644 venv/Lib/site-packages/uvicorn/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/__pycache__/_subprocess.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/__pycache__/_types.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/__pycache__/config.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/__pycache__/importer.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/__pycache__/logging.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/__pycache__/main.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/__pycache__/server.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/__pycache__/workers.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/_subprocess.py create mode 100644 venv/Lib/site-packages/uvicorn/_types.py create mode 100644 venv/Lib/site-packages/uvicorn/config.py create mode 100644 venv/Lib/site-packages/uvicorn/importer.py create mode 100644 venv/Lib/site-packages/uvicorn/lifespan/__init__.py create mode 100644 venv/Lib/site-packages/uvicorn/lifespan/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/lifespan/__pycache__/off.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/lifespan/__pycache__/on.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/lifespan/off.py create mode 100644 venv/Lib/site-packages/uvicorn/lifespan/on.py create mode 100644 venv/Lib/site-packages/uvicorn/logging.py create mode 100644 venv/Lib/site-packages/uvicorn/loops/__init__.py create mode 100644 venv/Lib/site-packages/uvicorn/loops/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/loops/__pycache__/asyncio.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/loops/__pycache__/auto.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/loops/__pycache__/uvloop.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/loops/asyncio.py create mode 100644 venv/Lib/site-packages/uvicorn/loops/auto.py create mode 100644 venv/Lib/site-packages/uvicorn/loops/uvloop.py create mode 100644 venv/Lib/site-packages/uvicorn/main.py create mode 100644 venv/Lib/site-packages/uvicorn/middleware/__init__.py create mode 100644 venv/Lib/site-packages/uvicorn/middleware/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/middleware/__pycache__/asgi2.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/middleware/__pycache__/message_logger.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/middleware/__pycache__/proxy_headers.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/middleware/__pycache__/wsgi.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/middleware/asgi2.py create mode 100644 venv/Lib/site-packages/uvicorn/middleware/message_logger.py create mode 100644 venv/Lib/site-packages/uvicorn/middleware/proxy_headers.py create mode 100644 venv/Lib/site-packages/uvicorn/middleware/wsgi.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/__init__.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/__pycache__/utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/http/__init__.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/http/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/http/__pycache__/auto.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/http/__pycache__/flow_control.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/http/__pycache__/h11_impl.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/http/__pycache__/httptools_impl.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/http/auto.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/http/flow_control.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/http/h11_impl.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/http/httptools_impl.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/utils.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/websockets/__init__.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/websockets/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/websockets/__pycache__/auto.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_impl.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/websockets/__pycache__/websockets_sansio_impl.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/websockets/__pycache__/wsproto_impl.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/protocols/websockets/auto.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/websockets/websockets_impl.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/websockets/websockets_sansio_impl.py create mode 100644 venv/Lib/site-packages/uvicorn/protocols/websockets/wsproto_impl.py create mode 100644 venv/Lib/site-packages/uvicorn/py.typed create mode 100644 venv/Lib/site-packages/uvicorn/server.py create mode 100644 venv/Lib/site-packages/uvicorn/supervisors/__init__.py create mode 100644 venv/Lib/site-packages/uvicorn/supervisors/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/supervisors/__pycache__/basereload.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/supervisors/__pycache__/multiprocess.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/supervisors/__pycache__/statreload.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/supervisors/__pycache__/watchfilesreload.cpython-312.pyc create mode 100644 venv/Lib/site-packages/uvicorn/supervisors/basereload.py create mode 100644 venv/Lib/site-packages/uvicorn/supervisors/multiprocess.py create mode 100644 venv/Lib/site-packages/uvicorn/supervisors/statreload.py create mode 100644 venv/Lib/site-packages/uvicorn/supervisors/watchfilesreload.py create mode 100644 venv/Lib/site-packages/uvicorn/workers.py create mode 100644 venv/Scripts/fastapi.exe create mode 100644 venv/Scripts/normalizer.exe create mode 100644 venv/Scripts/uvicorn.exe diff --git a/__pycache__/metrics_logger.cpython-312.pyc b/__pycache__/metrics_logger.cpython-312.pyc index 102fa1b77115fbc4740a826970d31f8062d5032d..eda369a421678eeb7d235eed7c039091acccceb8 100644 GIT binary patch delta 20 acmdm_ze%6_G%qg~0}w1Z<-d`8xi|nml?C(w delta 20 acmdm_ze%6_G%qg~0}%Xs>AsPBxi|npod#t9 diff --git a/__pycache__/twilio_stream.cpython-312.pyc b/__pycache__/twilio_stream.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..588bf81669e5932ebc9c48df544111cb238af349 GIT binary patch literal 4672 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 literal 0 HcmV?d00001 diff --git a/call_twilio.py b/call_twilio.py new file mode 100644 index 00000000..ee594840 --- /dev/null +++ b/call_twilio.py @@ -0,0 +1,55 @@ +import os +from twilio.rest import Client +from dotenv import load_dotenv + +load_dotenv() + +def make_call(to_number): + try: + client = Client(os.getenv("TWILIO_ACCOUNT_SID"), os.getenv("TWILIO_AUTH_TOKEN")) + + # Use your ngrok URL for the voice webhook + voice_url = f"{os.getenv('NGROK_URL')}/voice" + + print(f"Making call to {to_number}") + print(f"Voice webhook URL: {voice_url}") + + call = client.calls.create( + to=to_number, + from_=os.getenv("TWILIO_NUMBER"), + url=voice_url, # Twilio will fetch TwiML from this URL + method="POST" + ) + print(f"✅ Call initiated successfully!") + print(f"Call SID: {call.sid}") + print(f"Call Status: {call.status}") + + except Exception as e: + print(f"❌ Error making call: {e}") + +def test_webhook(): + """Test if the webhook URL is accessible""" + try: + import requests + webhook_url = f"{os.getenv('NGROK_URL')}/voice" + response = requests.get(webhook_url) + if response.status_code == 200: + print(f"✅ Webhook URL is accessible: {webhook_url}") + else: + print(f"❌ Webhook URL returned status {response.status_code}: {webhook_url}") + except Exception as e: + print(f"❌ Cannot reach webhook URL: {e}") + +if __name__ == "__main__": + print("=== Voice AI Agent Call Initiator ===") + + # Test webhook first + print("\n1. Testing webhook URL...") + test_webhook() + + # Make call + print("\n2. Initiating call...") + phone = input("Enter the phone number to call (with country code, e.g. +15551234567): ") + make_call(phone) + + print("\n3. Call initiated! Answer your phone and start speaking.") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 2859f8985ed8ae4fb3be46a8160b2ca8091b2ebc..ac695a6247ef8dfcf254e18317c40cf35dfbe5f5 100644 GIT binary patch delta 80 zcmX@bI*Dz=DJG8+hH{2Xh8!TyXW(VvVn}01WGH4R0g?qkF_1_pLm7~j43sZo$YY3x Q%H}bo0M!%$$yl%|0NO + + {message} + + Please speak now. + + I didn't hear anything. Goodbye! +""" + + return Response(content=response, media_type="application/xml") + +@app.api_route("/process-speech", methods=["POST"]) +async def process_speech(request: Request): + form = await request.form() + user_speech = form.get("SpeechResult", "") + confidence = form.get("Confidence", "0") + + print(f"📞 User said: '{user_speech}' (confidence: {confidence})") + + if user_speech and user_speech.strip(): + # Send to Groq LLM + ai_response = ask_groq(user_speech) + print(f"📞 AI responds: {ai_response}") + + # Continue conversation + response = f""" + + {ai_response} + + Is there anything else I can help you with? + + Thank you for calling. Goodbye! +""" + else: + # No speech detected + response = f""" + + I didn't hear anything clearly. Let me try again. + + Please speak clearly. + + Thank you for calling. Goodbye! +""" + + return Response(content=response, media_type="application/xml") + +# Health check endpoint +@app.get("/health") +def health_check(): + return {"status": "healthy", "message": "Voice AI Agent is running"} + +# Graceful shutdown +@app.on_event("shutdown") +async def shutdown_event(): + print("Shutting down Voice AI Agent...") \ No newline at end of file diff --git a/venv/Lib/site-packages/__pycache__/deprecation.cpython-312.pyc b/venv/Lib/site-packages/__pycache__/deprecation.cpython-312.pyc index 43b6f9128259a6dbaecc3383deb0091d02e3d387..ed8763292965ec936f5408f62ebc3e835063d45e 100644 GIT binary patch delta 30 kcmZ1%ye^pUG%qg~0}v!Kd1N#iZ{+KeWxTa{rmQFr0EHF^k^lez delta 30 kcmZ1%ye^pUG%qg~0}zyMbkB%4+Q`=>%lK>aOj%JL0FXrqQ2+n{ diff --git a/venv/Lib/site-packages/__pycache__/mypy_extensions.cpython-312.pyc b/venv/Lib/site-packages/__pycache__/mypy_extensions.cpython-312.pyc index 9223a8131381d97fd126bba221717b34ae560c3c..86669ca58bc3965db153b22aa42f0ccc3f06c118 100644 GIT binary patch delta 23 dcmZ1#uquG>G%qg~0}v!Jd1ScCZ{(BF002sd1#JKT delta 23 dcmZ1#uquG>G%qg~0}zyMbkFdT+sG%Q0RT~b1~LEu diff --git a/venv/Lib/site-packages/__pycache__/six.cpython-312.pyc b/venv/Lib/site-packages/__pycache__/six.cpython-312.pyc index 5b08eebae229d21b4629c030de81181ac3be1450..7648701dcf437b88548113516a874525f303a350 100644 GIT binary patch delta 25 fcmdmdm}&E2Cce|Wyj%=Gki+DWQPsVXZ|On+X!Hmc delta 25 fcmdmdm}&E2Cce|Wyj%=Gpv~x>(ciw2Z|On+X2S>M diff --git a/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc index f4ac62c4e7f9e26ebf66f83ed182c5b1a0fd8e2a..efa9d8e2c620166a8e9257bc3ab7fa9f8d3a0975 100644 GIT binary patch delta 31 lcmeD9%-QjolkYSyFBbz46fk*Yq?R@Ewem4;ua%E+D<4x;B>=B?3UB}b diff --git a/venv/Lib/site-packages/__pycache__/typing_inspect.cpython-312.pyc b/venv/Lib/site-packages/__pycache__/typing_inspect.cpython-312.pyc index b064f60af1da514cfa370386a074b7282f3f9ef3..32167c93728b4ce82f341efb1a2c09cb8d31001b 100644 GIT binary patch delta 25 fcmX@|m+{D7M!wU$yj%=GP{`zwaiDM`-?lmccWnsC delta 25 fcmX@|m+{D7M!wU$yj%=GP`c4QBR6j&-?lmcd$S28 diff --git a/venv/Lib/site-packages/aenum/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/aenum/__pycache__/__init__.cpython-312.pyc index a08a276a6b116e836e801b9ab9f1d8a8cce2a818..42eb0846069abe2729905e62839cb0b211623426 100644 GIT binary patch delta 28 icmbQrHI<9^G%qg~0}#YBd1Or4$Xmd|7&Ez!WjX*|!3P@v delta 28 icmbQrHI<9^G%qg~0}zyKbkE4z$Xmd|s6V-mWjX+5(g%kC diff --git a/venv/Lib/site-packages/aenum/__pycache__/_common.cpython-312.pyc b/venv/Lib/site-packages/aenum/__pycache__/_common.cpython-312.pyc index 8dd2539c6cbadee30ced3e6ee0ccf8c80d85737e..70384d5a3ee42bfe49c679302ffa33384ffe1b5c 100644 GIT binary patch delta 30 kcmZ2gzN(z>G%qg~0}#YBd1TyD+{m|=jWK5P8Mb>S0FU_z!TG%qg~0}zyKbk8`du#s;s8>9Z_Gi>)v0GbpELI3~& diff --git a/venv/Lib/site-packages/aenum/__pycache__/_constant.cpython-312.pyc b/venv/Lib/site-packages/aenum/__pycache__/_constant.cpython-312.pyc index e48bc77791a7280e4e43336b4bf4e8b55ba93464..0dae00f0136b999df6b874a55e8a4be86d212422 100644 GIT binary patch delta 44 xcmaFv_}r22G%qg~0}#YBd1TBK-N^Tui7{p~6SE}`#$TIl_ODGRyvOaMpZ4#)ri diff --git a/venv/Lib/site-packages/aenum/__pycache__/_enum.cpython-312.pyc b/venv/Lib/site-packages/aenum/__pycache__/_enum.cpython-312.pyc index a6476cfa78903101840190da7e7c859c7ce3edb6..715ab950de6d225f7954e09d9aeebd21f29e3a8b 100644 GIT binary patch delta 80 zcmcb)k>ln@4!+a8yj%=G5YOb1kuS87&y0^TX0t1w6d%hi#=2XZlVw(lGv3ln@4!+a8yj%=GP_ofILzs0VpBW#c{$^J`DL$58jCH>@C(Eo9XZ*F9*JO?o gkXjXXVk_gX?ZrHdhAKdMsR82=dmx=vz?i=R06{YyW&i*H diff --git a/venv/Lib/site-packages/aenum/__pycache__/_py3.cpython-312.pyc b/venv/Lib/site-packages/aenum/__pycache__/_py3.cpython-312.pyc index 460165f805213fa7033a09ee08e46f448f5b4cc5..dbc7ed376ea3ca584b62c6943458c0fdb39c56d2 100644 GIT binary patch delta 29 jcmdnSwvCPVG%qg~0}#YBd1Nfx$Xm?F7_+&NaVsMLZ1)GI delta 29 jcmdnSwvCPVG%qg~0}zyKbkCT!k++zUQGatI<5orhcB}|2 diff --git a/venv/Lib/site-packages/aenum/__pycache__/_tuple.cpython-312.pyc b/venv/Lib/site-packages/aenum/__pycache__/_tuple.cpython-312.pyc index e49424342eeb139a06cd5c1999015986a814f4d9..c29cccd24e1b3737ad9645065d7d59c9c0bebb0f 100644 GIT binary patch delta 52 zcmbQfnQ{7NM!wU$yj%=G5YOb1(dx62PlkmtX0tX+sTAX_$qVHi7;kNUB==MiNS$yv GF986Q&k>;j delta 52 zcmbQfnQ{7NM!wU$yj%=GP_ofIW1-hZJ{cB9{mt4erBaN)CNGq8VEncDk=#>7Aa%mw GyaWKV+Y+$= diff --git a/venv/Lib/site-packages/aiofiles/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/aiofiles/__pycache__/__init__.cpython-312.pyc index 0bb7b31d3a169760ba6ebec0a679730aa32b0090..e7c5bb46fe56ce164842891e19108860a4a51d4c 100644 GIT binary patch delta 28 icmeyz{EwOUG%qg~0}#YBd1T~m$cgu*_$h(x0QGfDgMsEOiz6bpP diff --git a/venv/Lib/site-packages/aiofiles/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/aiofiles/__pycache__/base.cpython-312.pyc index 8f4d65b509001c6d7b0af0d38c46b47c78dcc3fe..6659678654fe576cc0b268df67a8d5a5835e986b 100644 GIT binary patch delta 30 kcmX>oe^8$9G%qg~0}#YBd1TnKZ{$;AVvN~r$TWc$0B`UH)&Kwi delta 30 kcmX>oe^8$9G%qg~0}v>$cgy&}wvkVXiBW&EA=3n20DlVy(f|Me diff --git a/venv/Lib/site-packages/aiofiles/tempfile/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/aiofiles/tempfile/__pycache__/__init__.cpython-312.pyc index ee1f49fdd860ba5b553fdbf7c06b9ae76cac8aba..9fc6288f50852a048595826de18dafe68104d840 100644 GIT binary patch delta 36 qcmdnuxW$qCG%qg~0}#YBd2Hm4XXA<~NzE-t%gjlQ*<8ZrAO!%nUJ6bC delta 36 qcmdnuxW$qCG%qg~0}v>$ciYGv&&H)+lA2qPmYI{Pzqy3XK?(r7{R(3M diff --git a/venv/Lib/site-packages/aiofiles/tempfile/__pycache__/temptypes.cpython-312.pyc b/venv/Lib/site-packages/aiofiles/tempfile/__pycache__/temptypes.cpython-312.pyc index f3725f3cf1d4e5bc448055b848824fa4ff7ebc74..afdd39679c2ce3baeeeeb0fd9084f60b627db727 100644 GIT binary patch delta 36 qcmbOsJ42THG%qg~0}#YBd2HmiV&RG@NzE-t%gjlQ+3e5a$prwR(g}G0 delta 36 qcmbOsJ42THG%qg~0}v>$ciYHq#lodulA2qPmYI{PzuBL~lM4W+aS4t9 diff --git a/venv/Lib/site-packages/aiofiles/threadpool/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/aiofiles/threadpool/__pycache__/__init__.cpython-312.pyc index 76874b474b04e841f0130522329cf6c68ff5fcae..dc3f6169d4fdbbfe120f0875775c77e5d7cb8184 100644 GIT binary patch delta 40 ucmbQBJVBZFG%qg~0}#YBd1Rc}$UBFXC#EE$C^a#qAU{7RX7g6o+uQ)-_6+0z delta 40 ucmbQBJVBZFG%qg~0}v>$cgwKd$UBFXN53SaC^a#qAU{7xfAdz>+uQ)&dJJv= diff --git a/venv/Lib/site-packages/aiofiles/threadpool/__pycache__/binary.cpython-312.pyc b/venv/Lib/site-packages/aiofiles/threadpool/__pycache__/binary.cpython-312.pyc index 488c8ae1b423a21c88fcec6d78c894ca02c14a39..d6bbfc964ed6ba71f7d1a16cdc7edd788211fd4c 100644 GIT binary patch delta 40 ucmdldwoi=rG%qg~0}#YBd1MrC$cgx`3$h(DwN53SaC^a#qAU{7xfAd+ELN);9bqqZK diff --git a/venv/Lib/site-packages/aiofiles/threadpool/__pycache__/text.cpython-312.pyc b/venv/Lib/site-packages/aiofiles/threadpool/__pycache__/text.cpython-312.pyc index d1d069c178afd7747fe1f213a9d9f1212f3af5d5..d242abf57700ba1b91117b7e68286dc254016a6a 100644 GIT binary patch delta 41 vcmeyu{e_$FG%qg~0}#YBd1SD&ZseWmBd delta 41 vcmeyu{e_$FG%qg~0}v>$cgr}=vXQTbnMc1QqbM~or64~)M}PA)<~Sw*1N02d diff --git a/venv/Lib/site-packages/aiofiles/threadpool/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/aiofiles/threadpool/__pycache__/utils.cpython-312.pyc index 51751fcba8b0e7ca92605e7fb67b86bd699a6464..2dd2789f8d9a61fbf6c163b821fddee9dbb5e20b 100644 GIT binary patch delta 40 ucmX>pcT$e`G%qg~0}#YBd1Or4$Xmk56H}5=l$w}Qke{Cuv$>aX4=(`f*bJip delta 40 ucmX>pcT$e`G%qg~0}v>$cgyhE$Xmk5qhFFyl$w}Qke{EUzqyxj4=(`gVGM8p diff --git a/venv/Lib/site-packages/aiohappyeyeballs/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/aiohappyeyeballs/__pycache__/__init__.cpython-312.pyc index 32a806aeab4fcf61d2b80a109981f501b32a457b..0dc85f856ce834ed91cb4d1b7bc90600c88f34a6 100644 GIT binary patch delta 28 icmey!{E?aWG%qg~0}#YBd1RDt$cgx7!$UBdbQGfCpMppoIXb0c` diff --git a/venv/Lib/site-packages/aiohappyeyeballs/__pycache__/_staggered.cpython-312.pyc b/venv/Lib/site-packages/aiohappyeyeballs/__pycache__/_staggered.cpython-312.pyc index d892c52105c0a4b3819f574d54738318a552397c..7ffaa0e9df1599aa48d13ff9bd9af38607cfeac8 100644 GIT binary patch delta 30 kcmdmQx8IKMG%qg~0}#YBd1M@x-pIF%i7{sLR;Df)0ED>+y8r+H delta 30 kcmdmQx8IKMG%qg~0}v>$cgy%9wUKWb6Qlm-txR1q0F2TJEdT%j diff --git a/venv/Lib/site-packages/aiohappyeyeballs/__pycache__/impl.cpython-312.pyc b/venv/Lib/site-packages/aiohappyeyeballs/__pycache__/impl.cpython-312.pyc index b04855a6c04d39206d85525bf4b3218779f6d6d1..36823b2bad36ae6b0866315ca07afddfc95b7b6d 100644 GIT binary patch delta 30 kcmez8_s@^-G%qg~0}#YBd1PEs+sJ3i%NVoSh1W_70Fn9#R{#J2 delta 30 kcmez8_s@^-G%qg~0}v>$cgwh_x{=S6mr;MS3$K+F0GDqFl>h($ diff --git a/venv/Lib/site-packages/aiohappyeyeballs/__pycache__/types.cpython-312.pyc b/venv/Lib/site-packages/aiohappyeyeballs/__pycache__/types.cpython-312.pyc index 690ca32008757e726fb7a9a42b3718f9977aa504..512b440860fdcf0d9773f9474859a01890116be6 100644 GIT binary patch delta 28 icmcb}a*>7iG%qg~0}#YBd1UO`$h(!1F=p~%#y$XTrU)ni delta 28 icmcb}a*>7iG%qg~0}v>$cgtA0k#{R2qyFT>jC}xc;s{v) diff --git a/venv/Lib/site-packages/aiohappyeyeballs/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/aiohappyeyeballs/__pycache__/utils.cpython-312.pyc index c6d338aa99db1d8223ec6f272022167de0d0c574..ba39d61277bddfaa3785755621cc75082490213a 100644 GIT binary patch delta 30 kcmew<^HYZJG%qg~0}#YBd1RRKY~+hzVT{?F&LYGG0DYkcEC2ui delta 30 kcmew<^HYZJG%qg~0}v>$cgwiKy^$}1g;9TVI*Sk&0EG%qg~0}#YBd2Hl%=VOf79L$%+1^{1W24VmJ delta 27 hcmdn1xmT0>G%qg~0}$w}ciYJA&c~>~IhZet4FF_52CV=9 diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/_cookie_helpers.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/_cookie_helpers.cpython-312.pyc index 98aab29637e60a0b0dca2a7b43129db8690cab56..7956c5d5a9b56f36f331c03519ab8337f35e338a 100644 GIT binary patch delta 27 hcmexl{mGj9G%qg~0}#YBd2Hm?=Vy%BY|X!&4*+c<2NwVU delta 27 hcmexl{mGj9G%qg~0}$w}ciYIV&(Em8*_wYl9{_Rt2VwvK diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/abc.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/abc.cpython-312.pyc index 73cf76cd93e15af6f72a6958f60c5f3239c1361c..422d76ef7cabad8fe2a29cb2f933a282975492ce 100644 GIT binary patch delta 27 hcmdm)xHFOaG%qg~0}#YBd2Hm4VPTBfoWT;P0|06q2JHX< delta 27 hcmdm)xHFOaG%qg~0}$w}ciYGv!@{V)IfEro2LNvM2RHx# diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/base_protocol.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/base_protocol.cpython-312.pyc index 211aab8bc8d9b202c485a57cd47e193eb851f02b..b2158a7b6a1952bebb6ed07cf8830b6464e5eb2b 100644 GIT binary patch delta 27 hcmZ3iyjYq0G%qg~0}#YBd2Hn7U}lWjEW+H+2LM%<1-k$M delta 27 hcmZ3iyjYq0G%qg~0}$w}ciYI#!OWBli^nM*YnX1g;(j0E*EG{Qv*} diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/client_exceptions.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/client_exceptions.cpython-312.pyc index 38c5fef83735403f5f90aae2b4bb82dd64ba99eb..44170866567075dccd3e395faeb6e3ac0b2727b1 100644 GIT binary patch delta 29 jcmdnc!?>Y`k^3|+FBbz4#4~wpY`k^3|+FBbz4=&X0!$eqH$sK2>@i@#&CAQh00i+&9viuP*%)Is&t!XT0RU+S2g?8e delta 27 hcmZpvZ>i@#&CAQh00cVg-8ORfvN7s!p2_yw0sw8`2o?YU diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/client_middlewares.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/client_middlewares.cpython-312.pyc index f0e9b421cde054729f9ac89d3f740d14a1bc3801..4ba67651b0e168b9359cf53d28d9cf5c6d1226ca 100644 GIT binary patch delta 27 hcmca3ct?=?G%qg~0}#YBd2Hm4XJL%loXt|m0svvx29W>& delta 27 hcmca3ct?=?G%qg~0}$w}ciYGv&%&s`Ih&=B1psES2HXGu diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/client_proto.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/client_proto.cpython-312.pyc index 9386bf57ce3b97146defdc810d4993759c468aaa..9de73f4c7d386becd3ca965fe039fb7b0bacafd5 100644 GIT binary patch delta 27 hcmdm+u{VSJG%qg~0}#YBd2Hl%U}uck?8E+12LNn82XO!Z delta 27 hcmdm+u{VSJG%qg~0}$w}ciYJAz|N?@*@yk34ghf&2fP3P diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/client_reqrep.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/client_reqrep.cpython-312.pyc index 77e266e9260b3ebaff90ee799db670ec52626073..656e3ad0071769182607bf43265e5f42d49d946b 100644 GIT binary patch delta 29 jcmZ4YlX=}wX71Cxyj%=G5YObXk=v7#F=lfpXXIx9i#G_s delta 29 jcmZ4YlX=}wX71Cxyj%=GptIg>Bey3fqyFYl&dARIkPrzA diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/client_ws.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/client_ws.cpython-312.pyc index d11ef368957f1c14b9dc791a106c14265208441e..26b2cdb34865ddffd7ad2039da3b21e9b369eeb4 100644 GIT binary patch delta 29 jcmaE|p7F_gM()$Ryj%=G5YObXk$VLTW6b6)EC#^BlijxM*YoOSPX&zkDLg~ diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/compression_utils.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/compression_utils.cpython-312.pyc index 9f1172b47e105c00da05f6a1d87ad761dbda11d2..67e18e50a0ad450182c6df959daa5a7980bffacb 100644 GIT binary patch delta 27 hcmZ2cwxW#tG%qg~0}#YBd2HlvXJ(AqJehf_IRI^W2bcf= delta 27 hcmZ2cwxW#tG%qg~0}$w}ciYI_&djL4c{1}BX=DqqkeN2=k_j6#_O^GyN3!& diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-312.pyc index ab8507ab432f39d472a052787501adc41d88e280..012777314b9eba856f24874936b3bebc689bbce1 100644 GIT binary patch delta 29 jcmX@Robl{(M()$Ryj%=G5YObXk(-N$F=n$E&vthJeSQa! delta 29 jcmX@Robl{(M()$Ryj%=GptIg>BR3ZhqyA#II diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-312.pyc index 8c19f68152d7f0563e33040f536fb2ac87a7c0d5..3806245aa4efd9c2cfae7ca90c9efb4293ebf801 100644 GIT binary patch delta 27 hcmdmGy~~>WG%qg~0}#YBd2Hl%U}cQi?8BNT0RUmC26g}d delta 27 hcmdmGy~~>WG%qg~0}$w}ciYJAz{;q<*@rbx0sv-$2EhOT diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/hdrs.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/hdrs.cpython-312.pyc index 5f97d7b0986a2c83550b4433f92c35b4e40668ed..f2f2e21d13a10fb05066868f7c017c8349bbf4c2 100644 GIT binary patch delta 27 hcmbQ`G|P$mG%qg~0}#YBd2Hm)m1KBlkC6#$S_}_#QFpZ+^-rHU$9VH4I+> diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/http.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/http.cpython-312.pyc index f36cb36e342b9f976e09189795f4a335cdd6b79c..fc08ed418786cf30c2dab40a324eaa8806bf4678 100644 GIT binary patch delta 26 gcmeC??dIh^&CAQh00i+&9viu5urkI>Uc&ku08J(atpET3 delta 26 gcmeC??dIh^&CAQh00cVg-8OR1U}e;wyoB{R08z9C_y7O^ diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/http_exceptions.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/http_exceptions.cpython-312.pyc index cbae997eceac8e1aa0cb0d82f62f7386e25499f9..6adb23069c2963a0af912e6346938137b127c3da 100644 GIT binary patch delta 27 hcmZoLXfWVD&CAQh00i+&9vivMSQukAJF)B&1^`pZ1|a|d delta 27 hcmZoLXfWVD&CAQh00cVg-8OQYu`udyc4FBl3;BlmPpM*Yo;IcGaF{@QHs`_UEv$Sn)q diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-312.pyc index f4f8f173431d706ccaa584a18ae58f6afd15452a..67d38fce4b8c9e95a5809edfe1d51731c9e547d5 100644 GIT binary patch delta 26 gcmX@iewdy6G%qg~0}#YBd2Hl1VrGn)Y{%RR08$_Y-v9sr delta 26 gcmX@iewdy6G%qg~0}$w}ciYHq#LTEa*^apt09LLBDgXcg diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/http_writer.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/http_writer.cpython-312.pyc index 3e6273e76ce32e7e8d88e11ef6967504a9eed00b..da2484633ad08955815d91db87e0668a2e78ec6f 100644 GIT binary patch delta 27 hcmdm6xVMn|G%qg~0}#YBd2HkkWMPci9Lthm0sw8J2NnPT delta 27 hcmdm6xVMn|G%qg~0}$w}ciYGv$ik?Blk2mM*Yo;*m#cv0Dsj8Z2$lO diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/payload.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/payload.cpython-312.pyc index 24a00573305babf27956fe3a07749a0ec0275254..0181c70545258d3728da46c506622b084d716345 100644 GIT binary patch delta 29 jcmX@{i|NEKChpU`yj%=G5YObXk$W=-W6b9L9GzPLmPZM< delta 29 kcmX@{i|NEKChpU`yj%=GptIg>Bll(wM*YqEIXbrh0Gl8R0ssI2 diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/payload_streamer.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/payload_streamer.cpython-312.pyc index 4fb38e0d49da1e4e632691cafc39ed9d9ef5eea9..61c655fdd66aa10929f083382df853ccf87da2a6 100644 GIT binary patch delta 27 hcmdm>v_XmcG%qg~0}#YBd2Hk^U}cQiT*JDB8vtFd2FU;b delta 27 hcmdm>v_XmcG%qg~0}$w}ciYHaz{;qBex$jqyFY7=EgG%qg~0}#YBd2HmK!^9Y~c?FX*3jk)q2JZj> delta 27 hcmaFO`gG%qg~0}$w}ciYH4hlx>t^9m+s765CT2RZ-% diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/tracing.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/tracing.cpython-312.pyc index 6d162e7b0efe404df3dbaed3629b580d0220d253..626ae6a63089b204e3d7fb942ef50f5b2b249169 100644 GIT binary patch delta 29 jcmeC*z}UZmk^3|+FBbz4#4~wpzApd(bm#}7 delta 29 jcmeC*z}UZmk^3|+FBbz4=&X0!$nDC`sJ}UoeO~|odBF$m diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-312.pyc index 579cc514b5af4482548483e83be39893f5e5ce3b..dc1fc66a5ed17e8065780787e66c7adecd34705c 100644 GIT binary patch delta 27 hcmca1cteo;G%qg~0}#YBd2Hl1V_}Th?8GvS1pr?>23!CD delta 27 hcmca1cteo;G%qg~0}$w}ciYHq#=@w-*@@vv!ied<9 delta 29 jcmX?jmGR(JM()$Ryj%=GptIg>Blk>pM*Yo8*=3Rek2?so diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/web_exceptions.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/web_exceptions.cpython-312.pyc index e9c7afe23347fd327312856aa36924b69a8902e0..a4d95d06c1c6bcf57036ab756449672950830d25 100644 GIT binary patch delta 27 hcmbPII;E8RG%qg~0}#YBd2Hma;AV{3+`=uO4*+Mn2Gall delta 27 hcmbPII;E8RG%qg~0}$w}ciYHa!Of_@xrJLm9{_BV2OavHwaX|-h delta 29 jcmZ3}#<-@9k^3|+FBbz4=&X0!$gRfCsK42W{g*WWb{Yq~ diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/web_log.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/web_log.cpython-312.pyc index 53ecbe1331ec40b7220ac2341980fe37de20d630..0ddd319826ffd178e64402847361d61458509448 100644 GIT binary patch delta 27 hcmZ1zye63YG%qg~0}#YBd2HnV%*`0H`9JqsSpaQa2tWV; delta 27 hcmZ1zye63YG%qg~0}$w}ciYJQnVV66^MCHOvH)^62#Wv! diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/web_middlewares.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/web_middlewares.cpython-312.pyc index 381a21b1675205f3b1b895c4608e0c78c7e306b3..23256bbe68bdb6753cd7d28328a2c6457831db97 100644 GIT binary patch delta 34 ocmeyO{Y9JmG%qg~0}#YBd2HmK$IKYBc@=Xa7vrtXJbW+M0j+%r{r~^~ delta 34 pcmeyO{Y9JmG%qg~0}$w}ciYH4kC{<_^D5>m^8M()$Ryj%=G5YObXkz1OLF=nwkTL}PtX$M*W delta 28 icmZ4fg>m^8M()$Ryj%=GptIg>BeyggqyA!bwh{n=_Xni_ diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/web_request.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/web_request.cpython-312.pyc index fadc254a0ff737b4dd1a19ccd49c0f18a6284d6a..fce4632381d20d4f73af21aac265e30ceb202168 100644 GIT binary patch delta 29 jcmdnCmTB8sChpU`yj%=G5YObXk-L_IF=lfohi)GLe%uHP delta 29 jcmdnCmTB8sChpU`yj%=GptIg>BX=zaqyFYj4&6QggS7}& diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-312.pyc index 0ea508156902efa1f4d32a58bfb00805dacf2d51..f77b2931fe340a174fb2630de6b8270737dea148 100644 GIT binary patch delta 29 jcmeC$#MHHkiTgA!FBbz4#4~wp@}&2Gall delta 27 hcmewy^Ern5G%qg~0}$w}ciYG<&&sI3S)0{E699Ig2OaBexebqyFYFW=3}af&T}A diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/web_server.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/web_server.cpython-312.pyc index 1c03e011a7eb9512050da2254edd574bfa52c998..9ff04354b99c26aa4c02c4a1b48876661f774788 100644 GIT binary patch delta 27 hcmZ3iwpfk(G%qg~0}#YBd2Hm~!@?M|`2BX<=yqkeN6_w+Vy#$^DPB?$lk diff --git a/venv/Lib/site-packages/aiohttp/__pycache__/web_ws.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/__pycache__/web_ws.cpython-312.pyc index 9c88afe70011f4bf0a7875633d814136aeb6e205..8a422ef3011b009f55f67a01cd04ccc17d67f304 100644 GIT binary patch delta 29 jcmcckjq&0)M()$Ryj%=G5YObXk$Va&W6b6StQ$)Km5d2w delta 29 kcmcckjq&0)M()$Ryj%=GptIg>Bli?mM*YnTST~je0Gee9uK)l5 diff --git a/venv/Lib/site-packages/aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/_websocket/__pycache__/__init__.cpython-312.pyc index 8cb6a50a15f3f39f394e9365d87a8749abf78929..bb3c4bf6205b4a855e7b6fd0dd28e033dda12870 100644 GIT binary patch delta 35 pcmaFO_?nUXG%qg~0}#YBc}(P9!V?o;o|;sgpPZdq5;JkP0RXaW3nBmj delta 35 pcmaFO_?nUXG%qg~0}$w}cbmw)ghxNVJT<8}KRG+KM1SIL0|2 diff --git a/venv/Lib/site-packages/aiohttp/_websocket/__pycache__/helpers.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/_websocket/__pycache__/helpers.cpython-312.pyc index d018b15aec349d27a40e2175127612f8b41f46bb..18854bdbc5d3ee5875219a5fd1de336fae2ca034 100644 GIT binary patch delta 38 scmcbocTbP|G%qg~0}#YBd2HmiXXS~BFHcP>&QH!xEs5D2#>ycC0MJAV&Hw-a delta 38 scmcbocTbP|G%qg~0}$w}ciYHq&&s18U!Iy&oS&SXTB5%>jFm$O0M|$g>;M1& diff --git a/venv/Lib/site-packages/aiohttp/_websocket/__pycache__/models.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/_websocket/__pycache__/models.cpython-312.pyc index d256c39f0f56805e6b9e1dbb3e1782036e2e94ef..a9fc59e206d90cc08c36f2952f94d392c1a3c649 100644 GIT binary patch delta 38 scmew=^;L@dG%qg~0}#YBd2HnV$jlQHU!Iy&oS&SXS`xFFgC&;}0N#=dkpKVy delta 38 scmew=^;L@dG%qg~0}$w}ciYJQk(oz7zC1OlI6pZ%wM2h22TLv|0OghouK)l5 diff --git a/venv/Lib/site-packages/aiohttp/_websocket/__pycache__/reader.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/_websocket/__pycache__/reader.cpython-312.pyc index 27b7c3ec713bfbc3e900cb64ffe440245151cc41..f309b4e252bb16d21290623c0a770053231d5af3 100644 GIT binary patch delta 37 rcmcc3dYhH|G%qg~0}#YBd2Hl1V&aL3FHcP>&QH!xEs2@z$utQ7xEKnq delta 37 rcmcc3dYhH|G%qg~0}$w}ciYHq#KfZ?U!Iy&oS&SXTB1MMlW7tFzWxf# diff --git a/venv/Lib/site-packages/aiohttp/_websocket/__pycache__/writer.cpython-312.pyc b/venv/Lib/site-packages/aiohttp/_websocket/__pycache__/writer.cpython-312.pyc index 037316cafa8a24d5d615d46c61db54300325d66f..94a0755390b05f22a637418b20a33ea7d5f628f2 100644 GIT binary patch delta 38 scmca)c*&6aG%qg~0}#YBd2Hmq$i@>BU!Iy&oS&SXS`xGQ1=}k@0NpJN!vFvP delta 38 scmca)c*&6aG%qg~0}$w}ciYH)k&Q<`zC1OlI6pZ%wM2jO3$|B+0OT diff --git a/venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/INSTALLER b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/INSTALLER similarity index 100% rename from venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/INSTALLER rename to venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/INSTALLER diff --git a/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/LICENSE b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/LICENSE new file mode 100644 index 00000000..175ff4ab --- /dev/null +++ b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/LICENSE @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright (c) 2020 aiohttp_retry Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/METADATA b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/METADATA new file mode 100644 index 00000000..8f6a5f96 --- /dev/null +++ b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/METADATA @@ -0,0 +1,261 @@ +Metadata-Version: 2.1 +Name: aiohttp-retry +Version: 2.9.1 +Summary: Simple retry client for aiohttp +Home-page: https://github.com/inyutin/aiohttp_retry +Author: Dmitry Inyutin +Author-email: inyutin.da@gmail.com +License: MIT +Keywords: aiohttp retry client +Platform: any +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +License-File: LICENSE +License-File: AUTHORS +Requires-Dist: aiohttp + +# Simple aiohttp retry client + +Python 3.7 or higher. + +**Install**: `pip install aiohttp-retry`. + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/inyutin) + + +### Breaking API changes +- Everything between [2.7.0 - 2.8.3) is yanked. +There is a bug with evaluate_response_callback, it led to infinite retries + +- 2.8.0 is incorrect and yanked. +https://github.com/inyutin/aiohttp_retry/issues/79 + +- Since 2.5.6 this is a new parameter in ```get_timeout``` func called "response". +If you have defined your own ```RetryOptions```, you should add this param into it. +Issue about this: https://github.com/inyutin/aiohttp_retry/issues/59 + +### Examples of usage: +```python +from aiohttp_retry import RetryClient, ExponentialRetry + +async def main(): + retry_options = ExponentialRetry(attempts=1) + retry_client = RetryClient(raise_for_status=False, retry_options=retry_options) + async with retry_client.get('https://ya.ru') as response: + print(response.status) + + await retry_client.close() +``` + +```python +from aiohttp import ClientSession +from aiohttp_retry import RetryClient + +async def main(): + client_session = ClientSession() + retry_client = RetryClient(client_session=client_session) + async with retry_client.get('https://ya.ru') as response: + print(response.status) + + await client_session.close() +``` + +```python +from aiohttp_retry import RetryClient, RandomRetry + +async def main(): + retry_options = RandomRetry(attempts=1) + retry_client = RetryClient(raise_for_status=False, retry_options=retry_options) + + response = await retry_client.get('/ping') + print(response.status) + + await retry_client.close() +``` + +```python +from aiohttp_retry import RetryClient + +async def main(): + async with RetryClient() as client: + async with client.get('https://ya.ru') as response: + print(response.status) +``` + +You can change parameters between attempts by passing multiple requests params: +```python +from aiohttp_retry import RetryClient, RequestParams, ExponentialRetry + +async def main(): + retry_client = RetryClient(raise_for_status=False) + + async with retry_client.requests( + params_list=[ + RequestParams( + method='GET', + url='https://ya.ru', + ), + RequestParams( + method='GET', + url='https://ya.ru', + headers={'some_header': 'some_value'}, + ), + ] + ) as response: + print(response.status) + + await retry_client.close() +``` + +You can also add some logic, F.E. logging, on failures by using trace mechanic. +```python +import logging +import sys +from types import SimpleNamespace + +from aiohttp import ClientSession, TraceConfig, TraceRequestStartParams + +from aiohttp_retry import RetryClient, ExponentialRetry + + +handler = logging.StreamHandler(sys.stdout) +logging.basicConfig(handlers=[handler]) +logger = logging.getLogger(__name__) +retry_options = ExponentialRetry(attempts=2) + + +async def on_request_start( + session: ClientSession, + trace_config_ctx: SimpleNamespace, + params: TraceRequestStartParams, +) -> None: + current_attempt = trace_config_ctx.trace_request_ctx['current_attempt'] + if retry_options.attempts <= current_attempt: + logger.warning('Wow! We are in last attempt') + + +async def main(): + trace_config = TraceConfig() + trace_config.on_request_start.append(on_request_start) + retry_client = RetryClient(retry_options=retry_options, trace_configs=[trace_config]) + + response = await retry_client.get('https://httpstat.us/503', ssl=False) + print(response.status) + + await retry_client.close() +``` +Look tests for more examples. \ +**Be aware: last request returns as it is.** +**If the last request ended with exception, that this exception will be raised from RetryClient request** + +### Documentation +`RetryClient` takes the same arguments as ClientSession[[docs](https://docs.aiohttp.org/en/stable/client_reference.html)] \ +`RetryClient` has methods: +- request +- get +- options +- head +- post +- put +- patch +- put +- delete + +They are same as for `ClientSession`, but take one possible additional argument: +```python +class RetryOptionsBase: + def __init__( + self, + attempts: int = 3, # How many times we should retry + statuses: Iterable[int] | None = None, # On which statuses we should retry + exceptions: Iterable[type[Exception]] | None = None, # On which exceptions we should retry, by default on all + retry_all_server_errors: bool = True, # If should retry all 500 errors or not + # a callback that will run on response to decide if retry + evaluate_response_callback: EvaluateResponseCallbackType | None = None, + ): + ... + + @abc.abstractmethod + def get_timeout(self, attempt: int, response: Optional[Response] = None) -> float: + raise NotImplementedError + +``` +You can specify `RetryOptions` both for `RetryClient` and it's methods. +`RetryOptions` in methods override `RetryOptions` defined in `RetryClient` constructor. + +**Important**: by default all 5xx responses are retried + statuses you specified as ```statuses``` param +If you will pass ```retry_all_server_errors=False``` than you can manually set what 5xx errors to retry. + +You can define your own timeouts logic or use: +- ```ExponentialRetry``` with exponential backoff +- ```RandomRetry``` for random backoff +- ```ListRetry``` with backoff you predefine by list +- ```FibonacciRetry``` with backoff that looks like fibonacci sequence +- ```JitterRetry``` exponential retry with a bit of randomness + +**Important**: you can proceed server response as an parameter for calculating next timeout. +However this response can be None, server didn't make a response or you have set up ```raise_for_status=True``` +Look here for an example: https://github.com/inyutin/aiohttp_retry/issues/59 + +Additionally, you can specify ```evaluate_response_callback```. It receive a ```ClientResponse``` and decide to retry or not by returning a bool. +It can be useful, if server API sometimes response with malformed data. + +#### Request Trace Context +`RetryClient` add *current attempt number* to `request_trace_ctx` (see examples, +for more info see [aiohttp doc](https://docs.aiohttp.org/en/stable/client_advanced.html#aiohttp-client-tracing)). + +### Change parameters between retries +`RetryClient` also has a method called `requests`. This method should be used if you want to make requests with different params. +```python +@dataclass +class RequestParams: + method: str + url: _RAW_URL_TYPE + headers: dict[str, Any] | None = None + trace_request_ctx: dict[str, Any] | None = None + kwargs: dict[str, Any] | None = None +``` + +```python +def requests( + self, + params_list: list[RequestParams], + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, +) -> _RequestContext: +``` + +You can find an example of usage above or in tests. +But basically `RequestParams` is a structure to define params for `ClientSession.request` func. +`method`, `url`, `headers` `trace_request_ctx` defined outside kwargs, because they are popular. + +There is also an old way to change URL between retries by specifying ```url``` as list of urls. Example: +```python +from aiohttp_retry import RetryClient + +retry_client = RetryClient() +async with retry_client.get(url=['/internal_error', '/ping']) as response: + text = await response.text() + assert response.status == 200 + assert text == 'Ok!' + +await retry_client.close() +``` + +In this example we request ```/interval_error```, fail and then successfully request ```/ping```. +If you specify less urls than ```attempts``` number in ```RetryOptions```, ```RetryClient``` will request last url at last attempts. +This means that in example above we would request ```/ping``` once again in case of failure. + +### Types + +`aiohttp_retry` is a typed project. It should be fully compatible with mypy. + +It also introduce one special type: +``` +ClientType = Union[ClientSession, RetryClient] +``` + +This type can be imported by ```from aiohttp_retry.types import ClientType``` diff --git a/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/RECORD b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/RECORD new file mode 100644 index 00000000..c04cce82 --- /dev/null +++ b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/RECORD @@ -0,0 +1,16 @@ +aiohttp_retry-2.9.1.dist-info/AUTHORS,sha256=GlJRXBnogod3eAzFrL3YBj8lrNy1PVoeaKCnNm2zN5M,38 +aiohttp_retry-2.9.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +aiohttp_retry-2.9.1.dist-info/LICENSE,sha256=rKYSbPXF6EyrQeo7xh9TV4YWMWqD6-EwzeDUt2boof4,1087 +aiohttp_retry-2.9.1.dist-info/METADATA,sha256=NVvnJQd6heUBRFSC8S1AR5TtTODUR4JmoY3grJKfkwg,8750 +aiohttp_retry-2.9.1.dist-info/RECORD,, +aiohttp_retry-2.9.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +aiohttp_retry-2.9.1.dist-info/top_level.txt,sha256=b-4ybD7H7PD7sNUDod6pes6gfHuEde1xETO4fHqAMog,14 +aiohttp_retry/__init__.py,sha256=YIVHUfIbOL5QhMEOs7cQlyrmm57o2SgjYC_V-P0aUes,79 +aiohttp_retry/__pycache__/__init__.cpython-312.pyc,, +aiohttp_retry/__pycache__/client.cpython-312.pyc,, +aiohttp_retry/__pycache__/retry_options.cpython-312.pyc,, +aiohttp_retry/__pycache__/types.cpython-312.pyc,, +aiohttp_retry/client.py,sha256=VjrglGKv8KPyVXn1RLnv3vXcAm83m8WDJyXX9Pds_yo,12328 +aiohttp_retry/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +aiohttp_retry/retry_options.py,sha256=l9k-P_0v-K7Q9F1wY2Z_jjUNlhplH2_F9zZ73xZ-El0,9014 +aiohttp_retry/types.py,sha256=lO3nb__G8p1jWBcD9ptKh_YHgEy6pPOH_HCNM69BH8s,141 diff --git a/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/WHEEL b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/WHEEL new file mode 100644 index 00000000..98c0d20b --- /dev/null +++ b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.42.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/top_level.txt b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/top_level.txt new file mode 100644 index 00000000..ea6602f9 --- /dev/null +++ b/venv/Lib/site-packages/aiohttp_retry-2.9.1.dist-info/top_level.txt @@ -0,0 +1 @@ +aiohttp_retry diff --git a/venv/Lib/site-packages/aiohttp_retry/__init__.py b/venv/Lib/site-packages/aiohttp_retry/__init__.py new file mode 100644 index 00000000..25968d59 --- /dev/null +++ b/venv/Lib/site-packages/aiohttp_retry/__init__.py @@ -0,0 +1,2 @@ +from .client import * # noqa: F403 +from .retry_options import * # noqa: F403 diff --git a/venv/Lib/site-packages/aiohttp_retry/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/aiohttp_retry/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e07ead011eb467e98274ffceed539b07b262bc36 GIT binary patch literal 234 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 VDC=h2pR65Ynf=Vighq7F{Wny5L<;}_ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/aiohttp_retry/__pycache__/retry_options.cpython-312.pyc b/venv/Lib/site-packages/aiohttp_retry/__pycache__/retry_options.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f2afc8619b031a9c9f995e1662b9fcf07d870b8 GIT binary patch literal 8763 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/aiohttp_retry/client.py b/venv/Lib/site-packages/aiohttp_retry/client.py new file mode 100644 index 00000000..42d55e1a --- /dev/null +++ b/venv/Lib/site-packages/aiohttp_retry/client.py @@ -0,0 +1,415 @@ +from __future__ import annotations + +import asyncio +import logging +import sys +from abc import abstractmethod +from dataclasses import dataclass +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Generator, + List, + Tuple, + Union, +) + +from aiohttp import ClientResponse, ClientSession, hdrs +from aiohttp.typedefs import StrOrURL +from yarl import URL as YARL_URL + +from .retry_options import ExponentialRetry, RetryOptionsBase + +_MIN_SERVER_ERROR_STATUS = 500 + +if TYPE_CHECKING: + from types import TracebackType + +if sys.version_info >= (3, 8): + from typing import Protocol +else: + from typing_extensions import Protocol + + +class _Logger(Protocol): + """_Logger defines which methods logger object should have.""" + + @abstractmethod + def debug(self, msg: str, *args: Any, **kwargs: Any) -> None: + pass + + @abstractmethod + def warning(self, msg: str, *args: Any, **kwargs: Any) -> None: + pass + + @abstractmethod + def exception(self, msg: str, *args: Any, **kwargs: Any) -> None: + pass + + +# url itself or list of urls for changing between retries +_RAW_URL_TYPE = Union[StrOrURL, YARL_URL] +_URL_TYPE = Union[_RAW_URL_TYPE, List[_RAW_URL_TYPE], Tuple[_RAW_URL_TYPE, ...]] +_LoggerType = Union[_Logger, logging.Logger] + +RequestFunc = Callable[..., Awaitable[ClientResponse]] + + +@dataclass +class RequestParams: + method: str + url: _RAW_URL_TYPE + headers: dict[str, Any] | None = None + trace_request_ctx: dict[str, Any] | None = None + kwargs: dict[str, Any] | None = None + + +class _RequestContext: + def __init__( + self, + request_func: RequestFunc, + params_list: list[RequestParams], + logger: _LoggerType, + retry_options: RetryOptionsBase, + raise_for_status: bool = False, + ) -> None: + assert len(params_list) > 0 # noqa: S101 + + self._request_func = request_func + self._params_list = params_list + self._logger = logger + self._retry_options = retry_options + self._raise_for_status = raise_for_status + + self._response: ClientResponse | None = None + + async def _is_skip_retry(self, current_attempt: int, response: ClientResponse) -> bool: + if current_attempt == self._retry_options.attempts: + return True + + if response.method.upper() not in self._retry_options.methods: + return True + + if response.status >= _MIN_SERVER_ERROR_STATUS and self._retry_options.retry_all_server_errors: + return False + + if response.status in self._retry_options.statuses: + return False + + if self._retry_options.evaluate_response_callback is None: + return True + + return await self._retry_options.evaluate_response_callback(response) + + async def _do_request(self) -> ClientResponse: + current_attempt = 0 + + while True: + self._logger.debug(f"Attempt {current_attempt+1} out of {self._retry_options.attempts}") + + current_attempt += 1 + try: + try: + params = self._params_list[current_attempt - 1] + except IndexError: + params = self._params_list[-1] + + response: ClientResponse = await self._request_func( + params.method, + params.url, + headers=params.headers, + trace_request_ctx={ + "current_attempt": current_attempt, + **(params.trace_request_ctx or {}), + }, + **(params.kwargs or {}), + ) + + debug_message = f"Retrying after response code: {response.status}" + skip_retry = await self._is_skip_retry(current_attempt, response) + + if skip_retry: + if self._raise_for_status: + response.raise_for_status() + self._response = response + return self._response + retry_wait = self._retry_options.get_timeout(attempt=current_attempt, response=response) + + except Exception as e: + if current_attempt >= self._retry_options.attempts: + raise + + is_exc_valid = any(isinstance(e, exc) for exc in self._retry_options.exceptions) + if not is_exc_valid: + raise + + debug_message = f"Retrying after exception: {e!r}" + retry_wait = self._retry_options.get_timeout(attempt=current_attempt, response=None) + + self._logger.debug(debug_message) + await asyncio.sleep(retry_wait) + + def __await__(self) -> Generator[Any, None, ClientResponse]: + return self.__aenter__().__await__() + + async def __aenter__(self) -> ClientResponse: + return await self._do_request() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + if self._response is not None and not self._response.closed: + self._response.close() + + +def _url_to_urls(url: _URL_TYPE) -> tuple[StrOrURL, ...]: + if isinstance(url, (str, YARL_URL)): + return (url,) + + if isinstance(url, list): + urls = tuple(url) + elif isinstance(url, tuple): + urls = url + else: + msg = "you can pass url only by str or list/tuple" # type: ignore[unreachable] + raise ValueError(msg) # noqa: TRY004 + + if len(urls) == 0: + msg = "you can pass url by str or list/tuple with attempts count size" + raise ValueError(msg) + + return urls + + +class RetryClient: + def __init__( + self, + client_session: ClientSession | None = None, + logger: _LoggerType | None = None, + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool = False, + *args: Any, + **kwargs: Any, + ) -> None: + if client_session is not None: + client = client_session + closed = None + else: + client = ClientSession(*args, **kwargs) + closed = False + + self._client = client + self._closed = closed + + self._logger: _LoggerType = logger or logging.getLogger("aiohttp_retry") + self._retry_options: RetryOptionsBase = retry_options or ExponentialRetry() + self._raise_for_status = raise_for_status + + @property + def retry_options(self) -> RetryOptionsBase: + return self._retry_options + + def requests( + self, + params_list: list[RequestParams], + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + ) -> _RequestContext: + return self._make_requests( + params_list=params_list, + retry_options=retry_options, + raise_for_status=raise_for_status, + ) + + def request( + self, + method: str, + url: StrOrURL, + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + **kwargs: Any, + ) -> _RequestContext: + return self._make_request( + method=method, + url=url, + retry_options=retry_options, + raise_for_status=raise_for_status, + **kwargs, + ) + + def get( + self, + url: _URL_TYPE, + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + **kwargs: Any, + ) -> _RequestContext: + return self._make_request( + method=hdrs.METH_GET, + url=url, + retry_options=retry_options, + raise_for_status=raise_for_status, + **kwargs, + ) + + def options( + self, + url: _URL_TYPE, + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + **kwargs: Any, + ) -> _RequestContext: + return self._make_request( + method=hdrs.METH_OPTIONS, + url=url, + retry_options=retry_options, + raise_for_status=raise_for_status, + **kwargs, + ) + + def head( + self, + url: _URL_TYPE, + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + **kwargs: Any, + ) -> _RequestContext: + return self._make_request( + method=hdrs.METH_HEAD, + url=url, + retry_options=retry_options, + raise_for_status=raise_for_status, + **kwargs, + ) + + def post( + self, + url: _URL_TYPE, + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + **kwargs: Any, + ) -> _RequestContext: + return self._make_request( + method=hdrs.METH_POST, + url=url, + retry_options=retry_options, + raise_for_status=raise_for_status, + **kwargs, + ) + + def put( + self, + url: _URL_TYPE, + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + **kwargs: Any, + ) -> _RequestContext: + return self._make_request( + method=hdrs.METH_PUT, + url=url, + retry_options=retry_options, + raise_for_status=raise_for_status, + **kwargs, + ) + + def patch( + self, + url: _URL_TYPE, + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + **kwargs: Any, + ) -> _RequestContext: + return self._make_request( + method=hdrs.METH_PATCH, + url=url, + retry_options=retry_options, + raise_for_status=raise_for_status, + **kwargs, + ) + + def delete( + self, + url: _URL_TYPE, + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + **kwargs: Any, + ) -> _RequestContext: + return self._make_request( + method=hdrs.METH_DELETE, + url=url, + retry_options=retry_options, + raise_for_status=raise_for_status, + **kwargs, + ) + + async def close(self) -> None: + await self._client.close() + self._closed = True + + def _make_request( + self, + method: str, + url: _URL_TYPE, + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + **kwargs: Any, + ) -> _RequestContext: + url_list = _url_to_urls(url) + params_list = [ + RequestParams( + method=method, + url=url, + headers=kwargs.pop("headers", {}), + trace_request_ctx=kwargs.pop("trace_request_ctx", None), + kwargs=kwargs, + ) + for url in url_list + ] + + return self._make_requests( + params_list=params_list, + retry_options=retry_options, + raise_for_status=raise_for_status, + ) + + def _make_requests( + self, + params_list: list[RequestParams], + retry_options: RetryOptionsBase | None = None, + raise_for_status: bool | None = None, + ) -> _RequestContext: + if retry_options is None: + retry_options = self._retry_options + if raise_for_status is None: + raise_for_status = self._raise_for_status + return _RequestContext( + request_func=self._client.request, + params_list=params_list, + logger=self._logger, + retry_options=retry_options, + raise_for_status=raise_for_status, + ) + + async def __aenter__(self) -> RetryClient: # noqa: PYI034 + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + await self.close() + + def __del__(self) -> None: + if getattr(self, "_closed", None) is None: + # in case object was not initialized (__init__ raised an exception) + return + + if not self._closed: + self._logger.warning("Aiohttp retry client was not closed") diff --git a/venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/REQUESTED b/venv/Lib/site-packages/aiohttp_retry/py.typed similarity index 100% rename from venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/REQUESTED rename to venv/Lib/site-packages/aiohttp_retry/py.typed diff --git a/venv/Lib/site-packages/aiohttp_retry/retry_options.py b/venv/Lib/site-packages/aiohttp_retry/retry_options.py new file mode 100644 index 00000000..2af17fa6 --- /dev/null +++ b/venv/Lib/site-packages/aiohttp_retry/retry_options.py @@ -0,0 +1,228 @@ +from __future__ import annotations + +import abc +import random +from typing import Any, Awaitable, Callable, Iterable +from warnings import warn + +from aiohttp import ClientResponse + +EvaluateResponseCallbackType = Callable[[ClientResponse], Awaitable[bool]] + + +class RetryOptionsBase: + def __init__( + self, + attempts: int = 3, # How many times we should retry + statuses: Iterable[int] | None = None, # On which statuses we should retry + exceptions: Iterable[type[Exception]] | None = None, # On which exceptions we should retry, by default on all + methods: Iterable[str] | None = None, # On which HTTP methods we should retry + retry_all_server_errors: bool = True, # If should retry all 500 errors or not + # a callback that will run on response to decide if retry + evaluate_response_callback: EvaluateResponseCallbackType | None = None, + ) -> None: + self.attempts: int = attempts + if statuses is None: + statuses = set() + self.statuses: Iterable[int] = statuses + + if exceptions is None: + exceptions = set() + self.exceptions: Iterable[type[Exception]] = exceptions + + if methods is None: + methods = {"HEAD", "GET", "PUT", "DELETE", "OPTIONS", "TRACE", "POST", "CONNECT", "PATCH"} + self.methods: Iterable[str] = {method.upper() for method in methods} + + self.retry_all_server_errors = retry_all_server_errors + self.evaluate_response_callback = evaluate_response_callback + + @abc.abstractmethod + def get_timeout(self, attempt: int, response: ClientResponse | None = None) -> float: + raise NotImplementedError + + +class ExponentialRetry(RetryOptionsBase): + def __init__( + self, + attempts: int = 3, # How many times we should retry + start_timeout: float = 0.1, # Base timeout time, then it exponentially grow + max_timeout: float = 30.0, # Max possible timeout between tries + factor: float = 2.0, # How much we increase timeout each time + statuses: set[int] | None = None, # On which statuses we should retry + exceptions: set[type[Exception]] | None = None, # On which exceptions we should retry + methods: set[str] | None = None, # On which HTTP methods we should retry + retry_all_server_errors: bool = True, + evaluate_response_callback: EvaluateResponseCallbackType | None = None, + ) -> None: + super().__init__( + attempts=attempts, + statuses=statuses, + exceptions=exceptions, + methods=methods, + retry_all_server_errors=retry_all_server_errors, + evaluate_response_callback=evaluate_response_callback, + ) + + self._start_timeout: float = start_timeout + self._max_timeout: float = max_timeout + self._factor: float = factor + + def get_timeout( + self, + attempt: int, + response: ClientResponse | None = None, # noqa: ARG002 + ) -> float: + """Return timeout with exponential backoff.""" + timeout = self._start_timeout * (self._factor**attempt) + return min(timeout, self._max_timeout) + + +def RetryOptions(*args: Any, **kwargs: Any) -> ExponentialRetry: # noqa: N802 + warn("RetryOptions is deprecated, use ExponentialRetry", stacklevel=1) + return ExponentialRetry(*args, **kwargs) + + +class RandomRetry(RetryOptionsBase): + def __init__( + self, + attempts: int = 3, # How many times we should retry + statuses: Iterable[int] | None = None, # On which statuses we should retry + exceptions: Iterable[type[Exception]] | None = None, # On which exceptions we should retry + methods: Iterable[str] | None = None, # On which HTTP methods we should retry + min_timeout: float = 0.1, # Minimum possible timeout + max_timeout: float = 3.0, # Maximum possible timeout between tries + random_func: Callable[[], float] = random.random, # Random number generator + retry_all_server_errors: bool = True, + evaluate_response_callback: EvaluateResponseCallbackType | None = None, + ) -> None: + super().__init__( + attempts=attempts, + statuses=statuses, + exceptions=exceptions, + methods=methods, + retry_all_server_errors=retry_all_server_errors, + evaluate_response_callback=evaluate_response_callback, + ) + + self.attempts: int = attempts + self.min_timeout: float = min_timeout + self.max_timeout: float = max_timeout + self.random = random_func + + def get_timeout( + self, + attempt: int, # noqa: ARG002 + response: ClientResponse | None = None, # noqa: ARG002 + ) -> float: + """Generate random timeouts.""" + return self.min_timeout + self.random() * (self.max_timeout - self.min_timeout) + + +class ListRetry(RetryOptionsBase): + def __init__( + self, + timeouts: list[float], + statuses: Iterable[int] | None = None, # On which statuses we should retry + exceptions: Iterable[type[Exception]] | None = None, # On which exceptions we should retry + methods: Iterable[str] | None = None, # On which HTTP methods we should retry + retry_all_server_errors: bool = True, + evaluate_response_callback: EvaluateResponseCallbackType | None = None, + ) -> None: + super().__init__( + attempts=len(timeouts), + statuses=statuses, + exceptions=exceptions, + methods=methods, + retry_all_server_errors=retry_all_server_errors, + evaluate_response_callback=evaluate_response_callback, + ) + self.timeouts = timeouts + + def get_timeout( + self, + attempt: int, + response: ClientResponse | None = None, # noqa: ARG002 + ) -> float: + """Timeouts from a defined list.""" + return self.timeouts[attempt] + + +class FibonacciRetry(RetryOptionsBase): + def __init__( + self, + attempts: int = 3, + multiplier: float = 1.0, + statuses: Iterable[int] | None = None, + exceptions: Iterable[type[Exception]] | None = None, + methods: Iterable[str] | None = None, + max_timeout: float = 3.0, # Maximum possible timeout between tries + retry_all_server_errors: bool = True, + evaluate_response_callback: EvaluateResponseCallbackType | None = None, + ) -> None: + super().__init__( + attempts=attempts, + statuses=statuses, + exceptions=exceptions, + methods=methods, + retry_all_server_errors=retry_all_server_errors, + evaluate_response_callback=evaluate_response_callback, + ) + + self.max_timeout = max_timeout + self.multiplier = multiplier + self.prev_step = 1.0 + self.current_step = 1.0 + + def get_timeout( + self, + attempt: int, # noqa: ARG002 + response: ClientResponse | None = None, # noqa: ARG002 + ) -> float: + new_current_step = self.prev_step + self.current_step + self.prev_step = self.current_step + self.current_step = new_current_step + + return min(self.multiplier * new_current_step, self.max_timeout) + + +class JitterRetry(ExponentialRetry): + """https://github.com/inyutin/aiohttp_retry/issues/44.""" + + def __init__( + self, + attempts: int = 3, # How many times we should retry + start_timeout: float = 0.1, # Base timeout time, then it exponentially grow + max_timeout: float = 30.0, # Max possible timeout between tries + factor: float = 2.0, # How much we increase timeout each time + statuses: set[int] | None = None, # On which statuses we should retry + exceptions: set[type[Exception]] | None = None, # On which exceptions we should retry + methods: set[str] | None = None, # On which HTTP methods we should retry + random_interval_size: float = 2.0, # size of interval for random component + retry_all_server_errors: bool = True, + evaluate_response_callback: EvaluateResponseCallbackType | None = None, + ) -> None: + super().__init__( + attempts=attempts, + start_timeout=start_timeout, + max_timeout=max_timeout, + factor=factor, + statuses=statuses, + exceptions=exceptions, + methods=methods, + retry_all_server_errors=retry_all_server_errors, + evaluate_response_callback=evaluate_response_callback, + ) + + self._start_timeout: float = start_timeout + self._max_timeout: float = max_timeout + self._factor: float = factor + self._random_interval_size = random_interval_size + + def get_timeout( + self, + attempt: int, + response: ClientResponse | None = None, # noqa: ARG002 + ) -> float: + timeout: float = super().get_timeout(attempt) + random.uniform(0, self._random_interval_size) ** self._factor + return timeout diff --git a/venv/Lib/site-packages/aiohttp_retry/types.py b/venv/Lib/site-packages/aiohttp_retry/types.py new file mode 100644 index 00000000..b14af2ab --- /dev/null +++ b/venv/Lib/site-packages/aiohttp_retry/types.py @@ -0,0 +1,7 @@ +from typing import Union + +from aiohttp import ClientSession + +from .client import RetryClient + +ClientType = Union[ClientSession, RetryClient] diff --git a/venv/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-312.pyc index b9d5b3050bc47ffa3e20f62765c41bf0aa80123f..b71f7a19ffb00e6fa062d43c450ae575c14c62b7 100644 GIT binary patch delta 29 jcmey#^OJ}7G%qg~0}#YBd1SP2`%Pv5e!2*k delta 29 jcmew;_EC)YG%qg~0}yDecgu*`$lJxvsK0pz`%Pv5fd>eg diff --git a/venv/Lib/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc index b8e703ce96e2f814e2c8e7c075eb6a45b536ca44..574479a4c8d796e3d8ffad546db5546378c9442e 100644 GIT binary patch delta 34 ocmdnOxP_7XG%qg~0}#YBc}(Ok>F_;5*IB%f$c$@k|~W{1qGdUh#9s#3v;tXQ$?+6vs3(3v6c=VC?w@04?4P A)&Kwi delta 46 zcmeD0<>>F_;5*IB%f$c$8tdIM_;WY%z2fKAk55WW&Q8rsDb{ah7TC@#z}WK*05shV A9{{wT3Qqt4 delta 35 pcmdmIxX+OHG%qg~0}yDecgqOh$m`F^t{9{{fx3Bv#Y diff --git a/venv/Lib/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc b/venv/Lib/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc index 2a05c016af0dbeaf195e77821e185e5d7406b2cf..8068fcfbb9bc788e7e75864dcb5c3f46ec22bc51 100644 GIT binary patch delta 36 qcmZ3Wzd)bwG%qg~0}#YBd1UDFZRC?=W{-(a&M!)h*{sK0Bmw}QRtWR} delta 36 qcmZ3Wzd)bwG%qg~0}yDecgtAMyOB?lnO#3VIlm}Xf3qHQkq7{;g9(oS diff --git a/venv/Lib/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc b/venv/Lib/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc index 637df5cbb76a9adb7db0a8061d5e861f2277c4ab..c6331f50ca4ac5b391dc5b0b51a62785a7b1f913 100644 GIT binary patch delta 38 scmZoa%G7?8iSINoFBbz4#4~wh2*qvW6Xjr!iBHZiN{!j9#SuFT0LRPFQEJTQBOKX90Pb=OhX4Qo delta 38 scmZ4gjdA@qM!wU$yj%=Gpt0U9gD-0%-+B&q{rKekqE!9OM>w*J0P_tDh5!Hn diff --git a/venv/Lib/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc b/venv/Lib/site-packages/anyio/_core/__pycache__/_streams.cpython-312.pyc index 7114a153affd8918dcae750994770daad5c29654..e43947081123a43f2a14a9da0f3d1ee46ae25dbc 100644 GIT binary patch delta 35 pcmbOtG)0K_G%qg~0}#YBd1N?j_Mu30D9B delta 35 pcmbOtG)0K_G%qg~0}yDecgx_}$eYZ@t{&{$@U=Cp-YpV+&6J diff --git a/venv/Lib/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc index 683587297a6d8a9b767267a9c569cc58b5627c75..b8c7b174753e7d94e05d8425dd6255d7fd255482 100644 GIT binary patch delta 32 mcmZ1>xI&QkG%qg~0}#YBd1Or9$h(@IH6}4BIcD-+_SXQ1qzR}1 delta 32 mcmZ1>xI&QkG%qg~0}yDecgu*`$h(@IRX;H)S%30g_SXQ3=n0De diff --git a/venv/Lib/site-packages/anyio/abc/__pycache__/_eventloop.cpython-312.pyc b/venv/Lib/site-packages/anyio/abc/__pycache__/_eventloop.cpython-312.pyc index 5a27ccfe1ca985336980884712c33365284c6dff..58ed0c9d2ae7e396537bd2e669a6c2ef3a9f7d4f 100644 GIT binary patch delta 34 ocmexb^0kETG%qg~0}#YBd1QF0Z{$16!y1#AlpM490nb!j0K#qyE&u=k delta 34 ocmexb^0kETG%qg~0}yDecgwh>x{>cJ537D+QnLQ$2Ru`C0nuR#&Hw-a diff --git a/venv/Lib/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc b/venv/Lib/site-packages/anyio/abc/__pycache__/_resources.cpython-312.pyc index db2bd8fe4538e815547d9391f25b53ca154d9b2a..450a10a027649d12d665e693321076e7cf1db5e3 100644 GIT binary patch delta 33 ncmcc4bDf9xG%qg~0}#YBd1M%D0G%qg~0}#YBd1OqK+Q=8r${LfHlpM3Uh_zB00IvWE)&Kwi delta 34 ocmaFu_}Y>0G%qg~0}yDecgr{?xsflPl~q46DOrDW5o@J10Jwk(Bme*a diff --git a/venv/Lib/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc b/venv/Lib/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc index 98c99691948f383d9c9169488787c68bf4abace4..fb7b02ea5d236bb459322e7f9e25b0a96e24928d 100644 GIT binary patch delta 33 ncmbO)IbV|ZG%qg~0}#YBd1NGQ*T@j|m9g delta 33 ncmbO)IbV|ZG%qg~0}yDecgqmo$orRxRX;H)S${J>^8`)+kFW@- diff --git a/venv/Lib/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc b/venv/Lib/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc index 4daa54bdb133ec391c989f2d049decc2f7ba5842..35ef9a35f4bb21bdf3c0942e5dc11791f8602889 100644 GIT binary patch delta 33 ncmbQOJX@LfG%qg~0}#YBd1T~nk{KV&CAQh00i+&9vN{PdDk(q#v~>s$80{pk{KV&CAQh00bKA-7;i1@~&fI)lW=H*57=9$%_L3h=&NB diff --git a/venv/Lib/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc index 2ba74045ede5fcf9a466ca7e1715c038b8aadb3e..500483718d162081ce3109e496fa305751d5a030 100644 GIT binary patch delta 32 mcmdnQxQUVbG%qg~0}#YBc}(Ok!cgx`1$a{#HQGfFV<~TM0Z)gXm diff --git a/venv/Lib/site-packages/attr/__pycache__/_cmp.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/_cmp.cpython-312.pyc index 96e1273f0cf3de00fa49645c534d39aeab8341ff..6dab291f0747d1464956e893bb16539b0c1b2bdd 100644 GIT binary patch delta 29 jcmX@7eomeDG%qg~0}#YBd1P$e$ji&g7_(WLb2AqJbr1(~ delta 29 jcmX@7eomeDG%qg~0}v>!cgqmn$ji&gsJ~g7b2AqJa=8Z+ diff --git a/venv/Lib/site-packages/attr/__pycache__/_compat.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/_compat.cpython-312.pyc index 39123050a801755e5098517dab2b7ffa07e935ab..d7429f6e5ea4cf296c81027f6dbdfb986eee3626 100644 GIT binary patch delta 29 jcmZ1>y+WGzG%qg~0}#YBd1SoX$ZO8b7_-@xIhhLpZX^dk delta 29 jcmZ1>y+WGzG%qg~0}v>!cgvWtk=LA=QGc^5b21kIZsi9e diff --git a/venv/Lib/site-packages/attr/__pycache__/_config.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/_config.cpython-312.pyc index 15af137977e082811db6b3a875e1bf453ce597f3..4dee2a2847c4169dea448d3974b5047744418082 100644 GIT binary patch delta 29 jcmX@dagKxcG%qg~0}#YBd1Pd5!cgyhJ$Q#VWsJ}Up=`AAwa$^U& diff --git a/venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-312.pyc index f4fb8803c47693336d09be8063547e95698d4eba..d8bf7c1506a886be9966ab4c59ff7719ec084191 100644 GIT binary patch delta 30 kcmdm)wKI$FG%qg~0}#YBd1M^2-^e$ahcRaJBA)3Q0FFHgF#rGn delta 30 kcmdm)wKI$FG%qg~0}v>!cguKZyOD1)52OC(MLg3r0G0R&oB#j- diff --git a/venv/Lib/site-packages/attr/__pycache__/_make.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/_make.cpython-312.pyc index 770beca957ce61b66fb521f21c2f2d3163e2b6e9..bc9ba1d5c432da852db1d914755394efcac92fe7 100644 GIT binary patch delta 36 qcmbQy$u^^tjqfxsFBbz4#4~whoNnF7r^U?}(`?DT-IALzz7hbmJ_(rs delta 36 qcmbQy$u^^tjqfxsFBbz4D6MzPm{GZrPm7yTzuA&|yCpYcd?f(3wh5a6 diff --git a/venv/Lib/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc index 8c8a389735790c0aca2b3bd73f904c499a4c1fc0..5b2e3d7a18f4b3f42bb149a7203d4bc9f01f64dc 100644 GIT binary patch delta 32 mcmbQUk8#dEM!wU$yj%=G5YOb1u`6*SpSCq)%w{X=N6G-4(g}|M delta 32 mcmbQUk8#dEM!wU$yj%=GptRmC!#jQ>pSCrl{$?xdN6G-4t_fcN diff --git a/venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-312.pyc index 8e2dd174efd258ab5ccea4b8e661a4d7adfa07d3..04a3d550e60503d0edbe7b42132f5e501db00b5f 100644 GIT binary patch delta 29 jcmZ1@u||UTG%qg~0}#YBd1TDr$oqwbF=jIps}?%|Z{P!cgyhH$oqwbQGYWNs}?%|aRCP& diff --git a/venv/Lib/site-packages/attr/__pycache__/converters.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/converters.cpython-312.pyc index d17252ea62985144027c252394b1f57432d6d19d..cee58bb4589a2ab7aadcf955fb1b992f73b29af1 100644 GIT binary patch delta 29 jcmeBC=~3Z5&CAQh00i+&9vRy=@;0zA#%%6mspACzYflH1 delta 29 jcmeBC=~3Z5&CAQh00c_w-7-Ws@;0zA>Tm92spACzXy6Ak diff --git a/venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-312.pyc index 732f358c9cd330aedf11b38c2ccbed64e9c8065e..345e5808c445cf84e77a4ab0f00347c14ac62da2 100644 GIT binary patch delta 30 kcmew={Z*RpG%qg~0}#YBd1Od%Y~)j5W{laa&wPvv0C`;pLjV8( delta 30 kcmew={Z*RpG%qg~0}v>!cgxtxzL8IXnNfeUKJzgy0EZO_Bme*a diff --git a/venv/Lib/site-packages/attr/__pycache__/filters.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/filters.cpython-312.pyc index c06a2dceb5bd0c8d0ff97e1dd66ed96415f1438d..7b267a20b54c1926cd728ca8fc2c6780e8181b62 100644 GIT binary patch delta 29 jcmZ22zFM63G%qg~0}#YBd1QER!cgtYj$g9o7sK42gsfZH*XO9Ml diff --git a/venv/Lib/site-packages/attr/__pycache__/setters.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/setters.cpython-312.pyc index 5ba3ed8197e95fafe0d71cdf97002beec1f97340..cce889671bafc2b0beefa8ec78e1a7ec18ff9dd1 100644 GIT binary patch delta 29 jcmey&_nD9PG%qg~0}#YBd1Nfu$ScCc7_(W4DUcNab}I)C delta 29 jcmey&_nD9PG%qg~0}v>!cgqOe$ScCcsJ~f>DUcNacc2FV diff --git a/venv/Lib/site-packages/attr/__pycache__/validators.cpython-312.pyc b/venv/Lib/site-packages/attr/__pycache__/validators.cpython-312.pyc index a3f47c556062a5b41ada35fa099f8adb408274f2..7638bbd626b55e535a69fddd9443349fbe7491b9 100644 GIT binary patch delta 32 mcmaEPhVkVYM!wU$yj%=G5YOb1AriQeub+)EX7fC@)A0bT5(*Lk delta 32 mcmaEPhVkVYM!wU$yj%=GptRmC!_RLcUq2h8{^ogXr{e*%cM6IC diff --git a/venv/Lib/site-packages/av/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/av/__pycache__/__init__.cpython-312.pyc index 0816cc598b6e35c480e77528b05c8d3b5eec4608..60937aa7a9f690448503cf400588b00175cc5cbb 100644 GIT binary patch delta 27 hcmX>jc1Dc*G%qg~0}v!Id2HkkVP=fkoWT5s9ROec2I2q! delta 27 hcmX>jc1Dc*G%qg~0}v>#ciYGv!px|@If3~NI{;)a2O$6e diff --git a/venv/Lib/site-packages/av/__pycache__/about.cpython-312.pyc b/venv/Lib/site-packages/av/__pycache__/about.cpython-312.pyc index 20e825f4878891409baa852eb23859497ce6d61f..7319afe0496a37e95d8f8198fae4d2174c6a10e8 100644 GIT binary patch delta 24 ecmdnbxSx^xG%qg~0}v!Ic}(PPVT_qLK_37}3I*~2 delta 24 ecmdnbxSx^xG%qg~0}v>#cbmxF!l*xSf<6FCQ3f#p diff --git a/venv/Lib/site-packages/av/audio/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/av/audio/__pycache__/__init__.cpython-312.pyc index d17a1a3bee37d300923e89d853fc2c3534ee0d13..2f1fdc0e47d6412ffefec8fa382b77ae14abad33 100644 GIT binary patch delta 30 kcmZo>YG&d-&CAQh00aq49uv9uvBxBqrex;FOuS$W0BO<)ZU6uP delta 30 kcmZo>YG&d-&CAQh00fHb-6nGHW7khCP07sHpLoF-0Bzq0fB*mh diff --git a/venv/Lib/site-packages/av/codec/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/av/codec/__pycache__/__init__.cpython-312.pyc index 8307682735703e5f735cc981d0570178dc16d673..f57986d893cc97151ff3d8b17887472c8b333775 100644 GIT binary patch delta 32 mcmbQqJd>IGG%qg~0}v!Id2HnNVq}j=&QD2Aj+q?8XbS*!jR(#E delta 32 mcmbQqJd>IGG%qg~0}v>#ciYJA#mKIooS%}KtUo!1(G~!D7zf}0 diff --git a/venv/Lib/site-packages/av/container/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/av/container/__pycache__/__init__.cpython-312.pyc index e909f7ce474490f7cb3e05ac351328603a0c7caa..c78062625548f528a86866693c3a0d8a13d89670 100644 GIT binary patch delta 36 qcmcb?bc2ceG%qg~0}v!Id2Hn7WaN%X&d)1J%*;zIikU3WXbAwQBMFfJ delta 36 qcmcb?bc2ceG%qg~0}v>#ciYI#$;hproS#>cn3#ciYIV#>k#cbmwa$E9DKnUb24Sdyqeu~`=Yj}8fC diff --git a/venv/Lib/site-packages/av/video/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/av/video/__pycache__/__init__.cpython-312.pyc index ab4a27843cefd84f83a95669e5fad95afecfe87d..3ad84082e2e3ed4795df014823eb2ddae3138eb1 100644 GIT binary patch delta 30 kcmZo>YG&d-&CAQh00aq49uv9uvB#8UrljV_OuS$W0BRQqa{vGU delta 30 kcmZo>YG&d-&CAQh00fHb-6nGHW7jXsOi9hxpLoF-0B$4*g#Z8m diff --git a/venv/Lib/site-packages/certifi/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/certifi/__pycache__/__init__.cpython-312.pyc index 7edce3eb37fc6897a90bd01b9c948c6313410d13..4addb1c79c70c9bc856f815b1d6951661d819028 100644 GIT binary patch delta 26 gcmZ3@w3>#cgu*I$a{}bf8rZ^09iK&n*aa+ diff --git a/venv/Lib/site-packages/certifi/__pycache__/core.cpython-312.pyc b/venv/Lib/site-packages/certifi/__pycache__/core.cpython-312.pyc index 3b49490aaa6792a3a332f88f1eea12e88ddd2b90..89e7db1b229788c4eee19083ff1fa165c368e000 100644 GIT binary patch delta 29 jcmew$@j-(3G%qg~0}v!Id1UO_$lJxl7_)f>(+y4lfDZ_; delta 29 jcmew$@j-(3G%qg~0}v>#cgyhF$lJxlsK0pz(+y4lf4~TR diff --git a/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/INSTALLER b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/METADATA b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/METADATA new file mode 100644 index 00000000..573d88b9 --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/METADATA @@ -0,0 +1,731 @@ +Metadata-Version: 2.4 +Name: charset-normalizer +Version: 3.4.2 +Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +Author-email: "Ahmed R. TAHRI" +Maintainer-email: "Ahmed R. TAHRI" +License: MIT +Project-URL: Changelog, https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md +Project-URL: Documentation, https://charset-normalizer.readthedocs.io/ +Project-URL: Code, https://github.com/jawah/charset_normalizer +Project-URL: Issue tracker, https://github.com/jawah/charset_normalizer/issues +Keywords: encoding,charset,charset-detector,detector,normalization,unicode,chardet,detect +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Text Processing :: Linguistic +Classifier: Topic :: Utilities +Classifier: Typing :: Typed +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: unicode-backport +Dynamic: license-file + +

Charset Detection, for Everyone 👋

+ +

+ The Real First Universal Charset Detector
+ + + + + Download Count Total + + + + +

+

+ Featured Packages
+ + Static Badge + + + Static Badge + +

+

+ In other language (unofficial port - by the community)
+ + Static Badge + +

+ +> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`, +> I'm trying to resolve the issue by taking a new approach. +> All IANA character set names for which the Python core library provides codecs are supported. + +

+ >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< +

+ +This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. + +| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | +|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:| +| `Fast` | ❌ | ✅ | ✅ | +| `Universal**` | ❌ | ✅ | ❌ | +| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ | +| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | +| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ | +| `Native Python` | ✅ | ✅ | ❌ | +| `Detect spoken language` | ❌ | ✅ | N/A | +| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ | +| `Whl Size (min)` | 193.6 kB | 42 kB | ~200 kB | +| `Supported Encoding` | 33 | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 | + +

+Reading Normalized TextCat Reading Text +

+ +*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
+ +## ⚡ Performance + +This package offer better performance than its counterpart Chardet. Here are some numbers. + +| Package | Accuracy | Mean per file (ms) | File per sec (est) | +|-----------------------------------------------|:--------:|:------------------:|:------------------:| +| [chardet](https://github.com/chardet/chardet) | 86 % | 63 ms | 16 file/sec | +| charset-normalizer | **98 %** | **10 ms** | 100 file/sec | + +| Package | 99th percentile | 95th percentile | 50th percentile | +|-----------------------------------------------|:---------------:|:---------------:|:---------------:| +| [chardet](https://github.com/chardet/chardet) | 265 ms | 71 ms | 7 ms | +| charset-normalizer | 100 ms | 50 ms | 5 ms | + +_updated as of december 2024 using CPython 3.12_ + +Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. + +> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. +> And yes, these results might change at any time. The dataset can be updated to include more files. +> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. +> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability +> (e.g. Supported Encoding) Challenge-them if you want. + +## ✨ Installation + +Using pip: + +```sh +pip install charset-normalizer -U +``` + +## 🚀 Basic Usage + +### CLI +This package comes with a CLI. + +``` +usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] + file [file ...] + +The Real First Universal Charset Detector. Discover originating encoding used +on text file. Normalize text to unicode. + +positional arguments: + files File(s) to be analysed + +optional arguments: + -h, --help show this help message and exit + -v, --verbose Display complementary information about file if any. + Stdout will contain logs about the detection process. + -a, --with-alternative + Output complementary possibilities if any. Top-level + JSON WILL be a list. + -n, --normalize Permit to normalize input file. If not set, program + does not write anything. + -m, --minimal Only output the charset detected to STDOUT. Disabling + JSON output. + -r, --replace Replace file when trying to normalize it instead of + creating a new one. + -f, --force Replace file without asking if you are sure, use this + flag with caution. + -t THRESHOLD, --threshold THRESHOLD + Define a custom maximum amount of chaos allowed in + decoded content. 0. <= chaos <= 1. + --version Show version information and exit. +``` + +```bash +normalizer ./data/sample.1.fr.srt +``` + +or + +```bash +python -m charset_normalizer ./data/sample.1.fr.srt +``` + +🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. + +```json +{ + "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", + "encoding": "cp1252", + "encoding_aliases": [ + "1252", + "windows_1252" + ], + "alternative_encodings": [ + "cp1254", + "cp1256", + "cp1258", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + "mbcs" + ], + "language": "French", + "alphabets": [ + "Basic Latin", + "Latin-1 Supplement" + ], + "has_sig_or_bom": false, + "chaos": 0.149, + "coherence": 97.152, + "unicode_path": null, + "is_preferred": true +} +``` + +### Python +*Just print out normalized text* +```python +from charset_normalizer import from_path + +results = from_path('./my_subtitle.srt') + +print(str(results.best())) +``` + +*Upgrade your code without effort* +```python +from charset_normalizer import detect +``` + +The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. + +See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) + +## 😇 Why + +When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a +reliable alternative using a completely different method. Also! I never back down on a good challenge! + +I **don't care** about the **originating charset** encoding, because **two different tables** can +produce **two identical rendered string.** +What I want is to get readable text, the best I can. + +In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 + +Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair Unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. + +## 🍰 How + + - Discard all charset encoding table that could not fit the binary content. + - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding. + - Extract matches with the lowest mess detected. + - Additionally, we measure coherence / probe for a language. + +**Wait a minute**, what is noise/mess and coherence according to **YOU ?** + +*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then +**I established** some ground rules about **what is obvious** when **it seems like** a mess (aka. defining noise in rendered text). + I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to + improve or rewrite it. + +*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought +that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. + +## ⚡ Known limitations + + - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) + - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. + +## ⚠️ About Python EOLs + +**If you are running:** + +- Python >=2.7,<3.5: Unsupported +- Python 3.5: charset-normalizer < 2.1 +- Python 3.6: charset-normalizer < 3.1 +- Python 3.7: charset-normalizer < 4.0 + +Upgrade your Python interpreter as soon as possible. + +## 👤 Contributing + +Contributions, issues and feature requests are very much welcome.
+Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. + +## 📝 License + +Copyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
+This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. + +Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) + +## 💼 For Enterprise + +Professional support for charset-normalizer is available as part of the [Tidelift +Subscription][1]. Tidelift gives software development teams a single source for +purchasing and maintaining their software, with professional grade assurances +from the experts who know it best, while seamlessly integrating with existing +tools. + +[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme + +[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/7297/badge)](https://www.bestpractices.dev/projects/7297) + +# Changelog +All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## [3.4.2](https://github.com/Ousret/charset_normalizer/compare/3.4.1...3.4.2) (2025-05-02) + +### Fixed +- Addressed the DeprecationWarning in our CLI regarding `argparse.FileType` by backporting the target class into the package. (#591) +- Improved the overall reliability of the detector with CJK Ideographs. (#605) (#587) + +### Changed +- Optional mypyc compilation upgraded to version 1.15 for Python >= 3.8 + +## [3.4.1](https://github.com/Ousret/charset_normalizer/compare/3.4.0...3.4.1) (2024-12-24) + +### Changed +- Project metadata are now stored using `pyproject.toml` instead of `setup.cfg` using setuptools as the build backend. +- Enforce annotation delayed loading for a simpler and consistent types in the project. +- Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8 + +### Added +- pre-commit configuration. +- noxfile. + +### Removed +- `build-requirements.txt` as per using `pyproject.toml` native build configuration. +- `bin/integration.py` and `bin/serve.py` in favor of downstream integration test (see noxfile). +- `setup.cfg` in favor of `pyproject.toml` metadata configuration. +- Unused `utils.range_scan` function. + +### Fixed +- Converting content to Unicode bytes may insert `utf_8` instead of preferred `utf-8`. (#572) +- Deprecation warning "'count' is passed as positional argument" when converting to Unicode bytes on Python 3.13+ + +## [3.4.0](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) (2024-10-08) + +### Added +- Argument `--no-preemptive` in the CLI to prevent the detector to search for hints. +- Support for Python 3.13 (#512) + +### Fixed +- Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch. +- Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537) +- Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381) + +## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31) + +### Fixed +- Unintentional memory usage regression when using large payload that match several encoding (#376) +- Regression on some detection case showcased in the documentation (#371) + +### Added +- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife) + +## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22) + +### Changed +- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8 +- Improved the general detection reliability based on reports from the community + +## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30) + +### Added +- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer` +- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323) + +### Removed +- (internal) Redundant utils.is_ascii function and unused function is_private_use_only +- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant + +### Changed +- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection +- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8 + +### Fixed +- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \_\_lt\_\_ (#350) + +## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07) + +### Changed +- Typehint for function `from_path` no longer enforce `PathLike` as its first argument +- Minor improvement over the global detection reliability + +### Added +- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries +- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True) +- Explicit support for Python 3.12 + +### Fixed +- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289) + +## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06) + +### Added +- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262) + +### Removed +- Support for Python 3.6 (PR #260) + +### Changed +- Optional speedup provided by mypy/c 1.0.1 + +## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18) + +### Fixed +- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233) + +### Changed +- Speedup provided by mypy/c 0.990 on Python >= 3.7 + +## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20) + +### Added +- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results +- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES +- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio +- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) + +### Changed +- Build with static metadata using 'build' frontend +- Make the language detection stricter +- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 + +### Fixed +- CLI with opt --normalize fail when using full path for files +- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it +- Sphinx warnings when generating the documentation + +### Removed +- Coherence detector no longer return 'Simple English' instead return 'English' +- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' +- Breaking: Method `first()` and `best()` from CharsetMatch +- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) +- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches +- Breaking: Top-level function `normalize` +- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch +- Support for the backport `unicodedata2` + +## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18) + +### Added +- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results +- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES +- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio + +### Changed +- Build with static metadata using 'build' frontend +- Make the language detection stricter + +### Fixed +- CLI with opt --normalize fail when using full path for files +- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it + +### Removed +- Coherence detector no longer return 'Simple English' instead return 'English' +- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' + +## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21) + +### Added +- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) + +### Removed +- Breaking: Method `first()` and `best()` from CharsetMatch +- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) + +### Fixed +- Sphinx warnings when generating the documentation + +## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15) + +### Changed +- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 + +### Removed +- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches +- Breaking: Top-level function `normalize` +- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch +- Support for the backport `unicodedata2` + +## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19) + +### Deprecated +- Function `normalize` scheduled for removal in 3.0 + +### Changed +- Removed useless call to decode in fn is_unprintable (#206) + +### Fixed +- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204) + +## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19) + +### Added +- Output the Unicode table version when running the CLI with `--version` (PR #194) + +### Changed +- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175) +- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183) + +### Fixed +- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175) +- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181) + +### Removed +- Support for Python 3.5 (PR #192) + +### Deprecated +- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194) + +## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12) + +### Fixed +- ASCII miss-detection on rare cases (PR #170) + +## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30) + +### Added +- Explicit support for Python 3.11 (PR #164) + +### Changed +- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165) + +## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04) + +### Fixed +- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154) + +### Changed +- Skipping the language-detection (CD) on ASCII (PR #155) + +## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03) + +### Changed +- Moderating the logging impact (since 2.0.8) for specific environments (PR #147) + +### Fixed +- Wrong logging level applied when setting kwarg `explain` to True (PR #146) + +## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24) +### Changed +- Improvement over Vietnamese detection (PR #126) +- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124) +- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122) +- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129) +- Code style as refactored by Sourcery-AI (PR #131) +- Minor adjustment on the MD around european words (PR #133) +- Remove and replace SRTs from assets / tests (PR #139) +- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135) +- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135) + +### Fixed +- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137) +- Avoid using too insignificant chunk (PR #137) + +### Added +- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135) +- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141) + +## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11) +### Added +- Add support for Kazakh (Cyrillic) language detection (PR #109) + +### Changed +- Further, improve inferring the language from a given single-byte code page (PR #112) +- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116) +- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113) +- Various detection improvement (MD+CD) (PR #117) + +### Removed +- Remove redundant logging entry about detected language(s) (PR #115) + +### Fixed +- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102) + +## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18) +### Fixed +- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100) +- Fix CLI crash when using --minimal output in certain cases (PR #103) + +### Changed +- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101) + +## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14) +### Changed +- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81) +- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82) +- The Unicode detection is slightly improved (PR #93) +- Add syntax sugar \_\_bool\_\_ for results CharsetMatches list-container (PR #91) + +### Removed +- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92) + +### Fixed +- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95) +- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96) +- The MANIFEST.in was not exhaustive (PR #78) + +## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30) +### Fixed +- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70) +- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68) +- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72) +- Submatch factoring could be wrong in rare edge cases (PR #72) +- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72) +- Fix line endings from CRLF to LF for certain project files (PR #67) + +### Changed +- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76) +- Allow fallback on specified encoding if any (PR #71) + +## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16) +### Changed +- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63) +- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64) + +## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15) +### Fixed +- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) + +### Changed +- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57) + +## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13) +### Fixed +- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55) +- Using explain=False permanently disable the verbose output in the current runtime (PR #47) +- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47) +- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52) + +### Changed +- Public function normalize default args values were not aligned with from_bytes (PR #53) + +### Added +- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47) + +## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02) +### Changed +- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet. +- Accent has been made on UTF-8 detection, should perform rather instantaneous. +- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible. +- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time) +- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+ +- utf_7 detection has been reinstated. + +### Removed +- This package no longer require anything when used with Python 3.5 (Dropped cached_property) +- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian. +- The exception hook on UnicodeDecodeError has been removed. + +### Deprecated +- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0 + +### Fixed +- The CLI output used the relative path of the file(s). Should be absolute. + +## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28) +### Fixed +- Logger configuration/usage no longer conflict with others (PR #44) + +## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21) +### Removed +- Using standard logging instead of using the package loguru. +- Dropping nose test framework in favor of the maintained pytest. +- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text. +- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version. +- Stop support for UTF-7 that does not contain a SIG. +- Dropping PrettyTable, replaced with pure JSON output in CLI. + +### Fixed +- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process. +- Not searching properly for the BOM when trying utf32/16 parent codec. + +### Changed +- Improving the package final size by compressing frequencies.json. +- Huge improvement over the larges payload. + +### Added +- CLI now produces JSON consumable output. +- Return ASCII if given sequences fit. Given reasonable confidence. + +## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13) + +### Fixed +- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40) + +## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12) + +### Fixed +- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39) + +## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12) + +### Fixed +- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38) + +## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09) + +### Changed +- Amend the previous release to allow prettytable 2.0 (PR #35) + +## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08) + +### Fixed +- Fix error while using the package with a python pre-release interpreter (PR #33) + +### Changed +- Dependencies refactoring, constraints revised. + +### Added +- Add python 3.9 and 3.10 to the supported interpreters + +MIT License + +Copyright (c) 2025 TAHRI Ahmed R. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/RECORD b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/RECORD new file mode 100644 index 00000000..3c285017 --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/RECORD @@ -0,0 +1,35 @@ +../../Scripts/normalizer.exe,sha256=R1sjOGFwcrjsSq3CdDHBZsnnjZ7CvMcc4k686Ao8DQg,108420 +charset_normalizer-3.4.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-3.4.2.dist-info/METADATA,sha256=WneNNyl9QvsRZYzK1FeEC6Wwag4iIFoTAoevPgpZFTY,36474 +charset_normalizer-3.4.2.dist-info/RECORD,, +charset_normalizer-3.4.2.dist-info/WHEEL,sha256=PqPfOxA7mGIdQ4POxRbyNp_0DDxNzJM1gpSaGcLLjlo,101 +charset_normalizer-3.4.2.dist-info/entry_points.txt,sha256=8C-Y3iXIfyXQ83Tpir2B8t-XLJYpxF5xbb38d_js-h4,65 +charset_normalizer-3.4.2.dist-info/licenses/LICENSE,sha256=GFd0hdNwTxpHne2OVzwJds_tMV_S_ReYP6mI2kwvcNE,1092 +charset_normalizer-3.4.2.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=0NT8MHi7SKq3juMqYfOdrkzjisK0L73lneNHH4qaUAs,1638 +charset_normalizer/__main__.py,sha256=2sj_BS6H0sU25C1bMqz9DVwa6kOK9lchSEbSU-_iu7M,115 +charset_normalizer/__pycache__/__init__.cpython-312.pyc,, +charset_normalizer/__pycache__/__main__.cpython-312.pyc,, +charset_normalizer/__pycache__/api.cpython-312.pyc,, +charset_normalizer/__pycache__/cd.cpython-312.pyc,, +charset_normalizer/__pycache__/constant.cpython-312.pyc,, +charset_normalizer/__pycache__/legacy.cpython-312.pyc,, +charset_normalizer/__pycache__/md.cpython-312.pyc,, +charset_normalizer/__pycache__/models.cpython-312.pyc,, +charset_normalizer/__pycache__/utils.cpython-312.pyc,, +charset_normalizer/__pycache__/version.cpython-312.pyc,, +charset_normalizer/api.py,sha256=2a0p2Gnhbdo9O6C04CNxTSN23fIbgOF20nxb0pWPNFM,23285 +charset_normalizer/cd.py,sha256=uq8nVxRpR6Guc16ACvOWtL8KO3w7vYaCh8hHisuOyTg,12917 +charset_normalizer/cli/__init__.py,sha256=d9MUx-1V_qD3x9igIy4JT4oC5CU0yjulk7QyZWeRFhg,144 +charset_normalizer/cli/__main__.py,sha256=-pdJCyPywouPyFsC8_eTSgTmvh1YEvgjsvy1WZ0XjaA,13027 +charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc,, +charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc,, +charset_normalizer/constant.py,sha256=mCJmYzpBU27Ut9kiNWWoBbhhxQ-aRVw3K7LSwoFwBGI,44728 +charset_normalizer/legacy.py,sha256=NgK-8ZQa_M9FHgQjdNSiYzMaB332QGuElZSfCf2y2sQ,2351 +charset_normalizer/md.cp312-win_amd64.pyd,sha256=Rl7qVeM9DRj8hZuyoyQjaRKsZ6zkpojb7Nx1nNTbjr8,10752 +charset_normalizer/md.py,sha256=LSuW2hNgXSgF7JGdRapLAHLuj6pABHiP85LTNAYmu7c,20780 +charset_normalizer/md__mypyc.cp312-win_amd64.pyd,sha256=WXIlB5bZkRXY2k4r70Pmyf7eLRw6zLib-dXXkRIrOZA,125952 +charset_normalizer/models.py,sha256=ZR2PE-fqf6dASZfqdE5Uhkmr0o1MciSdXOjuNqwkmvg,12754 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=XtWIQeOuz7cnGebMzyi4Vvi1JtA84QBSIeR9PDzF7pw,12584 +charset_normalizer/version.py,sha256=wtpyUZ7M57rCLclP3QjzRD0Nj2hvnMOzLZI-vwfTdWs,123 diff --git a/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/WHEEL b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/WHEEL new file mode 100644 index 00000000..97266467 --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.1.0) +Root-Is-Purelib: false +Tag: cp312-cp312-win_amd64 + diff --git a/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/entry_points.txt b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/entry_points.txt new file mode 100644 index 00000000..ec920125 --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +normalizer = charset_normalizer:cli.cli_detect diff --git a/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/licenses/LICENSE b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/licenses/LICENSE new file mode 100644 index 00000000..9725772c --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 TAHRI Ahmed R. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/top_level.txt b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/top_level.txt new file mode 100644 index 00000000..66958f0a --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer-3.4.2.dist-info/top_level.txt @@ -0,0 +1 @@ +charset_normalizer diff --git a/venv/Lib/site-packages/charset_normalizer/__init__.py b/venv/Lib/site-packages/charset_normalizer/__init__.py new file mode 100644 index 00000000..0d3a3799 --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer/__init__.py @@ -0,0 +1,48 @@ +""" +Charset-Normalizer +~~~~~~~~~~~~~~ +The Real First Universal Charset Detector. +A library that helps you read text from an unknown charset encoding. +Motivated by chardet, This package is trying to resolve the issue by taking a new approach. +All IANA character set names for which the Python core library provides codecs are supported. + +Basic usage: + >>> from charset_normalizer import from_bytes + >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) + >>> best_guess = results.best() + >>> str(best_guess) + 'Bсеки човек има право на образование. Oбразованието!' + +Others methods and usages are available - see the full documentation +at . +:copyright: (c) 2021 by Ahmed TAHRI +:license: MIT, see LICENSE for more details. +""" + +from __future__ import annotations + +import logging + +from .api import from_bytes, from_fp, from_path, is_binary +from .legacy import detect +from .models import CharsetMatch, CharsetMatches +from .utils import set_logging_handler +from .version import VERSION, __version__ + +__all__ = ( + "from_fp", + "from_path", + "from_bytes", + "is_binary", + "detect", + "CharsetMatch", + "CharsetMatches", + "__version__", + "VERSION", + "set_logging_handler", +) + +# Attach a NullHandler to the top level logger by default +# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library + +logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/venv/Lib/site-packages/charset_normalizer/__main__.py b/venv/Lib/site-packages/charset_normalizer/__main__.py new file mode 100644 index 00000000..e0e76f7b --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer/__main__.py @@ -0,0 +1,6 @@ +from __future__ import annotations + +from .cli import cli_detect + +if __name__ == "__main__": + cli_detect() diff --git a/venv/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4affcfa378f6a2a0fe742e7f002ba0d89aeeebca GIT binary patch literal 1765 zcmcIkPfr_16rZ(?4Qn6;4wWiZovKp6EtnJzt*jJ@5D-?uR0MKZS=x?w$KDOIe>5{| z>K-bZOVv-%&rsz;D@8?BOFuv_>!J#2r6`9Ss@#a8UUKT2T^mx-YxnT>y*KmT`@Mhj z`^1Ef;QRKE&z*J=p=U}Meua$DUdF(DhiqgZTeEXa^KwQ`Q+%G~jl5m3M_9odF-E+i zQS?ei$s09B;k;lM*_fvrddinr*&8>;y$NF?l}Fj6cf+`m@?-1`Z_1eRrj2Qkbz>%n zX#T<65XjZvEA?qA+98)(%@3uk|DyprwAD~AUm1@c<`L4@9Kr>a3ypw#gt=c* zu7CBfPv3JW-lc@$4VMdv_kFiZxd3@!itkcMEgA5tzKWUK;)M6Gbcn#L2`)Gx6lg<-$}ZdKRs5aC)l5`eL$V~kf; zR}`tEEstv{Wcjbz*Wc(zg* zqG?ef%}zvx0yKbDRm!=`D?;+Qt81zH|AwpUJJ4<}ut%XwHgv+bv$|(ZAzk7!(qa@Z zK!dZ{Xh+a|JFp^;`jSXD@O7Bc+m4i>s4XsbT#5}LD=JN z$B{KWXI1dht)&muz^ytSOzht3=5AfDG1sELpf$W*-S`F5C$rA$bqlZ?5-Y`H#c9C#>#PgulC zE*T%J<~EU*lT5xYQ2{q+VCYR2bULsjrUSKOl!IC6{`&5{`c5M$o2J@vD3NJabPf+A z;w42!6d6@yOcC{V^0Fe6icBan4kVerUc1VhNy#*!{-&AerrC~U#Hnd=c!W?=8h}ai zBy_VVS3y<0q{wK8SiLlEQuJW|n7E3cj6@QunFTKmuxEG_G8LIH29d`)RBl1ylqWi| z?aeIrq}+hv7zp2^mtcZk-CwIU_XU)p`Dwkr*St%`fegZCH-P4@c3_5@UFvt6TW+f< zTuB!OkCSL#&wbG}UEh_aSq*!yMsEZ9h|v}P4unyS7W+Uh@|vc-$jxYlzu!mNd(Y71 zU#ND5YERHxPtmO>=;l*YxhRy&xuenrM%wgI=^Rb<(NsKr^9;?NqoqDtikCNzKRRFD R=r3=aEpPsb>ili+{11g$TUY=9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc b/venv/Lib/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe1aa7585e3a13871be3bab956c4145526adbde2 GIT binary patch literal 340 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 kl*!?KlqS8^pHRNke_?V|GuwTwS&`?k6AsX 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 O@t&2wZ^9i@YyU5;+9gc@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc b/venv/Lib/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46ddfdc964306a30c20b79f6d272b401709f43c5 GIT binary patch literal 17112 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d58f3981fdf7c19310a74ef003b49e7542e499fb GIT binary patch literal 367 zcmX@j%ge<81f7=>GOB^}V-N=hm>~?t&sIRjbcPg$D25cq6s8=;T&5@{MursTDCSh= zEKZnm1f9aNni0Z_Vy$G=WUCV3a;+%HFHTh`OD!tS%+KR`36j=iyv3cEmzQ6XSOOF) zu3|OTGto2p#i-|}$##o9K0YNsIX?atSA2Y0X-R2OYJ7YV$VIofka73^MswsIyf}Xfe>T7;jI{kQkTL;_Q* CharsetMatches: + """ + Given a raw bytes sequence, return the best possibles charset usable to render str objects. + If there is no results, it is a strong indicator that the source is binary/not text. + By default, the process will extract 5 blocks of 512o each to assess the mess and coherence of a given sequence. + And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. + + The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page + but never take it for granted. Can improve the performance. + + You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that + purpose. + + This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. + By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' + toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. + Custom logging format and handler can be set manually. + """ + + if not isinstance(sequences, (bytearray, bytes)): + raise TypeError( + "Expected object of type bytes or bytearray, got: {}".format( + type(sequences) + ) + ) + + if explain: + previous_logger_level: int = logger.level + logger.addHandler(explain_handler) + logger.setLevel(TRACE) + + length: int = len(sequences) + + if length == 0: + logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level or logging.WARNING) + return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) + + if cp_isolation is not None: + logger.log( + TRACE, + "cp_isolation is set. use this flag for debugging purpose. " + "limited list of encoding allowed : %s.", + ", ".join(cp_isolation), + ) + cp_isolation = [iana_name(cp, False) for cp in cp_isolation] + else: + cp_isolation = [] + + if cp_exclusion is not None: + logger.log( + TRACE, + "cp_exclusion is set. use this flag for debugging purpose. " + "limited list of encoding excluded : %s.", + ", ".join(cp_exclusion), + ) + cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] + else: + cp_exclusion = [] + + if length <= (chunk_size * steps): + logger.log( + TRACE, + "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", + steps, + chunk_size, + length, + ) + steps = 1 + chunk_size = length + + if steps > 1 and length / steps < chunk_size: + chunk_size = int(length / steps) + + is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE + is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE + + if is_too_small_sequence: + logger.log( + TRACE, + "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( + length + ), + ) + elif is_too_large_sequence: + logger.log( + TRACE, + "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( + length + ), + ) + + prioritized_encodings: list[str] = [] + + specified_encoding: str | None = ( + any_specified_encoding(sequences) if preemptive_behaviour else None + ) + + if specified_encoding is not None: + prioritized_encodings.append(specified_encoding) + logger.log( + TRACE, + "Detected declarative mark in sequence. Priority +1 given for %s.", + specified_encoding, + ) + + tested: set[str] = set() + tested_but_hard_failure: list[str] = [] + tested_but_soft_failure: list[str] = [] + + fallback_ascii: CharsetMatch | None = None + fallback_u8: CharsetMatch | None = None + fallback_specified: CharsetMatch | None = None + + results: CharsetMatches = CharsetMatches() + + early_stop_results: CharsetMatches = CharsetMatches() + + sig_encoding, sig_payload = identify_sig_or_bom(sequences) + + if sig_encoding is not None: + prioritized_encodings.append(sig_encoding) + logger.log( + TRACE, + "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", + len(sig_payload), + sig_encoding, + ) + + prioritized_encodings.append("ascii") + + if "utf_8" not in prioritized_encodings: + prioritized_encodings.append("utf_8") + + for encoding_iana in prioritized_encodings + IANA_SUPPORTED: + if cp_isolation and encoding_iana not in cp_isolation: + continue + + if cp_exclusion and encoding_iana in cp_exclusion: + continue + + if encoding_iana in tested: + continue + + tested.add(encoding_iana) + + decoded_payload: str | None = None + bom_or_sig_available: bool = sig_encoding == encoding_iana + strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( + encoding_iana + ) + + if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s won't be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", + encoding_iana, + ) + continue + if encoding_iana in {"utf_7"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s won't be tested as-is because detection is unreliable without BOM/SIG.", + encoding_iana, + ) + continue + + try: + is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana) + except (ModuleNotFoundError, ImportError): + logger.log( + TRACE, + "Encoding %s does not provide an IncrementalDecoder", + encoding_iana, + ) + continue + + try: + if is_too_large_sequence and is_multi_byte_decoder is False: + str( + ( + sequences[: int(50e4)] + if strip_sig_or_bom is False + else sequences[len(sig_payload) : int(50e4)] + ), + encoding=encoding_iana, + ) + else: + decoded_payload = str( + ( + sequences + if strip_sig_or_bom is False + else sequences[len(sig_payload) :] + ), + encoding=encoding_iana, + ) + except (UnicodeDecodeError, LookupError) as e: + if not isinstance(e, LookupError): + logger.log( + TRACE, + "Code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + similar_soft_failure_test: bool = False + + for encoding_soft_failed in tested_but_soft_failure: + if is_cp_similar(encoding_iana, encoding_soft_failed): + similar_soft_failure_test = True + break + + if similar_soft_failure_test: + logger.log( + TRACE, + "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", + encoding_iana, + encoding_soft_failed, + ) + continue + + r_ = range( + 0 if not bom_or_sig_available else len(sig_payload), + length, + int(length / steps), + ) + + multi_byte_bonus: bool = ( + is_multi_byte_decoder + and decoded_payload is not None + and len(decoded_payload) < length + ) + + if multi_byte_bonus: + logger.log( + TRACE, + "Code page %s is a multi byte encoding table and it appear that at least one character " + "was encoded using n-bytes.", + encoding_iana, + ) + + max_chunk_gave_up: int = int(len(r_) / 4) + + max_chunk_gave_up = max(max_chunk_gave_up, 2) + early_stop_count: int = 0 + lazy_str_hard_failure = False + + md_chunks: list[str] = [] + md_ratios = [] + + try: + for chunk in cut_sequence_chunks( + sequences, + encoding_iana, + r_, + chunk_size, + bom_or_sig_available, + strip_sig_or_bom, + sig_payload, + is_multi_byte_decoder, + decoded_payload, + ): + md_chunks.append(chunk) + + md_ratios.append( + mess_ratio( + chunk, + threshold, + explain is True and 1 <= len(cp_isolation) <= 2, + ) + ) + + if md_ratios[-1] >= threshold: + early_stop_count += 1 + + if (early_stop_count >= max_chunk_gave_up) or ( + bom_or_sig_available and strip_sig_or_bom is False + ): + break + except ( + UnicodeDecodeError + ) as e: # Lazy str loading may have missed something there + logger.log( + TRACE, + "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + early_stop_count = max_chunk_gave_up + lazy_str_hard_failure = True + + # We might want to check the sequence again with the whole content + # Only if initial MD tests passes + if ( + not lazy_str_hard_failure + and is_too_large_sequence + and not is_multi_byte_decoder + ): + try: + sequences[int(50e3) :].decode(encoding_iana, errors="strict") + except UnicodeDecodeError as e: + logger.log( + TRACE, + "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 + if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: + tested_but_soft_failure.append(encoding_iana) + logger.log( + TRACE, + "%s was excluded because of initial chaos probing. Gave up %i time(s). " + "Computed mean chaos is %f %%.", + encoding_iana, + early_stop_count, + round(mean_mess_ratio * 100, ndigits=3), + ) + # Preparing those fallbacks in case we got nothing. + if ( + enable_fallback + and encoding_iana in ["ascii", "utf_8", specified_encoding] + and not lazy_str_hard_failure + ): + fallback_entry = CharsetMatch( + sequences, + encoding_iana, + threshold, + False, + [], + decoded_payload, + preemptive_declaration=specified_encoding, + ) + if encoding_iana == specified_encoding: + fallback_specified = fallback_entry + elif encoding_iana == "ascii": + fallback_ascii = fallback_entry + else: + fallback_u8 = fallback_entry + continue + + logger.log( + TRACE, + "%s passed initial chaos probing. Mean measured chaos is %f %%", + encoding_iana, + round(mean_mess_ratio * 100, ndigits=3), + ) + + if not is_multi_byte_decoder: + target_languages: list[str] = encoding_languages(encoding_iana) + else: + target_languages = mb_encoding_languages(encoding_iana) + + if target_languages: + logger.log( + TRACE, + "{} should target any language(s) of {}".format( + encoding_iana, str(target_languages) + ), + ) + + cd_ratios = [] + + # We shall skip the CD when its about ASCII + # Most of the time its not relevant to run "language-detection" on it. + if encoding_iana != "ascii": + for chunk in md_chunks: + chunk_languages = coherence_ratio( + chunk, + language_threshold, + ",".join(target_languages) if target_languages else None, + ) + + cd_ratios.append(chunk_languages) + + cd_ratios_merged = merge_coherence_ratios(cd_ratios) + + if cd_ratios_merged: + logger.log( + TRACE, + "We detected language {} using {}".format( + cd_ratios_merged, encoding_iana + ), + ) + + current_match = CharsetMatch( + sequences, + encoding_iana, + mean_mess_ratio, + bom_or_sig_available, + cd_ratios_merged, + ( + decoded_payload + if ( + is_too_large_sequence is False + or encoding_iana in [specified_encoding, "ascii", "utf_8"] + ) + else None + ), + preemptive_declaration=specified_encoding, + ) + + results.append(current_match) + + if ( + encoding_iana in [specified_encoding, "ascii", "utf_8"] + and mean_mess_ratio < 0.1 + ): + # If md says nothing to worry about, then... stop immediately! + if mean_mess_ratio == 0.0: + logger.debug( + "Encoding detection: %s is most likely the one.", + current_match.encoding, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([current_match]) + + early_stop_results.append(current_match) + + if ( + len(early_stop_results) + and (specified_encoding is None or specified_encoding in tested) + and "ascii" in tested + and "utf_8" in tested + ): + probable_result: CharsetMatch = early_stop_results.best() # type: ignore[assignment] + logger.debug( + "Encoding detection: %s is most likely the one.", + probable_result.encoding, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return CharsetMatches([probable_result]) + + if encoding_iana == sig_encoding: + logger.debug( + "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " + "the beginning of the sequence.", + encoding_iana, + ) + if explain: # Defensive: ensure exit path clean handler + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([results[encoding_iana]]) + + if len(results) == 0: + if fallback_u8 or fallback_ascii or fallback_specified: + logger.log( + TRACE, + "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", + ) + + if fallback_specified: + logger.debug( + "Encoding detection: %s will be used as a fallback match", + fallback_specified.encoding, + ) + results.append(fallback_specified) + elif ( + (fallback_u8 and fallback_ascii is None) + or ( + fallback_u8 + and fallback_ascii + and fallback_u8.fingerprint != fallback_ascii.fingerprint + ) + or (fallback_u8 is not None) + ): + logger.debug("Encoding detection: utf_8 will be used as a fallback match") + results.append(fallback_u8) + elif fallback_ascii: + logger.debug("Encoding detection: ascii will be used as a fallback match") + results.append(fallback_ascii) + + if results: + logger.debug( + "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", + results.best().encoding, # type: ignore + len(results) - 1, + ) + else: + logger.debug("Encoding detection: Unable to determine any suitable charset.") + + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return results + + +def from_fp( + fp: BinaryIO, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but using a file pointer that is already ready. + Will not close the file pointer. + """ + return from_bytes( + fp.read(), + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + language_threshold, + enable_fallback, + ) + + +def from_path( + path: str | bytes | PathLike, # type: ignore[type-arg] + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = True, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. + Can raise IOError. + """ + with open(path, "rb") as fp: + return from_fp( + fp, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + language_threshold, + enable_fallback, + ) + + +def is_binary( + fp_or_path_or_payload: PathLike | str | BinaryIO | bytes, # type: ignore[type-arg] + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, + preemptive_behaviour: bool = True, + explain: bool = False, + language_threshold: float = 0.1, + enable_fallback: bool = False, +) -> bool: + """ + Detect if the given input (file, bytes, or path) points to a binary file. aka. not a string. + Based on the same main heuristic algorithms and default kwargs at the sole exception that fallbacks match + are disabled to be stricter around ASCII-compatible but unlikely to be a string. + """ + if isinstance(fp_or_path_or_payload, (str, PathLike)): + guesses = from_path( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + elif isinstance( + fp_or_path_or_payload, + ( + bytes, + bytearray, + ), + ): + guesses = from_bytes( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + else: + guesses = from_fp( + fp_or_path_or_payload, + steps=steps, + chunk_size=chunk_size, + threshold=threshold, + cp_isolation=cp_isolation, + cp_exclusion=cp_exclusion, + preemptive_behaviour=preemptive_behaviour, + explain=explain, + language_threshold=language_threshold, + enable_fallback=enable_fallback, + ) + + return not guesses diff --git a/venv/Lib/site-packages/charset_normalizer/cd.py b/venv/Lib/site-packages/charset_normalizer/cd.py new file mode 100644 index 00000000..71a3ed51 --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer/cd.py @@ -0,0 +1,395 @@ +from __future__ import annotations + +import importlib +from codecs import IncrementalDecoder +from collections import Counter +from functools import lru_cache +from typing import Counter as TypeCounter + +from .constant import ( + FREQUENCIES, + KO_NAMES, + LANGUAGE_SUPPORTED_COUNT, + TOO_SMALL_SEQUENCE, + ZH_NAMES, +) +from .md import is_suspiciously_successive_range +from .models import CoherenceMatches +from .utils import ( + is_accentuated, + is_latin, + is_multi_byte_encoding, + is_unicode_range_secondary, + unicode_range, +) + + +def encoding_unicode_range(iana_name: str) -> list[str]: + """ + Return associated unicode ranges in a single byte code page. + """ + if is_multi_byte_encoding(iana_name): + raise OSError("Function not supported on multi-byte code page") + + decoder = importlib.import_module(f"encodings.{iana_name}").IncrementalDecoder + + p: IncrementalDecoder = decoder(errors="ignore") + seen_ranges: dict[str, int] = {} + character_count: int = 0 + + for i in range(0x40, 0xFF): + chunk: str = p.decode(bytes([i])) + + if chunk: + character_range: str | None = unicode_range(chunk) + + if character_range is None: + continue + + if is_unicode_range_secondary(character_range) is False: + if character_range not in seen_ranges: + seen_ranges[character_range] = 0 + seen_ranges[character_range] += 1 + character_count += 1 + + return sorted( + [ + character_range + for character_range in seen_ranges + if seen_ranges[character_range] / character_count >= 0.15 + ] + ) + + +def unicode_range_languages(primary_range: str) -> list[str]: + """ + Return inferred languages used with a unicode range. + """ + languages: list[str] = [] + + for language, characters in FREQUENCIES.items(): + for character in characters: + if unicode_range(character) == primary_range: + languages.append(language) + break + + return languages + + +@lru_cache() +def encoding_languages(iana_name: str) -> list[str]: + """ + Single-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + unicode_ranges: list[str] = encoding_unicode_range(iana_name) + primary_range: str | None = None + + for specified_range in unicode_ranges: + if "Latin" not in specified_range: + primary_range = specified_range + break + + if primary_range is None: + return ["Latin Based"] + + return unicode_range_languages(primary_range) + + +@lru_cache() +def mb_encoding_languages(iana_name: str) -> list[str]: + """ + Multi-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + if ( + iana_name.startswith("shift_") + or iana_name.startswith("iso2022_jp") + or iana_name.startswith("euc_j") + or iana_name == "cp932" + ): + return ["Japanese"] + if iana_name.startswith("gb") or iana_name in ZH_NAMES: + return ["Chinese"] + if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: + return ["Korean"] + + return [] + + +@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) +def get_target_features(language: str) -> tuple[bool, bool]: + """ + Determine main aspects from a supported language if it contains accents and if is pure Latin. + """ + target_have_accents: bool = False + target_pure_latin: bool = True + + for character in FREQUENCIES[language]: + if not target_have_accents and is_accentuated(character): + target_have_accents = True + if target_pure_latin and is_latin(character) is False: + target_pure_latin = False + + return target_have_accents, target_pure_latin + + +def alphabet_languages( + characters: list[str], ignore_non_latin: bool = False +) -> list[str]: + """ + Return associated languages associated to given characters. + """ + languages: list[tuple[str, float]] = [] + + source_have_accents = any(is_accentuated(character) for character in characters) + + for language, language_characters in FREQUENCIES.items(): + target_have_accents, target_pure_latin = get_target_features(language) + + if ignore_non_latin and target_pure_latin is False: + continue + + if target_have_accents is False and source_have_accents: + continue + + character_count: int = len(language_characters) + + character_match_count: int = len( + [c for c in language_characters if c in characters] + ) + + ratio: float = character_match_count / character_count + + if ratio >= 0.2: + languages.append((language, ratio)) + + languages = sorted(languages, key=lambda x: x[1], reverse=True) + + return [compatible_language[0] for compatible_language in languages] + + +def characters_popularity_compare( + language: str, ordered_characters: list[str] +) -> float: + """ + Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. + The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). + Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) + """ + if language not in FREQUENCIES: + raise ValueError(f"{language} not available") + + character_approved_count: int = 0 + FREQUENCIES_language_set = set(FREQUENCIES[language]) + + ordered_characters_count: int = len(ordered_characters) + target_language_characters_count: int = len(FREQUENCIES[language]) + + large_alphabet: bool = target_language_characters_count > 26 + + for character, character_rank in zip( + ordered_characters, range(0, ordered_characters_count) + ): + if character not in FREQUENCIES_language_set: + continue + + character_rank_in_language: int = FREQUENCIES[language].index(character) + expected_projection_ratio: float = ( + target_language_characters_count / ordered_characters_count + ) + character_rank_projection: int = int(character_rank * expected_projection_ratio) + + if ( + large_alphabet is False + and abs(character_rank_projection - character_rank_in_language) > 4 + ): + continue + + if ( + large_alphabet is True + and abs(character_rank_projection - character_rank_in_language) + < target_language_characters_count / 3 + ): + character_approved_count += 1 + continue + + characters_before_source: list[str] = FREQUENCIES[language][ + 0:character_rank_in_language + ] + characters_after_source: list[str] = FREQUENCIES[language][ + character_rank_in_language: + ] + characters_before: list[str] = ordered_characters[0:character_rank] + characters_after: list[str] = ordered_characters[character_rank:] + + before_match_count: int = len( + set(characters_before) & set(characters_before_source) + ) + + after_match_count: int = len( + set(characters_after) & set(characters_after_source) + ) + + if len(characters_before_source) == 0 and before_match_count <= 4: + character_approved_count += 1 + continue + + if len(characters_after_source) == 0 and after_match_count <= 4: + character_approved_count += 1 + continue + + if ( + before_match_count / len(characters_before_source) >= 0.4 + or after_match_count / len(characters_after_source) >= 0.4 + ): + character_approved_count += 1 + continue + + return character_approved_count / len(ordered_characters) + + +def alpha_unicode_split(decoded_sequence: str) -> list[str]: + """ + Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. + Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; + One containing the latin letters and the other hebrew. + """ + layers: dict[str, str] = {} + + for character in decoded_sequence: + if character.isalpha() is False: + continue + + character_range: str | None = unicode_range(character) + + if character_range is None: + continue + + layer_target_range: str | None = None + + for discovered_range in layers: + if ( + is_suspiciously_successive_range(discovered_range, character_range) + is False + ): + layer_target_range = discovered_range + break + + if layer_target_range is None: + layer_target_range = character_range + + if layer_target_range not in layers: + layers[layer_target_range] = character.lower() + continue + + layers[layer_target_range] += character.lower() + + return list(layers.values()) + + +def merge_coherence_ratios(results: list[CoherenceMatches]) -> CoherenceMatches: + """ + This function merge results previously given by the function coherence_ratio. + The return type is the same as coherence_ratio. + """ + per_language_ratios: dict[str, list[float]] = {} + for result in results: + for sub_result in result: + language, ratio = sub_result + if language not in per_language_ratios: + per_language_ratios[language] = [ratio] + continue + per_language_ratios[language].append(ratio) + + merge = [ + ( + language, + round( + sum(per_language_ratios[language]) / len(per_language_ratios[language]), + 4, + ), + ) + for language in per_language_ratios + ] + + return sorted(merge, key=lambda x: x[1], reverse=True) + + +def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches: + """ + We shall NOT return "English—" in CoherenceMatches because it is an alternative + of "English". This function only keeps the best match and remove the em-dash in it. + """ + index_results: dict[str, list[float]] = dict() + + for result in results: + language, ratio = result + no_em_name: str = language.replace("—", "") + + if no_em_name not in index_results: + index_results[no_em_name] = [] + + index_results[no_em_name].append(ratio) + + if any(len(index_results[e]) > 1 for e in index_results): + filtered_results: CoherenceMatches = [] + + for language in index_results: + filtered_results.append((language, max(index_results[language]))) + + return filtered_results + + return results + + +@lru_cache(maxsize=2048) +def coherence_ratio( + decoded_sequence: str, threshold: float = 0.1, lg_inclusion: str | None = None +) -> CoherenceMatches: + """ + Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. + A layer = Character extraction by alphabets/ranges. + """ + + results: list[tuple[str, float]] = [] + ignore_non_latin: bool = False + + sufficient_match_count: int = 0 + + lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] + if "Latin Based" in lg_inclusion_list: + ignore_non_latin = True + lg_inclusion_list.remove("Latin Based") + + for layer in alpha_unicode_split(decoded_sequence): + sequence_frequencies: TypeCounter[str] = Counter(layer) + most_common = sequence_frequencies.most_common() + + character_count: int = sum(o for c, o in most_common) + + if character_count <= TOO_SMALL_SEQUENCE: + continue + + popular_character_ordered: list[str] = [c for c, o in most_common] + + for language in lg_inclusion_list or alphabet_languages( + popular_character_ordered, ignore_non_latin + ): + ratio: float = characters_popularity_compare( + language, popular_character_ordered + ) + + if ratio < threshold: + continue + elif ratio >= 0.8: + sufficient_match_count += 1 + + results.append((language, round(ratio, 4))) + + if sufficient_match_count >= 3: + break + + return sorted( + filter_alt_coherence_matches(results), key=lambda x: x[1], reverse=True + ) diff --git a/venv/Lib/site-packages/charset_normalizer/cli/__init__.py b/venv/Lib/site-packages/charset_normalizer/cli/__init__.py new file mode 100644 index 00000000..543a5a4d --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer/cli/__init__.py @@ -0,0 +1,8 @@ +from __future__ import annotations + +from .__main__ import cli_detect, query_yes_no + +__all__ = ( + "cli_detect", + "query_yes_no", +) diff --git a/venv/Lib/site-packages/charset_normalizer/cli/__main__.py b/venv/Lib/site-packages/charset_normalizer/cli/__main__.py new file mode 100644 index 00000000..cb64156a --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer/cli/__main__.py @@ -0,0 +1,381 @@ +from __future__ import annotations + +import argparse +import sys +import typing +from json import dumps +from os.path import abspath, basename, dirname, join, realpath +from platform import python_version +from unicodedata import unidata_version + +import charset_normalizer.md as md_module +from charset_normalizer import from_fp +from charset_normalizer.models import CliDetectionResult +from charset_normalizer.version import __version__ + + +def query_yes_no(question: str, default: str = "yes") -> bool: + """Ask a yes/no question via input() and return their answer. + + "question" is a string that is presented to the user. + "default" is the presumed answer if the user just hits . + It must be "yes" (the default), "no" or None (meaning + an answer is required of the user). + + The "answer" return value is True for "yes" or False for "no". + + Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input + """ + valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} + if default is None: + prompt = " [y/n] " + elif default == "yes": + prompt = " [Y/n] " + elif default == "no": + prompt = " [y/N] " + else: + raise ValueError("invalid default answer: '%s'" % default) + + while True: + sys.stdout.write(question + prompt) + choice = input().lower() + if default is not None and choice == "": + return valid[default] + elif choice in valid: + return valid[choice] + else: + sys.stdout.write("Please respond with 'yes' or 'no' (or 'y' or 'n').\n") + + +class FileType: + """Factory for creating file object types + + Instances of FileType are typically passed as type= arguments to the + ArgumentParser add_argument() method. + + Keyword Arguments: + - mode -- A string indicating how the file is to be opened. Accepts the + same values as the builtin open() function. + - bufsize -- The file's desired buffer size. Accepts the same values as + the builtin open() function. + - encoding -- The file's encoding. Accepts the same values as the + builtin open() function. + - errors -- A string indicating how encoding and decoding errors are to + be handled. Accepts the same value as the builtin open() function. + + Backported from CPython 3.12 + """ + + def __init__( + self, + mode: str = "r", + bufsize: int = -1, + encoding: str | None = None, + errors: str | None = None, + ): + self._mode = mode + self._bufsize = bufsize + self._encoding = encoding + self._errors = errors + + def __call__(self, string: str) -> typing.IO: # type: ignore[type-arg] + # the special argument "-" means sys.std{in,out} + if string == "-": + if "r" in self._mode: + return sys.stdin.buffer if "b" in self._mode else sys.stdin + elif any(c in self._mode for c in "wax"): + return sys.stdout.buffer if "b" in self._mode else sys.stdout + else: + msg = f'argument "-" with mode {self._mode}' + raise ValueError(msg) + + # all other arguments are used as file names + try: + return open(string, self._mode, self._bufsize, self._encoding, self._errors) + except OSError as e: + message = f"can't open '{string}': {e}" + raise argparse.ArgumentTypeError(message) + + def __repr__(self) -> str: + args = self._mode, self._bufsize + kwargs = [("encoding", self._encoding), ("errors", self._errors)] + args_str = ", ".join( + [repr(arg) for arg in args if arg != -1] + + [f"{kw}={arg!r}" for kw, arg in kwargs if arg is not None] + ) + return f"{type(self).__name__}({args_str})" + + +def cli_detect(argv: list[str] | None = None) -> int: + """ + CLI assistant using ARGV and ArgumentParser + :param argv: + :return: 0 if everything is fine, anything else equal trouble + """ + parser = argparse.ArgumentParser( + description="The Real First Universal Charset Detector. " + "Discover originating encoding used on text file. " + "Normalize text to unicode." + ) + + parser.add_argument( + "files", type=FileType("rb"), nargs="+", help="File(s) to be analysed" + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + default=False, + dest="verbose", + help="Display complementary information about file if any. " + "Stdout will contain logs about the detection process.", + ) + parser.add_argument( + "-a", + "--with-alternative", + action="store_true", + default=False, + dest="alternatives", + help="Output complementary possibilities if any. Top-level JSON WILL be a list.", + ) + parser.add_argument( + "-n", + "--normalize", + action="store_true", + default=False, + dest="normalize", + help="Permit to normalize input file. If not set, program does not write anything.", + ) + parser.add_argument( + "-m", + "--minimal", + action="store_true", + default=False, + dest="minimal", + help="Only output the charset detected to STDOUT. Disabling JSON output.", + ) + parser.add_argument( + "-r", + "--replace", + action="store_true", + default=False, + dest="replace", + help="Replace file when trying to normalize it instead of creating a new one.", + ) + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + dest="force", + help="Replace file without asking if you are sure, use this flag with caution.", + ) + parser.add_argument( + "-i", + "--no-preemptive", + action="store_true", + default=False, + dest="no_preemptive", + help="Disable looking at a charset declaration to hint the detector.", + ) + parser.add_argument( + "-t", + "--threshold", + action="store", + default=0.2, + type=float, + dest="threshold", + help="Define a custom maximum amount of noise allowed in decoded content. 0. <= noise <= 1.", + ) + parser.add_argument( + "--version", + action="version", + version="Charset-Normalizer {} - Python {} - Unicode {} - SpeedUp {}".format( + __version__, + python_version(), + unidata_version, + "OFF" if md_module.__file__.lower().endswith(".py") else "ON", + ), + help="Show version information and exit.", + ) + + args = parser.parse_args(argv) + + if args.replace is True and args.normalize is False: + if args.files: + for my_file in args.files: + my_file.close() + print("Use --replace in addition of --normalize only.", file=sys.stderr) + return 1 + + if args.force is True and args.replace is False: + if args.files: + for my_file in args.files: + my_file.close() + print("Use --force in addition of --replace only.", file=sys.stderr) + return 1 + + if args.threshold < 0.0 or args.threshold > 1.0: + if args.files: + for my_file in args.files: + my_file.close() + print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) + return 1 + + x_ = [] + + for my_file in args.files: + matches = from_fp( + my_file, + threshold=args.threshold, + explain=args.verbose, + preemptive_behaviour=args.no_preemptive is False, + ) + + best_guess = matches.best() + + if best_guess is None: + print( + 'Unable to identify originating encoding for "{}". {}'.format( + my_file.name, + ( + "Maybe try increasing maximum amount of chaos." + if args.threshold < 1.0 + else "" + ), + ), + file=sys.stderr, + ) + x_.append( + CliDetectionResult( + abspath(my_file.name), + None, + [], + [], + "Unknown", + [], + False, + 1.0, + 0.0, + None, + True, + ) + ) + else: + x_.append( + CliDetectionResult( + abspath(my_file.name), + best_guess.encoding, + best_guess.encoding_aliases, + [ + cp + for cp in best_guess.could_be_from_charset + if cp != best_guess.encoding + ], + best_guess.language, + best_guess.alphabets, + best_guess.bom, + best_guess.percent_chaos, + best_guess.percent_coherence, + None, + True, + ) + ) + + if len(matches) > 1 and args.alternatives: + for el in matches: + if el != best_guess: + x_.append( + CliDetectionResult( + abspath(my_file.name), + el.encoding, + el.encoding_aliases, + [ + cp + for cp in el.could_be_from_charset + if cp != el.encoding + ], + el.language, + el.alphabets, + el.bom, + el.percent_chaos, + el.percent_coherence, + None, + False, + ) + ) + + if args.normalize is True: + if best_guess.encoding.startswith("utf") is True: + print( + '"{}" file does not need to be normalized, as it already came from unicode.'.format( + my_file.name + ), + file=sys.stderr, + ) + if my_file.closed is False: + my_file.close() + continue + + dir_path = dirname(realpath(my_file.name)) + file_name = basename(realpath(my_file.name)) + + o_: list[str] = file_name.split(".") + + if args.replace is False: + o_.insert(-1, best_guess.encoding) + if my_file.closed is False: + my_file.close() + elif ( + args.force is False + and query_yes_no( + 'Are you sure to normalize "{}" by replacing it ?'.format( + my_file.name + ), + "no", + ) + is False + ): + if my_file.closed is False: + my_file.close() + continue + + try: + x_[0].unicode_path = join(dir_path, ".".join(o_)) + + with open(x_[0].unicode_path, "wb") as fp: + fp.write(best_guess.output()) + except OSError as e: + print(str(e), file=sys.stderr) + if my_file.closed is False: + my_file.close() + return 2 + + if my_file.closed is False: + my_file.close() + + if args.minimal is False: + print( + dumps( + [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, + ensure_ascii=True, + indent=4, + ) + ) + else: + for my_file in args.files: + print( + ", ".join( + [ + el.encoding or "undefined" + for el in x_ + if el.path == abspath(my_file.name) + ] + ) + ) + + return 0 + + +if __name__ == "__main__": + cli_detect() diff --git a/venv/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..474ab0b5cb6ecaadffd30786a80213e5789a9b22 GIT binary patch literal 328 zcmXw!ze)o^5XN_JFMqh0#zzpF6ehihAld}QN}FS0T<^wY$=+Vv-3y$ZrJbG6;Ir6S z9#~mOx|!=TLu+$Y5khFUeqL+(U4=nEHrzM6}lQ~^kB>DQMX9| z9;#3|1aN}-n?69Hv?c5ix^CI~0j zXoFm#UCAqbFTDHsia*1P^mQRbDwQ#Yhl a?F)XN(nfI3zu3VK8*gGUh@N|HK=v;q+g+3Z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc b/venv/Lib/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c35abae43764bea012a58a8283f4ed4a21fbff35 GIT binary patch literal 14389 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

^#KoPIs zeN7npGLnLS$3gQEZvu&Vnl}j5m>ESMk>HYn7(gbl&56B4Og=QQRC~*eDKxqiGg!+q znykcDRcv`H3;$b7HC(ImCg7_7iU`DbMHl16Kfw+v9<3*as8aiAMF1ljqY|+~mAVr3 z`NNuOJbMvIyt^bO6N&s0(G^e(<#}lCR^xzr#E+l?k6;om7VMlfeTVY?hAR6NW&IW9 zxI5` YDZTwd`ZiPhOTF_?`oZqf*O8(BKl6Sq)Bpeg literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/charset_normalizer/constant.py b/venv/Lib/site-packages/charset_normalizer/constant.py new file mode 100644 index 00000000..cc71a019 --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer/constant.py @@ -0,0 +1,2015 @@ +from __future__ import annotations + +from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE +from encodings.aliases import aliases +from re import IGNORECASE +from re import compile as re_compile + +# Contain for each eligible encoding a list of/item bytes SIG/BOM +ENCODING_MARKS: dict[str, bytes | list[bytes]] = { + "utf_8": BOM_UTF8, + "utf_7": [ + b"\x2b\x2f\x76\x38", + b"\x2b\x2f\x76\x39", + b"\x2b\x2f\x76\x2b", + b"\x2b\x2f\x76\x2f", + b"\x2b\x2f\x76\x38\x2d", + ], + "gb18030": b"\x84\x31\x95\x33", + "utf_32": [BOM_UTF32_BE, BOM_UTF32_LE], + "utf_16": [BOM_UTF16_BE, BOM_UTF16_LE], +} + +TOO_SMALL_SEQUENCE: int = 32 +TOO_BIG_SEQUENCE: int = int(10e6) + +UTF8_MAXIMAL_ALLOCATION: int = 1_112_064 + +# Up-to-date Unicode ucd/15.0.0 +UNICODE_RANGES_COMBINED: dict[str, range] = { + "Control character": range(32), + "Basic Latin": range(32, 128), + "Latin-1 Supplement": range(128, 256), + "Latin Extended-A": range(256, 384), + "Latin Extended-B": range(384, 592), + "IPA Extensions": range(592, 688), + "Spacing Modifier Letters": range(688, 768), + "Combining Diacritical Marks": range(768, 880), + "Greek and Coptic": range(880, 1024), + "Cyrillic": range(1024, 1280), + "Cyrillic Supplement": range(1280, 1328), + "Armenian": range(1328, 1424), + "Hebrew": range(1424, 1536), + "Arabic": range(1536, 1792), + "Syriac": range(1792, 1872), + "Arabic Supplement": range(1872, 1920), + "Thaana": range(1920, 1984), + "NKo": range(1984, 2048), + "Samaritan": range(2048, 2112), + "Mandaic": range(2112, 2144), + "Syriac Supplement": range(2144, 2160), + "Arabic Extended-B": range(2160, 2208), + "Arabic Extended-A": range(2208, 2304), + "Devanagari": range(2304, 2432), + "Bengali": range(2432, 2560), + "Gurmukhi": range(2560, 2688), + "Gujarati": range(2688, 2816), + "Oriya": range(2816, 2944), + "Tamil": range(2944, 3072), + "Telugu": range(3072, 3200), + "Kannada": range(3200, 3328), + "Malayalam": range(3328, 3456), + "Sinhala": range(3456, 3584), + "Thai": range(3584, 3712), + "Lao": range(3712, 3840), + "Tibetan": range(3840, 4096), + "Myanmar": range(4096, 4256), + "Georgian": range(4256, 4352), + "Hangul Jamo": range(4352, 4608), + "Ethiopic": range(4608, 4992), + "Ethiopic Supplement": range(4992, 5024), + "Cherokee": range(5024, 5120), + "Unified Canadian Aboriginal Syllabics": range(5120, 5760), + "Ogham": range(5760, 5792), + "Runic": range(5792, 5888), + "Tagalog": range(5888, 5920), + "Hanunoo": range(5920, 5952), + "Buhid": range(5952, 5984), + "Tagbanwa": range(5984, 6016), + "Khmer": range(6016, 6144), + "Mongolian": range(6144, 6320), + "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6400), + "Limbu": range(6400, 6480), + "Tai Le": range(6480, 6528), + "New Tai Lue": range(6528, 6624), + "Khmer Symbols": range(6624, 6656), + "Buginese": range(6656, 6688), + "Tai Tham": range(6688, 6832), + "Combining Diacritical Marks Extended": range(6832, 6912), + "Balinese": range(6912, 7040), + "Sundanese": range(7040, 7104), + "Batak": range(7104, 7168), + "Lepcha": range(7168, 7248), + "Ol Chiki": range(7248, 7296), + "Cyrillic Extended-C": range(7296, 7312), + "Georgian Extended": range(7312, 7360), + "Sundanese Supplement": range(7360, 7376), + "Vedic Extensions": range(7376, 7424), + "Phonetic Extensions": range(7424, 7552), + "Phonetic Extensions Supplement": range(7552, 7616), + "Combining Diacritical Marks Supplement": range(7616, 7680), + "Latin Extended Additional": range(7680, 7936), + "Greek Extended": range(7936, 8192), + "General Punctuation": range(8192, 8304), + "Superscripts and Subscripts": range(8304, 8352), + "Currency Symbols": range(8352, 8400), + "Combining Diacritical Marks for Symbols": range(8400, 8448), + "Letterlike Symbols": range(8448, 8528), + "Number Forms": range(8528, 8592), + "Arrows": range(8592, 8704), + "Mathematical Operators": range(8704, 8960), + "Miscellaneous Technical": range(8960, 9216), + "Control Pictures": range(9216, 9280), + "Optical Character Recognition": range(9280, 9312), + "Enclosed Alphanumerics": range(9312, 9472), + "Box Drawing": range(9472, 9600), + "Block Elements": range(9600, 9632), + "Geometric Shapes": range(9632, 9728), + "Miscellaneous Symbols": range(9728, 9984), + "Dingbats": range(9984, 10176), + "Miscellaneous Mathematical Symbols-A": range(10176, 10224), + "Supplemental Arrows-A": range(10224, 10240), + "Braille Patterns": range(10240, 10496), + "Supplemental Arrows-B": range(10496, 10624), + "Miscellaneous Mathematical Symbols-B": range(10624, 10752), + "Supplemental Mathematical Operators": range(10752, 11008), + "Miscellaneous Symbols and Arrows": range(11008, 11264), + "Glagolitic": range(11264, 11360), + "Latin Extended-C": range(11360, 11392), + "Coptic": range(11392, 11520), + "Georgian Supplement": range(11520, 11568), + "Tifinagh": range(11568, 11648), + "Ethiopic Extended": range(11648, 11744), + "Cyrillic Extended-A": range(11744, 11776), + "Supplemental Punctuation": range(11776, 11904), + "CJK Radicals Supplement": range(11904, 12032), + "Kangxi Radicals": range(12032, 12256), + "Ideographic Description Characters": range(12272, 12288), + "CJK Symbols and Punctuation": range(12288, 12352), + "Hiragana": range(12352, 12448), + "Katakana": range(12448, 12544), + "Bopomofo": range(12544, 12592), + "Hangul Compatibility Jamo": range(12592, 12688), + "Kanbun": range(12688, 12704), + "Bopomofo Extended": range(12704, 12736), + "CJK Strokes": range(12736, 12784), + "Katakana Phonetic Extensions": range(12784, 12800), + "Enclosed CJK Letters and Months": range(12800, 13056), + "CJK Compatibility": range(13056, 13312), + "CJK Unified Ideographs Extension A": range(13312, 19904), + "Yijing Hexagram Symbols": range(19904, 19968), + "CJK Unified Ideographs": range(19968, 40960), + "Yi Syllables": range(40960, 42128), + "Yi Radicals": range(42128, 42192), + "Lisu": range(42192, 42240), + "Vai": range(42240, 42560), + "Cyrillic Extended-B": range(42560, 42656), + "Bamum": range(42656, 42752), + "Modifier Tone Letters": range(42752, 42784), + "Latin Extended-D": range(42784, 43008), + "Syloti Nagri": range(43008, 43056), + "Common Indic Number Forms": range(43056, 43072), + "Phags-pa": range(43072, 43136), + "Saurashtra": range(43136, 43232), + "Devanagari Extended": range(43232, 43264), + "Kayah Li": range(43264, 43312), + "Rejang": range(43312, 43360), + "Hangul Jamo Extended-A": range(43360, 43392), + "Javanese": range(43392, 43488), + "Myanmar Extended-B": range(43488, 43520), + "Cham": range(43520, 43616), + "Myanmar Extended-A": range(43616, 43648), + "Tai Viet": range(43648, 43744), + "Meetei Mayek Extensions": range(43744, 43776), + "Ethiopic Extended-A": range(43776, 43824), + "Latin Extended-E": range(43824, 43888), + "Cherokee Supplement": range(43888, 43968), + "Meetei Mayek": range(43968, 44032), + "Hangul Syllables": range(44032, 55216), + "Hangul Jamo Extended-B": range(55216, 55296), + "High Surrogates": range(55296, 56192), + "High Private Use Surrogates": range(56192, 56320), + "Low Surrogates": range(56320, 57344), + "Private Use Area": range(57344, 63744), + "CJK Compatibility Ideographs": range(63744, 64256), + "Alphabetic Presentation Forms": range(64256, 64336), + "Arabic Presentation Forms-A": range(64336, 65024), + "Variation Selectors": range(65024, 65040), + "Vertical Forms": range(65040, 65056), + "Combining Half Marks": range(65056, 65072), + "CJK Compatibility Forms": range(65072, 65104), + "Small Form Variants": range(65104, 65136), + "Arabic Presentation Forms-B": range(65136, 65280), + "Halfwidth and Fullwidth Forms": range(65280, 65520), + "Specials": range(65520, 65536), + "Linear B Syllabary": range(65536, 65664), + "Linear B Ideograms": range(65664, 65792), + "Aegean Numbers": range(65792, 65856), + "Ancient Greek Numbers": range(65856, 65936), + "Ancient Symbols": range(65936, 66000), + "Phaistos Disc": range(66000, 66048), + "Lycian": range(66176, 66208), + "Carian": range(66208, 66272), + "Coptic Epact Numbers": range(66272, 66304), + "Old Italic": range(66304, 66352), + "Gothic": range(66352, 66384), + "Old Permic": range(66384, 66432), + "Ugaritic": range(66432, 66464), + "Old Persian": range(66464, 66528), + "Deseret": range(66560, 66640), + "Shavian": range(66640, 66688), + "Osmanya": range(66688, 66736), + "Osage": range(66736, 66816), + "Elbasan": range(66816, 66864), + "Caucasian Albanian": range(66864, 66928), + "Vithkuqi": range(66928, 67008), + "Linear A": range(67072, 67456), + "Latin Extended-F": range(67456, 67520), + "Cypriot Syllabary": range(67584, 67648), + "Imperial Aramaic": range(67648, 67680), + "Palmyrene": range(67680, 67712), + "Nabataean": range(67712, 67760), + "Hatran": range(67808, 67840), + "Phoenician": range(67840, 67872), + "Lydian": range(67872, 67904), + "Meroitic Hieroglyphs": range(67968, 68000), + "Meroitic Cursive": range(68000, 68096), + "Kharoshthi": range(68096, 68192), + "Old South Arabian": range(68192, 68224), + "Old North Arabian": range(68224, 68256), + "Manichaean": range(68288, 68352), + "Avestan": range(68352, 68416), + "Inscriptional Parthian": range(68416, 68448), + "Inscriptional Pahlavi": range(68448, 68480), + "Psalter Pahlavi": range(68480, 68528), + "Old Turkic": range(68608, 68688), + "Old Hungarian": range(68736, 68864), + "Hanifi Rohingya": range(68864, 68928), + "Rumi Numeral Symbols": range(69216, 69248), + "Yezidi": range(69248, 69312), + "Arabic Extended-C": range(69312, 69376), + "Old Sogdian": range(69376, 69424), + "Sogdian": range(69424, 69488), + "Old Uyghur": range(69488, 69552), + "Chorasmian": range(69552, 69600), + "Elymaic": range(69600, 69632), + "Brahmi": range(69632, 69760), + "Kaithi": range(69760, 69840), + "Sora Sompeng": range(69840, 69888), + "Chakma": range(69888, 69968), + "Mahajani": range(69968, 70016), + "Sharada": range(70016, 70112), + "Sinhala Archaic Numbers": range(70112, 70144), + "Khojki": range(70144, 70224), + "Multani": range(70272, 70320), + "Khudawadi": range(70320, 70400), + "Grantha": range(70400, 70528), + "Newa": range(70656, 70784), + "Tirhuta": range(70784, 70880), + "Siddham": range(71040, 71168), + "Modi": range(71168, 71264), + "Mongolian Supplement": range(71264, 71296), + "Takri": range(71296, 71376), + "Ahom": range(71424, 71504), + "Dogra": range(71680, 71760), + "Warang Citi": range(71840, 71936), + "Dives Akuru": range(71936, 72032), + "Nandinagari": range(72096, 72192), + "Zanabazar Square": range(72192, 72272), + "Soyombo": range(72272, 72368), + "Unified Canadian Aboriginal Syllabics Extended-A": range(72368, 72384), + "Pau Cin Hau": range(72384, 72448), + "Devanagari Extended-A": range(72448, 72544), + "Bhaiksuki": range(72704, 72816), + "Marchen": range(72816, 72896), + "Masaram Gondi": range(72960, 73056), + "Gunjala Gondi": range(73056, 73136), + "Makasar": range(73440, 73472), + "Kawi": range(73472, 73568), + "Lisu Supplement": range(73648, 73664), + "Tamil Supplement": range(73664, 73728), + "Cuneiform": range(73728, 74752), + "Cuneiform Numbers and Punctuation": range(74752, 74880), + "Early Dynastic Cuneiform": range(74880, 75088), + "Cypro-Minoan": range(77712, 77824), + "Egyptian Hieroglyphs": range(77824, 78896), + "Egyptian Hieroglyph Format Controls": range(78896, 78944), + "Anatolian Hieroglyphs": range(82944, 83584), + "Bamum Supplement": range(92160, 92736), + "Mro": range(92736, 92784), + "Tangsa": range(92784, 92880), + "Bassa Vah": range(92880, 92928), + "Pahawh Hmong": range(92928, 93072), + "Medefaidrin": range(93760, 93856), + "Miao": range(93952, 94112), + "Ideographic Symbols and Punctuation": range(94176, 94208), + "Tangut": range(94208, 100352), + "Tangut Components": range(100352, 101120), + "Khitan Small Script": range(101120, 101632), + "Tangut Supplement": range(101632, 101760), + "Kana Extended-B": range(110576, 110592), + "Kana Supplement": range(110592, 110848), + "Kana Extended-A": range(110848, 110896), + "Small Kana Extension": range(110896, 110960), + "Nushu": range(110960, 111360), + "Duployan": range(113664, 113824), + "Shorthand Format Controls": range(113824, 113840), + "Znamenny Musical Notation": range(118528, 118736), + "Byzantine Musical Symbols": range(118784, 119040), + "Musical Symbols": range(119040, 119296), + "Ancient Greek Musical Notation": range(119296, 119376), + "Kaktovik Numerals": range(119488, 119520), + "Mayan Numerals": range(119520, 119552), + "Tai Xuan Jing Symbols": range(119552, 119648), + "Counting Rod Numerals": range(119648, 119680), + "Mathematical Alphanumeric Symbols": range(119808, 120832), + "Sutton SignWriting": range(120832, 121520), + "Latin Extended-G": range(122624, 122880), + "Glagolitic Supplement": range(122880, 122928), + "Cyrillic Extended-D": range(122928, 123024), + "Nyiakeng Puachue Hmong": range(123136, 123216), + "Toto": range(123536, 123584), + "Wancho": range(123584, 123648), + "Nag Mundari": range(124112, 124160), + "Ethiopic Extended-B": range(124896, 124928), + "Mende Kikakui": range(124928, 125152), + "Adlam": range(125184, 125280), + "Indic Siyaq Numbers": range(126064, 126144), + "Ottoman Siyaq Numbers": range(126208, 126288), + "Arabic Mathematical Alphabetic Symbols": range(126464, 126720), + "Mahjong Tiles": range(126976, 127024), + "Domino Tiles": range(127024, 127136), + "Playing Cards": range(127136, 127232), + "Enclosed Alphanumeric Supplement": range(127232, 127488), + "Enclosed Ideographic Supplement": range(127488, 127744), + "Miscellaneous Symbols and Pictographs": range(127744, 128512), + "Emoticons range(Emoji)": range(128512, 128592), + "Ornamental Dingbats": range(128592, 128640), + "Transport and Map Symbols": range(128640, 128768), + "Alchemical Symbols": range(128768, 128896), + "Geometric Shapes Extended": range(128896, 129024), + "Supplemental Arrows-C": range(129024, 129280), + "Supplemental Symbols and Pictographs": range(129280, 129536), + "Chess Symbols": range(129536, 129648), + "Symbols and Pictographs Extended-A": range(129648, 129792), + "Symbols for Legacy Computing": range(129792, 130048), + "CJK Unified Ideographs Extension B": range(131072, 173792), + "CJK Unified Ideographs Extension C": range(173824, 177984), + "CJK Unified Ideographs Extension D": range(177984, 178208), + "CJK Unified Ideographs Extension E": range(178208, 183984), + "CJK Unified Ideographs Extension F": range(183984, 191472), + "CJK Compatibility Ideographs Supplement": range(194560, 195104), + "CJK Unified Ideographs Extension G": range(196608, 201552), + "CJK Unified Ideographs Extension H": range(201552, 205744), + "Tags": range(917504, 917632), + "Variation Selectors Supplement": range(917760, 918000), + "Supplementary Private Use Area-A": range(983040, 1048576), + "Supplementary Private Use Area-B": range(1048576, 1114112), +} + + +UNICODE_SECONDARY_RANGE_KEYWORD: list[str] = [ + "Supplement", + "Extended", + "Extensions", + "Modifier", + "Marks", + "Punctuation", + "Symbols", + "Forms", + "Operators", + "Miscellaneous", + "Drawing", + "Block", + "Shapes", + "Supplemental", + "Tags", +] + +RE_POSSIBLE_ENCODING_INDICATION = re_compile( + r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", + IGNORECASE, +) + +IANA_NO_ALIASES = [ + "cp720", + "cp737", + "cp856", + "cp874", + "cp875", + "cp1006", + "koi8_r", + "koi8_t", + "koi8_u", +] + +IANA_SUPPORTED: list[str] = sorted( + filter( + lambda x: x.endswith("_codec") is False + and x not in {"rot_13", "tactis", "mbcs"}, + list(set(aliases.values())) + IANA_NO_ALIASES, + ) +) + +IANA_SUPPORTED_COUNT: int = len(IANA_SUPPORTED) + +# pre-computed code page that are similar using the function cp_similarity. +IANA_SUPPORTED_SIMILAR: dict[str, list[str]] = { + "cp037": ["cp1026", "cp1140", "cp273", "cp500"], + "cp1026": ["cp037", "cp1140", "cp273", "cp500"], + "cp1125": ["cp866"], + "cp1140": ["cp037", "cp1026", "cp273", "cp500"], + "cp1250": ["iso8859_2"], + "cp1251": ["kz1048", "ptcp154"], + "cp1252": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1253": ["iso8859_7"], + "cp1254": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1257": ["iso8859_13"], + "cp273": ["cp037", "cp1026", "cp1140", "cp500"], + "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], + "cp500": ["cp037", "cp1026", "cp1140", "cp273"], + "cp850": ["cp437", "cp857", "cp858", "cp865"], + "cp857": ["cp850", "cp858", "cp865"], + "cp858": ["cp437", "cp850", "cp857", "cp865"], + "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], + "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], + "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], + "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], + "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], + "cp866": ["cp1125"], + "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], + "iso8859_11": ["tis_620"], + "iso8859_13": ["cp1257"], + "iso8859_14": [ + "iso8859_10", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_15": [ + "cp1252", + "cp1254", + "iso8859_10", + "iso8859_14", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_16": [ + "iso8859_14", + "iso8859_15", + "iso8859_2", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], + "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], + "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], + "iso8859_7": ["cp1253"], + "iso8859_9": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "latin_1", + ], + "kz1048": ["cp1251", "ptcp154"], + "latin_1": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "iso8859_9", + ], + "mac_iceland": ["mac_roman", "mac_turkish"], + "mac_roman": ["mac_iceland", "mac_turkish"], + "mac_turkish": ["mac_iceland", "mac_roman"], + "ptcp154": ["cp1251", "kz1048"], + "tis_620": ["iso8859_11"], +} + + +CHARDET_CORRESPONDENCE: dict[str, str] = { + "iso2022_kr": "ISO-2022-KR", + "iso2022_jp": "ISO-2022-JP", + "euc_kr": "EUC-KR", + "tis_620": "TIS-620", + "utf_32": "UTF-32", + "euc_jp": "EUC-JP", + "koi8_r": "KOI8-R", + "iso8859_1": "ISO-8859-1", + "iso8859_2": "ISO-8859-2", + "iso8859_5": "ISO-8859-5", + "iso8859_6": "ISO-8859-6", + "iso8859_7": "ISO-8859-7", + "iso8859_8": "ISO-8859-8", + "utf_16": "UTF-16", + "cp855": "IBM855", + "mac_cyrillic": "MacCyrillic", + "gb2312": "GB2312", + "gb18030": "GB18030", + "cp932": "CP932", + "cp866": "IBM866", + "utf_8": "utf-8", + "utf_8_sig": "UTF-8-SIG", + "shift_jis": "SHIFT_JIS", + "big5": "Big5", + "cp1250": "windows-1250", + "cp1251": "windows-1251", + "cp1252": "Windows-1252", + "cp1253": "windows-1253", + "cp1255": "windows-1255", + "cp1256": "windows-1256", + "cp1254": "Windows-1254", + "cp949": "CP949", +} + + +COMMON_SAFE_ASCII_CHARACTERS: set[str] = { + "<", + ">", + "=", + ":", + "/", + "&", + ";", + "{", + "}", + "[", + "]", + ",", + "|", + '"', + "-", + "(", + ")", +} + +# Sample character sets — replace with full lists if needed +COMMON_CHINESE_CHARACTERS = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞" + +COMMON_JAPANESE_CHARACTERS = "日一国年大十二本中長出三時行見月分後前生五間上東四今金九入学高円子外八六下来気小七山話女北午百書先名川千水半男西電校語土木聞食車何南万毎白天母火右読友左休父雨" + +COMMON_KOREAN_CHARACTERS = "一二三四五六七八九十百千萬上下左右中人女子大小山川日月火水木金土父母天地國名年時文校學生" + +# Combine all into a set +COMMON_CJK_CHARACTERS = set( + "".join( + [ + COMMON_CHINESE_CHARACTERS, + COMMON_JAPANESE_CHARACTERS, + COMMON_KOREAN_CHARACTERS, + ] + ) +) + +KO_NAMES: set[str] = {"johab", "cp949", "euc_kr"} +ZH_NAMES: set[str] = {"big5", "cp950", "big5hkscs", "hz"} + +# Logging LEVEL below DEBUG +TRACE: int = 5 + + +# Language label that contain the em dash "—" +# character are to be considered alternative seq to origin +FREQUENCIES: dict[str, list[str]] = { + "English": [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "u", + "m", + "f", + "p", + "g", + "w", + "y", + "b", + "v", + "k", + "x", + "j", + "z", + "q", + ], + "English—": [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "m", + "u", + "f", + "p", + "g", + "w", + "b", + "y", + "v", + "k", + "j", + "x", + "z", + "q", + ], + "German": [ + "e", + "n", + "i", + "r", + "s", + "t", + "a", + "d", + "h", + "u", + "l", + "g", + "o", + "c", + "m", + "b", + "f", + "k", + "w", + "z", + "p", + "v", + "ü", + "ä", + "ö", + "j", + ], + "French": [ + "e", + "a", + "s", + "n", + "i", + "t", + "r", + "l", + "u", + "o", + "d", + "c", + "p", + "m", + "é", + "v", + "g", + "f", + "b", + "h", + "q", + "à", + "x", + "è", + "y", + "j", + ], + "Dutch": [ + "e", + "n", + "a", + "i", + "r", + "t", + "o", + "d", + "s", + "l", + "g", + "h", + "v", + "m", + "u", + "k", + "c", + "p", + "b", + "w", + "j", + "z", + "f", + "y", + "x", + "ë", + ], + "Italian": [ + "e", + "i", + "a", + "o", + "n", + "l", + "t", + "r", + "s", + "c", + "d", + "u", + "p", + "m", + "g", + "v", + "f", + "b", + "z", + "h", + "q", + "è", + "à", + "k", + "y", + "ò", + ], + "Polish": [ + "a", + "i", + "o", + "e", + "n", + "r", + "z", + "w", + "s", + "c", + "t", + "k", + "y", + "d", + "p", + "m", + "u", + "l", + "j", + "ł", + "g", + "b", + "h", + "ą", + "ę", + "ó", + ], + "Spanish": [ + "e", + "a", + "o", + "n", + "s", + "r", + "i", + "l", + "d", + "t", + "c", + "u", + "m", + "p", + "b", + "g", + "v", + "f", + "y", + "ó", + "h", + "q", + "í", + "j", + "z", + "á", + ], + "Russian": [ + "о", + "а", + "е", + "и", + "н", + "с", + "т", + "р", + "в", + "л", + "к", + "м", + "д", + "п", + "у", + "г", + "я", + "ы", + "з", + "б", + "й", + "ь", + "ч", + "х", + "ж", + "ц", + ], + # Jap-Kanji + "Japanese": [ + "人", + "一", + "大", + "亅", + "丁", + "丨", + "竹", + "笑", + "口", + "日", + "今", + "二", + "彳", + "行", + "十", + "土", + "丶", + "寸", + "寺", + "時", + "乙", + "丿", + "乂", + "气", + "気", + "冂", + "巾", + "亠", + "市", + "目", + "儿", + "見", + "八", + "小", + "凵", + "県", + "月", + "彐", + "門", + "間", + "木", + "東", + "山", + "出", + "本", + "中", + "刀", + "分", + "耳", + "又", + "取", + "最", + "言", + "田", + "心", + "思", + "刂", + "前", + "京", + "尹", + "事", + "生", + "厶", + "云", + "会", + "未", + "来", + "白", + "冫", + "楽", + "灬", + "馬", + "尸", + "尺", + "駅", + "明", + "耂", + "者", + "了", + "阝", + "都", + "高", + "卜", + "占", + "厂", + "广", + "店", + "子", + "申", + "奄", + "亻", + "俺", + "上", + "方", + "冖", + "学", + "衣", + "艮", + "食", + "自", + ], + # Jap-Katakana + "Japanese—": [ + "ー", + "ン", + "ス", + "・", + "ル", + "ト", + "リ", + "イ", + "ア", + "ラ", + "ッ", + "ク", + "ド", + "シ", + "レ", + "ジ", + "タ", + "フ", + "ロ", + "カ", + "テ", + "マ", + "ィ", + "グ", + "バ", + "ム", + "プ", + "オ", + "コ", + "デ", + "ニ", + "ウ", + "メ", + "サ", + "ビ", + "ナ", + "ブ", + "ャ", + "エ", + "ュ", + "チ", + "キ", + "ズ", + "ダ", + "パ", + "ミ", + "ェ", + "ョ", + "ハ", + "セ", + "ベ", + "ガ", + "モ", + "ツ", + "ネ", + "ボ", + "ソ", + "ノ", + "ァ", + "ヴ", + "ワ", + "ポ", + "ペ", + "ピ", + "ケ", + "ゴ", + "ギ", + "ザ", + "ホ", + "ゲ", + "ォ", + "ヤ", + "ヒ", + "ユ", + "ヨ", + "ヘ", + "ゼ", + "ヌ", + "ゥ", + "ゾ", + "ヶ", + "ヂ", + "ヲ", + "ヅ", + "ヵ", + "ヱ", + "ヰ", + "ヮ", + "ヽ", + "゠", + "ヾ", + "ヷ", + "ヿ", + "ヸ", + "ヹ", + "ヺ", + ], + # Jap-Hiragana + "Japanese——": [ + "の", + "に", + "る", + "た", + "と", + "は", + "し", + "い", + "を", + "で", + "て", + "が", + "な", + "れ", + "か", + "ら", + "さ", + "っ", + "り", + "す", + "あ", + "も", + "こ", + "ま", + "う", + "く", + "よ", + "き", + "ん", + "め", + "お", + "け", + "そ", + "つ", + "だ", + "や", + "え", + "ど", + "わ", + "ち", + "み", + "せ", + "じ", + "ば", + "へ", + "び", + "ず", + "ろ", + "ほ", + "げ", + "む", + "べ", + "ひ", + "ょ", + "ゆ", + "ぶ", + "ご", + "ゃ", + "ね", + "ふ", + "ぐ", + "ぎ", + "ぼ", + "ゅ", + "づ", + "ざ", + "ぞ", + "ぬ", + "ぜ", + "ぱ", + "ぽ", + "ぷ", + "ぴ", + "ぃ", + "ぁ", + "ぇ", + "ぺ", + "ゞ", + "ぢ", + "ぉ", + "ぅ", + "ゐ", + "ゝ", + "ゑ", + "゛", + "゜", + "ゎ", + "ゔ", + "゚", + "ゟ", + "゙", + "ゕ", + "ゖ", + ], + "Portuguese": [ + "a", + "e", + "o", + "s", + "i", + "r", + "d", + "n", + "t", + "m", + "u", + "c", + "l", + "p", + "g", + "v", + "b", + "f", + "h", + "ã", + "q", + "é", + "ç", + "á", + "z", + "í", + ], + "Swedish": [ + "e", + "a", + "n", + "r", + "t", + "s", + "i", + "l", + "d", + "o", + "m", + "k", + "g", + "v", + "h", + "f", + "u", + "p", + "ä", + "c", + "b", + "ö", + "å", + "y", + "j", + "x", + ], + "Chinese": [ + "的", + "一", + "是", + "不", + "了", + "在", + "人", + "有", + "我", + "他", + "这", + "个", + "们", + "中", + "来", + "上", + "大", + "为", + "和", + "国", + "地", + "到", + "以", + "说", + "时", + "要", + "就", + "出", + "会", + "可", + "也", + "你", + "对", + "生", + "能", + "而", + "子", + "那", + "得", + "于", + "着", + "下", + "自", + "之", + "年", + "过", + "发", + "后", + "作", + "里", + "用", + "道", + "行", + "所", + "然", + "家", + "种", + "事", + "成", + "方", + "多", + "经", + "么", + "去", + "法", + "学", + "如", + "都", + "同", + "现", + "当", + "没", + "动", + "面", + "起", + "看", + "定", + "天", + "分", + "还", + "进", + "好", + "小", + "部", + "其", + "些", + "主", + "样", + "理", + "心", + "她", + "本", + "前", + "开", + "但", + "因", + "只", + "从", + "想", + "实", + ], + "Ukrainian": [ + "о", + "а", + "н", + "і", + "и", + "р", + "в", + "т", + "е", + "с", + "к", + "л", + "у", + "д", + "м", + "п", + "з", + "я", + "ь", + "б", + "г", + "й", + "ч", + "х", + "ц", + "ї", + ], + "Norwegian": [ + "e", + "r", + "n", + "t", + "a", + "s", + "i", + "o", + "l", + "d", + "g", + "k", + "m", + "v", + "f", + "p", + "u", + "b", + "h", + "å", + "y", + "j", + "ø", + "c", + "æ", + "w", + ], + "Finnish": [ + "a", + "i", + "n", + "t", + "e", + "s", + "l", + "o", + "u", + "k", + "ä", + "m", + "r", + "v", + "j", + "h", + "p", + "y", + "d", + "ö", + "g", + "c", + "b", + "f", + "w", + "z", + ], + "Vietnamese": [ + "n", + "h", + "t", + "i", + "c", + "g", + "a", + "o", + "u", + "m", + "l", + "r", + "à", + "đ", + "s", + "e", + "v", + "p", + "b", + "y", + "ư", + "d", + "á", + "k", + "ộ", + "ế", + ], + "Czech": [ + "o", + "e", + "a", + "n", + "t", + "s", + "i", + "l", + "v", + "r", + "k", + "d", + "u", + "m", + "p", + "í", + "c", + "h", + "z", + "á", + "y", + "j", + "b", + "ě", + "é", + "ř", + ], + "Hungarian": [ + "e", + "a", + "t", + "l", + "s", + "n", + "k", + "r", + "i", + "o", + "z", + "á", + "é", + "g", + "m", + "b", + "y", + "v", + "d", + "h", + "u", + "p", + "j", + "ö", + "f", + "c", + ], + "Korean": [ + "이", + "다", + "에", + "의", + "는", + "로", + "하", + "을", + "가", + "고", + "지", + "서", + "한", + "은", + "기", + "으", + "년", + "대", + "사", + "시", + "를", + "리", + "도", + "인", + "스", + "일", + ], + "Indonesian": [ + "a", + "n", + "e", + "i", + "r", + "t", + "u", + "s", + "d", + "k", + "m", + "l", + "g", + "p", + "b", + "o", + "h", + "y", + "j", + "c", + "w", + "f", + "v", + "z", + "x", + "q", + ], + "Turkish": [ + "a", + "e", + "i", + "n", + "r", + "l", + "ı", + "k", + "d", + "t", + "s", + "m", + "y", + "u", + "o", + "b", + "ü", + "ş", + "v", + "g", + "z", + "h", + "c", + "p", + "ç", + "ğ", + ], + "Romanian": [ + "e", + "i", + "a", + "r", + "n", + "t", + "u", + "l", + "o", + "c", + "s", + "d", + "p", + "m", + "ă", + "f", + "v", + "î", + "g", + "b", + "ș", + "ț", + "z", + "h", + "â", + "j", + ], + "Farsi": [ + "ا", + "ی", + "ر", + "د", + "ن", + "ه", + "و", + "م", + "ت", + "ب", + "س", + "ل", + "ک", + "ش", + "ز", + "ف", + "گ", + "ع", + "خ", + "ق", + "ج", + "آ", + "پ", + "ح", + "ط", + "ص", + ], + "Arabic": [ + "ا", + "ل", + "ي", + "م", + "و", + "ن", + "ر", + "ت", + "ب", + "ة", + "ع", + "د", + "س", + "ف", + "ه", + "ك", + "ق", + "أ", + "ح", + "ج", + "ش", + "ط", + "ص", + "ى", + "خ", + "إ", + ], + "Danish": [ + "e", + "r", + "n", + "t", + "a", + "i", + "s", + "d", + "l", + "o", + "g", + "m", + "k", + "f", + "v", + "u", + "b", + "h", + "p", + "å", + "y", + "ø", + "æ", + "c", + "j", + "w", + ], + "Serbian": [ + "а", + "и", + "о", + "е", + "н", + "р", + "с", + "у", + "т", + "к", + "ј", + "в", + "д", + "м", + "п", + "л", + "г", + "з", + "б", + "a", + "i", + "e", + "o", + "n", + "ц", + "ш", + ], + "Lithuanian": [ + "i", + "a", + "s", + "o", + "r", + "e", + "t", + "n", + "u", + "k", + "m", + "l", + "p", + "v", + "d", + "j", + "g", + "ė", + "b", + "y", + "ų", + "š", + "ž", + "c", + "ą", + "į", + ], + "Slovene": [ + "e", + "a", + "i", + "o", + "n", + "r", + "s", + "l", + "t", + "j", + "v", + "k", + "d", + "p", + "m", + "u", + "z", + "b", + "g", + "h", + "č", + "c", + "š", + "ž", + "f", + "y", + ], + "Slovak": [ + "o", + "a", + "e", + "n", + "i", + "r", + "v", + "t", + "s", + "l", + "k", + "d", + "m", + "p", + "u", + "c", + "h", + "j", + "b", + "z", + "á", + "y", + "ý", + "í", + "č", + "é", + ], + "Hebrew": [ + "י", + "ו", + "ה", + "ל", + "ר", + "ב", + "ת", + "מ", + "א", + "ש", + "נ", + "ע", + "ם", + "ד", + "ק", + "ח", + "פ", + "ס", + "כ", + "ג", + "ט", + "צ", + "ן", + "ז", + "ך", + ], + "Bulgarian": [ + "а", + "и", + "о", + "е", + "н", + "т", + "р", + "с", + "в", + "л", + "к", + "д", + "п", + "м", + "з", + "г", + "я", + "ъ", + "у", + "б", + "ч", + "ц", + "й", + "ж", + "щ", + "х", + ], + "Croatian": [ + "a", + "i", + "o", + "e", + "n", + "r", + "j", + "s", + "t", + "u", + "k", + "l", + "v", + "d", + "m", + "p", + "g", + "z", + "b", + "c", + "č", + "h", + "š", + "ž", + "ć", + "f", + ], + "Hindi": [ + "क", + "र", + "स", + "न", + "त", + "म", + "ह", + "प", + "य", + "ल", + "व", + "ज", + "द", + "ग", + "ब", + "श", + "ट", + "अ", + "ए", + "थ", + "भ", + "ड", + "च", + "ध", + "ष", + "इ", + ], + "Estonian": [ + "a", + "i", + "e", + "s", + "t", + "l", + "u", + "n", + "o", + "k", + "r", + "d", + "m", + "v", + "g", + "p", + "j", + "h", + "ä", + "b", + "õ", + "ü", + "f", + "c", + "ö", + "y", + ], + "Thai": [ + "า", + "น", + "ร", + "อ", + "ก", + "เ", + "ง", + "ม", + "ย", + "ล", + "ว", + "ด", + "ท", + "ส", + "ต", + "ะ", + "ป", + "บ", + "ค", + "ห", + "แ", + "จ", + "พ", + "ช", + "ข", + "ใ", + ], + "Greek": [ + "α", + "τ", + "ο", + "ι", + "ε", + "ν", + "ρ", + "σ", + "κ", + "η", + "π", + "ς", + "υ", + "μ", + "λ", + "ί", + "ό", + "ά", + "γ", + "έ", + "δ", + "ή", + "ω", + "χ", + "θ", + "ύ", + ], + "Tamil": [ + "க", + "த", + "ப", + "ட", + "ர", + "ம", + "ல", + "ன", + "வ", + "ற", + "ய", + "ள", + "ச", + "ந", + "இ", + "ண", + "அ", + "ஆ", + "ழ", + "ங", + "எ", + "உ", + "ஒ", + "ஸ", + ], + "Kazakh": [ + "а", + "ы", + "е", + "н", + "т", + "р", + "л", + "і", + "д", + "с", + "м", + "қ", + "к", + "о", + "б", + "и", + "у", + "ғ", + "ж", + "ң", + "з", + "ш", + "й", + "п", + "г", + "ө", + ], +} + +LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES) diff --git a/venv/Lib/site-packages/charset_normalizer/legacy.py b/venv/Lib/site-packages/charset_normalizer/legacy.py new file mode 100644 index 00000000..e221beca --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer/legacy.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any +from warnings import warn + +from .api import from_bytes +from .constant import CHARDET_CORRESPONDENCE + +# TODO: remove this check when dropping Python 3.7 support +if TYPE_CHECKING: + from typing_extensions import TypedDict + + class ResultDict(TypedDict): + encoding: str | None + language: str + confidence: float | None + + +def detect( + byte_str: bytes, should_rename_legacy: bool = False, **kwargs: Any +) -> ResultDict: + """ + chardet legacy method + Detect the encoding of the given byte string. It should be mostly backward-compatible. + Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) + This function is deprecated and should be used to migrate your project easily, consult the documentation for + further information. Not planned for removal. + + :param byte_str: The byte sequence to examine. + :param should_rename_legacy: Should we rename legacy encodings + to their more modern equivalents? + """ + if len(kwargs): + warn( + f"charset-normalizer disregard arguments '{','.join(list(kwargs.keys()))}' in legacy function detect()" + ) + + if not isinstance(byte_str, (bytearray, bytes)): + raise TypeError( # pragma: nocover + f"Expected object of type bytes or bytearray, got: {type(byte_str)}" + ) + + if isinstance(byte_str, bytearray): + byte_str = bytes(byte_str) + + r = from_bytes(byte_str).best() + + encoding = r.encoding if r is not None else None + language = r.language if r is not None and r.language != "Unknown" else "" + confidence = 1.0 - r.chaos if r is not None else None + + # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process + # but chardet does return 'utf-8-sig' and it is a valid codec name. + if r is not None and encoding == "utf_8" and r.bom: + encoding += "_sig" + + if should_rename_legacy is False and encoding in CHARDET_CORRESPONDENCE: + encoding = CHARDET_CORRESPONDENCE[encoding] + + return { + "encoding": encoding, + "language": language, + "confidence": confidence, + } diff --git a/venv/Lib/site-packages/charset_normalizer/md.cp312-win_amd64.pyd b/venv/Lib/site-packages/charset_normalizer/md.cp312-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..4c6c2cf5020169b7188e0ce9f1634524209fad6a GIT binary patch literal 10752 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 bool: + """ + Determine if given character should be fed in. + """ + raise NotImplementedError # pragma: nocover + + def feed(self, character: str) -> None: + """ + The main routine to be executed upon character. + Insert the logic in witch the text would be considered chaotic. + """ + raise NotImplementedError # pragma: nocover + + def reset(self) -> None: # pragma: no cover + """ + Permit to reset the plugin to the initial state. + """ + raise NotImplementedError + + @property + def ratio(self) -> float: + """ + Compute the chaos ratio based on what your feed() has seen. + Must NOT be lower than 0.; No restriction gt 0. + """ + raise NotImplementedError # pragma: nocover + + +class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._punctuation_count: int = 0 + self._symbol_count: int = 0 + self._character_count: int = 0 + + self._last_printable_char: str | None = None + self._frenzy_symbol_in_word: bool = False + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character != self._last_printable_char + and character not in COMMON_SAFE_ASCII_CHARACTERS + ): + if is_punctuation(character): + self._punctuation_count += 1 + elif ( + character.isdigit() is False + and is_symbol(character) + and is_emoticon(character) is False + ): + self._symbol_count += 2 + + self._last_printable_char = character + + def reset(self) -> None: # Abstract + self._punctuation_count = 0 + self._character_count = 0 + self._symbol_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_punctuation: float = ( + self._punctuation_count + self._symbol_count + ) / self._character_count + + return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 + + +class TooManyAccentuatedPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count: int = 0 + self._accentuated_count: int = 0 + + def eligible(self, character: str) -> bool: + return character.isalpha() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_accentuated(character): + self._accentuated_count += 1 + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._accentuated_count = 0 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + ratio_of_accentuation: float = self._accentuated_count / self._character_count + return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 + + +class UnprintablePlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._unprintable_count: int = 0 + self._character_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if is_unprintable(character): + self._unprintable_count += 1 + self._character_count += 1 + + def reset(self) -> None: # Abstract + self._unprintable_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._unprintable_count * 8) / self._character_count + + +class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._successive_count: int = 0 + self._character_count: int = 0 + + self._last_latin_character: str | None = None + + def eligible(self, character: str) -> bool: + return character.isalpha() and is_latin(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + if ( + self._last_latin_character is not None + and is_accentuated(character) + and is_accentuated(self._last_latin_character) + ): + if character.isupper() and self._last_latin_character.isupper(): + self._successive_count += 1 + # Worse if its the same char duplicated with different accent. + if remove_accent(character) == remove_accent(self._last_latin_character): + self._successive_count += 1 + self._last_latin_character = character + + def reset(self) -> None: # Abstract + self._successive_count = 0 + self._character_count = 0 + self._last_latin_character = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._successive_count * 2) / self._character_count + + +class SuspiciousRange(MessDetectorPlugin): + def __init__(self) -> None: + self._suspicious_successive_range_count: int = 0 + self._character_count: int = 0 + self._last_printable_seen: str | None = None + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character.isspace() + or is_punctuation(character) + or character in COMMON_SAFE_ASCII_CHARACTERS + ): + self._last_printable_seen = None + return + + if self._last_printable_seen is None: + self._last_printable_seen = character + return + + unicode_range_a: str | None = unicode_range(self._last_printable_seen) + unicode_range_b: str | None = unicode_range(character) + + if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): + self._suspicious_successive_range_count += 1 + + self._last_printable_seen = character + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._suspicious_successive_range_count = 0 + self._last_printable_seen = None + + @property + def ratio(self) -> float: + if self._character_count <= 13: + return 0.0 + + ratio_of_suspicious_range_usage: float = ( + self._suspicious_successive_range_count * 2 + ) / self._character_count + + return ratio_of_suspicious_range_usage + + +class SuperWeirdWordPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._word_count: int = 0 + self._bad_word_count: int = 0 + self._foreign_long_count: int = 0 + + self._is_current_word_bad: bool = False + self._foreign_long_watch: bool = False + + self._character_count: int = 0 + self._bad_character_count: int = 0 + + self._buffer: str = "" + self._buffer_accent_count: int = 0 + self._buffer_glyph_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character.isalpha(): + self._buffer += character + if is_accentuated(character): + self._buffer_accent_count += 1 + if ( + self._foreign_long_watch is False + and (is_latin(character) is False or is_accentuated(character)) + and is_cjk(character) is False + and is_hangul(character) is False + and is_katakana(character) is False + and is_hiragana(character) is False + and is_thai(character) is False + ): + self._foreign_long_watch = True + if ( + is_cjk(character) + or is_hangul(character) + or is_katakana(character) + or is_hiragana(character) + or is_thai(character) + ): + self._buffer_glyph_count += 1 + return + if not self._buffer: + return + if ( + character.isspace() or is_punctuation(character) or is_separator(character) + ) and self._buffer: + self._word_count += 1 + buffer_length: int = len(self._buffer) + + self._character_count += buffer_length + + if buffer_length >= 4: + if self._buffer_accent_count / buffer_length >= 0.5: + self._is_current_word_bad = True + # Word/Buffer ending with an upper case accentuated letter are so rare, + # that we will consider them all as suspicious. Same weight as foreign_long suspicious. + elif ( + is_accentuated(self._buffer[-1]) + and self._buffer[-1].isupper() + and all(_.isupper() for _ in self._buffer) is False + ): + self._foreign_long_count += 1 + self._is_current_word_bad = True + elif self._buffer_glyph_count == 1: + self._is_current_word_bad = True + self._foreign_long_count += 1 + if buffer_length >= 24 and self._foreign_long_watch: + camel_case_dst = [ + i + for c, i in zip(self._buffer, range(0, buffer_length)) + if c.isupper() + ] + probable_camel_cased: bool = False + + if camel_case_dst and (len(camel_case_dst) / buffer_length <= 0.3): + probable_camel_cased = True + + if not probable_camel_cased: + self._foreign_long_count += 1 + self._is_current_word_bad = True + + if self._is_current_word_bad: + self._bad_word_count += 1 + self._bad_character_count += len(self._buffer) + self._is_current_word_bad = False + + self._foreign_long_watch = False + self._buffer = "" + self._buffer_accent_count = 0 + self._buffer_glyph_count = 0 + elif ( + character not in {"<", ">", "-", "=", "~", "|", "_"} + and character.isdigit() is False + and is_symbol(character) + ): + self._is_current_word_bad = True + self._buffer += character + + def reset(self) -> None: # Abstract + self._buffer = "" + self._is_current_word_bad = False + self._foreign_long_watch = False + self._bad_word_count = 0 + self._word_count = 0 + self._character_count = 0 + self._bad_character_count = 0 + self._foreign_long_count = 0 + + @property + def ratio(self) -> float: + if self._word_count <= 10 and self._foreign_long_count == 0: + return 0.0 + + return self._bad_character_count / self._character_count + + +class CjkUncommonPlugin(MessDetectorPlugin): + """ + Detect messy CJK text that probably means nothing. + """ + + def __init__(self) -> None: + self._character_count: int = 0 + self._uncommon_count: int = 0 + + def eligible(self, character: str) -> bool: + return is_cjk(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_cjk_uncommon(character): + self._uncommon_count += 1 + return + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._uncommon_count = 0 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + uncommon_form_usage: float = self._uncommon_count / self._character_count + + # we can be pretty sure it's garbage when uncommon characters are widely + # used. otherwise it could just be traditional chinese for example. + return uncommon_form_usage / 10 if uncommon_form_usage > 0.5 else 0.0 + + +class ArchaicUpperLowerPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._buf: bool = False + + self._character_count_since_last_sep: int = 0 + + self._successive_upper_lower_count: int = 0 + self._successive_upper_lower_count_final: int = 0 + + self._character_count: int = 0 + + self._last_alpha_seen: str | None = None + self._current_ascii_only: bool = True + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + is_concerned = character.isalpha() and is_case_variable(character) + chunk_sep = is_concerned is False + + if chunk_sep and self._character_count_since_last_sep > 0: + if ( + self._character_count_since_last_sep <= 64 + and character.isdigit() is False + and self._current_ascii_only is False + ): + self._successive_upper_lower_count_final += ( + self._successive_upper_lower_count + ) + + self._successive_upper_lower_count = 0 + self._character_count_since_last_sep = 0 + self._last_alpha_seen = None + self._buf = False + self._character_count += 1 + self._current_ascii_only = True + + return + + if self._current_ascii_only is True and character.isascii() is False: + self._current_ascii_only = False + + if self._last_alpha_seen is not None: + if (character.isupper() and self._last_alpha_seen.islower()) or ( + character.islower() and self._last_alpha_seen.isupper() + ): + if self._buf is True: + self._successive_upper_lower_count += 2 + self._buf = False + else: + self._buf = True + else: + self._buf = False + + self._character_count += 1 + self._character_count_since_last_sep += 1 + self._last_alpha_seen = character + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._character_count_since_last_sep = 0 + self._successive_upper_lower_count = 0 + self._successive_upper_lower_count_final = 0 + self._last_alpha_seen = None + self._buf = False + self._current_ascii_only = True + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return self._successive_upper_lower_count_final / self._character_count + + +class ArabicIsolatedFormPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count: int = 0 + self._isolated_form_count: int = 0 + + def reset(self) -> None: # Abstract + self._character_count = 0 + self._isolated_form_count = 0 + + def eligible(self, character: str) -> bool: + return is_arabic(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_arabic_isolated_form(character): + self._isolated_form_count += 1 + + @property + def ratio(self) -> float: + if self._character_count < 8: + return 0.0 + + isolated_form_usage: float = self._isolated_form_count / self._character_count + + return isolated_form_usage + + +@lru_cache(maxsize=1024) +def is_suspiciously_successive_range( + unicode_range_a: str | None, unicode_range_b: str | None +) -> bool: + """ + Determine if two Unicode range seen next to each other can be considered as suspicious. + """ + if unicode_range_a is None or unicode_range_b is None: + return True + + if unicode_range_a == unicode_range_b: + return False + + if "Latin" in unicode_range_a and "Latin" in unicode_range_b: + return False + + if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: + return False + + # Latin characters can be accompanied with a combining diacritical mark + # eg. Vietnamese. + if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( + "Combining" in unicode_range_a or "Combining" in unicode_range_b + ): + return False + + keywords_range_a, keywords_range_b = ( + unicode_range_a.split(" "), + unicode_range_b.split(" "), + ) + + for el in keywords_range_a: + if el in UNICODE_SECONDARY_RANGE_KEYWORD: + continue + if el in keywords_range_b: + return False + + # Japanese Exception + range_a_jp_chars, range_b_jp_chars = ( + unicode_range_a + in ( + "Hiragana", + "Katakana", + ), + unicode_range_b in ("Hiragana", "Katakana"), + ) + if (range_a_jp_chars or range_b_jp_chars) and ( + "CJK" in unicode_range_a or "CJK" in unicode_range_b + ): + return False + if range_a_jp_chars and range_b_jp_chars: + return False + + if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: + if "CJK" in unicode_range_a or "CJK" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + # Chinese/Japanese use dedicated range for punctuation and/or separators. + if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( + unicode_range_a in ["Katakana", "Hiragana"] + and unicode_range_b in ["Katakana", "Hiragana"] + ): + if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: + return False + if "Forms" in unicode_range_a or "Forms" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + return True + + +@lru_cache(maxsize=2048) +def mess_ratio( + decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False +) -> float: + """ + Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. + """ + + detectors: list[MessDetectorPlugin] = [ + md_class() for md_class in MessDetectorPlugin.__subclasses__() + ] + + length: int = len(decoded_sequence) + 1 + + mean_mess_ratio: float = 0.0 + + if length < 512: + intermediary_mean_mess_ratio_calc: int = 32 + elif length <= 1024: + intermediary_mean_mess_ratio_calc = 64 + else: + intermediary_mean_mess_ratio_calc = 128 + + for character, index in zip(decoded_sequence + "\n", range(length)): + for detector in detectors: + if detector.eligible(character): + detector.feed(character) + + if ( + index > 0 and index % intermediary_mean_mess_ratio_calc == 0 + ) or index == length - 1: + mean_mess_ratio = sum(dt.ratio for dt in detectors) + + if mean_mess_ratio >= maximum_threshold: + break + + if debug: + logger = getLogger("charset_normalizer") + + logger.log( + TRACE, + "Mess-detector extended-analysis start. " + f"intermediary_mean_mess_ratio_calc={intermediary_mean_mess_ratio_calc} mean_mess_ratio={mean_mess_ratio} " + f"maximum_threshold={maximum_threshold}", + ) + + if len(decoded_sequence) > 16: + logger.log(TRACE, f"Starting with: {decoded_sequence[:16]}") + logger.log(TRACE, f"Ending with: {decoded_sequence[-16::]}") + + for dt in detectors: + logger.log(TRACE, f"{dt.__class__}: {dt.ratio}") + + return round(mean_mess_ratio, 3) diff --git a/venv/Lib/site-packages/charset_normalizer/md__mypyc.cp312-win_amd64.pyd b/venv/Lib/site-packages/charset_normalizer/md__mypyc.cp312-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..18e8e829786a3224858e869563c85f2711113adf GIT binary patch literal 125952 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%0Am0DUX*Y%Hp^Calgw?`Ds7v=X}Ta{b7H^ANMEx z7^4^)7$0b_bX2-3$;wz|vXU9h4*G*bgA;>OgQ;q|nyu!lPSvjtS4XPj)rqRq+H1*L zPi?9u^+-KdPuDZ`@%lu4vfkbZH98v6My!!-89L_n+^81&XW;l$(TFo zPPsxX!=*?mUg|0(m<2thOsTKb&kP6!dw0Ye^V->)x))=_GVN!G;ShT=G7zdAVFm}l#`x>NV-&H6}vv>t9m8u3O~ zBh^TMBKk7UXTObmh`2|cn3Hglj^p^wq%-A&@*TuFmQUo9`5xw8U%o$x_9W2`6*>yh zLhR$1Hw#0BNU?{RILvVrayy7J9II}WY?g{4OWO<6{ zCH!PC11J3{KThoW2Ks}TMJusNwvr2C6dsHWrkRDg!O_97!7y>^Axb(A`>OrHTx?c{ zg84XF9kbD!3g)FoFkFk+D0bBnHj+KHjE!c0&9M<3u8r8JPShrY$hOx*^^SU&Ssi6w m$Ln2n6YF%n$Hu#_-fv?*RF_73Bhg3(^PGA8|G)oQ1pWn=iNkUL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/charset_normalizer/models.py b/venv/Lib/site-packages/charset_normalizer/models.py new file mode 100644 index 00000000..1042758f --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer/models.py @@ -0,0 +1,360 @@ +from __future__ import annotations + +from encodings.aliases import aliases +from hashlib import sha256 +from json import dumps +from re import sub +from typing import Any, Iterator, List, Tuple + +from .constant import RE_POSSIBLE_ENCODING_INDICATION, TOO_BIG_SEQUENCE +from .utils import iana_name, is_multi_byte_encoding, unicode_range + + +class CharsetMatch: + def __init__( + self, + payload: bytes, + guessed_encoding: str, + mean_mess_ratio: float, + has_sig_or_bom: bool, + languages: CoherenceMatches, + decoded_payload: str | None = None, + preemptive_declaration: str | None = None, + ): + self._payload: bytes = payload + + self._encoding: str = guessed_encoding + self._mean_mess_ratio: float = mean_mess_ratio + self._languages: CoherenceMatches = languages + self._has_sig_or_bom: bool = has_sig_or_bom + self._unicode_ranges: list[str] | None = None + + self._leaves: list[CharsetMatch] = [] + self._mean_coherence_ratio: float = 0.0 + + self._output_payload: bytes | None = None + self._output_encoding: str | None = None + + self._string: str | None = decoded_payload + + self._preemptive_declaration: str | None = preemptive_declaration + + def __eq__(self, other: object) -> bool: + if not isinstance(other, CharsetMatch): + if isinstance(other, str): + return iana_name(other) == self.encoding + return False + return self.encoding == other.encoding and self.fingerprint == other.fingerprint + + def __lt__(self, other: object) -> bool: + """ + Implemented to make sorted available upon CharsetMatches items. + """ + if not isinstance(other, CharsetMatch): + raise ValueError + + chaos_difference: float = abs(self.chaos - other.chaos) + coherence_difference: float = abs(self.coherence - other.coherence) + + # Below 1% difference --> Use Coherence + if chaos_difference < 0.01 and coherence_difference > 0.02: + return self.coherence > other.coherence + elif chaos_difference < 0.01 and coherence_difference <= 0.02: + # When having a difficult decision, use the result that decoded as many multi-byte as possible. + # preserve RAM usage! + if len(self._payload) >= TOO_BIG_SEQUENCE: + return self.chaos < other.chaos + return self.multi_byte_usage > other.multi_byte_usage + + return self.chaos < other.chaos + + @property + def multi_byte_usage(self) -> float: + return 1.0 - (len(str(self)) / len(self.raw)) + + def __str__(self) -> str: + # Lazy Str Loading + if self._string is None: + self._string = str(self._payload, self._encoding, "strict") + return self._string + + def __repr__(self) -> str: + return f"" + + def add_submatch(self, other: CharsetMatch) -> None: + if not isinstance(other, CharsetMatch) or other == self: + raise ValueError( + "Unable to add instance <{}> as a submatch of a CharsetMatch".format( + other.__class__ + ) + ) + + other._string = None # Unload RAM usage; dirty trick. + self._leaves.append(other) + + @property + def encoding(self) -> str: + return self._encoding + + @property + def encoding_aliases(self) -> list[str]: + """ + Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. + """ + also_known_as: list[str] = [] + for u, p in aliases.items(): + if self.encoding == u: + also_known_as.append(p) + elif self.encoding == p: + also_known_as.append(u) + return also_known_as + + @property + def bom(self) -> bool: + return self._has_sig_or_bom + + @property + def byte_order_mark(self) -> bool: + return self._has_sig_or_bom + + @property + def languages(self) -> list[str]: + """ + Return the complete list of possible languages found in decoded sequence. + Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. + """ + return [e[0] for e in self._languages] + + @property + def language(self) -> str: + """ + Most probable language found in decoded sequence. If none were detected or inferred, the property will return + "Unknown". + """ + if not self._languages: + # Trying to infer the language based on the given encoding + # Its either English or we should not pronounce ourselves in certain cases. + if "ascii" in self.could_be_from_charset: + return "English" + + # doing it there to avoid circular import + from charset_normalizer.cd import encoding_languages, mb_encoding_languages + + languages = ( + mb_encoding_languages(self.encoding) + if is_multi_byte_encoding(self.encoding) + else encoding_languages(self.encoding) + ) + + if len(languages) == 0 or "Latin Based" in languages: + return "Unknown" + + return languages[0] + + return self._languages[0][0] + + @property + def chaos(self) -> float: + return self._mean_mess_ratio + + @property + def coherence(self) -> float: + if not self._languages: + return 0.0 + return self._languages[0][1] + + @property + def percent_chaos(self) -> float: + return round(self.chaos * 100, ndigits=3) + + @property + def percent_coherence(self) -> float: + return round(self.coherence * 100, ndigits=3) + + @property + def raw(self) -> bytes: + """ + Original untouched bytes. + """ + return self._payload + + @property + def submatch(self) -> list[CharsetMatch]: + return self._leaves + + @property + def has_submatch(self) -> bool: + return len(self._leaves) > 0 + + @property + def alphabets(self) -> list[str]: + if self._unicode_ranges is not None: + return self._unicode_ranges + # list detected ranges + detected_ranges: list[str | None] = [unicode_range(char) for char in str(self)] + # filter and sort + self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) + return self._unicode_ranges + + @property + def could_be_from_charset(self) -> list[str]: + """ + The complete list of encoding that output the exact SAME str result and therefore could be the originating + encoding. + This list does include the encoding available in property 'encoding'. + """ + return [self._encoding] + [m.encoding for m in self._leaves] + + def output(self, encoding: str = "utf_8") -> bytes: + """ + Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. + Any errors will be simply ignored by the encoder NOT replaced. + """ + if self._output_encoding is None or self._output_encoding != encoding: + self._output_encoding = encoding + decoded_string = str(self) + if ( + self._preemptive_declaration is not None + and self._preemptive_declaration.lower() + not in ["utf-8", "utf8", "utf_8"] + ): + patched_header = sub( + RE_POSSIBLE_ENCODING_INDICATION, + lambda m: m.string[m.span()[0] : m.span()[1]].replace( + m.groups()[0], + iana_name(self._output_encoding).replace("_", "-"), # type: ignore[arg-type] + ), + decoded_string[:8192], + count=1, + ) + + decoded_string = patched_header + decoded_string[8192:] + + self._output_payload = decoded_string.encode(encoding, "replace") + + return self._output_payload # type: ignore + + @property + def fingerprint(self) -> str: + """ + Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. + """ + return sha256(self.output()).hexdigest() + + +class CharsetMatches: + """ + Container with every CharsetMatch items ordered by default from most probable to the less one. + Act like a list(iterable) but does not implements all related methods. + """ + + def __init__(self, results: list[CharsetMatch] | None = None): + self._results: list[CharsetMatch] = sorted(results) if results else [] + + def __iter__(self) -> Iterator[CharsetMatch]: + yield from self._results + + def __getitem__(self, item: int | str) -> CharsetMatch: + """ + Retrieve a single item either by its position or encoding name (alias may be used here). + Raise KeyError upon invalid index or encoding not present in results. + """ + if isinstance(item, int): + return self._results[item] + if isinstance(item, str): + item = iana_name(item, False) + for result in self._results: + if item in result.could_be_from_charset: + return result + raise KeyError + + def __len__(self) -> int: + return len(self._results) + + def __bool__(self) -> bool: + return len(self._results) > 0 + + def append(self, item: CharsetMatch) -> None: + """ + Insert a single match. Will be inserted accordingly to preserve sort. + Can be inserted as a submatch. + """ + if not isinstance(item, CharsetMatch): + raise ValueError( + "Cannot append instance '{}' to CharsetMatches".format( + str(item.__class__) + ) + ) + # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) + if len(item.raw) < TOO_BIG_SEQUENCE: + for match in self._results: + if match.fingerprint == item.fingerprint and match.chaos == item.chaos: + match.add_submatch(item) + return + self._results.append(item) + self._results = sorted(self._results) + + def best(self) -> CharsetMatch | None: + """ + Simply return the first match. Strict equivalent to matches[0]. + """ + if not self._results: + return None + return self._results[0] + + def first(self) -> CharsetMatch | None: + """ + Redundant method, call the method best(). Kept for BC reasons. + """ + return self.best() + + +CoherenceMatch = Tuple[str, float] +CoherenceMatches = List[CoherenceMatch] + + +class CliDetectionResult: + def __init__( + self, + path: str, + encoding: str | None, + encoding_aliases: list[str], + alternative_encodings: list[str], + language: str, + alphabets: list[str], + has_sig_or_bom: bool, + chaos: float, + coherence: float, + unicode_path: str | None, + is_preferred: bool, + ): + self.path: str = path + self.unicode_path: str | None = unicode_path + self.encoding: str | None = encoding + self.encoding_aliases: list[str] = encoding_aliases + self.alternative_encodings: list[str] = alternative_encodings + self.language: str = language + self.alphabets: list[str] = alphabets + self.has_sig_or_bom: bool = has_sig_or_bom + self.chaos: float = chaos + self.coherence: float = coherence + self.is_preferred: bool = is_preferred + + @property + def __dict__(self) -> dict[str, Any]: # type: ignore + return { + "path": self.path, + "encoding": self.encoding, + "encoding_aliases": self.encoding_aliases, + "alternative_encodings": self.alternative_encodings, + "language": self.language, + "alphabets": self.alphabets, + "has_sig_or_bom": self.has_sig_or_bom, + "chaos": self.chaos, + "coherence": self.coherence, + "unicode_path": self.unicode_path, + "is_preferred": self.is_preferred, + } + + def to_json(self) -> str: + return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/venv/Lib/site-packages/charset_normalizer/py.typed b/venv/Lib/site-packages/charset_normalizer/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/charset_normalizer/utils.py b/venv/Lib/site-packages/charset_normalizer/utils.py new file mode 100644 index 00000000..6bf0384c --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer/utils.py @@ -0,0 +1,414 @@ +from __future__ import annotations + +import importlib +import logging +import unicodedata +from codecs import IncrementalDecoder +from encodings.aliases import aliases +from functools import lru_cache +from re import findall +from typing import Generator + +from _multibytecodec import ( # type: ignore[import-not-found,import] + MultibyteIncrementalDecoder, +) + +from .constant import ( + ENCODING_MARKS, + IANA_SUPPORTED_SIMILAR, + RE_POSSIBLE_ENCODING_INDICATION, + UNICODE_RANGES_COMBINED, + UNICODE_SECONDARY_RANGE_KEYWORD, + UTF8_MAXIMAL_ALLOCATION, + COMMON_CJK_CHARACTERS, +) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_accentuated(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + return ( + "WITH GRAVE" in description + or "WITH ACUTE" in description + or "WITH CEDILLA" in description + or "WITH DIAERESIS" in description + or "WITH CIRCUMFLEX" in description + or "WITH TILDE" in description + or "WITH MACRON" in description + or "WITH RING ABOVE" in description + ) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def remove_accent(character: str) -> str: + decomposed: str = unicodedata.decomposition(character) + if not decomposed: + return character + + codes: list[str] = decomposed.split(" ") + + return chr(int(codes[0], 16)) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def unicode_range(character: str) -> str | None: + """ + Retrieve the Unicode range official name from a single character. + """ + character_ord: int = ord(character) + + for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): + if character_ord in ord_range: + return range_name + + return None + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_latin(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + return "LATIN" in description + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_punctuation(character: str) -> bool: + character_category: str = unicodedata.category(character) + + if "P" in character_category: + return True + + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Punctuation" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_symbol(character: str) -> bool: + character_category: str = unicodedata.category(character) + + if "S" in character_category or "N" in character_category: + return True + + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Forms" in character_range and character_category != "Lo" + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_emoticon(character: str) -> bool: + character_range: str | None = unicode_range(character) + + if character_range is None: + return False + + return "Emoticons" in character_range or "Pictographs" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_separator(character: str) -> bool: + if character.isspace() or character in {"|", "+", "<", ">"}: + return True + + character_category: str = unicodedata.category(character) + + return "Z" in character_category or character_category in {"Po", "Pd", "Pc"} + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_case_variable(character: str) -> bool: + return character.islower() != character.isupper() + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "CJK" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hiragana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "HIRAGANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_katakana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "KATAKANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hangul(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "HANGUL" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_thai(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "THAI" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_arabic(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "ARABIC" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_arabic_isolated_form(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: # Defensive: unicode database outdated? + return False + + return "ARABIC" in character_name and "ISOLATED FORM" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk_uncommon(character: str) -> bool: + return character not in COMMON_CJK_CHARACTERS + + +@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) +def is_unicode_range_secondary(range_name: str) -> bool: + return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_unprintable(character: str) -> bool: + return ( + character.isspace() is False # includes \n \t \r \v + and character.isprintable() is False + and character != "\x1a" # Why? Its the ASCII substitute character. + and character != "\ufeff" # bug discovered in Python, + # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space. + ) + + +def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> str | None: + """ + Extract using ASCII-only decoder any specified encoding in the first n-bytes. + """ + if not isinstance(sequence, bytes): + raise TypeError + + seq_len: int = len(sequence) + + results: list[str] = findall( + RE_POSSIBLE_ENCODING_INDICATION, + sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), + ) + + if len(results) == 0: + return None + + for specified_encoding in results: + specified_encoding = specified_encoding.lower().replace("-", "_") + + encoding_alias: str + encoding_iana: str + + for encoding_alias, encoding_iana in aliases.items(): + if encoding_alias == specified_encoding: + return encoding_iana + if encoding_iana == specified_encoding: + return encoding_iana + + return None + + +@lru_cache(maxsize=128) +def is_multi_byte_encoding(name: str) -> bool: + """ + Verify is a specific encoding is a multi byte one based on it IANA name + """ + return name in { + "utf_8", + "utf_8_sig", + "utf_16", + "utf_16_be", + "utf_16_le", + "utf_32", + "utf_32_le", + "utf_32_be", + "utf_7", + } or issubclass( + importlib.import_module(f"encodings.{name}").IncrementalDecoder, + MultibyteIncrementalDecoder, + ) + + +def identify_sig_or_bom(sequence: bytes) -> tuple[str | None, bytes]: + """ + Identify and extract SIG/BOM in given sequence. + """ + + for iana_encoding in ENCODING_MARKS: + marks: bytes | list[bytes] = ENCODING_MARKS[iana_encoding] + + if isinstance(marks, bytes): + marks = [marks] + + for mark in marks: + if sequence.startswith(mark): + return iana_encoding, mark + + return None, b"" + + +def should_strip_sig_or_bom(iana_encoding: str) -> bool: + return iana_encoding not in {"utf_16", "utf_32"} + + +def iana_name(cp_name: str, strict: bool = True) -> str: + """Returns the Python normalized encoding name (Not the IANA official name).""" + cp_name = cp_name.lower().replace("-", "_") + + encoding_alias: str + encoding_iana: str + + for encoding_alias, encoding_iana in aliases.items(): + if cp_name in [encoding_alias, encoding_iana]: + return encoding_iana + + if strict: + raise ValueError(f"Unable to retrieve IANA for '{cp_name}'") + + return cp_name + + +def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: + if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): + return 0.0 + + decoder_a = importlib.import_module(f"encodings.{iana_name_a}").IncrementalDecoder + decoder_b = importlib.import_module(f"encodings.{iana_name_b}").IncrementalDecoder + + id_a: IncrementalDecoder = decoder_a(errors="ignore") + id_b: IncrementalDecoder = decoder_b(errors="ignore") + + character_match_count: int = 0 + + for i in range(255): + to_be_decoded: bytes = bytes([i]) + if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): + character_match_count += 1 + + return character_match_count / 254 + + +def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: + """ + Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using + the function cp_similarity. + """ + return ( + iana_name_a in IANA_SUPPORTED_SIMILAR + and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] + ) + + +def set_logging_handler( + name: str = "charset_normalizer", + level: int = logging.INFO, + format_string: str = "%(asctime)s | %(levelname)s | %(message)s", +) -> None: + logger = logging.getLogger(name) + logger.setLevel(level) + + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter(format_string)) + logger.addHandler(handler) + + +def cut_sequence_chunks( + sequences: bytes, + encoding_iana: str, + offsets: range, + chunk_size: int, + bom_or_sig_available: bool, + strip_sig_or_bom: bool, + sig_payload: bytes, + is_multi_byte_decoder: bool, + decoded_payload: str | None = None, +) -> Generator[str, None, None]: + if decoded_payload and is_multi_byte_decoder is False: + for i in offsets: + chunk = decoded_payload[i : i + chunk_size] + if not chunk: + break + yield chunk + else: + for i in offsets: + chunk_end = i + chunk_size + if chunk_end > len(sequences) + 8: + continue + + cut_sequence = sequences[i : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode( + encoding_iana, + errors="ignore" if is_multi_byte_decoder else "strict", + ) + + # multi-byte bad cutting detector and adjustment + # not the cleanest way to perform that fix but clever enough for now. + if is_multi_byte_decoder and i > 0: + chunk_partial_size_chk: int = min(chunk_size, 16) + + if ( + decoded_payload + and chunk[:chunk_partial_size_chk] not in decoded_payload + ): + for j in range(i, i - 4, -1): + cut_sequence = sequences[j:chunk_end] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode(encoding_iana, errors="ignore") + + if chunk[:chunk_partial_size_chk] in decoded_payload: + break + + yield chunk diff --git a/venv/Lib/site-packages/charset_normalizer/version.py b/venv/Lib/site-packages/charset_normalizer/version.py new file mode 100644 index 00000000..e5687e3c --- /dev/null +++ b/venv/Lib/site-packages/charset_normalizer/version.py @@ -0,0 +1,8 @@ +""" +Expose version +""" + +from __future__ import annotations + +__version__ = "3.4.2" +VERSION = __version__.split(".") diff --git a/venv/Lib/site-packages/click/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/click/__pycache__/__init__.cpython-312.pyc index 73ac63396717fce8448d897c7b1832ff9dd77cc2..66d1f05ef2383309821b98697dc07689a8fcffba 100644 GIT binary patch delta 29 jcmca1e?y-4G%qg~0}v!Id1QRq$jiyY7_(WN=O8lxc$Npd delta 29 jcmca1e?y-4G%qg~0}!aMcgv{U$jiyYsJ~g9=O8lxcsmD$ diff --git a/venv/Lib/site-packages/click/__pycache__/_compat.cpython-312.pyc b/venv/Lib/site-packages/click/__pycache__/_compat.cpython-312.pyc index 624c5ed6b0961ab0e5a9268b9ff233dff7f485e1..62f68a6ed75fbd2cb78f1e0cce1f06aa7b1f14b1 100644 GIT binary patch delta 32 mcmeyghw;-MM!wU$yj%=Gkig`TQS7~u?+Ytq%w}e`{0IQAeF?+> delta 32 mcmeyghw;-MM!wU$yj%=GpuXNMgVl2*-xpR!{msm5`4IrGstK6@ diff --git a/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-312.pyc b/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-312.pyc index 4e5e79f7f8e8d74f0ef21d26320f84625e66569d..90993e8b3d61c7ceb34668d11d683a329e0f6b58 100644 GIT binary patch delta 29 jcmaDU^iqiTG%qg~0}v!Id1S2K$h(h;F=q1_rnzhYexeAk delta 29 jcmaDU^iqiTG%qg~0}!aMcgv{Q$h(h;QGfFprnzhYfu{(; diff --git a/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-312.pyc b/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-312.pyc index 3858e750bd8dd725050447d76d44c1aba9d3a8a5..5714d0b30bc9f7bcd22b5b963ae5969a561fc0a5 100644 GIT binary patch delta 30 kcmaDA{VJO8G%qg~0}v!Id1P2BZRCq)XN=jL#onL>0E&-wZZJ{mskS4*3HBs`?5M diff --git a/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-312.pyc index bb0d622cad0b2c64c98e9479f1addb80f4d5a4e7..7177efb76fda434f16e21e930b7d050734597fbb 100644 GIT binary patch delta 30 kcmZ2cyrP)zG%qg~0}v!Id1PEy-^f?X%oww|hgrr90EzSnbN~PV delta 30 kcmZ2cyrP)zG%qg~0}!aMcgt9;wvn%vnNfdp53`IJ0F56Aga7~l diff --git a/venv/Lib/site-packages/click/__pycache__/formatting.cpython-312.pyc b/venv/Lib/site-packages/click/__pycache__/formatting.cpython-312.pyc index ff876e71be365c589ad5d18c538cd4ccdaa8928a..747c62b67429959ddbf7bf1ae75fdb6012adf398 100644 GIT binary patch delta 30 kcmcbSbt8-KG%qg~0}v!Id1Pp-Z{)kp#2B;r6;qxO0FQeK9smFU delta 30 kcmcbSbt8-KG%qg~0}!aMcgy&vx{>cT6Qlm-S4??E0H5^=Gynhq diff --git a/venv/Lib/site-packages/click/__pycache__/globals.cpython-312.pyc b/venv/Lib/site-packages/click/__pycache__/globals.cpython-312.pyc index 8d8b0755076ddc7293ee760b436decfa7604f626..f6aaa1c5cae35f511d23796ae5f66cfdc88484e5 100644 GIT binary patch delta 29 jcmZn_Zx!b~&CAQh00aq49vR0r@^&&Z#%!L>_>L0*X#EHD delta 29 jcmZn_Zx!b~&CAQh00ipm-7=at@^&&Z>TjOT_>L0*YeEP1 diff --git a/venv/Lib/site-packages/click/__pycache__/parser.cpython-312.pyc b/venv/Lib/site-packages/click/__pycache__/parser.cpython-312.pyc index fbcb3c74821a1e41ba5ecfb5a834f882d7fc1740..72f552ae0a43cc3a792185b1efd2f4dcb3471bfd 100644 GIT binary patch delta 32 mcmcaRm+|ggM!wU$yj%=Gkig`TVeYe$&xwmMW^*7{j|%{srwGpg delta 32 mcmcaRm+|ggM!wU$yj%=GpuXNML)mL1pA#3O{^mfg9v1+hW(fWO diff --git a/venv/Lib/site-packages/click/__pycache__/termui.cpython-312.pyc b/venv/Lib/site-packages/click/__pycache__/termui.cpython-312.pyc index 327c2115fded7d21da41bb5230bd359871cd3f56..e2e1be3a5d3f19be39d6f753a7a9f30fb7256c08 100644 GIT binary patch delta 32 mcmX@z%XGSziSINoFBbz4Brthoys6&E*T}&bvv~rCbsYer014Cp delta 32 mcmX@z%XGSziSINoFBbz4sIPa+sIS<_*T})Bzj*?ObsYerE(xgs diff --git a/venv/Lib/site-packages/click/__pycache__/types.cpython-312.pyc b/venv/Lib/site-packages/click/__pycache__/types.cpython-312.pyc index 654d3dae29c1c80c78d6d509bcc3095eb72db0a2..ee471f2480e4465ef35b50a21fdc05f1530a0893 100644 GIT binary patch delta 31 lcmZ4gk7@lsCce|Wyj%=Gkig`T(KKr#-$yRSm`&XJTL7v63PAt> delta 31 mcmZ4gk7@lsCce|Wyj%=GpuXNM^?O^*3?rZvg#cgx_~$lJxps6TlIqay%nMF%4Q diff --git a/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-312.pyc b/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-312.pyc index b573c1c68ef5463b27198e28ca2146d7fa0a1cf3..fa53ca739142408eacc3f03018e3646604a50699 100644 GIT binary patch delta 30 kcmcaDcUz9{G%qg~0}v!Id1N?nZRFErVvN~r!KBO!0Cjl=umAu6 delta 30 kcmcaDcUz9{G%qg~0}v>#cgwiNxsgwkiBW&E1(Px_0D`m!hyVZp diff --git a/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-312.pyc b/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-312.pyc index 0c21ed95315940cac6b32a92c7784bd08157eefa..6d1834552149263e8d0add5820ebc4aa84782141 100644 GIT binary patch delta 32 mcmbQ#z&NRak?%AwFBbz4Brtho^y+Nn^J8X=*&NHf)dm2DkO*J^ delta 32 mcmbQ#z&NRak?%AwFBbz4D6V(QsLteOj9DG%qg~0}v!Id1RFFZsb#9VvN~r$TW)^0Cc1WDgXcg delta 30 kcmX>teOj9DG%qg~0}v>#cgy(8vyo4UiBW&EA=4~w0D$NR?*IS* diff --git a/venv/Lib/site-packages/colorama/__pycache__/win32.cpython-312.pyc b/venv/Lib/site-packages/colorama/__pycache__/win32.cpython-312.pyc index 59f6216c04c65ae66c7549d04bf5e3e377725ee4..00a06f1afb0fb64c92f28b5c95298b64e81a07bc 100644 GIT binary patch delta 29 jcmZ2&zuKPnG%qg~0}v!Id1Tz&$orm?F=q2$&UK;yf3pco delta 29 jcmZ2&zuKPnG%qg~0}v>#cgs-S$orm?QGfGa&UK;yd`t+| diff --git a/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-312.pyc b/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-312.pyc index ec2fdf1d039939448de75c8b0e56df8f05e53c7a..b0eeb50b93aa8ad830eb799fadbcc3096ee8bfc2 100644 GIT binary patch delta 30 kcmaFs_STK>G%qg~0}v!Id1Ne<*~k~c$QZLZosmrm0E$Hi>i_@% delta 30 kcmaFs_STK>G%qg~0}v>#cgwgZy^$}1kx_qhIwPAB0FuWDW&i*H diff --git a/venv/Lib/site-packages/dataclasses_json/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/dataclasses_json/__pycache__/__init__.cpython-312.pyc index 0c4858f24391f106e076bd0676a55aa5601ee338..18f2ac8a717b9647397d5fe94a819c399e5a0dc1 100644 GIT binary patch delta 28 icmcc5a-W6wG%qg~0}v!Id1UdY4FF-j2Lu2B delta 27 hcmX@ibeM_vG%qg~0}zyMbkCSIk@qK~{$zGW8vtsa2b2H+ diff --git a/venv/Lib/site-packages/dataclasses_json/__pycache__/api.cpython-312.pyc b/venv/Lib/site-packages/dataclasses_json/__pycache__/api.cpython-312.pyc index a66577a28615aa974ec8e3d292aeb46960ff9305..ccaa01be901d3eeba330a49c86abd2548d8ba995 100644 GIT binary patch delta 29 jcmbPiGTDUpG%qg~0}v!Id1UiW{lZf%dEx&0Bkb`$p8QV delta 30 kcmZ21zgV8{G%qg~0}zyMbk8`>yOA%CnNfdpEwdUA0Dj2_@Bjb+ diff --git a/venv/Lib/site-packages/dataclasses_json/__pycache__/core.cpython-312.pyc b/venv/Lib/site-packages/dataclasses_json/__pycache__/core.cpython-312.pyc index f41ecb60461a10539c6648398d787c56042cd8e7..ae86e13596cf0330f547a0cbafc6ce4c28a11ec3 100644 GIT binary patch delta 32 mcmdnCka62WM!wU$yj%=Gkig`T5#YCxZznrr%;pp9?>qpTR|)a} delta 32 ncmdnCka62WM!wU$yj%=GP`c4Qqts_3-%fT${mm!X-+2H4s8|ZC diff --git a/venv/Lib/site-packages/dataclasses_json/__pycache__/mm.cpython-312.pyc b/venv/Lib/site-packages/dataclasses_json/__pycache__/mm.cpython-312.pyc index 30ff1584a7808515f97549bcb4c120a2b56c2a50..018091ef32f890732127a1c8b54f15b04596af73 100644 GIT binary patch delta 32 mcmbO|lX3P;M!wU$yj%=Gkig`T!Q-%zZwCis%;w`9SDXQkxd}S} delta 32 ncmbO|lX3P;M!wU$yj%=GP`c4Qqt;hwmWZ!IIE{^mW5EV%%ry$L%2 diff --git a/venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-312.pyc index 93b0eb4e38121abadeb57bec5b6daecc3aab99f5..1c57c58ea17ec3b46b0c61b10d7d53784e7c1567 100644 GIT binary patch delta 37 rcmcaAa#e)yG%qg~0}v!Id1NTFZ{%Cd%n?(NSX7)^6tj6J^Bgt+y6_6m delta 37 rcmcaAa#e)yG%qg~0}yC4x@SCN+sL<=nM1!Iv8Xt;NPqKA<~eKt!JP{L diff --git a/venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-312.pyc b/venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-312.pyc index 5467c5fcef79b658bb07d9f9419548fe860411ac..acf1d571751f2b6c4e2a6ff56ab5ce42b4c3cfa7 100644 GIT binary patch delta 39 tcmeBs%-r{wneQ|&FBbz4Brtho{CvHUPl%f%rXaDXIJGEdvj%tCGXVS$4L1M) delta 39 tcmeBs%-r{wneQ|&FBbz4XfwKJta-YTPl%gCzaX)wIJHQBvj%tCGXU)#3{wCA diff --git a/venv/Lib/site-packages/dateutil/parser/__pycache__/isoparser.cpython-312.pyc b/venv/Lib/site-packages/dateutil/parser/__pycache__/isoparser.cpython-312.pyc index 5095dccba2f44d33c9f073c82fb818e2ce10a586..330108e25a0983be3bed8f66facf88edea508405 100644 GIT binary patch delta 37 rcmcaydAXABG%qg~0}v!Id1M5dZsc3b%n?(NSX7)^6tnp-vw$T4+~W(Z delta 37 rcmcaydAXABG%qg~0}yC4x@T-O-pIF>nM1!Iv8Xt;NPqKTW&uk8+rbNY diff --git a/venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-312.pyc index ff0bb38b1dcffc3d255f1505940996466b01f5dd..4148a5ed5d510412bade6c2db9f02cb2266c708b 100644 GIT binary patch delta 31 lcmdnRx{HrwYGg+2tE&zJ)2pRwY delta 31 lcmdnRx{Hk{BpC15)0|(0h diff --git a/venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-312.pyc b/venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-312.pyc index 3e1c061a1ab6eee01860174880104fc7998dee95..c9c887f5977e0b9281b359e3042dae0a8fd30f14 100644 GIT binary patch delta 35 pcmX@t%yO=oh3_;kFBbz4Brtho9Qd=5FO`cWrlcxnb2(S|cL2pv3(x=n delta 35 pcmX@t%yO=oh3_;kFBbz4XfwKJw13^mm&(PWUs9#NxtuHfI{>714gkIx3IzZF delta 35 pcmaFX#`vs_k?%AwFBbz4XfwKJv>R>YQ)Ok*FR9YsY|g502LP}B2>}2A diff --git a/venv/Lib/site-packages/deepgram/__init__.py b/venv/Lib/site-packages/deepgram/__init__.py index f564a53a..d8658897 100644 --- a/venv/Lib/site-packages/deepgram/__init__.py +++ b/venv/Lib/site-packages/deepgram/__init__.py @@ -1,381 +1,77 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT +from typing import Union +import re +from ._types import Options +from .keys import Keys +from .transcription import Transcription +from .projects import Projects +from .usage import Usage +from .billing import Billing +from .members import Members +from .scopes import Scopes +from .invitations import Invitations +from .extra import Extra +from .errors import DeepgramSetupError, DeepgramApiError -# version -__version__ = "v4.2.0" -# entry point for the deepgram python sdk -import logging -from .utils import VerboseLogger -from .utils import ( - NOTICE, - SPAM, - SUCCESS, - VERBOSE, - WARNING, - ERROR, - FATAL, - CRITICAL, - INFO, - DEBUG, - NOTSET, -) +def api_key_is_valid(api_key: str) -> bool: + pattern = r"^[a-f0-9]{40}$" + return re.match(pattern, api_key) is not None -from .client import Deepgram, DeepgramClient -from .client import DeepgramClientOptions, ClientOptionsFromEnv -from .client import ( - DeepgramError, - DeepgramTypeError, - DeepgramModuleError, - DeepgramApiError, - DeepgramUnknownApiError, -) -from .errors import DeepgramApiKeyError -# listen/read client -from .client import ListenRouter, ReadRouter, SpeakRouter, AgentRouter +class Deepgram: + def __init__(self, options: Union[str, Options]) -> None: + if not isinstance(options, (str, dict)): + raise DeepgramSetupError("`options` must be a dictionary or an API key string") -# common -from .client import ( - TextSource, - BufferSource, - StreamSource, - FileSource, - UrlSource, -) -from .client import BaseResponse -from .client import ( - Average, - Intent, - Intents, - IntentsInfo, - Segment, - SentimentInfo, - Sentiment, - Sentiments, - SummaryInfo, - Topic, - Topics, - TopicsInfo, -) -from .client import ( - ModelInfo, - Hit, - Search, -) -from .client import ( - OpenResponse, - CloseResponse, - UnhandledResponse, - ErrorResponse, -) + # Convert to dictionary if the api key was passed as a string + if isinstance(options, str): + options: Options = {"api_key": options} -# speect-to-text WS -from .client import LiveClient, AsyncLiveClient # backward compat -from .client import ListenWebSocketClient, AsyncListenWebSocketClient -from .client import LiveTranscriptionEvents -from .client import LiveOptions, ListenWebSocketOptions -from .client import ( - #### top level - LiveResultResponse, - ListenWSMetadataResponse, - SpeechStartedResponse, - UtteranceEndResponse, - #### common websocket response - # OpenResponse, - # CloseResponse, - # UnhandledResponse, - # ErrorResponse, - #### unique - ListenWSMetadata, - ListenWSAlternative, - ListenWSChannel, - ListenWSWord, -) + if "api_key" not in options: + raise DeepgramSetupError("API key is required") + if not api_key_is_valid(options["api_key"]): + raise DeepgramSetupError("Invalid API key") -# prerecorded -from .client import PreRecordedClient, AsyncPreRecordedClient # backward compat -from .client import ListenRESTClient, AsyncListenRESTClient -from .client import ( - # common - # UrlSource, - # BufferSource, - # StreamSource, - # TextSource, - # FileSource, - # unique - PreRecordedStreamSource, - PrerecordedSource, - ListenRestSource, - SpeakRESTSource, -) -from .client import ( - ListenRESTOptions, - PrerecordedOptions, -) -from .client import ( - #### top level - AsyncPrerecordedResponse, - PrerecordedResponse, - SyncPrerecordedResponse, - #### shared - # Average, - # Alternative, - # Channel, - # Intent, - # Intents, - # IntentsInfo, - # Segment, - # SentimentInfo, - # Sentiment, - # Sentiments, - # SummaryInfo, - # Topic, - # Topics, - # TopicsInfo, - # Word, - #### unique - Entity, - Hit, - ListenRESTMetadata, - ModelInfo, - Paragraph, - Paragraphs, - ListenRESTResults, - Search, - Sentence, - Summaries, - SummaryV1, - SummaryV2, - Translation, - Utterance, - Warning, - ListenRESTAlternative, - ListenRESTChannel, - ListenRESTWord, -) + if "api_url" in options and options.get("api_url", None) is None: + raise DeepgramSetupError("API URL must be valid or omitted") -# read -from .client import ReadClient, AsyncReadClient -from .client import AnalyzeClient, AsyncAnalyzeClient -from .client import ( - AnalyzeOptions, - AnalyzeStreamSource, - AnalyzeSource, -) -from .client import ( - #### top level - AsyncAnalyzeResponse, - SyncAnalyzeResponse, - AnalyzeResponse, - #### shared - # Average, - # Intent, - # Intents, - # IntentsInfo, - # Segment, - # SentimentInfo, - # Sentiment, - # Sentiments, - # SummaryInfo, - # Topic, - # Topics, - # TopicsInfo, - #### unique - AnalyzeMetadata, - AnalyzeResults, - AnalyzeSummary, -) + self.options = options -# speak -## speak REST -from .client import ( - #### top level - SpeakRESTOptions, - SpeakOptions, # backward compat - #### common - # TextSource, - # BufferSource, - # StreamSource, - # FileSource, - #### unique - SpeakSource, - SpeakRestSource, -) + @property + def keys(self) -> Keys: + return Keys(self.options) -from .client import ( - SpeakClient, # backward compat - SpeakRESTClient, - AsyncSpeakRESTClient, -) + @property + def transcription(self) -> Transcription: + return Transcription(self.options) -from .client import ( - SpeakResponse, # backward compat - SpeakRESTResponse, -) + @property + def projects(self) -> Projects: + return Projects(self.options) -## speak WebSocket -from .client import SpeakWebSocketEvents, SpeakWebSocketMessage + @property + def usage(self) -> Usage: + return Usage(self.options) -from .client import ( - SpeakWSOptions, -) + @property + def billing(self) -> Billing: + return Billing(self.options) -from .client import ( - SpeakWebSocketClient, - AsyncSpeakWebSocketClient, - SpeakWSClient, - AsyncSpeakWSClient, -) + @property + def members(self) -> Members: + return Members(self.options) -from .client import ( - #### top level - SpeakWSMetadataResponse, - FlushedResponse, - ClearedResponse, - WarningResponse, - #### common websocket response - # OpenResponse, - # CloseResponse, - # UnhandledResponse, - # ErrorResponse, -) + @property + def scopes(self) -> Scopes: + return Scopes(self.options) -# manage -from .client import ManageClient, AsyncManageClient -from .client import ( - ProjectOptions, - KeyOptions, - ScopeOptions, - InviteOptions, - UsageRequestOptions, - UsageSummaryOptions, - UsageFieldsOptions, -) + @property + def invitations(self) -> Invitations: + return Invitations(self.options) -# manage client responses -from .client import ( - #### top level - Message, - ProjectsResponse, - ModelResponse, - ModelsResponse, - MembersResponse, - KeyResponse, - KeysResponse, - ScopesResponse, - InvitesResponse, - UsageRequest, - UsageResponse, - UsageRequestsResponse, - UsageSummaryResponse, - UsageFieldsResponse, - BalancesResponse, - #### shared - Project, - STTDetails, - TTSMetadata, - TTSDetails, - Member, - Key, - Invite, - Config, - STTUsageDetails, - Callback, - TokenDetail, - SpeechSegment, - TTSUsageDetails, - STTTokens, - TTSTokens, - UsageSummaryResults, - Resolution, - UsageModel, - Balance, -) + @property + def extra(self) -> Extra: + return Extra(self.options) -# selfhosted -from .client import ( - OnPremClient, - AsyncOnPremClient, - SelfHostedClient, - AsyncSelfHostedClient, -) - -# agent -from .client import AgentWebSocketEvents - -# websocket -from .client import ( - AgentWebSocketClient, - AsyncAgentWebSocketClient, -) - -from .client import ( - #### common websocket response - # OpenResponse, - # CloseResponse, - # ErrorResponse, - # UnhandledResponse, - #### unique - WelcomeResponse, - SettingsAppliedResponse, - ConversationTextResponse, - UserStartedSpeakingResponse, - AgentThinkingResponse, - FunctionCallRequest, - AgentStartedSpeakingResponse, - AgentAudioDoneResponse, - InjectionRefusedResponse, -) - -from .client import ( - # top level - SettingsOptions, - UpdatePromptOptions, - UpdateSpeakOptions, - InjectAgentMessageOptions, - FunctionCallResponse, - AgentKeepAlive, - # sub level - Listen, - Speak, - Header, - Item, - Properties, - Parameters, - Function, - Think, - Provider, - Agent, - Input, - Output, - Audio, - Endpoint, -) - -# utilities -# pylint: disable=wrong-import-position -from .audio import Microphone, DeepgramMicrophoneError -from .audio import ( - INPUT_LOGGING, - INPUT_CHANNELS, - INPUT_RATE, - INPUT_CHUNK, -) - -LOGGING = INPUT_LOGGING -CHANNELS = INPUT_CHANNELS -RATE = INPUT_RATE -CHUNK = INPUT_CHUNK - -from .audio import Speaker -from .audio import ( - OUTPUT_LOGGING, - OUTPUT_CHANNELS, - OUTPUT_RATE, - OUTPUT_CHUNK, -) - -# pylint: enable=wrong-import-position +__all__ = [Deepgram, DeepgramSetupError, DeepgramApiError] diff --git a/venv/Lib/site-packages/deepgram/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/__init__.cpython-312.pyc index 61f0d324ed9e976708df3c587a4817468adab70c..e35d0103f97d98d60bc7abb4c512bf32d486e9d1 100644 GIT binary patch literal 3895 zcmcIn&2JmW6`x%$$rV2(iu&@G7?ZL^yZ&}#$2Quyu^}5)m7tbUV9j<-aYxG9yCgHa z6iQYG)WCe|}FG`xRk@cy`f9L%2FV#^NU}fKmD)(x`~XsVY6&k zJ}ioC2qwDGdfB!qt6I2fF8AH+dzVUgEI4cF*3FyqrEAoBVAtxU<(gihSC?qjE-lmQ za%omyC|SBqPt?nm2VgI&r1ejIN>%l$Zma6adea^3pHkH=b-8Tl8XJdg2H|HNgl3g| zk(ykcc^yyw;o@&EuFbT6-ic2=n|I=89O=v!2#^Xk-sgw!*MO`ON)$mO5V8UdQHh2Z z#R@ay0F4FEVUA`2jR(*Xj*bGF2%uve9S1ZSKqs1^V#<}h2y&yfUO=-9oM^5RjD|2E zJZ>NX!9d$Fvm)5Oob8#BEQ(&tSaCbrw+}?yi+-$q9EiH$3f?RxY2u2YLv&)lEU@4z zp};Bw-r6f5iB9r(JNA`4^kYE_!+L}rToLZay}8@H7S{Y|Uk&aV*D?Yp6OrHB>=F51tJ@Yc2=aQE?nafV% z^6T{EM)cXh%iP&l>2sX%b|-VeNnAkT=*#%z#>}5?eR}IJ1D~Jo6y9|TH@M79Cv(F| z-1u_r&?nOG6AWFyqtIcn@__vT5IX{vys6B2?!8T(3v*Dx(7)U&&jpqT+QPui^=u=7 z53N?xw+jxZQ3lK2D*1PMcw8p<9f1u%IZP<796O5J22@MJMX`PV zv_^d$ci?CeU)clg`KP5PrB3>oBOluXW#Of;i?VXPe>VnV%!5t`RUB(ePZLiPo%EC= zPwjz{iORBOjj!`7O`c*|qug(qpjSVMji^2g>1_>&?nV7kbZ#mj4Dg z*+(u06&zi&*H<2|bkYS!F6@DVSVnhI(Cj^K0t)t#D>&yYHs4?3dfAcKRiB8(Us$cQ z@6I0ZF3j-rVPs8PHy#_Ebl#Ekd!Sx&SM}oh_Oq{*^>qxO*Mf@fYoC95<;j&!dfJhv z_dwCqu8M{!K1c&u!N)gH{uDOo)8an7L#kzys;V1PRkNlw45SmP`cb27^f(MlG|ORw zFAP?I#>Ki&r_65lsxX$;UdcO#6t5>(!5B~5lSuI#IfE1rM$Avf!vJ5oj9VO2g7G6= z0_u5BNnX#{eq>=Y0zYdA%IPE06$itU8{v)0vkM!>%iOsxf$`_k7IxhNiKM!s5I(%7 zeM_L*3VA>`(x;BMA0q3x&pPh2jx^=53A6Q z;H-i_tKiQnw(laV=(CDGYlj-&z(IR?z-?5VbR%}Nj_()lyDZquji>-otLH=RFMfY= zfAPzT`-^*y`-^*y`-^*y`-^*y`-^*y`-^)H{lz`!MkxNvWA$D#_|)f-<4Oy)n!#T- zTthdis%67aRrX^P!C>Tm{!YHq3&J0<>ww{{X(`ZjLxLb|lJS3#flac1lZMnbzlrj_ F{|9Gc8Q%Z^ literal 6601 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 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/_constants.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/_constants.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5edce7b983def9b92b92d26e56319d1f29f54b55 GIT binary patch literal 229 zcmX@j%ge<81iUvBG7N$AV-N=h7@>^M96-i&h7^VbQ=D0ns#}nloSm4SS{wtjL_a<` yKd-nXF|VXpub}c5hfQvNN@-52T@f45c#w08xq-w7W=2NF8^Q(`83c-0fP4V8F+iaJ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/_enums.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/_enums.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41ccba1c547f00f933c450aafc8523f9b6017f84 GIT binary patch literal 710 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/_version.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/_version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0202d8ea3a80a10a5faf1826cc4e054c2309c92a GIT binary patch literal 201 zcmX@j%ge<81iUvBG9-ZXV-N=h7@>^M96-i&h7^Vch;`E2#X%VUwGmQks)$SHuQ19OR~A Ukdr?!Gcq#X;1h4;E@A<40j=mZy8r+H literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/billing.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/billing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5290ab2001a62968322523ec4fb96b639fe4fa3 GIT binary patch literal 1570 zcmbtTO>7%Q6rR~XJC0LFG-)A%u-8S9fTE}fDx{Jilm;2(6p*Y{Cyr;FZo1xeXVyVB zK14J^9No`)@vNZ2{F=s?`L-Az4yI0 zKTJ*K2&}0eH?MuC5%LQfqh+MZ;6+dl2q&ESq)yAUu9daAUe+o4G~cM3Ws?$(yiT~j zPq^^~+=Q!awM@tQje_dvapuiNCLgp&DR|IFmXY8fTdlH=064)#Qd0 ztW*wGK{+6Tlqn}=jnlHuHDPd_8#RNQ`$pO1maw=kGGJ%G&L(y?@lDh$J^{X5%W!fK z)bo8W*ltfOHe|RXs*#E_VVa^PMbwl*v6@zr#7A9+Z}3=>MTd3>OEwT%#Gyrp$_daN zEjEZHpjscSW%4zTs`T%8SHv zjY{=;Wm_nh3(?q?mHOh=FyVzp3ut0q;6;qJr_(YPMxHE$Q<%jbd3b*QBjc0&01Oi6 z(khw9|4|ikdlSCF4!}C0z;A>dOIC;MoMs^P-hxT!P(bar0e_6~yJysCqR|a67GO;e;+iA4eyOcXWwm#U_(s7^OXtd2q>TfV3rY3jfJtY?dBv&y46i z?VZFk&jb8Q{@f#vvgF+S;mqfApUoZSyO+8oR;` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/client.cpython-312.pyc deleted file mode 100644 index 33ad045b6b2769649aa23902b8bc33acb5bcdfde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18277 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 literal 838 zcmYjP&ubGw6n?XtG(SuVqEZzPjT1&=|*XiJHeB3LhBVc71zq)U_RI7j>! z>7hqyPvTX2^6&5@c#y@L|3FI=OHaPp>;@m~n;+kN-<$c~eyvu^Kr#5Tv0E?ze(6OP z`E)Y9Pm@zHU;{iDgU1lg%^B8WBf~P?jG@OAf$1_W-V+a@#XM*k9&4GNfw{IZfj0BZ zaix`?z&>j&ya6j0-&#WqJJRVjLVpuS>rw{t;A5FnJa-gwx9cdy+kxb`?_wDFL0@s{ z_zJyb*Wo>1DZk(0nGkQhZgP^Ul@pal6iI()5TU9kYpvWvrJN4(Wfe)Q&bN1wqb@uL zJX9{Rv}~lotaL4rhzqHJOWw^xJD|VmV@e;`DMWMV*f@j}^7W9Nv)LviKMz67`6IB5 zEvf028Ryj?L>U)_@cVuwM4an8JtQEfu-le7Iu)0MNURY;X%^>4*Dqhx?Y9c0vNxN} zZF>#XUKE7(Fz{V$bg&=UL+lUjSN@Kz{0JX~j=M)LDBDY0u$q{lYT-y0Nb}%9X6b*u zsb!a1q!Vh1($x|CELM*T-->t7mcADs{HA#lc7?E*)IY4!?md$?C?{SeX+Z<`C|!-=(#YqF7mG%I z<&*grXt>l#Rx-ktWyGcRteXk_Gt6KudR=@nyWvxLhnBjUx=HE6WQ_f;l-bIe^#^E3 GDE|N?F4(gG diff --git a/venv/Lib/site-packages/deepgram/__pycache__/extra.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/extra.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74128c5556ddccadb977b2492c7ee823c4418672 GIT binary patch literal 4027 zcmd58OKcn0@$GV#OH!0bijt_0C9U;|L)cQ|PZQg54aAmUOSYxNmZL&eLQ~u)iW0fY z>@F>fSr$I{Km!R(0Rcoq4Zy-ZP_O|jKo9JxE_z9ki&zE?vsHlrEztT#TLFp+J#^kK zDaon>zr8v4g$JR(kwtAVRb=Z7AS*~f0u@D5NT3Bv zl#0<)bj&hkp~#wvGBI|Fr4WrSAc4J$1nVQ(JUwMyqWs)5vKV_t0rb;4|E`Q>9Fk-K z3lnlsR6=qju0|yBDpul>s9>ENH`a=u(z)|N0}q+tV0q zE<4rm1A8vmb1gA`kIoL?R^?!F*1^Lta6T?6>OfqULRe8EVwhJY9#}+WR+3}999-mw zFph`iAS|j@D}*N`iMOyA!J-;n8X&wuRmB1?CDeFARR)a@=$vG_N4LsYO~~R{sOoLQ zEd;l~f2+}Ojz(!HU~CYugx07rKPB4%hpS)|9Gx{53OUB}+au>sPhVHCtV~}T8JU8c|!O%i5jFoAjYR^wF@x@?#Nw)<85iz0$ z0?7u$Cxf+h9ehe58r(r;Ussy>)VT!Hg(xVxUBU6798@JaL@cQd8z6>dzX4r1OpybDJjdoJu8AZeTjp4iGxl8$IfYX@7`X##*u`q5iCh|&l#%*LAMG) zr!m!;C9_7aBF!pTSDDYbYsk-yMcfStJtHX<`6t+-({CKxrcT3j9D>~v5mi4Y*Tb$1 z>4;=|n?s8tI;Z88-nn62pobjK!0_ zs{i+Iv;e;n2XF^%y1khTS#^25&5fKNXSPZLkp;`d~Rz%8_arH0YnxPm`aOHFx z5N{#bUc&{7P*RN8yL)N#B(C=j!BV?O3hkU_$XS6kpw*NUMk!X{QdW&tcXXMDK-oVM za9bKXPa=BX5Nx|&Qc2hwLt|>xA@spELerpQic8rvM&pd{+l}u-jneFx$@)m6hadrhWhc~ngrkp4%IT&LN!Izz70kn2=QY#HNK=LL?0w^pZFlE7oG zYUMmt53=eFSq4ls2o3Yzs<1s1`Jz@2XMxs^hR}Uihz_F={Q*R4%B8t92a&N%e`05V znsU{2Pq|<6b<-Y^RTO+p3oh`4JLUONydL0fOf_oORU~*dH1GRgnVM7c)GP$9rXS#H zc!|raH9~5;SJCITl=s!QuX$^BL7YJkO2W;htebe3i~(6FX|k$Yz>IB*-=>aiQ-eB6(gT1yk}N+kaF$Qf z4u{{V+ZKbe2-ZQ#B$!N6SANa-R4^U~0lFQFi5NIl#X1YF4P)H`#YeY5snwZz383ZL z)d{&1&iI?my4*#CbQ8c6&;tN$Gd-#3PNRT@q=X38>2`1g^gsdM)-8a_hX}Ksm=RE+ zP3lxccNpdvwVG%nRM~9=B?Vlk7IlU&o4vpqm+@@mw$9bQNK(Wo{`-L03+e)@6sWQ$ zJ=HF-OX`Qi%I~0Q-a!>7a<*nq=0=JggT=bRa@)b2zu0ypKV57)eQ)&d&ZhfU?p>+S zlxK$e-eRe5sMt_@kI6DsY&%)-6x-e|j1}81rAN!&=CrNsYfU@Lb)L^AS3X?+uvphy z1`*@;#$SbDfTaQ12cm(=fH zFAj_rTm2jFzMmf1Y=*w_%TTU=bv}Q%)cocP)KK4(p~{^-xuXw$o(mT{2Q!Y%1KrS; zh95fe@BOM_om#*2h3o0T;v45n2Zl2CatEJlD|Q^t4;MR*WkARFmD|g=*As>J3QJ!e z{cURFtt)@#$JP(#Jh@X35B!NAEBVGVOu5(pc=E}OwHw9WlMl`pLLjHR|FQ2$$680R z`^1CBLSM%Eov$||=FXLU9pCr{ioSvTe8FGx4Q;dxKfS(7oGaK%zH=Kb=bs)c`#Ljo zSv5Ob;VjLsRV>KU3RmE1TX8MBa@^PM*URn$IjZPBxa@r133gUEa8;!bxm)gkeDCAz z$&#yY!`Aoj7d~`woKi?+|DnSC|MskOH_+U;r-JTqk{obxmC1(?jlI|Z1|#$|Zptg(A? zi6oEXp$Z)@Lr84=x0Z7y;1ps%^ zbDCyt6&uBN=eP=jDL=GDrizsVx|?N3seE$<1663Dym*tVT9eScP-f(??EN;`mxg`%jxAlE<8 T&;E)!{>3a%RO<^wpmFxUYUk2+ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/invitations.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/invitations.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4414a91a079a7bf6040b593ce1a3ba5ed45f56bc GIT binary patch literal 2581 zcmb_eO>7%Q6rS<^+0F*1P1=;Uq+1GVU6G_v)TXo`l_o-^mP^ubu`HIwJ4rURciow_ zkxdR2txzk0dZU%9O6jSI+Jb>gj^)IGixCIRN{9m&I3QU#Qc+I4nYA0IKcGsC(y zQInE$CBpn%I|ZTC_M|lj##Ka62HPkTv2jMSBSf|(Tb_|^<)WNXY?Y|CL^POdFpr9P zlxX0K&8T(^d~xB6^L4OKwR^zV6Ydkw(P6GvS?o`d%?x_M99!K1*CbTPAKfn{qzLGRG&wMJspKnk6i26H=U|R$uf8R>YV@LI;RIgc8HLzm>w^cGA|5O1H>bnFeM<6K;TUuz!3DTIL! zpYtrn0-EneqV2s7_h$ivjNFi6Mdx<4qg-|F%>}qe9|3lsN3KerC<;1*4x>-yyV8d^ zDOX>a5@0jK%I6I$=R0L$be+}kT*ESE!Rs3B+(*{%=vp)cgs}9oM0xgsVp7lZ1?tNY zs)LL6foL;8d-M}MD3t18+$v^a2U`_1i(`qJ^G z`K9d2w))VU_r||VeVh7m%j8dq$$E6Mo|s%?{PiF2KZx((m*u<4K^&;z<;w9Z)ES&4 z0eTsX{|j_mT8P+CHV(d{-i8*y2N0k=fq-ar{0wnzfZy$c-SE8!sFQ-_05i5t31d7k z?>UcfLU~oteh`8D&gnDLRsDqL`f#s@rz=HL?X!x-ypt0>VsxH)F7ywzK>Rt+4z!|G z$$J(UbHuWtMACEso|BZ;Ii%ab!8mk=VT4R37-ZeWWOYY3kq-qo@$D%P|H@;-c;S|Q zQ*Z1YZtNRrBoEh*oT~3jt;Xc7X?!2aeQDf8a!g3D+Z-P_g1^Rx3UKddw@21Ks0b#Ds%Ld4? zayhT$`o;r#p2UhenkQD7(A{tZ`aFn`4Z0P~4b8AutTWr3R-f$#e?#a+zLWoH=#epUWbJ%r&a3?DGpDiG5Q;-*>f>{6cFx@n#(S@|$Rx4=6ozvT28 z5P`&eO8Iw&4syYp8y(_e4;MVkWkeI)=FOh+_9_Hl$QD3cL=AoL{6tg6%C1GNi9jul zx43Gmk}`#B{Y}L6%J!DfOt|Yv9t)v*gAPN0 ff1w%gjZFz-{3|;813LN(+Ie5yi{ZM15Ig??Pm+GQ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/keys.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/keys.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68b8f3800e6aad48d1cc0442f968d5af0f1a0eb8 GIT binary patch literal 2634 zcmbtWUu+ab7@ygl-TTvPuh`Ox{5wPpC$v=?{)&G{TeQ#=0>$Wg$$IQe+imx5mznM1 zo%cY17)&(2SrR1Su?R?c65sUA#FzS3*APwAMBYxX38qhev%AGsEs;3Mee-?a%+AdB z`@Y}Iebd~WM9`YQdwcvB4WXZ;vD8SUG=@N#MifzOqaw~>jHp6YTPdnJwMcTLsO7Z4 zM{KmhkRjX{dhesOwoyN%-m! zR`Hua9B0A>2ZNb$gR|39OnAd)xKJotBBOB;lxf6J4pWpo zPFum3u8`~+pTOxwHPPd8XM&lY@MBICoX(jy#Y@9x1V|8o)K&O39s@CrYPg1sU_gor zAT^xDyb1KI;uFE_(ZCS$vrK03wZ8rNlY()PKQcHtlJ93?(sSH=*|AJ^aEz6_e3_NX z`6266URWOMatr2UVT_49Wy~Gpg<{VnoVMGo0Lq3{vOL46Hp>9Im&^ogB&0Zt<~uiC zBp;?4U?4vk#b;P_MLaqTo`+v!0>lx7Atp~|IcPOBu{`$3dl|~BhCwP<2+UY2zGzf- zOC@w3QT1Iw>tkhFeNWTS3A6`&KyIpMaF$f}A7>u7Sec1T!L~CpuuMS+$FvF_qnR_7 zH=gmvSq2VXwkUX_2nK2QBJNq#0w{*BsXPul`kKKV$BU5Xve>xHPy{?r%Q?h`8m=Y+ zyri0v6ZU}k75#A*{k(SLe7fzU>igA;_N6VC4qrNOb!slvHRIi?U8^-zr6YMCDXqym zQW8?MCKrWV;M_C4_y&HC+|+upuR;{2ERUrY10{gB1j?hrTT?EhE872n_?2Z4XN1d4 zYt%9&(*G4`-VVoJ)B~t{hIt2A0QduRx#XRY@n$la5MybxE3$So5`S1 zLw=`c6`A2VhHaG@(8UnUbV^j1GAm0>ay7`%IZz%oL#q*hsx_si)<{jO>6Cn;QMl7A zd?R)pZf@Ct81Yqzk*MzM;|z`uY$#<89vcku^-ng0p?3!v;%i||pBy`SVkE2aOpqBE^#+s;NGwJUT1V&&#Zi7k=qXp3U%Pc~+n%}hy$dlS2}&eEi6kg!5kYsqjPKwV$rswo_}{td z!7&~+^AF=DRd0~%(JcU()|O`)qlyNXpcY($dbO>e*=%L5qm-_PL-~6Dz|g?R06Zz% zzzmbXH-Ng5bUF=Ii2x1_nQ^fXL`c1sj=#gZl6v!P>lZXN4G^k{kS3g#1{13gQBqPj#Lhs1vMhz8b3|=w|vG zva9PvOI|$z1)wEo-fGCMo|3M<&}9bQtQn2OwdDL08|$jwBdV{zE8GbNGXWm`#%9Wl5#8n literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/members.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/members.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..797465a399d01e81253fc57b87d943a30f22b255 GIT binary patch literal 1582 zcmb7EOKclO7@pakT|a8qKoUX=3S0H$N+h5ns31ZV9HBPBC~4tfxmq00IN5a9>&~o$ zYMj};}!U3*X;g} zZ)ShV=d%b_{`ZfUA8H8wDUD>2SQ)+w$_Ao{Vi$S1f<3LGVQFiw?vVwt zQ+`qqXF;1c%k{W!m0#*QJi}*H6+PTTwhBn-pdv08F;9aItr5Z8hBAbF&9V+=-+iO{ zp-wmL8-+i5z1ZFirF+n7u|vH+0*SVMc`6F10Lxgi)R%*I{X4t=aEIos>-3|9bV z5r+8&k{`8tXyxbxV((4hyoUj`TLg9_CnAnYk??&T`2Q4U_Kmioe{LA)5_%ndN$%;N z;3DZ>Sx`e3R?T&-s5z@vulwz0VEK!R5v$>I74{oeu*{OMu$-oqwc;fMqQ&Y?!(r5l z+nhYWQ{8kjv+`}78&Fqh*xdJnm?eG;T)Y4flf-j!PtJ8jV8_$$jwS;>>Xk2wmjV7l z|E!_?GDsU;26Or@3Fp=6@^9@22N>3-bp;X87#P zS$r42Lhc!7ahQn`Nm}ILN>&OKMN0t6|D~m;-9)#H|E7lOcgdYN6VPKEr3a&q0R$O} zAhY}S0`vS;Ce-K;C;S9e4eonS>_|A^Pebu=!Qxp?g=T4HZszg~Ty)c8!Lm=wTwbQ4 zen_lCQ9YV+de^j2s4 z#P+e>-1H9p(fz^Q8+m@;& zF%i`!D*{hDa9p8oLsZBFxDSgvNKZ#izQs>LK>i7YWMrUYjQ>EVAD|Z=nIjkm2B2R1 E7Z#L&iU0rr literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/options.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/options.cpython-312.pyc deleted file mode 100644 index 3016e140384798158a5486157787cd1846482f24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11442 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 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/projects.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/projects.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff69586aa80872710059e5ddcb886827a8795ac2 GIT binary patch literal 2625 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/deepgram/__pycache__/usage.cpython-312.pyc b/venv/Lib/site-packages/deepgram/__pycache__/usage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8925636d7b5f994b64606a02ceedd9a9ac048d7b GIT binary patch literal 2952 zcmdT`-ES0C6u);q_G3ERE-h^NW;8}!fn6&iY6@6Eo6=en5KShVjLXjLGO)9|-a9SX zbxj%|rX(8Qgal1^@Bu~nes9Z%hvT+5u*u)swk}X#xS2kr=F%?%eRX1kF z+_)Kc6K29qnn_nPHPKJ0^tigIyD2k;k%UH(tzJfU?6wrlZuU0f*~CNM$YNh96`A)C z^G3pte^~dNT9x_QX;v(g_Z?EP{Y|U&$gB%!ed{FoY??67PYYYvns5La+=xU2Q=x&? zVNH^i{DeirS^6!vc%E1=C2d&DqfWJ43br3e@SG^!7O1O;AQRijlx%FuwnP+Lwv{Ob z&aIeg64|;PBQe0^woDRJF*|-)HIo8M04@^^uq5>DS<_bsJO#K0eS6p7eSoI{?*V*M zL&>ImRUD(4%-3n{94UFskJmy!#whWoX?3y``d;jr*Jb#+{bKJe+(MQxaM3`w@MIR# zO;87qD2!C5M1%2RhOs<$?Crv7Mkp(ckBxm)I8NAkuU0S2)SMC-DU+&Km?71f!i00C zz#Nb4uNO<_flF4f38|N9(aleDZgcepxZ857j%QiTUU7t6)b4?$SQ5l6S{&Rxr+lq< zp@DoYJfY>-C4Pda@UEBO>;3>@9ARLjCC#Qieyv3DR?hFB=pKF{d1_>Dp>wgQzN)Xo zt#4tFvd32tr6t`CXT6TTS7DrprpOxTXoX7sCPo zY_Bp6jI3}C=CA;VSTHHIq>#7ht&6&VUc;OGMBWap<&D9+P$3a(Pb7`*fZ3bc3Tyev ztSs1~JHZgd+FF_nK-bgMQzk1cHG>y1w+7lUfggfR2Y5<|Q_##D{|JFo(hV!`ti#Z>|vvWBUZ zsG_^L$Ja$tlJg|jSjdmueQ7>_qMaLW>l6P;Bi#(EWczt;tQK8jS-xgj zZq1&q@VainFG;ZySc1oc=P)`5!k6JcB}fE3C(+$p@VrI&^`qh@^Z2GOa3P$+a~^#W z#4SX(@;XlmG#v>(gxvsf87=CAv+s2jtnRrH?;ub&k9WC(Y;X*Z;y>l2sx5Bc)e-vT zqe4GOZtJRmcQWzN$o1Y_M+W^MxuvUu?rcVH4sRI#dN@224Bv_lk8E7wt+30$Bfdhg zdA{$-Y@Z+V8g+P=MPl@07PJVX!cF45;^e{`!a2fMB7Jh_K>umasj%R_h;SF~*bBB* x7cD1-14@q2JQ(;70po7$$Qa|_(BP6J;loP^M3;-D7{WtKu^iU^LLkIE{{YOXs>uKV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/deepgram/_constants.py b/venv/Lib/site-packages/deepgram/_constants.py new file mode 100644 index 00000000..993680ce --- /dev/null +++ b/venv/Lib/site-packages/deepgram/_constants.py @@ -0,0 +1 @@ +DEFAULT_ENDPOINT = "https://api.deepgram.com/v1" diff --git a/venv/Lib/site-packages/deepgram/_enums.py b/venv/Lib/site-packages/deepgram/_enums.py new file mode 100644 index 00000000..d766b6ff --- /dev/null +++ b/venv/Lib/site-packages/deepgram/_enums.py @@ -0,0 +1,12 @@ +from enum import Enum + + +class LiveTranscriptionEvent(Enum): + OPEN = 'open' + CLOSE = 'close' + TRANSCRIPT_RECEIVED = 'transcript_received' + ERROR = 'error' + +class Caption(Enum): + SRT = 'srt' + WEBVTT = 'webvtt' diff --git a/venv/Lib/site-packages/deepgram/_types.py b/venv/Lib/site-packages/deepgram/_types.py new file mode 100644 index 00000000..12fd867b --- /dev/null +++ b/venv/Lib/site-packages/deepgram/_types.py @@ -0,0 +1,474 @@ +# We want these types to be flexible to allow for updated API responses +# or cutting-edge options to not break the client for older SDK versions; +# as such, everything is implemented using TypedDicts +# instead of, say, dataclasses. + +import sys +from datetime import datetime +from typing import Optional, List, Union, Any, Dict + +if sys.version_info >= (3, 8): + from typing import TypedDict, Literal +else: + from typing_extensions import TypedDict, Literal +if sys.version_info >= (3, 9, 2): + from collections.abc import Callable, Awaitable +else: + from typing import Callable, Awaitable + + +class UpdateResponse(TypedDict): + message: str + + +# Transcription + + +class Options(TypedDict, total=False): + api_key: str + api_url: str # this URL should /not/ include a trailing slash + suppress_warnings: bool + raise_warnings_as_errors: bool + + +class UrlSource(TypedDict): + url: str + + +class BufferSource(TypedDict): + buffer: bytes + mimetype: str + + +TranscriptionSource = Union[UrlSource, BufferSource] + + +BoostedKeyword = TypedDict( + "BoostedKeyword", + { + "word": str, + "boost": float, + }, +) +Keyword = Union[str, BoostedKeyword] + + +class TranscriptionOptions(TypedDict, total=False): + # References for the different meanings and values of these properties + # can be found in the Deepgram docs: + # https://developers.deepgram.com/documentation/features/ + model: str + version: str + language: str + punctuate: bool + profanity_filter: bool + redact: List[str] + diarize: Literal["false", "true"] + diarize_version: str + version: str + multichannel: bool + alternatives: int + # numerals will be deprecated in the future + numerals: bool + numbers: bool + numbers_spaces: bool + search: List[str] + callback: str + keywords: List[str] + keyword_boost: str + ner: str + tier: str + dates: bool + date_format: str + times: bool + dictation: bool + measurements: bool + smart_format: bool + replace: Union[str, List[str]] + tag: List[str] + filler_words: bool + + +class PrerecordedOptions(TranscriptionOptions, total=False): + # References for the different meanings and values of these properties + # can be found in the Deepgram docs: + # https://developers.deepgram.com/documentation/features/ + utterances: bool + utt_split: float + detect_entities: bool + summarize: Union[bool, str] + paragraphs: bool + detect_language: bool + detect_topics: bool + translate: List[str] + analyze_sentiment: bool + sentiment: bool + sentiment_threshold: float + + +class LiveOptions(TranscriptionOptions, total=False): + # References for the different meanings and values of these properties + # can be found in the Deepgram docs: + # https://developers.deepgram.com/documentation/features/ + interim_results: bool + endpointing: bool + vad_turnoff: int + encoding: str + channels: int + sample_rate: int + + +class ToggleConfigOptions(TypedDict): + numerals: bool + + +class WordBase(TypedDict): + word: str + start: float + end: float + confidence: float + speaker: Optional[int] + speaker_confidence: Optional[float] + punctuated_word: Optional[str] + + +class Hit(TypedDict): + confidence: float + start: float + end: float + snippet: str + + +class Search(TypedDict): + query: str + hits: List[Hit] + + +class Translation(TypedDict): + translation: str + language: str + + +class Alternative(TypedDict): + transcript: str + confidence: float + words: List[WordBase] + detected_language: Optional[str] + translation: Optional[List[Translation]] + + +class Summary(TypedDict): + summary: str + start_word: float + end_word: float + + +class Entity(TypedDict): + label: str + value: str + confidence: float + start_word: float + end_word: float + + +class Sentence(TypedDict): + text: str + start: float + end: float + + +class Paragraph(TypedDict): + sentences: List[Sentence] + num_words: float + start: float + end: float + + +class ParagraphGroup(TypedDict): + transcript: str + paragraphs: List[Paragraph] + + +class Topic(TypedDict): + topics: List[str] + text: str + start_word: float + end_word: float + + +class Channel(TypedDict): + search: Optional[List[Search]] + alternatives: List[Alternative] + summaries: Optional[List[Summary]] + entities: Optional[List[Entity]] + paragraphs: Optional[ParagraphGroup] + topics: Optional[List[Topic]] + + +class Utterance(TypedDict): + start: float + end: float + confidence: float + channel: int + transcript: str + words: List[WordBase] + speaker: Optional[int] + speaker_confidence: Optional[float] + id: str + + +class Warning(TypedDict): + parameter: str + type: Literal[ + "unsupported_language", + "unsupported_model", + "unsupported_encoding", + "deprecated", + ] + message: str + + +class SummaryV2(TypedDict): + short: str + result: Literal["success", "failure"] + + +class Metadata(TypedDict): + request_id: str + transaction_key: str + sha256: str + created: str + duration: float + channels: int + models: List[str] + model_info: Dict[str, Any] + warnings: List[Warning] + + +TranscriptionResults = TypedDict( + "TranscriptionResults", + { + "channels": List[Channel], + "utterances": Optional[List[Utterance]], + "summary": Optional[SummaryV2], + }, +) + + +class PrerecordedTranscriptionResponse(TypedDict, total=False): + request_id: str + metadata: Metadata + results: TranscriptionResults + + +StreamingMetadata = TypedDict( + "StreamingMetadata", + { + "request_id": str, + "model_uuid": str, + }, +) + + +class LiveTranscriptionResponse(TypedDict): + channel_index: List[int] + duration: float + start: float + is_final: bool + speech_final: bool + channel: Channel + metadata: StreamingMetadata + + +EventHandler = Union[Callable[[Any], None], Callable[[Any], Awaitable[None]]] + + +# Keys + + +class Key(TypedDict): + api_key_id: str + key: Optional[str] + comment: str + created: datetime + scopes: List[str] + + +# Members + + +class Member(TypedDict): + email: str + first_name: str + last_name: str + id: str + scopes: Optional[List[str]] + + +class KeyBundle(TypedDict): + api_key: Key + member: Member + + +class KeyResponse(TypedDict): + api_keys: List[KeyBundle] + + +# Projects + + +class Project(TypedDict): + project_id: str + name: str + + +class ProjectResponse(TypedDict): + projects: List[Project] + + +# Usage + + +class UsageRequestListOptions(TypedDict): + start: Optional[str] + end: Optional[str] + page: Optional[int] + limit: Optional[int] + status: Literal["succeeded", "failed"] + + +class UsageRequestDetails(TypedDict): + usd: float + dutation: float + total_audio: float + channels: int + streams: int + model: str + method: Literal["sync", "async", "streaming"] + tags: List[str] + features: List[str] + config: Dict[str, bool] # TODO: add all possible request options + + +class UsageRequestDetail(TypedDict): + details: UsageRequestDetails + + +class UsageRequestMessage(TypedDict): + message: Optional[str] + + +class UsageCallback(TypedDict): + code: int + completed: str + + +class UsageRequest(TypedDict): + request_id: str + created: str + path: str + accessor: str + response: Optional[Union[UsageRequestDetail, UsageRequestMessage]] + callback: Optional[UsageCallback] + + +class UsageRequestList(TypedDict): + page: int + limit: int + requests: Optional[List[UsageRequest]] + + +class UsageOptions(TypedDict, total=False): + start: str + end: str + accessor: str + tag: List[str] + method: Literal["sync", "async", "streaming"] + model: str + multichannel: bool + interim_results: bool + punctuate: bool + ner: bool + utterances: bool + replace: Union[str, List[str]] + profanity_filter: bool + keywords: bool + diarize: bool + detect_language: bool + search: bool + redact: bool + alternatives: bool + numerals: bool + detect_entities: bool + summarize: Union[bool, str] + paragraphs: bool + detect_language: bool + detect_topics: bool + translate: bool + analyze_sentiment: bool + sentiment_threshold: float + + +class UsageResponseDetail(TypedDict): + start: str + end: str + hours: float + requests: int + + +UsageResponseResolution = TypedDict( + "UsageResponseResolution", {"units": str, "amount": int} +) + + +class UsageResponse(TypedDict): + start: str + end: str + resolution: UsageResponseResolution + results: List[UsageResponseDetail] + + +class UsageFieldOptions(TypedDict, total=False): + start: str + end: str + + +class UsageField(TypedDict): + tags: List[str] + models: List[str] + processing_methods: List[str] + languages: List[str] + features: List[str] + + +# Billing + + +class Balance(TypedDict): + balance_id: str + amount: float + units: str + purchase: str + + +class BalanceResponse(TypedDict): + projects: List[Balance] + + +# Scope + + +class Scope(TypedDict): + scopes: List[str] + + +# Invitation + + +class Invitation(TypedDict): + email: str + scope: str + + +class InvitationResponse(TypedDict): + message: str diff --git a/venv/Lib/site-packages/deepgram/_utils.py b/venv/Lib/site-packages/deepgram/_utils.py new file mode 100644 index 00000000..d869742f --- /dev/null +++ b/venv/Lib/site-packages/deepgram/_utils.py @@ -0,0 +1,242 @@ +from typing import Any, Union, Optional, IO, Mapping, Tuple, List, cast +import aiohttp +import urllib.parse +import urllib.request +import urllib.error +import io +import json +import re +import platform +import websockets +import websockets.client +import websockets.exceptions +import warnings +from ._constants import DEFAULT_ENDPOINT +from ._types import Options +from ._version import __version__ +from .errors import DeepgramApiError + +Payload = Optional[Union[dict, str, bytes, IO]] + +RETRY_COUNT = 4 + + +def _prepare_headers( + options: Options, headers: Mapping[str, str] = None +) -> dict: + if headers is None: + headers = {} + auth = ( + None if 'api_key' not in options + else cast(str, options.get('auth_method', 'Token')) + + ' ' + options['api_key'] + ) + return { + **headers, + 'Authorization': auth, + 'User-Agent': ( + f'deepgram/{__version__} python/{platform.python_version()}' + ) + } + + +def _normalize_payload(payload: Payload) -> Optional[Union[bytes, IO]]: + if payload is None: + return None + if isinstance(payload, dict): + return json.dumps(payload).encode('utf-8') + if isinstance(payload, str): + return payload.encode('utf-8') + return payload + + +def _make_query_string(params: Mapping[str, Any] = None) -> str: + if params is None: + params = {} + + def elem_decomposer(key: str, value: Any) -> List[Tuple[str, str]]: + if value in [None, ""]: + return [] + if isinstance(value, list): + # break into multiple parameters + return [elem_decomposer(key, item)[0] for item in value] + # just take the first element in the sublist, + # rather than trying to flatten recursively + # passing nested lists as query parameters + # isn't really well-defined, nor does anything + # in our API currently take things like that as of 2021-08-10 + # so everything coming through this second pass + # should be a 1-item list + if isinstance(value, bool): + # make sure False and True stay lowercased + # in accordance with DG convention + return [(key, str(value).lower())] + return [(key, str(value))] + + # sublist for each original parameter + unflattened = [elem_decomposer(k, v) for k, v in params.items()] + # flatten + flattened: List[Tuple[str, str]] = sum(unflattened, []) + return ('?' if flattened else '') + urllib.parse.urlencode(flattened) + + +async def _request( + path: str, options: Options, + method: str = 'GET', payload: Payload = None, + headers: Optional[Mapping[str, str]] = None, + timeout: float = None, +) -> Any: + if headers is None: + headers = {} + destination = cast(str, options.get('api_url', DEFAULT_ENDPOINT)) + path + updated_headers = _prepare_headers(options, headers) + + if timeout is None: + timeout = aiohttp.client.DEFAULT_TIMEOUT + else: + timeout = aiohttp.ClientTimeout(total=timeout) + + async def attempt(): + # Define `content` outside the try block so we can differentiate between errors + # thrown by `aiohttp.request` and `resp.raise_for_status()`. This can be removed + # after the aiohttp issue mentioned below is fixed. + content = None + try: + async with aiohttp.request( + method, destination, data=_normalize_payload(payload), + headers=updated_headers, timeout=timeout + ) as resp: + # The error handling for this async code is more difficult than normal + # because aiohttp does not include the response body in the exception + # object. We therefore need to read the response body before throwing + # an error, and attach the response body to the error. This should + # be fixed by aiohttp in v4.x. See the github issue here for info: + # https://github.com/aio-libs/aiohttp/issues/4600 + # Once that work is complete, we can use `raise_for_status=True` as a + # parameter in the `aiohttp.request` call. + content = (await resp.text()).strip() + resp.raise_for_status() + if not content: + return None + body = json.loads(content) + if body.get('error') or body.get('err_msg'): + raise DeepgramApiError(body, http_library_error=None) + if options.get("raise_warnings_as_errors") and "metadata" in body and "warnings" in body["metadata"]: + raise DeepgramApiError({"warnings": body["metadata"]["warnings"]}, http_library_error=None) + if (not options.get("suppress_warnings")) and "metadata" in body and "warnings" in body["metadata"]: + for warning in body["metadata"]["warnings"]: + warnings.warn(warning["message"]) + return body + except aiohttp.ClientResponseError as exc: + # If the request returned a response body and errored, return the response body. + # Otherwise return the request's error message. + if content is not None: + try: + body = json.loads(content) + raise DeepgramApiError(body, http_library_error=exc) from exc if exc.status < 500 else exc + except: + pass + else: + raise DeepgramApiError(exc.message, http_library_error=exc) from exc if exc.status < 500 else exc + except aiohttp.ClientError as exc: + raise DeepgramApiError(exc, http_library_error=exc) from exc + + tries = RETRY_COUNT + while tries > 0: + try: + return await attempt() + except aiohttp.ClientError as exc: + if isinstance(payload, io.IOBase): + # stream is now invalid as payload + # the way aiohttp handles streaming form data + # means that just seeking this back still runs into issues + raise DeepgramApiError(exc, http_library_error=exc) from exc + tries -= 1 + continue + return await attempt() + + +def _sync_request( + path: str, options: Options, + method: str = 'GET', payload: Payload = None, + headers: Optional[Mapping[str, str]] = None, + timeout: float = None +) -> Any: + if headers is None: + headers = {} + destination = cast(str, options.get('api_url', DEFAULT_ENDPOINT)) + path + updated_headers = _prepare_headers(options, headers) + + def attempt(): + req = urllib.request.Request( + destination, + data=_normalize_payload(payload), + headers=updated_headers, + method=method) + try: + with urllib.request.urlopen(req, timeout=timeout) as resp: + content = resp.read().strip() + if not content: + return None + body = json.loads(content) + if body.get('error') or body.get('err_msg'): + raise DeepgramApiError(body, http_library_error=None) + if options.get("raise_warnings_as_errors") and "metadata" in body and "warnings" in body["metadata"]: + raise DeepgramApiError({"warnings": body["metadata"]["warnings"]}, http_library_error=None) + if (not options.get("suppress_warnings")) and "metadata" in body and "warnings" in body["metadata"]: + for warning in body["metadata"]["warnings"]: + warnings.warn(warning["message"]) + return body + except urllib.error.HTTPError as exc: + # Try to get the HTTP error's request body. Deepgram returns a JSON response + # body for error messages. We want to return that as the error message if + # it exists. + try: + error_body = json.loads(exc.read().decode("utf-8")) + except Exception: + error_body = str(exc) + raise DeepgramApiError(error_body, http_library_error=exc) from exc + + tries = RETRY_COUNT + while tries > 0: + try: + return attempt() + except urllib.error.URLError as exc: + if isinstance(payload, io.IOBase): + # stream is now invalid as payload + # the way aiohttp handles streaming form data + # means that just seeking this back still runs into issues + raise DeepgramApiError(exc, http_library_error=exc) from exc + tries -= 1 + continue + return attempt() + + +async def _socket_connect( + path: str, options: Options, headers: Optional[Mapping[str, str]] = None +) -> websockets.client.WebSocketClientProtocol: + if headers is None: + headers = {} + destination = re.sub( + r'^http', 'ws', cast(str, options.get('api_url', DEFAULT_ENDPOINT)) + ) + path + updated_headers = _prepare_headers(options, headers) + + async def attempt(): + try: + # If we're streaming too much faster than realtime, + # connection might close without an aggressive ping interval + return await websockets.connect( + destination, extra_headers=updated_headers, ping_interval=5 + ) + except websockets.exceptions.InvalidHandshake as exc: + raise DeepgramApiError(exc, http_library_error=exc) from exc + + tries = RETRY_COUNT + while tries > 0: + try: + return await attempt() + except Exception as exc: + tries -= 1 + continue + return await attempt() diff --git a/venv/Lib/site-packages/deepgram/_version.py b/venv/Lib/site-packages/deepgram/_version.py new file mode 100644 index 00000000..c37d7c6a --- /dev/null +++ b/venv/Lib/site-packages/deepgram/_version.py @@ -0,0 +1 @@ +__version__ = 'v2.12.0' diff --git a/venv/Lib/site-packages/deepgram/audio/__init__.py b/venv/Lib/site-packages/deepgram/audio/__init__.py deleted file mode 100644 index dcadaa4c..00000000 --- a/venv/Lib/site-packages/deepgram/audio/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .microphone import Microphone -from .microphone import DeepgramMicrophoneError -from .microphone import ( - LOGGING as INPUT_LOGGING, - CHANNELS as INPUT_CHANNELS, - RATE as INPUT_RATE, - CHUNK as INPUT_CHUNK, -) - -from .speaker import Speaker -from .speaker import DeepgramSpeakerError -from .speaker import ( - LOGGING as OUTPUT_LOGGING, - CHANNELS as OUTPUT_CHANNELS, - RATE as OUTPUT_RATE, - CHUNK as OUTPUT_CHUNK, - PLAYBACK_DELTA as OUTPUT_PLAYBACK_DELTA, -) diff --git a/venv/Lib/site-packages/deepgram/audio/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/audio/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index decb220ca7803051939378281da77ca6797a7669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 670 zcmY*W%Wl&^6rJ%ScAePeQ3OI_#mWoF9w8)?L}?V`R;{yOWXUq|D6x`>t#J~mU&0r# zV99sz2P1XGiXBo^Ds{yjKMLH%nRCzFIron4ciXlQ#O~X8`9(qKhfLalyo$pTj?XAX zDPALn3C5Buz!joYTm`NYjp?Mr3}Uh)VpY1f?y?@~Ra^&d6T9La;3{#T{ut^XK>b7Z zh&;yV%5cq}7}~j5SRb-E&x>Wgp^!ZtQd%r{!v3lw&U5Z+!tl?=<4G_U=HS!|f{}kI zv(fZJiOzLs$~zJa2_}GW&VBFWdv7p}ha*4q0{28% z?0zV&%0f+od@Srqa6Sv;W|+!LIJMT!Re1}m7UhU_pKet~7YkNdN!mD>}d>y1N*>iDo6`Wi*{k!e~g#)iy7peV)y! zx1gJCw5OYWdt)2@^rVR@Az|Q rAvapO0KZg>@r{M>%WKrXRdlQz5WtOt@QZ8Y-YOle{6+x$8C3rPAw0C; diff --git a/venv/Lib/site-packages/deepgram/audio/microphone/__init__.py b/venv/Lib/site-packages/deepgram/audio/microphone/__init__.py deleted file mode 100644 index d5ead2f1..00000000 --- a/venv/Lib/site-packages/deepgram/audio/microphone/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .microphone import Microphone -from .constants import LOGGING, CHANNELS, RATE, CHUNK -from .errors import DeepgramMicrophoneError diff --git a/venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index aa45e61816b90c0a7281c2a20898cfed0fdde32a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390 zcmYLFyGjE=6rIUFvk)vS`~a&(G>vIQgph>IlDL8<%`&pAyF)T$XJ?t&1o9<*gQeeL zX*Y!yR(3+LN#%@0bBn_{_i^s!zO-5%P_cXt<{<>&LyNy??8xR^kw=h&92S7W7(&e( zMS~i#LCx5tR%}r_wtw?R;ZQerAy}Kf^{G6852bfaGR~?wE3t1%XM7U`VH8NWH|$2y zV0F4ay||(5Wiw-?sME3*+*F!d8f*=Y zF56g73hpZL1U3r6_P%$4rUG+;MqxNXeJmC=tI&#(40mU^tkDXWD>Nn#NRS$zR%y0K zXIP+ocUL=I=7hEPr?iuVl%!6QvueF{FDc8H1-{}3YMcInI8^XuKnTA*0FU26=M{9` JzzJ`u{12_JY%2f& diff --git a/venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/constants.cpython-312.pyc b/venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/constants.cpython-312.pyc deleted file mode 100644 index 82f131288739d1cd94e33a6a60bb925b87d8bc3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357 zcmYL@F>As=7>4gmVnU1^y9w=5aA;jRl_CVIQIr&{QV2&O=8kwZ$%R}Ja7%whe?!Oq zj!vB_Sv$E2(#5G4sPrA)@BR25c)yQkQwKuXyR{rZ0KTi`sM=rHUyJYxFu*VXA#@-F z1U}10?0-5Et~oN690kixeXX?XTS;8oux#WcSujol=JT!S0kr4}tDOO0x7AX~QX252 zf=l($oZ2JXD%HuoWmQ4z4NcqbPaaBnYR>wl(i_h0@f+9+92}l{H)zgD!qIp%nxQ+w zS1F58&ZtLBpF}CjNtB}rT_8?Vav8hc%Jm6Hn2^{{+_2+jn6gety@bU}7Lks}BA&WY z%CF+}LAwnZ&H~a+PDEYxJHHUNlOTjYI)LZ9I%u4J>8($_Rj8YWQD__0DCCW1yeNqw F&|fQlU8Mj3 diff --git a/venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/errors.cpython-312.pyc b/venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index 41c9dd8b21d716db25fe778088497de9eed24021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1102 zcmZ`&&ubGw6rS1Lm`zMllw#CEyWZSG(yIiKR$EF@d$C?(VA$?X(ruI7IJ2ou$f1XT zDOjinNu>DWDn0pkc&Xr_EZ+PFDzQ>}^380L;-L@r&3p5`_vY>QX1=AlNI^@;K^^2^iVoEXE8?bNs`e;DtV0A1^5DFNJc^3gK}E&EMb%NL zR#v*Gj2*R;D#jeGgNj$WXd4&f&yX1lvkR2gE6l1rb#3O?*L{yJGUl_^$D{$WxNXyV z;QF4yESFQqDErLV^!!(zK}8rh7_C|X0D*5@lrXC98nak4pOjVRgMhhfjezok^hMUpy+5o^#50>GAUNYH5M;&A_jhwtUy7^A+j^r7h}hm7ch3 zCGG|^SGVjgnD1 zcl~BR`$NBTJeliiZxYAZ>8`ey8bAcHhwKPjaw++|2Tl*Q(T3dqUmZvuH^w|(paL>guZu(>$PU{^thaiA<@rlQ8C7UG8vrjyQc^ineq?DOA>_u diff --git a/venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/microphone.cpython-312.pyc b/venv/Lib/site-packages/deepgram/audio/microphone/__pycache__/microphone.cpython-312.pyc deleted file mode 100644 index dac224e5d92b44c69530f38b88c91beb38038b65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13027 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 None: - self._asyncio_loop = asyncio.new_event_loop() - self._asyncio_loop.run_forever() - - def is_active(self) -> bool: - """ - is_active - returns the state of the stream - - Args: - None - - Returns: - True if the stream is active, False otherwise - """ - self._logger.debug("Microphone.is_active ENTER") - - if self._stream is None: - self._logger.error("stream is None") - self._logger.debug("Microphone.is_active LEAVE") - return False - - val = self._stream.is_active() - self._logger.info("is_active: %s", val) - self._logger.info("is_exiting: %s", self._exit.is_set()) - self._logger.debug("Microphone.is_active LEAVE") - return val - - def set_callback(self, push_callback: Callable) -> None: - """ - set_callback - sets the callback function to be called when data is received. - - Args: - push_callback (Callable): The callback function to be called when data is received. - This should be the websocket send function. - - Returns: - None - """ - self._push_callback_org = push_callback - - def start(self) -> bool: - """ - starts - starts the microphone stream - - Returns: - bool: True if the stream was started, False otherwise - """ - self._logger.debug("Microphone.start ENTER") - - self._logger.info("format: %s", self._format) - self._logger.info("channels: %d", self._channels) - self._logger.info("rate: %d", self._rate) - self._logger.info("chunk: %d", self._chunk) - # self._logger.info("input_device_id: %d", self._input_device_index) - - if self._push_callback_org is None: - self._logger.error("start failed. No callback set.") - self._logger.debug("Microphone.start LEAVE") - return False - - if inspect.iscoroutinefunction(self._push_callback_org): - self._logger.verbose("async/await callback - wrapping") - # Run our own asyncio loop. - self._asyncio_thread = threading.Thread(target=self._start_asyncio_loop) - self._asyncio_thread.start() - - self._push_callback = lambda data: ( - asyncio.run_coroutine_threadsafe( - self._push_callback_org(data), self._asyncio_loop - ).result() - if self._push_callback_org - else None - ) - else: - self._logger.verbose("regular threaded callback") - self._asyncio_thread = None - self._push_callback = self._push_callback_org - - if self._audio is not None: - self._stream = self._audio.open( - format=self._format, - channels=self._channels, - rate=self._rate, - input=True, - output=False, - frames_per_buffer=self._chunk, - input_device_index=self._input_device_index, - stream_callback=self._callback, - ) - - if self._stream is None: - self._logger.error("start failed. No stream created.") - self._logger.debug("Microphone.start LEAVE") - return False - - self._exit.clear() - if self._stream is not None: - self._stream.start_stream() - - self._logger.notice("start succeeded") - self._logger.debug("Microphone.start LEAVE") - return True - - def mute(self) -> bool: - """ - mute - mutes the microphone stream - - Returns: - bool: True if the stream was muted, False otherwise - """ - self._logger.verbose("Microphone.mute ENTER") - - if self._stream is None: - self._logger.error("mute failed. Library not initialized.") - self._logger.verbose("Microphone.mute LEAVE") - return False - - self._is_muted = True - - self._logger.notice("mute succeeded") - self._logger.verbose("Microphone.mute LEAVE") - return True - - def unmute(self) -> bool: - """ - unmute - unmutes the microphone stream - - Returns: - bool: True if the stream was unmuted, False otherwise - """ - self._logger.verbose("Microphone.unmute ENTER") - - if self._stream is None: - self._logger.error("unmute failed. Library not initialized.") - self._logger.verbose("Microphone.unmute LEAVE") - return False - - self._is_muted = False - - self._logger.notice("unmute succeeded") - self._logger.verbose("Microphone.unmute LEAVE") - return True - - def is_muted(self) -> bool: - """ - is_muted - returns the state of the stream - - Args: - None - - Returns: - True if the stream is muted, False otherwise - """ - self._logger.spam("Microphone.is_muted ENTER") - - if self._stream is None: - self._logger.spam("is_muted: stream is None") - self._logger.spam("Microphone.is_muted LEAVE") - return False - - val = self._is_muted - - self._logger.spam("is_muted: %s", val) - self._logger.spam("Microphone.is_muted LEAVE") - return val - - def finish(self) -> bool: - """ - finish - stops the microphone stream - - Returns: - bool: True if the stream was stopped, False otherwise - """ - self._logger.debug("Microphone.finish ENTER") - - self._logger.notice("signal exit") - self._exit.set() - - # Stop the stream. - if self._stream is not None: - self._logger.notice("stopping stream...") - self._stream.stop_stream() - self._stream.close() - self._logger.notice("stream stopped") - - # clean up the thread - if ( - # inspect.iscoroutinefunction(self._push_callback_org) - # and - self._asyncio_thread - is not None - ): - self._logger.notice("stopping _asyncio_loop...") - self._asyncio_loop.call_soon_threadsafe(self._asyncio_loop.stop) - self._asyncio_thread.join() - self._logger.notice("_asyncio_thread joined") - self._stream = None - self._asyncio_thread = None - - self._logger.notice("finish succeeded") - self._logger.debug("Microphone.finish LEAVE") - - return True - - def _callback( - self, input_data, frame_count, time_info, status_flags - ): # pylint: disable=unused-argument - """ - The callback used to process data in callback mode. - """ - # dynamic import of pyaudio as not to force the requirements on the SDK (and users) - import pyaudio # pylint: disable=import-outside-toplevel - - if self._exit.is_set(): - self._logger.notice("_callback exit is Set. stopping...") - return None, pyaudio.paAbort - - if input_data is None: - self._logger.warning("input_data is None") - return None, pyaudio.paContinue - - try: - if self._is_muted: - size = len(input_data) - input_data = b"\x00" * size - - self._push_callback(input_data) - except Exception as e: - self._logger.error("Error while sending: %s", str(e)) - raise - - return input_data, pyaudio.paContinue diff --git a/venv/Lib/site-packages/deepgram/audio/speaker/__init__.py b/venv/Lib/site-packages/deepgram/audio/speaker/__init__.py deleted file mode 100644 index f9adc8e5..00000000 --- a/venv/Lib/site-packages/deepgram/audio/speaker/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .speaker import Speaker -from .errors import DeepgramSpeakerError -from .constants import LOGGING, CHANNELS, RATE, CHUNK, PLAYBACK_DELTA diff --git a/venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 6bc2d7c2f614a34dcbdae44ee55d13ee008e3d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 403 zcmXw#KTE?v7{>3Kq)7@bg0Ajn(5@mP#5AO(Ar{*X9tR;dM-9y-;Vv!ollU1N{T%KN z2jbx5CKQ)W-f4V?AJ6j+&->@4+wA~Z>*wHM0s;6?=D%8v*qux92vU&398icLRJxV7 zsD`v(t>rp3kU`t1O-*D{3t7}gHUwMUF+OE3aG)@!6-icvNqICNq*}6sHZ7mAk~xMj z!JM)F%4d>BV^d_NuckO!Pc;JUKH*z|{Ss3gvG zW$Z;+@H#1K&J5{UTftPY6l{qnu#*IPh`S_3jW?v& z;4r(#JgdoRl`K}tl5m_hhxC(mnw9-#nSLB+MOMf0S+(6;m$XdRIk{p7a+G=oKa}{= VAcWr?0FU3m$vg00fzNuf{{v{`ZE^qr diff --git a/venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/constants.cpython-312.pyc b/venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/constants.cpython-312.pyc deleted file mode 100644 index 2359bf0a20b0c4c5958241f7b750b74ebe59bfd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmYLEJxjw-6n(EvnwWkl4&4emcF=;O6eXr1Esd$v6fp)Q?R&)7GzocWpo0*9h3G%% z=MLJ;oNiKoO`%$#i9Tx#;?lV0|ek}y=;*A6U#akPXGY~T`+~_I-j~-zN6U^BU9BIV}cG zazZJyN9mmdK&x)0>^O2<60V~ucO`bUmZqef+EJ8Wp|{TEPESvHsVQojtX`%}SJdT{ zm6|=Rot7?C@%l`Z+P4i^)x{}T(mP;vBORMPfIxofJGa7kr`tz zHdUu@5+}k3fi)OfHYO&*IIu%&RI|p&@oOZ&))0raf$x#X@*;8=Ojdk-;y`->dNmp_HdhfqnlnXpYMUr6{FS4fx{Ur1PL*eySn!V-=B0J-vS AjsO4v diff --git a/venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/errors.cpython-312.pyc b/venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index 76156b3f135fce164c8a4047edb720e78b0f504b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1087 zcmZ`&L2DC16rR~l%qBJ|O0jCSt~Xa`detD(YD+0fFRdUUFl=`x={B3)IJ2ou2-riw z6fEdL5-Flr>B-;WrGkgDc=HcbVx@TU&Fm&3=!1Rp-hA)9dHcPYPuXk+fiylYZ9G#D z`X-#ABx7T68H^rM&=Rsy2icgS12w{mxTzSbHOvrejG#dtoac~7Q4!mysMxru+6qmS zl`bk{TkVV$lXjwmif6iL8y8cn$Vi403zXI?%&e`}sad6LkujgO_A@%j;iJJSor*B7GwPZF0D-T^`MT?@Gm|y*8ChaJ2$-|p2q-T|UzDv;&dmzd zZ}5N_1$}LUM&(9;O}PbGj#tqG0S?>9%MxKKE?@zFBM~f!Z!ibyHSVDR)<|}hHrfMj z+xP%SI~X`^BQnZw3vb9HY9d2fVZt>MVUjoMl!Y20j^_k~gbB~AQI-&>8YVb(%hCzc zgjlZ0IU!u6>iW*F$M*}RN1QTVda%5_R$8FE8u<0nmhV_}zCyjAv_-wG(nDvx#GQc7 z)J>}j#PE_G&t%qY*p5HTqtVPpr045RmVy&nSN}D-{IJn+2;tM9PIu5(ExVigtX=F+ ze$lQUP2B7zUZjsEr@M*0u>nLNE9OPml10hnEpU3MjW*@>-)dhnxH)3*54w-us&KQE zm6lS_4TWg{MRZ}72AhksbaobWm;$l_Mo8<*e||-x6C!I0)DAj2f1zi*GG0#g@AZRs z?KkbdcQ`(CsLil3zzt2zNz4c4lp&<%+YMLPV}v|um~M=~skU#ywhHAXl`JQ^$;K13 zsOu79U?yIwY@*cC$w)1#Lp nw?3c<799N2?nG_gWs~3va`-t=$12A7M=po+{o5x97Mb!J@0AP1 diff --git a/venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/speaker.cpython-312.pyc b/venv/Lib/site-packages/deepgram/audio/speaker/__pycache__/speaker.cpython-312.pyc deleted file mode 100644 index 6d944970b9ba1d85c660e8452d619c177f916cc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19045 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 DWEB`u diff --git a/venv/Lib/site-packages/deepgram/audio/speaker/constants.py b/venv/Lib/site-packages/deepgram/audio/speaker/constants.py deleted file mode 100644 index a033c721..00000000 --- a/venv/Lib/site-packages/deepgram/audio/speaker/constants.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from ...utils import verboselogs - -# Constants for speaker -LOGGING = verboselogs.WARNING -TIMEOUT = 0.050 -CHANNELS = 1 -RATE = 16000 -CHUNK = 8194 - -# Constants for speaker -PLAYBACK_DELTA = 2000 diff --git a/venv/Lib/site-packages/deepgram/audio/speaker/errors.py b/venv/Lib/site-packages/deepgram/audio/speaker/errors.py deleted file mode 100644 index 4d9b95ef..00000000 --- a/venv/Lib/site-packages/deepgram/audio/speaker/errors.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - - -# exceptions for speaker -class DeepgramSpeakerError(Exception): - """ - Exception raised for known errors related to Speaker library. - - Attributes: - message (str): The error message describing the exception. - """ - - def __init__(self, message: str): - super().__init__(message) - self.name = "DeepgramSpeakerError" - self.message = message - - def __str__(self): - return f"{self.name}: {self.message}" diff --git a/venv/Lib/site-packages/deepgram/audio/speaker/speaker.py b/venv/Lib/site-packages/deepgram/audio/speaker/speaker.py deleted file mode 100644 index e16d5898..00000000 --- a/venv/Lib/site-packages/deepgram/audio/speaker/speaker.py +++ /dev/null @@ -1,380 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import asyncio -import inspect -import queue -import threading -from typing import Optional, Callable, Union, TYPE_CHECKING -import logging -from datetime import datetime - -import websockets - -from ...utils import verboselogs -from .constants import LOGGING, CHANNELS, RATE, CHUNK, TIMEOUT, PLAYBACK_DELTA - -from ..microphone import Microphone - -if TYPE_CHECKING: - import pyaudio - -HALF_SECOND = 0.5 - - -class Speaker: # pylint: disable=too-many-instance-attributes - """ - This implements a speaker for local audio output. This uses PyAudio under the hood. - """ - - _logger: verboselogs.VerboseLogger - - _audio: Optional["pyaudio.PyAudio"] = None - _stream: Optional["pyaudio.Stream"] = None - - _chunk: int - _rate: int - _channels: int - _output_device_index: Optional[int] = None - - # last time we received audio - _last_datagram: datetime = datetime.now() - _last_play_delta_in_ms: int - _lock_wait: threading.Lock - - _queue: queue.Queue - _exit: threading.Event - - _thread: Optional[threading.Thread] = None - # _asyncio_loop: asyncio.AbstractEventLoop - # _asyncio_thread: threading.Thread - _receiver_thread: Optional[threading.Thread] = None - _loop: Optional[asyncio.AbstractEventLoop] = None - - _push_callback_org: Optional[Callable] = None - _push_callback: Optional[Callable] = None - _pull_callback_org: Optional[Callable] = None - _pull_callback: Optional[Callable] = None - - _microphone: Optional[Microphone] = None - - def __init__( - self, - pull_callback: Optional[Callable] = None, - push_callback: Optional[Callable] = None, - verbose: int = LOGGING, - rate: int = RATE, - chunk: int = CHUNK, - channels: int = CHANNELS, - last_play_delta_in_ms: int = PLAYBACK_DELTA, - output_device_index: Optional[int] = None, - microphone: Optional[Microphone] = None, - ): # pylint: disable=too-many-positional-arguments - # dynamic import of pyaudio as not to force the requirements on the SDK (and users) - import pyaudio # pylint: disable=import-outside-toplevel - - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(verbose) - - self._exit = threading.Event() - self._queue = queue.Queue() - - self._last_datagram = datetime.now() - self._lock_wait = threading.Lock() - - self._microphone = microphone - - self._audio = pyaudio.PyAudio() - self._chunk = chunk - self._rate = rate - self._format = pyaudio.paInt16 - self._channels = channels - self._last_play_delta_in_ms = last_play_delta_in_ms - self._output_device_index = output_device_index - - self._push_callback_org = push_callback - self._pull_callback_org = pull_callback - - def set_push_callback(self, push_callback: Callable) -> None: - """ - set_push_callback - sets the callback function to be called when data is sent. - - Args: - push_callback (Callable): The callback function to be called when data is send. - This should be the websocket handle message function. - - Returns: - None - """ - self._push_callback_org = push_callback - - def set_pull_callback(self, pull_callback: Callable) -> None: - """ - set_pull_callback - sets the callback function to be called when data is received. - - Args: - pull_callback (Callable): The callback function to be called when data is received. - This should be the websocket recv function. - - Returns: - None - """ - self._pull_callback_org = pull_callback - - def start(self, active_loop: Optional[asyncio.AbstractEventLoop] = None) -> bool: - """ - starts - starts the Speaker stream - - Args: - socket (Union[SyncClientConnection, AsyncClientConnection]): The socket to receive audio data from. - - Returns: - bool: True if the stream was started, False otherwise - """ - self._logger.debug("Speaker.start ENTER") - - self._logger.info("format: %s", self._format) - self._logger.info("channels: %d", self._channels) - self._logger.info("rate: %d", self._rate) - self._logger.info("chunk: %d", self._chunk) - # self._logger.info("output_device_id: %d", self._output_device_index) - - # Automatically get the current running event loop - if inspect.iscoroutinefunction(self._push_callback_org) and active_loop is None: - self._logger.verbose("get default running asyncio loop") - self._loop = asyncio.get_running_loop() - - self._exit.clear() - self._queue = queue.Queue() - - if self._audio is not None: - self._stream = self._audio.open( - format=self._format, - channels=self._channels, - rate=self._rate, - input=False, - output=True, - frames_per_buffer=self._chunk, - output_device_index=self._output_device_index, - ) - - if self._stream is None: - self._logger.error("start failed. No stream created.") - self._logger.debug("Speaker.start LEAVE") - return False - - self._push_callback = self._push_callback_org - self._pull_callback = self._pull_callback_org - - # start the play thread - self._thread = threading.Thread( - target=self._play, args=(self._queue, self._stream, self._exit), daemon=True - ) - self._thread.start() - - # Start the stream - if self._stream is not None: - self._stream.start_stream() - - # Start the receiver thread within the start function - self._logger.verbose("Starting receiver thread...") - self._receiver_thread = threading.Thread(target=self._start_receiver) - self._receiver_thread.start() - - self._logger.notice("start succeeded") - self._logger.debug("Speaker.start LEAVE") - - return True - - def wait_for_complete_with_mute(self, mic: Microphone): - """ - This method will mute/unmute a Microphone and block until the speak is done playing sound. - """ - self._logger.debug("Speaker.wait_for_complete ENTER") - - if self._microphone is not None: - mic.mute() - self.wait_for_complete() - if self._microphone is not None: - mic.unmute() - - self._logger.debug("Speaker.wait_for_complete LEAVE") - - def wait_for_complete(self): - """ - This method will block until the speak is done playing sound. - """ - self._logger.debug("Speaker.wait_for_complete ENTER") - - delta_in_ms = float(self._last_play_delta_in_ms) - self._logger.debug("Last Play delta: %f", delta_in_ms) - - # set to now - with self._lock_wait: - self._last_datagram = datetime.now() - - while True: - # sleep for a bit - self._exit.wait(HALF_SECOND) - - # check if we should exit - if self._exit.is_set(): - self._logger.debug("Exiting wait_for_complete _exit is set") - break - - # check the time - with self._lock_wait: - delta = datetime.now() - self._last_datagram - diff_in_ms = delta.total_seconds() * 1000 - if diff_in_ms < delta_in_ms: - self._logger.debug("LastPlay delta is less than threshold") - continue - - # if we get here, we are done playing audio - self._logger.debug("LastPlay delta is greater than threshold. Exit wait!") - break - - self._logger.debug("Speaker.wait_for_complete LEAVE") - - def _start_receiver(self): - # Check if the socket is an asyncio WebSocket - if inspect.iscoroutinefunction(self._pull_callback_org): - self._logger.verbose("Starting asyncio receiver...") - asyncio.run_coroutine_threadsafe(self._start_asyncio_receiver(), self._loop) - else: - self._logger.verbose("Starting threaded receiver...") - self._start_threaded_receiver() - - async def _start_asyncio_receiver(self): - try: - while True: - if self._exit.is_set(): - self._logger.verbose("Exiting receiver thread...") - break - - message = await self._pull_callback() - if message is None: - self._logger.verbose("No message received...") - continue - - if isinstance(message, str): - self._logger.verbose("Received control message...") - await self._push_callback(message) - elif isinstance(message, bytes): - self._logger.verbose("Received audio data...") - await self._push_callback(message) - self.add_audio_to_queue(message) - except websockets.exceptions.ConnectionClosedOK as e: - self._logger.debug("send() exiting gracefully: %d", e.code) - except websockets.exceptions.ConnectionClosed as e: - if e.code in [1000, 1001]: - self._logger.debug("send() exiting gracefully: %d", e.code) - return - self._logger.error("_start_asyncio_receiver - ConnectionClosed: %s", str(e)) - except websockets.exceptions.WebSocketException as e: - self._logger.error( - "_start_asyncio_receiver- WebSocketException: %s", str(e) - ) - except Exception as e: # pylint: disable=broad-except - self._logger.error("_start_asyncio_receiver exception: %s", str(e)) - - def _start_threaded_receiver(self): - try: - while True: - if self._exit.is_set(): - self._logger.verbose("Exiting receiver thread...") - break - - message = self._pull_callback() - if message is None: - self._logger.verbose("No message received...") - continue - - if isinstance(message, str): - self._logger.verbose("Received control message...") - self._push_callback(message) - elif isinstance(message, bytes): - self._logger.verbose("Received audio data...") - self._push_callback(message) - self.add_audio_to_queue(message) - except Exception as e: # pylint: disable=broad-except - self._logger.notice("_start_threaded_receiver exception: %s", str(e)) - - def add_audio_to_queue(self, data: bytes) -> None: - """ - add_audio_to_queue - adds audio data to the Speaker queue - - Args: - data (bytes): The audio data to add to the queue - """ - self._queue.put(data) - - def finish(self) -> bool: - """ - finish - stops the Speaker stream - - Returns: - bool: True if the stream was stopped, False otherwise - """ - self._logger.debug("Speaker.finish ENTER") - - self._logger.notice("signal exit") - self._exit.set() - - if self._stream is not None: - self._logger.notice("stopping stream...") - self._stream.stop_stream() - self._stream.close() - self._logger.notice("stream stopped") - - if self._thread is not None: - self._logger.notice("joining _thread...") - self._thread.join() - self._logger.notice("thread stopped") - - if self._receiver_thread is not None: - self._logger.notice("stopping _receiver_thread...") - self._receiver_thread.join() - self._logger.notice("_receiver_thread joined") - - with self._queue.mutex: - self._queue.queue.clear() - - self._stream = None - self._thread = None - self._receiver_thread = None - - self._logger.notice("finish succeeded") - self._logger.debug("Speaker.finish LEAVE") - - return True - - def _play(self, audio_out, stream, stop): - """ - _play - plays audio data from the Speaker queue callback for portaudio - """ - while not stop.is_set(): - try: - if self._microphone is not None and self._microphone.is_muted(): - with self._lock_wait: - delta = datetime.now() - self._last_datagram - diff_in_ms = delta.total_seconds() * 1000 - if diff_in_ms > float(self._last_play_delta_in_ms): - self._logger.debug( - "LastPlay delta is greater than threshold. Unmute!" - ) - self._microphone.unmute() - - data = audio_out.get(True, TIMEOUT) - with self._lock_wait: - self._last_datagram = datetime.now() - if self._microphone is not None and not self._microphone.is_muted(): - self._logger.debug("New speaker sound detected. Mute!") - self._microphone.mute() - stream.write(data) - except queue.Empty: - pass - except Exception as e: # pylint: disable=broad-except - self._logger.error("_play exception: %s", str(e)) diff --git a/venv/Lib/site-packages/deepgram/billing.py b/venv/Lib/site-packages/deepgram/billing.py new file mode 100644 index 00000000..79bc0211 --- /dev/null +++ b/venv/Lib/site-packages/deepgram/billing.py @@ -0,0 +1,21 @@ +from ._types import Options, BalanceResponse, Balance +from ._utils import _request + + +class Billing: + _root = "/projects" + + def __init__(self, options: Options) -> None: + self.options = options + + async def list_balance(self, project_id: str) -> BalanceResponse: + """Returns a list of outstanding balances for the + specified project.""" + + return await _request(f'{self._root}/{project_id}/balances', self.options) + + + async def get_balance(self, project_id: str, balance_id: str) -> Balance: + """Returns a specific project based on the provided projectId.""" + + return await _request(f'{self._root}/{project_id}/balances/{balance_id}', self.options) \ No newline at end of file diff --git a/venv/Lib/site-packages/deepgram/client.py b/venv/Lib/site-packages/deepgram/client.py deleted file mode 100644 index 80c5d9c3..00000000 --- a/venv/Lib/site-packages/deepgram/client.py +++ /dev/null @@ -1,667 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import Optional -from importlib import import_module -import os -import logging -import deprecation # type: ignore - -from . import __version__ -from .utils import verboselogs - -# common -# pylint: disable=unused-import -from .clients import ( - TextSource, - BufferSource, - StreamSource, - FileSource, - UrlSource, -) -from .clients import BaseResponse -from .clients import ( - Average, - Intent, - Intents, - IntentsInfo, - Segment, - SentimentInfo, - Sentiment, - Sentiments, - SummaryInfo, - Topic, - Topics, - TopicsInfo, -) -from .clients import ( - ModelInfo, - Hit, - Search, -) -from .clients import ( - OpenResponse, - CloseResponse, - UnhandledResponse, - ErrorResponse, -) -from .clients import ( - DeepgramError, - DeepgramTypeError, - DeepgramModuleError, - DeepgramApiError, - DeepgramUnknownApiError, -) - -# listen client -from .clients import ListenRouter, ReadRouter, SpeakRouter, AgentRouter - -# speech-to-text -from .clients import LiveClient, AsyncLiveClient # backward compat -from .clients import ( - ListenWebSocketClient, - AsyncListenWebSocketClient, -) -from .clients import ( - ListenWebSocketOptions, - LiveOptions, - LiveTranscriptionEvents, -) - -# live client responses -from .clients import ( - #### top level - LiveResultResponse, - ListenWSMetadataResponse, - SpeechStartedResponse, - UtteranceEndResponse, - #### common websocket response - # OpenResponse, - # CloseResponse, - # ErrorResponse, - # UnhandledResponse, - #### unique - ListenWSMetadata, - ListenWSAlternative, - ListenWSChannel, - ListenWSWord, -) - -# prerecorded -from .clients import ( - # common - # UrlSource, - # BufferSource, - # StreamSource, - # TextSource, - # FileSource, - # unique - PreRecordedStreamSource, - PrerecordedSource, - ListenRestSource, -) - -from .clients import ( - PreRecordedClient, - AsyncPreRecordedClient, -) # backward compat -from .clients import ( - ListenRESTClient, - AsyncListenRESTClient, -) -from .clients import ( - ListenRESTOptions, - PrerecordedOptions, -) - -# rest client responses -from .clients import ( - #### top level - AsyncPrerecordedResponse, - PrerecordedResponse, - SyncPrerecordedResponse, - #### shared - # Average, - # Intent, - # Intents, - # IntentsInfo, - # Segment, - # SentimentInfo, - # Sentiment, - # Sentiments, - # SummaryInfo, - # Topic, - # Topics, - # TopicsInfo, - #### between rest and websocket - # ModelInfo, - # Alternative, - # Hit, - # Search, - # Channel, - # Word, - # unique - Entity, - ListenRESTMetadata, - Paragraph, - Paragraphs, - ListenRESTResults, - Sentence, - Summaries, - SummaryV1, - SummaryV2, - Translation, - Utterance, - Warning, - ListenRESTAlternative, - ListenRESTChannel, - ListenRESTWord, -) - -# read -from .clients import ReadClient, AsyncReadClient -from .clients import AnalyzeClient, AsyncAnalyzeClient -from .clients import ( - AnalyzeOptions, - AnalyzeStreamSource, - AnalyzeSource, -) - -# read client responses -from .clients import ( - #### top level - AsyncAnalyzeResponse, - SyncAnalyzeResponse, - AnalyzeResponse, - #### shared - # Average, - # Intent, - # Intents, - # IntentsInfo, - # Segment, - # SentimentInfo, - # Sentiment, - # Sentiments, - # SummaryInfo, - # Topic, - # Topics, - # TopicsInfo, - #### unique - AnalyzeMetadata, - AnalyzeResults, - AnalyzeSummary, -) - -# speak -## speak REST -from .clients import ( - #### top level - SpeakRESTOptions, - SpeakOptions, # backward compat - #### common - # TextSource, - # BufferSource, - # StreamSource, - # FileSource, - #### unique - SpeakSource, - SpeakRestSource, - SpeakRESTSource, -) - -from .clients import ( - SpeakClient, # backward compat - SpeakRESTClient, - AsyncSpeakRESTClient, -) - -from .clients import ( - SpeakResponse, # backward compat - SpeakRESTResponse, -) - -## speak WebSocket -from .clients import SpeakWebSocketEvents, SpeakWebSocketMessage - -from .clients import ( - SpeakWSOptions, -) - -from .clients import ( - SpeakWebSocketClient, - AsyncSpeakWebSocketClient, - SpeakWSClient, - AsyncSpeakWSClient, -) - -from .clients import ( - #### top level - SpeakWSMetadataResponse, - FlushedResponse, - ClearedResponse, - WarningResponse, - #### common websocket response - # OpenResponse, - # CloseResponse, - # UnhandledResponse, - # ErrorResponse, -) - -# auth client classes -from .clients import AuthRESTClient, AsyncAuthRESTClient - -# auth client responses -from .clients import ( - GrantTokenResponse, -) - -# manage client classes/input -from .clients import ManageClient, AsyncManageClient -from .clients import ( - ProjectOptions, - KeyOptions, - ScopeOptions, - InviteOptions, - UsageRequestOptions, - UsageSummaryOptions, - UsageFieldsOptions, -) - -# manage client responses -from .clients import ( - #### top level - Message, - ProjectsResponse, - ModelResponse, - ModelsResponse, - MembersResponse, - KeyResponse, - KeysResponse, - ScopesResponse, - InvitesResponse, - UsageRequest, - UsageResponse, - UsageRequestsResponse, - UsageSummaryResponse, - UsageFieldsResponse, - BalancesResponse, - #### shared - Project, - STTDetails, - TTSMetadata, - TTSDetails, - Member, - Key, - Invite, - Config, - STTUsageDetails, - Callback, - TokenDetail, - SpeechSegment, - TTSUsageDetails, - STTTokens, - TTSTokens, - UsageSummaryResults, - Resolution, - UsageModel, - Balance, -) - -# on-prem -from .clients import ( - OnPremClient, - AsyncOnPremClient, - SelfHostedClient, - AsyncSelfHostedClient, -) - - -# agent -from .clients import AgentWebSocketEvents - -# websocket -from .clients import ( - AgentWebSocketClient, - AsyncAgentWebSocketClient, -) - -from .clients import ( - #### common websocket response - # OpenResponse, - # CloseResponse, - # ErrorResponse, - # UnhandledResponse, - #### unique - WelcomeResponse, - SettingsAppliedResponse, - ConversationTextResponse, - UserStartedSpeakingResponse, - AgentThinkingResponse, - FunctionCallRequest, - AgentStartedSpeakingResponse, - AgentAudioDoneResponse, - InjectionRefusedResponse, -) - -from .clients import ( - # top level - SettingsOptions, - UpdatePromptOptions, - UpdateSpeakOptions, - InjectAgentMessageOptions, - FunctionCallResponse, - AgentKeepAlive, - # sub level - Listen, - Speak, - Header, - Item, - Properties, - Parameters, - Function, - Think, - Provider, - Agent, - Input, - Output, - Audio, - Endpoint, -) - - -# client errors and options -from .options import DeepgramClientOptions, ClientOptionsFromEnv -from .errors import DeepgramApiKeyError - -# pylint: enable=unused-import - - -class Deepgram: # pylint: disable=broad-exception-raised - """ - The Deepgram class is no longer a class in version 3 of this SDK. - """ - - def __init__(self, *anything): - raise Exception( - """ - FATAL ERROR: - You are attempting to instantiate a Deepgram object, which is no longer a class in version 3 of this SDK. - - To fix this issue: - 1. You need to revert to the previous version 2 of the SDK: pip install deepgram-sdk==2.12.0 - 2. or, update your application's code to use version 3 of this SDK. See the README for more information. - - Things to consider: - - - This Version 3 of the SDK requires Python 3.10 or higher. - Older versions (3.9 and lower) of Python are nearing end-of-life: https://devguide.python.org/versions/ - Understand the risks of using a version of Python nearing EOL. - - - Version 2 of the SDK will receive maintenance updates in the form of security fixes only. - No new features will be added to version 2 of the SDK. - """ - ) - - -class DeepgramClient: - """ - Represents a client for interacting with the Deepgram API. - - This class provides a client for making requests to the Deepgram API with various configuration options. - - Attributes: - api_key (str): The Deepgram API key used for authentication. - config_options (DeepgramClientOptions): An optional configuration object specifying client options. - - Raises: - DeepgramApiKeyError: If the API key is missing or invalid. - - Methods: - listen: Returns a ListenClient instance for interacting with Deepgram's transcription services. - - manage: (Preferred) Returns a Threaded ManageClient instance for managing Deepgram resources. - selfhosted: (Preferred) Returns an Threaded SelfHostedClient instance for interacting with Deepgram's on-premises API. - - asyncmanage: Returns an (Async) ManageClient instance for managing Deepgram resources. - asyncselfhosted: Returns an (Async) SelfHostedClient instance for interacting with Deepgram's on-premises API. - """ - - _config: DeepgramClientOptions - _logger: verboselogs.VerboseLogger - - def __init__( - self, - api_key: str = "", - config: Optional[DeepgramClientOptions] = None, - ): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - - if api_key == "" and config is not None: - self._logger.info("Attempting to set API key from config object") - api_key = config.api_key - if api_key == "": - self._logger.info("Attempting to set API key from environment variable") - api_key = os.getenv("DEEPGRAM_API_KEY", "") - if api_key == "": - self._logger.warning("WARNING: API key is missing") - - self.api_key = api_key - if config is None: # Use default configuration - self._config = DeepgramClientOptions(self.api_key) - else: - config.set_apikey(self.api_key) - self._config = config - - @property - def listen(self): - """ - Returns a Listen dot-notation router for interacting with Deepgram's transcription services. - """ - return ListenRouter(self._config) - - @property - def read(self): - """ - Returns a Read dot-notation router for interacting with Deepgram's read services. - """ - return ReadRouter(self._config) - - @property - def speak(self): - """ - Returns a Speak dot-notation router for interacting with Deepgram's speak services. - """ - return SpeakRouter(self._config) - - @property - @deprecation.deprecated( - deprecated_in="3.4.0", - removed_in="4.0.0", - current_version=__version__, - details="deepgram.asyncspeak is deprecated. Use deepgram.speak.asyncrest instead.", - ) - def asyncspeak(self): - """ - DEPRECATED: deepgram.asyncspeak is deprecated. Use deepgram.speak.asyncrest instead. - """ - return self.Version(self._config, "asyncspeak") - - @property - def manage(self): - """ - Returns a ManageClient instance for managing Deepgram resources. - """ - return self.Version(self._config, "manage") - - @property - def asyncmanage(self): - """ - Returns an AsyncManageClient instance for managing Deepgram resources. - """ - return self.Version(self._config, "asyncmanage") - - @property - def auth(self): - """ - Returns an AuthRESTClient instance for managing short-lived tokens. - """ - return self.Version(self._config, "auth") - - @property - def asyncauth(self): - """ - Returns an AsyncAuthRESTClient instance for managing short-lived tokens. - """ - return self.Version(self._config, "asyncauth") - - @property - @deprecation.deprecated( - deprecated_in="3.4.0", - removed_in="4.0.0", - current_version=__version__, - details="deepgram.onprem is deprecated. Use deepgram.speak.selfhosted instead.", - ) - def onprem(self): - """ - DEPRECATED: deepgram.onprem is deprecated. Use deepgram.speak.selfhosted instead. - """ - return self.Version(self._config, "selfhosted") - - @property - def selfhosted(self): - """ - Returns an SelfHostedClient instance for interacting with Deepgram's on-premises API. - """ - return self.Version(self._config, "selfhosted") - - @property - @deprecation.deprecated( - deprecated_in="3.4.0", - removed_in="4.0.0", - current_version=__version__, - details="deepgram.asynconprem is deprecated. Use deepgram.speak.asyncselfhosted instead.", - ) - def asynconprem(self): - """ - DEPRECATED: deepgram.asynconprem is deprecated. Use deepgram.speak.asyncselfhosted instead. - """ - return self.Version(self._config, "asyncselfhosted") - - @property - def asyncselfhosted(self): - """ - Returns an AsyncSelfHostedClient instance for interacting with Deepgram's on-premises API. - """ - return self.Version(self._config, "asyncselfhosted") - - @property - def agent(self): - """ - Returns a Agent dot-notation router for interacting with Deepgram's speak services. - """ - return AgentRouter(self._config) - - # INTERNAL CLASSES - class Version: - """ - Represents a version of the Deepgram API. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _parent: str - - def __init__(self, config, parent: str): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - - self._config = config - self._parent = parent - - # FUTURE VERSIONING: - # When v2 or v1.1beta1 or etc. This allows easy access to the latest version of the API. - # @property - # def latest(self): - # match self._parent: - # case "manage": - # return ManageClient(self._config) - # case "selfhosted": - # return SelfHostedClient(self._config) - # case _: - # raise DeepgramModuleError("Invalid parent") - - def v(self, version: str = ""): - # pylint: disable-msg=too-many-statements - """ - Returns a client for the specified version of the API. - """ - self._logger.debug("Version.v ENTER") - self._logger.info("version: %s", version) - if len(version) == 0: - self._logger.error("version is empty") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Invalid module version") - - parent = "" - filename = "" - classname = "" - match self._parent: - case "manage": - parent = "manage" - filename = "client" - classname = "ManageClient" - case "asyncmanage": - parent = "manage" - filename = "async_client" - classname = "AsyncManageClient" - case "asyncspeak": - return AsyncSpeakRESTClient(self._config) - case "selfhosted": - parent = "selfhosted" - filename = "client" - classname = "SelfHostedClient" - case "asyncselfhosted": - parent = "selfhosted" - filename = "async_client" - classname = "AsyncSelfHostedClient" - case "auth": - parent = "auth" - filename = "client" - classname = "AuthRESTClient" - case "asyncauth": - parent = "auth" - filename = "async_client" - classname = "AsyncAuthRESTClient" - case _: - self._logger.error("parent unknown: %s", self._parent) - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Invalid parent type") - - # create class path - path = f"deepgram.clients.{parent}.v{version}.{filename}" - self._logger.info("path: %s", path) - self._logger.info("classname: %s", classname) - - # import class - mod = import_module(path) - if mod is None: - self._logger.error("module path is None") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Unable to find package") - - my_class = getattr(mod, classname) - if my_class is None: - self._logger.error("my_class is None") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Unable to find class") - - # instantiate class - my_class_instance = my_class(self._config) - self._logger.notice("Version.v succeeded") - self._logger.debug("Version.v LEAVE") - return my_class_instance - - # pylint: enable-msg=too-many-statements diff --git a/venv/Lib/site-packages/deepgram/clients/__init__.py b/venv/Lib/site-packages/deepgram/clients/__init__.py deleted file mode 100644 index c1bb5c5c..00000000 --- a/venv/Lib/site-packages/deepgram/clients/__init__.py +++ /dev/null @@ -1,379 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -# common -from .common import ( - TextSource, - BufferSource, - StreamSource, - FileSource, - UrlSource, -) -from .common import BaseResponse - -# common (shared between analze and prerecorded) -from .common import ( - Average, - Intent, - Intents, - IntentsInfo, - Segment, - SentimentInfo, - Sentiment, - Sentiments, - SummaryInfo, - Topic, - Topics, - TopicsInfo, -) - -# common (shared between listen rest and websocket) -from .common import ( - ModelInfo, - Hit, - Search, -) -from .common import ( - OpenResponse, - CloseResponse, - UnhandledResponse, - ErrorResponse, -) -from .common import ( - DeepgramError, - DeepgramTypeError, - DeepgramApiError, - DeepgramUnknownApiError, -) -from .errors import DeepgramModuleError - -from .listen_router import ListenRouter -from .read_router import ReadRouter -from .speak_router import SpeakRouter -from .agent_router import AgentRouter - -# listen -from .listen import LiveTranscriptionEvents - -## backward compat -from .prerecorded import ( - PreRecordedClient, - AsyncPreRecordedClient, -) -from .live import ( - LiveClient, - AsyncLiveClient, -) - -# speech-to-text rest -from .listen import ListenRESTClient, AsyncListenRESTClient - -## input -from .listen import ( - # common - # UrlSource, - # BufferSource, - # StreamSource, - # TextSource, - # FileSource, - # unique - PreRecordedStreamSource, - PrerecordedSource, - ListenRestSource, -) - -from .listen import ( - ListenRESTOptions, - PrerecordedOptions, -) - -## output -from .listen import ( - #### top level - AsyncPrerecordedResponse, - PrerecordedResponse, - SyncPrerecordedResponse, - #### shared - # Average, - # Intent, - # Intents, - # IntentsInfo, - # Segment, - # SentimentInfo, - # Sentiment, - # Sentiments, - # SummaryInfo, - # Topic, - # Topics, - # TopicsInfo, - #### between rest and websocket - # ModelInfo, - # Alternative, - # Hit, - # Search, - # Channel, - # Word, - # unique - Entity, - ListenRESTMetadata, - Paragraph, - Paragraphs, - ListenRESTResults, - Sentence, - Summaries, - SummaryV1, - SummaryV2, - Translation, - Utterance, - Warning, - ListenRESTAlternative, - ListenRESTChannel, - ListenRESTWord, -) - - -# speech-to-text websocket -from .listen import ListenWebSocketClient, AsyncListenWebSocketClient - -## input -from .listen import ( - ListenWebSocketOptions, - LiveOptions, -) - -## output -from .listen import ( - #### top level - LiveResultResponse, - ListenWSMetadataResponse, - SpeechStartedResponse, - UtteranceEndResponse, - #### common websocket response - # OpenResponse, - # CloseResponse, - # ErrorResponse, - # UnhandledResponse, - #### uniqye - ListenWSMetadata, - ListenWSWord, - ListenWSAlternative, - ListenWSChannel, -) - -## clients -from .listen import ( - ListenWebSocketClient, - AsyncListenWebSocketClient, -) - - -# read/analyze -from .analyze import ReadClient, AsyncReadClient -from .analyze import AnalyzeClient, AsyncAnalyzeClient -from .analyze import AnalyzeOptions -from .analyze import ( - # common - # UrlSource, - # TextSource, - # BufferSource, - # StreamSource, - # FileSource - # unique - AnalyzeStreamSource, - AnalyzeSource, -) -from .analyze import ( - #### top level - AsyncAnalyzeResponse, - SyncAnalyzeResponse, - AnalyzeResponse, - #### shared between analyze and pre-recorded - # Average, - # Intent, - # Intents, - # IntentsInfo, - # Segment, - # SentimentInfo, - # Sentiment, - # Sentiments, - # SummaryInfo, - # Topic, - # Topics, - # TopicsInfo, - #### unique - AnalyzeMetadata, - AnalyzeResults, - AnalyzeSummary, -) - -# text-to-speech -## text-to-speech REST -from .speak import ( - #### top level - SpeakRESTOptions, - SpeakOptions, - # common - # TextSource, - # BufferSource, - # StreamSource, - # FileSource, - # unique - SpeakSource, - SpeakRestSource, - SpeakRESTSource, -) - -from .speak import ( - SpeakClient, # backward compat - SpeakRESTClient, - AsyncSpeakRESTClient, -) - -from .speak import ( - SpeakResponse, # backward compat - SpeakRESTResponse, -) - -## text-to-speech WebSocket -from .speak import SpeakWebSocketEvents, SpeakWebSocketMessage - -from .speak import ( - SpeakWSOptions, -) - -from .speak import ( - SpeakWebSocketClient, - AsyncSpeakWebSocketClient, - SpeakWSClient, - AsyncSpeakWSClient, -) - -from .speak import ( - #### top level - SpeakWSMetadataResponse, - FlushedResponse, - ClearedResponse, - WarningResponse, - #### common websocket response - # OpenResponse, - # CloseResponse, - # UnhandledResponse, - # ErrorResponse, -) - -# manage -from .manage import ManageClient, AsyncManageClient -from .manage import ( - ProjectOptions, - KeyOptions, - ScopeOptions, - InviteOptions, - UsageRequestOptions, - UsageSummaryOptions, - UsageFieldsOptions, -) -from .manage import ( - #### top level - Message, - ProjectsResponse, - ModelResponse, - ModelsResponse, - MembersResponse, - KeyResponse, - KeysResponse, - ScopesResponse, - InvitesResponse, - UsageRequest, - UsageResponse, - UsageRequestsResponse, - UsageSummaryResponse, - UsageFieldsResponse, - BalancesResponse, - #### shared - Project, - STTDetails, - TTSMetadata, - TTSDetails, - Member, - Key, - Invite, - Config, - STTUsageDetails, - Callback, - TokenDetail, - SpeechSegment, - TTSUsageDetails, - STTTokens, - TTSTokens, - UsageSummaryResults, - Resolution, - UsageModel, - Balance, -) - -# auth -from .auth import AuthRESTClient, AsyncAuthRESTClient -from .auth import ( - GrantTokenResponse, -) - -# selfhosted -from .selfhosted import ( - OnPremClient, - AsyncOnPremClient, - SelfHostedClient, - AsyncSelfHostedClient, -) - -# agent -from .agent import AgentWebSocketEvents - -# websocket -from .agent import ( - AgentWebSocketClient, - AsyncAgentWebSocketClient, -) - -from .agent import ( - #### common websocket response - # OpenResponse, - # CloseResponse, - # ErrorResponse, - # UnhandledResponse, - #### unique - WelcomeResponse, - SettingsAppliedResponse, - ConversationTextResponse, - UserStartedSpeakingResponse, - AgentThinkingResponse, - FunctionCallRequest, - AgentStartedSpeakingResponse, - AgentAudioDoneResponse, - InjectionRefusedResponse, -) - -from .agent import ( - # top level - SettingsOptions, - UpdatePromptOptions, - UpdateSpeakOptions, - InjectAgentMessageOptions, - FunctionCallResponse, - AgentKeepAlive, - # sub level - Listen, - Speak, - Header, - Item, - Properties, - Parameters, - Function, - Think, - Provider, - Agent, - Input, - Output, - Audio, - Endpoint, -) diff --git a/venv/Lib/site-packages/deepgram/clients/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index beb885d95a110895934a48651ecbd7f9d9a01436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6004 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 aaXJz8Ix!_Xv9yIl{}KOT&HO7(&3^%6INB@# diff --git a/venv/Lib/site-packages/deepgram/clients/__pycache__/agent_router.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/__pycache__/agent_router.cpython-312.pyc deleted file mode 100644 index 089f79e48ae5a8d4512d0250669e791fea3aedf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5817 zcmd@YOKcm*b(h~IwUQ`_5+%#BRiHr0A`n*ac9C6aY5fDx#R8x7vWgO#++d!?iM3?9@-3y5l_Yz^gbhl zAgedZiBuA6(L_>8$I;X?vIxKpO9;;-RTNLosW5DxKqxhb#l(1AMvC@MN|Td{`iwOe zw^_62D3VhcCvlA6w@QVVEI?Km#6(z$iP$a!PZ2wEEKn&}i;Wh!B-?T5A~*Exq$fF$ zd)6j7Z#g0y@<^^*%tLca#0z70)wrP!*L=nsY|tCV=79bS$+U*BcpI4Y3Q#Vf6h$b+Pt96Bf(-;7&|{1^3wg6=4BQ3iK;53aB@kOPz|Dl zxJYndbTy4sI7LhT0F`mTl8EJG8jvNGS$QsvMIvY+X~^3=ZA{a!JOdo4BlL8_fw4Yn zE)<3=BDdXFa6}lhkcsiyGiDZ0OcT@;ipjGXLaix??T23wWwrWX>!7ie{5Hzas~-_2 zXDNFiAYl<@1Q1R_R#k$N3Ux`0%aX~=Ii$@er7BJ^5~UGg=sZTV2xBA#;dZn%RzRYP zaA}@QBMJBr5G6swqN2vIOob|_2rtPoq=qW86xECp zGsvhqdT5M*gFo5Hx;qMwZ4P1R7`Lgrj5cOIT&nHlDcRxM{1&PeMk7ytb*|3%J|6iWzZFM`t8ZdOVblbUDT4P z>7^v-4z(%MOGsIo4$Cvss;r^?DKWMv&LMSLGA-u;<2k7Z0IFzFOifTImC=E4S&_A9 zH0!T2P9Y20M~DbRb%S{l=wA;UECddI*;x#XEIU5r%N&1)zs;|6y#=oKbN9M1To8tf z!jTepv@+FG;CfbPKUF?fO5FZ(pl8|f5x)uem{>)3U{KMk5g4qH8?2rs%b@_Yj+RNR zY6=&hDs|)b?E=vYrU!2ja@_8!0xA=DATr zUa+K6ER(bOTLAr7|BpC`1ROLHa3T&O0T)C99?2`Y>4>}KjCeDiV8e^HYU)kJ$c|PC zy2{zZyC-@hBn^*cxr*(&MlA|eEwIfg5ySh{T}B(TSR=ev-Vg%<{eQE~IU88&N+6eE zFtPT*25PG@vGKTtRKz%Ah;efI~y2z?eR@jokf_tAZ%`6x^kocau+JKNkdaj1mS%_&d@YDQsD zTNbL7#+(ErN?sup>OPI`wt9hhy_zD~auwstGMd|(2B?WmvM&ySOvk`J_k@!Cy;obl{iW*{Ly$)&QmTb&nXcnj&>tyM8Q{IX8q>UD-)534N?m39rng zO^ylwlRG2(v(2Vs3@r(#rY@bjkR=&EF=r#f9u<=)FYB|gLH>pkDJ@gIDST?|-Ba0) zNrfhJg7N#nI$t*;E=XW#F0C7ZZB6)x``{3rr{P7^T-ZgEta_nOw$*UBLRwi=lGiAi z**5EVb56^oP`1;GxI<>d9TG{z9a?(9hO%5r)aD6`*(RE=)0}~h+e{Y70+O*#B^8wI zxU7gXaYXX2;Wu{`_+9zlgTymh zuC%AX_pBz?-YfCLPnuir9{C`*di8J3LfPkE;qUS5zW#!*KfimpiVi7-xgk;*v{a>+CYgvunm^q6?)_?@uT0lm^R_Q zqu9Detp6jhYgN5}wir0D{8qU+kZ1!f=T{Tme;GV_Wy~J2bAD3bHr|mkw%5OtkKen*Ro) zQJs%QucpPgk!M3J9F>wWNVth3q9LB%9F2+!Xej+{rNR`6hjhCN+Dk$?^eFD{}kFErUgFu-xMRfZuR9J^gFH*kqu2 z-v4vY&ee@Pa{HyjQpypcnj473|O z<7#?tb2yJ|+M%~WdKK953hemzO<~r#^IL}0#=+#cpjY=8ziH$03^fWgc-Eb1O^&OS zFWqharZXh&qLxH8ObI3XB;eU%z7i8}Jz_ diff --git a/venv/Lib/site-packages/deepgram/clients/__pycache__/errors.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index c98cd1065fcb2a04ee82c0cada962382ad2e0ec8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 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 diff --git a/venv/Lib/site-packages/deepgram/clients/__pycache__/read_router.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/__pycache__/read_router.cpython-312.pyc deleted file mode 100644 index a57b62171cfd78def97b6dda7dcd3162437c2624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5777 zcmd@YO>Y~=b(fz@YAI0?CEAu{tz<_wotSo8E3xD>jcVDB97YNJkpzNJV#OUvE0arR zcFB}14H$t7$Vh_3Cpid;I6#2d@FfLua8LaKy^tjV5gP|6koJ(99Hj{0Q{S82r6`7O zo76dVfSr#wGjHB|^X7f*UqYcE2POZaokrpaEiz7Y`p@Vbxz?FKFwwLd7j6< zEA5(hDQ?A+c4s{E9)P(OZ`zyj&HJG5Q~YUvMwl0P&c&VO6yX}D1n#;ljPrq_D;E43 z2Ql6ZshM1s8p%vn$*0NO*SHA4T?IlHvpPvi>j33!@!6VED>g0t9aiBEAo3ti%eo*R3L zhxnIViuamlULXO*ca6JiZcF*F492?5;CUh|=d*c(Q29FW8kC@%Cpk)V z;7gZeDaAOHmar$to?JP`IBd>Ch{bED=hH5`)_@@>Bzf zYSP6OoF)qJA*YKaVzCGJq#Lr9BAqYIA@QIN7a%K=L1j%(QI!c*(g`i7DWb=lvXu3r zma@obIr`8vf@43~$)-OEZ*7@S=vcRD`m8o(zgwp4_>$c4ZG8jPI%nVuWM#E=l?^kT zcgNke*Oj>>?q;RTt@@n)cDowb?mIoB%jvC(PH($)UZHaa&piTj&-NatSLRp4PJg>? z!Ndc_O^S-#9eyqrq+VERhF-NSRKk*)kW6ZFh9r{|i8X_=qP!q$N*V=OEonI22HJ+g26i8U+XL`hXT+J zI;QZBU%3F1D=jvkQOn!;Uta6?->2!9t=E6YW%@x0bTET40Kz4aij+YQxKZZpV*Bkz^3mv7E|l=vWVJ67vCUJ;JdJuv$d32C{bkkGz7W=V<6 zmf1YhVc>|4Am=R-8ijEw+A1NW!`>3d#ht|zuk}n;gh@+Gu&h}e`?B>L0R32BPXzG# z9_IDEL;$bv1Fs)Yf{LGwglpdUU@;Kudf0lmwl0)TwuraIvBMijRgtomcXHf<<;T&9 zVqw;UX%pDtoJ`?mn?9>eIh-M@%@@OgEdSr^aM=Y`xf!z+If|A&*2U~HMSD(ru|h*k zA*|(SKUNW}2Cy2$3Qa9N09DM*o-H%C^a%jyC}_M3_JmRWN<%FQYF~5HM*a%7T!0E} z26hTltEPi%<$tK$Ao&Tbr-tR9%G9XMGRpKVT!R>jd< zP?)E* zx;yGsbZ~7&ah02vmgfw=GYwE1o8rEF2t+y!cG{V2X*>CK#pCRKBqg2b_ipdnjtmr^ z1AU8E{8wD?x#9BwH63Dx-|~vUsD%tg5ny!yRtK+mwAYm`2KO_l2+$BfUkaf2Y2n7{ zcI2wN^O=sHdJMewwD1}(yFTQU-ZBq$U)lX3_XpnTB;_34x%FHNbmj-7wmbXdPj{@g>(~7Ym zS7B+h8QKxS&{4o{T2V;SUeU)AsU6EoeU^un^4euB`z9l-)bAW<&l$xWDfK$xbleW7 z<0V(T@Q{y}gq&=wAV;NcmWi`$fQ|cYig5wvqH|e|lm;(p@?x4`CcdOXCD86DR7C$@_bbRN|*mA)T)%Y7Q|o(T?Np zC)+^ntp7c_@1}n1TrGNZ?S)29w9+%uw&CB2@A=x`bR|6fz{l+ZGCmbQ7HiQXfXBI@ zk*YXSktXWm(@jvzHTDm!z09JRxfoAlaOt3>Xpqfd(*Ea{Oqyac`9@w&TM0A-zDXsU zf=n9S4vXi^o@7$iKtb96C>^FS`Z3))C@;om6!XSA96QH~+V&xIKU7b{r=Ni8_uK=Q zD%RyryMSOFy zkQG>-gaO6mfc_GzCYkg(93p9qDpP>JaXCVbBFh7rF`|sH=Wz)pcowl3%2KRY#=ig^ zB(~ctY)V}B?v2oRH8fuHj5k7KHP6_l$K!=Ja(s(}c2neh-49$I@5GiHdYjm5!ls(A zsqeZIym#+69M;yscw8)K2CUz&X?2m=1Qscq-n^lvb;g(JxBtIc68AAfqFa`Pk^Ma2 z*=FUT@T_I+o}*`A0wV!^4602x&-4Eba{PfWxbA;&BVTe)e#ssD&X?zTpbBe-<6qk6 B2`K;o diff --git a/venv/Lib/site-packages/deepgram/clients/__pycache__/speak_router.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/__pycache__/speak_router.cpython-312.pyc deleted file mode 100644 index 262d1dba49f403f35b62d80f841db8d38f2dc7ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7503 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 diff --git a/venv/Lib/site-packages/deepgram/clients/agent/__init__.py b/venv/Lib/site-packages/deepgram/clients/agent/__init__.py deleted file mode 100644 index befd2ef8..00000000 --- a/venv/Lib/site-packages/deepgram/clients/agent/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .enums import AgentWebSocketEvents - -# websocket -from .client import ( - AgentWebSocketClient, - AsyncAgentWebSocketClient, -) - -from .client import ( - #### common websocket response - OpenResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, - #### unique - WelcomeResponse, - SettingsAppliedResponse, - ConversationTextResponse, - UserStartedSpeakingResponse, - AgentThinkingResponse, - FunctionCallRequest, - AgentStartedSpeakingResponse, - AgentAudioDoneResponse, - InjectionRefusedResponse, -) - -from .client import ( - # top level - SettingsOptions, - UpdatePromptOptions, - UpdateSpeakOptions, - InjectAgentMessageOptions, - FunctionCallResponse, - AgentKeepAlive, - # sub level - Listen, - Speak, - Header, - Item, - Properties, - Parameters, - Function, - Think, - Provider, - Agent, - Input, - Output, - Audio, - Endpoint, -) diff --git a/venv/Lib/site-packages/deepgram/clients/agent/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/agent/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 2c93d451bb0a8661fdc35a709836275762993d3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1225 zcmZ{jOK;Oa5XbE#cGI+J+9qw1zMqI7pm&6jqEH~>QPhW!Mv*EL53Q+ZZM^GT;>3HK+n4n3Rq%xFg3Z|$6 z6`F==nt_=tw_tK-VV0^;r5e;|4(4bc=BW;KYCwaU(4+-ephZ}uC0L?mSf&+Np;cI= zHCUr{Sf>rxpiS7ME!d)M*tV^6r{#XJP3tXN*V-p2)C+uh5cSVc?GB75Te-jWP8gVg zZnovQ=wD5_2(`+3axX@)k1~#gL|yKLk;IX^nCPO9Q&0FI`j=AW1%~~IMk)0J zR4NcBvK_}}`_alqClUipq^E*N9O7GbS!3}?VsfCoM4^8WqjzS~FN1Sg--oAxxFS~{ zq@vH2I$jv=HR*O=AX$5*KwwcM)d%J6IUV%|*Z z>QU@_3ZEwt#cC+dUWi%mL#=sHHQVzkO6i^8FjTwR`=8NIWlJ9;#_cc|pmv`GQlZdJ zR#v-@(DO0Tg|0%yq)`5nl`Y8_>oy# Ob=LmHch-^{rpj-~HFn4V diff --git a/venv/Lib/site-packages/deepgram/clients/agent/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/agent/__pycache__/client.cpython-312.pyc deleted file mode 100644 index 85705b20fb7eebb9ab028f19696c9aa4752c8b7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2328 zcmZ`)%TgOh6m1D4gwO-Mkc0%7r!8Z^_-%}hg}^`=hmd&rEtos(7cY z^8xvWEb|@NXgM`2shwS;YFh}QMfiA)ly$QEy32xJ6xI{mD(%P19;0E%%Bfz~G&`BTGFMTR7BXEjWL0^GzZtz4g%cgwu^}-7 z>&F^O=l1j-nQ?aU?o3uL!KqhGrN$#wq(jo-TzzJ&w_fe`NvxW~0q*mBYKtpE8sM~#sNfZtHY^_i? zv=wlU%nI4UmdqyxocLDYK+&3p6+CJh{6FBFhZWjY>Y6Gm#t)?f%imgOL$*tCB+HwH*t32(JU#2q#iv#w9bdkcYYCOE$`xteA7nqKv;q zRz|Q_+{(r{Hzm04RbMeKi*U`fo6!IdGy9n%)~uVtU^}xI*A;}$IoGSsW^t~_3q|)f zJtk-4oS*YV7~pr7;KHIuc+L7O$tCXA22}w|aglp|-7|8n%+j25ll@L*ungyOB8Tfm z!X`NFnrL9Xuq;=(Uc7uFqI6h}3(}sQ_Ns{GITaCE#Yd zTqJL{yVT=Q|^$WnSa|!+24w|7l!Cch-?gl%Cg>lvA16BZgxhZ z?n#FheAKP}7fKJMe@72BsE1{)J@w||=8{uqo@5B6d-!TTGw;25@6Bj_D;9G^e#2jP zPJht}`BTB|mzoc5R^;GE;t)sk$Uvi-MiOL)IEn9xlLYPO8UF9lsqqb5dJuuM4*m$*T0Gi8HiyOA(8^>ToV1qjX$9NM31N7Sh2u~twpgb_H z&|ik&i`1qUFc8^|q2mTy7PmzD2s}F&fGGEXbJss%8)4|V;E2j*;Ey0;7Iy>x0KVm- ze#ju|aVz5B^g^)Cq`4?!Y6qvTk68b5=-bL;)AGF6@OB7{&ny0~X9+!LsRTZV)OHjF zk;oqUrU6a)&NXX-q$A}gawC_{ViZ;JP7-vz_kI(?#nwd>OXgn`^@F=X=vGJvJ0&5%&)<^El*Tl zvUNG@^L3DyjID*|k$MMERL<;oDL;_E6NyyjI!CJQ@z%w?sosjKo$>a?o5pze zf=zWJt}l&uE_zdaDgNl;_~k^79>z;+S9)V&PxZBU`N@^uzN}C6C-I#J;}?_1Q~kk* zlg864y>ls}KaCex$NQ7bslNJu`&=)O=JNQf3mNoo+*uhvpGcpTxP5=TH<8ir$9ErH z>8;D;RDbm0_OqCO=&O-&Tj72;DN>fIJW_Aftn_6yLX(f>=zZqd>=t|x-IFLEGQ!k> aTqiY6dzT~H;y<}X?UT#T-VynOe*XgB;D7c2 diff --git a/venv/Lib/site-packages/deepgram/clients/agent/client.py b/venv/Lib/site-packages/deepgram/clients/agent/client.py deleted file mode 100644 index e7c8eba9..00000000 --- a/venv/Lib/site-packages/deepgram/clients/agent/client.py +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -# websocket -from .v1 import ( - AgentWebSocketClient as LatestAgentWebSocketClient, - AsyncAgentWebSocketClient as LatestAsyncAgentWebSocketClient, -) - -from .v1 import ( - #### common websocket response - BaseResponse as LatestBaseResponse, - OpenResponse as LatestOpenResponse, - CloseResponse as LatestCloseResponse, - ErrorResponse as LatestErrorResponse, - UnhandledResponse as LatestUnhandledResponse, - #### unique - WelcomeResponse as LatestWelcomeResponse, - SettingsAppliedResponse as LatestSettingsAppliedResponse, - ConversationTextResponse as LatestConversationTextResponse, - UserStartedSpeakingResponse as LatestUserStartedSpeakingResponse, - AgentThinkingResponse as LatestAgentThinkingResponse, - FunctionCallRequest as LatestFunctionCallRequest, - AgentStartedSpeakingResponse as LatestAgentStartedSpeakingResponse, - AgentAudioDoneResponse as LatestAgentAudioDoneResponse, - InjectionRefusedResponse as LatestInjectionRefusedResponse, -) - -from .v1 import ( - # top level - SettingsOptions as LatestSettingsOptions, - UpdatePromptOptions as LatestUpdatePromptOptions, - UpdateSpeakOptions as LatestUpdateSpeakOptions, - InjectAgentMessageOptions as LatestInjectAgentMessageOptions, - FunctionCallResponse as LatestFunctionCallResponse, - AgentKeepAlive as LatestAgentKeepAlive, - # sub level - Listen as LatestListen, - Speak as LatestSpeak, - Header as LatestHeader, - Item as LatestItem, - Properties as LatestProperties, - Parameters as LatestParameters, - Function as LatestFunction, - Think as LatestThink, - Provider as LatestProvider, - Agent as LatestAgent, - Input as LatestInput, - Output as LatestOutput, - Audio as LatestAudio, - Endpoint as LatestEndpoint, -) - - -# The vX/client.py points to the current supported version in the SDK. -# Older versions are supported in the SDK for backwards compatibility. - -AgentWebSocketClient = LatestAgentWebSocketClient -AsyncAgentWebSocketClient = LatestAsyncAgentWebSocketClient - -OpenResponse = LatestOpenResponse -CloseResponse = LatestCloseResponse -ErrorResponse = LatestErrorResponse -UnhandledResponse = LatestUnhandledResponse - -WelcomeResponse = LatestWelcomeResponse -SettingsAppliedResponse = LatestSettingsAppliedResponse -ConversationTextResponse = LatestConversationTextResponse -UserStartedSpeakingResponse = LatestUserStartedSpeakingResponse -AgentThinkingResponse = LatestAgentThinkingResponse -FunctionCallRequest = LatestFunctionCallRequest -AgentStartedSpeakingResponse = LatestAgentStartedSpeakingResponse -AgentAudioDoneResponse = LatestAgentAudioDoneResponse -InjectionRefusedResponse = LatestInjectionRefusedResponse - - -SettingsOptions = LatestSettingsOptions -UpdatePromptOptions = LatestUpdatePromptOptions -UpdateSpeakOptions = LatestUpdateSpeakOptions -InjectAgentMessageOptions = LatestInjectAgentMessageOptions -FunctionCallResponse = LatestFunctionCallResponse -AgentKeepAlive = LatestAgentKeepAlive - -Listen = LatestListen -Speak = LatestSpeak -Header = LatestHeader -Item = LatestItem -Properties = LatestProperties -Parameters = LatestParameters -Function = LatestFunction -Think = LatestThink -Provider = LatestProvider -Agent = LatestAgent -Input = LatestInput -Output = LatestOutput -Audio = LatestAudio -Endpoint = LatestEndpoint \ No newline at end of file diff --git a/venv/Lib/site-packages/deepgram/clients/agent/enums.py b/venv/Lib/site-packages/deepgram/clients/agent/enums.py deleted file mode 100644 index e0928dd2..00000000 --- a/venv/Lib/site-packages/deepgram/clients/agent/enums.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from aenum import StrEnum - -# Constants mapping to events from the Deepgram API - - -class AgentWebSocketEvents(StrEnum): - """ - Enumerates the possible Agent API events that can be received from the Deepgram API - """ - - # server - Open: str = "Open" - Close: str = "Close" - AudioData: str = "AudioData" - Welcome: str = "Welcome" - SettingsApplied: str = "SettingsApplied" - ConversationText: str = "ConversationText" - UserStartedSpeaking: str = "UserStartedSpeaking" - AgentThinking: str = "AgentThinking" - FunctionCallRequest: str = "FunctionCallRequest" - AgentStartedSpeaking: str = "AgentStartedSpeaking" - AgentAudioDone: str = "AgentAudioDone" - Error: str = "Error" - Unhandled: str = "Unhandled" - - # client - Settings: str = "Settings" - UpdatePrompt: str = "UpdatePrompt" - UpdateSpeak: str = "UpdateSpeak" - InjectAgentMessage: str = "InjectAgentMessage" - InjectionRefused: str = "InjectionRefused" - AgentKeepAlive: str = "AgentKeepAlive" diff --git a/venv/Lib/site-packages/deepgram/clients/agent/v1/__init__.py b/venv/Lib/site-packages/deepgram/clients/agent/v1/__init__.py deleted file mode 100644 index cd115c9f..00000000 --- a/venv/Lib/site-packages/deepgram/clients/agent/v1/__init__.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -# common websocket -from ...common import ( - OpenResponse, - CloseResponse, - UnhandledResponse, - ErrorResponse, -) - -# websocket -from .websocket import AgentWebSocketClient, AsyncAgentWebSocketClient - -from .websocket import ( - #### common websocket response - BaseResponse, - OpenResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, - #### unique - WelcomeResponse, - SettingsAppliedResponse, - ConversationTextResponse, - UserStartedSpeakingResponse, - AgentThinkingResponse, - FunctionCallRequest, - AgentStartedSpeakingResponse, - AgentAudioDoneResponse, - InjectionRefusedResponse, -) - -from .websocket import ( - # top level - SettingsOptions, - UpdatePromptOptions, - UpdateSpeakOptions, - InjectAgentMessageOptions, - FunctionCallResponse, - AgentKeepAlive, - # sub level - Listen, - Speak, - Header, - Item, - Properties, - Parameters, - Function, - Think, - Provider, - Agent, - Input, - Output, - Audio, - Endpoint, -) diff --git a/venv/Lib/site-packages/deepgram/clients/agent/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/agent/v1/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index fddc82a9af09edc6d20c39e9fb84378eea72b072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1271 zcmZ{jOK;mo5XVVLlx15F%aSe0?{^>+snKf@6i}7K6_Un*9|$l|VbJ2#X3SZ#+?5)C zl75CB`vrRHt>0j;J>^!w0Sx5SolRubNW#O9JF~Mhf6j3KE|q2+^9=tuxcoEcIRCIQ zeli~yH-DMMZ%*I@Zsd>)E@dD?S;$fja;_6(f^6hb9`ZB=Q`XKIy8wl|SQBUCr(v3A zV1{O4mWoiM5|pS6WvW1h=3tJhP_^ehbABG?sRlKwL!B02ffiwr8qlC7G^qtGT7o57 zhGklT6oJr$R}2qFybT%{*z8mD9Pt;<<5y56}!pQ+Zyi^1o% z+GSn*-k(%TSxsu%?xcB!XP_&uFdD=(k<&Ovr9yEbJ4s?HOhh%iu^3@0eHF&y1mCE! zKD~S@F+Em(sxUZC(7!Ur?=}~#w3EwF+;i8S4#j{ob^Rzh!e53cm0q#2U&^#-cRRx% zj338hqPW=;uhHf@!k>q7BDr1HmGRdcCR|MF+G!H_3SXu%C2H)P|KPOR$G+BwthVNl zD5Zaakh(tnKdO2tWk6o&(}E$NR? zjQY>R^S%rfK1}?THHjS}U=F{j{#SQ(b#?VGrBcDM-}tBJSI@JK^BWJQ z-`t(?=4WgC-~>+KMh>~)x@^xybCiKhYGdEikFax@R~l!rVmzycMZK#Qqk2RiHvkutZg;(lRWk>$A}c)u2YJuu5yNMs=uD0~*wXCauFdZNLU?!X|CO7Hz{e z?Z6K0!Y=K>9__Z|mTPLA5eoeZFVEuPHR^5@ z+M(5(9d#py|LH87;%C0XQ&dST6q@2mf?_r*b))zn&eAg}V>$CyFT|BEf(V0|RC$Hb zFsA!>^)u8u6eHD15}VHb%tkjB6O_u=VJyz^dp(P>aiLJ2X1j?9-b|U5izM(hel254^i*8F71P|OTJtt)y62ault03$tM)MWyNf8NQ(qt^ohY23 z$-NAfMq#`(tjT?Wet^#@lV(>{_J+hnHbb1Mz*B>R>elb3hRBRxBmImSFA z&sbpa>ywL&BBR78Gb)TFMwPK_Vdmr8;>s14YK&FJ8l%o=Fq({Y#s*`PvBlVC>@ap2 zdyIX?0ppNy#5lJ2(RpL(yc=~t>T}zv{)=Aky#Ex{wT_eiBo2p|7OFo%G3mbyFZ(Lg z_cQYia`P_#F~z|+!cXKA ryDz_6^{K@l8P|3HDmZTISLegG*{VDD)_I7-I&1&NpRCFEY>dAF#1DiB diff --git a/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/__pycache__/async_client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/__pycache__/async_client.cpython-312.pyc deleted file mode 100644 index e69a55e729f01acb2a6246e611d3e2fe78b6cb02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33340 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%0DhlL$|F5`0IdAJpLxPaSG@uu4QDc{kr$d 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 Sm(Nrfym?d0=SK7p;QlY(RwLp7 diff --git a/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/__pycache__/options.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/__pycache__/options.cpython-312.pyc deleted file mode 100644 index 484b9995f6828d026baa5faaffa6f3d86f34786e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17741 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 diff --git a/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/async_client.py b/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/async_client.py deleted file mode 100644 index ae4822a5..00000000 --- a/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/async_client.py +++ /dev/null @@ -1,685 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import asyncio -import json -import logging -from typing import Dict, Union, Optional, cast, Any, Callable -import threading - -from .....utils import verboselogs -from .....options import DeepgramClientOptions -from ...enums import AgentWebSocketEvents -from ....common import AbstractAsyncWebSocketClient -from ....common import DeepgramError - -from .response import ( - OpenResponse, - WelcomeResponse, - SettingsAppliedResponse, - ConversationTextResponse, - UserStartedSpeakingResponse, - AgentThinkingResponse, - FunctionCallRequest, - AgentStartedSpeakingResponse, - AgentAudioDoneResponse, - InjectionRefusedResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, -) -from .options import ( - SettingsOptions, - UpdatePromptOptions, - UpdateSpeakOptions, - InjectAgentMessageOptions, - FunctionCallResponse, - AgentKeepAlive, -) - -from .....audio.speaker import ( - Speaker, - RATE as SPEAKER_RATE, - CHANNELS as SPEAKER_CHANNELS, - PLAYBACK_DELTA as SPEAKER_PLAYBACK_DELTA, -) -from .....audio.microphone import ( - Microphone, - RATE as MICROPHONE_RATE, - CHANNELS as MICROPHONE_CHANNELS, -) - -ONE_SECOND = 1 -HALF_SECOND = 0.5 -DEEPGRAM_INTERVAL = 5 - - -class AsyncAgentWebSocketClient( - AbstractAsyncWebSocketClient -): # pylint: disable=too-many-instance-attributes - """ - Client for interacting with Deepgram's live transcription services over WebSockets. - - This class provides methods to establish a WebSocket connection for live transcription and handle real-time transcription events. - - Args: - config (DeepgramClientOptions): all the options for the client. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - _event_handlers: Dict[AgentWebSocketEvents, list] - - _keep_alive_thread: Union[asyncio.Task, None] - - _kwargs: Optional[Dict] = None - _addons: Optional[Dict] = None - # note the distinction here. We can't use _config because it's already used in the parent - _settings: Optional[SettingsOptions] = None - _headers: Optional[Dict] = None - - _speaker_created: bool = False - _speaker: Optional[Speaker] = None - _microphone_created: bool = False - _microphone: Optional[Microphone] = None - - def __init__(self, config: DeepgramClientOptions): - if config is None: - raise DeepgramError("Config is required") - - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - - self._config = config - - # needs to be "wss://agent.deepgram.com/agent" - self._endpoint = "v1/agent/converse" - - # override the endpoint since it needs to be "wss://agent.deepgram.com/agent" - self._config.url = "agent.deepgram.com" - self._keep_alive_thread = None - - # init handlers - self._event_handlers = { - event: [] for event in AgentWebSocketEvents.__members__.values() - } - - if self._config.options.get("microphone_record") == "true": - self._logger.info("microphone_record is enabled") - rate = self._config.options.get("microphone_record_rate", MICROPHONE_RATE) - channels = self._config.options.get( - "microphone_record_channels", MICROPHONE_CHANNELS - ) - device_index = self._config.options.get("microphone_record_device_index") - - self._logger.debug("rate: %s", rate) - self._logger.debug("channels: %s", channels) - if device_index is not None: - self._logger.debug("device_index: %s", device_index) - - self._microphone_created = True - - if device_index is not None: - self._microphone = Microphone( - rate=rate, - channels=channels, - verbose=self._config.verbose, - input_device_index=device_index, - ) - else: - self._microphone = Microphone( - rate=rate, - channels=channels, - verbose=self._config.verbose, - ) - - if self._config.options.get("speaker_playback") == "true": - self._logger.info("speaker_playback is enabled") - rate = self._config.options.get("speaker_playback_rate", SPEAKER_RATE) - channels = self._config.options.get( - "speaker_playback_channels", SPEAKER_CHANNELS - ) - playback_delta_in_ms = self._config.options.get( - "speaker_playback_delta_in_ms", SPEAKER_PLAYBACK_DELTA - ) - device_index = self._config.options.get("speaker_playback_device_index") - - self._logger.debug("rate: %s", rate) - self._logger.debug("channels: %s", channels) - - self._speaker_created = True - - if device_index is not None: - self._logger.debug("device_index: %s", device_index) - - self._speaker = Speaker( - rate=rate, - channels=channels, - last_play_delta_in_ms=playback_delta_in_ms, - verbose=self._config.verbose, - output_device_index=device_index, - microphone=self._microphone, - ) - else: - self._speaker = Speaker( - rate=rate, - channels=channels, - last_play_delta_in_ms=playback_delta_in_ms, - verbose=self._config.verbose, - microphone=self._microphone, - ) - # call the parent constructor - super().__init__(self._config, self._endpoint) - - # pylint: disable=too-many-branches,too-many-statements - async def start( - self, - options: Optional[SettingsOptions] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - members: Optional[Dict] = None, - **kwargs, - ) -> bool: - """ - Starts the WebSocket connection for agent API. - """ - self._logger.debug("AsyncAgentWebSocketClient.start ENTER") - self._logger.info("settings: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - self._logger.info("members: %s", members) - self._logger.info("kwargs: %s", kwargs) - - if isinstance(options, SettingsOptions) and not options.check(): - self._logger.error("settings.check failed") - self._logger.debug("AsyncAgentWebSocketClient.start LEAVE") - raise DeepgramError("Fatal agent settings error") - - self._addons = addons - self._headers = headers - - # add "members" as members of the class - if members is not None: - self.__dict__.update(members) - - # set kwargs as members of the class - if kwargs is not None: - self._kwargs = kwargs - else: - self._kwargs = {} - - if isinstance(options, SettingsOptions): - self._logger.info("options is class") - self._settings = options - elif isinstance(options, dict): - self._logger.info("options is dict") - self._settings = SettingsOptions.from_dict(options) - elif isinstance(options, str): - self._logger.info("options is json") - self._settings = SettingsOptions.from_json(options) - else: - raise DeepgramError("Invalid options type") - - try: - # speaker substitutes the listening thread - if self._speaker is not None: - self._logger.notice("passing speaker to delegate_listening") - super().delegate_listening(self._speaker) - - # call parent start - if ( - await super().start( - {}, - self._addons, - self._headers, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - is False - ): - self._logger.error("AsyncAgentWebSocketClient.start failed") - self._logger.debug("AsyncAgentWebSocketClient.start LEAVE") - return False - - if self._speaker is not None: - self._logger.notice("speaker is delegate_listening. Starting speaker") - self._speaker.start() - - if self._speaker is not None and self._microphone is not None: - self._logger.notice( - "speaker is delegate_listening. Starting microphone" - ) - self._microphone.set_callback(self.send) - self._microphone.start() - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # keepalive thread - if self._config.is_keep_alive_enabled(): - self._logger.notice("keepalive is enabled") - self._keep_alive_thread = asyncio.create_task(self._keep_alive()) - else: - self._logger.notice("keepalive is disabled") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # send the configurationsetting message - self._logger.notice("Sending Settings...") - ret_send_cs = await self.send(str(self._settings)) - if not ret_send_cs: - self._logger.error("Settings failed") - - err_error: ErrorResponse = ErrorResponse( - "Exception in AsyncAgentWebSocketClient.start", - "Settings failed to send", - "Exception", - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Error), - error=err_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.debug("AgentWebSocketClient.start LEAVE") - return False - - self._logger.notice("start succeeded") - self._logger.debug("AsyncAgentWebSocketClient.start LEAVE") - return True - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "WebSocketException in AsyncAgentWebSocketClient.start: %s", e - ) - self._logger.debug("AsyncAgentWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect") is True: - raise e - return False - - # pylint: enable=too-many-branches,too-many-statements - - def on(self, event: AgentWebSocketEvents, handler: Callable) -> None: - """ - Registers event handlers for specific events. - """ - self._logger.info("event subscribed: %s", event) - if event in AgentWebSocketEvents.__members__.values() and callable(handler): - self._event_handlers[event].append(handler) - - async def _emit(self, event: AgentWebSocketEvents, *args, **kwargs) -> None: - """ - Emits events to the registered event handlers. - """ - self._logger.debug("AsyncAgentWebSocketClient._emit ENTER") - self._logger.debug("callback handlers for: %s", event) - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.debug("callback handlers for: %s", event) - tasks = [] - for handler in self._event_handlers[event]: - task = asyncio.create_task(handler(self, *args, **kwargs)) - tasks.append(task) - - if tasks: - self._logger.debug("waiting for tasks to finish...") - await asyncio.gather(*tasks, return_exceptions=True) - tasks.clear() - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.debug("AsyncAgentWebSocketClient._emit LEAVE") - - # pylint: disable=too-many-locals,too-many-statements - async def _process_text(self, message: str) -> None: - """ - Processes messages received over the WebSocket connection. - """ - self._logger.debug("AsyncAgentWebSocketClient._process_text ENTER") - - try: - self._logger.debug("Text data received") - if len(message) == 0: - self._logger.debug("message is empty") - self._logger.debug("AsyncAgentWebSocketClient._process_text LEAVE") - return - - data = json.loads(message) - response_type = data.get("type") - self._logger.debug("response_type: %s, data: %s", response_type, data) - - match response_type: - case AgentWebSocketEvents.Open: - open_result: OpenResponse = OpenResponse.from_json(message) - self._logger.verbose("OpenResponse: %s", open_result) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Open), - open=open_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.Welcome: - welcome_result: WelcomeResponse = WelcomeResponse.from_json(message) - self._logger.verbose("WelcomeResponse: %s", welcome_result) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Welcome), - welcome=welcome_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.SettingsApplied: - settings_applied_result: SettingsAppliedResponse = ( - SettingsAppliedResponse.from_json(message) - ) - self._logger.verbose( - "SettingsAppliedResponse: %s", settings_applied_result - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.SettingsApplied), - settings_applied=settings_applied_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.ConversationText: - conversation_text_result: ConversationTextResponse = ( - ConversationTextResponse.from_json(message) - ) - self._logger.verbose( - "ConversationTextResponse: %s", conversation_text_result - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.ConversationText), - conversation_text=conversation_text_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.UserStartedSpeaking: - user_started_speaking_result: UserStartedSpeakingResponse = ( - UserStartedSpeakingResponse.from_json(message) - ) - self._logger.verbose( - "UserStartedSpeakingResponse: %s", user_started_speaking_result - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.UserStartedSpeaking), - user_started_speaking=user_started_speaking_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.AgentThinking: - agent_thinking_result: AgentThinkingResponse = ( - AgentThinkingResponse.from_json(message) - ) - self._logger.verbose( - "AgentThinkingResponse: %s", agent_thinking_result - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.AgentThinking), - agent_thinking=agent_thinking_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.FunctionCallRequest: - function_call_request_result: FunctionCallRequest = ( - FunctionCallRequest.from_json(message) - ) - self._logger.verbose( - "FunctionCallRequest: %s", function_call_request_result - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.FunctionCallRequest), - function_call_request=function_call_request_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.AgentStartedSpeaking: - agent_started_speaking_result: AgentStartedSpeakingResponse = ( - AgentStartedSpeakingResponse.from_json(message) - ) - self._logger.verbose( - "AgentStartedSpeakingResponse: %s", - agent_started_speaking_result, - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.AgentStartedSpeaking), - agent_started_speaking=agent_started_speaking_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.AgentAudioDone: - agent_audio_done_result: AgentAudioDoneResponse = ( - AgentAudioDoneResponse.from_json(message) - ) - self._logger.verbose( - "AgentAudioDoneResponse: %s", agent_audio_done_result - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.AgentAudioDone), - agent_audio_done=agent_audio_done_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.InjectionRefused: - injection_refused_result: InjectionRefusedResponse = ( - InjectionRefusedResponse.from_json(message) - ) - self._logger.verbose( - "InjectionRefused: %s", injection_refused_result - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.InjectionRefused), - injection_refused=injection_refused_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.Close: - close_result: CloseResponse = CloseResponse.from_json(message) - self._logger.verbose("CloseResponse: %s", close_result) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Close), - close=close_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.Error: - err_error: ErrorResponse = ErrorResponse.from_json(message) - self._logger.verbose("ErrorResponse: %s", err_error) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Error), - error=err_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case _: - self._logger.warning( - "Unknown Message: response_type: %s, data: %s", - response_type, - data, - ) - unhandled_error: UnhandledResponse = UnhandledResponse( - type=AgentWebSocketEvents(AgentWebSocketEvents.Unhandled), - raw=message, - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Unhandled), - unhandled=unhandled_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.notice("_process_text Succeeded") - self._logger.debug("AsyncAgentWebSocketClient._process_text LEAVE") - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in AsyncAgentWebSocketClient._process_text: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in AsyncAgentWebSocketClient._process_text", - f"{e}", - "Exception", - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - await super()._signal_exit() - - self._logger.debug("AsyncAgentWebSocketClient._process_text LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - # pylint: enable=too-many-locals,too-many-statements - - async def _process_binary(self, message: bytes) -> None: - self._logger.debug("AsyncAgentWebSocketClient._process_binary ENTER") - self._logger.debug("Binary data received") - - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.AudioData), - data=message, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.notice("_process_binary Succeeded") - self._logger.debug("AsyncAgentWebSocketClient._process_binary LEAVE") - - # pylint: disable=too-many-return-statements - async def _keep_alive(self) -> None: - """ - Sends keepalive messages to the WebSocket connection. - """ - self._logger.debug("AsyncAgentWebSocketClient._keep_alive ENTER") - - counter = 0 - while True: - try: - counter += 1 - await asyncio.sleep(ONE_SECOND) - - if self._exit_event.is_set(): - self._logger.notice("_keep_alive exiting gracefully") - self._logger.debug("AsyncAgentWebSocketClient._keep_alive LEAVE") - return - - # deepgram keepalive - if counter % DEEPGRAM_INTERVAL == 0: - await self.keep_alive() - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in AsyncAgentWebSocketClient._keep_alive: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in AsyncAgentWebSocketClient._keep_alive", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in AsyncAgentWebSocketClient._keep_alive: %s", str(e) - ) - await self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - await super()._signal_exit() - - self._logger.debug("AsyncAgentWebSocketClient._keep_alive LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - async def keep_alive(self) -> bool: - """ - Sends a KeepAlive message - """ - self._logger.spam("AsyncAgentWebSocketClient.keep_alive ENTER") - - self._logger.notice("Sending KeepAlive...") - ret = await self.send(json.dumps({"type": "KeepAlive"})) - - if not ret: - self._logger.error("keep_alive failed") - self._logger.spam("AsyncAgentWebSocketClient.keep_alive LEAVE") - return False - - self._logger.notice("keep_alive succeeded") - self._logger.spam("AsyncAgentWebSocketClient.keep_alive LEAVE") - - return True - - async def _close_message(self) -> bool: - # TODO: No known API close message # pylint: disable=fixme - # return await self.send(json.dumps({"type": "Close"})) - return True - - async def finish(self) -> bool: - """ - Closes the WebSocket connection gracefully. - """ - self._logger.debug("AsyncAgentWebSocketClient.finish ENTER") - - # stop the threads - self._logger.verbose("cancelling tasks...") - try: - # call parent finish - if await super().finish() is False: - self._logger.error("AsyncAgentWebSocketClient.finish failed") - - if self._microphone is not None and self._microphone_created: - self._microphone.finish() - self._microphone_created = False - - if self._speaker is not None and self._speaker_created: - self._speaker.finish() - self._speaker_created = False - - # Before cancelling, check if the tasks were created - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - tasks = [] - if self._keep_alive_thread is not None: - self._keep_alive_thread.cancel() - tasks.append(self._keep_alive_thread) - self._logger.notice("processing _keep_alive_thread cancel...") - - # Use asyncio.gather to wait for tasks to be cancelled - # Prevent indefinite waiting by setting a timeout - await asyncio.wait_for(asyncio.gather(*tasks), timeout=10) - self._logger.notice("threads joined") - - self._speaker = None - self._microphone = None - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("finish succeeded") - self._logger.spam("AsyncAgentWebSocketClient.finish LEAVE") - return True - - except asyncio.CancelledError as e: - self._logger.error("tasks cancelled error: %s", e) - self._logger.debug("AsyncAgentWebSocketClient.finish LEAVE") - return False - - except asyncio.TimeoutError as e: - self._logger.error("tasks cancellation timed out: %s", e) - self._logger.debug("AsyncAgentWebSocketClient.finish LEAVE") - return False diff --git a/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/client.py b/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/client.py deleted file mode 100644 index 8f7e2322..00000000 --- a/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/client.py +++ /dev/null @@ -1,669 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import json -import logging -from typing import Dict, Union, Optional, cast, Any, Callable -import threading -import time - -from .....utils import verboselogs -from .....options import DeepgramClientOptions -from ...enums import AgentWebSocketEvents -from ....common import AbstractSyncWebSocketClient -from ....common import DeepgramError - -from .response import ( - OpenResponse, - WelcomeResponse, - SettingsAppliedResponse, - ConversationTextResponse, - UserStartedSpeakingResponse, - AgentThinkingResponse, - FunctionCallRequest, - AgentStartedSpeakingResponse, - AgentAudioDoneResponse, - InjectionRefusedResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, -) -from .options import ( - SettingsOptions, - UpdatePromptOptions, - UpdateSpeakOptions, - InjectAgentMessageOptions, - FunctionCallResponse, - AgentKeepAlive, -) - -from .....audio.speaker import ( - Speaker, - RATE as SPEAKER_RATE, - CHANNELS as SPEAKER_CHANNELS, - PLAYBACK_DELTA as SPEAKER_PLAYBACK_DELTA, -) -from .....audio.microphone import ( - Microphone, - RATE as MICROPHONE_RATE, - CHANNELS as MICROPHONE_CHANNELS, -) - -ONE_SECOND = 1 -HALF_SECOND = 0.5 -DEEPGRAM_INTERVAL = 5 - - -class AgentWebSocketClient( - AbstractSyncWebSocketClient -): # pylint: disable=too-many-instance-attributes - """ - Client for interacting with Deepgram's live transcription services over WebSockets. - - This class provides methods to establish a WebSocket connection for live transcription and handle real-time transcription events. - - Args: - config (DeepgramClientOptions): all the options for the client. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - _event_handlers: Dict[AgentWebSocketEvents, list] - - _keep_alive_thread: Union[threading.Thread, None] - - _kwargs: Optional[Dict] = None - _addons: Optional[Dict] = None - # note the distinction here. We can't use _config because it's already used in the parent - _settings: Optional[SettingsOptions] = None - _headers: Optional[Dict] = None - - _speaker_created: bool = False - _speaker: Optional[Speaker] = None - _microphone_created: bool = False - _microphone: Optional[Microphone] = None - - def __init__(self, config: DeepgramClientOptions): - if config is None: - raise DeepgramError("Config is required") - - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - - self._config = config - - # needs to be "wss://agent.deepgram.com/agent" - self._endpoint = "v1/agent/converse" - - # override the endpoint since it needs to be "wss://agent.deepgram.com/agent" - self._config.url = "agent.deepgram.com" - - self._keep_alive_thread = None - - # init handlers - self._event_handlers = { - event: [] for event in AgentWebSocketEvents.__members__.values() - } - - if self._config.options.get("microphone_record") == "true": - self._logger.info("microphone_record is enabled") - rate = self._config.options.get("microphone_record_rate", MICROPHONE_RATE) - channels = self._config.options.get( - "microphone_record_channels", MICROPHONE_CHANNELS - ) - device_index = self._config.options.get("microphone_record_device_index") - - self._logger.debug("rate: %s", rate) - self._logger.debug("channels: %s", channels) - - self._microphone_created = True - - if device_index is not None: - self._logger.debug("device_index: %s", device_index) - self._microphone = Microphone( - rate=rate, - channels=channels, - verbose=self._config.verbose, - input_device_index=device_index, - ) - else: - self._microphone = Microphone( - rate=rate, - channels=channels, - verbose=self._config.verbose, - ) - - if self._config.options.get("speaker_playback") == "true": - self._logger.info("speaker_playback is enabled") - rate = self._config.options.get("speaker_playback_rate", SPEAKER_RATE) - channels = self._config.options.get( - "speaker_playback_channels", SPEAKER_CHANNELS - ) - playback_delta_in_ms = self._config.options.get( - "speaker_playback_delta_in_ms", SPEAKER_PLAYBACK_DELTA - ) - device_index = self._config.options.get("speaker_playback_device_index") - - self._logger.debug("rate: %s", rate) - self._logger.debug("channels: %s", channels) - - self._speaker_created = True - - if device_index is not None: - self._logger.debug("device_index: %s", device_index) - - self._speaker = Speaker( - rate=rate, - channels=channels, - last_play_delta_in_ms=playback_delta_in_ms, - verbose=self._config.verbose, - output_device_index=device_index, - microphone=self._microphone, - ) - else: - self._speaker = Speaker( - rate=rate, - channels=channels, - last_play_delta_in_ms=playback_delta_in_ms, - verbose=self._config.verbose, - microphone=self._microphone, - ) - - # call the parent constructor - super().__init__(self._config, self._endpoint) - - # pylint: disable=too-many-statements,too-many-branches - def start( - self, - options: Optional[SettingsOptions] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - members: Optional[Dict] = None, - **kwargs, - ) -> bool: - """ - Starts the WebSocket connection for agent API. - """ - self._logger.debug("AgentWebSocketClient.start ENTER") - self._logger.info("settings: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - self._logger.info("members: %s", members) - self._logger.info("kwargs: %s", kwargs) - - if isinstance(options, SettingsOptions) and not options.check(): - self._logger.error("settings.check failed") - self._logger.debug("AgentWebSocketClient.start LEAVE") - raise DeepgramError("Fatal agent settings error") - - self._addons = addons - self._headers = headers - - # add "members" as members of the class - if members is not None: - self.__dict__.update(members) - - # set kwargs as members of the class - if kwargs is not None: - self._kwargs = kwargs - else: - self._kwargs = {} - - if isinstance(options, SettingsOptions): - self._logger.info("options is class") - self._settings = options - elif isinstance(options, dict): - self._logger.info("options is dict") - self._settings = SettingsOptions.from_dict(options) - elif isinstance(options, str): - self._logger.info("options is json") - self._settings = SettingsOptions.from_json(options) - else: - raise DeepgramError("Invalid options type") - - try: - # speaker substitutes the listening thread - if self._speaker is not None: - self._logger.notice("passing speaker to delegate_listening") - super().delegate_listening(self._speaker) - - # call parent start - if ( - super().start( - {}, - self._addons, - self._headers, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - is False - ): - self._logger.error("AgentWebSocketClient.start failed") - self._logger.debug("AgentWebSocketClient.start LEAVE") - return False - - if self._speaker is not None: - self._logger.notice("speaker is delegate_listening. Starting speaker") - self._speaker.start() - - if self._speaker is not None and self._microphone is not None: - self._logger.notice( - "speaker is delegate_listening. Starting microphone" - ) - self._microphone.set_callback(self.send) - self._microphone.start() - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # keepalive thread - if self._config.is_keep_alive_enabled(): - self._logger.notice("keepalive is enabled") - self._keep_alive_thread = threading.Thread(target=self._keep_alive) - self._keep_alive_thread.start() - else: - self._logger.notice("keepalive is disabled") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # send the Settings message - self._logger.notice("Sending Settings...") - ret_send_cs = self.send(str(self._settings)) - if not ret_send_cs: - self._logger.error("Settings failed") - - err_error: ErrorResponse = ErrorResponse( - "Exception in AgentWebSocketClient.start", - "Settings failed to send", - "Exception", - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Error), - error=err_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.debug("AgentWebSocketClient.start LEAVE") - return False - - self._logger.notice("start succeeded") - self._logger.debug("AgentWebSocketClient.start LEAVE") - return True - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "WebSocketException in AgentWebSocketClient.start: %s", e - ) - self._logger.debug("AgentWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect") is True: - raise e - return False - - # pylint: enable=too-many-statements,too-many-branches - - def on(self, event: AgentWebSocketEvents, handler: Callable) -> None: - """ - Registers event handlers for specific events. - """ - self._logger.info("event subscribed: %s", event) - if event in AgentWebSocketEvents.__members__.values() and callable(handler): - self._event_handlers[event].append(handler) - - def _emit(self, event: AgentWebSocketEvents, *args, **kwargs) -> None: - """ - Emits events to the registered event handlers. - """ - self._logger.debug("AgentWebSocketClient._emit ENTER") - self._logger.debug("callback handlers for: %s", event) - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.debug("callback handlers for: %s", event) - for handler in self._event_handlers[event]: - handler(self, *args, **kwargs) - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.debug("AgentWebSocketClient._emit LEAVE") - - # pylint: disable=too-many-return-statements,too-many-statements,too-many-locals,too-many-branches - def _process_text(self, message: str) -> None: - """ - Processes messages received over the WebSocket connection. - """ - self._logger.debug("AgentWebSocketClient._process_text ENTER") - - try: - self._logger.debug("Text data received") - if len(message) == 0: - self._logger.debug("message is empty") - self._logger.debug("AgentWebSocketClient._process_text LEAVE") - return - - data = json.loads(message) - response_type = data.get("type") - self._logger.debug("response_type: %s, data: %s", response_type, data) - - match response_type: - case AgentWebSocketEvents.Open: - open_result: OpenResponse = OpenResponse.from_json(message) - self._logger.verbose("OpenResponse: %s", open_result) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Open), - open=open_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.Welcome: - welcome_result: WelcomeResponse = WelcomeResponse.from_json(message) - self._logger.verbose("WelcomeResponse: %s", welcome_result) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Welcome), - welcome=welcome_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.SettingsApplied: - settings_applied_result: SettingsAppliedResponse = ( - SettingsAppliedResponse.from_json(message) - ) - self._logger.verbose( - "SettingsAppliedResponse: %s", settings_applied_result - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.SettingsApplied), - settings_applied=settings_applied_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.ConversationText: - conversation_text_result: ConversationTextResponse = ( - ConversationTextResponse.from_json(message) - ) - self._logger.verbose( - "ConversationTextResponse: %s", conversation_text_result - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.ConversationText), - conversation_text=conversation_text_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.UserStartedSpeaking: - user_started_speaking_result: UserStartedSpeakingResponse = ( - UserStartedSpeakingResponse.from_json(message) - ) - self._logger.verbose( - "UserStartedSpeakingResponse: %s", user_started_speaking_result - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.UserStartedSpeaking), - user_started_speaking=user_started_speaking_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.AgentThinking: - agent_thinking_result: AgentThinkingResponse = ( - AgentThinkingResponse.from_json(message) - ) - self._logger.verbose( - "AgentThinkingResponse: %s", agent_thinking_result - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.AgentThinking), - agent_thinking=agent_thinking_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.FunctionCallRequest: - function_call_request_result: FunctionCallRequest = ( - FunctionCallRequest.from_json(message) - ) - self._logger.verbose( - "FunctionCallRequest: %s", function_call_request_result - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.FunctionCallRequest), - function_call_request=function_call_request_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.AgentStartedSpeaking: - agent_started_speaking_result: AgentStartedSpeakingResponse = ( - AgentStartedSpeakingResponse.from_json(message) - ) - self._logger.verbose( - "AgentStartedSpeakingResponse: %s", - agent_started_speaking_result, - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.AgentStartedSpeaking), - agent_started_speaking=agent_started_speaking_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.AgentAudioDone: - agent_audio_done_result: AgentAudioDoneResponse = ( - AgentAudioDoneResponse.from_json(message) - ) - self._logger.verbose( - "AgentAudioDoneResponse: %s", agent_audio_done_result - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.AgentAudioDone), - agent_audio_done=agent_audio_done_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.InjectionRefused: - injection_refused_result: InjectionRefusedResponse = ( - InjectionRefusedResponse.from_json(message) - ) - self._logger.verbose( - "InjectionRefused: %s", injection_refused_result - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.InjectionRefused), - injection_refused=injection_refused_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.Close: - close_result: CloseResponse = CloseResponse.from_json(message) - self._logger.verbose("CloseResponse: %s", close_result) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Close), - close=close_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case AgentWebSocketEvents.Error: - err_error: ErrorResponse = ErrorResponse.from_json(message) - self._logger.verbose("ErrorResponse: %s", err_error) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Error), - error=err_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case _: - self._logger.warning( - "Unknown Message: response_type: %s, data: %s", - response_type, - data, - ) - unhandled_error: UnhandledResponse = UnhandledResponse( - type=AgentWebSocketEvents(AgentWebSocketEvents.Unhandled), - raw=message, - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Unhandled), - unhandled=unhandled_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.notice("_process_text Succeeded") - self._logger.debug("SpeakStreamClient._process_text LEAVE") - - except Exception as e: # pylint: disable=broad-except - self._logger.error("Exception in AgentWebSocketClient._process_text: %s", e) - e_error: ErrorResponse = ErrorResponse( - "Exception in AgentWebSocketClient._process_text", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in AgentWebSocketClient._process_text: %s", str(e) - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - super()._signal_exit() - - self._logger.debug("AgentWebSocketClient._process_text LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - # pylint: enable=too-many-return-statements,too-many-statements - - def _process_binary(self, message: bytes) -> None: - self._logger.debug("AgentWebSocketClient._process_binary ENTER") - self._logger.debug("Binary data received") - - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.AudioData), - data=message, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.notice("_process_binary Succeeded") - self._logger.debug("AgentWebSocketClient._process_binary LEAVE") - - # pylint: disable=too-many-return-statements - def _keep_alive(self) -> None: - """ - Sends keepalive messages to the WebSocket connection. - """ - self._logger.debug("AgentWebSocketClient._keep_alive ENTER") - - counter = 0 - while True: - try: - counter += 1 - self._exit_event.wait(timeout=ONE_SECOND) - - if self._exit_event.is_set(): - self._logger.notice("_keep_alive exiting gracefully") - self._logger.debug("AgentWebSocketClient._keep_alive LEAVE") - return - - # deepgram keepalive - if counter % DEEPGRAM_INTERVAL == 0: - self.keep_alive() - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in AgentWebSocketClient._keep_alive: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in AgentWebSocketClient._keep_alive", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in AgentWebSocketClient._keep_alive: %s", str(e) - ) - self._emit( - AgentWebSocketEvents(AgentWebSocketEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - super()._signal_exit() - - self._logger.debug("AgentWebSocketClient._keep_alive LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - def keep_alive(self) -> bool: - """ - Sends a KeepAlive message - """ - self._logger.spam("AgentWebSocketClient.keep_alive ENTER") - - self._logger.notice("Sending KeepAlive...") - ret = self.send(json.dumps({"type": "KeepAlive"})) - - if not ret: - self._logger.error("keep_alive failed") - self._logger.spam("AgentWebSocketClient.keep_alive LEAVE") - return False - - self._logger.notice("keep_alive succeeded") - self._logger.spam("AgentWebSocketClient.keep_alive LEAVE") - - return True - - def _close_message(self) -> bool: - # TODO: No known API close message # pylint: disable=fixme - # return self.send(json.dumps({"type": "Close"})) - return True - - # closes the WebSocket connection gracefully - def finish(self) -> bool: - """ - Closes the WebSocket connection gracefully. - """ - self._logger.spam("AgentWebSocketClient.finish ENTER") - - # call parent finish - if super().finish() is False: - self._logger.error("AgentWebSocketClient.finish failed") - - if self._microphone is not None and self._microphone_created: - self._microphone.finish() - self._microphone_created = False - - if self._speaker is not None and self._speaker_created: - self._speaker.finish() - self._speaker_created = False - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # stop the threads - self._logger.verbose("cancelling tasks...") - if self._keep_alive_thread is not None: - self._keep_alive_thread.join() - self._keep_alive_thread = None - self._logger.notice("processing _keep_alive_thread thread joined") - - if self._listen_thread is not None: - self._listen_thread.join() - self._listen_thread = None - self._logger.notice("listening thread joined") - - self._speaker = None - self._microphone = None - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("finish succeeded") - self._logger.spam("AgentWebSocketClient.finish LEAVE") - return True diff --git a/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/options.py b/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/options.py deleted file mode 100644 index ffdaa5c1..00000000 --- a/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/options.py +++ /dev/null @@ -1,368 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional, Union, Any, Tuple, Dict -import logging - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from deepgram.utils import verboselogs - -from ...enums import AgentWebSocketEvents -from ....common import BaseResponse - - -# ConfigurationSettings - - -@dataclass -class Header(BaseResponse): - """ - This class defines a single key/value pair for a header. - """ - - key: str - value: str - - -@dataclass -class Item(BaseResponse): - """ - This class defines a single item in a list of items. - """ - - type: str - description: str - - -@dataclass -class Properties(BaseResponse): - """ - This class defines the properties which is just a list of items. - """ - - item: Item - - def __getitem__(self, key): - _dict = self.to_dict() - if "item" in _dict: - _dict["item"] = [Item.from_dict(item) for item in _dict["item"]] - return _dict[key] - - -@dataclass -class Parameters(BaseResponse): - """ - This class defines the parameters for a function. - """ - - type: str - properties: Properties - required: List[str] - - def __getitem__(self, key): - _dict = self.to_dict() - if "properties" in _dict: - _dict["properties"] = _dict["properties"].copy() - return _dict[key] - -class Provider(dict): - """ - Generic attribute class for provider objects. - """ - def __getattr__(self, name): - try: - return self[name] - except KeyError: - # pylint: disable=raise-missing-from - raise AttributeError(name) - def __setattr__(self, name, value): - self[name] = value - - -@dataclass -class Endpoint(BaseResponse): - """ - Define a custom endpoint for the agent. - """ - - method: Optional[str] = field(default="POST") - url: str = field(default="") - headers: Optional[List[Header]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "headers" in _dict: - _dict["headers"] = [ - Header.from_dict(headers) for headers in _dict["headers"] - ] - return _dict[key] - - -@dataclass -class Function(BaseResponse): - """ - This class defines a function for the Think model. - """ - - name: str - description: str - url: str - method: str - headers: Optional[List[Header]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - parameters: Optional[Parameters] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - endpoint: Optional[Endpoint] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "parameters" in _dict and isinstance(_dict["parameters"], dict): - _dict["parameters"] = Parameters.from_dict(_dict["parameters"]) - if "headers" in _dict and isinstance(_dict["headers"], list): - _dict["headers"] = [Header.from_dict(header) for header in _dict["headers"]] - if "endpoint" in _dict and isinstance(_dict["endpoint"], dict): - _dict["endpoint"] = Endpoint.from_dict(_dict["endpoint"]) - return _dict[key] - - -@dataclass -class Think(BaseResponse): - """ - This class defines any configuration settings for the Think model. - """ - - provider: Provider = field(default_factory=Provider) - functions: Optional[List[Function]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - endpoint: Optional[Endpoint] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - prompt: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __post_init__(self): - if not isinstance(self.provider, Provider): - self.provider = Provider(self.provider) - - def __getitem__(self, key): - _dict = self.to_dict() - if "functions" in _dict and isinstance(_dict["functions"], list): - _dict["functions"] = [ - Function.from_dict(function) for function in _dict["functions"] - ] - if "endpoint" in _dict and isinstance(_dict["endpoint"], dict): - _dict["endpoint"] = Endpoint.from_dict(_dict["endpoint"]) - return _dict[key] - - -@dataclass -class Listen(BaseResponse): - """ - This class defines any configuration settings for the Listen model. - """ - - provider: Provider = field(default_factory=Provider) - - def __post_init__(self): - if not isinstance(self.provider, Provider): - self.provider = Provider(self.provider) - - def __getitem__(self, key): - _dict = self.to_dict() - return _dict[key] - - -@dataclass -class Speak(BaseResponse): - """ - This class defines any configuration settings for the Speak model. - """ - - provider: Provider = field(default_factory=Provider) - endpoint: Optional[Endpoint] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __post_init__(self): - if not isinstance(self.provider, Provider): - self.provider = Provider(self.provider) - - def __getitem__(self, key): - _dict = self.to_dict() - if "endpoint" in _dict and isinstance(_dict["endpoint"], dict): - _dict["endpoint"] = Endpoint.from_dict(_dict["endpoint"]) - return _dict[key] - - -@dataclass -class Agent(BaseResponse): - """ - This class defines any configuration settings for the Agent model. - """ - - language: str = field(default="en") - listen: Listen = field(default_factory=Listen) - think: Think = field(default_factory=Think) - speak: Speak = field(default_factory=Speak) - greeting: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "listen" in _dict and isinstance(_dict["listen"], dict): - _dict["listen"] = Listen.from_dict(_dict["listen"]) - if "think" in _dict and isinstance(_dict["think"], dict): - _dict["think"] = Think.from_dict(_dict["think"]) - if "speak" in _dict and isinstance(_dict["speak"], dict): - _dict["speak"] = Speak.from_dict(_dict["speak"]) - return _dict[key] -@dataclass -class Input(BaseResponse): - """ - This class defines any configuration settings for the input audio. - """ - - encoding: Optional[str] = field(default="linear16") - sample_rate: int = field(default=16000) - - -@dataclass -class Output(BaseResponse): - """ - This class defines any configuration settings for the output audio. - """ - - encoding: Optional[str] = field(default="linear16") - sample_rate: Optional[int] = field(default=16000) - bitrate: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - container: Optional[str] = field(default="none") - - -@dataclass -class Audio(BaseResponse): - """ - This class defines any configuration settings for the audio. - """ - - input: Optional[Input] = field(default_factory=Input) - output: Optional[Output] = field(default_factory=Output) - - def __getitem__(self, key): - _dict = self.to_dict() - if "input" in _dict and isinstance(_dict["input"], dict): - _dict["input"] = Input.from_dict(_dict["input"]) - if "output" in _dict and isinstance(_dict["output"], dict): - _dict["output"] = Output.from_dict(_dict["output"]) - return _dict[key] - -@dataclass -class SettingsOptions(BaseResponse): - """ - The client should send a Settings message immediately after opening the websocket and before sending any audio. - """ - - experimental: Optional[bool] = field(default=False) - type: str = str(AgentWebSocketEvents.Settings) - audio: Audio = field(default_factory=Audio) - agent: Agent = field(default_factory=Agent) - - def __getitem__(self, key): - _dict = self.to_dict() - if "audio" in _dict and isinstance(_dict["audio"], dict): - _dict["audio"] = Audio.from_dict(_dict["audio"]) - if "agent" in _dict and isinstance(_dict["agent"], dict): - _dict["agent"] = Agent.from_dict(_dict["agent"]) - - def check(self): - """ - Check the options for any deprecated or soon-to-be-deprecated options. - """ - logger = verboselogs.VerboseLogger(__name__) - logger.addHandler(logging.StreamHandler()) - prev = logger.level - logger.setLevel(verboselogs.ERROR) - - # do we need to check anything here? - - logger.setLevel(prev) - - return True - - -# UpdatePrompt - - -@dataclass -class UpdatePromptOptions(BaseResponse): - """ - The client can send an UpdatePrompt message to provide a new prompt to the Think model in the middle of a conversation. - """ - - type: str = str(AgentWebSocketEvents.UpdatePrompt) - prompt: str = field(default="") - - -# UpdateSpeak - - -@dataclass -class UpdateSpeakOptions(BaseResponse): - """ - The client can send an UpdateSpeak message to change the Speak model in the middle of a conversation. - """ - - type: str = str(AgentWebSocketEvents.UpdateSpeak) - speak: Speak = field(default_factory=Speak) - - -# InjectAgentMessage - - -@dataclass -class InjectAgentMessageOptions(BaseResponse): - """ - The client can send an InjectAgentMessage to immediately trigger an agent statement. If the injection request arrives while the user is speaking, or while the server is in the middle of sending audio for an agent response, then the request will be ignored and the server will reply with an InjectionRefused. - """ - - type: str = str(AgentWebSocketEvents.InjectAgentMessage) - message: str = field(default="") - - -# Function Call Response - - -@dataclass -class FunctionCallResponse(BaseResponse): - """ - TheFunctionCallResponse message is a JSON command that the client should reply with every time there is a FunctionCallRequest received. - """ - - type: str = "FunctionCallResponse" - function_call_id: str = field(default="") - output: str = field(default="") - - -# Agent Keep Alive - - -@dataclass -class AgentKeepAlive(BaseResponse): - """ - The KeepAlive message is a JSON command that you can use to ensure that the server does not close the connection. - """ - - type: str = "KeepAlive" diff --git a/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/response.py b/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/response.py deleted file mode 100644 index c0dc226d..00000000 --- a/venv/Lib/site-packages/deepgram/clients/agent/v1/websocket/response.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional, Dict, Any - -from dataclasses import dataclass - -# common websocket response -from ....common import ( - BaseResponse, - OpenResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, -) - -# unique - - -@dataclass -class WelcomeResponse(BaseResponse): - """ - The server will send a Welcome message as soon as the websocket opens. - """ - - type: str - request_id: str - - -@dataclass -class SettingsAppliedResponse(BaseResponse): - """ - The server will send a SettingsApplied message as soon as the settings are applied. - """ - - type: str - - -@dataclass -class ConversationTextResponse(BaseResponse): - """ - The server will send a ConversationText message every time the agent hears the user say something, and every time the agent speaks something itself. - """ - - type: str - role: str - content: str - - -@dataclass -class UserStartedSpeakingResponse(BaseResponse): - """ - The server will send a UserStartedSpeaking message every time the user begins a new utterance. - """ - - type: str - - -@dataclass -class AgentThinkingResponse(BaseResponse): - """ - The server will send an AgentThinking message to inform the client of a non-verbalized agent thought. - You will ONLY receive this message if you have set `experimental` to true. - """ - - type: str - content: str - - -@dataclass -class FunctionCallRequest(BaseResponse): - """ - The FunctionCallRequest message is used to call a function from the server to the client. - """ - - type: str - function_name: str - function_call_id: str - input: str - - -@dataclass -class AgentStartedSpeakingResponse(BaseResponse): - """ - The server will send an AgentStartedSpeaking message when it begins streaming an agent audio response to the client for playback. - """ - - total_latency: float - tts_latency: float - ttt_latency: float - - -@dataclass -class AgentAudioDoneResponse(BaseResponse): - """ - The server will send an AgentAudioDone message immediately after it sends the last audio message in a piece of agent speech. - """ - - type: str - - -@dataclass -class InjectionRefusedResponse(BaseResponse): - """ - The server will send an InjectionRefused message when an InjectAgentMessage request is ignored because it arrived while the user was speaking or while the server was sending audio for an agent response. - """ - - type: str diff --git a/venv/Lib/site-packages/deepgram/clients/agent_router.py b/venv/Lib/site-packages/deepgram/clients/agent_router.py deleted file mode 100644 index 90d82f3a..00000000 --- a/venv/Lib/site-packages/deepgram/clients/agent_router.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from importlib import import_module -import logging - -from ..utils import verboselogs -from ..options import DeepgramClientOptions -from .errors import DeepgramModuleError - - -class AgentRouter: - """ - Represents a client for interacting with the Deepgram API. - - This class provides a client for making requests to the Deepgram API with various configuration options. - - Attributes: - config_options (DeepgramClientOptions): An optional configuration object specifying client options. - - Raises: - DeepgramApiKeyError: If the API key is missing or invalid. - - Methods: - read: (Preferred) Returns an Threaded AnalyzeClient instance for interacting with Deepgram's read transcription services. - asyncread: Returns an (Async) AnalyzeClient instance for interacting with Deepgram's read transcription services. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - - @property - def websocket(self): - """ - Returns an AgentWebSocketClient instance for interacting with Deepgram's Agent API. - """ - return self.Version(self._config, "websocket") - - @property - def asyncwebsocket(self): - """ - Returns an AsyncAgentWebSocketClient instance for interacting with Deepgram's Agent API. - """ - return self.Version(self._config, "asyncwebsocket") - - # INTERNAL CLASSES - class Version: - """ - Represents a version of the Deepgram API. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _parent: str - - def __init__(self, config, parent: str): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - self._parent = parent - - # FUTURE VERSIONING: - # When v2 or v1.1beta1 or etc. This allows easy access to the latest version of the API. - # @property - # def latest(self): - # match self._parent: - # case "analyze": - # return AnalyzeClient(self._config) - # case _: - # raise DeepgramModuleError("Invalid parent") - - def v(self, version: str = ""): - """ - Returns a specific version of the Deepgram API. - """ - self._logger.debug("Version.v ENTER") - self._logger.info("version: %s", version) - if len(version) == 0: - self._logger.error("version is empty") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Invalid module version") - - parent = "" - file_name = "" - class_name = "" - match self._parent: - case "websocket": - parent = "websocket" - file_name = "client" - class_name = "AgentWebSocketClient" - case "asyncwebsocket": - parent = "websocket" - file_name = "async_client" - class_name = "AsyncAgentWebSocketClient" - case _: - self._logger.error("parent unknown: %s", self._parent) - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Invalid parent type") - - # create class path - path = f"deepgram.clients.agent.v{version}.{parent}.{file_name}" - self._logger.info("path: %s", path) - self._logger.info("class_name: %s", class_name) - - # import class - mod = import_module(path) - if mod is None: - self._logger.error("module path is None") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Unable to find package") - - my_class = getattr(mod, class_name) - if my_class is None: - self._logger.error("my_class is None") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Unable to find class") - - # instantiate class - my_class = my_class(self._config) - self._logger.notice("Version.v succeeded") - self._logger.debug("Version.v LEAVE") - return my_class diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/__init__.py b/venv/Lib/site-packages/deepgram/clients/analyze/__init__.py deleted file mode 100644 index 71708c58..00000000 --- a/venv/Lib/site-packages/deepgram/clients/analyze/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .client import AnalyzeClient, AsyncAnalyzeClient -from .client import ReadClient, AsyncReadClient -from .client import AnalyzeOptions -from .client import ( - # common - UrlSource, - TextSource, - BufferSource, - StreamSource, - FileSource, - # unique - AnalyzeStreamSource, - AnalyzeSource, -) -from .client import ( - AsyncAnalyzeResponse, - SyncAnalyzeResponse, - AnalyzeResponse, - # shared - Average, - Intent, - Intents, - IntentsInfo, - Segment, - SentimentInfo, - Sentiment, - Sentiments, - SummaryInfo, - Topic, - Topics, - TopicsInfo, - # unique - AnalyzeMetadata, - AnalyzeResults, - AnalyzeSummary, -) diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/analyze/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 99215418fa44acb687660b97d2e0638e35b25ffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 989 zcmZXS%Wl&^6o$u6Vkb_Vw7K=(A`pu#AUhTakU|kC;wCli=EzdyI+I}4$F@99M0gQi zfDKEYgEz2*Sg>MO)J3GOnBzDp6<&P)|1-bGXD;7O(_r$MetY%7$uahe%<54yarH%t z&uqj-ipNj^1yxWL@~ZSX$YCDxsn1DYfI_PCQfr{04muX0h$SeY0S1<#j1{P)nS#ui zU}6=jSc4jFzy@x@Cf1>j4QOB!n%IICwxNw%u!Y;OjXSV|yReIUu!sAwj|Xsohj6H{ zxz^EtE3(y&nwUM`_U51XvFCC>PU<}|_nlic88S||J<1ZbG;vetC`mQTzYk+K@I^;Y zN@tNb2&R$46XTSBj5A$%J{^yFv~q(u;x?{wFI|skx{*zIE3oQxnd#J%=D)q3a1qLX z^Q1AjS-`qj%O+eG^xlj|_Jk)|-;ZhG`tmK3awhuzI7svXpCApJ14)-;S}(0_Vyvb7 zb}&V>qj{PsoCcxmBwG3sav#WwbZFJiTOQjZJGR$5DEpgwu~_?TzIUCYM03&;isap6 zQJzpBXat>5B$NnrQKK@ULNEzcLXEIN*d){m4MLO9BD4uxgl)nOVVAH+*e4ti4hctu zI}%^nl_a~ijvrfRf=9x7-S3}TFSxjfgV34&qe`GafS!6YU=#*&$}Tyi2C z?!zH_01w$`@Q6KzC$fYJBry#s%z%nH$f5>$EJ6Y2po9sC<2+Pw5f*S6mT(nTa2?ig z18(3=*u-tv!YbUt+pvSXa0hF!hX=5a_uwub!hL)QNB9Un$0zUb9=agqtDoUEl8Xx|W-KYZ{H-z-*zboZwG3 z+3Bwar>AHJqlRsw&VslX9RtZOP`YaY!B+g3s^%6NlbyUltIrokH%n7PP@LXyNaOV( zn)(^KvE#1IPv*w`-f~l99CuH9ZoGkKOt{qsZ#%;DcrqNiN@()AjR9l2Ir3tnC%t~B z<;J|u;`bnimYC;||S9pBSFOL}&p~dSp^V6C!;mU^PBN`VpH>o7yguvQ#QOS|? z9Mk0^hj@%`Zc=K(DS_udQFZdCg+I6kUjV+xP4Q!yRD4tQ(tJV|lqMtmrT-{|d|BaJ zn7+P1EEJFv0V?T+SYEKSuNXp_7e*o?RuC*dB`o4aFP1b$tRz?=6qV2mdFF&C8+wSA z15EfQG}B<-t{(4v=fB3Qyp0;{B5V#|VM0vQur@d9aapM}4O zK>EQ$4W@-yHTj zEv%pM*V-Inci4R0`JribY~1bZt#|y@Tg^6N|IE}`&3`;rP51wEG~VlvJ|vDBS(o=SUQss2}VtkY8~!V{MJ+5*E*%-{f;jyXTU2k&rU$d`sHSFIn?BKix-0C1k|_ diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/client.py b/venv/Lib/site-packages/deepgram/clients/analyze/client.py deleted file mode 100644 index 80dc3fad..00000000 --- a/venv/Lib/site-packages/deepgram/clients/analyze/client.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .v1.client import AnalyzeClient as AnalyzeClientLatest -from .v1.async_client import AsyncAnalyzeClient as AsyncAnalyzeClientLatest -from .v1.options import ( - # common - AnalyzeOptions as AnalyzeOptionsLatest, - UrlSource as UrlSourceLatest, - TextSource as TextSourceLatest, - BufferSource as BufferSourceLatest, - StreamSource as StreamSourceLatest, - FileSource as FileSourceLatest, - # unique - AnalyzeStreamSource as AnalyzeStreamSourceLatest, - AnalyzeSource as AnalyzeSourceLatest, -) -from .v1.response import ( - SyncAnalyzeResponse as SyncAnalyzeResponseLatest, - AnalyzeResponse as AnalyzeResponseLatest, - AsyncAnalyzeResponse as AsyncAnalyzeResponseLatest, - # shared - Average as AverageLatest, - Intent as IntentLatest, - Intents as IntentsLatest, - IntentsInfo as IntentsInfoLatest, - Segment as SegmentLatest, - SentimentInfo as SentimentInfoLatest, - Sentiment as SentimentLatest, - Sentiments as SentimentsLatest, - SummaryInfo as SummaryInfoLatest, - Topic as TopicLatest, - Topics as TopicsLatest, - TopicsInfo as TopicsInfoLatest, - # unique - Results as ResultsLatest, - Metadata as MetadataLatest, - Summary as SummaryLatest, -) - -# The client.py points to the current supported version in the SDK. -# Older versions are supported in the SDK for backwards compatibility. - -# common -UrlSource = UrlSourceLatest -TextSource = TextSourceLatest -BufferSource = BufferSourceLatest -StreamSource = StreamSourceLatest -FileSource = FileSourceLatest - -AnalyzeStreamSource = AnalyzeStreamSourceLatest -AnalyzeSource = AnalyzeSourceLatest - -# input -AnalyzeOptions = AnalyzeOptionsLatest - -# responses -SyncAnalyzeResponse = SyncAnalyzeResponseLatest -AnalyzeResponse = AnalyzeResponseLatest -AsyncAnalyzeResponse = AsyncAnalyzeResponseLatest -# shared -Average = AverageLatest -Intent = IntentLatest -Intents = IntentsLatest -IntentsInfo = IntentsInfoLatest -Segment = SegmentLatest -SentimentInfo = SentimentInfoLatest -Sentiment = SentimentLatest -Sentiments = SentimentsLatest -SummaryInfo = SummaryInfoLatest -Topic = TopicLatest -Topics = TopicsLatest -TopicsInfo = TopicsInfoLatest -# unique -AnalyzeResults = ResultsLatest -AnalyzeMetadata = MetadataLatest -AnalyzeSummary = SummaryLatest - -# clients -AnalyzeClient = AnalyzeClientLatest -AsyncAnalyzeClient = AsyncAnalyzeClientLatest - - -# aliases -ReadClient = AnalyzeClientLatest -AsyncReadClient = AsyncAnalyzeClientLatest diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/v1/__init__.py b/venv/Lib/site-packages/deepgram/clients/analyze/v1/__init__.py deleted file mode 100644 index 8ffd0b46..00000000 --- a/venv/Lib/site-packages/deepgram/clients/analyze/v1/__init__.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .client import AnalyzeClient -from .async_client import AsyncAnalyzeClient - -# common -from .options import ( - UrlSource, - TextSource, - BufferSource, - StreamSource, - FileSource, -) - -# analyze - -from .options import ( - AnalyzeOptions, - AnalyzeStreamSource, - AnalyzeSource, -) - -from .response import ( - AsyncAnalyzeResponse, - SyncAnalyzeResponse, - AnalyzeResponse, - # shared - Average, - Intent, - Intents, - IntentsInfo, - Segment, - SentimentInfo, - Sentiment, - Sentiments, - SummaryInfo, - Topic, - Topics, - TopicsInfo, - # unique - Metadata, - Results, - Summary, -) diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 6c31fa0f92c5be3e301d2a33c2888919d94f46b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 959 zcmZXS%Zd|06o#vF>CQcq+hpz|B0@k7Ze>v7h!VVknb{l~LYvgYX8LqDRh?jb5jVbo zOP|9xC~)P<-N-NmW@VjDCpy@Rum1B_ovKr(>wCFeVEUVWd-35Y&Dc*0R$nR+mtVB_ z%*JeNcnl3N4ALntg=t8~I_+gJ3t2S5L<=m;K@RhfkLNOat^frrLJ><)ioL8?#tKxh z3RT>I4Xi;8>rlrAG_VOxY(Wb*VH4ZX#x2;wZP>;g*uh=c#XZ==eb~nXIKV?VG}zqi zSicNiV#iSBp6__`PyE<(xgTkx-jj2GbkohM{HgE;!BmX6DxC0-QKCyvr)OtetfE0A zxPz;8&s~o%btkPV$&PQs$PIj{8cBR3WmQa)Raeb_i+RUos8hLW4E|QQHmk{oYs2cz zxNs(1nSDRfcT?7Kl&YABzJC@dYrrQ+)8&DtOEUKJ>rfTeQs)k)h>n=YYqBRn=#G>b z4^nrALK#oxUh~KqJCUO-UD4Ewq&{hx`lfSBnWMPhLcbuUN)EMrm{=LItYFzEk=2nf z2^Jwo$P?%liXx$;p>iVWjwq8?Ayf$)gc_kvXb_r&7GaanCTtP52|I*c!X9CtaG>#( zU23xH;qfE;RB|Ehm;L^U{fx`=Cq3gTRaQGmcU+0c67*9R^Slrd;(L3>UXMb- z$RL<~eOAzIQUjO7{6$Sea444-G#N~3Cf4b>!N}=SQ4-W>T|x%TF|W8TJ@dIJ>M!9v z3sjQksif-?yziu2@Jx{rV&*4;;Nx9yfh71ra-+n11b@~wPi1M|`zhIXAP;cs9mIp{C}#np!rsmfDuZpuW~s^?emBi$hIq^VCOlvi%~}+oUG!14$d{ zv(rHiu0bwC<_Fx;lEh_8A~%^X^7&kGf|G@hWR6eE={}P6eX(>k#|siy5ah`cuVscw zRFpDeZrm)86-x!~(uMO92YR?HjAuzJuliFkHzx!UgiNWJ%}uC2?Vf?LYF;>ep9K5$C1qm1d@) z7--BDb8;$$i!ZFKS#b+K4Wv?Jw4_oJb~ML*yplONaQTuXh|=YevuDRHpAw`ia%uYV z)lx1a3{JrMd-CBb%gdkn!^;NoG8-`MUT3Z|YuO8@6-z`>{{mX5gSne?szTq!3?F+3xWw>Xc zol<@Jg6}VpkC3GLptE6dR{fK({6jaWemPeVN;9&`2t|Inlq<@rPZZ=Cv6#VkXI!`# ze;fXu-Gk5b2t~t!4MWy=YP(OFL)uE@Z39C#KJS#`lFcFiP@gbjfOjdbtCZ+fTs&E@ zKi*bTf-$t3CC)1@r%%P79p8X`9&6ybuw4!lOQEy0VUyxgJc?WKDn8!(sZa6WqyL)z zCIF8=hPMBm>yG;`yk6=e>WLWET6d=@_B{Y9itl^W-@E4+xyi_DO()T<&~t&}V1pL5 z7$vMb@3&gipp?^lvh{=9W@xi?eL}zBU3>uV0_SDjWh_e4Mq0qUatpQ^X7B++*C()q zIgZ*+Bd>Mmg9>AeGO~IFTvcLVmYMk~M?*Ho8jgee&PJO>N% zx?34mT$Z&PC>K%OFI6t8c&u_{wsB?yOhI9Aw!s|pC;`RG$3FEs&$7AT1}u&%L91qY zhf&!SF4uJzvbsCWYpGhoV{SSDxr(iG3u7<=G(`p zn>YW_eU0vIPX7xuA&A%sFCB|(ScyQNG=d*a`#|&st&HM?G+@TCsFsD>W1|1w0d8zk zuodS@Sx$x&0>tDJ2VZbtDjJ$X4S4BaAa0LtiB2j&*C5a5G>T+qLU@M?HAUPWUdX0r z@-ml`xY1Hk=&e<4e7U$iKxlO12H!u+ndxh&>w)h#QlTEuX}0S!p}`{JZPiP9Kt#}?dP%>DA!1&xm@NT7E2U7Y>X|OV@Wzk58o&vh zBG&g{+*d5g0AL@m;!cQ)xWv@8)q0Vt@5;3_%yIEFmh_C5`0I%HaKx%^xJzgU4m9Hu zaivp3wwBCpUwa7R7?Nh;6ZoG9aI0@nfv^T>x0IPJi(3aP%!yz6sBqh@Yxg`AcIR?z z%fduC2KTmwU^%v9G1mV$(!S7kudfn0@Y%%D(V_Cup~a&Ymf6^M&fhq{#BMLM+ZVe| zSJO@a zsX%k23Wi0htyH4*&bHgzmg3#zc=uwg=Wh4iGj|6TBYpGk$00z|l@Pbw)N$j~liK=E zRM?XaCOuBv5uM zkvsV)acYr0^~7KU9c89tq4(~^3e#)S0Ft)vzOTacKQ`+!6?T@{&c*FR6?S;JwewEt zcIi>;?)l-`!u#*HRhR>{X_~^?G(BG%cT2u={r2@`Hd=Kv?ZGF_TcK~3A&j>`_%sY@ z)d&@Bc^U=jImIM`^S)}r90A1O*Y9S5wLFe=E=6{iBfIbW9!2`+-DZ8;%FMQf%l8jK zqs+9eWoGN*Hb^>bCRu}NIhvRcR{w~GSNh-8<22N{BJF}P_{j-&Bu4)zLXU(zKZ*_= zgvd{5dL-iciR(lVB45Ch7)@qs#v~R{4ms|(;qTdh0cU>|vI7vnWc{E|znqvpPymoKX$j zdGA9V1Z@bG_^eVEnXz;MiCDW`A1LlA2TJo$x2z$FaB9KJ(I9&ZEE;4Il7=M0f%@

|WE^H?Q8>la$ zc&%O~Bx0M@0z*;)Kq8Prc$FYf^(c@C#)+yog!oPt$LtVaHc8kNXVhxlA*Vqi*amGg zNr+X7k1MRzwg%TvuT&N`lW}P-tV5TASxi%?? zKv|Hs=#A6htcHao?piLN=f(vNnzR{IrnZvJVl<7lZh+XJ`%*{R7xc}WHQCKKW`NzL zay$n_C0*nQdY_Ie4O*(}y$&_-=jpwEUzOu7a2A7e7@*f(9KisQzjz*k2VooRKY*!(#O+0C9|k6g6Gt(M zz+Ze1gZDA`00Jotfic&~ouGd46eQ2?UK{P3{XdI}SQGXiHbI|;)J|8Jp(pW{Mo@b> zl$d{axwU@j3n7?t%r#ZN$K*(7YcPCfH-RAe+#;E(fFMXyn5;fifu4FU#+~AxL81g}_S5 zW$9YiF2owZwjqIVYJuqoe(4sNI|RH52OAOy6HXef1`@{FcOh!Vw@F#e@!g0BIOz@B z;G%1)+p5u!9_m8F-2^ACk#+1QIF*a8gFrZyi`fYTAp-bWth?%V6XF}*O>n9?QL~$1 z0`e(zJk(w5*iGoID*{oz$xbyI5CQzi*Ij(G?aeyx133`^+pIHp6ONd>2`%X$eArDo zprgf_-GqDz;59i%v5`%MF*v(%k(?>g9rvr${9oBz*c2$P9V%D{3a_nA<1D{PJic=c zP)N3c$TkFl;iI!J%&g(>gD{c_d{=$ic{Mn{K#qZk2;}SG`J0$li_Cjhx%mCKH3I}r z!@%!ik>e1|wi=k7*lJ<*RvT77fw@m&V8V3O+!4TXCi1nxdff6C(fzg_FpuBbIxsK( zKBP79!LxRwXS-hT2L2fp&6#k#-V1-C!kpX$FFf%scN{`5{GoEkp|8jbzja}#650Wt z=7l}wrX4p3~|J}(Gmap2t)t)O?t%V`SAca;u-o29}S_i5B?XwO+I*p+Fk;r zg8;R0Ss_;))b{B)8bNLIh>%epz{1OUx=o)p98@uZzolzkzIq4PY(U3`P}`{m<{_O8 zL2Y{rEV5w2_J&Z~fgtc9yRZHQyA+L}wv%4_!5z2Lks+hM8v5Lww1(FKnVrf-?2x$u ztaK_DUFCCkI4xc0bH{@_8}qq4)f~42VcDcAQ%+FdBw2HfeC{Sxx6Pi!I(+U<2Yz1e z;Erv~*7)3;(+hTxJ=VzQz8WIq3Fb|5y{{jT|IP*PuzO&4?EjXz;Cpq}SLcGSLBgwj z@E^i76aN4M;*DRI5=VEu1KzLq#CO>NvWd<)3*I-|;5~jV99{7ng76OhcySCgH}a_e zAv}XE3EP&-THT31Es&xnhOc+24^^1qO>n7i2D(01VMksSU28i2ccbf9hTw&v$`W{Q%wT9ffPwuODjc?GVxZs0LH1LW!Tr!*4EB zHkJCuOggXq0t0^GlHyAl_$h`TX9I4ctI<>{U4#Q=X*`oD!6WoDlHW9l36#J^PlL1g8OyCCIu5DEjihBWb<6e@8z)!?qK8QFG)Uf^wjf{}b!>>1J z5xr*;40`IgwgH9UQp5m%Dk6OyX2P%koOZe$SVz^1Le)nlwk+(t8~Mz$$Q>?k zIZ}=vt@_CmhKhGAG~bR?10)*6jIZ6^UJa2bOUiwJ|9AJ7<9n)Mk`|$wTB}4q9Civu z7o$7wrWT`z%Yh@$nn;F8SG_gy(}p!DfHk1OPejJSumE`yGz<%oD6s?$3zKN1#;_;8nF?-y)P5l1Z^#p?Z%EYY8xpPS8f@@3VPoV(XnsH6RU4X)an}&t?L_-ru7XGv2UKYpeXJ!h8)Zubo{D5IN1tk zPDLE)+Q27M;OqFzJ0s`vk~VwDt}9L!{JB`607pxMSR#Z0ZtCKXZu0PRB}uftFn9n| zn@41B;q*`$@aBfCdehju-sAb1Wr-}6bhu0{{hL3 Bna%(J diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/client.cpython-312.pyc deleted file mode 100644 index bc7f566148c05b4df536813e64532132f930aa18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14855 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 diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/response.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/analyze/v1/__pycache__/response.cpython-312.pyc deleted file mode 100644 index d5661b7a2f75bac6ddea98b6df15161f55936a86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5989 zcmds5O>7&-6&@~^ONxJ@ME%>AXi1hu+mh@!u^rcODo2k0WI3p8BiJg~GTfCyn@cLQ zq+kjvN}z6`+*tHr9@;~15$uC|6MFK!7cUq<>Oej9(BvjVDGcP)_hxq~X+u>uYNJ3G z*tawL-rG0xX5RPS>|Z01Ac3p+=PO@)8ztl)*l{k&ZftdV2zf+QqI$AK_sAYykOkc< zdv#G3J@{V8`gBQ_bieH9eQ!3PH_1V0i>fah(!+9CkH`@{Do6EZxml0NF}+1@(OczK zJub)fHn~l2m)rFYxkK-iJM}IZOlp!qt`JpvNL0TTe(beI^VlAg+->s%z;9~6@3Hwo z;D;LU57_)L@FNZQ2W@^7_{|OYhqOa-Zz+~+`3^^v6qz`gF$yejYrc@l=TccFPGr&r z<{i(Kk^*Z|Q-xGIn=%aMo6TrhHR)keI-i@(%zcM5OGa4uQp(VNrWy13oS`xQ_<}}L za~hMbLJW$V%Hz<`3KPWGeyPM?@pCM#XMa`!bg&qL&%xe@VYgUw0E|)K)a2*UqSs`1%BR?n~ou9d5Xw;awaqZge znF-CfU&znTEaWq3ZF~+KH?yGS7G@?hpU)VXf;KXrO5cYCFlJOuo1dd8eJq{LfS56s zvgS6naB7U&>oq!GqTOJHlU`^TaUj1TFGRr?*bI=)?(+4D_ZzW`4meV~oLrB!Rvv5r z$;seyKXK&QpliMn)}_t0qtow%(NLmjo{A(7ikQnHl=Zfb=TM$uv`-!D#= zcW4g?TYJEtrdq0?sVtC9<>rd8f>UYR3)}J z-)%E&SZMPWEq<`uVhAESleXPz?|6_PM1-5K`XD$PSN+~jr*jcPoZRwDLG>&N3$URI zsKc*&_yyOs1ai1rohZXT-?f6R?ROOR&=y?U0@wE1+D-dtdtKTbf>qJh4(+2Yy0kf( zED1||M$;teo1(bA=@}&Fkl^YjCFU>W6%|q&ZH7K;nx%Q&>bIa!8WEEZCfIjsOtt1HT4TRpgTy!|PN8-D^)ChM`bN8#Uve;-};t%tg+ zcg#@##^Bi6;QQv_`>RKuMa}cKYJ;CFU#^Ur;lt~p1J$A#8r&ED zdGStd=R2#eJ#1I4NbEVtu!;~usafcuuO z0(USEH1smPgam<$kAORt4q+Dwf`;)IAnrs|6T8;q?d2=W(>1Yuy{)5sbva!VJN|ZT z4E${NjhW|eeA74iy;nFcl_x91)t{KHN4JRJlU_(<>|K}4m{gvsT&;d)wjFn5j-PbN zH26+()FqRY$~P)q)njJM5&oU6K+xA?O$#TJhP!?_arvr6iQg`K7F&3}uzTCNgNX(0 zK>@0chAa3n*xj*$E_Yu>E|QyY8?8XL-Q5x|Pb?2SoU*2YLc69R!3(^$z6Ij0tssqy zssPlddLdzo4$M69)swlT`LzHBGNye5j~zN#05sAGf=NC4rBHg>zVp9@XdBM zq+{4U1%&zS9Q7uW@Q*={J#c>)*KN z11qlU|2^kkhxyV;BvVK}0g{v`hAD>_$_pMmThI<9aAqg;A`k-+(Mhd5D=fyHAlQ*n zGbs8;Ag+wsR`r>oLmPcVYkeopzLQVepO(y1SnEGy z_MdrLT%9q`Ua$4v0ErW3xNkiauRzW{xY0Yf);ntUj(%Ny`svEAYP}zV!0=bM)A?-v2m zf7F$t`X$JjpH}9~NUxLXhDTg7!x9|z0@WTfHt5JCj<{qJQu*WMtChRpSx07HTRYMr z4!3b0DFf$!l}A*_9&#A)J;<8f$NwIV?F|q9Zv^nWTn6jFj}F3(EpQsb*>Z5=0ksDt z9dIwx4rux5}5&vQYg{p&1lUq3*MWW+?ZJe2(H7lcOpAjns8`gXcyXMiN27 z6AYg8XbcHIhhT|I<4E{nq#auvY59o+OH1nr!eN%cw3S`sk@pxVaiD#rnPW+P$|DBwDDMmfQOX84!VQX`k2%+xSd^5&b2SE*3@UU6Xa@1NqJr&@=!{$M2 P^BCzIGD(~cz~KK4G5_6l diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/v1/async_client.py b/venv/Lib/site-packages/deepgram/clients/analyze/v1/async_client.py deleted file mode 100644 index 5c3e569b..00000000 --- a/venv/Lib/site-packages/deepgram/clients/analyze/v1/async_client.py +++ /dev/null @@ -1,346 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from typing import Dict, Union, Optional - -import httpx - -from ....utils import verboselogs -from ....options import DeepgramClientOptions -from ...common import AbstractAsyncRestClient -from ...common import DeepgramError, DeepgramTypeError - -from .helpers import is_buffer_source, is_readstream_source, is_url_source -from .options import ( - AnalyzeOptions, - UrlSource, - FileSource, -) -from .response import AsyncAnalyzeResponse, AnalyzeResponse - - -class AsyncAnalyzeClient(AbstractAsyncRestClient): - """ - A client class for handling text data. - Provides methods for transcribing text from URLs and files. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - super().__init__(config) - - # pylint: disable=too-many-positional-arguments - - async def analyze_url( - self, - source: UrlSource, - options: Optional[Union[AnalyzeOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/read", - **kwargs, - ) -> Union[AsyncAnalyzeResponse, AnalyzeResponse]: - """ - Analyze text from a URL source. - - Args: - source (UrlSource): The URL source of the text to ingest. - options (AnalyzeOptions): Additional options for the ingest (default is None). - endpoint (str): The API endpoint for the ingest (default is "v1/read"). - - Returns: - AnalyzeResponse: An object containing the result. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AsyncAnalyzeClient.analyze_url ENTER") - - if ( - isinstance(options, dict) - and "callback" in options - and options["callback"] is not None - ) or (isinstance(options, AnalyzeOptions) and options.callback is not None): - self._logger.debug("AsyncAnalyzeClient.analyze_url LEAVE") - return await self.analyze_url_callback( - source, - callback=options["callback"], - options=options, - headers=headers, - addons=addons, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - url = f"{self._config.url}/{endpoint}" - if is_url_source(source): - body = source - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("AsyncAnalyzeClient.analyze_url LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, AnalyzeOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AsyncAnalyzeClient.analyze_url LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, AnalyzeOptions): - self._logger.info("AnalyzeOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AnalyzeResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("analyze_url succeeded") - self._logger.debug("AsyncAnalyzeClient.analyze_url LEAVE") - return res - - async def analyze_url_callback( - self, - source: UrlSource, - callback: str, - options: Optional[Union[AnalyzeOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/read", - **kwargs, - ) -> AsyncAnalyzeResponse: - """ - Transcribes audio from a URL source and sends the result to a callback URL. - - Args: - source (UrlSource): The URL source of the audio to transcribe. - callback (str): The callback URL where the transcription results will be sent. - options (AnalyzeOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/read"). - - Returns: - AsyncAnalyzeResponse: An object containing the request_id or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AnalyzeClient.analyze_url_callback ENTER") - - url = f"{self._config.url}/{endpoint}" - if options is None: - options = {} - if isinstance(options, AnalyzeOptions): - options.callback = callback - else: - options["callback"] = callback - if is_url_source(source): - body = source - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("AnalyzeClient.analyze_url_callback LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, AnalyzeOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AnalyzeClient.analyze_url_callback LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, AnalyzeOptions): - self._logger.info("AnalyzeOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AsyncAnalyzeResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("analyze_url_callback succeeded") - self._logger.debug("AnalyzeClient.analyze_url_callback LEAVE") - return res - - async def analyze_text( - self, - source: FileSource, - options: Optional[Union[AnalyzeOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/read", - **kwargs, - ) -> Union[AsyncAnalyzeResponse, AnalyzeResponse]: - """ - Analyze text from a local file source. - - Args: - source (TextSource): The local file source of the text to ingest. - options (AnalyzeOptions): Additional options for the ingest (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/read"). - - Returns: - AnalyzeResponse: An object containing the transcription result or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AsyncAnalyzeClient.analyze_text ENTER") - - if ( - isinstance(options, dict) - and "callback" in options - and options["callback"] is not None - ) or (isinstance(options, AnalyzeOptions) and options.callback is not None): - self._logger.debug("AsyncAnalyzeClient.analyze_text LEAVE") - return await self.analyze_text_callback( - source, - callback=options["callback"], - options=options, - headers=headers, - addons=addons, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - url = f"{self._config.url}/{endpoint}" - if is_buffer_source(source): - body = source["buffer"] # type: ignore - elif is_readstream_source(source): - body = source["stream"] # type: ignore - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("AsyncAnalyzeClient.analyze_text LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, AnalyzeOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AsyncAnalyzeClient.analyze_text LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - if isinstance(options, AnalyzeOptions): - self._logger.info("AnalyzeOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, - options=options, - addons=addons, - headers=headers, - content=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AnalyzeResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("analyze_text succeeded") - self._logger.debug("AsyncAnalyzeClient.analyze_text LEAVE") - return res - - async def analyze_text_callback( - self, - source: FileSource, - callback: str, - options: Optional[Union[AnalyzeOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/read", - **kwargs, - ) -> AsyncAnalyzeResponse: - """ - Transcribes audio from a local file source and sends the result to a callback URL. - - Args: - source (TextSource): The local file source of the audio to transcribe. - callback (str): The callback URL where the transcription results will be sent. - options (AnalyzeOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/read"). - - Returns: - AsyncAnalyzeResponse: An object containing the request_id or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AnalyzeClient.analyze_text_callback ENTER") - - url = f"{self._config.url}/{endpoint}" - if options is None: - options = {} - if isinstance(options, AnalyzeOptions): - options.callback = callback - else: - options["callback"] = callback - if is_buffer_source(source): - body = source["buffer"] # type: ignore - elif is_readstream_source(source): - body = source["stream"] # type: ignore - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("AnalyzeClient.analyze_text_callback LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, AnalyzeOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AnalyzeClient.analyze_text_callback LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - if isinstance(options, AnalyzeOptions): - self._logger.info("AnalyzeOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AsyncAnalyzeResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("analyze_text_callback succeeded") - self._logger.debug("AnalyzeClient.analyze_text_callback LEAVE") - return res - - # pylint: enable=too-many-positional-arguments diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/v1/client.py b/venv/Lib/site-packages/deepgram/clients/analyze/v1/client.py deleted file mode 100644 index a90145ed..00000000 --- a/venv/Lib/site-packages/deepgram/clients/analyze/v1/client.py +++ /dev/null @@ -1,346 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from typing import Dict, Union, Optional - -import httpx - -from ....utils import verboselogs -from ....options import DeepgramClientOptions -from ...common import AbstractSyncRestClient -from ...common import DeepgramError, DeepgramTypeError - -from .helpers import is_buffer_source, is_readstream_source, is_url_source -from .options import ( - AnalyzeOptions, - UrlSource, - FileSource, -) -from .response import AsyncAnalyzeResponse, AnalyzeResponse - - -class AnalyzeClient(AbstractSyncRestClient): - """ - A client class for handling text data. - Provides methods for transcribing text from URLs, files, etc. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - super().__init__(config) - - # pylint: disable=too-many-positional-arguments - - def analyze_url( - self, - source: UrlSource, - options: Optional[Union[AnalyzeOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/read", - **kwargs, - ) -> Union[AnalyzeResponse, AsyncAnalyzeResponse]: - """ - Analyze text from a URL source. - - Args: - source (UrlSource): The URL source of the text to ingest. - options (AnalyzeOptions): Additional options for the ingest (default is None). - endpoint (str): The API endpoint for the ingest (default is "v1/read"). - - Returns: - AnalyzeResponse: An object containing the result. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AnalyzeClient.analyze_url ENTER") - - if ( - isinstance(options, dict) - and "callback" in options - and options["callback"] is not None - ) or (isinstance(options, AnalyzeOptions) and options.callback is not None): - self._logger.debug("AnalyzeClient.analyze_url LEAVE") - return self.analyze_url_callback( - source, - callback=options["callback"], - options=options, - addons=addons, - headers=headers, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - url = f"{self._config.url}/{endpoint}" - if is_url_source(source): - body = source - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("AnalyzeClient.analyze_url LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, AnalyzeOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AnalyzeClient.analyze_url LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, AnalyzeOptions): - self._logger.info("AnalyzeOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AnalyzeResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("analyze_url succeeded") - self._logger.debug("AnalyzeClient.analyze_url LEAVE") - return res - - def analyze_url_callback( - self, - source: UrlSource, - callback: str, - options: Optional[Union[AnalyzeOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/read", - **kwargs, - ) -> AsyncAnalyzeResponse: - """ - Transcribes audio from a URL source and sends the result to a callback URL. - - Args: - source (UrlSource): The URL source of the audio to transcribe. - callback (str): The callback URL where the transcription results will be sent. - options (AnalyzeOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/read"). - - Returns: - AsyncAnalyzeResponse: An object containing the request_id or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AnalyzeClient.analyze_url_callback ENTER") - - url = f"{self._config.url}/{endpoint}" - if options is None: - options = {} - if isinstance(options, AnalyzeOptions): - options.callback = callback - else: - options["callback"] = callback - if is_url_source(source): - body = source - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("AnalyzeClient.analyze_url_callback LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, AnalyzeOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AnalyzeClient.analyze_url_callback LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, AnalyzeOptions): - self._logger.info("AnalyzeOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AsyncAnalyzeResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("analyze_url_callback succeeded") - self._logger.debug("AnalyzeClient.analyze_url_callback LEAVE") - return res - - def analyze_text( - self, - source: FileSource, - options: Optional[Union[AnalyzeOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/read", - **kwargs, - ) -> Union[AnalyzeResponse, AsyncAnalyzeResponse]: - """ - Analyze text from a local file source. - - Args: - source (TextSource): The local file source of the text to ingest. - options (AnalyzeOptions): Additional options for the ingest (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/read"). - - Returns: - AnalyzeResponse: An object containing the transcription result or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AnalyzeClient.analyze_text ENTER") - - if ( - isinstance(options, dict) - and "callback" in options - and options["callback"] is not None - ) or (isinstance(options, AnalyzeOptions) and options.callback is not None): - self._logger.debug("AnalyzeClient.analyze_text LEAVE") - return self.analyze_text_callback( - source, - callback=options["callback"], - options=options, - addons=addons, - headers=headers, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - url = f"{self._config.url}/{endpoint}" - if is_buffer_source(source): - body = source["buffer"] # type: ignore - elif is_readstream_source(source): - body = source["stream"] # type: ignore - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("AnalyzeClient.analyze_text LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, AnalyzeOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AnalyzeClient.analyze_text LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - if isinstance(options, AnalyzeOptions): - self._logger.info("AnalyzeOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, - options=options, - addons=addons, - headers=headers, - content=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AnalyzeResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("analyze_text succeeded") - self._logger.debug("AnalyzeClient.analyze_text LEAVE") - return res - - def analyze_text_callback( - self, - source: FileSource, - callback: str, - options: Optional[Union[AnalyzeOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/read", - **kwargs, - ) -> AsyncAnalyzeResponse: - """ - Transcribes audio from a local file source and sends the result to a callback URL. - - Args: - source (TextSource): The local file source of the audio to transcribe. - callback (str): The callback URL where the transcription results will be sent. - options (AnalyzeOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/read"). - - Returns: - AsyncAnalyzeResponse: An object containing the request_id or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AnalyzeClient.analyze_file_callback ENTER") - - url = f"{self._config.url}/{endpoint}" - if options is None: - options = {} - if isinstance(options, AnalyzeOptions): - options.callback = callback - else: - options["callback"] = callback - if is_buffer_source(source): - body = source["buffer"] # type: ignore - elif is_readstream_source(source): - body = source["stream"] # type: ignore - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("AnalyzeClient.analyze_file_callback LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, AnalyzeOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AnalyzeClient.analyze_file_callback LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - if isinstance(options, AnalyzeOptions): - self._logger.info("AnalyzeOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AsyncAnalyzeResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("analyze_file_callback succeeded") - self._logger.debug("AnalyzeClient.analyze_file_callback LEAVE") - return res - - # pylint: enable=too-many-positional-arguments diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/v1/helpers.py b/venv/Lib/site-packages/deepgram/clients/analyze/v1/helpers.py deleted file mode 100644 index ef6746b3..00000000 --- a/venv/Lib/site-packages/deepgram/clients/analyze/v1/helpers.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .options import AnalyzeSource - - -def is_buffer_source(provided_source: AnalyzeSource) -> bool: - """ - Check if the provided source is a buffer source. - """ - return "buffer" in provided_source - - -def is_readstream_source(provided_source: AnalyzeSource) -> bool: - """ - Check if the provided source is a readstream source. - """ - return "stream" in provided_source - - -def is_url_source(provided_source: AnalyzeSource) -> bool: - """ - Check if the provided source is a url source. - """ - return "url" in provided_source diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/v1/options.py b/venv/Lib/site-packages/deepgram/clients/analyze/v1/options.py deleted file mode 100644 index d6999c66..00000000 --- a/venv/Lib/site-packages/deepgram/clients/analyze/v1/options.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from typing import List, Union, Optional - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from ....utils import verboselogs -from ...common import ( - TextSource, - FileSource, - BufferSource, - StreamSource, - UrlSource, - BaseResponse, -) - - -@dataclass -class AnalyzeOptions(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - Contains all the options for the AnalyzeOptions. - - Reference: - https://developers.deepgram.com/reference/text-intelligence-apis - """ - - callback: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - callback_method: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - custom_intent: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - custom_intent_mode: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - custom_topic: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - custom_topic_mode: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - intents: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - language: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - summarize: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - topics: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def check(self): - """ - Check the options for the AnalyzeOptions. - """ - logger = verboselogs.VerboseLogger(__name__) - logger.addHandler(logging.StreamHandler()) - prev = logger.level - logger.setLevel(verboselogs.ERROR) - - # no op at the moment - - logger.setLevel(prev) - - return True - - -# unique -AnalyzeSource = Union[UrlSource, FileSource] -AnalyzeStreamSource = StreamSource diff --git a/venv/Lib/site-packages/deepgram/clients/analyze/v1/response.py b/venv/Lib/site-packages/deepgram/clients/analyze/v1/response.py deleted file mode 100644 index 5d678cba..00000000 --- a/venv/Lib/site-packages/deepgram/clients/analyze/v1/response.py +++ /dev/null @@ -1,143 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional, Dict, Any - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from ...common import ( - BaseResponse, - Average, - Intent, - Intents, - IntentsInfo, - Segment, - SentimentInfo, - Sentiment, - Sentiments, - SummaryInfo, - Topic, - Topics, - TopicsInfo, -) - - -# Async Analyze Response Types: - - -@dataclass -class AsyncAnalyzeResponse(BaseResponse): - """ - Async Analyze Response - """ - - request_id: str = "" - - -# Analyze Response Types: - - -@dataclass -class Metadata(BaseResponse): - """ - Metadata - """ - - request_id: str = "" - created: str = "" - language: str = "" - intents_info: Optional[IntentsInfo] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment_info: Optional[SentimentInfo] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - summary_info: Optional[SummaryInfo] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - topics_info: Optional[TopicsInfo] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "intents_info" in _dict: - _dict["intents_info"] = IntentsInfo.from_dict(_dict["intents_info"]) - if "sentiment_info" in _dict: - _dict["sentiment_info"] = SentimentInfo.from_dict(_dict["sentiment_info"]) - if "summary_info" in _dict: - _dict["summary_info"] = SummaryInfo.from_dict(_dict["summary_info"]) - if "topics_info" in _dict: - _dict["topics_info"] = TopicsInfo.from_dict(_dict["topics_info"]) - return _dict[key] - - -@dataclass -class Summary(BaseResponse): - """ - Summary - """ - - text: str = "" - - -@dataclass -class Results(BaseResponse): - """ - Results - """ - - summary: Optional[Summary] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiments: Optional[Sentiments] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - topics: Optional[Topics] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - intents: Optional[Intents] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "summary" in _dict: - _dict["summary"] = Summary.from_dict(_dict["summary"]) - if "sentiments" in _dict: - _dict["sentiments"] = Sentiments.from_dict(_dict["sentiments"]) - if "topics" in _dict: - _dict["topics"] = Topics.from_dict(_dict["topics"]) - if "intents" in _dict: - _dict["intents"] = Intents.from_dict(_dict["intents"]) - return _dict[key] - - -# Analyze Response Result: - - -@dataclass -class AnalyzeResponse(BaseResponse): - """ - Analyze Response - """ - - metadata: Optional[Metadata] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - results: Optional[Results] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "metadata" in _dict: - _dict["metadata"] = Metadata.from_dict(_dict["metadata"]) - if "results" in _dict: - _dict["results"] = Results.from_dict(_dict["results"]) - return _dict[key] - - -SyncAnalyzeResponse = AnalyzeResponse diff --git a/venv/Lib/site-packages/deepgram/clients/auth/__init__.py b/venv/Lib/site-packages/deepgram/clients/auth/__init__.py deleted file mode 100644 index d5ac419c..00000000 --- a/venv/Lib/site-packages/deepgram/clients/auth/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .client import AuthRESTClient -from .client import AsyncAuthRESTClient -from .client import ( - GrantTokenResponse, -) \ No newline at end of file diff --git a/venv/Lib/site-packages/deepgram/clients/auth/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/auth/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 141833961786af5c1bce5cc2bc1b105a2785d4bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmX@j%ge<81f?6@Gwc`{7#@Q-Fu(+5eAWOmrZc24q%h_%t znirH>T#%nvoa(2^a*Hh)tgna}Xj~Bsh+qX0D;YimNrqpM&Q>v@#i>QbG2Wh@Au%qg z#n~nK1u2KczG$)vgE>HXz>=3jv7_%#4hTU%40|7*koJSW-En*eh8ySzj^&wQ4fn;&Uu5$p~@{4sp)OOwB6+iU>Ov zSLP*S2n)FvCFYfcv@#i>QbG2Wh@ zAu%qg#n~nK1uPO4oIKhPdfxD_h`i4V+-jErBo7#QvDGWgzQaDO1E X+Q4^1O#cFd@C{Mjiwr_Vyg*d|oi~bL diff --git a/venv/Lib/site-packages/deepgram/clients/auth/client.py b/venv/Lib/site-packages/deepgram/clients/auth/client.py deleted file mode 100644 index 2e74f243..00000000 --- a/venv/Lib/site-packages/deepgram/clients/auth/client.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .v1.client import AuthRESTClient as AuthRESTClientLatest -from .v1.async_client import AsyncAuthRESTClient as AsyncAuthRESTClientLatest -from .v1.response import GrantTokenResponse as GrantTokenResponseLatest - -AuthRESTClient = AuthRESTClientLatest -AsyncAuthRESTClient = AsyncAuthRESTClientLatest -GrantTokenResponse = GrantTokenResponseLatest diff --git a/venv/Lib/site-packages/deepgram/clients/auth/v1/__init__.py b/venv/Lib/site-packages/deepgram/clients/auth/v1/__init__.py deleted file mode 100644 index f449c80a..00000000 --- a/venv/Lib/site-packages/deepgram/clients/auth/v1/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT -from .client import AuthRESTClient -from .async_client import AsyncAuthRESTClient -from .response import ( - GrantTokenResponse, -) \ No newline at end of file diff --git a/venv/Lib/site-packages/deepgram/clients/auth/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/auth/v1/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index de213b97930d0faa0b95bd57a69d1132584b374c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 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 diff --git a/venv/Lib/site-packages/deepgram/clients/auth/v1/__pycache__/response.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/auth/v1/__pycache__/response.cpython-312.pyc deleted file mode 100644 index bed1d3f63b7baf462b4a5750562d141f0bc1a2c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmZ8fy-yTD6rY*>yuBlQB!-{_*H~Qv7b_D&OcWCW5()#&X5(bonL8Ht%bmT8SW#$C zhkt_RX#5}SY$2f#kywz*0>&-vE^A92~5xi;>HKWO=0!55leqe=Gn(q z)4o(ulaw{i3Km36%F<|uBH~S4nn9Yh!_K8T2w~#|lj60IS(-=@j9IG17ze{c0B1-b z4|C*^J?PWZ2ogGc1}EoQACD@zes1*PmdZTnP1u~Q0luv@@6=j%YHPxQT2s{?+s#@z zw~@1?*iDZ_GU@F7mg9o$9tbxdH|wVRhaxE4cAC2d?6WTTqzD66glXb-6o*?V5?3TV zOT(mCsYuEO3j!e}t&*UDQ)xpJ7K>8JX2+snO1jeGqRqNdQ99yX7Q&xtm|QMFpF7QZ zY18TmrKLk@obqlY05>Ro+hvg=gUF(krvat84u{H_+xMWOSIE_Pl$tE^a+*?>BxzA~ zFX6;=m4dFnpdmnX-}>%SE8s7N!vmxh6O-hr$8J(2YM?Qq|hVIh_? z796pTkUke813BVW5QR`CTS}@{?@4PS(P7HfsqJ^cOvyVQ% zxtLx1F*A2> d`bQ_2T-k`!uSp%7pB9G*mZ1h41GQ1n{R6aG`?&xB diff --git a/venv/Lib/site-packages/deepgram/clients/auth/v1/async_client.py b/venv/Lib/site-packages/deepgram/clients/auth/v1/async_client.py deleted file mode 100644 index 43ecb490..00000000 --- a/venv/Lib/site-packages/deepgram/clients/auth/v1/async_client.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging - -from ....utils import verboselogs -from ....options import DeepgramClientOptions -from ...common import AbstractAsyncRestClient -from .response import GrantTokenResponse - - -class AsyncAuthRESTClient(AbstractAsyncRestClient): - """ - A client class for handling authentication endpoints. - Provides method for generating a temporary JWT token. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - self._endpoint = "v1/auth/grant" - super().__init__(config) - - async def grant_token(self): - """ - Generates a temporary JWT with a 30 second TTL. - - Returns: - GrantTokenResponse: An object containing the authentication token and its expiration time. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AuthRestClient.grant_token ENTER") - - url = f"{self._config.url}/{self._endpoint}" - self._logger.info("url: %s", url) - result = await self.post(url, headers={"Authorization": f"Token {self._config.api_key}"}) - self._logger.info("json: %s", result) - res = GrantTokenResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("grant_token succeeded") - self._logger.debug("AuthRestClient.grant_token LEAVE") - return res diff --git a/venv/Lib/site-packages/deepgram/clients/auth/v1/client.py b/venv/Lib/site-packages/deepgram/clients/auth/v1/client.py deleted file mode 100644 index c75815da..00000000 --- a/venv/Lib/site-packages/deepgram/clients/auth/v1/client.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging - -from ....utils import verboselogs -from ....options import DeepgramClientOptions -from ...common import AbstractSyncRestClient -from .response import GrantTokenResponse - - -class AuthRESTClient(AbstractSyncRestClient): - """ - A client class for handling authentication endpoints. - Provides method for generating a temporary JWT token. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - self._endpoint = "v1/auth/grant" - super().__init__(config) - - def grant_token(self): - """ - Generates a temporary JWT with a 30 second TTL. - - Returns: - GrantTokenResponse: An object containing the authentication token and its expiration time. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AuthRestClient.grant_token ENTER") - - url = f"{self._config.url}/{self._endpoint}" - self._logger.info("url: %s", url) - result = self.post(url, headers={"Authorization": f"Token {self._config.api_key}"}) - self._logger.info("json: %s", result) - res = GrantTokenResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("grant_token succeeded") - self._logger.debug("AuthRestClient.grant_token LEAVE") - return res diff --git a/venv/Lib/site-packages/deepgram/clients/auth/v1/response.py b/venv/Lib/site-packages/deepgram/clients/auth/v1/response.py deleted file mode 100644 index cf72f357..00000000 --- a/venv/Lib/site-packages/deepgram/clients/auth/v1/response.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from ...common import ( - BaseResponse, -) - -@dataclass -class GrantTokenResponse(BaseResponse): - """ - The response object for the authentication grant token endpoint. - """ - access_token: str = field( - metadata=dataclass_config(field_name='access_token'), - default="", - ) - expires_in: int = field( - metadata=dataclass_config(field_name='expires_in'), - default=30, - ) \ No newline at end of file diff --git a/venv/Lib/site-packages/deepgram/clients/common/__init__.py b/venv/Lib/site-packages/deepgram/clients/common/__init__.py deleted file mode 100644 index 58c449d9..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/__init__.py +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .v1 import ( - DeepgramError, - DeepgramTypeError, - DeepgramApiError, - DeepgramUnknownApiError, -) - -from .v1 import AbstractAsyncRestClient -from .v1 import AbstractSyncRestClient -from .v1 import AbstractAsyncWebSocketClient -from .v1 import AbstractSyncWebSocketClient - -from .v1 import ( - TextSource as TextSourceLatest, - BufferSource as BufferSourceLatest, - StreamSource as StreamSourceLatest, - FileSource as FileSourceLatest, - UrlSource as UrlSourceLatest, -) - -# shared -from .v1 import ( - BaseResponse as BaseResponseLatest, - ModelInfo as ModelInfoLatest, - Hit as HitLatest, - Search as SearchLatest, -) - -# rest -from .v1 import ( - Average as AverageLatest, - Intent as IntentLatest, - Intents as IntentsLatest, - IntentsInfo as IntentsInfoLatest, - Segment as SegmentLatest, - SentimentInfo as SentimentInfoLatest, - Sentiment as SentimentLatest, - Sentiments as SentimentsLatest, - SummaryInfo as SummaryInfoLatest, - Topic as TopicLatest, - Topics as TopicsLatest, - TopicsInfo as TopicsInfoLatest, -) - -# websocket -from .v1 import ( - OpenResponse as OpenResponseLatest, - CloseResponse as CloseResponseLatest, - ErrorResponse as ErrorResponseLatest, - UnhandledResponse as UnhandledResponseLatest, -) - -# export -UrlSource = UrlSourceLatest -TextSource = TextSourceLatest -BufferSource = BufferSourceLatest -StreamSource = StreamSourceLatest -FileSource = FileSourceLatest - -BaseResponse = BaseResponseLatest -ModelInfo = ModelInfoLatest -Hit = HitLatest -Search = SearchLatest - -Average = AverageLatest -Intent = IntentLatest -Intents = IntentsLatest -IntentsInfo = IntentsInfoLatest -Segment = SegmentLatest -SentimentInfo = SentimentInfoLatest -Sentiment = SentimentLatest -Sentiments = SentimentsLatest -SummaryInfo = SummaryInfoLatest -Topic = TopicLatest -Topics = TopicsLatest -TopicsInfo = TopicsInfoLatest - -OpenResponse = OpenResponseLatest -CloseResponse = CloseResponseLatest -ErrorResponse = ErrorResponseLatest -UnhandledResponse = UnhandledResponseLatest diff --git a/venv/Lib/site-packages/deepgram/clients/common/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/common/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ff399e7d14066f6f6dccb38c837d3a0e1ba0a77c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1798 zcmZXUNpIUm6vv0!Nr_r*%Zt1xjukJ86K8Xa7K+owXp#bzjRLO%3|V@%32R7!q}1xB zZ_!WCLy!F&JrunO1Plb|skZ<|VIZf>42P1E^6>P3zyF)jaNZ36)OC%pr~Ah@m%k+l z`G+UL6O!U)Um@gI(jqOTO{fA24MB*8Axt9>Q8*7V9)+mTVWwjc6FS0l9O6PpnNC1L z=or%~Xfz2aszaJ)AWL(Q7hars1(>4KFhh$lOXpx-@C4%vP@;>lM3-TOuEH8!hdcBx zY|wkKNy~7bZoxL)fn8dG2Xqe}ig79%_XzgsV|YTJ!ZZ3D4itiU$e{)*rXY!F&@l@c zoPq+*z%h#U#59qjuZ39i0Su=rE`_w4~ju`YKp4F`86^=(P1U?`6sU7vS zWBkRfSzWt{Ug|~n{2c8dtGPBdsLZsljW$ZHp4e?)vOP$>XgJ8$+ObRrJ@vKK!uFAQ zZh7Hv4cCj+uwgeZ%PB8j?V;VcKreP=y6mOAxc}>TNh!prcnvQoxAhu}2A6`Xqtw$z zl8vo(DQ(z&Q4>A3I!4ori64i(8c!W=@pXRRL36ZD{jhCKEL#`78M(O=^Ri*K+Sm%v zoAPH~sJCZ_S>x>p4^bXsJj8imw~W{-5B%oYNfx~9cyC`dT-HuI#c_Ueo28)(V{*r( zkroq;H(%lm$C*(dB+dHMPc%dtIZ;09jih-_Rn{h%7kHlXJ0{T-N4jjCWYeO|Z<<6i zqD=NtvLa`>iQY;+D{5t%C7a`{FzPFBnRMp4lNmXZE^wM1QAgqu$GM3kA^9TbNpTz` zS>hz+9}tO_#hl|aBk>By`N_j0ja6=DZU_tirHQh6 zO*XE{_BGkMjl>utEZpXUircKtQWAt4p;iL-U6$yjfjZO|2ih>RI!O6}r*B1?T3~K0 zGYAjW=|SwRRvg5I8VZ$O9wdF0T_5N}Q7onsMxro?`o-h@RY% zXK7~K{b`I}*^mt#!O#K6A$v(IVGeSbhddUbfG)T;o)bkZLCM;AQN{{XtX&YxScR&! zUE$#htXR7!R4cNdYG;tF)aSOI=yeuB#Hf-Y#?BFi! z;vVebKJ4QG98i6D2#0tCM|cd!_y`{1V|Z-yD&ix20#EQMJjE8Y@EJUF*krj?{o64| zY&p8zQ=26|Op`;rf-65AkIC#gYLBdpURkLp}3c|gJjp-I>zY!Mz3 zwh23gUBVt=-#|C!#VxivAoY-NL^wA1jolft_is+W=$|VtRsZGLS+D8oH|FFp+=jL-Xy{c#MPtI|icNOOB-scO>(j7B+S7pxUx9qc9c5=(UzR$ZR#0>6h X*^2uW&$ukZowfFi`Y+|nw%PbUUqO;W diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/abstract_async_rest.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/abstract_async_rest.cpython-312.pyc deleted file mode 100644 index 2ae39d899f524811fdd120eef0b0dba1f0736ee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13934 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 diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/abstract_async_websocket.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/abstract_async_websocket.cpython-312.pyc deleted file mode 100644 index 2d96fb92dfc6b89fae18858e1110d6fef020f516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26918 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 EU$T7oQ2+n{ diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/abstract_sync_websocket.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/abstract_sync_websocket.cpython-312.pyc deleted file mode 100644 index 37873036e84160a07f61f24132e5054b60da77c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25574 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 diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/enums.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/enums.cpython-312.pyc deleted file mode 100644 index 31e0753b37bee7ca9739a1ebacc7d84b30cf7ee5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmX|?p_PkB0+O+GGQLx4)xWs2ErqEA zNFCYwHy|ed1y;r~RJSs*6@@OHxU*B<@b&w=_x1DH&p+C22V|7rMn~Tfz%Kga(j-jF;0VoVk{htlZ=$H%5P!(z6|13$HJIoA;!#-rxZFbn7EB`kfvE7pPQvz zwpy~q)|IrSe1WA@xPJTeu|MOKaese2p8C%yKQ6M|ud*nlgSmW3zoKd7A4Knbc{utg z55nVMPPtDg&F3sg`e7VN8}El%l4NPW+U--h48D^um|ANsYV&+o$|v}vX{LQ?Lud13 zbUHaVHZD5dljo=5xzWA2v(?nLR<)l-mu=k4aC^Ei12vneX<5X!0Vz4bb_le8)=VkEzrc{B5N z=FR)wH~uXi?_^L)56?~ybTIZ9J3-Owjamj8%PhpsvMgI_G|^!P-^99Zo7Ga#`3}C!Sz5`mbSSH&)oh4slc6Oxsbtl~ zSX$4*SJL4nc11}?##utI#!quzoDx=kM2Lcz|Ebe}GIGV{Mb9a?hOivTv&LjW7$x_T zTe$2R94AUc@SNqrkXJCgX>J5&jN$X6sZO#o?0LeuSn{|WqCQ&Ab1AJUZVX6IB!-L$ zSV{I816eL@Smn4=WR?dzNs)18%0Q+*5pw z0yk1-W@CLBdw~zx97}}81a>Q0RhOkA7uBd~Is^oJQo^{s#Q($+$43X9j0mL zEGbP>;!?v{*vx!6l(`_ekeP2rM<+6;xxC~RikaDhWAouD?s}P7?#^b;ITth1@p!Um z*_XgEGLx;}$Do~aV457X3;BG(9h^Nm=zBg@oD)&_%6xC&bGo`zu*)tOll>r`FR(wO z@oSOaqX$>|9z~C??SFeoyWX+Z*T1CQh}B>Qv+GX5Ho1`8_%U>rS((j{x>ejF_suli zw>5f;-B!n0B{a4f8Zs&&0r+6PuN1Kd+7iEIh&ae<1U%&l)0{uheg;y%26JkMK`gMf zp5Eoe_lcW_SH4*BelGu5UU66VCRd|Lf#s)S091T zWeYZ_RWMJ^6Z>%+@%p{lJeM=giXvj5rG1{FeNrHh2*W__5QyiC>`6%1qw8I&e&mk& zltJ~ZQ_)kjADU~!v_?UPVtFxi?hD*AF<0bt&GYvO2>%kH0d~=hBs5P5%SEIS%wHa0 zDF9wBSPk&5!21!Hn*#v)_eVH+eVY>-SUG|#cE-x_Caloi{{L7J-MH%>6d3VM0HN@l zKeW@v2_Wy_ngb{h1)>+ln;@EF*FYtTK5XD2{mH0m3DE{|eFP)h2qcUY0(7NKYD6R2 zVjO5hZ=sP$wL94AaM7VSwN3-vcMsJTDj9HGV@4v|a9J$4l4FGCEidtENCtUIdX`s` z%{2AZ#KieP4XM6hJ4An%9dDYL3V6?_GM}l?NI^JLj%(#iO59}3NYY8`)E7*sbD%eE zdB$Z6xRqGfH{>%+*x!(i+!GW`E%>7cM;q;F|44g4j9auvB-pTBR$(lNiaI4?#3jNa z0+pXYDZRgoU0he~3eMsmHlb6_r!hgZj^k9yuV@+Fv(SXmMyLnz(}3s)Fk2=;Y^Sqh z1kv6%pxQ&Mc0IP%e_~1dBYJo{VlhLIwfn5?1mcI3jlUqA4Ex%%+xgZ!^2SND#r zMn~x631w{Oq=45bPz=CN9tA;!7SW?mdUQQ`M_p%7-5r05)w3=|Kco0r1J|@<4Gk1n zYIs50vPOH(z^7+x&Inigf+Jt>UzWku&p+NhZv;d}hkLGoFBH3VPjMV1-(j9 zdL9~Wm<>_$L9txf_lXT03qDvbe1_#5P|1ZMW9|?ipAk zF>qUed*|4rXku-DvK_iNVy^(QA_3bI@1xielt*@n&;Xm~aODXUyVEc_T%h<2ep`qO z!xOSw!zbiAg9;G`)w9?Z;&9Cv{6p(#y!HI&r~!I{Fj=kCzm3o8&FH881Nd|CA$0M* xEr&p?tBRs*#JZH!&Cv}8)y7*ORyykK9_5U3b8drSz42Z*$kqPTQ-%#X*I)QeU{3%5 diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/helpers.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index d89c8b97c4cb591e9230f4185ab29f9bba0800ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2348 zcma)7O-vg{6rT0|cx~enYy&0`VoHhZlz>R1mgcXeknr0ig+x^?C&+jwU|4&doizls zmK>>4iIl2HIn-4SwbUMhf)sk=R7GkJk$S-~lHDm%Q}xsv2}qT4>de|}lZZo~<#})3 zdwxGNZ$AI#blL%-umt4@X$Oat$&{P2q zi%C^ZgjEEwok+=eNfr$@c?)41(ZYB{kzl}rxq)az!{X(H7FFV5`4VP{6$`{U977Qc z4Ou4I2}{1aKQpuwjjSco!K1RAvS`%9Al)*{nR1m^JXxK&^R>>*lJk0#9+edX;QA5( zAyPw%OYu6NX71TEo9V6dnsMrM|EOH2+N3$Fb~D#(t*NVWGe?SlE#e{5qZ0AB&XYRc zAvFj(JL@*>RjzZ>mHhj%3ug9dhBN_mR_D$Ve(x9u?#cW7_^MyUN9TZ6Z)VV0iCMFl z^`xxiTpLYWmFw0u){Hbu2jvZ_^egJ(1R0X0ckMnxeTf8&OUQRC3DrfPap_QlD)MQH zFYLQEK4y4b4KSFO6a;Tk!SD?@ReIAZPZxUTn2%~OhOj+~qH&~!;}M9tDMgVni!>GU zva$eG%*j!tVRjm7Djg>*PO2~=hl#I1bY$`ZHkID6O0O2%jggfm=|t8TX(vl_iP<^0 zi23=joFrLjV(dvKq_761$&w$*8I4b4hp8nY5DiS5Ht5y${?nmri1Zp79Ui_K8h~g{ zQxc(hB^rT!(=e`u=3#t3G!~r-A(G)lA{?0uPeT-vAWTe?*U=r3qr?q$N0eAhiFeQU zbk9IJK_Ye~7O^{Q9BsLrQrYTJQh|ef(O+aqgFO+r4rki$A4!jFyPGp3g_h1-OK0AF zB0cup>fE$86%YHq@BFUwLDx%Qv-R8^S?*t{FV=dNQ^iBx?b@bH$B&+^+GE?^=FEi$ z_JY@+^ZN7N<12jCR%~f|37EPo%*sH~f2!c`&G~yb+#6GQf8VbYPd&eU@nkgTzq~S* zbwBfTykM#4o&b&o9@hU5%#N+pWG0>+YTI#>?0XHMr6U{K@N6}o-{ibSS4+Xwk#luy zc7D9+>d3qL3a+7?Ybfs;NsksC4VzrUE@_fn@l+T=;|fJGY6&G8*It7akvJK!A{($G zF$6>^&@#IpfM_^El0^qvNhIrmAX5e*)i1F+mmOM>~h4z#mXduku( z9ax$5|5k>axc=lo77(#Tg_w_pwa5&%4-a0tJbt0SZ{h;BmfydDCRm6=O;#c* z{o}v_ip;|B6T$f%ai8KTHidgN*=b@N6_ z4Nhvx(4bFzdQ82u{G<>H3pW4w(FWQ{(N0~dZg%VEI30{Q+z*#CoPNGqD2*d+1+3wc52y#hsINOj8!^0K(QIdz2aR{{uVpBf0

I+Wv*{5S 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 F{}-GyM`Hj0 diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/websocket_events.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/common/v1/__pycache__/websocket_events.cpython-312.pyc deleted file mode 100644 index 475240abf5f7722428a9f45dcfb7cd14ad8d1d04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736 zcmYk4&ubGw6vt=wN3w~QQcGiz9##Y)2Myv)i%{B7f>MPTD$Bw!*?CQt?#{%SO(dRj zP{`3+{|52o-{G+y%3eKrtHfSHXMY08MrZj zGfh?w&UF&FSRcbOMCQ?Kd&HqgXnwOhzGALq$3xYSi9TD;SI zh5$vFp~&g!%8|>Q$O9iL%-PjZ=0;UZt|c!DEP0mvsAkExREg@ADu$-jW>BslL%%DM zQz+UK;D!3wt%uso|A3?gsIVA9I1);w{R~2|NqUVIVM2M>hfqQS=>%AKB1LYq4**63 zN%L^;O~+O%z1Jh)rN5sE1!eV^N}lpT>9?g6vaI#^kaCs*J8Ir4141~>fsnFJNG{ko zGyZKt-j8Xvic|?c^#S_Ij*%=!^msIt=2loSo2%zqKBGU5;|G@k+PFJAm_Io88W$Vev-bSyxwn0> zxidSQch9|@|JJs`S!b?(dZD~?Q|+kfmOcf2LekulLZ1a-*GY+TITeB0%w=F#Fcy!NTw9XrX1wVT%eeWgmKwd1I^R|-PDtL z&d&!0vk1Q8s(vXbn`MbmO(qM()wYPM)AC*}J$*0xh*`<-Jm7^h@R1BJ0$w@;uV#1| z@X8tZXlKNzKEtmWicl6k9*g|FcI-u=?F(hzb7GOZ6?P0+6kI#D9pC0$s4b8Bt|1A{ ziNcn*@=U`0k|=*{bNU(O?I`5b$$lYuWxqxGb(roFN=(Tmro05?nK@TB6{=Fr&CLSZ zQ4Cd-@3m<-IBD~Gu?_=6^}CdFdxh3pEDGxJDy`2`+FoIHQ2*4o<5t9iWUU}Vi92oD zc&v-OWrcP?ElU(FD~Q~6AN{greZ6k`8KPU38#$K6s*r)m@tBFKW!YgE#Ws?`E$cDq z14dq~&VAHe;*{~`o!hrRZ_ZP`7Dw&oM&vp4)(Q>d<^~Nnnv33YlY23}*0!BB$e1_X zEYlgs_h1>HaiSoI!kLZhGY{x8kDN6cTP$O5y4_(F_*`N}!Re2K`JOyiWHsN*ld)QN ze*2BB2D>;|^uPG7%=yvr)otELNK9h?m2ozLi6DIqhWWCW&?MPiLhqGsU@KYscut(oGh0l56lM3qmM0TmwXGIW1ZZG za%vIjvML>bA6GY_3dEUwQp`tp2&215WfMdI3Cs|`>*ZC`$jjt2RKQm-#Grd zOQD=~m$vM6AId$Tv5mDY^bMPNb{HEKHU`@nDvs6ATtG90W&+J5nmQW1ZgOQP!$5Cx2rZrs6(wy4Ab4fF!0XkMU79rhL%C1jl|avB@DjTI E27xKvF8}}l diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_async_rest.py b/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_async_rest.py deleted file mode 100644 index 3c0d8056..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_async_rest.py +++ /dev/null @@ -1,383 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import json -import io -from typing import Dict, Optional, List, Union - -import httpx - -from .helpers import append_query_params -from ....options import DeepgramClientOptions -from .errors import DeepgramError, DeepgramApiError, DeepgramUnknownApiError - - -class AbstractAsyncRestClient: - """ - An abstract base class for a RESTful HTTP client. - - This class provides common HTTP methods (GET, POST, PUT, PATCH, DELETE) for making asynchronous HTTP requests. - It handles error responses and provides basic JSON parsing. - - Args: - url (Dict): The base URL for the RESTful API, including any path segments. - headers (Optional[Dict[str, Any]]): Optional HTTP headers to include in requests. - params (Optional[Dict[str, Any]]): Optional query parameters to include in requests. - timeout (Optional[httpx.Timeout]): Optional timeout configuration for requests. - - Exceptions: - DeepgramApiError: Raised for known API errors. - DeepgramUnknownApiError: Raised for unknown API errors. - """ - - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - if config is None: - raise DeepgramError("Config are required") - self._config = config - - # pylint: disable=too-many-positional-arguments - - async def get( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - """ - Make a GET request to the specified URL. - """ - return await self._handle_request( - "GET", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - async def post_raw( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> httpx.Response: - """ - Make a POST request to the specified URL and return response in raw bytes. - """ - return await self._handle_request_raw( - "POST", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - async def post_memory( - self, - url: str, - file_result: List, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> Dict[str, Union[str, io.BytesIO]]: - """ - Make a POST request to the specified URL and return response in memory. - """ - return await self._handle_request_memory( - "POST", - url, - file_result=file_result, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - async def post( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - """ - Make a POST request to the specified URL. - """ - return await self._handle_request( - "POST", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - async def put( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - """ - Make a PUT request to the specified URL. - """ - return await self._handle_request( - "PUT", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - async def patch( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - """ - Make a PATCH request to the specified URL. - """ - return await self._handle_request( - "PATCH", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - async def delete( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - """ - Make a DELETE request to the specified URL. - """ - return await self._handle_request( - "DELETE", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - # pylint: disable-msg=too-many-locals,too-many-branches,too-many-locals - async def _handle_request( - self, - method: str, - url: str, - params: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - _url = url - if params is not None: - _url = append_query_params(_url, params) - if addons is not None: - _url = append_query_params(_url, addons) - _headers = self._config.headers - if headers is not None: - _headers.update(headers) - if timeout is None: - timeout = httpx.Timeout(30.0, connect=10.0) - - try: - transport = kwargs.get("transport") - async with httpx.AsyncClient( - timeout=timeout, transport=transport - ) as client: - if transport: - kwargs.pop("transport") - response = await client.request( - method, _url, headers=_headers, **kwargs - ) - response.raise_for_status() - - # throw exception if response is None or response.text is None - if response is None or response.text is None: - raise DeepgramError( - "Response is not available yet. Please try again later." - ) - - return response.text - - except httpx.HTTPError as e1: - if isinstance(e1, httpx.HTTPStatusError): - status_code = e1.response.status_code or 500 - try: - json_object = json.loads(e1.response.text) - raise DeepgramApiError( - json_object.get("err_msg"), - str(status_code), - json.dumps(json_object), - ) from e1 - except json.decoder.JSONDecodeError as e2: - raise DeepgramUnknownApiError(e2.msg, str(status_code)) from e2 - except ValueError as e2: - raise DeepgramUnknownApiError(str(e2), str(status_code)) from e2 - else: - raise # pylint: disable-msg=try-except-raise - except Exception: # pylint: disable-msg=try-except-raise - raise - - # pylint: enable-msg=too-many-locals,too-many-branches,too-many-locals - - # pylint: disable-msg=too-many-locals,too-many-branches - async def _handle_request_memory( - self, - method: str, - url: str, - file_result: List, - params: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> Dict[str, Union[str, io.BytesIO]]: - _url = url - if params is not None: - _url = append_query_params(_url, params) - if addons is not None: - _url = append_query_params(_url, addons) - _headers = self._config.headers - if headers is not None: - _headers.update(headers) - if timeout is None: - timeout = httpx.Timeout(30.0, connect=10.0) - - try: - transport = kwargs.get("transport") - async with httpx.AsyncClient( - timeout=timeout, transport=transport - ) as client: - if transport: - kwargs.pop("transport") - response = await client.request( - method, _url, headers=_headers, **kwargs - ) - response.raise_for_status() - - ret: Dict[str, Union[str, io.BytesIO]] = {} - for item in file_result: - if item in response.headers: - ret[item] = response.headers[item] - continue - tmp_item = f"dg-{item}" - if tmp_item in response.headers: - ret[item] = response.headers[tmp_item] - continue - tmp_item = f"x-dg-{item}" - if tmp_item in response.headers: - ret[item] = response.headers[tmp_item] - ret["stream"] = io.BytesIO(response.content) - return ret - - except httpx.HTTPError as e1: - if isinstance(e1, httpx.HTTPStatusError): - status_code = e1.response.status_code or 500 - try: - json_object = json.loads(e1.response.text) - raise DeepgramApiError( - json_object.get("err_msg"), - str(status_code), - json.dumps(json_object), - ) from e1 - except json.decoder.JSONDecodeError as e2: - raise DeepgramUnknownApiError(e2.msg, str(status_code)) from e2 - except ValueError as e2: - raise DeepgramUnknownApiError(str(e2), str(status_code)) from e2 - else: - raise # pylint: disable-msg=try-except-raise - except Exception: # pylint: disable-msg=try-except-raise - raise - - # pylint: enable-msg=too-many-locals,too-many-branches - - # pylint: disable-msg=too-many-locals,too-many-branches - async def _handle_request_raw( - self, - method: str, - url: str, - params: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> httpx.Response: - _url = url - if params is not None: - _url = append_query_params(_url, params) - if addons is not None: - _url = append_query_params(_url, addons) - _headers = self._config.headers - if headers is not None: - _headers.update(headers) - if timeout is None: - timeout = httpx.Timeout(30.0, connect=10.0) - - try: - transport = kwargs.get("transport") - client = httpx.AsyncClient(timeout=timeout, transport=transport) - if transport: - kwargs.pop("transport") - req = client.build_request(method, _url, headers=_headers, **kwargs) - return await client.send(req, stream=True) - - except httpx.HTTPError as e1: - if isinstance(e1, httpx.HTTPStatusError): - status_code = e1.response.status_code or 500 - try: - json_object = json.loads(e1.response.text) - raise DeepgramApiError( - json_object.get("err_msg"), - str(status_code), - json.dumps(json_object), - ) from e1 - except json.decoder.JSONDecodeError as e2: - raise DeepgramUnknownApiError(e2.msg, str(status_code)) from e2 - except ValueError as e2: - raise DeepgramUnknownApiError(str(e2), str(status_code)) from e2 - else: - raise # pylint: disable-msg=try-except-raise - except Exception: # pylint: disable-msg=try-except-raise - raise - - # pylint: enable-msg=too-many-locals,too-many-branches - # pylint: enable=too-many-positional-arguments diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_async_websocket.py b/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_async_websocket.py deleted file mode 100644 index 5f374ae3..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_async_websocket.py +++ /dev/null @@ -1,537 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT -import asyncio -import json -import logging -from typing import Dict, Union, Optional, cast, Any, Callable -from datetime import datetime -import threading -from abc import ABC, abstractmethod - -import websockets - -try: - # Websockets versions >= 13 - from websockets.asyncio.client import connect, ClientConnection - - WS_ADDITIONAL_HEADERS_KEY = "additional_headers" -except ImportError: - # Backward compatibility with websockets versions 12 - from websockets.legacy.client import ( # type: ignore - connect, - WebSocketClientProtocol as ClientConnection, - ) - - WS_ADDITIONAL_HEADERS_KEY = "extra_headers" - -from ....audio import Speaker -from ....utils import verboselogs -from ....options import DeepgramClientOptions -from .helpers import convert_to_websocket_url, append_query_params -from .errors import DeepgramError - -from .websocket_response import ( - OpenResponse, - CloseResponse, - ErrorResponse, -) -from .websocket_events import WebSocketEvents - - -ONE_SECOND = 1 -HALF_SECOND = 0.5 -DEEPGRAM_INTERVAL = 5 -PING_INTERVAL = 20 - - -class AbstractAsyncWebSocketClient(ABC): # pylint: disable=too-many-instance-attributes - """ - Abstract class for using WebSockets. - - This class provides methods to establish a WebSocket connection generically for - use in all WebSocket clients. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - _websocket_url: str - - _socket: Optional[ClientConnection] = None - - _listen_thread: Union[asyncio.Task, None] - _delegate: Optional[Speaker] = None - - _kwargs: Optional[Dict] = None - _addons: Optional[Dict] = None - _options: Optional[Dict] = None - _headers: Optional[Dict] = None - - def __init__(self, config: DeepgramClientOptions, endpoint: str = ""): - if config is None: - raise DeepgramError("Config is required") - if endpoint == "": - raise DeepgramError("endpoint is required") - - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - - self._config = config - self._endpoint = endpoint - - self._listen_thread = None - - # events - self._exit_event = asyncio.Event() - - # set websocket url - self._websocket_url = convert_to_websocket_url(self._config.url, self._endpoint) - - def delegate_listening(self, delegate: Speaker) -> None: - """ - Delegate the listening thread to the Speaker object. - """ - self._delegate = delegate - - # pylint: disable=too-many-branches,too-many-statements - async def start( - self, - options: Optional[Any] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> bool: - """ - Starts the WebSocket connection for live transcription. - """ - self._logger.debug("AbstractAsyncWebSocketClient.start ENTER") - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - self._logger.info("kwargs: %s", kwargs) - - self._addons = addons - self._headers = headers - - # set kwargs - if kwargs is not None: - self._kwargs = kwargs - else: - self._kwargs = {} - - if not isinstance(options, dict): - self._logger.error("options is not a dict") - self._logger.debug("AbstractSyncWebSocketClient.start LEAVE") - return False - - # set options - if options is not None: - self._options = options - else: - self._options = {} - - combined_options = self._options.copy() - if self._addons is not None: - self._logger.info("merging addons to options") - combined_options.update(self._addons) - self._logger.info("new options: %s", combined_options) - self._logger.debug("combined_options: %s", combined_options) - - combined_headers = self._config.headers.copy() - if self._headers is not None: - self._logger.info("merging headers to options") - combined_headers.update(self._headers) - self._logger.info("new headers: %s", combined_headers) - self._logger.debug("combined_headers: %s", combined_headers) - - url_with_params = append_query_params(self._websocket_url, combined_options) - - try: - ws_connect_kwargs: Dict = { - "ping_interval": PING_INTERVAL, - WS_ADDITIONAL_HEADERS_KEY: combined_headers, - } - - self._socket = await connect( - url_with_params, - **ws_connect_kwargs, - ) - self._exit_event.clear() - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # delegate the listening thread to external object - if self._delegate is not None: - self._logger.notice("_delegate is enabled. this is usually the speaker") - self._delegate.set_pull_callback(self._socket.recv) - self._delegate.set_push_callback(self._process_message) - else: - self._logger.notice("create _listening thread") - self._listen_thread = asyncio.create_task(self._listening()) - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # push open event - await self._emit( - WebSocketEvents(WebSocketEvents.Open), - OpenResponse(type=WebSocketEvents.Open), - ) - - self._logger.notice("start succeeded") - self._logger.debug("AbstractAsyncWebSocketClient.start LEAVE") - return True - except websockets.exceptions.ConnectionClosed as e: - self._logger.error( - "ConnectionClosed in AbstractAsyncWebSocketClient.start: %s", e - ) - self._logger.debug("AbstractAsyncWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect", False): - raise - return False - except websockets.exceptions.WebSocketException as e: - self._logger.error( - "WebSocketException in AbstractAsyncWebSocketClient.start: %s", e - ) - self._logger.debug("AbstractAsyncWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect", False): - raise - return False - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "WebSocketException in AbstractAsyncWebSocketClient.start: %s", e - ) - self._logger.debug("AbstractAsyncWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect", False): - raise - return False - - async def is_connected(self) -> bool: - """ - Returns the connection status of the WebSocket. - """ - return self._socket is not None - - # pylint: enable=too-many-branches,too-many-statements - - @abstractmethod - def on(self, event: WebSocketEvents, handler: Callable) -> None: - """ - Registers an event handler for the WebSocket connection. - """ - raise NotImplementedError("no on method") - - @abstractmethod - async def _emit(self, event: WebSocketEvents, *args, **kwargs) -> None: - """ - Emits an event to the WebSocket connection. - """ - raise NotImplementedError("no _emit method") - - # pylint: disable=too-many-return-statements,too-many-statements,too-many-locals,too-many-branches - async def _listening(self) -> None: - """ - Listens for messages from the WebSocket connection. - """ - self._logger.debug("AbstractAsyncWebSocketClient._listening ENTER") - - while True: - try: - if self._exit_event.is_set(): - self._logger.notice("_listening exiting gracefully") - self._logger.debug("AbstractAsyncWebSocketClient._listening LEAVE") - return - - if self._socket is None: - self._logger.warning("socket is empty") - self._logger.debug("AbstractAsyncWebSocketClient._listening LEAVE") - return - - message = await self._socket.recv() - - if message is None: - self._logger.info("message is None") - continue - - self._logger.spam("data type: %s", type(message)) - - if isinstance(message, bytes): - self._logger.debug("Binary data received") - await self._process_binary(message) - else: - self._logger.debug("Text data received") - await self._process_text(message) - - self._logger.notice("_listening Succeeded") - self._logger.debug("AbstractAsyncWebSocketClient._listening LEAVE") - - except websockets.exceptions.ConnectionClosedOK as e: - # signal exit and close - await self._signal_exit() - - self._logger.notice(f"_listening({e.code}) exiting gracefully") - self._logger.debug("AbstractAsyncWebSocketClient._listening LEAVE") - return - - except websockets.exceptions.ConnectionClosed as e: - if e.code in [1000, 1001]: - # signal exit and close - await self._signal_exit() - - self._logger.notice(f"_listening({e.code}) exiting gracefully") - self._logger.debug("AbstractAsyncWebSocketClient._listening LEAVE") - return - - # we need to explicitly call self._signal_exit() here because we are hanging on a recv() - # note: this is different than the speak websocket client - self._logger.error( - "ConnectionClosed in AbstractAsyncWebSocketClient._listening with code %s: %s", - e.code, - e.reason, - ) - cc_error: ErrorResponse = ErrorResponse( - "ConnectionClosed in AbstractAsyncWebSocketClient._listening", - f"{e}", - "ConnectionClosed", - ) - await self._emit( - WebSocketEvents(WebSocketEvents.Error), - error=cc_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - await self._signal_exit() - - self._logger.debug("AbstractAsyncWebSocketClient._listening LEAVE") - - if self._config.options.get("termination_exception_connect") is True: - raise - return - - except websockets.exceptions.WebSocketException as e: - self._logger.error( - "WebSocketException in AbstractAsyncWebSocketClient._listening: %s", - e, - ) - ws_error: ErrorResponse = ErrorResponse( - "WebSocketException in AbstractAsyncWebSocketClient._listening", - f"{e}", - "WebSocketException", - ) - await self._emit( - WebSocketEvents(WebSocketEvents.Error), - error=ws_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - await self._signal_exit() - - self._logger.debug("AbstractAsyncWebSocketClient._listening LEAVE") - - if self._config.options.get("termination_exception_connect") is True: - raise - return - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in AbstractAsyncWebSocketClient._listening: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in AbstractAsyncWebSocketClient._listening", - f"{e}", - "Exception", - ) - await self._emit( - WebSocketEvents(WebSocketEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - await self._signal_exit() - - self._logger.debug("AbstractAsyncWebSocketClient._listening LEAVE") - - if self._config.options.get("termination_exception_connect") is True: - raise - return - - # pylint: enable=too-many-return-statements,too-many-statements,too-many-locals,too-many-branches - - async def _process_message(self, message: Union[str, bytes]) -> None: - if isinstance(message, bytes): - await self._process_binary(message) - else: - await self._process_text(message) - - @abstractmethod - async def _process_text(self, message: str) -> None: - raise NotImplementedError("no _process_text method") - - @abstractmethod - async def _process_binary(self, message: bytes) -> None: - raise NotImplementedError("no _process_binary method") - - @abstractmethod - async def _close_message(self) -> bool: - raise NotImplementedError("no _close_message method") - - # pylint: disable=too-many-return-statements,too-many-branches - - async def send(self, data: Union[str, bytes]) -> bool: - """ - Sends data over the WebSocket connection. - """ - self._logger.spam("AbstractAsyncWebSocketClient.send ENTER") - - if self._exit_event.is_set(): - self._logger.notice("send exiting gracefully") - self._logger.debug("AbstractAsyncWebSocketClient.send LEAVE") - return False - - if not await self.is_connected(): - self._logger.notice("is_connected is False") - self._logger.debug("AbstractAsyncWebSocketClient.send LEAVE") - return False - - if self._socket is not None: - try: - await self._socket.send(data) - except websockets.exceptions.ConnectionClosedOK as e: - self._logger.notice(f"send() exiting gracefully: {e.code}") - self._logger.debug("AbstractAsyncWebSocketClient.send LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return True - except websockets.exceptions.ConnectionClosed as e: - if e.code in [1000, 1001]: - self._logger.notice(f"send({e.code}) exiting gracefully") - self._logger.debug("AbstractAsyncWebSocketClient.send LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return True - - self._logger.error("send() failed - ConnectionClosed: %s", str(e)) - self._logger.spam("AbstractAsyncWebSocketClient.send LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return False - except websockets.exceptions.WebSocketException as e: - self._logger.error("send() failed - WebSocketException: %s", str(e)) - self._logger.spam("AbstractAsyncWebSocketClient.send LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return False - except Exception as e: # pylint: disable=broad-except - self._logger.error("send() failed - Exception: %s", str(e)) - self._logger.spam("AbstractAsyncWebSocketClient.send LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return False - - self._logger.spam("send() succeeded") - self._logger.spam("AbstractAsyncWebSocketClient.send LEAVE") - return True - - self._logger.spam("send() failed. socket is None") - self._logger.spam("AbstractAsyncWebSocketClient.send LEAVE") - return False - - # pylint: enable=too-many-return-statements,too-many-branches - - async def finish(self) -> bool: - """ - Closes the WebSocket connection gracefully. - """ - self._logger.debug("AbstractAsyncWebSocketClient.finish ENTER") - - # signal exit - await self._signal_exit() - - # stop the threads - self._logger.verbose("cancelling tasks...") - try: - # Before cancelling, check if the tasks were created - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - tasks = [] - if self._listen_thread is not None: - self._listen_thread.cancel() - tasks.append(self._listen_thread) - self._logger.notice("processing _listen_thread cancel...") - - # Use asyncio.gather to wait for tasks to be cancelled - await asyncio.gather(*filter(None, tasks)) - self._logger.notice("threads joined") - - # debug the threads - for thread in threading.enumerate(): - if thread is not None and thread.name is not None: - self._logger.debug("after running thread: %s", thread.name) - else: - self._logger.debug("after running thread: unknown_thread_name") - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("finish succeeded") - self._logger.spam("AbstractAsyncWebSocketClient.finish LEAVE") - return True - - except asyncio.CancelledError as e: - self._logger.error("tasks cancelled error: %s", e) - self._logger.debug("AbstractAsyncWebSocketClient.finish LEAVE") - return True - - async def _signal_exit(self) -> None: - # send close event - self._logger.verbose("closing socket...") - if self._socket is not None: - self._logger.verbose("send Close...") - try: - # if the socket connection is closed, the following line might throw an error - await self._close_message() - except websockets.exceptions.ConnectionClosedOK as e: - self._logger.notice("_signal_exit - ConnectionClosedOK: %s", e.code) - except websockets.exceptions.ConnectionClosed as e: - self._logger.error("_signal_exit - ConnectionClosed: %s", e.code) - except websockets.exceptions.WebSocketException as e: - self._logger.error("_signal_exit - WebSocketException: %s", str(e)) - except Exception as e: # pylint: disable=broad-except - self._logger.error("_signal_exit - Exception: %s", str(e)) - - # push close event - try: - await self._emit( - WebSocketEvents(WebSocketEvents.Close), - close=CloseResponse(type=WebSocketEvents.Close), - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - except Exception as e: # pylint: disable=broad-except - self._logger.error("_emit - Exception: %s", e) - - # wait for task to send - await asyncio.sleep(0.5) - - # signal exit - self._exit_event.set() - - # closes the WebSocket connection gracefully - self._logger.verbose("clean up socket...") - if self._socket is not None: - self._logger.verbose("socket.wait_closed...") - try: - await self._socket.close() - except websockets.exceptions.WebSocketException as e: - self._logger.error("socket.wait_closed failed: %s", e) - - self._socket = None diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_sync_rest.py b/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_sync_rest.py deleted file mode 100644 index cbfd40ef..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_sync_rest.py +++ /dev/null @@ -1,375 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import json -import io -from typing import Dict, Optional, List, Union - -import httpx - -from .helpers import append_query_params -from ....options import DeepgramClientOptions -from .errors import DeepgramError, DeepgramApiError, DeepgramUnknownApiError - - -class AbstractSyncRestClient: - """ - An abstract base class for a RESTful HTTP client. - - This class provides common HTTP methods (GET, POST, PUT, PATCH, DELETE) for making asynchronous HTTP requests. - It handles error responses and provides basic JSON parsing. - - Args: - url (Dict): The base URL for the RESTful API, including any path segments. - headers (Optional[Dict[str, Any]]): Optional HTTP headers to include in requests. - params (Optional[Dict[str, Any]]): Optional query parameters to include in requests. - timeout (Optional[httpx.Timeout]): Optional timeout configuration for requests. - - Exceptions: - DeepgramApiError: Raised for known API errors. - DeepgramUnknownApiError: Raised for unknown API errors. - """ - - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - if config is None: - raise DeepgramError("Config are required") - self._config = config - - # pylint: disable=too-many-positional-arguments - - def get( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - """ - Make a GET request to the specified URL. - """ - return self._handle_request( - "GET", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - def post_raw( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> httpx.Response: - """ - Make a POST request to the specified URL and return response in raw bytes. - """ - return self._handle_request_raw( - "POST", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - def post_memory( - self, - url: str, - file_result: List, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> Dict[str, Union[str, io.BytesIO]]: - """ - Make a POST request to the specified URL and return response in memory. - """ - return self._handle_request_memory( - "POST", - url, - file_result=file_result, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - def post( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - """ - Make a POST request to the specified URL. - """ - return self._handle_request( - "POST", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - def put( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - """ - Make a PUT request to the specified URL. - """ - return self._handle_request( - "PUT", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - def patch( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - """ - Make a PATCH request to the specified URL. - """ - return self._handle_request( - "PATCH", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - def delete( - self, - url: str, - options: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - """ - Make a DELETE request to the specified URL. - """ - return self._handle_request( - "DELETE", - url, - params=options, - addons=addons, - headers=headers, - timeout=timeout, - **kwargs, - ) - - # pylint: disable-msg=too-many-locals,too-many-branches - def _handle_request( - self, - method: str, - url: str, - params: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> str: - _url = url - if params is not None: - _url = append_query_params(_url, params) - if addons is not None: - _url = append_query_params(_url, addons) - _headers = self._config.headers - if headers is not None: - _headers.update(headers) - if timeout is None: - timeout = httpx.Timeout(30.0, connect=10.0) - - try: - transport = kwargs.get("transport") - with httpx.Client(timeout=timeout, transport=transport) as client: - if transport: - kwargs.pop("transport") - response = client.request(method, _url, headers=_headers, **kwargs) - response.raise_for_status() - - # throw exception if response is None or response.text is None - if response is None or response.text is None: - raise DeepgramError( - "Response is not available yet. Please try again later." - ) - - return response.text - - except httpx.HTTPError as e1: - if isinstance(e1, httpx.HTTPStatusError): - status_code = e1.response.status_code or 500 - try: - json_object = json.loads(e1.response.text) - raise DeepgramApiError( - json_object.get("err_msg"), - str(status_code), - json.dumps(json_object), - ) from e1 - except json.decoder.JSONDecodeError as e2: - raise DeepgramUnknownApiError(e2.msg, str(status_code)) from e2 - except ValueError as e2: - raise DeepgramUnknownApiError(str(e2), str(status_code)) from e2 - else: - raise # pylint: disable-msg=try-except-raise - except Exception: # pylint: disable-msg=try-except-raise - raise - - # pylint: enable-msg=too-many-locals,too-many-branches - - # pylint: disable-msg=too-many-branches,too-many-locals - def _handle_request_memory( - self, - method: str, - url: str, - file_result: List, - params: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> Dict[str, Union[str, io.BytesIO]]: - _url = url - if params is not None: - _url = append_query_params(_url, params) - if addons is not None: - _url = append_query_params(_url, addons) - _headers = self._config.headers - if headers is not None: - _headers.update(headers) - if timeout is None: - timeout = httpx.Timeout(30.0, connect=10.0) - - try: - transport = kwargs.get("transport") - with httpx.Client(timeout=timeout, transport=transport) as client: - if transport: - kwargs.pop("transport") - response = client.request(method, _url, headers=_headers, **kwargs) - response.raise_for_status() - - ret: Dict[str, Union[str, io.BytesIO]] = {} - for item in file_result: - if item in response.headers: - ret[item] = response.headers[item] - continue - tmp_item = f"dg-{item}" - if tmp_item in response.headers: - ret[item] = response.headers[tmp_item] - continue - tmp_item = f"x-dg-{item}" - if tmp_item in response.headers: - ret[item] = response.headers[tmp_item] - ret["stream"] = io.BytesIO(response.content) - return ret - - except httpx.HTTPError as e1: - if isinstance(e1, httpx.HTTPStatusError): - status_code = e1.response.status_code or 500 - try: - json_object = json.loads(e1.response.text) - raise DeepgramApiError( - json_object.get("err_msg"), - str(status_code), - json.dumps(json_object), - ) from e1 - except json.decoder.JSONDecodeError as e2: - raise DeepgramUnknownApiError(e2.msg, str(status_code)) from e2 - except ValueError as e2: - raise DeepgramUnknownApiError(str(e2), str(status_code)) from e2 - else: - raise # pylint: disable-msg=try-except-raise - except Exception: # pylint: disable-msg=try-except-raise - raise - - # pylint: disable-msg=too-many-branches,too-many-locals - - # pylint: disable-msg=too-many-branches,too-many-locals - def _handle_request_raw( - self, - method: str, - url: str, - params: Optional[Dict] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ) -> httpx.Response: - _url = url - if params is not None: - _url = append_query_params(_url, params) - if addons is not None: - _url = append_query_params(_url, addons) - _headers = self._config.headers - if headers is not None: - _headers.update(headers) - if timeout is None: - timeout = httpx.Timeout(30.0, connect=10.0) - - try: - transport = kwargs.get("transport") - client = httpx.Client(timeout=timeout, transport=transport) - if transport: - kwargs.pop("transport") - req = client.build_request(method, _url, headers=_headers, **kwargs) - return client.send(req, stream=True) - - except httpx.HTTPError as e1: - if isinstance(e1, httpx.HTTPStatusError): - status_code = e1.response.status_code or 500 - try: - json_object = json.loads(e1.response.text) - raise DeepgramApiError( - json_object.get("err_msg"), - str(status_code), - json.dumps(json_object), - ) from e1 - except json.decoder.JSONDecodeError as e2: - raise DeepgramUnknownApiError(e2.msg, str(status_code)) from e2 - except ValueError as e2: - raise DeepgramUnknownApiError(str(e2), str(status_code)) from e2 - else: - raise # pylint: disable-msg=try-except-raise - except Exception: # pylint: disable-msg=try-except-raise - raise - - # pylint: enable-msg=too-many-branches,too-many-locals - # pylint: enable=too-many-positional-arguments diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_sync_websocket.py b/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_sync_websocket.py deleted file mode 100644 index 23433a09..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/abstract_sync_websocket.py +++ /dev/null @@ -1,527 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT -import json -import time -import logging -from typing import Dict, Union, Optional, cast, Any, Callable, Type -from datetime import datetime -import threading -from abc import ABC, abstractmethod - -from websockets.sync.client import connect, ClientConnection -import websockets - -from ....audio import Speaker -from ....utils import verboselogs -from ....options import DeepgramClientOptions -from .helpers import convert_to_websocket_url, append_query_params -from .errors import DeepgramError - -from .websocket_response import ( - OpenResponse, - CloseResponse, - ErrorResponse, -) -from .websocket_events import WebSocketEvents - - -ONE_SECOND = 1 -HALF_SECOND = 0.5 -DEEPGRAM_INTERVAL = 5 -PING_INTERVAL = 20 - - -class AbstractSyncWebSocketClient(ABC): # pylint: disable=too-many-instance-attributes - """ - Abstract class for using WebSockets. - - This class provides methods to establish a WebSocket connection generically for - use in all WebSocket clients. - - Args: - config (DeepgramClientOptions): all the options for the client - endpoint (str): the endpoint to connect to - thread_cls (Type[threading.Thread]): optional thread class to use for creating threads, - defaults to threading.Thread. Useful for custom thread management like ContextVar support. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - _websocket_url: str - - _socket: Optional[ClientConnection] = None - _exit_event: threading.Event - _lock_send: threading.Lock - - _listen_thread: Union[threading.Thread, None] - _delegate: Optional[Speaker] = None - - _thread_cls: Type[threading.Thread] - - _kwargs: Optional[Dict] = None - _addons: Optional[Dict] = None - _options: Optional[Dict] = None - _headers: Optional[Dict] = None - - def __init__( - self, - config: DeepgramClientOptions, - endpoint: str = "", - thread_cls: Type[threading.Thread] = threading.Thread, - ): - if config is None: - raise DeepgramError("Config is required") - if endpoint == "": - raise DeepgramError("endpoint is required") - - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - - self._config = config - self._endpoint = endpoint - self._lock_send = threading.Lock() - - self._listen_thread = None - - self._thread_cls = thread_cls - - # exit - self._exit_event = threading.Event() - - # set websocket url - self._websocket_url = convert_to_websocket_url(self._config.url, self._endpoint) - - def delegate_listening(self, delegate: Speaker) -> None: - """ - Delegate the listening thread to the main thread. - """ - self._delegate = delegate - - # pylint: disable=too-many-statements,too-many-branches - def start( - self, - options: Optional[Any] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> bool: - """ - Starts the WebSocket connection for live transcription. - """ - self._logger.debug("AbstractSyncWebSocketClient.start ENTER") - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - self._logger.info("kwargs: %s", kwargs) - - self._addons = addons - self._headers = headers - - # set kwargs - if kwargs is not None: - self._kwargs = kwargs - else: - self._kwargs = {} - - if not isinstance(options, dict): - self._logger.error("options is not a dict") - self._logger.debug("AbstractSyncWebSocketClient.start LEAVE") - return False - - # set options - if options is not None: - self._options = options - else: - self._options = {} - - combined_options = self._options.copy() - if self._addons is not None: - self._logger.info("merging addons to options") - combined_options.update(self._addons) - self._logger.info("new options: %s", combined_options) - self._logger.debug("combined_options: %s", combined_options) - - combined_headers = self._config.headers.copy() - if self._headers is not None: - self._logger.info("merging headers to options") - combined_headers.update(self._headers) - self._logger.info("new headers: %s", combined_headers) - self._logger.debug("combined_headers: %s", combined_headers) - - url_with_params = append_query_params(self._websocket_url, combined_options) - try: - self._socket = connect(url_with_params, additional_headers=combined_headers) - self._exit_event.clear() - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # delegate the listening thread to external object - if self._delegate is not None: - self._logger.notice("_delegate is enabled. this is usually the speaker") - self._delegate.set_pull_callback(self._socket.recv) - self._delegate.set_push_callback(self._process_message) - else: - self._logger.notice("create _listening thread") - self._listen_thread = self._thread_cls(target=self._listening) - self._listen_thread.start() - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # push open event - self._emit( - WebSocketEvents(WebSocketEvents.Open), - OpenResponse(type=WebSocketEvents.Open), - ) - - self._logger.notice("start succeeded") - self._logger.debug("AbstractSyncWebSocketClient.start LEAVE") - return True - except websockets.exceptions.ConnectionClosed as e: - self._logger.error( - "ConnectionClosed in AbstractSyncWebSocketClient.start: %s", e - ) - self._logger.debug("AbstractSyncWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect", False): - raise e - return False - except websockets.exceptions.WebSocketException as e: - self._logger.error( - "WebSocketException in AbstractSyncWebSocketClient.start: %s", e - ) - self._logger.debug("AbstractSyncWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect", False): - raise e - return False - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "WebSocketException in AbstractSyncWebSocketClient.start: %s", e - ) - self._logger.debug("AbstractSyncWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect", False): - raise e - return False - - def is_connected(self) -> bool: - """ - Returns the connection status of the WebSocket. - """ - return self._socket is not None - - # pylint: enable=too-many-statements,too-many-branches - - @abstractmethod - def on(self, event: WebSocketEvents, handler: Callable) -> None: - """ - Registers an event handler for the WebSocket connection. - """ - raise NotImplementedError("no on method") - - @abstractmethod - def _emit(self, event: WebSocketEvents, *args, **kwargs) -> None: - """ - Emits an event to the WebSocket connection. - """ - raise NotImplementedError("no _emit method") - - # pylint: disable=too-many-return-statements,too-many-statements,too-many-locals,too-many-branches - def _listening( - self, - ) -> None: - """ - Listens for messages from the WebSocket connection. - """ - self._logger.debug("AbstractSyncWebSocketClient._listening ENTER") - - while True: - try: - if self._exit_event.is_set(): - self._logger.notice("_listening exiting gracefully") - self._logger.debug("AbstractSyncWebSocketClient._listening LEAVE") - return - - if self._socket is None: - self._logger.warning("socket is empty") - self._logger.debug("AbstractSyncWebSocketClient._listening LEAVE") - return - - message = self._socket.recv() - - if message is None: - self._logger.info("message is None") - continue - - self._logger.spam("data type: %s", type(message)) - - if isinstance(message, bytes): - self._logger.debug("Binary data received") - self._process_binary(message) - else: - self._logger.debug("Text data received") - self._process_text(message) - - self._logger.notice("_listening Succeeded") - self._logger.debug("AbstractSyncWebSocketClient._listening LEAVE") - - except websockets.exceptions.ConnectionClosedOK as e: - # signal exit and close - self._signal_exit() - - self._logger.notice(f"_listening({e.code}) exiting gracefully") - self._logger.debug("AbstractSyncWebSocketClient._listening LEAVE") - return - - except websockets.exceptions.ConnectionClosed as e: - if e.code in [1000, 1001]: - # signal exit and close - self._signal_exit() - - self._logger.notice(f"_listening({e.code}) exiting gracefully") - self._logger.debug("AbstractSyncWebSocketClient._listening LEAVE") - return - - # we need to explicitly call self._signal_exit() here because we are hanging on a recv() - # note: this is different than the speak websocket client - self._logger.error( - "ConnectionClosed in AbstractSyncWebSocketClient._listening with code %s: %s", - e.code, - e.reason, - ) - cc_error: ErrorResponse = ErrorResponse( - "ConnectionClosed in AbstractSyncWebSocketClient._listening", - f"{e}", - "ConnectionClosed", - ) - self._emit( - WebSocketEvents(WebSocketEvents.Error), - cc_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - self._signal_exit() - - self._logger.debug("AbstractSyncWebSocketClient._listening LEAVE") - - if self._config.options.get("termination_exception_connect") is True: - raise - return - - except websockets.exceptions.WebSocketException as e: - self._logger.error( - "WebSocketException in AbstractSyncWebSocketClient._listening with: %s", - e, - ) - ws_error: ErrorResponse = ErrorResponse( - "WebSocketException in AbstractSyncWebSocketClient._listening", - f"{e}", - "WebSocketException", - ) - self._emit( - WebSocketEvents(WebSocketEvents.Error), - ws_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - self._signal_exit() - - self._logger.debug("AbstractSyncWebSocketClient._listening LEAVE") - - if self._config.options.get("termination_exception_connect") is True: - raise - return - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in AbstractSyncWebSocketClient._listening: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in AbstractSyncWebSocketClient._listening", - f"{e}", - "Exception", - ) - self._emit( - WebSocketEvents(WebSocketEvents.Error), - e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - self._signal_exit() - - self._logger.debug("AbstractSyncWebSocketClient._listening LEAVE") - - if self._config.options.get("termination_exception_connect") is True: - raise - return - - # pylint: enable=too-many-return-statements,too-many-statements,too-many-locals,too-many-branches - - def _process_message(self, message: Union[str, bytes]) -> None: - if isinstance(message, bytes): - self._process_binary(message) - else: - self._process_text(message) - - @abstractmethod - def _process_text(self, message: str) -> None: - raise NotImplementedError("no _process_text method") - - @abstractmethod - def _process_binary(self, message: bytes) -> None: - raise NotImplementedError("no _process_binary method") - - @abstractmethod - def _close_message(self) -> bool: - raise NotImplementedError("no _close_message method") - - # pylint: disable=too-many-return-statements,too-many-branches - def send(self, data: Union[str, bytes]) -> bool: - """ - Sends data over the WebSocket connection. - """ - self._logger.spam("AbstractSyncWebSocketClient.send ENTER") - - if self._exit_event.is_set(): - self._logger.notice("send exiting gracefully") - self._logger.debug("AbstractSyncWebSocketClient.send LEAVE") - return False - - if not self.is_connected(): - self._logger.notice("is_connected is False") - self._logger.debug("AbstractSyncWebSocketClient.send LEAVE") - return False - - if self._socket is not None: - with self._lock_send: - try: - self._socket.send(data) - except websockets.exceptions.ConnectionClosedOK as e: - self._logger.notice(f"send() exiting gracefully: {e.code}") - self._logger.debug("AbstractSyncWebSocketClient.send LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return True - except websockets.exceptions.ConnectionClosed as e: - if e.code in [1000, 1001]: - self._logger.notice(f"send({e.code}) exiting gracefully") - self._logger.debug("AbstractSyncWebSocketClient.send LEAVE") - if ( - self._config.options.get("termination_exception_send") - == "true" - ): - raise - return True - self._logger.error("send() failed - ConnectionClosed: %s", str(e)) - self._logger.spam("AbstractSyncWebSocketClient.send LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return False - except websockets.exceptions.WebSocketException as e: - self._logger.error("send() failed - WebSocketException: %s", str(e)) - self._logger.spam("AbstractSyncWebSocketClient.send LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return False - except Exception as e: # pylint: disable=broad-except - self._logger.error("send() failed - Exception: %s", str(e)) - self._logger.spam("AbstractSyncWebSocketClient.send LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return False - - self._logger.spam("send() succeeded") - self._logger.spam("AbstractSyncWebSocketClient.send LEAVE") - return True - - self._logger.spam("send() failed. socket is None") - self._logger.spam("AbstractSyncWebSocketClient.send LEAVE") - return False - - # pylint: enable=too-many-return-statements,too-many-branches - - def finish(self) -> bool: - """ - Closes the WebSocket connection gracefully. - """ - self._logger.spam("AbstractSyncWebSocketClient.finish ENTER") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # signal exit - self._signal_exit() - - # stop the threads - self._logger.verbose("cancelling tasks...") - if self._listen_thread is not None: - self._listen_thread.join() - self._listen_thread = None - self._logger.notice("listening thread joined") - - # debug the threads - for thread in threading.enumerate(): - if thread is not None and thread.name is not None: - self._logger.debug("before running thread: %s", thread.name) - else: - self._logger.debug("after running thread: unknown_thread_name") - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("finish succeeded") - self._logger.spam("AbstractSyncWebSocketClient.finish LEAVE") - return True - - # signals the WebSocket connection to exit - def _signal_exit(self) -> None: - # closes the WebSocket connection gracefully - self._logger.notice("closing socket...") - if self._socket is not None: - self._logger.notice("sending Close...") - try: - # if the socket connection is closed, the following line might throw an error - self._close_message() - except websockets.exceptions.ConnectionClosedOK as e: - self._logger.notice("_signal_exit - ConnectionClosedOK: %s", e.code) - except websockets.exceptions.ConnectionClosed as e: - self._logger.error("_signal_exit - ConnectionClosed: %s", e.code) - except websockets.exceptions.WebSocketException as e: - self._logger.error("_signal_exit - WebSocketException: %s", str(e)) - except Exception as e: # pylint: disable=broad-except - self._logger.error("_signal_exit - Exception: %s", str(e)) - - # push close event - try: - self._emit( - WebSocketEvents(WebSocketEvents.Close), - CloseResponse(type=WebSocketEvents.Close), - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - except Exception as e: # pylint: disable=broad-except - self._logger.error("_signal_exit - Exception: %s", e) - - # wait for task to send - time.sleep(0.5) - - # signal exit - self._exit_event.set() - - # closes the WebSocket connection gracefully - self._logger.verbose("clean up socket...") - if self._socket is not None: - self._logger.verbose("socket.wait_closed...") - try: - self._socket.close() - except websockets.exceptions.WebSocketException as e: - self._logger.error("socket.wait_closed failed: %s", e) - - self._socket = None diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/enums.py b/venv/Lib/site-packages/deepgram/clients/common/v1/enums.py deleted file mode 100644 index a25893e9..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/enums.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from aenum import StrEnum - -# Constants mapping to events from the Deepgram API - - -class Sentiment(StrEnum): - """ - Sentiment values. - """ - - UNKNOWN: str = "" - NEGATIVE: str = "negative" - NEUTRAL: str = "neutral" - POSITIVE: str = "positive" diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/errors.py b/venv/Lib/site-packages/deepgram/clients/common/v1/errors.py deleted file mode 100644 index e0b5ac8e..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/errors.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - - -class DeepgramError(Exception): - """ - Exception raised for unknown errors related to the Deepgram API. - - Attributes: - message (str): The error message describing the exception. - """ - - def __init__(self, message: str): - super().__init__(message) - self.name = "DeepgramError" - self.message = message - - def __str__(self): - return f"{self.name}: {self.message}" - - -class DeepgramTypeError(Exception): - """ - Exception raised for unknown errors related to unknown Types for Transcription. - - Attributes: - message (str): The error message describing the exception. - """ - - def __init__(self, message: str): - super().__init__(message) - self.name = "DeepgramTypeError" - self.message = message - - def __str__(self): - return f"{self.name}: {self.message}" - - -class DeepgramApiError(Exception): - """ - Exception raised for known errors (in json response format) related to the Deepgram API. - - Attributes: - message (str): The error message describing the exception. - status (str): The HTTP status associated with the API error. - original_error (str - json): The original error that was raised. - """ - - def __init__(self, message: str, status: str, original_error=None): - super().__init__(message) - self.name = "DeepgramApiError" - self.status = status - self.message = message - self.original_error = original_error - - def __str__(self): - return f"{self.name}: {self.message} (Status: {self.status})" - - -class DeepgramUnknownApiError(DeepgramApiError): - """ - Exception raised for unknown errors related to the Deepgram API. - - Attributes: - message (str): The error message describing the exception. - status (str): The HTTP status associated with the API error. - """ - - def __init__(self, message: str, status: str): - super().__init__(message, status) - self.name = "DeepgramUnknownApiError" - self.status = status - self.message = message - - def __str__(self): - return f"{self.name}: {self.message} (Status: {self.status})" diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/helpers.py b/venv/Lib/site-packages/deepgram/clients/common/v1/helpers.py deleted file mode 100644 index c7429acd..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/helpers.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from urllib.parse import urlparse, urlunparse, parse_qs, urlencode -from typing import Dict, Optional -import re - - -# This function appends query parameters to a URL -def append_query_params(url: str, params: Optional[Dict] = None): - """ - Appends query parameters to a URL - """ - parsed_url = urlparse(url) - query_params = parse_qs(parsed_url.query) - - if params is not None: - for key, value in params.items(): - if value is None: - continue - if isinstance(value, bool): - value = str(value).lower() - if isinstance(value, list): - for item in value: - query_params[key] = query_params.get(key, []) + [str(item)] - else: - query_params[key] = [str(value)] - - updated_query_string = urlencode(query_params, doseq=True) - updated_url = parsed_url._replace(query=updated_query_string).geturl() - return updated_url - - -# This function converts a URL to a WebSocket URL -def convert_to_websocket_url(base_url: str, endpoint: str): - """ - Converts a URL to a WebSocket URL - """ - use_ssl = True # Default to true - if re.match(r"^https?://", base_url, re.IGNORECASE): - if "http://" in base_url: - use_ssl = False # Override to false if http:// is found - base_url = base_url.replace("https://", "").replace("http://", "") - if not re.match(r"^wss?://", base_url, re.IGNORECASE): - if use_ssl: - base_url = "wss://" + base_url - else: - base_url = "ws://" + base_url - parsed_url = urlparse(base_url) - domain = parsed_url.netloc - websocket_url = urlunparse((parsed_url.scheme, domain, endpoint, "", "", "")) - return websocket_url diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/options.py b/venv/Lib/site-packages/deepgram/clients/common/v1/options.py deleted file mode 100644 index c2db15d9..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/options.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from io import BufferedReader -from typing import Union -from typing_extensions import TypedDict - - -class StreamSource(TypedDict): - """ - Represents a data source for reading binary data from a stream-like source. - - This class is used to specify a source of binary data that can be read from - a stream, such as an audio file in .wav format. - - Attributes: - stream (BufferedReader): A BufferedReader object for reading binary data. - """ - - stream: BufferedReader - - -class UrlSource(TypedDict): - """ - Represents a data source for specifying the location of a file via a URL. - - This class is used to specify a hosted file URL, typically pointing to an - externally hosted file, such as an audio file hosted on a server or the internet. - - Attributes: - url (str): The URL pointing to the hosted file. - """ - - url: str - - -class BufferSource(TypedDict): - """ - Represents a data source for handling raw binary data. - - This class is used to specify raw binary data, such as audio data in its - binary form, which can be captured from a microphone or generated synthetically. - - Attributes: - buffer (bytes): The binary data. - """ - - buffer: bytes - - -class TextSource(TypedDict): - """ - Represents a data source for reading binary data from a text-like source. - - This class is used to specify a source of text data that can be read from. - - Attributes: - text (str): A string for reading text data. - """ - - text: str - - -FileSource = Union[TextSource, BufferSource, StreamSource] diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/rest_response.py b/venv/Lib/site-packages/deepgram/clients/common/v1/rest_response.py deleted file mode 100644 index 22ca09eb..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/rest_response.py +++ /dev/null @@ -1,181 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional, Dict, Any - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from .enums import Sentiment -from .shared_response import BaseResponse - - -# Analyze Response Types: - - -@dataclass -class IntentsInfo(BaseResponse): - """ - Intents Info - """ - - model_uuid: str = "" - input_tokens: int = 0 - output_tokens: int = 0 - - -@dataclass -class SentimentInfo(BaseResponse): - """ - Sentiment Info - """ - - model_uuid: str = "" - input_tokens: int = 0 - output_tokens: int = 0 - - -@dataclass -class SummaryInfo(BaseResponse): - """ - Summary Info - """ - - model_uuid: str = "" - input_tokens: int = 0 - output_tokens: int = 0 - - -@dataclass -class TopicsInfo(BaseResponse): - """ - Topics Info - """ - - model_uuid: str = "" - input_tokens: int = 0 - output_tokens: int = 0 - - -@dataclass -class Average(BaseResponse): - """ - Average - """ - - sentiment: Sentiment - sentiment_score: float = 0 - - def __getitem__(self, key): - _dict = self.to_dict() - if "sentiment" in _dict: - _dict["sentiment"] = Sentiment.from_dict(_dict["sentiment"]) - return _dict[key] - - -@dataclass -class Topic(BaseResponse): - """ - Topic - """ - - topic: str = "" - confidence_score: float = 0 - - -@dataclass -class Intent(BaseResponse): - """ - Intent - """ - - intent: str = "" - confidence_score: float = 0 - - -@dataclass -class Segment(BaseResponse): - """ - Segment - """ - - text: str = "" - start_word: int = 0 - end_word: int = 0 - sentiment: Optional[Sentiment] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment_score: Optional[float] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - intents: Optional[List[Intent]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - topics: Optional[List[Topic]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "sentiment" in _dict: - _dict["sentiment"] = Sentiment.from_dict(_dict["sentiment"]) - if "intents" in _dict: - _dict["intents"] = Intent.from_dict(_dict["intents"]) - if "topics" in _dict: - _dict["topics"] = Topic.from_dict(_dict["topics"]) - return _dict[key] - - -@dataclass -class Sentiments(BaseResponse): - """ - Sentiments - """ - - average: Average - segments: List[Segment] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "segments" in _dict: - _dict["segments"] = [ - Segment.from_dict(segments) for segments in _dict["segments"] - ] - if "average" in _dict: - _dict["average"] = Average.from_dict(_dict["average"]) - return _dict[key] - - -@dataclass -class Topics(BaseResponse): - """ - Topics - """ - - segments: List[Segment] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "segments" in _dict: - _dict["segments"] = [ - Segment.from_dict(segments) for segments in _dict["segments"] - ] - return _dict[key] - - -@dataclass -class Intents(BaseResponse): - """ - Intents - """ - - segments: List[Segment] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "segments" in _dict: - _dict["segments"] = [ - Segment.from_dict(segments) for segments in _dict["segments"] - ] - return _dict[key] diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/shared_response.py b/venv/Lib/site-packages/deepgram/clients/common/v1/shared_response.py deleted file mode 100644 index 5342380e..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/shared_response.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional, Dict, Any - - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config, DataClassJsonMixin - - -# base class - - -@dataclass -class BaseResponse(DataClassJsonMixin): - """ - BaseResponse class used to define the common methods and properties for all response classes. - """ - - def __getitem__(self, key): - _dict = self.to_dict() - return _dict[key] - - def __setitem__(self, key, val): - self.__dict__[key] = val - - def __str__(self) -> str: - return self.to_json(indent=4) - - def eval(self, key: str) -> str: - """ - This method is used to evaluate a key in the response object using a dot notation style method. - """ - keys = key.split(".") - result: Dict[Any, Any] = self.to_dict() - for k in keys: - if isinstance(result, dict) and k in result: - result = result[k] - elif isinstance(result, list) and k.isdigit() and int(k) < len(result): - result = result[int(k)] - else: - return "" - return str(result) - - -# shared classes - - -@dataclass -class ModelInfo(BaseResponse): - """ - ModelInfo object - """ - - name: str = "" - version: str = "" - arch: str = "" - - -@dataclass -class Hit(BaseResponse): - """ - The hit information for the response. - """ - - confidence: float = 0 - start: float = 0 - end: float = 0 - snippet: Optional[str] = "" - - -@dataclass -class Search(BaseResponse): - """ - The search information for the response. - """ - - query: str = "" - hits: List[Hit] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "hits" in _dict: - _dict["hits"] = [Hit.from_dict(hits) for hits in _dict["hits"]] - return _dict[key] diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/websocket_events.py b/venv/Lib/site-packages/deepgram/clients/common/v1/websocket_events.py deleted file mode 100644 index 4ab36a16..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/websocket_events.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from aenum import StrEnum - -# Constants mapping to events from the Deepgram API - - -class WebSocketEvents(StrEnum): - """ - Enumerates the possible events that can be received from the Deepgram API - """ - - Open: str = "Open" - Close: str = "Close" - Warning: str = "Warning" - Error: str = "Error" - Unhandled: str = "Unhandled" diff --git a/venv/Lib/site-packages/deepgram/clients/common/v1/websocket_response.py b/venv/Lib/site-packages/deepgram/clients/common/v1/websocket_response.py deleted file mode 100644 index 63d7c016..00000000 --- a/venv/Lib/site-packages/deepgram/clients/common/v1/websocket_response.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional, Dict, Any - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from .shared_response import BaseResponse - - -# Result Message - - -@dataclass -class OpenResponse(BaseResponse): - """ - Open Message from the Deepgram Platform - """ - - type: str = "" - - -# Close Message - - -@dataclass -class CloseResponse(BaseResponse): - """ - Close Message from the Deepgram Platform - """ - - type: str = "" - - -# Error Message - - -@dataclass -class ErrorResponse(BaseResponse): - """ - Error Message from the Deepgram Platform - """ - - description: str = "" - message: str = "" - type: str = "" - variant: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - -# Unhandled Message - - -@dataclass -class UnhandledResponse(BaseResponse): - """ - Unhandled Message from the Deepgram Platform - """ - - type: str = "" - raw: str = "" diff --git a/venv/Lib/site-packages/deepgram/clients/errors.py b/venv/Lib/site-packages/deepgram/clients/errors.py deleted file mode 100644 index 197b3c7e..00000000 --- a/venv/Lib/site-packages/deepgram/clients/errors.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - - -class DeepgramModuleError(Exception): - """ - Base class for exceptions raised for a missing Deepgram module. - - Attributes: - message (str): The error message describing the exception. - """ - - def __init__(self, message: str): - super().__init__(message) - self.name = "DeepgramModuleError" diff --git a/venv/Lib/site-packages/deepgram/clients/listen/__init__.py b/venv/Lib/site-packages/deepgram/clients/listen/__init__.py deleted file mode 100644 index 3a3285f5..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/__init__.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .enums import LiveTranscriptionEvents - -# backward compat -from .client import ( - PreRecordedClient, - AsyncPreRecordedClient, - LiveClient, - AsyncLiveClient, -) - -# rest -# common -from .client import ( - UrlSource, - TextSource, - BufferSource, - StreamSource, - FileSource, -) - -## input -from .client import ( - ListenRESTOptions, - PrerecordedOptions, - PreRecordedStreamSource, - PrerecordedSource, - ListenRestSource, -) - -## output -from .client import ( - # top level - AsyncPrerecordedResponse, - PrerecordedResponse, - SyncPrerecordedResponse, - # shared - Average, - Intent, - Intents, - IntentsInfo, - Segment, - SentimentInfo, - Sentiment, - Sentiments, - SummaryInfo, - Topic, - Topics, - TopicsInfo, - # between rest and websocket - ModelInfo, - Hit, - Search, - # unique - Entity, - ListenRESTMetadata, - Paragraph, - Paragraphs, - ListenRESTResults, - Sentence, - Summaries, - SummaryV1, - SummaryV2, - Translation, - Utterance, - Warning, - ListenRESTAlternative, - ListenRESTChannel, - ListenRESTWord, -) - - -# websocket -## input -from .client import ( - ListenWebSocketOptions, - LiveOptions, -) - -## output -from .client import ( - # top level - LiveResultResponse, - ListenWSMetadataResponse, - SpeechStartedResponse, - UtteranceEndResponse, - # common websocket response - OpenResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, - # unique - ListenWSMetadata, - ListenWSWord, - ListenWSAlternative, - ListenWSChannel, -) - -# clients -from .client import ( - ListenRESTClient, - AsyncListenRESTClient, - ListenWebSocketClient, - AsyncListenWebSocketClient, -) diff --git a/venv/Lib/site-packages/deepgram/clients/listen/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e7adb4e66d13b7a2050d77c26c95fc932eb70e49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2035 zcmai!Nlzn36o9)iUa?sWW@p$JvzdM0j3F5kCNsh?NH3O9k6l2Ee%)4e+lp`b7x@i2 z=6B>D)HSEvA`vvwoTgs8+c=s-eE9soP}AOgE>q?8s}ji7hnMwVG);L3726R zGmya*Six0Tb!!R9TGn6<*J0h&!&2XX4cvrH+=4CKhHcz|9o&Uo+=D&bhkZPN13ZL7 zJc1)UhGRD`BJ)n*1hbIEQ#i#O^|-irHn$w3+B`TA*R<%h#LnO>{V0Wn6n;B6MNOvKacfSn)CMXxw3? zhPkIv`?>jQjlVC;k@P1dkuxltcB&6d;+%7fH`J~hQ=X(`G%e~4;BBJ{5%=q&BZ_Wc zYi>=4Z}b`?uc<%C@@{xHFy-Aq|H}AgFW2vwXC7>dZgjKm`zd`Ug3PR-%>(ke5TT;` z4DeQ|@E{>Xkk7WlBZMe{-gDkYh!YZoc0vcClh8#-61oXJgcPBd&`0Pe3=jqhLxf?% z2;mK3lrTmZCrl6~2~&h=!VF=SFh@ue<_QagMZywcnUEo@5LO9mgmuCOVUw^$*e2`{ zb_sigeZm3ZkZ?peCY%tmgi}I}a3=A)@+_%*`8l^&xUm_x3qM|5To=xm{p48XLe4%kyC(5ZKvmV3n4&Ix4h7YgXGP+3GNiV=C=$)mj8v8X#fuyAQ4PrG VcqgU!cy^^3x&FVj34beh{|W}3a%lhn diff --git a/venv/Lib/site-packages/deepgram/clients/listen/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/__pycache__/client.cpython-312.pyc deleted file mode 100644 index c27dff6b7c30958535e3b026ff2da8b564672cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3869 zcmai0TT>fH79N4oUFeR))y6iqWg9RU-|#IMW1AS;1c8Z9l#47KK(TtH%nXXjUZSd0 zenZ~(Z6EVH@}hlH&C71pKJA;UTwAWn)ApG;Ga4|drHWSf_kE}P^zEDeEfxza@^Amw z$9sPpQj~vF!};su%KHUb`$efLRbO2ZKIjwuaKcCJKG_}szX(9kYWK@_2*M%)Q4xbd z5r>3GLQ13|BeF0ga*(%lC!}r|M#LzLiE)?^C*hQsgwx^-oE1}WPMn7eq5v1gCAci6 zVMfft6)^|%;wmhNYj9oMfSckLEQ;H3N8E*b;y!#Lmf(R{hKFJW9*M{BM6AN6;wh|& zXYgFSfOYX1Y=|OkiY<64w&8Q}3c$)`K<4rVl*E_tmDTpk_Sf)@D8p;39gyt`R0YD0 z*o8e&gKxzfs0#tAXh2hZ2b$2q5c|*)-@{vR06+K?JOwB5G)&@IID_Y43NOHUya)xn z43}^Qrtu2Q;yldZ0$j!Ga19sX7T$y#cn5A{6)LELz$P?MgYU2p{)8vs&sc)L$p61$ z7(y6@2o6FF6A;G~Brym9^uqvVAdN$i#XRJ21cq@8MsWhh@e{a@_uwu*fF*ng%lHUZ z@CiJ|Phl0;;3+tW zY{5Rhh41kPIFNbzWS;#p$1m_J`0^lF2>r(=&rqSyOsv&(1J#X{;^uO_hN@v^m-GX* zauk-*)VhWmRvKCrt1p^Ht)c2>vZrIH5Hv$uTD{oV*D7d+H}S2(_2`5BogLJiR?*O~ zEF9gVS{=EbljCggIEO?@PXerU(np;~DNLGqYXTna2I@_jESl-#z+6#I_c$W3)IzPi zi>7~7l}lup0sB`sBV1WkcN%7(h`WO5SW%WWs#56@YGqZgmubW0)*6Of6bcM%mo>Gf z?wZ+NMoV?cs#4lQ@6lM^E2}Ej&B2~>TOK2MrZ{#RUl$t{d2sm*j(E=C5l#k0)@1+A z2^_NfbXCqVjGECGO?j}Ly_f6OlE;ds?_zn5EjladGTCAiv9eb*%9?>y7tXlTUr~E# zY`Nahsc-v~#a1+}p}EcEmMW)Tt$VuRQ@ibsYo?t{yek-YKxh4;4nV8-yzryh*P7G% za#bj}`^Vh^(cV&m?0=a?X&iQdg; zI7D#DYXVHrht5oSuR0SEtD~MZFdQX#T&8@SORy$J8gdfHv24R&c92+S&0OzbGEU^g zADIY?5+oY-^zZC9^GV{z|G-*UlOj!wU52qVVNu&(7|K{Owj9Q?ge5&T#JGGZ$S&ED z7|Risb}fi3g_%4tahG9qn9zia>I{z%obr2Pdxxh@Hwjyj-Watb*an}_YJxgf9MV+}$5$rkj za&yTxIp`d*gN}nTc;4#YHB&|}cu?u9j1~@|^Ne03H0g0$#xGfF*LfJdOlXWfn6YWX zMthglV@3XA5}WD8lg%)7#nZLxwYFQcVvZE2JXUkOY@THD+2A@jhhHUp zj1A8D92|C=1(Kw^uFkR7h>)k@sKGORo#+Yf+V$Kc7xo5;Mvt|9?&c;bM%;byd;wT+ ziv;OI9|L9ylnGaJpHpypc~Xy;MbP%9o6otyr&8eYS4BQ@J_QJor6$ zM>MMYb-btjEJvc}to~0~zU%k-d>^9yzP=AZD#9UID6)7@#fQukHUDq%UrVy?bGr$~ zD9$O~Q|;Y3C6aFkx}j{_-wo$vZSZ6}V%HL9+OckQv>ock#@k_=2&UTuwwSPYekG7- z_uC@sLIR1??P%8uwTjH8j*@&ARI>Ej9bV`tL*3W~*a3eCbd-b~X>75h4zd5q*#dr)RKa-H%eog8myhB6twMWfo<++0V=NG5YpX2hAK&bQ;%G+f-) Q+U5A&e<&l`PjaLG2UgoTqW}N^ diff --git a/venv/Lib/site-packages/deepgram/clients/listen/__pycache__/enums.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/__pycache__/enums.cpython-312.pyc deleted file mode 100644 index 1ca1a7553dabc03c07257ae9615559e381f0ec8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmYk4zi$&U6vur((p)Y{e+Xz(DCH!isu`dI8>*11Hk3eH5NQNDMLM~6kL1*gFW63` zcFF)!#%^U|M@;-3OehSIS0=Wi(xnr&ld4#{@4e5xub+L-{$4D)NRIBe?bZ(ypKqlHok@*2d78qZxvClV;>~iL}g0dm9HBKv}+YZOcu}+-m z{Ild!1jsiczJKS(xd_Y0CPprmQB%&uelt z<@|!CoF>;VYH~H@{b@~kO$C2OQ$f*Du{}z1%gfrn@uP>Zk;5fn@i$a}qxikr(LLyPDbpXOvjbq9o63)|@;3PfW30_8L3!L4(B{9&~Vch?~F~(WGx{VG^seSW9BYfvkZ%4EC^d zMAfC$qBg_YQa++TrkQch95lDk-x}N>+Vi8iQok~IG_*^j`Fs86C)UuuH@dmpe>Mn* z_VTE-(%(6ezLnA9YJc}c`d0tTUeCSd^{WFmw7t=drT+Gy_S0UXrK|P#%9hArwJ)l! w{di*wD$rNYYKQ%9qeCc`r06LKXXaE2J diff --git a/venv/Lib/site-packages/deepgram/clients/listen/client.py b/venv/Lib/site-packages/deepgram/clients/listen/client.py deleted file mode 100644 index 29b61bed..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/client.py +++ /dev/null @@ -1,180 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -# rest -from .v1 import ( - ListenRESTClient as ListenRESTClientLatest, - AsyncListenRESTClient as AsyncListenRESTClientLatest, -) -from .v1 import ( - PrerecordedOptions as PrerecordedOptionsLatest, - ListenRESTOptions as ListenRESTOptionsLatest, -) - -from .v1 import ( - UrlSource as UrlSourceLatest, - TextSource as TextSourceLatest, - BufferSource as BufferSourceLatest, - StreamSource as StreamSourceLatest, - FileSource as FileSourceLatest, - PreRecordedStreamSource as PreRecordedStreamSourceLatest, - PrerecordedSource as PrerecordedSourceLatest, - ListenRestSource as ListenRestSourceLatest, -) -from .v1 import ( - AsyncPrerecordedResponse as AsyncPrerecordedResponseLatest, - PrerecordedResponse as PrerecordedResponseLatest, - SyncPrerecordedResponse as SyncPrerecordedResponseLatest, - # shared - Average as AverageLatest, - Intent as IntentLatest, - Intents as IntentsLatest, - IntentsInfo as IntentsInfoLatest, - Segment as SegmentLatest, - SentimentInfo as SentimentInfoLatest, - Sentiment as SentimentLatest, - Sentiments as SentimentsLatest, - SummaryInfo as SummaryInfoLatest, - Topic as TopicLatest, - Topics as TopicsLatest, - TopicsInfo as TopicsInfoLatest, - # between rest and websocket - ModelInfo as ModelInfoLatest, - Hit as HitLatest, - Search as SearchLatest, - # unique - ListenRESTMetadata as ListenRESTMetadataLatest, - Entity as EntityLatest, - Paragraph as ParagraphLatest, - Paragraphs as ParagraphsLatest, - ListenRESTResults as ListenRESTResultsLatest, - Sentence as SentenceLatest, - Summaries as SummariesLatest, - SummaryV1 as SummaryV1Latest, - SummaryV2 as SummaryV2Latest, - Translation as TranslationLatest, - Utterance as UtteranceLatest, - Warning as WarningLatest, - ListenRESTAlternative as ListenRESTAlternativeLatest, - ListenRESTChannel as ListenRESTChannelLatest, - ListenRESTWord as ListenRESTWordLatest, -) - -# websocket -from .v1 import ( - ListenWebSocketClient as ListenWebSocketClientLatest, - AsyncListenWebSocketClient as AsyncListenWebSocketClientLatest, -) -from .v1 import ( - LiveOptions as LiveOptionsLatest, - ListenWebSocketOptions as ListenWebSocketOptionsLatest, -) -from .v1 import ( - OpenResponse as OpenResponseLatest, - LiveResultResponse as LiveResultResponseLatest, - ListenWSMetadataResponse as ListenWSMetadataResponseLatest, - SpeechStartedResponse as SpeechStartedResponseLatest, - UtteranceEndResponse as UtteranceEndResponseLatest, - CloseResponse as CloseResponseLatest, - ErrorResponse as ErrorResponseLatest, - UnhandledResponse as UnhandledResponseLatest, - ListenWSMetadata as ListenWSMetadataLatest, - ListenWSAlternative as ListenWSAlternativeLatest, - ListenWSChannel as ListenWSChannelLatest, - ListenWSWord as ListenWSWordLatest, -) - -# The vX/client.py points to the current supported version in the SDK. -# Older versions are supported in the SDK for backwards compatibility. - -# shared -Average = AverageLatest -Intent = IntentLatest -Intents = IntentsLatest -IntentsInfo = IntentsInfoLatest -Segment = SegmentLatest -SentimentInfo = SentimentInfoLatest -Sentiment = SentimentLatest -Sentiments = SentimentsLatest -SummaryInfo = SummaryInfoLatest -Topic = TopicLatest -Topics = TopicsLatest -TopicsInfo = TopicsInfoLatest - -# between rest and websocket -Hit = HitLatest -ModelInfo = ModelInfoLatest -Search = SearchLatest - -# websocket common -OpenResponse = OpenResponseLatest -CloseResponse = CloseResponseLatest -ErrorResponse = ErrorResponseLatest -UnhandledResponse = UnhandledResponseLatest - - -# backward compat -PreRecordedClient = ListenRESTClientLatest -AsyncPreRecordedClient = AsyncListenRESTClientLatest -LiveClient = ListenWebSocketClientLatest -AsyncLiveClient = ListenWebSocketClientLatest - -# rest -## common -UrlSource = UrlSourceLatest -TextSource = TextSourceLatest -BufferSource = BufferSourceLatest -StreamSource = StreamSourceLatest -FileSource = FileSourceLatest - -# input -ListenRESTOptions = ListenRESTOptionsLatest -PrerecordedOptions = PrerecordedOptionsLatest -PreRecordedStreamSource = PreRecordedStreamSourceLatest -PrerecordedSource = PrerecordedSourceLatest -ListenRestSource = ListenRestSourceLatest - -## output -AsyncPrerecordedResponse = AsyncPrerecordedResponseLatest -PrerecordedResponse = PrerecordedResponseLatest -SyncPrerecordedResponse = SyncPrerecordedResponseLatest -# unique -Entity = EntityLatest -ListenRESTMetadata = ListenRESTMetadataLatest -Paragraph = ParagraphLatest -Paragraphs = ParagraphsLatest -ListenRESTResults = ListenRESTResultsLatest -Sentence = SentenceLatest -Summaries = SummariesLatest -SummaryV1 = SummaryV1Latest -SummaryV2 = SummaryV2Latest -Translation = TranslationLatest -Utterance = UtteranceLatest -Warning = WarningLatest -ListenRESTAlternative = ListenRESTAlternativeLatest -ListenRESTChannel = ListenRESTChannelLatest -ListenRESTWord = ListenRESTWordLatest - -# websocket -## input -ListenWebSocketOptions = ListenWebSocketOptionsLatest -LiveOptions = LiveOptionsLatest - -## output -LiveResultResponse = LiveResultResponseLatest -ListenWSMetadataResponse = ListenWSMetadataResponseLatest -SpeechStartedResponse = SpeechStartedResponseLatest -UtteranceEndResponse = UtteranceEndResponseLatest - -## unique -ListenWSMetadata = ListenWSMetadataLatest -ListenWSAlternative = ListenWSAlternativeLatest -ListenWSChannel = ListenWSChannelLatest -ListenWSWord = ListenWSWordLatest - -# clients -ListenRESTClient = ListenRESTClientLatest -AsyncListenRESTClient = AsyncListenRESTClientLatest -ListenWebSocketClient = ListenWebSocketClientLatest -AsyncListenWebSocketClient = AsyncListenWebSocketClientLatest diff --git a/venv/Lib/site-packages/deepgram/clients/listen/enums.py b/venv/Lib/site-packages/deepgram/clients/listen/enums.py deleted file mode 100644 index 8e39ae02..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/enums.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from aenum import StrEnum - -# Constants mapping to events from the Deepgram API - - -class LiveTranscriptionEvents(StrEnum): - """ - Enumerates the possible events that can be received from the Deepgram API - """ - - Open: str = "Open" - Close: str = "Close" - Transcript: str = "Results" - Metadata: str = "Metadata" - UtteranceEnd: str = "UtteranceEnd" - SpeechStarted: str = "SpeechStarted" - Finalize: str = "Finalize" - Error: str = "Error" - Unhandled: str = "Unhandled" - Warning: str = "Warning" diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/__init__.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/__init__.py deleted file mode 100644 index d1b2f3a6..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/__init__.py +++ /dev/null @@ -1,131 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -# backward compat -from .rest import ( - ListenRESTClient as PreRecordedClient, - AsyncListenRESTClient as AsyncPreRecordedClient, -) -from .websocket import ( - ListenWebSocketClient as LiveClient, - AsyncListenWebSocketClient as AsyncLiveClient, -) - -# shared -from ...common import ( - Average, - Intent, - Intents, - IntentsInfo, - Segment, - SentimentInfo, - Sentiment, - Sentiments, - SummaryInfo, - Topic, - Topics, - TopicsInfo, -) - -# between rest and websocket -from ...common import ( - ModelInfo, - Hit, - Search, -) - -# common websocket -from ...common import ( - OpenResponse, - CloseResponse, - UnhandledResponse, - ErrorResponse, -) - -# rest -from .rest import ListenRESTClient, AsyncListenRESTClient -from .rest import ListenRESTOptions, PrerecordedOptions -from .rest import ( - # common - UrlSource, - BufferSource, - StreamSource, - TextSource, - FileSource, - # unique - PreRecordedStreamSource, - PrerecordedSource, - ListenRestSource, -) -from .rest import ( - #### top level - AsyncPrerecordedResponse, - PrerecordedResponse, - SyncPrerecordedResponse, - #### shared - # Average, - # Intent, - # Intents, - # IntentsInfo, - # Segment, - # SentimentInfo, - # Sentiment, - # Sentiments, - # SummaryInfo, - # Topic, - # Topics, - # TopicsInfo, - #### between rest and websocket - # ModelInfo, - # Alternative, - # Hit, - # Search, - # Channel, - # Word, - #### unique - Entity, - Metadata as ListenRESTMetadata, - Paragraph, - Paragraphs, - Results as ListenRESTResults, - Sentence, - Summaries, - SummaryV1, - SummaryV2, - Translation, - Utterance, - Warning, - ListenRESTAlternative, - ListenRESTChannel, - ListenRESTWord, -) - -# websocket -from .websocket import ListenWebSocketClient, AsyncListenWebSocketClient -from .websocket import LiveOptions, ListenWebSocketOptions -from .websocket import ( - #### top level - LiveResultResponse, - MetadataResponse as ListenWSMetadataResponse, - SpeechStartedResponse, - UtteranceEndResponse, - #### common websocket response - # BaseResponse, - # OpenResponse, - # CloseResponse, - # ErrorResponse, - # UnhandledResponse, - #### between rest and websocket - # ModelInfo, - # Alternative, - # Hit, - # Search, - # Channel, - # Word, - #### unique - Metadata as ListenWSMetadata, - ListenWSWord, - ListenWSAlternative, - ListenWSChannel, -) diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/v1/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c55a86622f7cc6eee87d66a2f486ef8cc39110f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2079 zcmZvcNmCnF5P)YS&@T2x#>OnR0oewb#ef0hu-T!4m-0YJb*VxP(leU!^o;7wK*BBm zBEKQW{EqyCckv-7-;yF#s`4q_qZuK)n8P={y{)_7`zxQ%X!M=``KneU>2Fq|FBS?{ zHC@ww*Q#1ow>8uuhH>c7S&!MBn1CdvAWeF_+F@rf3t7xT4)c)5F6hE;=*AxC!CvUa zKIp@K=*IyVz(E+qAs7nAb<((D7{&q=@D|((YzeZBzzE)k+js}=;3$j+Yc}_w(;ni1 zo}@k9g}XQgV}YI`eH_Md0w!=0Ch;EJ!~1X_AHV~gf+?Ja=^!pmaWgQ3MJVD!c!-bS z5k7`loP#+mK?$G0JTAZjF2W)%!4f`&r??EuxB@G<3aj`Gp5Yp-;X14b^EGpkpj@N^ zJwv(KfDL>O&jUS6`X+4R3-}JVU<PZL!fARR2xJVS{?$CP!kAD&t?O z)NA3JRns?B`khI&m1e!BGA+?lNm}6C_C1y2k_m^-oo*J)5?&-;{y2XvE~xCGG#$@2 zIggYu->0tOfyrZ2I+k-5wIFxvmQ7xVLN7#n5q79zj<8kNbzP3B5>%<|0fk028v3S} zuj|yuVa>g_Qq&V2wq+SK>Oxd%hHpy0tvv=>d){+eO(TnR3sf##(ctZ<{zz*-Mt5Wk z5Amk>N_9x8qU3v|xYAJzH1D45VEa&1+OM4|{fjvDf}1KkIWEH|3kN3H&>h~~$f^<* z7twWOio7z-;CEYQ897Ft(Z%Ry^e}oEeT;s_0Ar9b#29827`GTBjN6Pmj8Vp2#u#Iq zF~OK*++*BlJYY;QrWrGgAgffZ==q9jBpeBEI$b_2Rf5;s zE7?IpN*D8`lM~Ca{F9Tp`sJ6@2D;UATWrcVv>dJ9iw*Yth;leX4~6*z?OA449{ GCjJK?{(%?( diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__init__.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__init__.py deleted file mode 100644 index 8106a2dd..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .client import ListenRESTClient -from .async_client import AsyncListenRESTClient -from .options import ( - ListenRESTOptions, - PrerecordedOptions, - # common - UrlSource, - BufferSource, - StreamSource, - TextSource, - FileSource, - # unique - PreRecordedStreamSource, - PrerecordedSource, - ListenRestSource, -) -from .response import ( - # top level - AsyncPrerecordedResponse, - PrerecordedResponse, - SyncPrerecordedResponse, - # shared - Average, - Intent, - Intents, - IntentsInfo, - Segment, - SentimentInfo, - Sentiment, - Sentiments, - SummaryInfo, - Topic, - Topics, - TopicsInfo, - # between rest and websocket - ModelInfo, - Hit, - Search, - # unique - Entity, - Metadata, - Paragraph, - Paragraphs, - Results, - Sentence, - Summaries, - SummaryV1, - SummaryV2, - Translation, - Utterance, - Warning, - ListenRESTAlternative, - ListenRESTChannel, - ListenRESTWord, -) diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 787045820166d711dd7cd1b9020c215b7a987d40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1363 zcmaizTWcFf6vuZZYgbxHj%8bx@AsR0+qh5)r4(E@ZA6kbSaJdff!M6Z_L4ojVrC?& zPm<4&$9#@{filpiKJ~2-+CZKJqO;)y<{*a_SZITddB|e{3h01?MJQqkN?3+6 zPQqjoKM_8_DVV|vRB#%maRz2^7G|*uRh)x4tU(RuVICJ?0T*ErmtYB(VHsCo1y^Ae z*I*6TVI4PM125~7MP`Q^YjU8{F ziFBpiOfC@q_UdKTUjdE_KP_{mHKa@h{DLaewYZOMg1183D_~P_VexZsj z?nNT>=xtTuQc8URG|_(P@hFI{RrRg{&O$vJ>CgeYUl`{%UKFuVP2NSm)Yb7*{Zv_g zQeix+OHY+NDzZ-M(!bD9c04L7p3@e$2sR;4C=lq|@*<%`C=(_%RGz1A%pZ_%icld; z6J`jrgeqZ=WvQ1HvKUh;U3e zA-EcEjrW?yNB{im_N8E4w4XE@t@ig!yq0mVJ%|IJon7l!YY$j7Xg>{JwM8J=anJK# z>w*;RE@M6Y;^>a9Pq<<7i`~Jgt1m*jolX!1veP-~4L|0;!MNKG*|+>Fos+)3XlVSE iHBIwx$1rz(H{1`IvYGi{++ul`%+KN<3gKVs)&2$R>zrNy diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/async_client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/async_client.cpython-312.pyc deleted file mode 100644 index 48b205301555d945fcc887b23460ce9fd61396b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15526 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 diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/client.cpython-312.pyc deleted file mode 100644 index 63b2780d14817cc3907e22f0f2252c753da57770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15133 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 diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/helpers.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index 054b636745980f2f27c531a2569edd5bbfa8b8ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926 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

r_!=WAQOVh44Szc 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 diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/async_client.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/async_client.py deleted file mode 100644 index ef9360a4..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/async_client.py +++ /dev/null @@ -1,347 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from typing import Dict, Union, Optional - -import httpx - -from .....utils import verboselogs -from .....options import DeepgramClientOptions -from ....common import AbstractAsyncRestClient -from ....common import DeepgramError, DeepgramTypeError - -from .helpers import is_buffer_source, is_readstream_source, is_url_source -from .options import ( - ListenRESTOptions, - PrerecordedOptions, - FileSource, - UrlSource, -) -from .response import AsyncPrerecordedResponse, PrerecordedResponse - - -class AsyncListenRESTClient(AbstractAsyncRestClient): - """ - A client class for handling pre-recorded audio data. - Provides methods for transcribing audio from URLs and files. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - super().__init__(config) - - # pylint: disable=too-many-positional-arguments - - async def transcribe_url( - self, - source: UrlSource, - options: Optional[Union[Dict, ListenRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/listen", - **kwargs, - ) -> Union[AsyncPrerecordedResponse, PrerecordedResponse]: - """ - Transcribes audio from a URL source. - - Args: - source (UrlSource): The URL source of the audio to transcribe. - options (ListenRESTOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/listen"). - - Returns: - PrerecordedResponse: An object containing the transcription result. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("ListenRESTClient.transcribe_url ENTER") - - if ( - isinstance(options, dict) - and "callback" in options - and options["callback"] is not None - ) or (isinstance(options, ListenRESTOptions) and options.callback is not None): - self._logger.debug("ListenRESTClient.transcribe_url LEAVE") - return await self.transcribe_url_callback( - source, - callback=options["callback"], - options=options, - addons=addons, - headers=headers, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - url = f"{self._config.url}/{endpoint}" - if is_url_source(source): - body = source - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("ListenRESTClient.transcribe_url LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, ListenRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("ListenRESTClient.transcribe_url LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, ListenRESTOptions): - self._logger.info("ListenRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = PrerecordedResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("transcribe_url succeeded") - self._logger.debug("ListenRESTClient.transcribe_url LEAVE") - return res - - async def transcribe_url_callback( - self, - source: UrlSource, - callback: str, - options: Optional[Union[Dict, ListenRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/listen", - **kwargs, - ) -> AsyncPrerecordedResponse: - """ - Transcribes audio from a URL source and sends the result to a callback URL. - - Args: - source (UrlSource): The URL source of the audio to transcribe. - callback (str): The callback URL where the transcription results will be sent. - options (ListenRESTOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/listen"). - - Returns: - AsyncPrerecordedResponse: An object containing the request_id or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("ListenRESTClient.transcribe_url_callback ENTER") - - url = f"{self._config.url}/{endpoint}" - if options is None: - options = {} - if isinstance(options, ListenRESTOptions): - options.callback = callback - else: - options["callback"] = callback - if is_url_source(source): - body = source - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("ListenRESTClient.transcribe_url_callback LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, ListenRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("ListenRESTClient.transcribe_url_callback LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, ListenRESTOptions): - self._logger.info("ListenRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AsyncPrerecordedResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("transcribe_url_callback succeeded") - self._logger.debug("ListenRESTClient.transcribe_url_callback LEAVE") - return res - - async def transcribe_file( - self, - source: FileSource, - options: Optional[Union[Dict, ListenRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/listen", - **kwargs, - ) -> Union[AsyncPrerecordedResponse, PrerecordedResponse]: - """ - Transcribes audio from a local file source. - - Args: - source (FileSource): The local file source of the audio to transcribe. - options (ListenRESTOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/listen"). - - Returns: - PrerecordedResponse: An object containing the transcription result or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("ListenRESTClient.transcribe_file ENTER") - - if ( - isinstance(options, dict) - and "callback" in options - and options["callback"] is not None - ) or (isinstance(options, ListenRESTOptions) and options.callback is not None): - self._logger.debug("ListenRESTClient.transcribe_file LEAVE") - return await self.transcribe_file_callback( - source, - callback=options["callback"], - options=options, - addons=addons, - headers=headers, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - url = f"{self._config.url}/{endpoint}" - if is_buffer_source(source): - body = source["buffer"] # type: ignore - elif is_readstream_source(source): - body = source["stream"] # type: ignore - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("ListenRESTClient.transcribe_file LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, ListenRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("ListenRESTClient.transcribe_file LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - if isinstance(options, ListenRESTOptions): - self._logger.info("ListenRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, - options=options, - addons=addons, - headers=headers, - content=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = PrerecordedResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("transcribe_file succeeded") - self._logger.debug("ListenRESTClient.transcribe_file LEAVE") - return res - - async def transcribe_file_callback( - self, - source: FileSource, - callback: str, - options: Optional[Union[Dict, ListenRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/listen", - **kwargs, - ) -> AsyncPrerecordedResponse: - """ - Transcribes audio from a local file source and sends the result to a callback URL. - - Args: - source (FileSource): The local file source of the audio to transcribe. - callback (str): The callback URL where the transcription results will be sent. - options (ListenRESTOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/listen"). - - Returns: - AsyncPrerecordedResponse: An object containing the request_id or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("ListenRESTClient.transcribe_file_callback ENTER") - - url = f"{self._config.url}/{endpoint}" - if options is None: - options = {} - if isinstance(options, ListenRESTOptions): - options.callback = callback - else: - options["callback"] = callback - if is_buffer_source(source): - body = source["buffer"] # type: ignore - elif is_readstream_source(source): - body = source["stream"] # type: ignore - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("ListenRESTClient.transcribe_file_callback LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, ListenRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("ListenRESTClient.transcribe_file_callback LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - if isinstance(options, ListenRESTOptions): - self._logger.info("ListenRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, - options=options, - addons=addons, - headers=headers, - content=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AsyncPrerecordedResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("transcribe_file_callback succeeded") - self._logger.debug("ListenRESTClient.transcribe_file_callback LEAVE") - return res - - # pylint: enable=too-many-positional-arguments diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/client.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/client.py deleted file mode 100644 index 3accab56..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/client.py +++ /dev/null @@ -1,348 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from typing import Dict, Union, Optional - -import httpx - -from .....utils import verboselogs -from .....options import DeepgramClientOptions -from ....common import AbstractSyncRestClient -from ....common import DeepgramError, DeepgramTypeError - -from .helpers import is_buffer_source, is_readstream_source, is_url_source -from .options import ( - ListenRESTOptions, - PrerecordedOptions, - FileSource, - UrlSource, -) -from .response import AsyncPrerecordedResponse, PrerecordedResponse - - -class ListenRESTClient(AbstractSyncRestClient): - """ - A client class for handling pre-recorded audio data. - Provides methods for transcribing audio from URLs and files. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - super().__init__(config) - - # pylint: disable=too-many-positional-arguments - - def transcribe_url( - self, - source: UrlSource, - options: Optional[Union[Dict, ListenRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/listen", - **kwargs, - ) -> Union[AsyncPrerecordedResponse, PrerecordedResponse]: - """ - Transcribes audio from a URL source. - - Args: - source (UrlSource): The URL source of the audio to transcribe. - options (ListenRESTOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/listen"). - - Returns: - PrerecordedResponse: An object containing the transcription result. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("ListenRESTClient.transcribe_url ENTER") - - if ( - isinstance(options, dict) - and "callback" in options - and options["callback"] is not None - ) or (isinstance(options, ListenRESTOptions) and options.callback is not None): - self._logger.debug("ListenRESTClient.transcribe_url LEAVE") - return self.transcribe_url_callback( - source, - callback=options["callback"], - options=options, - addons=addons, - headers=headers, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - url = f"{self._config.url}/{endpoint}" - if is_url_source(source): - body = source - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("ListenRESTClient.transcribe_url LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, ListenRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("ListenRESTClient.transcribe_url LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, ListenRESTOptions): - self._logger.info("ListenRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = PrerecordedResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("transcribe_url succeeded") - self._logger.debug("ListenRESTClient.transcribe_url LEAVE") - return res - - def transcribe_url_callback( - self, - source: UrlSource, - callback: str, - options: Optional[Union[Dict, ListenRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/listen", - **kwargs, - ) -> AsyncPrerecordedResponse: - """ - Transcribes audio from a URL source and sends the result to a callback URL. - - Args: - source (UrlSource): The URL source of the audio to transcribe. - callback (str): The callback URL where the transcription results will be sent. - options (ListenRESTOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/listen"). - - Returns: - AsyncPrerecordedResponse: An object containing the request_id or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("ListenRESTClient.transcribe_url_callback ENTER") - - url = f"{self._config.url}/{endpoint}" - if options is None: - options = {} - if isinstance(options, ListenRESTOptions): - options.callback = callback - else: - options["callback"] = callback - if is_url_source(source): - body = source - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("ListenRESTClient.transcribe_url_callback LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, ListenRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("ListenRESTClient.transcribe_url_callback LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, ListenRESTOptions): - self._logger.info("ListenRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AsyncPrerecordedResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("transcribe_url_callback succeeded") - self._logger.debug("ListenRESTClient.transcribe_url_callback LEAVE") - return res - - def transcribe_file( - self, - source: FileSource, - options: Optional[Union[Dict, ListenRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/listen", - **kwargs, - ) -> Union[AsyncPrerecordedResponse, PrerecordedResponse]: - """ - Transcribes audio from a local file source. - - Args: - source (FileSource): The local file source of the audio to transcribe. - options (ListenRESTOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/listen"). - - Returns: - PrerecordedResponse: An object containing the transcription result or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("ListenRESTClient.transcribe_file ENTER") - - if ( - isinstance(options, dict) - and "callback" in options - and options["callback"] is not None - ) or (isinstance(options, ListenRESTOptions) and options.callback is not None): - self._logger.debug("ListenRESTClient.transcribe_file LEAVE") - return self.transcribe_file_callback( - source, - callback=options["callback"], - options=options, - addons=addons, - headers=headers, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - url = f"{self._config.url}/{endpoint}" - - if is_buffer_source(source): - body = source["buffer"] # type: ignore - elif is_readstream_source(source): - body = source["stream"] # type: ignore - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("ListenRESTClient.transcribe_file LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, ListenRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("ListenRESTClient.transcribe_file LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - if isinstance(options, ListenRESTOptions): - self._logger.info("ListenRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, - options=options, - addons=addons, - headers=headers, - content=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = PrerecordedResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("transcribe_file succeeded") - self._logger.debug("ListenRESTClient.transcribe_file LEAVE") - return res - - def transcribe_file_callback( - self, - source: FileSource, - callback: str, - options: Optional[Union[Dict, ListenRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/listen", - **kwargs, - ) -> AsyncPrerecordedResponse: - """ - Transcribes audio from a local file source and sends the result to a callback URL. - - Args: - source (FileSource): The local file source of the audio to transcribe. - callback (str): The callback URL where the transcription results will be sent. - options (ListenRESTOptions): Additional options for the transcription (default is None). - endpoint (str): The API endpoint for the transcription (default is "v1/listen"). - - Returns: - AsyncPrerecordedResponse: An object containing the request_id or an error message. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("ListenRESTClient.transcribe_file_callback ENTER") - - url = f"{self._config.url}/{endpoint}" - if options is None: - options = {} - if isinstance(options, ListenRESTOptions): - options.callback = callback - else: - options["callback"] = callback - if is_buffer_source(source): - body = source["buffer"] # type: ignore - elif is_readstream_source(source): - body = source["stream"] # type: ignore - else: - self._logger.error("Unknown transcription source type") - self._logger.debug("ListenRESTClient.transcribe_file_callback LEAVE") - raise DeepgramTypeError("Unknown transcription source type") - - if isinstance(options, ListenRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("ListenRESTClient.transcribe_file_callback LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._logger.info("url: %s", url) - if isinstance(options, ListenRESTOptions): - self._logger.info("ListenRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, - options=options, - addons=addons, - headers=headers, - content=body, - timeout=timeout, - **kwargs, - ) - self._logger.info("json: %s", result) - res = AsyncPrerecordedResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("transcribe_file_callback succeeded") - self._logger.debug("ListenRESTClient.transcribe_file_callback LEAVE") - return res - - # pylint: enable=too-many-positional-arguments diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/helpers.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/helpers.py deleted file mode 100644 index 2def898f..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/helpers.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .options import PrerecordedSource - - -def is_buffer_source(provided_source: PrerecordedSource) -> bool: - """ - Check if the provided source is a buffer source. - """ - return "buffer" in provided_source - - -def is_readstream_source(provided_source: PrerecordedSource) -> bool: - """ - Check if the provided source is a readstream source. - """ - return "stream" in provided_source - - -def is_url_source(provided_source: PrerecordedSource) -> bool: - """ - Check if the provided source is a URL source. - """ - return "url" in provided_source diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/options.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/options.py deleted file mode 100644 index 1c44d54e..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/options.py +++ /dev/null @@ -1,181 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import Union, List, Optional -import logging - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from deepgram.utils import verboselogs -from ....common import ( - TextSource, - StreamSource, - BufferSource, - FileSource, - UrlSource, - BaseResponse, -) - - -@dataclass -class PrerecordedOptions(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - Contains all the options for the PrerecordedClient. - - Reference: - https://developers.deepgram.com/reference/pre-recorded - """ - - alternatives: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - channels: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - callback: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - callback_method: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - custom_intent: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - custom_intent_mode: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - custom_topic: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - custom_topic_mode: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - detect_entities: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - detect_language: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - detect_topics: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - diarize: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - diarize_version: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - dictation: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - encoding: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - extra: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - filler_words: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - intents: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - keyterm: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - keywords: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - language: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - measurements: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - model: Optional[str] = field( - default="None", metadata=dataclass_config(exclude=lambda f: f is None) - ) - multichannel: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - numerals: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - paragraphs: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - profanity_filter: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - punctuate: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - redact: Optional[Union[List[str], bool, str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - replace: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sample_rate: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - search: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - smart_format: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - summarize: Optional[Union[bool, str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - tag: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - tier: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - topics: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - utt_split: Optional[float] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - utterances: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - version: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def check(self): - """ - Check the options for any deprecated fields or values. - """ - logger = verboselogs.VerboseLogger(__name__) - logger.addHandler(logging.StreamHandler()) - prev = logger.level - logger.setLevel(verboselogs.ERROR) - - if self.tier: - logger.error( - "WARNING: Tier is deprecated. Will be removed in a future version." - ) - - logger.setLevel(prev) - - return True - - -ListenRESTOptions = PrerecordedOptions - -# unique -PrerecordedSource = Union[UrlSource, FileSource] -ListenRestSource = PrerecordedSource - -# PrerecordedSource for backwards compatibility -PreRecordedStreamSource = StreamSource diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/response.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/response.py deleted file mode 100644 index e24e9c2f..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/rest/response.py +++ /dev/null @@ -1,470 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional, Dict, Any - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -# between analyze and listen -from ....common import ( - BaseResponse, - Average, - Intent, - Intents, - IntentsInfo, - Segment, - SentimentInfo, - Sentiment, - Sentiments, - SummaryInfo, - Topic, - Topics, - TopicsInfo, -) - -# between rest and websocket -from ....common import ( - ModelInfo, - Hit, - Search, -) - -# Async Prerecorded Response Types: - - -@dataclass -class AsyncPrerecordedResponse(BaseResponse): - """ - The response object for the async prerecorded API. - """ - - request_id: str = "" - - -# Prerecorded Response Types: - - -@dataclass -class Metadata(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - The metadata for the response. - """ - - transaction_key: str = "" - request_id: str = "" - sha256: str = "" - created: str = "" - duration: float = 0 - channels: int = 0 - models: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - # pylint: disable=used-before-assignment - warnings: Optional[List[Warning]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - # pylint: enable=used-before-assignment - model_info: Optional[Dict[str, ModelInfo]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - summary_info: Optional[SummaryInfo] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - intents_info: Optional[IntentsInfo] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment_info: Optional[SentimentInfo] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - topics_info: Optional[TopicsInfo] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - extra: Optional[Dict] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "models" in _dict: - _dict["models"] = [str(models) for models in _dict["models"]] - if "warnings" in _dict: - _dict["warnings"] = [ - Warning.from_dict(warnings) for warnings in _dict["warnings"] - ] - if "model_info" in _dict: - _dict["model_info"] = [ - ModelInfo.from_dict(model_info) - for _, model_info in _dict["model_info"].items() - ] - if "summary_info" in _dict: - _dict["summary_info"] = SummaryInfo.from_dict(_dict["summary_info"]) - if "intents_info" in _dict: - _dict["intents_info"] = IntentsInfo.from_dict(_dict["intents_info"]) - if "sentiment_info" in _dict: - _dict["sentiment_info"] = SentimentInfo.from_dict(_dict["sentiment_info"]) - if "topics_info" in _dict: - _dict["topics_info"] = TopicsInfo.from_dict(_dict["topics_info"]) - if "extra" in _dict: - _dict["extra"] = [str(extra) for _, extra in _dict["extra"].items()] - return _dict[key] - - -@dataclass -class SummaryV1(BaseResponse): - """ - The summary information for the response. - """ - - summary: str = "" - start_word: float = 0 - end_word: float = 0 - - -Summaries = SummaryV1 - - -@dataclass -class SummaryV2(BaseResponse): - """ - The summary information for the response. - """ - - result: str = "" - short: str = "" - - -Summary = SummaryV2 - - -@dataclass -class ListenRESTWord(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - The word information for the response. - """ - - word: str = "" - start: float = 0 - end: float = 0 - confidence: float = 0 - punctuated_word: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - speaker: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - language: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - speaker_confidence: Optional[float] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment: Optional[Sentiment] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment_score: Optional[float] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "sentiment" in _dict: - _dict["sentiment"] = Sentiment.from_dict(_dict["sentiment"]) - return _dict[key] - - -@dataclass -class Sentence(BaseResponse): - """ - The sentence information for the response. - """ - - text: str = "" - start: float = 0 - end: float = 0 - sentiment: Optional[Sentiment] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment_score: Optional[float] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "sentiment" in _dict: - _dict["sentiment"] = Sentiment.from_dict(_dict["sentiment"]) - return _dict[key] - - -@dataclass -class Paragraph(BaseResponse): - """ - The paragraph information for the response. - """ - - sentences: List[Sentence] = field(default_factory=list) - start: float = 0 - end: float = 0 - num_words: int = 0 - speaker: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment: Optional[Sentiment] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment_score: Optional[float] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "sentences" in _dict: - _dict["sentences"] = [ - Sentence.from_dict(sentences) for sentences in _dict["sentences"] - ] - if "sentiment" in _dict: - _dict["sentiment"] = Sentiment.from_dict(_dict["sentiment"]) - return _dict[key] - - -@dataclass -class Paragraphs(BaseResponse): - """ - The paragraphs information for the response. - """ - - transcript: Optional[str] = "" - paragraphs: Optional[List[Paragraph]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "paragraphs" in _dict: - _dict["paragraphs"] = [ - Paragraph.from_dict(paragraphs) for paragraphs in _dict["paragraphs"] - ] - return _dict[key] - - -@dataclass -class Translation(BaseResponse): - """ - The translation information for the response. - """ - - language: Optional[str] = "" - translation: Optional[str] = "" - - -@dataclass -class Warning(BaseResponse): # pylint: disable=used-before-assignment,redefined-builtin - """ - The warning information for the response. - """ - - parameter: str = "" - type: str = "" - message: str = "" - - -@dataclass -class Utterance(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - The utterance information for the response. - """ - - start: float = 0 - end: float = 0 - confidence: float = 0 - channel: int = 0 - transcript: str = "" - words: List[ListenRESTWord] = field(default_factory=list) - speaker: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment: Optional[Sentiment] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment_score: Optional[float] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - id: str = "" - - def __getitem__(self, key): - _dict = self.to_dict() - if "words" in _dict: - _dict["words"] = [ - ListenRESTWord.from_dict(words) for words in _dict["words"] - ] - if "sentiment" in _dict: - _dict["sentiment"] = Sentiment.from_dict(_dict["sentiment"]) - return _dict[key] - - -@dataclass -class Entity(BaseResponse): - """ - The entity information for the response. - """ - - label: str = "" - value: str = "" - confidence: float = 0 - start_word: float = 0 - end_word: float = 0 - - -@dataclass -class ListenRESTAlternative( - BaseResponse -): # pylint: disable=too-many-instance-attributes - """ - The alternative information for the response. - """ - - transcript: str = "" - confidence: float = 0 - words: List[ListenRESTWord] = field(default_factory=list) - summaries: Optional[List[SummaryV1]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - paragraphs: Optional[Paragraphs] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - entities: Optional[List[Entity]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - translations: Optional[List[Translation]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - languages: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "words" in _dict: - _dict["words"] = [ - ListenRESTWord.from_dict(words) for words in _dict["words"] - ] - if "summaries" in _dict: - _dict["summaries"] = [ - SummaryV1.from_dict(summaries) for summaries in _dict["summaries"] - ] - if "paragraphs" in _dict: - _dict["paragraphs"] = Paragraphs.from_dict(_dict["paragraphs"]) - if "entities" in _dict: - _dict["entities"] = [ - Entity.from_dict(entities) for entities in _dict["entities"] - ] - if "translations" in _dict: - _dict["translations"] = [ - Translation.from_dict(translations) - for translations in _dict["translations"] - ] - return _dict[key] - - -@dataclass -class ListenRESTChannel(BaseResponse): - """ - The channel information for the response. - """ - - search: Optional[List[Search]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - alternatives: List[ListenRESTAlternative] = field(default_factory=list) - detected_language: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - language_confidence: Optional[float] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "search" in _dict: - _dict["search"] = [Search.from_dict(search) for search in _dict["search"]] - if "alternatives" in _dict: - _dict["alternatives"] = [ - ListenRESTAlternative.from_dict(alternatives) - for alternatives in _dict["alternatives"] - ] - return _dict[key] - - -@dataclass -class Results(BaseResponse): - """ - The results information for the response. - """ - - channels: Optional[List[ListenRESTChannel]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - utterances: Optional[List[Utterance]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - summary: Optional[SummaryV2] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiments: Optional[Sentiments] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - topics: Optional[Topics] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - intents: Optional[Intents] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "channels" in _dict: - _dict["channels"] = [ - ListenRESTChannel.from_dict(channels) for channels in _dict["channels"] - ] - if "utterances" in _dict: - _dict["utterances"] = [ - Utterance.from_dict(utterances) for utterances in _dict["utterances"] - ] - if "summary" in _dict: - _dict["summary"] = SummaryV2.from_dict(_dict["summary"]) - if "sentiments" in _dict: - _dict["sentiments"] = Sentiments.from_dict(_dict["sentiments"]) - if "topics" in _dict: - _dict["topics"] = Topics.from_dict(_dict["topics"]) - if "intents" in _dict: - _dict["intents"] = Intents.from_dict(_dict["intents"]) - return _dict[key] - - -# Prerecorded Response Result: - - -@dataclass -class PrerecordedResponse(BaseResponse): - """ - The response object for the prerecorded API. - """ - - metadata: Optional[Metadata] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - results: Optional[Results] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "metadata" in _dict: - _dict["metadata"] = Metadata.from_dict(_dict["metadata"]) - if "results" in _dict: - _dict["results"] = Results.from_dict(_dict["results"]) - return _dict[key] - - -SyncPrerecordedResponse = PrerecordedResponse diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__init__.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__init__.py deleted file mode 100644 index 9f6891d8..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .client import ListenWebSocketClient -from .async_client import AsyncListenWebSocketClient -from .options import LiveOptions, ListenWebSocketOptions - -# unique websocket response -from .response import ( - #### top level - LiveResultResponse, - MetadataResponse, - SpeechStartedResponse, - UtteranceEndResponse, - #### common websocket response - BaseResponse, - OpenResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, - #### between rest and websocket - ModelInfo, - Hit, - Search, - #### unique - Metadata, - ListenWSWord, - ListenWSAlternative, - ListenWSChannel, -) diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 11c364e0a2c4efff2e726d6e0f533ae55eeee3cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 834 zcmZvaON$dh5XXD+n7n2-@2rS;kDx*HARQg-!CI`7N1_s9%K>vW}V&1Y>f+Lj1MS6 zkwX!4u;W-eLo+Okvuis`b1aYZ%*F27&(Q)a;vy^I5-Z~}tKbUru*ZDtvjcp6M)49(QWYm$>drq|TfJM;4V(4`0)Fgwh9fKkfQDm>Q$0e)suT#qLpb7pRPPy)w&bRmcaj3%d;WkX*Mk0$5Q*4F>!*B1cto$YC>?@9 z=gJUCjoMgHs7Y2Cs(0x50CebCsmQGKoXzPtC6fOW@036rTq&R&X~Z;haoC1`$9y z6@>LR6UZK2?@VubzxN)_<$7;=lS#~DHJRK?S69U+EQuBro{HP1vE4M;HTaQr9OqXV aId{IGhhNd7OSkQ0F4153XKyZpld diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/async_client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/async_client.cpython-312.pyc deleted file mode 100644 index b112e1909843de5a0b0e582f3677505aad1e90cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29504 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 diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/client.cpython-312.pyc deleted file mode 100644 index 77674929795e6b244016a992ad2139d03d2edd0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27976 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 UbAD2O(Q5GIOwFGfF+kw>KVLop*8l(j diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/options.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/options.cpython-312.pyc deleted file mode 100644 index 5765297e0e82bde47af9ac047432af07bf647a0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8975 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 diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/response.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/__pycache__/response.cpython-312.pyc deleted file mode 100644 index 5850286e7c1af51e8303f7124790c3498677d711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9523 zcmd5?TWl0pny#)}-!E==`-a_ZForY%JYmd$fq21~fD-{(X;<@RXm%pzY5)J!#qFj% zlWdsXEvf%H=ltiKI(07J|NVdUFM~lJ1J~@oo}PNYg<<|3Gu9=ViQ1HlVLoPLMt0?y zf=hB0Scxrg5?A0Q-i76CUMPr?Sa3^jn&-iEnwN#VzYvfDg`gBHgrra*EQJdZ zDMEE3=$fRaLR5+tnx$qJLqwK2&B*S*Vq^~qe8L$c_{1ED6f^Z+(EA+paZ~RHeZWEA zV(NpS4>{;tO??>j5eI#nsc!;()Ir~F>YG6ybI^B~`Z(xY9Q51fT2pPm!M9EEI)65& zYP#qAjFu}EGkKjK&Sf>7J5iiVvAS2zXqjw2qpG?vkt2CI<T8}VB9f5I9mDM&&@Xon2+7iee$Ywg%33~eH2n@~d= zSbxVhO?A(SV4FEls!0#vLXqMJV;__hc|Pvzh6|J3rOVSKtI@p9==?P(Q*g+-plTTf z){+!u-A7kVCdDin&6=-9UkhvE0jS{#{g_#RgEq^IG51`f_dw{b2^DL1|8DB!k?{*E zQPlCbMn>KnA13M*tu!-!wUo<}6O*K-q2nVD2F zg}!V)2i4TRJbjP8tFQH4BbU`u_6pJZ6mtXZpPBoe=U6^dxGZM|=i~LSyx%HLS)*NK z9&CT0JxDDwH7LT-y2kZ%45Mgzi>nNahMr{&)}U+x$RJK2w~Wh3QX4bx%57 z%oIpEt^3mHLP?&@V>*yde}6WUH#P2bS}tYNX$8QU(K%I9^l&#0U z;kOT^2JK_)`vBQ6~reZljv!vk`Nb9FI_BWZ`xIoI~%Gb#lZ?Lj!fxXHosRc;kR1Pygk%9G1xD$qO{W|ib8bnXg)SvKlm z8x;=~LO(q}x<8$sBpTptA)TI2I?Z5Rh2z-%42VSrcKgSHTY-NFEeUJ>Xqi;~+tx-# zKfCse#1~x`9|*VetBL+wX8d@8E!gS4_A1qGw;VCpc6*H9clK@sD-n4+-3=fM)tnNV=8=o~2hn4-%~;bR!H z4WMxd%TQof>NtoE&}c zhIdfxsCjsy!#Mi*IOn6Ufu`~3!|~>27Nj6^VB~pge=G|&nGgvQ6E98)J-j}dk`io5 z{L5~ug%p5V1~B+!5AG<011U7erhIzXTJV!Vq>3az-$swNnX5n6FXe=`H9XEfoue=; z$I~gQl)WhfP(cr5Hb7{L)A|hRAqV-ErxkY-y{2&wHC(^%w92fF11zoz-~eBT1H5KY zPsR}k>~*$rfCn64x55Dv5qLlZZd4h8=P7T3Nb$;_U^UW zF+@x-KtaJXGrz5IvFd=}U8tb`4TuIHXfDrI{he!Xy!F|cPfK4U-v7xPx38{(X-)Rs z7at`LeV%w9fZ&yz=hyu0l?zq>j&+gg-E((;b?3lu1+F*rWvu%d$29F+jqIyN_T9}t ziX45)K{+(qUkz*rlOBoN01{-9AGn@B6FolXatYbs6~N4^(_!4cs%hiyIyTz0l+2RSUOXFud?gbcr{>v z0uYM6{s+Sk_m3=|E${qQ>z-=#)fIlE#(OQSz@DA4VgWRbSOMoJeh)Na>NsXTnA>d z$*iLt)X;T&Pjv`Av zw8ZQMtHYElP*eR|5Dl2pS~*ztcYir_`m;cF=)!L~wkNdKKlqV%HPTa!^xS##QKauF z76M4@tp<_+DS>8#j|>d{jIF4Y8;0shmr_=!Pr3s9kxLb2m*7`wq$-oexc+Ta`-z6{bGM^K>#5XGOt zPepj$U?fc);HIp#v{}5wPCb4BZgz{nQ4W`fE6tT`rR~;e)!$?C5RZi|_z-7o`3y8$ zV+#?Hi%={uLL!0@5WIi5DMZ51+Dlt|qzKKKxFR)?DCn$kh*u6mkIixj zFe+^A;N^&oQ85xHQ4^V(3}lj8Xb(}EgOHZgIu}gE^ypdeRUj|~F1!^Un*T0EETgdd z98p#9aJ!K+cWYCmd)N##bibX?XaHOVT3dH#4RWOHh6yszjMwI7h(St%rWUYHCfAL) ziASDQsM||@-ZyklPEAkbAUO6?;0_FPNrV^m@2>-kd;sFkz$mTitKicSRu zJPKM8)HG0!0v;t$e~M*jQ>s$-9tne*sk*E>zd7RvN|GkIFBa7$C{T1%kzzTn4t)&$L zGGv8stqTXmJD^Nn;X5AhOf@jKUJ)7}t_yyea4tM&zt(8QG#`3|huv94&SHP?RYO*R_sr(Yh5|Q{)!qW{TA@!0NU+ ze=4p=EJ9!-^+AfgR`J)xYKqPZZb>~%BTx`!g6Lx!Vjv2dXI)gMG6xQR4=`OJ7{)b% zQ@BBOj|t>2Cm7Xk4c&Sp8=~*Q!yF-6q_kLl88P0ipT4~L>B!aoxDWi7%@0H_w8`GM zp@7ow#cx8tlMaElAPux(U-a7KriV8N)lA!R%%<8%%o;97s@+jXwQ=P1nnvVnxHi%6 z&PMtzLwFCug-G=|JQ7a9fKAUAU!eM;w(+KR6xgQvBBlD2t~mt|Y2d)5`eqth0PW{T zm1!7{@&fm#F}Mq;qJ;N2q*Cri=1-fxzp1^7vt&2`^&UXy3&*3*9{w1bs6PkMU=Pjc z0?_*FKTUp-7`c1(wtDA#Kl+Q$6C+^HXjs8;767bwy?XapwfFF9?_jleaHaS7R|3}) z`nTBj@`>_1#uz&4+=m(mI_QDA51w!1J~T1OH(k$bJoNV*zK5X~(FE^tJ37?Ie;P^- z^@~3X#fOfFsdh)xx?xMHeI?M8!j>|DsYw(FRfa8{!W6Zy)bP@k>F^)`yk@hZ^b~5W(y5RAQCvoqqZC`46~2;O+#iFYY~F1K`_D8 zJi~VruO1(x{CW((pKg4fo*$xC%~AKwO&s+l}`$Y)Ce;qXXaX1ZM&A;tJs4!8E z3!$I_MHPPEU?H}30;@gvknc1W0(%%ub?PGcv$^7=!P$B2o1zB#g1X=SHcM0m(Y*1K zEm70cYN@DT=!r6V{D()O03{efQ35EyHZw{HMHmHzBSc0cMjgWx#;9prmAY7z?Ndym z`;ES9gI56G`Hip9gUWSi3-p0eT_D#vm&^5)k8$l=VfOwf^UAN8Ltlxai~TPK#8*+? z#Xey`tj8GE|BP*NiREK825vPD3f8e;{S~T;xH>9(YYf~>6{Oa8QB||6qnxiXa5Ghq zTHi}mF;~aZLXCl&se;scKUHmm4m)cM+)Ndu)`whFw;g(fW^glgkXj!#bZ%FBiA3m diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/async_client.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/async_client.py deleted file mode 100644 index 0ed81c0c..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/async_client.py +++ /dev/null @@ -1,587 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT -import asyncio -import json -import logging -from typing import Dict, Union, Optional, cast, Any, Callable -from datetime import datetime -import threading - -from .....utils import verboselogs -from .....options import DeepgramClientOptions -from ...enums import LiveTranscriptionEvents -from ....common import AbstractAsyncWebSocketClient -from ....common import DeepgramError - -from .response import ( - OpenResponse, - LiveResultResponse, - MetadataResponse, - SpeechStartedResponse, - UtteranceEndResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, -) -from .options import ListenWebSocketOptions - -ONE_SECOND = 1 -HALF_SECOND = 0.5 -DEEPGRAM_INTERVAL = 5 -PING_INTERVAL = 20 - - -class AsyncListenWebSocketClient( - AbstractAsyncWebSocketClient -): # pylint: disable=too-many-instance-attributes - """ - Client for interacting with Deepgram's live transcription services over WebSockets. - - This class provides methods to establish a WebSocket connection for live transcription and handle real-time transcription events. - - Args: - config (DeepgramClientOptions): all the options for the client. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - _event_handlers: Dict[LiveTranscriptionEvents, list] - - _keep_alive_thread: Union[asyncio.Task, None] - _flush_thread: Union[asyncio.Task, None] - _last_datagram: Optional[datetime] = None - - _kwargs: Optional[Dict] = None - _addons: Optional[Dict] = None - _options: Optional[Dict] = None - _headers: Optional[Dict] = None - - def __init__(self, config: DeepgramClientOptions): - if config is None: - raise DeepgramError("Config is required") - - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - - self._config = config - self._endpoint = "v1/listen" - - self._flush_thread = None - self._keep_alive_thread = None - - # auto flush - self._last_datagram = None - self._lock_flush = threading.Lock() - - # init handlers - self._event_handlers = { - event: [] for event in LiveTranscriptionEvents.__members__.values() - } - - # call the parent constructor - super().__init__(self._config, self._endpoint) - - # pylint: disable=too-many-branches,too-many-statements - async def start( - self, - options: Optional[Union[ListenWebSocketOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - members: Optional[Dict] = None, - **kwargs, - ) -> bool: - """ - Starts the WebSocket connection for live transcription. - """ - self._logger.debug("AsyncListenWebSocketClient.start ENTER") - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - self._logger.info("members: %s", members) - self._logger.info("kwargs: %s", kwargs) - - if isinstance(options, ListenWebSocketOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AsyncListenWebSocketClient.start LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._addons = addons - self._headers = headers - - # add "members" as members of the class - if members is not None: - self.__dict__.update(members) - - # set kwargs as members of the class - if kwargs is not None: - self._kwargs = kwargs - else: - self._kwargs = {} - - if isinstance(options, ListenWebSocketOptions): - self._logger.info("ListenWebSocketOptions switching class -> dict") - self._options = options.to_dict() - elif options is not None: - self._options = options - else: - self._options = {} - - try: - # call parent start - if ( - await super().start( - self._options, - self._addons, - self._headers, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - is False - ): - self._logger.error("AsyncListenWebSocketClient.start failed") - self._logger.debug("AsyncListenWebSocketClient.start LEAVE") - return False - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # keepalive thread - if self._config.is_keep_alive_enabled(): - self._logger.notice("keepalive is enabled") - self._keep_alive_thread = asyncio.create_task(self._keep_alive()) - else: - self._logger.notice("keepalive is disabled") - - # flush thread - if self._config.is_auto_flush_reply_enabled(): - self._logger.notice("autoflush is enabled") - self._flush_thread = asyncio.create_task(self._flush()) - else: - self._logger.notice("autoflush is disabled") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("start succeeded") - self._logger.debug("AsyncListenWebSocketClient.start LEAVE") - return True - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "WebSocketException in AsyncListenWebSocketClient.start: %s", e - ) - self._logger.debug("AsyncListenWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect") is True: - raise - return False - - # pylint: enable=too-many-branches,too-many-statements - - def on(self, event: LiveTranscriptionEvents, handler: Callable) -> None: - """ - Registers event handlers for specific events. - """ - self._logger.info("event subscribed: %s", event) - if event in LiveTranscriptionEvents.__members__.values() and callable(handler): - self._event_handlers[event].append(handler) - - # triggers the registered event handlers for a specific event - async def _emit(self, event: LiveTranscriptionEvents, *args, **kwargs) -> None: - """ - Emits events to the registered event handlers. - """ - self._logger.debug("AsyncListenWebSocketClient._emit ENTER") - self._logger.debug("callback handlers for: %s", event) - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - tasks = [] - for handler in self._event_handlers[event]: - task = asyncio.create_task(handler(self, *args, **kwargs)) - tasks.append(task) - - if tasks: - self._logger.debug("waiting for tasks to finish...") - await asyncio.gather(*tasks, return_exceptions=True) - tasks.clear() - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.debug("AsyncListenWebSocketClient._emit LEAVE") - - async def _process_text(self, message: str) -> None: - """ - Processes messages received over the WebSocket connection. - """ - self._logger.debug("AsyncListenWebSocketClient._process_text ENTER") - - try: - self._logger.debug("Text data received") - if len(message) == 0: - self._logger.debug("message is empty") - self._logger.debug("AsyncListenWebSocketClient._process_text LEAVE") - return - - data = json.loads(message) - response_type = data.get("type") - self._logger.debug("response_type: %s, data: %s", response_type, data) - - match response_type: - case LiveTranscriptionEvents.Open: - open_result: OpenResponse = OpenResponse.from_json(message) - self._logger.verbose("OpenResponse: %s", open_result) - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Open), - open=open_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.Transcript: - msg_result: LiveResultResponse = LiveResultResponse.from_json( - message - ) - self._logger.verbose("LiveResultResponse: %s", msg_result) - - # auto flush - if self._config.is_inspecting_listen(): - inspect_res = await self._inspect(msg_result) - if not inspect_res: - self._logger.error("inspect_res failed") - - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Transcript), - result=msg_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.Metadata: - meta_result: MetadataResponse = MetadataResponse.from_json(message) - self._logger.verbose("MetadataResponse: %s", meta_result) - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Metadata), - metadata=meta_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.SpeechStarted: - ss_result: SpeechStartedResponse = SpeechStartedResponse.from_json( - message - ) - self._logger.verbose("SpeechStartedResponse: %s", ss_result) - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.SpeechStarted), - speech_started=ss_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.UtteranceEnd: - ue_result: UtteranceEndResponse = UtteranceEndResponse.from_json( - message - ) - self._logger.verbose("UtteranceEndResponse: %s", ue_result) - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.UtteranceEnd), - utterance_end=ue_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.Close: - close_result: CloseResponse = CloseResponse.from_json(message) - self._logger.verbose("CloseResponse: %s", close_result) - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Close), - close=close_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.Error: - err_error: ErrorResponse = ErrorResponse.from_json(message) - self._logger.verbose("ErrorResponse: %s", err_error) - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Error), - error=err_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case _: - self._logger.warning( - "Unknown Message: response_type: %s, data: %s", - response_type, - data, - ) - unhandled_error: UnhandledResponse = UnhandledResponse( - type=LiveTranscriptionEvents(LiveTranscriptionEvents.Unhandled), - raw=message, - ) - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Unhandled), - unhandled=unhandled_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.notice("_process_text Succeeded") - self._logger.debug("AsyncListenWebSocketClient._process_text LEAVE") - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in AsyncListenWebSocketClient._process_text: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in AsyncListenWebSocketClient._process_text", - f"{e}", - "Exception", - ) - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - await super()._signal_exit() - - self._logger.debug("AsyncListenWebSocketClient._process_text LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - # pylint: enable=too-many-return-statements,too-many-statements - - async def _process_binary(self, message: bytes) -> None: - raise NotImplementedError("no _process_binary method should be called") - - # pylint: disable=too-many-return-statements - async def _keep_alive(self) -> None: - """ - Sends keepalive messages to the WebSocket connection. - """ - self._logger.debug("AsyncListenWebSocketClient._keep_alive ENTER") - - counter = 0 - while True: - try: - counter += 1 - await asyncio.sleep(ONE_SECOND) - - if self._exit_event.is_set(): - self._logger.notice("_keep_alive exiting gracefully") - self._logger.debug("AsyncListenWebSocketClient._keep_alive LEAVE") - return - - # deepgram keepalive - if counter % DEEPGRAM_INTERVAL == 0: - await self.keep_alive() - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in AsyncListenWebSocketClient._keep_alive: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in AsyncListenWebSocketClient._keep_alive", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in AsyncListenWebSocketClient._keep_alive: %s", str(e) - ) - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - await super()._signal_exit() - - self._logger.debug("AsyncListenWebSocketClient._keep_alive LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - ## pylint: disable=too-many-return-statements,too-many-statements - async def _flush(self) -> None: - self._logger.debug("AsyncListenWebSocketClient._flush ENTER") - - delta_in_ms_str = self._config.options.get("auto_flush_reply_delta") - if delta_in_ms_str is None: - self._logger.error("auto_flush_reply_delta is None") - self._logger.debug("AsyncListenWebSocketClient._flush LEAVE") - return - delta_in_ms = float(delta_in_ms_str) - - while True: - try: - await asyncio.sleep(HALF_SECOND) - - if self._exit_event.is_set(): - self._logger.notice("_flush exiting gracefully") - self._logger.debug("AsyncListenWebSocketClient._flush LEAVE") - return - - if self._last_datagram is None: - self._logger.debug("AutoFlush last_datagram is None") - continue - - delta = datetime.now() - self._last_datagram - diff_in_ms = delta.total_seconds() * 1000 - self._logger.debug("AutoFlush delta: %f", diff_in_ms) - if diff_in_ms < delta_in_ms: - self._logger.debug("AutoFlush delta is less than threshold") - continue - - self._last_datagram = None - await self.finalize() - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in AsyncListenWebSocketClient._flush: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in AsyncListenWebSocketClient._flush", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in AsyncListenWebSocketClient._flush: %s", str(e) - ) - await self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - await super()._signal_exit() - - self._logger.debug("AsyncListenWebSocketClient._flush LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - # pylint: enable=too-many-return-statements - - async def keep_alive(self) -> bool: - """ - Sends a KeepAlive message - """ - self._logger.spam("AsyncListenWebSocketClient.keep_alive ENTER") - - self._logger.notice("Sending KeepAlive...") - ret = await self.send(json.dumps({"type": "KeepAlive"})) - - if not ret: - self._logger.error("keep_alive failed") - self._logger.spam("AsyncListenWebSocketClient.keep_alive LEAVE") - return False - - self._logger.notice("keep_alive succeeded") - self._logger.spam("AsyncListenWebSocketClient.keep_alive LEAVE") - - return True - - async def finalize(self) -> bool: - """ - Finalizes the Transcript connection by flushing it - """ - self._logger.spam("AsyncListenWebSocketClient.finalize ENTER") - - self._logger.notice("Sending Finalize...") - ret = await self.send(json.dumps({"type": "Finalize"})) - - if not ret: - self._logger.error("finalize failed") - self._logger.spam("AsyncListenWebSocketClient.finalize LEAVE") - return False - - self._logger.notice("finalize succeeded") - self._logger.spam("AsyncListenWebSocketClient.finalize LEAVE") - - return True - - async def _close_message(self) -> bool: - return await self.send(json.dumps({"type": "CloseStream"})) - - async def finish(self) -> bool: - """ - Closes the WebSocket connection gracefully. - """ - self._logger.debug("AsyncListenWebSocketClient.finish ENTER") - - # stop the threads - self._logger.verbose("cancelling tasks...") - try: - # call parent finish - if await super().finish() is False: - self._logger.error("AsyncListenWebSocketClient.finish failed") - - # Before cancelling, check if the tasks were created - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - tasks = [] - if self._keep_alive_thread is not None: - self._keep_alive_thread.cancel() - tasks.append(self._keep_alive_thread) - self._logger.notice("processing _keep_alive_thread cancel...") - - if self._flush_thread is not None: - self._flush_thread.cancel() - tasks.append(self._flush_thread) - self._logger.notice("processing _flush_thread cancel...") - - # Use asyncio.gather to wait for tasks to be cancelled - # Prevent indefinite waiting by setting a timeout - await asyncio.wait_for(asyncio.gather(*tasks), timeout=10) - self._logger.notice("threads joined") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("finish succeeded") - self._logger.spam("AsyncListenWebSocketClient.finish LEAVE") - return True - - except asyncio.CancelledError as e: - self._logger.error("tasks cancelled error: %s", e) - self._logger.debug("AsyncListenWebSocketClient.finish LEAVE") - return False - - except asyncio.TimeoutError as e: - self._logger.error("tasks cancellation timed out: %s", e) - self._logger.debug("AsyncListenWebSocketClient.finish LEAVE") - return False - - async def _inspect(self, msg_result: LiveResultResponse) -> bool: - # auto flush_inspect is generically used to track any messages you might want to snoop on - # place additional logic here to inspect messages of interest - - # for auto flush functionality - # set the last datagram - sentence = msg_result.channel.alternatives[0].transcript - if len(sentence) == 0: - return True - - if msg_result.is_final: - self._logger.debug("AutoFlush is_final received") - self._last_datagram = None - else: - self._last_datagram = datetime.now() - self._logger.debug( - "AutoFlush interim received: %s", - str(self._last_datagram), - ) - - return True diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/client.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/client.py deleted file mode 100644 index e6633689..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/client.py +++ /dev/null @@ -1,590 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT -import json -import time -import logging -from typing import Dict, Union, Optional, cast, Any, Callable, Type -from datetime import datetime -import threading - -from .....utils import verboselogs -from .....options import DeepgramClientOptions -from ...enums import LiveTranscriptionEvents -from ....common import AbstractSyncWebSocketClient -from ....common import DeepgramError - -from .response import ( - OpenResponse, - LiveResultResponse, - MetadataResponse, - SpeechStartedResponse, - UtteranceEndResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, -) -from .options import ListenWebSocketOptions - -ONE_SECOND = 1 -HALF_SECOND = 0.5 -DEEPGRAM_INTERVAL = 5 -PING_INTERVAL = 20 - - -class ListenWebSocketClient( - AbstractSyncWebSocketClient -): # pylint: disable=too-many-instance-attributes - """ - Client for interacting with Deepgram's live transcription services over WebSockets. - - This class provides methods to establish a WebSocket connection for live transcription and handle real-time transcription events. - - Args: - config (DeepgramClientOptions): all the options for the client. - thread_cls (Type[threading.Thread]): optional thread class to use for creating threads, - defaults to threading.Thread. Useful for custom thread management like ContextVar support. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - _lock_flush: threading.Lock - _event_handlers: Dict[LiveTranscriptionEvents, list] - - _keep_alive_thread: Union[threading.Thread, None] - _flush_thread: Union[threading.Thread, None] - _last_datagram: Optional[datetime] = None - - _thread_cls: Type[threading.Thread] - - _kwargs: Optional[Dict] = None - _addons: Optional[Dict] = None - _options: Optional[Dict] = None - _headers: Optional[Dict] = None - - def __init__( - self, - config: DeepgramClientOptions, - thread_cls: Type[threading.Thread] = threading.Thread, - ): - if config is None: - raise DeepgramError("Config is required") - - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - - self._config = config - self._endpoint = "v1/listen" - - self._flush_thread = None - self._keep_alive_thread = None - - # auto flush - self._last_datagram = None - self._lock_flush = threading.Lock() - - self._thread_cls = thread_cls - - # init handlers - self._event_handlers = { - event: [] for event in LiveTranscriptionEvents.__members__.values() - } - - # call the parent constructor - super().__init__( - config=self._config, - endpoint=self._endpoint, - thread_cls=self._thread_cls, - ) - - # pylint: disable=too-many-statements,too-many-branches - def start( - self, - options: Optional[Union[ListenWebSocketOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - members: Optional[Dict] = None, - **kwargs, - ) -> bool: - """ - Starts the WebSocket connection for live transcription. - """ - self._logger.debug("ListenWebSocketClient.start ENTER") - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - self._logger.info("members: %s", members) - self._logger.info("kwargs: %s", kwargs) - - if isinstance(options, ListenWebSocketOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("ListenWebSocketClient.start LEAVE") - raise DeepgramError("Fatal transcription options error") - - self._addons = addons - self._headers = headers - - # add "members" as members of the class - if members is not None: - self.__dict__.update(members) - - # set kwargs as members of the class - if kwargs is not None: - self._kwargs = kwargs - else: - self._kwargs = {} - - if isinstance(options, ListenWebSocketOptions): - self._logger.info("ListenWebSocketOptions switching class -> dict") - self._options = options.to_dict() - elif options is not None: - self._options = options - else: - self._options = {} - - try: - # call parent start - if ( - super().start( - self._options, - self._addons, - self._headers, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - is False - ): - self._logger.error("ListenWebSocketClient.start failed") - self._logger.debug("ListenWebSocketClient.start LEAVE") - return False - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # keepalive thread - if self._config.is_keep_alive_enabled(): - self._logger.notice("keepalive is enabled") - self._keep_alive_thread = self._thread_cls(target=self._keep_alive) - self._keep_alive_thread.start() - else: - self._logger.notice("keepalive is disabled") - - # flush thread - if self._config.is_auto_flush_reply_enabled(): - self._logger.notice("autoflush is enabled") - self._flush_thread = self._thread_cls(target=self._flush) - self._flush_thread.start() - else: - self._logger.notice("autoflush is disabled") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("start succeeded") - self._logger.debug("ListenWebSocketClient.start LEAVE") - return True - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "WebSocketException in ListenWebSocketClient.start: %s", e - ) - self._logger.debug("ListenWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect") is True: - raise e - return False - - # pylint: enable=too-many-statements,too-many-branches - - def on( - self, event: LiveTranscriptionEvents, handler: Callable - ) -> None: # registers event handlers for specific events - """ - Registers event handlers for specific events. - """ - self._logger.info("event subscribed: %s", event) - if event in LiveTranscriptionEvents.__members__.values() and callable(handler): - self._event_handlers[event].append(handler) - - def _emit(self, event: LiveTranscriptionEvents, *args, **kwargs) -> None: - """ - Emits events to the registered event handlers. - """ - self._logger.debug("ListenWebSocketClient._emit ENTER") - self._logger.debug("callback handlers for: %s", event) - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.debug("callback handlers for: %s", event) - for handler in self._event_handlers[event]: - handler(self, *args, **kwargs) - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.debug("ListenWebSocketClient._emit LEAVE") - - # pylint: disable=too-many-return-statements,too-many-statements,too-many-locals,too-many-branches - def _process_text(self, message: str) -> None: - """ - Processes messages received over the WebSocket connection. - """ - self._logger.debug("ListenWebSocketClient._process_text ENTER") - - try: - if len(message) == 0: - self._logger.debug("message is empty") - self._logger.debug("ListenWebSocketClient._process_text LEAVE") - return - - data = json.loads(message) - response_type = data.get("type") - self._logger.debug("response_type: %s, data: %s", response_type, data) - - match response_type: - case LiveTranscriptionEvents.Open: - open_result: OpenResponse = OpenResponse.from_json(message) - self._logger.verbose("OpenResponse: %s", open_result) - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Open), - open=open_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.Transcript: - msg_result: LiveResultResponse = LiveResultResponse.from_json( - message - ) - self._logger.verbose("LiveResultResponse: %s", msg_result) - - # auto flush - if self._config.is_inspecting_listen(): - inspect_res = self._inspect(msg_result) - if not inspect_res: - self._logger.error("inspect_res failed") - - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Transcript), - result=msg_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.Metadata: - meta_result: MetadataResponse = MetadataResponse.from_json(message) - self._logger.verbose("MetadataResponse: %s", meta_result) - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Metadata), - metadata=meta_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.SpeechStarted: - ss_result: SpeechStartedResponse = SpeechStartedResponse.from_json( - message - ) - self._logger.verbose("SpeechStartedResponse: %s", ss_result) - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.SpeechStarted), - speech_started=ss_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.UtteranceEnd: - ue_result: UtteranceEndResponse = UtteranceEndResponse.from_json( - message - ) - self._logger.verbose("UtteranceEndResponse: %s", ue_result) - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.UtteranceEnd), - utterance_end=ue_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.Close: - close_result: CloseResponse = CloseResponse.from_json(message) - self._logger.verbose("CloseResponse: %s", close_result) - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Close), - close=close_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case LiveTranscriptionEvents.Error: - err_error: ErrorResponse = ErrorResponse.from_json(message) - self._logger.verbose("ErrorResponse: %s", err_error) - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Error), - error=err_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case _: - self._logger.warning( - "Unknown Message: response_type: %s, data: %s", - response_type, - data, - ) - unhandled_error: UnhandledResponse = UnhandledResponse( - type=LiveTranscriptionEvents(LiveTranscriptionEvents.Unhandled), - raw=message, - ) - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Unhandled), - unhandled=unhandled_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.notice("_process_text Succeeded") - self._logger.debug("SpeakStreamClient._process_text LEAVE") - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in ListenWebSocketClient._process_text: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in ListenWebSocketClient._process_text", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in ListenWebSocketClient._process_text: %s", str(e) - ) - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Error), - e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - super()._signal_exit() - - self._logger.debug("ListenWebSocketClient._process_text LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - # pylint: enable=too-many-return-statements,too-many-statements - - def _process_binary(self, message: bytes) -> None: - raise NotImplementedError("no _process_binary method should be called") - - # pylint: disable=too-many-return-statements - def _keep_alive(self) -> None: - self._logger.debug("ListenWebSocketClient._keep_alive ENTER") - - counter = 0 - while True: - try: - counter += 1 - self._exit_event.wait(timeout=ONE_SECOND) - - if self._exit_event.is_set(): - self._logger.notice("_keep_alive exiting gracefully") - self._logger.debug("ListenWebSocketClient._keep_alive LEAVE") - return - - # deepgram keepalive - if counter % DEEPGRAM_INTERVAL == 0: - self.keep_alive() - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in ListenWebSocketClient._keep_alive: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in ListenWebSocketClient._keep_alive", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in ListenWebSocketClient._keep_alive: %s", str(e) - ) - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Error), - e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - super()._signal_exit() - - self._logger.debug("ListenWebSocketClient._keep_alive LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - ## pylint: disable=too-many-return-statements,too-many-statements - def _flush(self) -> None: - self._logger.debug("ListenWebSocketClient._flush ENTER") - - delta_in_ms_str = self._config.options.get("auto_flush_reply_delta") - if delta_in_ms_str is None: - self._logger.error("auto_flush_reply_delta is None") - self._logger.debug("ListenWebSocketClient._flush LEAVE") - return - delta_in_ms = float(delta_in_ms_str) - - _flush_event = threading.Event() - while True: - try: - _flush_event.wait(timeout=HALF_SECOND) - - if self._exit_event.is_set(): - self._logger.notice("_flush exiting gracefully") - self._logger.debug("ListenWebSocketClient._flush LEAVE") - return - - with self._lock_flush: - if self._last_datagram is None: - self._logger.debug("AutoFlush last_datagram is None") - continue - - delta = datetime.now() - self._last_datagram - diff_in_ms = delta.total_seconds() * 1000 - self._logger.debug("AutoFlush delta: %f", diff_in_ms) - if diff_in_ms < delta_in_ms: - self._logger.debug("AutoFlush delta is less than threshold") - continue - - with self._lock_flush: - self._last_datagram = None - self.finalize() - - except Exception as e: # pylint: disable=broad-except - self._logger.error("Exception in ListenWebSocketClient._flush: %s", e) - e_error: ErrorResponse = ErrorResponse( - "Exception in ListenWebSocketClient._flush", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in ListenWebSocketClient._flush: %s", str(e) - ) - self._emit( - LiveTranscriptionEvents(LiveTranscriptionEvents.Error), - e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - super()._signal_exit() - - self._logger.debug("ListenWebSocketClient._flush LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - # pylint: enable=too-many-return-statements - - def keep_alive(self) -> bool: - """ - Sends a KeepAlive message - """ - self._logger.spam("ListenWebSocketClient.keep_alive ENTER") - - self._logger.notice("Sending KeepAlive...") - ret = self.send(json.dumps({"type": "KeepAlive"})) - - if not ret: - self._logger.error("keep_alive failed") - self._logger.spam("ListenWebSocketClient.keep_alive LEAVE") - return False - - self._logger.notice("keep_alive succeeded") - self._logger.spam("ListenWebSocketClient.keep_alive LEAVE") - - return True - - def finalize(self) -> bool: - """ - Finalizes the Transcript connection by flushing it - """ - self._logger.spam("ListenWebSocketClient.finalize ENTER") - - self._logger.notice("Sending Finalize...") - ret = self.send(json.dumps({"type": "Finalize"})) - - if not ret: - self._logger.error("finalize failed") - self._logger.spam("ListenWebSocketClient.finalize LEAVE") - return False - - self._logger.notice("finalize succeeded") - self._logger.spam("ListenWebSocketClient.finalize LEAVE") - - return True - - def _close_message(self) -> bool: - return self.send(json.dumps({"type": "CloseStream"})) - - # closes the WebSocket connection gracefully - def finish(self) -> bool: - """ - Closes the WebSocket connection gracefully. - """ - self._logger.spam("ListenWebSocketClient.finish ENTER") - - # call parent finish - if super().finish() is False: - self._logger.error("ListenWebSocketClient.finish failed") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # stop the threads - self._logger.verbose("cancelling tasks...") - if self._flush_thread is not None: - self._flush_thread.join() - self._flush_thread = None - self._logger.notice("processing _flush_thread thread joined") - - if self._keep_alive_thread is not None: - self._keep_alive_thread.join() - self._keep_alive_thread = None - self._logger.notice("processing _keep_alive_thread thread joined") - - if self._listen_thread is not None: - self._listen_thread.join() - self._listen_thread = None - self._logger.notice("listening thread joined") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("finish succeeded") - self._logger.spam("ListenWebSocketClient.finish LEAVE") - return True - - def _inspect(self, msg_result: LiveResultResponse) -> bool: - # auto flush_inspect is generically used to track any messages you might want to snoop on - # place additional logic here to inspect messages of interest - - # for auto flush functionality - # set the last datagram - sentence = msg_result.channel.alternatives[0].transcript - if len(sentence) == 0: - return True - - if msg_result.is_final: - with self._lock_flush: - self._logger.debug("AutoFlush is_final received") - self._last_datagram = None - else: - with self._lock_flush: - self._last_datagram = datetime.now() - self._logger.debug( - "AutoFlush interim received: %s", - str(self._last_datagram), - ) - - return True diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/options.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/options.py deleted file mode 100644 index 97b14105..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/options.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional, Union -import logging - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from deepgram.utils import verboselogs - -from ....common import BaseResponse - - -@dataclass -class LiveOptions(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - Live Transcription Options for the Deepgram Platform. - - Please see the documentation for more information on each option: - https://developers.deepgram.com/reference/streaming - """ - - alternatives: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - callback: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - callback_method: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - channels: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - diarize: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - diarize_version: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - dictation: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - encoding: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - # pylint: disable=W0511 - # TODO: endpointing's current type previous was `Optional[str]` which is incorrect - # for backward compatibility we are keeping it as `Optional[Union[str, bool, int]]` - # since it gets translated to a string to be placed as a query parameter, will keep `str` for now - # but will change this to `Optional[Union[bool, int]]` in a future release - endpointing: Optional[Union[str, bool, int]] = field( - default=None, - metadata=dataclass_config(exclude=lambda f: f is None), - ) - # pylint: enable=W0511 - extra: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - filler_words: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - interim_results: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - keywords: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - keyterm: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - language: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - model: Optional[str] = field( - default="None", metadata=dataclass_config(exclude=lambda f: f is None) - ) - multichannel: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - no_delay: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - numerals: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - punctuate: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - profanity_filter: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - redact: Optional[Union[List[str], bool, str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - replace: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sample_rate: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - search: Optional[Union[List[str], str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - smart_format: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - tag: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - tier: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - utterance_end_ms: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - vad_events: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - version: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def check(self): - """ - Check the options for any deprecated or soon-to-be-deprecated options. - """ - logger = verboselogs.VerboseLogger(__name__) - logger.addHandler(logging.StreamHandler()) - prev = logger.level - logger.setLevel(verboselogs.ERROR) - - if self.tier: - logger.warning( - "WARNING: Tier is deprecated. Will be removed in a future version." - ) - - if isinstance(self.endpointing, str): - logger.warning( - "WARNING: endpointing's current type previous was `Optional[str]` which is incorrect" - " for backward compatibility we are keeping it as `Optional[Union[str, bool, int]]`" - " since it gets translated to a string to be placed as a query parameter, will keep `str` for now" - " but will change this to `Optional[Union[bool, int]]` in a future release" - ) - - logger.setLevel(prev) - - return True - - -ListenWebSocketOptions = LiveOptions diff --git a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/response.py b/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/response.py deleted file mode 100644 index 5a086b0c..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen/v1/websocket/response.py +++ /dev/null @@ -1,217 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional, Dict, Any - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -# common websocket response -from ....common import ( - BaseResponse, - OpenResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, -) - -# between rest and websocket -from ....common import ( - ModelInfo, - Hit, - Search, -) - - -# unique - - -@dataclass -class ListenWSWord(BaseResponse): - """ - Word object - """ - - word: str = "" - start: float = 0 - end: float = 0 - confidence: float = 0 - punctuated_word: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - speaker: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - language: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - -@dataclass -class ListenWSAlternative(BaseResponse): - """ - Alternative object - """ - - transcript: str = "" - confidence: float = 0 - words: List[ListenWSWord] = field(default_factory=list) - languages: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "words" in _dict: - _dict["words"] = [ListenWSWord.from_dict(words) for words in _dict["words"]] - return _dict[key] - - -@dataclass -class ListenWSChannel(BaseResponse): - """ - Channel object - """ - - search: Optional[List[Search]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - alternatives: List[ListenWSAlternative] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "search" in _dict: - _dict["search"] = [Search.from_dict(search) for search in _dict["search"]] - if "alternatives" in _dict: - _dict["alternatives"] = [ - ListenWSAlternative.from_dict(alternatives) - for alternatives in _dict["alternatives"] - ] - return _dict[key] - - -@dataclass -class Metadata(BaseResponse): - """ - Metadata object - """ - - model_info: ModelInfo - request_id: str = "" - model_uuid: str = "" - extra: Optional[Dict[str, str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "model_info" in _dict: - _dict["model_info"] = [ - ModelInfo.from_dict(model_info) for model_info in _dict["model_info"] - ] - if "extra" in _dict: - _dict["extra"] = [str(extra) for _, extra in _dict["extra"].items()] - return _dict[key] - - -# live result messages - - -@dataclass -class LiveResultResponse(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - Result Message from the Deepgram Platform - """ - - channel: ListenWSChannel - metadata: Metadata - type: str = "" - channel_index: List[int] = field(default_factory=list) - duration: float = 0 - start: float = 0 - is_final: bool = False - from_finalize: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - speech_final: bool = False - - def __getitem__(self, key): - _dict = self.to_dict() - if "channel" in _dict: - _dict["channel"] = [ - ListenWSChannel.from_dict(channel) for channel in _dict["channel"] - ] - if "metadata" in _dict: - _dict["metadata"] = [ - Metadata.from_dict(metadata) for metadata in _dict["metadata"] - ] - return _dict[key] - - -# Metadata Message - - -@dataclass -class MetadataResponse(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - Metadata Message from the Deepgram Platform - """ - - type: str = "" - transaction_key: str = "" - request_id: str = "" - sha256: str = "" - created: str = "" - duration: float = 0 - channels: int = 0 - models: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - model_info: Optional[Dict[str, ModelInfo]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - extra: Optional[Dict] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "models" in _dict: - _dict["models"] = [str(models) for models in _dict["models"]] - if "model_info" in _dict: - _dict["model_info"] = [ - ModelInfo.from_dict(model_info) - for _, model_info in _dict["model_info"].items() - ] - if "extra" in _dict: - _dict["extra"] = [str(extra) for _, extra in _dict["extra"].items()] - return _dict[key] - - -# Speech Started Message - - -@dataclass -class SpeechStartedResponse(BaseResponse): - """ - SpeechStartedResponse Message from the Deepgram Platform - """ - - type: str = "" - channel: List[int] = field(default_factory=list) - timestamp: float = 0 - - -# Utterance End Message - - -@dataclass -class UtteranceEndResponse(BaseResponse): - """ - UtteranceEnd Message from the Deepgram Platform - """ - - type: str = "" - channel: List[int] = field(default_factory=list) - last_word_end: float = 0 diff --git a/venv/Lib/site-packages/deepgram/clients/listen_router.py b/venv/Lib/site-packages/deepgram/clients/listen_router.py deleted file mode 100644 index 7bc88bfe..00000000 --- a/venv/Lib/site-packages/deepgram/clients/listen_router.py +++ /dev/null @@ -1,225 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from importlib import import_module -import logging -import deprecation # type: ignore - -from .. import __version__ -from .listen.v1 import ( - PreRecordedClient, - AsyncPreRecordedClient, - LiveClient, - AsyncLiveClient, -) -from ..utils import verboselogs -from ..options import DeepgramClientOptions -from .errors import DeepgramModuleError - - -class ListenRouter: - """ - Represents a client for interacting with the Deepgram API. - - This class provides a client for making requests to the Deepgram API with various configuration options. - - Attributes: - config_options (DeepgramClientOptions): An optional configuration object specifying client options. - - Raises: - DeepgramApiKeyError: If the API key is missing or invalid. - - Methods: - live: (Preferred) Returns a Threaded LiveClient instance for interacting with Deepgram's transcription services. - prerecorded: (Preferred) Returns an Threaded PreRecordedClient instance for interacting with Deepgram's prerecorded transcription services. - - asynclive: Returns an (Async) LiveClient instance for interacting with Deepgram's transcription services. - asyncprerecorded: Returns an (Async) PreRecordedClient instance for interacting with Deepgram's prerecorded transcription services. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - - @property - @deprecation.deprecated( - deprecated_in="3.4.0", - removed_in="4.0.0", - current_version=__version__, - details="deepgram.listen.prerecorded is deprecated. Use deepgram.listen.rest instead.", - ) - def prerecorded(self): - """ - DEPRECATED: deepgram.listen.prerecorded is deprecated. Use deepgram.listen.rest instead. - """ - return self.Version(self._config, "prerecorded") - - @property - @deprecation.deprecated( - deprecated_in="3.4.0", - removed_in="4.0.0", - current_version=__version__, - details="deepgram.listen.asyncprerecorded is deprecated. Use deepgram.listen.asyncrest instead.", - ) - def asyncprerecorded(self): - """ - DEPRECATED: deepgram.listen.asyncprerecorded is deprecated. Use deepgram.listen.asyncrest instead. - """ - return self.Version(self._config, "asyncprerecorded") - - @property - @deprecation.deprecated( - deprecated_in="3.4.0", - removed_in="4.0.0", - current_version=__version__, - details="deepgram.listen.live is deprecated. Use deepgram.listen.websocket instead.", - ) - def live(self): - """ - DEPRECATED: deepgram.listen.live is deprecated. Use deepgram.listen.websocket instead. - """ - return self.Version(self._config, "live") - - @property - @deprecation.deprecated( - deprecated_in="3.4.0", - removed_in="4.0.0", - current_version=__version__, - details="deepgram.listen.asynclive is deprecated. Use deepgram.listen.asyncwebsocket instead.", - ) - def asynclive(self): - """ - DEPRECATED: deepgram.listen.asynclive is deprecated. Use deepgram.listen.asyncwebsocket instead. - """ - return self.Version(self._config, "asynclive") - - @property - def rest(self): - """ - Returns a ListenRESTClient instance for interacting with Deepgram's prerecorded transcription services. - """ - return self.Version(self._config, "rest") - - @property - def asyncrest(self): - """ - Returns an AsyncListenRESTClient instance for interacting with Deepgram's prerecorded transcription services. - """ - return self.Version(self._config, "asyncrest") - - @property - def websocket(self): - """ - Returns a ListenWebSocketClient instance for interacting with Deepgram's transcription services. - """ - return self.Version(self._config, "websocket") - - @property - def asyncwebsocket(self): - """ - Returns an AsyncListenWebSocketClient instance for interacting with Deepgram's transcription services. - """ - return self.Version(self._config, "asyncwebsocket") - - # INTERNAL CLASSES - class Version: - """ - Represents a version of the Deepgram API. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _parent: str - - def __init__(self, config, parent: str): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - self._parent = parent - - # FUTURE VERSIONING: - # When v2 or v1.1beta1 or etc. This allows easy access to the latest version of the API. - # @property - # def latest(self): - # match self._parent: - # case "live": - # return LiveClient(self._config) - # case "prerecorded": - # return PreRecordedClient(self._config) - # case _: - # raise DeepgramModuleError("Invalid parent") - - def v(self, version: str = ""): - """ - Returns a specific version of the Deepgram API. - """ - self._logger.debug("Version.v ENTER") - self._logger.info("version: %s", version) - if len(version) == 0: - self._logger.error("version is empty") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Invalid module version") - - protocol = "" - file_name = "" - class_name = "" - match self._parent: - case "live": - return LiveClient(self._config) - case "asynclive": - return AsyncLiveClient(self._config) - case "prerecorded": - return PreRecordedClient(self._config) - case "asyncprerecorded": - return AsyncPreRecordedClient(self._config) - case "websocket": - protocol = "websocket" - file_name = "client" - class_name = "ListenWebSocketClient" - case "asyncwebsocket": - protocol = "websocket" - file_name = "async_client" - class_name = "AsyncListenWebSocketClient" - case "rest": - protocol = "rest" - file_name = "client" - class_name = "ListenRESTClient" - case "asyncrest": - protocol = "rest" - file_name = "async_client" - class_name = "AsyncListenRESTClient" - case _: - self._logger.error("parent unknown: %s", self._parent) - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Invalid parent type") - - # create class path - path = f"deepgram.clients.listen.v{version}.{protocol}.{file_name}" - self._logger.info("path: %s", path) - self._logger.info("class_name: %s", class_name) - - # import class - mod = import_module(path) - if mod is None: - self._logger.error("module path is None") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Unable to find package") - - my_class = getattr(mod, class_name) - if my_class is None: - self._logger.error("my_class is None") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Unable to find class") - - # instantiate class - my_class = my_class(self._config) - self._logger.notice("Version.v succeeded") - self._logger.debug("Version.v LEAVE") - return my_class diff --git a/venv/Lib/site-packages/deepgram/clients/live/__init__.py b/venv/Lib/site-packages/deepgram/clients/live/__init__.py deleted file mode 100644 index e71ab007..00000000 --- a/venv/Lib/site-packages/deepgram/clients/live/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .v1 import LiveTranscriptionEvents - -from .v1 import LiveClient -from .v1 import AsyncLiveClient -from .v1 import LiveOptions -from .v1 import ( - OpenResponse, - LiveResultResponse, - ListenWSMetadataResponse, - MetadataResponse, # backwards compat - SpeechStartedResponse, - UtteranceEndResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, -) diff --git a/venv/Lib/site-packages/deepgram/clients/live/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/live/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index bc6282d38b299bf9b3e94a929410b6dffeefe424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 627 zcmZXR&ubGw6vt?@hSg}$!K5BNA| z8OwOiG#8wc4p0XosC9@s6k)9!s2ieD>n7@^XzG?|>9%O=j_ByF=;}yBx+i+NFZwzb zF=y-6p#7cWngQS3nWzd*tu!vRs`RQb;|h#-IErXA$`x94yGL$q(tlb#awqjmZqVKI zPf9Rv!Igz^u-T^}x>fGCy}J|TJeYUW*WhI)z1&W2{nxoYEdkQy)Jy9j+a5fac@Oxz zDU8icHy-7Mqiuh7$75>?yR~~Wvy>*wZ$9&8u(JuOr#8e8Y=h7wvNIhz1)*N^Be7>Zn0LQTc`sTG&(>XvQV~JTXtASc3D?OERsFelYQ2gF^lDZ z4Jg@#qxKJqZAP@dI};V0Xs%4EMQKH$rWGh_uoSt{Bo}DW4Uf!DrT?UQ&dr;T%&1%U z=Ow6jV9G)nsBgI7GO1A$Axz3=yBnIg(r^lV{1&fHukNH6pq$7%LM0JB{T6c zF~Y)=lBcJ94JOF|%C+Wle03Hx&T)X_>gjm35=z+B>ag5hcAm>3+ve~>A7C^0hUOvS gr%x&U6%qRQJGp;G9-WZ~7hXiY3xfFVpl{>0Kc;BBQ2+n{ diff --git a/venv/Lib/site-packages/deepgram/clients/live/v1/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/live/v1/__pycache__/client.cpython-312.pyc deleted file mode 100644 index acd1fa8f69358353e9988f6847ba98aa245f9918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmZ`%%WB&|6dn0(*@~ZvT?dRy7R8jrn66SvA-JK0x((Ddg+Uudy0wM%LNhja=YB=M zq04?pH(m-spwLx!22%oAb;efh#7PF`a_&7>cjg?;Pe~FHTjL*Zhri+o{pQL46$!y| z#=tkEBV90&CE$p_afIP0j;(N%;W$pLaE#$3PFZOzS{a zU8U-Vk$WzHHtbQ=qo8lfc@Oo#B<>yxB2&vU#@TIkzD)z;1Jm=Dcb zkTzEmk0))9iw^SqdTX6sl>(t&jF;t5@D9iRBMJ()5g3?lU*@)oC_I=GnIQLuGt`e@7IZ2CxhIM zec#cNO+z=h^HS*(@QCv6{QQ&h2FQpyt}<~94NeE_ttk_*Cra12RER<0$W^tGIsl^R z0Pet3t(LZWlB8uaOIwq6m>;{-o75}I(Z?pd_8ROcfo<}Ig+){lgufyZI>Hs|UZIog zNLq+oBNmoCEE*`+m}UIj(^=M+kLIZ8ADqll)i1T@DDPKa%#rL@7%uzy!zx$ TSftQieJ1+FXJ2z(ogMWL#_3C} diff --git a/venv/Lib/site-packages/deepgram/clients/live/v1/__pycache__/enums.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/live/v1/__pycache__/enums.cpython-312.pyc deleted file mode 100644 index ef59bebbf7c675b14bd731398cee38e6d0319317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmX@j%ge<81f?6@Gd=<7#~=<2FhLog1%Qm{3@HpLj5!Rsj8Tk?43$ip%rBXN!kUb? z#C_rMbm=1(m-zY;yBcN^?@}ia3BaF#>Th$a^1{85tSB MaWOFJ6|n)i0Q$H^IsgCw diff --git a/venv/Lib/site-packages/deepgram/clients/live/v1/client.py b/venv/Lib/site-packages/deepgram/clients/live/v1/client.py deleted file mode 100644 index fd75c948..00000000 --- a/venv/Lib/site-packages/deepgram/clients/live/v1/client.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from ...listen.v1 import ListenWebSocketClient as LiveClientLatest -from ...listen.v1 import AsyncListenWebSocketClient as AsyncLiveClientLatest -from ...listen.v1 import LiveOptions as LiveOptionsLatest -from ...listen.v1 import ( - OpenResponse as OpenResponseLatest, - LiveResultResponse as LiveResultResponseLatest, - ListenWSMetadataResponse as ListenWSMetadataResponseLatest, - SpeechStartedResponse as SpeechStartedResponseLatest, - UtteranceEndResponse as UtteranceEndResponseLatest, - CloseResponse as CloseResponseLatest, - ErrorResponse as ErrorResponseLatest, - UnhandledResponse as UnhandledResponseLatest, -) - -# The vX/client.py points to the current supported version in the SDK. -# Older versions are supported in the SDK for backwards compatibility. - - -# input -LiveOptions = LiveOptionsLatest -OpenResponse = OpenResponseLatest -LiveResultResponse = LiveResultResponseLatest -ListenWSMetadataResponse = ListenWSMetadataResponseLatest -MetadataResponse = ListenWSMetadataResponseLatest -SpeechStartedResponse = SpeechStartedResponseLatest -UtteranceEndResponse = UtteranceEndResponseLatest -CloseResponse = CloseResponseLatest -ErrorResponse = ErrorResponseLatest -UnhandledResponse = UnhandledResponseLatest - - -# clients -LiveClient = LiveClientLatest -AsyncLiveClient = AsyncLiveClientLatest diff --git a/venv/Lib/site-packages/deepgram/clients/live/v1/enums.py b/venv/Lib/site-packages/deepgram/clients/live/v1/enums.py deleted file mode 100644 index ee98540f..00000000 --- a/venv/Lib/site-packages/deepgram/clients/live/v1/enums.py +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from ...listen import LiveTranscriptionEvents diff --git a/venv/Lib/site-packages/deepgram/clients/manage/__init__.py b/venv/Lib/site-packages/deepgram/clients/manage/__init__.py deleted file mode 100644 index 8a4287ae..00000000 --- a/venv/Lib/site-packages/deepgram/clients/manage/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .client import ManageClient -from .client import AsyncManageClient -from .client import ( - ProjectOptions, - KeyOptions, - ScopeOptions, - InviteOptions, - UsageRequestOptions, - UsageSummaryOptions, - UsageFieldsOptions, -) -from .client import ( - #### top level - Message, - ProjectsResponse, - ModelResponse, - ModelsResponse, - MembersResponse, - KeyResponse, - KeysResponse, - ScopesResponse, - InvitesResponse, - UsageRequest, - UsageResponse, - UsageRequestsResponse, - UsageSummaryResponse, - UsageFieldsResponse, - BalancesResponse, - #### shared - Project, - STTDetails, - TTSMetadata, - TTSDetails, - Member, - Key, - Invite, - Config, - STTUsageDetails, - Callback, - TokenDetail, - SpeechSegment, - TTSUsageDetails, - STTTokens, - TTSTokens, - UsageSummaryResults, - Resolution, - UsageModel, - Balance, -) diff --git a/venv/Lib/site-packages/deepgram/clients/manage/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/manage/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e5dc96be4f490c8f5186a73af284bf82cd9f41d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1321 zcma)*OHbQC5XbE#w{!50dQ+aF|n zQQAsdH5F7rRoM=a9fFW=hsh2@7$XqDF&M)rL@@?2j6)m~knnRNl#_%crXYoBNTUWC zW*~!E$YKt1n1?(Tpn&5rjuS9}MJVDVOyU$w;WSL+49wsx%;Fr(;XKUa0xaMnEaDO@ z;W8{^2})RoGOoZ1uEHu-pn_|#hU>778?b>@sNyDU;udVF%Jo<^`dcMgRaK^Ix}|r- zzG(={BR{|AUR$k4!I;b(JN75h^4@nn!?s+Rd@HU8cDmlOyJFyJht`$h4c+lmmx`Z= z&pqJ|clU$!9-{6H%M|>~*M>0LZcwaRma&>}xq{3E9k?gL?NSRuYBjqp%%Pj{-O+Nk zCh%N1qd87*ae2_rw-7cmN?AIgwg;028oA1;peO!(nI&?i?Mq?x<5H`4g=k&WMF(jTWR~hb+LoX?e!eRcv=*3;?ve!cOpnHc z4BPDStjMHa#J?OF3v?b;w`H{DPn;8`F?8tdDb5%p%7`)Ij0A(7Gs;S zL-?xP5|#T8`_G%FE{$RH?crggc_7?N&+ay_Y@;RiI`p5LSHik#zBA67E-802Y=NX;F@7X;f+=NwC{hL(O d(odyw7mBN)JB9FvaaX9Y`+vCMJm)Eu{09fAjI;m% diff --git a/venv/Lib/site-packages/deepgram/clients/manage/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/manage/__pycache__/client.cpython-312.pyc deleted file mode 100644 index fb98e9b91a09f203711c57a0259316b586beb9f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2644 zcma)7$!;4*5S`J&eYlg_EX$HC$<%6jx4dfcB1`llQnpnfl8nfT%y^n)IFtYZIq)y? z4LJq*j$D)*F@R4w<)*+04EU7po+5|CTr!77*L$z4yQZtEf7i5t!oTC+o_+W=tSEm9 zqy6>KF|4x<*koJqggu34>^W?+7qG*2A5`pA%R1X#t|6CF&M>hxPTLI5hvjiPQw(= zz-63+S9C-0~H5h;B+wK`HSCxl2NTtRL4Oe?U1r|o$tSFF~sZE4$;lX9bDCiYG4 zd=Gy-Mzgcp26M-Z>Gh7AxKutZqfs)+S!T-eX3-QLtSFtp+(Wa*kARkzt(MT}m|)H5bF*QtvunfVmBX$rD5b6%Y(#WENq`FCGO;W-XWoKhMc00@t7~Rkf zy;4MHv6sTN0=ayC3mbabFs)!dpUd)jNpI*@fE#VXW5;Us^QbJ3eR#{WS*?6uKC&X* zgFH%G?c3B1<4`Yt0Ua9+ zo*sNsHI7BDSOMuoUXJCZIA3PK@}I0O7iH4b`*|i>@$Qt{)f+rttO(cWA|1aa<$zEQ z{U<|79^mq-ouTzXp-j5d)|S;hf{HpBOt4p;qC1(1@ChQ}%4=f$f*Fwkx>KBZ(Flom zXFKsh!4J#zuEe)#E6C%iQ@YnfLaR|Z(0WZ^>E6m9lJ{PIY*&#G6A?_(T`xpM1(oV4 z9pYkwi*;2I;c;OM<2(WH$hUrUjJh=>^1H7F@X976_aXV63Y{5I!sL zgsWK)Gbgv`=^Mmd5u9j6cHba0BhgMbA#`4#_Ek7{B^nFy3xbb2J%->#3Ck;%xlQnr zfHk@}8~a81%t7Vr!RA_F-{g-(VP|_gU)VzPW20ItoK(w2TtDJnuyBHvlfrKKuwe2> zZK=kaCVz~~LJ6^URM**x-IvT2CLd8UmushAefL?lbZp?m`geRM@z$EFd_3=0RrQ~M zqON^Xw!e6MYTp-y4}Xi{OL|(E|8F>dt19u?X1Jw|Hv_H6WHZ!?PB*nydgV+>(3n~} zQ{v}7B{*dU!YI<6pNVC5sXL68R1V@@admni|iG{|R{+1l<<4O;55U$TXN_2|HlU(>iiPgX1 GzwTe*w1hVR diff --git a/venv/Lib/site-packages/deepgram/clients/manage/client.py b/venv/Lib/site-packages/deepgram/clients/manage/client.py deleted file mode 100644 index 8238cd7a..00000000 --- a/venv/Lib/site-packages/deepgram/clients/manage/client.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .v1.client import ManageClient as ManageClientLatest -from .v1.async_client import AsyncManageClient as AsyncManageClientLatest - -# input -from .v1.options import ( - ProjectOptions as ProjectOptionsLatest, - KeyOptions as KeyOptionsLatest, - ScopeOptions as ScopeOptionsLatest, - InviteOptions as InviteOptionsLatest, - UsageRequestOptions as UsageRequestOptionsLatest, - UsageSummaryOptions as UsageSummaryOptionsLatest, - UsageFieldsOptions as UsageFieldsOptionsLatest, -) - -# responses -from .v1.response import ( - Message as MessageLatest, - ProjectsResponse as ProjectsResponseLatest, - ModelResponse as ModelResponseLatest, - ModelsResponse as ModelsResponseLatest, - MembersResponse as MembersResponseLatest, - KeyResponse as KeyResponseLatest, - KeysResponse as KeysResponseLatest, - ScopesResponse as ScopesResponseLatest, - InvitesResponse as InvitesResponseLatest, - UsageRequest as UsageRequestLatest, - UsageResponse as UsageResponseLatest, - UsageRequestsResponse as UsageRequestsResponseLatest, - UsageSummaryResponse as UsageSummaryResponseLatest, - UsageFieldsResponse as UsageFieldsResponseLatest, - BalancesResponse as BalancesResponseLatest, - Project as ProjectLatest, - STTDetails as STTDetailsLatest, - TTSMetadata as TTSMetadataLatest, - TTSDetails as TTSDetailsLatest, - Member as MemberLatest, - Key as KeyLatest, - Invite as InviteLatest, - Config as ConfigLatest, - STTUsageDetails as STTUsageDetailsLatest, - Callback as CallbackLatest, - TokenDetail as TokenDetailLatest, - SpeechSegment as SpeechSegmentLatest, - TTSUsageDetails as TTSUsageDetailsLatest, - STTTokens as STTTokensLatest, - TTSTokens as TTSTokensLatest, - UsageSummaryResults as UsageSummaryResultsLatest, - Resolution as ResolutionLatest, - UsageModel as UsageModelLatest, - Balance as BalanceLatest, -) - - -# The client.py points to the current supported version in the SDK. -# Older versions are supported in the SDK for backwards compatibility. - - -# input -ProjectOptions = ProjectOptionsLatest -KeyOptions = KeyOptionsLatest -ScopeOptions = ScopeOptionsLatest -InviteOptions = InviteOptionsLatest -UsageRequestOptions = UsageRequestOptionsLatest -UsageSummaryOptions = UsageSummaryOptionsLatest -UsageFieldsOptions = UsageFieldsOptionsLatest - - -# responses -Message = MessageLatest -ProjectsResponse = ProjectsResponseLatest -ModelResponse = ModelResponseLatest -ModelsResponse = ModelsResponseLatest -MembersResponse = MembersResponseLatest -KeyResponse = KeyResponseLatest -KeysResponse = KeysResponseLatest -ScopesResponse = ScopesResponseLatest -InvitesResponse = InvitesResponseLatest -UsageRequest = UsageRequestLatest -UsageResponse = UsageResponseLatest -UsageRequestsResponse = UsageRequestsResponseLatest -UsageSummaryResponse = UsageSummaryResponseLatest -UsageFieldsResponse = UsageFieldsResponseLatest -BalancesResponse = BalancesResponseLatest -Project = ProjectLatest -STTDetails = STTDetailsLatest -TTSMetadata = TTSMetadataLatest -TTSDetails = TTSDetailsLatest -Member = MemberLatest -Key = KeyLatest -Invite = InviteLatest -Config = ConfigLatest -STTUsageDetails = STTUsageDetailsLatest -Callback = CallbackLatest -TokenDetail = TokenDetailLatest -SpeechSegment = SpeechSegmentLatest -TTSUsageDetails = TTSUsageDetailsLatest -STTTokens = STTTokensLatest -TTSTokens = TTSTokensLatest -UsageSummaryResults = UsageSummaryResultsLatest -Resolution = ResolutionLatest -UsageModel = UsageModelLatest -Balance = BalanceLatest - -# clients -ManageClient = ManageClientLatest -AsyncManageClient = AsyncManageClientLatest diff --git a/venv/Lib/site-packages/deepgram/clients/manage/v1/__init__.py b/venv/Lib/site-packages/deepgram/clients/manage/v1/__init__.py deleted file mode 100644 index 0373a56e..00000000 --- a/venv/Lib/site-packages/deepgram/clients/manage/v1/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .client import ManageClient -from .async_client import AsyncManageClient -from .options import ( - ProjectOptions, - KeyOptions, - ScopeOptions, - InviteOptions, - UsageRequestOptions, - UsageSummaryOptions, - UsageFieldsOptions, -) - -from .response import ( - #### top level - Message, - ProjectsResponse, - ModelResponse, - ModelsResponse, - MembersResponse, - KeyResponse, - KeysResponse, - ScopesResponse, - InvitesResponse, - UsageRequest, - UsageResponse, - UsageRequestsResponse, - UsageSummaryResponse, - UsageFieldsResponse, - BalancesResponse, - #### shared - Project, - STTDetails, - TTSMetadata, - TTSDetails, - Member, - Key, - Invite, - Config, - STTUsageDetails, - Callback, - TokenDetail, - SpeechSegment, - TTSUsageDetails, - STTTokens, - TTSTokens, - UsageSummaryResults, - Resolution, - UsageModel, - Balance, -) diff --git a/venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4ff685e782cd9e17086857c0c99f35a9e422e3b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1357 zcma)*%Wl(95Qgof&D}}bruX~3=`BKt4MIqz6{spHs7W`Yh{#P2sj0^fwiBsO!ZWbs zIoPm15-V2hiYip8D`spbX?JAtX=cux@%%Y6-!(0z(696D%_R&e$}e_$zes4@{vhLv z(o~wNsh|p~%67zzU=*Uh9W{q=7=|$hF^oeT6Oh0pBrydkOhekw88S1dfreSgVh(bc zhdhqJ2#&%ij=>lfpn&5rjuS9}lQ4->Fon}FjWaNVvoMQuFo*Lnj|;GXi?E1Gu!PI7 zj4QB$tFVe|u!iffjvKIno3M#nu!Th^;x=sK4(#AA?BX8m;XdrE%JpzD_FE-cMO9|X zx}~?op=k)qBY)(;y|x;Uf^nIB@7SM2!+Y2E4BK*L>O@@k>`bL$w?)s>j;*fY_1&>^ zmx`Z>&mH0RZwJ9j2T^zWWk&tX*M=~gZdk0iBI9M@as`T0m27xs7+|SOCGdRln5(a)Q5HSd39?Fnf=!K1pKRg`VDfr<~W&gv0_CRJo zn17|4y44Va%kfaIOjWAYBjM?W>B@AqS}Bv=)ID9M$mt!#0>!Z<< zIjZ2d(#uX9>ZW<2H?F9leI=|QF11Qqh{k0_w2&r2=BWOoYe}l(=esgVXQBD%ElE(v z^k_WDu+0w7icI-M{Kt{;Q0Hl}Bx4PK;+!arq0Hz!boDSqo2baR9n6|DOr8^C#2E=j zlEJI%qzN+NghSzEIHobOj2t7+7-5Vu#ux?0IAek_$(UkHGiDgGj5)?UV}Y^ASYj+Q zRv4>{HO4w)gR#ljViXzMj2*@8wRR-jE6;A%y0*~} z2Q7MtT31-z+FRqI=F(p6wdvhxAKY3~h<3}-u@wAiZVCN8E_I)j>UG01yn21VeSM#J zfp)WFikHqa`W)}PdrG*8s;c@orKrn4m7TjtLXF%hgg=bC!aBSEha1jwo>IwwaMYZ{ diff --git a/venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/async_client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/async_client.cpython-312.pyc deleted file mode 100644 index ab73f9ffaac0ff24c8604a9abdaf3f67d0d33f62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57789 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 diff --git a/venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/client.cpython-312.pyc deleted file mode 100644 index 7b4e6409b134ef5465f588119b85c3408b9e393a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56106 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 XT%YDBTVT_xFci2@=6w!YbaDO*FmAB} diff --git a/venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/response.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/manage/v1/__pycache__/response.cpython-312.pyc deleted file mode 100644 index 68e93332fe6a2f32d7645164b3064d32e4582313..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28224 zcmdsg3ve9AncgmT_JLhI7Egk}5?BBvh~)#M#HS=a#J5P1pd^yE4o7>l+#QlDVX^Sc zf)-%PK}t#;a7o=kWnGD`lgmummy#^zj!Ik(U6YxkP$lFIQM)tW}Kc^e( z@`*&@WyR%s&6RSc+=H%+d%&Hk7^uj220R&MKylOaia~G2H{i?o2mE~R84P492ZBf| zDeqt?Q#DZKcB#G!*AZ9B_p&SHSF7Ign6@Mp||{V~50h{uN#88sd^g7J7Jn;IFU zbX7e5wUNZ2!1&|wR5lrpYqfZ_;n8!NQ5%mZhK91a1dW0okH6_E0O$JUR}VaT_KdD- z`q?Ls9zA{bpsGKg%MPEtluakqeHYZB+}TU&(517-)923W>72T8IFWoFUC_^_L}NE4 z2h+%=Z^|TwfY@~Dp-q|?tiIt+P(0Ps&;A1M{yzR(Q0%F`waoO3OZ{CUavgJdENlnmtDk`H@zGdX3<)nJ=DB843+x ze=MMdsX=uFsNEX1TWcfGNT7*8gg`R^ZhZ@-S}o9ygibk1yweB_ufa@T_E=qhrQ)Bj zR8ZjW<5G5on~JO!fX&tp^)z41LU2VEUJZ+M

BWD325rpSRVVvQ$PsWq$ySbIO);!g5N*U4ZG< zOWzTbyHX8a^I2bd0Lq){<;m?!`6&nTS9AV=xU1p2O1=vY)T&V3QXz3y$9GlYuAc9z z`3{QRK*MNlENlc%oj!d~%_Y)<`k2bZQF;(%!4MtM)l@W>je;oBLn?D>ki)R5<!#CG*8ExOCQKiddDgI0RRW-HD6hi4|UA#Kl0O1e*fwBI?r7Hjqi6~P5(jP zyPao1ZtL?^?Q^w_MPl=~y1wKt5dFVi{|Jb!QA%tP;BBH{6WtQ+Yea?GdIHpZlL#NC z)D{9;0Sx6_Hanvl&*rJScFbZC?oWeod?XXPUs-xN+w(%br579O!)yrDOhyZDlPKA7JN&H zgn=rxS_P>SD-i5}iG0)_t1?2TPoFvg5++q{?8{7JwkOLXV$e-A5xtOxt`o)disBYk zm{e?|TEmw}CZX&Y-eh(#s~O&O29#;|^h9QOQ0-6J#UHiYgTDe9%_JOCt`XNM*PHHs zX2X!O?(;eoFon!71G@$jnRBVcp0P$->-(&yU$v?lcTIOr=cZ%hrrv>i{OSwI!I6~u zW`*Gwg4+mW#DEw|E^$GR)k>%FZd7WU#(U^?FM-Di&|EgcMFlx-s>K=+nnna-&TfZH zq3@{?IE6p`3_xk-VkRD*z=Um_!yG;|vE`+cr9^$Bz}<zNhEy!a*0%Wu&l`}BofIXl1HXwTAoDGN}P6IF?FQHdHerWo+{NqoXdgaz#uZC`i*W|-%u3o$q-n6t{sjWlJ z_gBcBK#e>MCX?Vnkjc1{l#jqU{OLMCiBo)j8F!~=y@QRc^+B1vIQ5NuO?QDr(K5`Y9U!9MXi#gl{S?F1sY^bEkf?HIjDgmoga9Umq6?sNgk!RGX&~63KC~2{E zqm{8*qxuBto0c^<*3Uw)?AdZTMP?xTNkH#bRMacZ~u|vVz2c z%v~cKHwqj#o__5s$fc3W3$w7B(rgfsC}oKe^E!>iVga2TCFHs>)oRmZY%TwOcC+y+ zvgjO^P6bF*4X(&upF_swj!S;zeztt8fg!NrsSk zHXk_dY(84t**rhEvl)ai>jH-Fgqk_0YGW%*V&faTpVIW+desbkH%9P$TGMl;7X>bp zVlu&4*Tf@W`GUqxnaULg$Xw%=K-1)pt7_&4;5` zSKJE6pmRsbmmAAhMV!9eXbns6rQEot1Bu#fn%LYiCiPx==9rWh=ox_<_;Yx1EdoC> zaeAs}@+|1vM$1&DY!+G!z3?+&mZoKhPk%}Q43L;Cd2Fxwi~1@&xkcZt<*g0bo|!(| z3b=M?l`KetfofH&OWN-M>AaTzm;Jc>-U@zi^&;;LbA2VNx(;h^VZ-yJIy%^CDJ4>go*@JQB2)b( zfRYp{E;8O(+3v7^TYZr8EmPf-tJwSnUuuuSGyLpSa`G!PN=HdSztghnjnr(*7C7V% zPBly(ol&;HuMF>Te$~eO_M@|_j=?Dx@r|FHIwcJ0qQ970RmM`NCv+7y0619+>FB0L zsQQrNg>qiK^z-Uv2%oHI(yl6!uJy=H!-ijwui-PrSlQfF@NQ~I;SFxYGF9rfd#p!_ zRm`{Cs1%pA7Ae%`wtJ|@P=!gUwv~3M#-s*+135GzI7Sej= zyTUez_WA!e$f=W2<(U7bbbG&}>$@+0`^7iTTz@3LaraEe9wE%;LMDB@-@f{Gdtbi2 z?~Re`&%XJOXWI8ViGvlL#a7a}8!XURw8^B}7Gfw#ke2PE43!r4%bobs+X1jLt0`_D1nvNM| zw{5ymp$9ZwYEH4-w%F8IlqZb&P#SQ-;+`3Q8P_6hjJei7w8Ygep(QMCwXY*3`|_>j zeYSu5dN&HcKsAt@y!W>+3BX1wwCJ~gnXm*9I_lCpktlupmF-ReW?R#wGV)JPP6j8Z zSjvQDDdjslbO}rL!b~-9?4rqB?k6+T@Ulj?7*ljuq7x|LRP}$0o)L&ppD7-x#1xD6 zr@6NF@=4Rwq}=k}er~>4Yj(E88ckDEJY9UM8~!v8*%ypCk_Xyij{G6y%#pImNTkg% zT6P-gBN`#E>M~73dWXp$xgm?v$Zu0V0zLGC=jm>R^{8x86fHlPR-cIk*b?&sR#LDw ztUtVnu4{p!9T-#*#Y4IdtUR{)Y-MPzLsq8RR)!b)ZDkO&EiF@HE5qv}wlawKk(Q~o zm8lgLC@fm;4}!a;Wx}>Hb&fI!_?DKbvz2LZltB=3CvWH-F*+P*JVbFKNJqTzgi=Ivp;#GJQBC`Ajy zM&PsxEG4Z66OvF?2B;j-5n!4ZU1X^Ela{jtWKZ#!E4Hh(Ie(9&ZM zq+`d+Usa`N5*ngBIcn@d4CKl3_tmC{Fp%j?TvK&~m);lOhI2HZDSxF8(ah=O19{V# z@;5=MOj2^_xe$)A~kqo8@W@M~M>Ov zLVy$w?OOzXkHBjLzD?lw34DjZcM1Fp0uCo9FMSet6phnqFjaTg1{+9rG4M_ex#Y!3c{m!~Yp$Q##P3q7fuB_a@3K{cDu^qq%yLx&QYUJ}dp?V5 zV3lFjAQc{n&lcHe744l%Rn|wW*k+(aIszi>5`yaWiTar9|D$ zR>`uuS6I2wA{O;22>5{(2=A3fEn*nY&`uL8j?CNwA@0h=cqI`ViA}>ZqTe6acZ=ig zMQMH!vqvh;1E~?y?|eVl*`lw1zU=izD2LrJgYm>jDxH0x?;R?CZyiQhsW=Bz-j7T`2aq+epGxVa($qa03FyFw()vu$J!v}ruHJDJ{)S1b> zb6a-aXnuS5dy#!_Y<>OI)yD7q#=DVya76b^p0Kvu%i735v6WKo zh{umD^zWk(b{P(46FHlH^e^$$)Q@O&Li+(_@<5f;D8@khR|NPw{2`^*6W}lAq115# z{MlqK^zRXtK%B<82B4%fRX1Q8KwUjngqmLJm#Rw?D>*Wmwe$~}qVwcb%at{+bXZwr zDhk!2PiCwvGDSx$L2(u=N|l1dvA==hzPC(n#2yFPqSU=2#jUquQ-m_xx{Y1ITPD*p z%C>?Mw6-|V044EPygVXRAWCv7J4?9(Q(i>0RKm-_n;JNVC2$}yICu_QCdXC=i7>3& zG7-$uH$dBVGQ&CDP?CrgGx>BSR)(>$087G)g|GZuv{CyZ0iI$vDD`6kJZBtA^p6NZ zV1gz@4-%yb(If)(uuG(l_m`Y-2CYy*`9K{5<{ks3AoM4Iq2X;_<-tBF1!1v-Xy_)4>`+6?(WrCuNtajb)nt|+-T}@w_c(uvRXK)jnlcmkE)5$kTb71xg@~A1Q5voCEwWTjK3Y!zv-H%18G@;I ztthcETJT7+YHdwNm?sGIq?of>gx{Ab&Ji9vJQY(9`~7VDhiTw6X5bvqS*!CVz_@M> z{30sNuWKmPe?(_2|MoO>jD`M!oePvr>fd$@o!!6vBl_lFMnQ+5k6cA4)fzDU-iEH{Tk}C<_a`1#UHk3u+I)EJ8@0E>J3sc|`NW}{_1*cZ)z~?1+Z|g8jBuOF zgD3g>{2S^Jvq<(#upFhHm|pa0O36g%PY6Na2h;<4i|!cOTbX^vdQbi1G)-05M{yS#dK9t6ySt-2v~^4X?x9Ebg0{Rd^6Ff z{NSJ=xZuq&t4iK2hb>6NN^JGfW+YjCH57Ek1W}o?f~>4IP>_|ZOfAZon-MBg9BM`H zQR}$f*ve!p6E3#9UTsht#d}N}8t(FerqPO6gHg>?S6nkS7un06*$MBy_?nx`sxKO; ze}<1DHBzy+j<*T3jL}%qlI&q|dq2#kMcVVT^7ho?l@IW3|E270u#t0mT=ZN1)_Syu z47416&5L$9vco;*Hucp5c)nm8*do1s7w;FrX+Q1!S?;H?anto5tI(pThW8a2)j3iR zitQpUY+XcK9{d$>h!D4HSw|B5gM|7BLy;o)Ekm*VI0WKUd`aW$<;Nkg@hCI@VoJaE zpHQ3jGXj4OfFSyAN`H?4@p@)-tlBIL`Je(auD`OJh-}8)E&7t*MllD^w*rj%Zg=d= zckH~;#9_2E9mk3xMlDwk?{*Ar)HIG4T^gwKMlGuody>FRY;jIuGJrsw#DPPs)lo~xXY_Pu58rknwV$D+9 zjb+6N8X6utg;G3RC1snH#UB%bRUaZxbBKRJDV8%dcBY(R-BBiI{*1B^n5I$tLnMTp zL6H8sO%Av2I@1fC%~$tWMibOc+7oW+>?D*{bvcT`r))R1-~#X4;>gnH8z-A?Q@(DU zWjpn5oNI~X*Y3zaerk5@X$1cD`o>RSFK#H`u$uD}0wGJ%Q3sOvD_%uOcN34CYT9Cc zV|bARkS<EtxOyjOfoT(D0(;SSTW|lzw zF-L2m(K+E>g5gNyn~@ z(9smd<1OY&dut@8S`?9Yx_cdr4XbkGiFzSl6SWxIy}VVn?ZMQzGQLJLlCHv+0Gxbn zDHjoV6kJ5m<{FgIL`(}c70M>lR66aHRUA#bm5S}xF8wJKmy*~A`wmZ! z<@Y^fZnEFD`_-!3;hucB=jsc$!kd?|$-X~UBPA@_h+y-g{8zeVy@PcJ>W!&8aF=ED z^FC!E@PCPZwjxoYpQ2u1`J+G@HyUTV_pmQ?7sz2o*<%ZfrE26ey$_hrGSfLWvJ%dJ zcHHS>t)>&oy0;5P(`i@9O1&OW4;dc#>=uiX{5jfT8?L{kTZgOZLwZJ_o<3*aqS&yE`8_4y384VNV%B*@|19N`L75| zAVOVUg+!^#CGT2e69q~X&)cK?@;*}xuJdD;)HVBN4R-5Vs+#GEv{W_IDIt_IxF~4h zUM%zDj+W%Tri+43Ng1dat%_9}4NRn`IN*f#eo&B*IKNNa*~ia7a1RVYop%bGN|jg7 zA)?9fs6#2?3%-~g(R6FEmv4Bm|Nqc3et{2FwojVov1!cllvqT|=#UJvofB@QSwynU z!3nL+A8T*7Ka_8O==z!)fwwo!wC{%|K|7<&z0mKst-jsXmv5uJA!pvaJkz!dXxb`W zu4nWwawZY?fG0Zl;D1nuSljrYl=@!;m=^wqQcMdnruf%{CD21%c>;+NK~y)BhrSZ~ zM@s(Y+B)I}FrX|(IR~2Od5i(vRtuhtI)4<_SSyH;q>t5~cB~ zw{|v{FJVw_`4IdgU>0W|Orc++6VBsm8Oc1068@z;loyMx=Q8kn-TK@aF)_4ovub{w4AdSpf;<9wKTD zU!TE4cwf&=L2yptskULd{9#+iyGwOd|hD$0h>qM!nCM(6N>8(HfhORmMJl`B!2{&0>V zTX9rU4VA*}q5K5I8cVR~tt!t^Lzbba!`dcMo}<>5W4UWPVfe>Hy`paOI8?0b4Af!e zrADY+hw1F=qE$53V`HKwO3Fj;i)Sjr)2h4yMF-U|zPHRlWrn^GpXP8FqaMyQav$OB zs<;{4rgLD-{cv9`*}zNX4SWbKDpM_s0^=sEvtDN z?rU@#^^)V)5F_Wa#mM<`Bx3oxTs#Z77$fJiqTEu5mJ^Y7d`1Ln@!M+g+iEH9F)G&L zM=czTB3mpe9Y$1&l@lr7*R3>OVakO~( zmhDB$>m+I@W{56ZK%J?(JIKZ6C>$jYiT_%|DOm3vF=uM`A3XN>bjy$TLauhy%ssT@ z)!^;$>U?sa>Di7)`E-U>956GZ zJbGt!?8fTZ)q8I$%~zBwr@mb|qwKxY+To0PyR&AU!!Oz+b_h_Jd~KIl(5bVu4Qgqb zxU}f<{-5^b-=DyNf=N|a`{HhanqdUbnfYj)gsmB}aE!X)5uBWj|ED3I)ets0g943$8cz`MTTtw9+wWD~_#vJS;=dre{I&LaWQ~IpZVd@=JhkPJE z_b%M97^;%+HqZFC9!mwca0H97{DL`xiMd&hVE#hPSQi8;Q8t-r60t@GCN`UlcC+OB zB+g^_(97J3OD{3m0=I^2`SL;rsrhhD0Q~r!jCA0)O;_a0`8UxpztG5NQr(?Qev!p?q(BZ zO<+6_D9pSo8{|_FV@ ProjectsResponse: - """ - Please see get_projects for more information. - """ - return await self.get_projects( - timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - async def get_projects( - self, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ProjectsResponse: - """ - Gets a list of projects for the authenticated user. - - Reference: - https://developers.deepgram.com/reference/get-projects - """ - self._logger.debug("ManageClient.get_projects ENTER") - url = f"{self._config.url}/{self._endpoint}" - self._logger.info("url: %s", url) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = ProjectsResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_projects succeeded") - self._logger.debug("ManageClient.get_projects LEAVE") - return res - - async def get_project( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Project: - """ - Gets details for a specific project. - - Reference: - https://developers.deepgram.com/reference/get-project - """ - self._logger.debug("ManageClient.get_project ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Project.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_project succeeded") - self._logger.debug("ManageClient.get_project LEAVE") - return res - - async def update_project_option( - self, - project_id: str, - options: Union[Dict, ProjectOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Updates a project's settings. - - Reference: - https://developers.deepgram.com/reference/update-project - """ - self._logger.debug("ManageClient.update_project_option ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, ProjectOptions): - self._logger.info("ProjectOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.patch( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("update_project_option succeeded") - self._logger.debug("ManageClient.update_project_option LEAVE") - return res - - async def update_project( - self, - project_id: str, - name="", - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Updates a project's settings. - - Reference: - https://developers.deepgram.com/reference/update-project - """ - self._logger.debug("ManageClient.update_project ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}" - options = { - "name": name, - } - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.patch( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("update_project succeeded") - self._logger.debug("ManageClient.update_project LEAVE") - return res - - async def delete_project( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Deletes a project. - - Reference: - https://developers.deepgram.com/reference/delete-project - """ - self._logger.debug("ManageClient.delete_project ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}" - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.delete( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("delete_project succeeded") - self._logger.debug("ManageClient.delete_project LEAVE") - return res - - async def list_project_models( - self, - project_id: str, - options: Optional[Union[Dict, ModelOptions]] = None, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelsResponse: - """ - Please see get_project_models. - """ - return await self.get_project_models( - project_id, - options=options, - timeout=timeout, - addons=addons, - headers=headers, - **kwargs, - ) - - async def get_project_models( - self, - project_id: str, - options: Optional[Union[Dict, ModelOptions]] = None, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelsResponse: - """ - Gets models for a specific project. - - Reference: - https://developers.deepgram.com/reference/get-project - https://developers.deepgram.com/reference/get-model - - Args: - project_id (str): The ID of the project. - timeout (Optional[httpx.Timeout]): The timeout setting for the request. - addons (Optional[Dict]): Additional options for the request. - headers (Optional[Dict]): Headers to include in the request. - **kwargs: Additional keyword arguments. - - Returns: - ModelsResponse: A response object containing the model details. - """ - self._logger.debug("ManageClient.get_project_models ENTER") - - if options is None: - options = ModelOptions() - - url = f"{self._config.url}/{self._endpoint}/{project_id}/models" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, ModelOptions): - self._logger.info("ModelOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = ModelsResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_project_models succeeded") - self._logger.debug("ManageClient.get_project_models LEAVE") - return res - - async def get_project_model( - self, - project_id: str, - model_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelResponse: - """ - Gets a single model for a specific project. - - Reference: - https://developers.deepgram.com/reference/get-project - https://developers.deepgram.com/reference/get-model - - Args: - project_id (str): The ID of the project. - model_id (str): The ID of the model. - timeout (Optional[httpx.Timeout]): The timeout setting for the request. - addons (Optional[Dict]): Additional options for the request. - headers (Optional[Dict]): Headers to include in the request. - **kwargs: Additional keyword arguments. - - Returns: - ModelResponse: A response object containing the model details. - """ - self._logger.debug("ManageClient.get_project_model ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/models/{model_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("model_id: %s", model_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = ModelResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_project_model succeeded") - self._logger.debug("ManageClient.get_project_model LEAVE") - return res - - # models - async def list_models( - self, - options: Optional[Union[Dict, ModelOptions]] = None, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelsResponse: - """ - Please see get_models for more information. - """ - return await self.get_models( - options=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - async def get_models( - self, - options: Optional[Union[Dict, ModelOptions]] = None, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelsResponse: - """ - Gets all models available. - - Reference: - https://developers.deepgram.com/reference/get-model - - Args: - timeout (Optional[httpx.Timeout]): The timeout setting for the request. - addons (Optional[Dict]): Additional options for the request. - headers (Optional[Dict]): Headers to include in the request. - **kwargs: Additional keyword arguments. - - Returns: - ModelsResponse: A response object containing the model details. - """ - self._logger.debug("ManageClient.get_models ENTER") - - if options is None: - options = ModelOptions() - - url = f"{self._config.url}/v1/models" - self._logger.info("url: %s", url) - if isinstance(options, ModelOptions): - self._logger.info("ModelOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = ModelsResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_models succeeded") - self._logger.debug("ManageClient.get_models LEAVE") - return res - - async def get_model( - self, - model_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelResponse: - """ - Gets information for a specific model. - - Reference: - https://developers.deepgram.com/reference/get-model - - Args: - model_id (str): The ID of the model. - timeout (Optional[httpx.Timeout]): The timeout setting for the request. - addons (Optional[Dict]): Additional options for the request. - headers (Optional[Dict]): Headers to include in the request. - **kwargs: Additional keyword arguments. - - Returns: - ModelResponse: A response object containing the model details. - """ - self._logger.debug("ManageClient.get_model ENTER") - url = f"{self._config.url}/v1/models/{model_id}" - self._logger.info("url: %s", url) - self._logger.info("model_id: %s", model_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = ModelResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_model succeeded") - self._logger.debug("ManageClient.get_model LEAVE") - return res - - # keys - async def list_keys( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> KeysResponse: - """ - Please see get_keys for more information. - """ - return await self.get_keys( - project_id, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - async def get_keys( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> KeysResponse: - """ - Gets a list of keys for a project. - - Reference: - https://developers.deepgram.com/reference/list-keys - """ - self._logger.debug("ManageClient.get_keys ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/keys" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = KeysResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_keys succeeded") - self._logger.debug("ManageClient.get_keys LEAVE") - return res - - async def get_key( - self, - project_id: str, - key_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> KeyResponse: - """ - Gets details for a specific key. - - Reference: - https://developers.deepgram.com/reference/get-key - """ - self._logger.debug("ManageClient.get_key ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/keys/{key_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("key_id: %s", key_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = KeyResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_key succeeded") - self._logger.debug("ManageClient.get_key LEAVE") - return res - - async def create_key( - self, - project_id: str, - options: Union[Dict, KeyOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Key: - """ - Creates a new key. - - Reference: - https://developers.deepgram.com/reference/create-key - """ - self._logger.debug("ManageClient.create_key ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/keys" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, KeyOptions): - self._logger.info("KeyOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Key.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("create_key succeeded") - self._logger.debug("ManageClient.create_key LEAVE") - return res - - async def delete_key( - self, - project_id: str, - key_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Deletes a key. - - Reference: - https://developers.deepgram.com/reference/delete-key - """ - self._logger.debug("ManageClient.delete_key ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/keys/{key_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("key_id: %s", key_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.delete( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("delete_key succeeded") - self._logger.debug("ManageClient.delete_key LEAVE") - return res - - # members - async def list_members( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> MembersResponse: - """ - Please see get_members for more information. - """ - return await self.get_members( - project_id, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - async def get_members( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> MembersResponse: - """ - Gets a list of members for a project. - - Reference: - https://developers.deepgram.com/reference/get-members - """ - self._logger.debug("ManageClient.get_members ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/members" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = MembersResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_members succeeded") - self._logger.debug("ManageClient.get_members LEAVE") - return res - - async def remove_member( - self, - project_id: str, - member_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Removes a member from a project. - - Reference: - https://developers.deepgram.com/reference/remove-member - """ - self._logger.debug("ManageClient.remove_member ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/members/{member_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("member_id: %s", member_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.delete( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("remove_member succeeded") - self._logger.debug("ManageClient.remove_member LEAVE") - return res - - # scopes - async def get_member_scopes( - self, - project_id: str, - member_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ScopesResponse: - """ - Gets a list of scopes for a member. - - Reference: - https://developers.deepgram.com/reference/get-member-scopes - """ - self._logger.debug("ManageClient.get_member_scopes ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/members/{member_id}/scopes" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("member_id: %s", member_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = ScopesResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_member_scopes succeeded") - self._logger.debug("ManageClient.get_member_scopes LEAVE") - return res - - async def update_member_scope( - self, - project_id: str, - member_id: str, - options: Union[Dict, ScopeOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Updates a member's scopes. - - Reference: - https://developers.deepgram.com/reference/update-scope - """ - self._logger.debug("ManageClient.update_member_scope ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/members/{member_id}/scopes" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, ScopeOptions): - self._logger.info("ScopeOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.put( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("update_member_scope succeeded") - self._logger.debug("ManageClient.update_member_scope LEAVE") - return res - - # invites - async def list_invites( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> InvitesResponse: - """ - Please see get_invites for more information. - """ - return await self.get_invites( - project_id, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - async def get_invites( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> InvitesResponse: - """ - Gets a list of invites for a project. - - Reference: - https://developers.deepgram.com/reference/list-invites - """ - self._logger.debug("ManageClient.get_invites ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/invites" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = InvitesResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_invites succeeded") - self._logger.debug("ManageClient.get_invites LEAVE") - return res - - async def send_invite_options( - self, - project_id: str, - options: Union[Dict, InviteOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Sends an invite to a project. - - Reference: - https://developers.deepgram.com/reference/send-invite - """ - self._logger.debug("ManageClient.send_invite_options ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/invites" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, InviteOptions): - self._logger.info("InviteOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("send_invite_options succeeded") - self._logger.debug("ManageClient.send_invite_options LEAVE") - return res - - async def send_invite( - self, - project_id: str, - email: str, - scope="member", - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Sends an invite to a project. - - Reference: - https://developers.deepgram.com/reference/send-invite - """ - self._logger.debug("ManageClient.send_invite ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/invites" - options = { - "email": email, - "scope": scope, - } - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.post( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("send_invite succeeded") - self._logger.debug("ManageClient.send_invite LEAVE") - return res - - async def delete_invite( - self, - project_id: str, - email: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Deletes an invite from a project. - - Reference: - https://developers.deepgram.com/reference/delete-invite - """ - self._logger.debug("ManageClient.delete_invite ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/invites/{email}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("email: %s", email) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.delete( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("delete_invite succeeded") - self._logger.debug("ManageClient.delete_invite LEAVE") - return res - - async def leave_project( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Leaves a project. - - Reference: - https://developers.deepgram.com/reference/leave-project - """ - self._logger.debug("ManageClient.leave_project ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/leave" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.delete( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("leave_project succeeded") - self._logger.debug("ManageClient.leave_project LEAVE") - return res - - # usage - async def get_usage_requests( - self, - project_id: str, - options: Union[Dict, UsageRequestOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> UsageRequestsResponse: - """ - Gets a list of usage requests for a project. - - Reference: - https://developers.deepgram.com/reference/get-all-requests - """ - self._logger.debug("ManageClient.get_usage_requests ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/requests" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, UsageRequestOptions): - self._logger.info("UsageRequestOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, - options=options, - timeout=timeout, - addons=addons, - headers=headers, - **kwargs, - ) - self._logger.info("result: %s", result) - res = UsageRequestsResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_usage_requests succeeded") - self._logger.debug("ManageClient.get_usage_requests LEAVE") - return res - - async def get_usage_request( - self, - project_id: str, - request_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> UsageRequest: - """ - Gets details for a specific usage request. - - Reference: - https://developers.deepgram.com/reference/get-request - """ - self._logger.debug("ManageClient.get_usage_request ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/requests/{request_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("request_id: %s", request_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - - # convert str to JSON to check response field - json_result = json.loads(result) - if json_result.get("response") is None: - raise DeepgramError( - "Response is not available yet. Please try again later." - ) - - res = UsageRequest.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_usage_request succeeded") - self._logger.debug("ManageClient.get_usage_request LEAVE") - return res - - async def get_usage_summary( - self, - project_id: str, - options: Union[Dict, UsageSummaryOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> UsageSummaryResponse: - """ - Gets a summary of usage for a project. - - Reference: - https://developers.deepgram.com/reference/summarize-usage - """ - self._logger.debug("ManageClient.get_usage_summary ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/usage" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, UsageSummaryOptions): - self._logger.info("UsageSummaryOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, - options=options, - timeout=timeout, - addons=addons, - headers=headers, - **kwargs, - ) - self._logger.info("result: %s", result) - res = UsageSummaryResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_usage_summary succeeded") - self._logger.debug("ManageClient.get_usage_summary LEAVE") - return res - - async def get_usage_fields( - self, - project_id: str, - options: Union[Dict, UsageFieldsOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> UsageFieldsResponse: - """ - Gets a list of usage fields for a project. - - Reference: - https://developers.deepgram.com/reference/get-fields - """ - self._logger.debug("ManageClient.get_usage_fields ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/usage/fields" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, UsageFieldsOptions): - self._logger.info("UsageFieldsOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, - options=options, - timeout=timeout, - addons=addons, - headers=headers, - **kwargs, - ) - self._logger.info("result: %s", result) - res = UsageFieldsResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_usage_fields succeeded") - self._logger.debug("ManageClient.get_usage_fields LEAVE") - return res - - # balances - async def list_balances( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> BalancesResponse: - """ - Please see get_balances for more information. - """ - return await self.get_balances( - project_id, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - async def get_balances( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> BalancesResponse: - """ - Gets a list of balances for a project. - - Reference: - https://developers.deepgram.com/reference/get-all-balances - """ - self._logger.debug("ManageClient.get_balances ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/balances" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = BalancesResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_balances succeeded") - self._logger.debug("ManageClient.get_balances LEAVE") - return res - - async def get_balance( - self, - project_id: str, - balance_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Balance: - """ - Gets details for a specific balance. - - Reference: - https://developers.deepgram.com/reference/get-balance - """ - self._logger.debug("ManageClient.get_balance ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/balances/{balance_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("balance_id: %s", balance_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = await self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("result: %s", result) - res = Balance.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_balance succeeded") - self._logger.debug("ManageClient.get_balance LEAVE") - return res - - # pylint: enable=too-many-positional-arguments diff --git a/venv/Lib/site-packages/deepgram/clients/manage/v1/client.py b/venv/Lib/site-packages/deepgram/clients/manage/v1/client.py deleted file mode 100644 index a2b6e94c..00000000 --- a/venv/Lib/site-packages/deepgram/clients/manage/v1/client.py +++ /dev/null @@ -1,1179 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from typing import Dict, Union, Optional -import json - -import httpx - -from ....utils import verboselogs -from ....options import DeepgramClientOptions -from ...common import AbstractSyncRestClient, DeepgramError - -from .response import ( - Message, - Project, - ProjectsResponse, - MembersResponse, - Key, - KeyResponse, - KeysResponse, - ScopesResponse, - InvitesResponse, - UsageRequest, - UsageRequestsResponse, - UsageSummaryResponse, - UsageFieldsResponse, - Balance, - BalancesResponse, - ModelResponse, - ModelsResponse, -) -from .options import ( - ProjectOptions, - ModelOptions, - KeyOptions, - ScopeOptions, - InviteOptions, - UsageRequestOptions, - UsageSummaryOptions, - UsageFieldsOptions, -) - - -class ManageClient( - AbstractSyncRestClient -): # pylint: disable=too-many-public-methods,too-many-lines - """ - A client for managing Deepgram projects and associated resources via the Deepgram API. - - This class provides methods for performing various operations on Deepgram projects, including: - - Retrieving project details - - Updating project settings - - Managing project members and scopes - - Handling project invitations - - Monitoring project usage and balances - - Args: - config (DeepgramClientOptions): all the options for the client. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - - self._config = config - self._endpoint = "v1/projects" - super().__init__(config) - - # projects - def list_projects( - self, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ProjectsResponse: - """ - List all projects for the current user. - """ - return self.get_projects( - timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - # pylint: disable=too-many-positional-arguments - - def get_projects( - self, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ProjectsResponse: - """ - Gets a list of projects for the authenticated user. - - Reference: - https://developers.deepgram.com/reference/get-projects - """ - self._logger.debug("ManageClient.get_projects ENTER") - url = f"{self._config.url}/{self._endpoint}" - self._logger.info("url: %s", url) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = ProjectsResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_projects succeeded") - self._logger.debug("ManageClient.get_projects LEAVE") - return res - - def get_project( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Project: - """ - Gets details for a specific project. - - Reference: - https://developers.deepgram.com/reference/get-project - """ - self._logger.debug("ManageClient.get_project ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Project.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_project succeeded") - self._logger.debug("ManageClient.get_project LEAVE") - return res - - def update_project_option( - self, - project_id: str, - options: Union[Dict, ProjectOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Updates a project's settings. - - Reference: - https://developers.deepgram.com/reference/update-project - """ - self._logger.debug("ManageClient.update_project_option ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, ProjectOptions): - self._logger.info("ProjectOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.patch( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("update_project_option succeeded") - self._logger.debug("ManageClient.update_project_option LEAVE") - return res - - def update_project( - self, - project_id: str, - name: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Updates a project's settings. - - Reference: - https://developers.deepgram.com/reference/update-project - """ - self._logger.debug("ManageClient.update_project ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}" - options = { - "name": name, - } - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.patch( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("update_project succeeded") - self._logger.debug("ManageClient.update_project LEAVE") - return res - - def delete_project( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Deletes a project. - - Reference: - https://developers.deepgram.com/reference/delete-project - """ - self._logger.debug("ManageClient.delete_project ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}" - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.delete( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("delete_project succeeded") - self._logger.debug("ManageClient.delete_project LEAVE") - return res - - def list_project_models( - self, - project_id: str, - options: Optional[Union[Dict, ModelOptions]] = None, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelsResponse: - """ - Please see get_project_models. - """ - return self.get_project_models( - project_id, - options=options, - timeout=timeout, - addons=addons, - headers=headers, - **kwargs, - ) - - def get_project_models( - self, - project_id: str, - options: Optional[Union[Dict, ModelOptions]] = None, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelsResponse: - """ - Gets models for a specific project. - - Reference: - https://developers.deepgram.com/reference/get-project - https://developers.deepgram.com/reference/get-model - - Args: - project_id (str): The ID of the project. - options (Optional[Union[Dict, ModelOptions]]): The options for the request. - timeout (Optional[httpx.Timeout]): The timeout setting for the request. - addons (Optional[Dict]): Additional options for the request. - headers (Optional[Dict]): Headers to include in the request. - **kwargs: Additional keyword arguments. - - Returns: - ModelsResponse: A response object containing the model details. - """ - self._logger.debug("ManageClient.get_project_models ENTER") - - if options is None: - options = ModelOptions() - - url = f"{self._config.url}/{self._endpoint}/{project_id}/models" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, ModelOptions): - self._logger.info("ModelOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = ModelsResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_project_models succeeded") - self._logger.debug("ManageClient.get_project_models LEAVE") - return res - - def get_project_model( - self, - project_id: str, - model_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelResponse: - """ - Gets a single model for a specific project. - - Reference: - https://developers.deepgram.com/reference/get-project - https://developers.deepgram.com/reference/get-model - - Args: - project_id (str): The ID of the project. - model_id (str): The ID of the model. - timeout (Optional[httpx.Timeout]): The timeout setting for the request. - addons (Optional[Dict]): Additional options for the request. - headers (Optional[Dict]): Headers to include in the request. - **kwargs: Additional keyword arguments. - - Returns: - ModelResponse: A response object containing the model details. - """ - self._logger.debug("ManageClient.get_project_model ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/models/{model_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("model_id: %s", model_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = ModelResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_project_model succeeded") - self._logger.debug("ManageClient.get_project_model LEAVE") - return res - - # models - def list_models( - self, - options: Optional[Union[Dict, ModelOptions]] = None, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelsResponse: - """ - Please see get_models for more information. - """ - return self.get_models( - options=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - def get_models( - self, - options: Optional[Union[Dict, ModelOptions]] = None, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelsResponse: - """ - Gets all models available. - - Reference: - https://developers.deepgram.com/reference/get-model - - Args: - options (Optional[Union[Dict, ModelOptions]]): The options for the request. - timeout (Optional[httpx.Timeout]): The timeout setting for the request. - addons (Optional[Dict]): Additional options for the request. - headers (Optional[Dict]): Headers to include in the request. - **kwargs: Additional keyword arguments. - - Returns: - ModelsResponse: A response object containing the model details. - """ - self._logger.debug("ManageClient.get_models ENTER") - - if options is None: - options = ModelOptions() - - url = f"{self._config.url}/v1/models" - self._logger.info("url: %s", url) - if isinstance(options, ModelOptions): - self._logger.info("ModelOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = ModelsResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_models succeeded") - self._logger.debug("ManageClient.get_models LEAVE") - return res - - def get_model( - self, - model_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ModelResponse: - """ - Gets information for a specific model. - - Reference: - https://developers.deepgram.com/reference/get-model - - Args: - model_id (str): The ID of the model. - timeout (Optional[httpx.Timeout]): The timeout setting for the request. - addons (Optional[Dict]): Additional options for the request. - headers (Optional[Dict]): Headers to include in the request. - **kwargs: Additional keyword arguments. - - Returns: - ModelResponse: A response object containing the model details. - """ - self._logger.debug("ManageClient.get_model ENTER") - url = f"{self._config.url}/v1/models/{model_id}" - self._logger.info("url: %s", url) - self._logger.info("model_id: %s", model_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = ModelResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_model succeeded") - self._logger.debug("ManageClient.get_model LEAVE") - return res - - # keys - def list_keys( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> KeysResponse: - """ - Please see get_keys for more information. - """ - return self.get_keys( - project_id, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - def get_keys( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> KeysResponse: - """ - Gets a list of keys for a project. - - Reference: - https://developers.deepgram.com/reference/list-keys - """ - self._logger.debug("ManageClient.get_keys ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/keys" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = KeysResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_keys succeeded") - self._logger.debug("ManageClient.get_keys LEAVE") - return res - - def get_key( - self, - project_id: str, - key_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> KeyResponse: - """ - Gets details for a specific key. - - Reference: - https://developers.deepgram.com/reference/get-key - """ - self._logger.debug("ManageClient.get_key ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/keys/{key_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("key_id: %s", key_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = KeyResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_key succeeded") - self._logger.debug("ManageClient.get_key LEAVE") - return res - - def create_key( - self, - project_id: str, - options: Union[Dict, KeyOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Key: - """ - Creates a new key. - - Reference: - https://developers.deepgram.com/reference/create-key - """ - self._logger.debug("ManageClient.create_key ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/keys" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, KeyOptions): - self._logger.info("KeyOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Key.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("create_key succeeded") - self._logger.debug("ManageClient.create_key LEAVE") - return res - - def delete_key( - self, - project_id: str, - key_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Deletes a key. - - Reference: - https://developers.deepgram.com/reference/delete-key - """ - self._logger.debug("ManageClient.delete_key ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/keys/{key_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("key_id: %s", key_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.delete( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("delete_key succeeded") - self._logger.debug("ManageClient.delete_key LEAVE") - return res - - # members - def list_members( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> MembersResponse: - """ - Please see get_members for more information. - """ - return self.get_members( - project_id, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - def get_members( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> MembersResponse: - """ - Gets a list of members for a project. - - Reference: - https://developers.deepgram.com/reference/get-members - """ - self._logger.debug("ManageClient.get_members ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/members" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = MembersResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_members succeeded") - self._logger.debug("ManageClient.get_members LEAVE") - return res - - def remove_member( - self, - project_id: str, - member_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Removes a member from a project. - - Reference: - https://developers.deepgram.com/reference/remove-member - """ - self._logger.debug("ManageClient.remove_member ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/members/{member_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("member_id: %s", member_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.delete( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("remove_member succeeded") - self._logger.debug("ManageClient.remove_member LEAVE") - return res - - # scopes - def get_member_scopes( - self, - project_id: str, - member_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> ScopesResponse: - """ - Gets a list of scopes for a member. - - Reference: - https://developers.deepgram.com/reference/get-member-scopes - """ - self._logger.debug("ManageClient.get_member_scopes ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/members/{member_id}/scopes" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("member_id: %s", member_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = ScopesResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_member_scopes succeeded") - self._logger.debug("ManageClient.get_member_scopes LEAVE") - return res - - def update_member_scope( - self, - project_id: str, - member_id: str, - options: Union[Dict, ScopeOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Updates a member's scopes. - - Reference: - https://developers.deepgram.com/reference/update-scope - """ - self._logger.debug("ManageClient.update_member_scope ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/members/{member_id}/scopes" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, ScopeOptions): - self._logger.info("ScopeOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.put( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("update_member_scope succeeded") - self._logger.debug("ManageClient.update_member_scope LEAVE") - return res - - # invites - def list_invites( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> InvitesResponse: - """ - Please see get_invites for more information. - """ - return self.get_invites( - project_id, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - def get_invites( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> InvitesResponse: - """ - Gets a list of invites for a project. - - Reference: - https://developers.deepgram.com/reference/list-invites - """ - self._logger.debug("ManageClient.get_invites ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/invites" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = InvitesResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_invites succeeded") - self._logger.debug("ManageClient.get_invites LEAVE") - return res - - def send_invite_options( - self, - project_id: str, - options: Union[Dict, InviteOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Sends an invite to a project. - - Reference: - https://developers.deepgram.com/reference/send-invite - """ - self._logger.debug("ManageClient.send_invite_options ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/invites" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, InviteOptions): - self._logger.info("InviteOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("send_invite_options succeeded") - self._logger.debug("ManageClient.send_invite_options LEAVE") - return res - - def send_invite( - self, - project_id: str, - email: str, - scope="member", - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Sends an invite to a project. - - Reference: - https://developers.deepgram.com/reference/send-invite - """ - self._logger.debug("ManageClient.send_invite ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/invites" - options = { - "email": email, - "scope": scope, - } - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.post( - url, json=options, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("send_invite succeeded") - self._logger.debug("ManageClient.send_invite LEAVE") - return res - - def delete_invite( - self, - project_id: str, - email: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Deletes an invite from a project. - - Reference: - https://developers.deepgram.com/reference/delete-invite - """ - self._logger.debug("ManageClient.delete_invite ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/invites/{email}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("email: %s", email) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.delete( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("delete_invite succeeded") - self._logger.debug("ManageClient.delete_invite LEAVE") - return res - - def leave_project( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Message: - """ - Leaves a project. - - Reference: - https://developers.deepgram.com/reference/leave-project - """ - self._logger.debug("ManageClient.leave_project ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/leave" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.delete( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Message.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("leave_project succeeded") - self._logger.debug("ManageClient.leave_project LEAVE") - return res - - # usage - def get_usage_requests( - self, - project_id: str, - options: Union[Dict, UsageRequestOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> UsageRequestsResponse: - """ - Gets a list of usage requests for a project. - - Reference: - https://developers.deepgram.com/reference/get-all-requests - """ - self._logger.debug("ManageClient.get_usage_requests ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/requests" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, UsageRequestOptions): - self._logger.info("UsageRequestOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, - options=options, - timeout=timeout, - addons=addons, - headers=headers, - **kwargs, - ) - self._logger.info("json: %s", result) - res = UsageRequestsResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_usage_requests succeeded") - self._logger.debug("ManageClient.get_usage_requests LEAVE") - return res - - def get_usage_request( - self, - project_id: str, - request_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> UsageRequest: - """ - Gets details for a specific usage request. - - Reference: - https://developers.deepgram.com/reference/get-request - """ - self._logger.debug("ManageClient.get_usage_request ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/requests/{request_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("request_id: %s", request_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - - # convert str to JSON to check response field - json_result = json.loads(result) - if json_result.get("response") is None: - raise DeepgramError( - "Response is not available yet. Please try again later." - ) - - res = UsageRequest.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_usage_request succeeded") - self._logger.debug("ManageClient.get_usage_request LEAVE") - return res - - def get_usage_summary( - self, - project_id: str, - options: Union[Dict, UsageSummaryOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> UsageSummaryResponse: - """ - Gets a summary of usage for a project. - - Reference: - https://developers.deepgram.com/reference/summarize-usage - """ - self._logger.debug("ManageClient.get_usage_summary ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/usage" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, UsageSummaryOptions): - self._logger.info("UsageSummaryOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, - options=options, - timeout=timeout, - addons=addons, - headers=headers, - **kwargs, - ) - self._logger.info("json: %s", result) - res = UsageSummaryResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_usage_summary succeeded") - self._logger.debug("ManageClient.get_usage_summary LEAVE") - return res - - def get_usage_fields( - self, - project_id: str, - options: Union[Dict, UsageFieldsOptions], - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> UsageFieldsResponse: - """ - Gets a list of usage fields for a project. - - Reference: - https://developers.deepgram.com/reference/get-fields - """ - self._logger.debug("ManageClient.get_usage_fields ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/usage/fields" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - if isinstance(options, UsageFieldsOptions): - self._logger.info("UsageFieldsOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, - options=options, - timeout=timeout, - addons=addons, - headers=headers, - **kwargs, - ) - self._logger.info("json: %s", result) - res = UsageFieldsResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_usage_fields succeeded") - self._logger.debug("ManageClient.get_usage_fields LEAVE") - return res - - # balances - def list_balances( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> BalancesResponse: - """ - Please see get_balances for more information. - """ - return self.get_balances( - project_id, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - - def get_balances( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> BalancesResponse: - """ - Gets a list of balances for a project. - - Reference: - https://developers.deepgram.com/reference/get-all-balances - """ - self._logger.debug("ManageClient.get_balances ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/balances" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = BalancesResponse.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_balances succeeded") - self._logger.debug("ManageClient.get_balances LEAVE") - return res - - def get_balance( - self, - project_id: str, - balance_id: str, - timeout: Optional[httpx.Timeout] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - **kwargs, - ) -> Balance: - """ - Gets details for a specific balance. - - Reference: - https://developers.deepgram.com/reference/get-balance - """ - self._logger.debug("ManageClient.get_balance ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/balances/{balance_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("balance_id: %s", balance_id) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - result = self.get( - url, timeout=timeout, addons=addons, headers=headers, **kwargs - ) - self._logger.info("json: %s", result) - res = Balance.from_json(result) - self._logger.verbose("result: %s", res) - self._logger.notice("get_balance succeeded") - self._logger.debug("ManageClient.get_balance LEAVE") - return res - - # pylint: enable=too-many-positional-arguments diff --git a/venv/Lib/site-packages/deepgram/clients/manage/v1/options.py b/venv/Lib/site-packages/deepgram/clients/manage/v1/options.py deleted file mode 100644 index 34fbf876..00000000 --- a/venv/Lib/site-packages/deepgram/clients/manage/v1/options.py +++ /dev/null @@ -1,177 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from ...common import BaseResponse - -# Input - - -@dataclass -class ProjectOptions(BaseResponse): - """ - Project Options - """ - - name: str = "" - - -@dataclass -class ModelOptions(BaseResponse): - """ - Model Options - """ - - include_outdated: bool = False - - -@dataclass -class KeyOptions(BaseResponse): - """ - Key Options - """ - - comment: Optional[str] = "" - expiration_date: Optional[str] = field( - default="", metadata=dataclass_config(exclude=lambda f: f == "") - ) - time_to_live_in_seconds: Optional[int] = field( - default=-1, metadata=dataclass_config(exclude=lambda f: f == -1) - ) - scopes: List[str] = field(default_factory=list) - tags: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if _dict["scopes"] is not None: - _dict["scopes"] = [str(scopes) for scopes in _dict["scopes"]] - if _dict["tags"] is not None: - _dict["tags"] = [str(tags) for tags in _dict["tags"]] - return _dict[key] - - -@dataclass -class ScopeOptions(BaseResponse): - """ - Scope Options - """ - - scope: str = "" - - -@dataclass -class InviteOptions(BaseResponse): - """ - Invite Options - """ - - email: str = "" - scope: str = "" - - -@dataclass -class UsageRequestOptions(BaseResponse): - """ - Usage Request Options - """ - - start: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - end: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - limit: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - status: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - -@dataclass -class UsageSummaryOptions(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - Usage Summary Options - """ - - start: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - end: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - accessor: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - tag: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - method: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - model: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - multichannel: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - interim_results: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - punctuate: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - ner: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - utterances: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - replace: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - profanity_filter: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - keywords: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - detect_topics: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - diarize: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - search: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - redact: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - alternatives: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - numerals: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - smart_format: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - -@dataclass -class UsageFieldsOptions(BaseResponse): - """ - Usage Fields Options - """ - - start: Optional[str] = "" - end: Optional[str] = "" diff --git a/venv/Lib/site-packages/deepgram/clients/manage/v1/response.py b/venv/Lib/site-packages/deepgram/clients/manage/v1/response.py deleted file mode 100644 index ef6824f4..00000000 --- a/venv/Lib/site-packages/deepgram/clients/manage/v1/response.py +++ /dev/null @@ -1,682 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import List, Optional, Dict, Any - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from ...common import ( - BaseResponse, -) - - -# Result Message - - -@dataclass -class Message(BaseResponse): - """ - Message from the Deepgram Platform - """ - - message: str = "" - - -# Projects - - -@dataclass -class Project(BaseResponse): - """ - Project object - """ - - project_id: str = "" - name: str = "" - - -@dataclass -class ProjectsResponse(BaseResponse): - """ - Projects Response object - """ - - projects: List[Project] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "projects" in _dict: - _dict["projects"] = [ - Project.from_dict(projects) for projects in _dict["projects"] - ] - return _dict[key] - - -# Models - - -@dataclass -class STTDetails(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - STTDetails class used to define the properties of the Speech-to-Text model response object. - """ - - name: str = "" - canonical_name: str = "" - architecture: str = "" - languages: List[str] = field(default_factory=list) - version: str = "" - uuid: str = "" - batch: bool = False - streaming: bool = False - formatted_output: bool = False - - def __getitem__(self, key): - _dict = self.to_dict() - if "languages" in _dict: - _dict["languages"] = [str(languages) for languages in _dict["languages"]] - return _dict[key] - - -@dataclass -class TTSMetadata(BaseResponse): - """ - TTSMetadata class used to define the properties for a given STT or TTS model. - """ - - accent: str = "" - color: str = "" - image: str = "" - sample: str = "" - tags: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - -@dataclass -class TTSDetails(BaseResponse): - """ - TTSDetails class used to define the properties of the Text-to-Speech model response object. - """ - - name: str = "" - canonical_name: str = "" - architecture: str = "" - languages: List[str] = field(default_factory=list) - version: str = "" - uuid: str = "" - metadata: Optional[TTSMetadata] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "metadata" in _dict: - _dict["metadata"] = [ - TTSMetadata.from_dict(metadata) for metadata in _dict["metadata"] - ] - return _dict[key] - - -# responses - - -@dataclass -class ModelResponse(BaseResponse): - """ - ModelResponse class used to define the properties of a single model. - """ - - name: str = "" - canonical_name: str = "" - architecture: str = "" - language: str = "" - version: str = "" - uuid: str = "" - metadata: Optional[TTSMetadata] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "metadata" in _dict: - _dict["metadata"] = [ - TTSMetadata.from_dict(metadata) for metadata in _dict["metadata"] - ] - return _dict[key] - - -@dataclass -class ModelsResponse(BaseResponse): - """ - ModelsResponse class used to obtain a list of models. - """ - - stt: List[STTDetails] = field(default_factory=list) - tts: List[TTSDetails] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "stt" in _dict: - _dict["stt"] = [STTDetails.from_dict(stt) for stt in _dict["stt"]] - if "tts" in _dict: - _dict["tts"] = [TTSDetails.from_dict(tts) for tts in _dict["tts"]] - return _dict[key] - - -# Members - - -@dataclass -class Member(BaseResponse): - """ - Member object - """ - - email: str = "" - first_name: str = "" - last_name: str = "" - member_id: str = "" - - -@dataclass -class MembersResponse(BaseResponse): - """ - Members Response object - """ - - members: List[Member] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "members" in _dict: - _dict["members"] = [ - Member.from_dict(members) for members in _dict["members"] - ] - return _dict[key] - - -# Keys - - -@dataclass -class Key(BaseResponse): - """ - Key object - """ - - api_key_id: str = "" - key: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - comment: Optional[str] = "" - created: str = "" - scopes: List[str] = field(default_factory=list) - expiration_date: str = field( - default="", metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "scopes" in _dict: - _dict["scopes"] = [str(scopes) for scopes in _dict["scopes"]] - return _dict[key] - - -@dataclass -class KeyResponse(BaseResponse): - """ - Key Response object - """ - - api_key: Key - member: Member - - def __getitem__(self, key): - _dict = self.to_dict() - if "api_key" in _dict: - _dict["api_key"] = Key.from_dict(_dict["api_key"]) - if "member" in _dict: - _dict["member"] = Member.from_dict(_dict["member"]) - return _dict[key] - - -@dataclass -class KeysResponse(BaseResponse): - """ - Keys Response object - """ - - api_keys: List[KeyResponse] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "api_keys" in _dict: - _dict["api_keys"] = [ - KeyResponse.from_dict(api_keys) for api_keys in _dict["api_keys"] - ] - return _dict[key] - - -# Scopes - - -@dataclass -class ScopesResponse(BaseResponse): - """ - Scopes Response object - """ - - scopes: List[str] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "scopes" in _dict: - _dict["scopes"] = [str(scopes) for scopes in _dict["scopes"]] - return _dict[key] - - -# Invites - - -@dataclass -class Invite(BaseResponse): - """ - Invite object - """ - - email: str = "" - scope: str = "" - - -@dataclass -class InvitesResponse(BaseResponse): - """ - Invites Response object - """ - - invites: List[Invite] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "invites" in _dict: - _dict["invites"] = [ - Invite.from_dict(invites) for invites in _dict["invites"] - ] - return _dict[key] - - -# Usage - - -@dataclass -class Config(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - Config object - """ - - language: str = "" - model: str = "" - punctuate: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - utterances: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - diarize: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - smart_format: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - interim_results: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - topics: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - intents: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sentiment: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - summarize: Optional[bool] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - -@dataclass -class STTUsageDetails(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - Details object - """ - - config: Config - usd: float = 0 - duration: Optional[float] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - total_audio: Optional[float] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - channels: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - streams: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - method: str = "" - tier: Optional[str] = "" - models: List[str] = field(default_factory=list) - tags: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - features: List[str] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "models" in _dict: - _dict["models"] = [str(models) for models in _dict["models"]] - if "tags" in _dict: - _dict["tags"] = [str(tags) for tags in _dict["tags"]] - if "features" in _dict: - _dict["features"] = [str(features) for features in _dict["features"]] - if "config" in _dict: - _dict["config"] = Config.from_dict(_dict["config"]) - return _dict[key] - - -@dataclass -class Callback(BaseResponse): - """ - Callback object - """ - - attempts: int = 0 - code: int = 0 - completed: str = "" - - -@dataclass -class TokenDetail(BaseResponse): - """ - Token Detail object - """ - - feature: str = "" - input: int = 0 - model: str = "" - output: int = 0 - - -@dataclass -class SpeechSegment(BaseResponse): - """ - Speech Segment object - """ - - characters: int = 0 - model: str = "" - tier: str = "" - - -@dataclass -class TTSUsageDetails(BaseResponse): - """ - TTS Details object - """ - - duration: float = 0 - speech_segments: List[SpeechSegment] = field(default_factory=list) - # pylint: disable=fixme - # TODO: audio_metadata: None - # pylint: enable=fixme - - def __getitem__(self, key): - _dict = self.to_dict() - if "speech_segments" in _dict: - _dict["speech_segments"] = [ - SpeechSegment.from_dict(speech_segments) - for speech_segments in _dict["speech_segments"] - ] - return _dict[key] - - -@dataclass -class UsageResponse(BaseResponse): - """ - UsageResponse object - """ - - details: Optional[STTUsageDetails] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - code: int = 0 - completed: str = "" - message: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - tts_details: Optional[TTSUsageDetails] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - token_details: List[TokenDetail] = field( - default_factory=list, metadata=dataclass_config(exclude=lambda f: f is list) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "details" in _dict: - _dict["details"] = STTUsageDetails.from_dict(_dict["details"]) - if "tts_details" in _dict: - _dict["tts_details"] = TTSUsageDetails.from_dict(_dict["tts_details"]) - if "token_details" in _dict: - _dict["token_details"] = [ - TokenDetail.from_dict(token_details) - for token_details in _dict["token_details"] - ] - return _dict[key] - - -@dataclass -class UsageRequest(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - Usage Request object - """ - - response: UsageResponse - project_uuid: str = "" - request_id: str = "" - created: str = "" - path: str = "" - api_key_id: str = "" - callback: Optional[Callback] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - accessor: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "response" in _dict: - _dict["response"] = UsageResponse.from_dict(_dict["response"]) - if "callback" in _dict: - _dict["callback"] = Callback.from_dict(_dict["callback"]) - return _dict[key] - - -@dataclass -class UsageRequestsResponse(BaseResponse): - """ - Usage Requests Response object - """ - - page: int = 0 - limit: int = 0 - requests: List[UsageRequest] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "requests" in _dict: - _dict["requests"] = [ - UsageRequest.from_dict(requests) for requests in _dict["requests"] - ] - return _dict[key] - - -@dataclass -class STTTokens(BaseResponse): - """ - STTTokens object - """ - - tokens_in: int = 0 - out: int = 0 - - -@dataclass -class TTSTokens(BaseResponse): - """ - TTSTokens object - """ - - characters: int = 0 - requests: int = 0 - - -@dataclass -class UsageSummaryResults(BaseResponse): - """ - Results object - """ - - tokens: STTTokens - tts: TTSTokens - start: str = "" - end: str = "" - hours: int = 0 - total_hours: int = 0 - requests: int = 0 - - def __getitem__(self, key): - _dict = self.to_dict() - if "tokens" in _dict: - _dict["tokens"] = STTTokens.from_dict(_dict["tokens"]) - if "tts" in _dict: - _dict["tts"] = TTSTokens.from_dict(_dict["tts"]) - return _dict[key] - - -@dataclass -class Resolution(BaseResponse): - """ - Resolution object - """ - - units: str = "" - amount: int = 0 - - -@dataclass -class UsageSummaryResponse(BaseResponse): - """ - Usage Summary Response object - """ - - resolution: Resolution - start: str = "" - end: str = "" - results: List[UsageSummaryResults] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "resolution" in _dict: - _dict["resolution"] = Resolution.from_dict(_dict["resolution"]) - if "results" in _dict: - _dict["results"] = [ - UsageSummaryResults.from_dict(results) for results in _dict["results"] - ] - return _dict[key] - - -@dataclass -class UsageModel(BaseResponse): - """ - Usage Model object - """ - - name: str = "" - language: str = "" - version: str = "" - model_id: str = "" - - -@dataclass -class UsageFieldsResponse(BaseResponse): - """ - Usage Fields Response object - """ - - tags: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - models: List[UsageModel] = field(default_factory=list) - processing_methods: List[str] = field(default_factory=list) - features: List[str] = field(default_factory=list) - languages: Optional[List[str]] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - if "tags" in _dict: - _dict["tags"] = [str(tags) for tags in _dict["tags"]] - if "models" in _dict: - _dict["models"] = [ - UsageModel.from_dict(models) for models in _dict["models"] - ] - if "processing_methods" in _dict: - _dict["processing_methods"] = [ - str(processing_methods) - for processing_methods in _dict["processing_methods"] - ] - if "features" in _dict: - _dict["features"] = [str(features) for features in _dict["features"]] - if "languages" in _dict: - _dict["languages"] = [str(languages) for languages in _dict["languages"]] - return _dict[key] - - -# Billing - - -@dataclass -class Balance(BaseResponse): - """ - Balance object - """ - - balance_id: str = "" - amount: str = "" - units: str = "" - purchase_order_id: str = "" - - -@dataclass -class BalancesResponse(BaseResponse): - """ - Balances Response object - """ - - balances: List[Balance] = field(default_factory=list) - - def __getitem__(self, key): - _dict = self.to_dict() - if "balances" in _dict: - _dict["balances"] = [ - Balance.from_dict(balances) for balances in _dict["balances"] - ] - return _dict[key] diff --git a/venv/Lib/site-packages/deepgram/clients/prerecorded/__init__.py b/venv/Lib/site-packages/deepgram/clients/prerecorded/__init__.py deleted file mode 100644 index 9156a65c..00000000 --- a/venv/Lib/site-packages/deepgram/clients/prerecorded/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .v1 import PreRecordedClient -from .v1 import AsyncPreRecordedClient -from .v1 import PrerecordedOptions -from .v1 import ( - UrlSource, - FileSource, - PreRecordedStreamSource, - PrerecordedSource, -) -from .v1 import ( - AsyncPrerecordedResponse, - PrerecordedResponse, - SyncPrerecordedResponse, -) diff --git a/venv/Lib/site-packages/deepgram/clients/prerecorded/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/prerecorded/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 60230a41e6f57d8e74c32f6b5bf65c0fcf7e4469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmZvZ&q~8U5XN`&r)i=^s$e~f2svo+Dk7AMQWO=dmnBeZGSpx;3A<^bPvSFp^f`Qk zKu?~$iA4%tbT+nH#6A4@_M2g5cjl>5aR{FNr5}Sf!bgOH<`&xti&y56~2jnnU%TCZ0<0Jl3~fUUa%)|X2yuqyYC{fV|G&sGnqr!MmS$lROV`NlD-pGmzVIP;4#Nnhx;9s#oeAjjX+Sld zRr$7DJztwOokcD{rdS{HmAUjEv)2B8;@|93cOlmXJ3`0*2}8kDC@EM9Wd&P7EkGr5}Sf!bgOH<`&TW^tR@g>Rx?VkKT?W$rMCl9A=wZxma*G_PI@XoH`K z0D|Kvgg8TUvnfZh|6gVuO|dAyO0zJDrEBEnTM>1Vf$$-BPQwTmy7sF>Clk=)i-a1w z>@v4pJ>OamU1r)KQ|u4<#;@{kv(}kk@o)8|TgffI*hJ{Kqc9Xq1xvwJC@GW`)FX(B z!V2PvOps*eA0K$P5`^^5Tdf=K1mr`Oq~0(IeQ5UaCwW7Nhu%ea=gBaG-L&UF^!gyZ z03hv)9&gNVARFn=rj6l#quUMRFza^r($TDR$dh0Y!I7xqO!Xde8}Y7FNtnJr WCiSUiQf)#I(-nhi9|R%Ru<#4y%BTPU diff --git a/venv/Lib/site-packages/deepgram/clients/prerecorded/v1/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/prerecorded/v1/__pycache__/client.cpython-312.pyc deleted file mode 100644 index ef84cd9a1495edccaf522ca96e586768e6207556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 931 zcmZ`%%WB&|6rGW5*_Pjr_|YWYo3=4sltL(l;L;Lm+G01GK^sN7I3kiIW@LkR`HOx- zm;H`z+?^0~)m3*cAq2AOj5SK!lniJ%I_K!VbibF&I^t*k?cG@?i_kCek{(5Z%aDUF z$VN7Hk%x(b1y(p#NoIppj0#ryDYNQGcQim34f`jPPUKOa%TOn zWa9=WskDC#LdT!6xNt(0FFTg9 zCgkdE^ODU8wstoMN#_N<|G-G3ryx9{;Iyk`I#Lzu6hBT2PA%y~q^T%Oy{!=U^wOq` z2Zoo#_=+yM3Eh~(L*s-2WybsCVT_zpgE=8Q3ry?W zoB}g!fM7~ZZ(wcqi4B6gjs}b8l0FEQH~CkdZ_izLO?P=l%pZ2jueFLXzS0pM;-6@A zt!P-eLj1a}WU%rF@oQZ}?SmC+M2}vsP$w$wUKFD8{)Ha3o~%%Pokx3zE7XnJgB5Bf T9?tDN`O$gjJjM$WwG8eJMm>>8NW3dr9 zvs^$kNkfkf$xBme6Q>w+OOBL`Njz%Xi(j0xBgLzd3t7B4K0aAI$K^~EmWy+t@A9!} z9z?}C9?TUl`PYilkN8m8ac6)SS@hcd7!mad@M{;WzIZd8A(<4Q-;Tjo1xMq`=i8jEb$WmUx#fvVd_H&=m>B zs(n9xgEH@gnC2dUMY7)0znZ(BySJx)rXD@1J*?G(SKEeOSwjN9vteP2ur<)4G-I=& zS1I8-!`RJ=Q)+wQIxlp=tV4Q5p1>>OY`b|bFO?W;P>}(vs&iD;sa}JEE#PPl0(@Q~ zA2idn-goQffv5UM0@J57HS?+-73)G+XCR?C{!XGh5_%>V%3QU%`dq2u4`rGN7}H24 z=}F-PC^x0`|EF5@0RFFH4*#4PW1O6f+Xo96G0ZxEO^4gu6tA91a&_zL3_pFaQq diff --git a/venv/Lib/site-packages/deepgram/clients/prerecorded/v1/client.py b/venv/Lib/site-packages/deepgram/clients/prerecorded/v1/client.py deleted file mode 100644 index 0a8819d3..00000000 --- a/venv/Lib/site-packages/deepgram/clients/prerecorded/v1/client.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from ...listen import PreRecordedClient as PreRecordedClientLatest -from ...listen import AsyncPreRecordedClient as AsyncPreRecordedClientLatest -from ...listen import ( - PrerecordedOptions as PrerecordedOptionsLatest, - UrlSource as UrlSourceLatest, - FileSource as FileSourceLatest, - PreRecordedStreamSource as PreRecordedStreamSourceLatest, - PrerecordedSource as PrerecordedSourceLatest, -) -from ...listen import ( - AsyncPrerecordedResponse as AsyncPrerecordedResponseLatest, - PrerecordedResponse as PrerecordedResponseLatest, - SyncPrerecordedResponse as SyncPrerecordedResponseLatest, -) - - -# input -PrerecordedOptions = PrerecordedOptionsLatest -PreRecordedStreamSource = PreRecordedStreamSourceLatest -UrlSource = UrlSourceLatest -FileSource = FileSourceLatest -PrerecordedSource = PrerecordedSourceLatest - - -# output -AsyncPrerecordedResponse = AsyncPrerecordedResponseLatest -PrerecordedResponse = PrerecordedResponseLatest -SyncPrerecordedResponse = SyncPrerecordedResponseLatest - - -# clients -PreRecordedClient = PreRecordedClientLatest -AsyncPreRecordedClient = AsyncPreRecordedClientLatest diff --git a/venv/Lib/site-packages/deepgram/clients/prerecorded/v1/errors.py b/venv/Lib/site-packages/deepgram/clients/prerecorded/v1/errors.py deleted file mode 100644 index 41a6947c..00000000 --- a/venv/Lib/site-packages/deepgram/clients/prerecorded/v1/errors.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - - -class DeepgramError(Exception): - """ - Exception raised for unknown errors related to the Deepgram API. - - Attributes: - message (str): The error message describing the exception. - """ - - def __init__(self, message: str): - super().__init__(message) - self.name = "DeepgramError" - self.message = message - - def __str__(self): - return f"{self.name}: {self.message}" - - -class DeepgramTypeError(Exception): - """ - Exception raised for unknown errors related to unknown Types for Transcription. - - Attributes: - message (str): The error message describing the exception. - """ - - def __init__(self, message: str): - super().__init__(message) - self.name = "DeepgramTypeError" - self.message = message - - def __str__(self): - return f"{self.name}: {self.message}" diff --git a/venv/Lib/site-packages/deepgram/clients/read_router.py b/venv/Lib/site-packages/deepgram/clients/read_router.py deleted file mode 100644 index 1ca09ee3..00000000 --- a/venv/Lib/site-packages/deepgram/clients/read_router.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from importlib import import_module -import logging - -from ..utils import verboselogs -from ..options import DeepgramClientOptions -from .errors import DeepgramModuleError - - -class ReadRouter: - """ - Represents a client for interacting with the Deepgram API. - - This class provides a client for making requests to the Deepgram API with various configuration options. - - Attributes: - config_options (DeepgramClientOptions): An optional configuration object specifying client options. - - Raises: - DeepgramApiKeyError: If the API key is missing or invalid. - - Methods: - read: (Preferred) Returns an Threaded AnalyzeClient instance for interacting with Deepgram's read transcription services. - asyncread: Returns an (Async) AnalyzeClient instance for interacting with Deepgram's read transcription services. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - - @property - def analyze(self): - """ - Returns an AnalyzeClient instance for interacting with Deepgram's read services. - """ - return self.Version(self._config, "analyze") - - @property - def asyncanalyze(self): - """ - Returns an AsyncAnalyzeClient instance for interacting with Deepgram's read services. - """ - return self.Version(self._config, "asyncanalyze") - - # INTERNAL CLASSES - class Version: - """ - Represents a version of the Deepgram API. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _parent: str - - def __init__(self, config, parent: str): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - self._parent = parent - - # FUTURE VERSIONING: - # When v2 or v1.1beta1 or etc. This allows easy access to the latest version of the API. - # @property - # def latest(self): - # match self._parent: - # case "analyze": - # return AnalyzeClient(self._config) - # case _: - # raise DeepgramModuleError("Invalid parent") - - def v(self, version: str = ""): - """ - Returns a specific version of the Deepgram API. - """ - self._logger.debug("Version.v ENTER") - self._logger.info("version: %s", version) - if len(version) == 0: - self._logger.error("version is empty") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Invalid module version") - - parent = "" - file_name = "" - class_name = "" - match self._parent: - case "analyze": - parent = "analyze" - file_name = "client" - class_name = "AnalyzeClient" - case "asyncanalyze": - parent = "analyze" - file_name = "async_client" - class_name = "AsyncAnalyzeClient" - case _: - self._logger.error("parent unknown: %s", self._parent) - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Invalid parent type") - - # create class path - path = f"deepgram.clients.{parent}.v{version}.{file_name}" - self._logger.info("path: %s", path) - self._logger.info("class_name: %s", class_name) - - # import class - mod = import_module(path) - if mod is None: - self._logger.error("module path is None") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Unable to find package") - - my_class = getattr(mod, class_name) - if my_class is None: - self._logger.error("my_class is None") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Unable to find class") - - # instantiate class - my_class = my_class(self._config) - self._logger.notice("Version.v succeeded") - self._logger.debug("Version.v LEAVE") - return my_class diff --git a/venv/Lib/site-packages/deepgram/clients/selfhosted/__init__.py b/venv/Lib/site-packages/deepgram/clients/selfhosted/__init__.py deleted file mode 100644 index ced8a6f4..00000000 --- a/venv/Lib/site-packages/deepgram/clients/selfhosted/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .client import SelfHostedClient, OnPremClient -from .client import AsyncSelfHostedClient, AsyncOnPremClient diff --git a/venv/Lib/site-packages/deepgram/clients/selfhosted/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/selfhosted/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index a085d984289aed2e414102170812d047d91050cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343 zcmX@j%ge<81f?6@GfWs67#@Q-Fu(+5d{zN6rZc24q%h_%VOE z$r#E6!NSOD{WMu`u_c2IDPjhiUc>?-SV06EkXXs^8Avkxig&h(2`x@7Dvt5?^bCn{ zNiEJU$uEd0%g;RF+H_7CM7ksAiXFtS07?W zv3@bo=^0?B>&M4u=4F<|$LkeT{^GF7%}*)KNwq8D2HFSmXR!c~_`uA_$oQR$fzkLr NgUtm7n<7r2AOJ;UVdVe- diff --git a/venv/Lib/site-packages/deepgram/clients/selfhosted/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/selfhosted/__pycache__/client.cpython-312.pyc deleted file mode 100644 index 2e5f7ba2975daffa94565316d1d1d19ed0ae013c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmX@j%ge<81f?6@GiEU{FgylvU;xMmgU>oZYC1y-LkeRKLoQc_lzGQODxSykv9< zKTVEXoMnc3$zWwg%s~CO#LyM_B$lKWm)zn9s!IeJ5)W0)0#YrF)m*3+9{;?6qSRc7 zBW?+Tl_CqRWcUm;gW*@KvsFxJacWUO%}I)-MLSE(7d3{W3%S`1s7c%#!$c sy@JYL95%W6DWy57c157@0Qshv7f5_yW@Kdi%EiE_dXGWBhyy4B0P<^Bl>h($ diff --git a/venv/Lib/site-packages/deepgram/clients/selfhosted/v1/__pycache__/async_client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/selfhosted/v1/__pycache__/async_client.cpython-312.pyc deleted file mode 100644 index 0688f17ce06a0d784749a542f52946a52d3874f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8803 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 diff --git a/venv/Lib/site-packages/deepgram/clients/selfhosted/v1/async_client.py b/venv/Lib/site-packages/deepgram/clients/selfhosted/v1/async_client.py deleted file mode 100644 index cc9bb175..00000000 --- a/venv/Lib/site-packages/deepgram/clients/selfhosted/v1/async_client.py +++ /dev/null @@ -1,170 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from typing import Optional - -import httpx - -from ....utils import verboselogs -from ....options import DeepgramClientOptions -from ...common import AbstractAsyncRestClient - - -class AsyncSelfHostedClient(AbstractAsyncRestClient): - """ - Client for interacting with Deepgram's on-premises API. - - This class provides methods to manage and interact with on-premises projects and distribution credentials. - - Args: - config (DeepgramClientOptions): all the options for the client. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - self._endpoint = "v1/projects" - super().__init__(config) - - async def list_onprem_credentials( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - List all on-premises distribution credentials for a project. - """ - return self.list_selfhosted_credentials(project_id, timeout=timeout, **kwargs) - - async def list_selfhosted_credentials( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - List all on-premises distribution credentials for a project. - """ - self._logger.debug("SelfHostedClient.list_selfhosted_credentials ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/selfhosted/distribution/credentials" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - res = await self.get(url, timeout=timeout, **kwargs) - self._logger.verbose("result: %s", res) - self._logger.notice("list_selfhosted_credentials succeeded") - self._logger.debug("SelfHostedClient.list_selfhosted_credentials LEAVE") - return res - - async def get_onprem_credentials( - self, - project_id: str, - distribution_credentials_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Get a specific on-premises distribution credential for a project. - """ - return self.get_selfhosted_credentials( - project_id, distribution_credentials_id, timeout=timeout, **kwargs - ) - - async def get_selfhosted_credentials( - self, - project_id: str, - distribution_credentials_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Get a specific on-premises distribution credential for a project. - """ - self._logger.debug("SelfHostedClient.get_selfhosted_credentials ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/selfhosted/distribution/credentials/{distribution_credentials_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info( - "distribution_credentials_id: %s", distribution_credentials_id - ) - res = await self.get(url, timeout=timeout, **kwargs) - self._logger.verbose("result: %s", res) - self._logger.notice("get_selfhosted_credentials succeeded") - self._logger.debug("SelfHostedClient.get_selfhosted_credentials LEAVE") - return res - - async def create_onprem_credentials( - self, - project_id: str, - options, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Create a new on-premises distribution credential for a project. - """ - return self.create_onprem_credentials(project_id, options, timeout, **kwargs) - - async def create_selfhosted_credentials( - self, - project_id: str, - options, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Create a new on-premises distribution credential for a project. - """ - self._logger.debug("SelfHostedClient.create_selfhosted_credentials ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/selfhosted/distribution/credentials/" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("options: %s", options) - res = await self.post(url, json=options, timeout=timeout, **kwargs) - self._logger.verbose("result: %s", res) - self._logger.notice("create_selfhosted_credentials succeeded") - self._logger.debug("SelfHostedClient.create_selfhosted_credentials LEAVE") - return res - - async def delete_onprem_credentials( - self, - project_id: str, - distribution_credentials_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Delete an on-premises distribution credential for a project. - """ - return self.delete_selfhosted_credentials( - project_id, distribution_credentials_id, timeout=timeout, **kwargs - ) - - async def delete_selfhosted_credentials( - self, - project_id: str, - distribution_credentials_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Delete an on-premises distribution credential for a project. - """ - self._logger.debug("SelfHostedClient.delete_selfhosted_credentials ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/selfhosted/distribution/credentials/{distribution_credentials_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("distrbution_credentials_id: %s", distribution_credentials_id) - res = await self.delete(url, timeout=timeout, **kwargs) - self._logger.verbose("result: %s", res) - self._logger.notice("delete_selfhosted_credentials succeeded") - self._logger.debug("SelfHostedClient.delete_selfhosted_credentials LEAVE") - return res diff --git a/venv/Lib/site-packages/deepgram/clients/selfhosted/v1/client.py b/venv/Lib/site-packages/deepgram/clients/selfhosted/v1/client.py deleted file mode 100644 index 86d63ff2..00000000 --- a/venv/Lib/site-packages/deepgram/clients/selfhosted/v1/client.py +++ /dev/null @@ -1,172 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from typing import Optional - -import httpx - -from ....utils import verboselogs -from ....options import DeepgramClientOptions -from ...common import AbstractSyncRestClient - - -class SelfHostedClient(AbstractSyncRestClient): - """ - Client for interacting with Deepgram's on-premises API. - - This class provides methods to manage and interact with on-premises projects and distribution credentials. - - Args: - config (DeepgramClientOptions): all the options for the client. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - self._endpoint = "v1/projects" - super().__init__(config) - - def list_onprem_credentials( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - List all on-premises distribution credentials for a project. - """ - return self.list_selfhosted_credentials(project_id, timeout=timeout, **kwargs) - - def list_selfhosted_credentials( - self, - project_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - List all on-premises distribution credentials for a project. - """ - self._logger.debug("SelfHostedClient.list_selfhosted_credentials ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/selfhosted/distribution/credentials" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - res = self.get(url, timeout=timeout, **kwargs) - self._logger.verbose("result: %s", res) - self._logger.notice("list_selfhosted_credentials succeeded") - self._logger.debug("SelfHostedClient.list_selfhosted_credentials LEAVE") - return res - - def get_onprem_credentials( - self, - project_id: str, - distribution_credentials_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Get a specific on-premises distribution credential for a project. - """ - return self.get_selfhosted_credentials( - project_id, distribution_credentials_id, timeout=timeout, **kwargs - ) - - def get_selfhosted_credentials( - self, - project_id: str, - distribution_credentials_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Get a specific on-premises distribution credential for a project. - """ - self._logger.debug("SelfHostedClient.get_selfhosted_credentials ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/selfhosted/distribution/credentials/{distribution_credentials_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info( - "distribution_credentials_id: %s", distribution_credentials_id - ) - res = self.get(url, timeout=timeout, **kwargs) - self._logger.verbose("result: %s", res) - self._logger.notice("get_selfhosted_credentials succeeded") - self._logger.debug("SelfHostedClient.get_selfhosted_credentials LEAVE") - return res - - def create_onprem_credentials( - self, - project_id: str, - options, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Create a new on-premises distribution credential for a project. - """ - return self.create_selfhosted_credentials( - project_id, options, timeout=timeout, **kwargs - ) - - def create_selfhosted_credentials( - self, - project_id: str, - options, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Create a new on-premises distribution credential for a project. - """ - self._logger.debug("SelfHostedClient.create_selfhosted_credentials ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/selfhosted/distribution/credentials/" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("options: %s", options) - res = self.post(url, json=options, timeout=timeout, **kwargs) - self._logger.verbose("result: %s", res) - self._logger.notice("create_selfhosted_credentials succeeded") - self._logger.debug("SelfHostedClient.create_selfhosted_credentials LEAVE") - return res - - def delete_onprem_credentials( - self, - project_id: str, - distribution_credentials_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Delete an on-premises distribution credential for a project. - """ - return self.delete_selfhosted_credentials( - project_id, distribution_credentials_id, timeout=timeout, **kwargs - ) - - def delete_selfhosted_credentials( - self, - project_id: str, - distribution_credentials_id: str, - timeout: Optional[httpx.Timeout] = None, - **kwargs, - ): - """ - Delete an on-premises distribution credential for a project. - """ - self._logger.debug("SelfHostedClient.delete_selfhosted_credentials ENTER") - url = f"{self._config.url}/{self._endpoint}/{project_id}/selfhosted/distribution/credentials/{distribution_credentials_id}" - self._logger.info("url: %s", url) - self._logger.info("project_id: %s", project_id) - self._logger.info("distrbution_credentials_id: %s", distribution_credentials_id) - res = self.delete(url, timeout=timeout, **kwargs) - self._logger.verbose("result: %s", res) - self._logger.notice("delete_selfhosted_credentials succeeded") - self._logger.debug("SelfHostedClient.delete_selfhosted_credentials LEAVE") - return res diff --git a/venv/Lib/site-packages/deepgram/clients/speak/__init__.py b/venv/Lib/site-packages/deepgram/clients/speak/__init__.py deleted file mode 100644 index 874a1739..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .enums import SpeakWebSocketEvents, SpeakWebSocketMessage - -# rest -from .client import ( - SpeakClient, # backward compat - SpeakRESTClient, - AsyncSpeakRESTClient, -) -from .client import ( - #### top level - SpeakRESTOptions, - SpeakOptions, - # common - TextSource, - BufferSource, - StreamSource, - FileSource, - # unique - SpeakSource, - SpeakRestSource, - SpeakRESTSource, -) -from .client import ( - SpeakResponse, # backward compat - SpeakRESTResponse, -) - -# websocket -from .client import ( - SpeakWSOptions, -) -from .client import ( - SpeakWebSocketClient, - AsyncSpeakWebSocketClient, - SpeakWSClient, - AsyncSpeakWSClient, -) -from .client import ( - #### top level - SpeakWSMetadataResponse, - FlushedResponse, - ClearedResponse, - WarningResponse, - #### shared - OpenResponse, - CloseResponse, - UnhandledResponse, - ErrorResponse, -) diff --git a/venv/Lib/site-packages/deepgram/clients/speak/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4e6eb9814dc89e47acf3eb7c9f4e51731daaae8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1101 zcmZ9L%}(1u6oto5;v|lpKN3P9z@qBHio|ep#ix6YuV&7SufLn7PUJKD_U`I9Psk4x%SX+M+pn_t zOkCnBK4A(dOa)azt@=5Zhde7lfoY(nUQT*ND6$fiSQ*Mp2c1=*!VEB&2_~yTmDQk@ z_U2`89qOzBjZ_z;ZbCDyHCeC08f!s|wV}<{VLkPW((gcrZNLWWLYHmACfkB7)`K3~ zhHbV3I|{ieS>>OKjBTk&YYMQFcioGxpiIF->rJvDH@gSV>F-?p&v&&1$mue7m>aa}d zhn`QfdXXd(SrRIitK3IhbjXvMix5;qG5}2)t4ybvWhqHDHHU*Nn3aEgKiNUM_Xk~F zUG{3R&2W&(=7Y}6vr0)P+vk|Zj_btEGD1>2^k?FVy7xxkrw)H;3>_YL!DQ88oJ2HO zDYNf~g05uaJh*ZK*MG2pdBAzdmmMFi-K0Q+852AwCxXi{Cy6#rKQJ$#qalij5~7U2 z--1^V2Es&C5j8{|(Lgj2Yls%2jaWx?5F3atViU22=pnWdJBVG0FXUE|+(G|^eJ&^$ z_WPrwGy5$S(>RRm>(Cq1{fQh%TMqBF{lUAig%{Ijku#pksTHK}nxMHv79 diff --git a/venv/Lib/site-packages/deepgram/clients/speak/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/__pycache__/client.cpython-312.pyc deleted file mode 100644 index d8c5c031cd77f4aa78d4c5f0cc6a60f775461a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1828 zcmZXUOK;mo5XYB#Sug5ANtPwQ?Zh_YSDdye+7ty+CnbldoVvRlJwrf?o&WE@vn$SU|I+m&6Ho8YpD&)K82eWS zqbEd@+la>4@2tt1TAOhVLOcu+9)%cRfH+S;lBXceb;$56-8 zA}+&{nn%RE0#&{YD|{8!_&RJTJu37~*i!SDm~X>9ejj%DF6?m=9`JoQ;D>O;kKrLd zfkzs{5NH^IFvcK?aah14Brpvr%z%zL$f5yxT!J!g!6x2=ZQOzTxCguV08Bi9eLR9g zdB>cl!XMbN8m6+ z{zN)$x6tL4P9Bui84 zXK_Jd>fhRI35yaL(=A6SOA@ToX7k-go<->?%{3yivSM>RNo+~7!c2P-sYp`(qEm@h zRnEDlCAO?`&h&3U{NOtrmBbIOji7peuv@W=eSUZPef^D#j$8lb#f!80Q**V|7I2EJMrKC2csES A9smFU diff --git a/venv/Lib/site-packages/deepgram/clients/speak/__pycache__/enums.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/__pycache__/enums.cpython-312.pyc deleted file mode 100644 index 79d8285be42563ad9d59782159e05226690d23d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1309 zcmb_c&rcIU6rOE&yW53=AiqVj(Nhmfj0Y1#Ob8&Nf+m%aY&O|Ucb@I0?QWgfHYukb zH1_BX{srU7zr$lWkiB~Hh5;^|oHvC4iJF-BlKtj=^WMyxo%ij2D->)Zt@U-i`Y}t$ zcO(~PoIA%$(%B=7Fs)7+nyYCfL)Hn)yeBLR+84PF&CRG;UCtU;X0x4K(fol4MJ+W; z315p^jR5(Dov$ay&*jV>0pe;*?zS!KxmlKRbub{uGI$D>bxp;xis`PUn68-N<`pxL zVbyf9)C5}FfpRGhYLIM#5VQijuI)&}a{#9a2q&q6(~N}(%XM%XgDfZMG*yTuPCz54 z3=W3?!ZtAHEsq;&(JDZ*!fC@H91We4pp!d!$*B@O0GoX%xi?O~N=5GGxjSw-E9YK9ggK z?~oJdp5#{LEww>&PPGv)#4c!@fRqI5zVq??9j7V;6h; zzWJYI_1yA*Y04x8+xk8WhFJ@!v5}r#jR1bDmjCgHP-UUyym4e8e3IM_EnNPHm#io!FK(yT5)y Sy%Q6YGyKi*!dc|v|mu{>%PTz|vh zD{+ad_=G7`VJcNwj^DE zxZoSCMr&zY#JEoDtU(*BNt>)iTd7|{e}lH!Cf#IPbc=Ophi%hs)}>vxLwDFN-Brky zW|sdbIIdYv8de0(%Q+n5GU<@aTSbKV=i1%Nt!F`1Vn_B z1DdteJh!s(&3w{cI54!r(FEeGXm?%o{N9z3mB=z%cQUQ4xt26OK@0gH^+SIu zF2P+JeIFct*En~0;05DVhJGADuu?|f4+X4b^DMY@0@uG&z&PMMvJM|G9l8fD8NG(b1{>2E-%|BYPHlBiJ9~zqV%(%2A8l{;v^N-dffo-3Pok?^?F9?nsShvtL+mEsw|Is4 un^P2Jt{aLvCx{z~`Cbm85#`x0^5~|hq9_&=^_n2&dKEzs|0MVWtnnWhGAp0} diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__init__.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__init__.py deleted file mode 100644 index 084cef64..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .client import SpeakRESTClient -from .async_client import AsyncSpeakRESTClient -from .response import SpeakRESTResponse -from .options import ( - #### top level - SpeakRESTOptions, - SpeakOptions, - # common - TextSource, - BufferSource, - StreamSource, - FileSource, - # unique - SpeakSource, - SpeakRestSource, - SpeakRESTSource, -) diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4fe7bcbe1d987ae0fd5d9e7491c01cba9b2c4cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601 zcmZXR%}T>S6oqG!{-kNrRw!=W2-1ZHw<3c76h*2vr7 zfv#M+6N(mGIg=*3@Gic&=P=wkGxKViIubQ`Ie*wv5PFlMETQvS*kXA?Lo~!8qL^ST zdnHt;O4Php!wRjEYTj4E8m*H$)rdwLq(OC}(YI6 z&f0?nyz$NHz&;KGh*Dv75BV(e|NCpd)(!9^jyUuhS?AZhPSQY_nUOoC(rtK52l0gY zkQqml`+H!e8l((7S}6T22%+ek`Gi6g0fCoO{t~ZtT=hCx&CkO#Ra`1FJel7utctWW zRwQOsDeLhnE2{~`>JpknLqdKFYf2arrbJ8N87&0S_ucWHbIXBo=c3=YofF{WG)|mp z9QbfJ5>Mz%A(}du!JWf{6t)x3AA2L<&JZ9OF^^iSWZdHN>8jqJfy6#Rg t`_}epJe-7Zz}Cf)@~ilUz=w)4{?rlPoTHsN+FB|mR+dQMOM-R9o*!KsuQ~t# diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/async_client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/async_client.cpython-312.pyc deleted file mode 100644 index 1aa4fa35d70d6316633f0902c746553e531c4565..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13221 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 diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/client.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/client.cpython-312.pyc deleted file mode 100644 index f5d68a9b5352257ea5320e80fb840ff1cd889bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12581 zcmeHNTWlNId7j~QI2_(|qwX5XmlbPEvg_;0j$_4^*WPt(N0JSM>y}G#MiOOSlruxg zQfXkZ*dQ{xt?dGVwTOciiaa>b7D$0Uv_XLaEl?EbiwLO|JCzXw+o1KE9PMILp%4B4 zGZ%_9Wy^~O=!1`-!*l)5e=h&!J7@mc=i?a&xxaj8;#q`YzQBwboJL~vmymeKNQ}g$ zm?-|*Qf%55wWaM*d)g6oq@7VGtJk}tF51o=b<nJW>8<~W~BsG9S7CYjA>+|?-+e&Z?4k%%km zGn{UO)x5FTv`iGJiN!DrnbE8wr?TS;Wb4n%^3*tqr_ZI5az@ojD9;>v--dxvMJ4fs zIy{?649SYBw~E*_pV@DakSx(cW_DzDN~T56Se=AFsl-(Iwi;8iIg*f}YjAikZJrrpCFjRNl=Cp=pA?o{vPW{uyzG?)**9iug7)|? zaZo1El*dZ(kn&HqLv=-}Tq7t%We#!T-Gg@Pg>tTKeBiF(xei)_B#>n-P z2Vdku3P?dYEQLO=S;9?+@H^+H_G9OgJ`@veG)I#fr8-!vSFikT)*EMC53_DEsnfOH z9sSqa+1jz7)Bqzj&oj5#Xv;7YY0?7L0oKK3F2;)x2E+uFG5Coqia3@fqLfW$#>Ej3 zj~+GK1Ks4rL@#Z8jbx{jlB|enS)IsAdUFK@2YZZ>Y+6LA(i>~;7>M(@OdyfSX2z1^ znoIvpfQ(oH_ZRiZCMY51$LvE!MH!`Ga(g?YOf}8}!z>x?@=VOoLkyE=CS69uZ9kKq zZ5fk}*DRY9%v9;uJPGC)>`s&er9NgV&rSx-bm?~+B^EfgI8y7(Hg|1#=1+QH4s5CI zEa=KB5rJTH&38jrl9%;Wmv~7s(Xo&RS_h2o-=1gRZ2xYW+$ul<6!5E z6=9iItk{9q;KyUm0=ThFqHjSsgQYOa_D zWb@n@o44idc}L!pcS^oT&b<3)?4PoC_}AdjueO<#^SrrsrLlLQ)M551{Yn9|_m1b_ z71EUF!K?@41!%^jA;&<~rEZ7g)Dnxj`Vzq|h>DsevKUvyxOhpGNgT58kIt&{AN2AT zfdMkE^jkS3X%Of}cffFl`^Aw7xs1G;6{#NA4L^3nV5m&7+tT8OYaQtq2P7$};{vN0 zx*jSJ2D=5OKO%v4k(+&wg028XuTzOAO~8NI8%&W41lfN`t#yF55>V{og^kjCD`gq*k~j>Q4o zN?T1A;%Yo)Y?vvpl$$Mgj->j=vT*i4y!H3TS3CMvy@&of{C91C)AqL=6+Mov3dbvobRr$g;;EII z)62r?r=};~RN$HxB8$VTT*Pw0Y1zTYu2rsYy)>9bv8^DqEw^7>6)qJU+8$;fWLFyA znt!LfchBSSDtEZNOs800rnh?w`g(dGQchn-^Qs7#aTYFZyUaP3IJH4QU04q44j80&55~H^<>W3)e-Vy*f zsQ{pQC`tj(omCEyw%>~6BBXLlgQ>W>Q)F|`!dRyOnT%@A}is= zwnK`ma>P~XkDtOZQOGs#7yz7@?tv40S|i`Z=n6(xF}jA)_b?j5Xc!{6?WIsF;?Yco zW5}>(G8{`vn$B7MQu{mNLatR{MtKWFXrsFAvyo)6coR)$t zndh1QQt(4=Lh)SN4yZ@xcnX>*w?L%=@HuXI;U(Al4e)sl;PV>?7v|@^8#PQ#*Zn#j zEK&^Qc>x0z8}~d9K=DQpVNeKC0D~H=4cLy^0^)j8>%xu2D}}ZrD@{k&!_5oF7Y`O% z`c}e+UYdDyWMO(SRp>af(sFbqd~ChFb8-K2D=SvzvwO;IJMGz`pa5A$j>{raoJknT9?~; zf8ki=j#;qm6-cdi-b<0%obyQU(cVLIPKe;=TJ=+kw~~?!*Fp)d` z_aS_fQQh6iv(}ZjGw+gE^U53C72Dj9Whc%LUK<)bH!w1Iz8@}$@vf;mQf+=^dJCHv zGqMQ%yz)AybUzYdsnAEb-6|J_gQ=OSL)RLpJ?9##@5etuor1;&)Wv=#*fp=N1v(3X z&Z1BQNI$p@=>yoWZv&(sw2(fe7|z4f-Pbs@8>rCB795%RWBA`hOY$Bdl9w%d-ZrMc zGw6%%&=JKj^B49R78d@DwO%iG664cw$(|MCB63u^8;m%%89g+0^!^DxnsF%5!(8Ab zR#eb=>!vqhl}*Vu{c>0;_z zjr)}9OZ?x814w+-+{z|!Ma^IxXFursZ+ag>g#gJ{1lSFhzWTs!E)fIeOdveFo%(ix+o~t13js60|q4>J6+iZHcAb{y)Gf!{ z%tIzXq^`{Qb(3p8fmUfvA9v;&3@_d=-&TA3%;*7lzQFH;bSQz2H$@>jiqIcHvQu(K zbIuU>P)GBO%j#%u46v5w982Yt34)fyd;+OvRq%zPWap`A(d^*-lN3}`efuD{pyow0 zgXZghu+LWzfsHw7Ii0%Ke*~`GpZdjlY0WPd{Gx8z163@0z_RQCe%=mu_(I@b|K0v& zFWmc=y@K?u3Wq9+POJ(i*K6Pb#>soA# zq_-6O67BE({pU{E|KXJLyu%%FUV*U1nUA&+2V{u?ts76SmC1E?F*gjnnc zxp+$dC=5Qji%Ho8d>w{%i{J+lS|ApSXW&tbzPc(%>q;^^9NIGvr# z9Y?=n;CG{uIenHbcJ3>7?JpkaD>imL51eP64Nrs38%|7svr^N%uy4_^y#M&Jc)ZYj zq7XW{;igp_6KYzhd*I*j&@7KF_daOf@Y1Y6JAT&lX-^^4z2T!}ex|lzgAM=~ix1pu zzuUf9OKXN~FEVn2b=FZvFtGz8w5r4i&6XIU*$PHzna&7J0wXP(wKO?pV_dBtzQ5*d zDL7l;HLY0N3^=bC9R1Scbh&`#7uKrY$x{yDcLxTsroO&q>7sC7(2C!Do( zT=+G{#Z>iiv8FUG=IFS1SbUiCmz|XW76tLB;2@xw_?EBhAw`h~J?N2Uf*%-ZF1U7r zYc5?5sYFuQ#A_Q8!{|0fe}qjLDqET}rvggUg}oaqQMU1e+jJTp)KRhM_e1ni96nx5 z!3Up;exXEfkWc|=9A4Vsx9z$}qv-vd(Yf0P=`HTGu58YbA3_!-RXGdMhMi^EO`c%` zzhZh3ZM6)-E?3{EEQ@ H9pQfggn$e# diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/helpers.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index fc81afc31f78bd0ca49d7c8c06478556a1e4238f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 715 zcma)4J!>055Z#s5vLg8djDNre6dMuZOBxeGFa#TnaY&=2F$dy&JC+umw8!r1h(jPQ z`~%#jO=)*Ym;aDP^|h(e9VlsBWkx3vr}Mz>?7o|s_h$Bftgbc~+W6aHf49QePr58j z%n#G2c=*f|Q#@fqe!@9Z72v80l{2Blr8ueHxi8^eoY&gRzc{9~dEV@#5DhwJY-7mR zQ)@Dk4~v@MkG>oi4Bgj*DY;@z@a^lz1Z{tB{U$df{|mgjxMKhS diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/options.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/options.cpython-312.pyc deleted file mode 100644 index 6c58366f1699458c18bab9411769af7c31f29233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2901 zcmcH*OKcNY@a@`bum5&p(j+Cs2~g^&i3LJxga8RrK4~JToKU1ys@044+1X@2?tANq zL_u;TDkUe<6C617R0)Lxy;bUkdoQ&}m2|6$N>x>H3rc$7)OqVqi34pfJZWcV=FPmB zoj0HTAr=cGSe0+D%zY9>=yy&uSD=CHegnuoq#;c(kSQpFz;V$KO`qa3{fghCeTJk+ z!1o&gGpGbjS&==yWQ5GH5&=A*1&yc~Q(}P2TF8i-2_<1Bm86+cQf7zJVRkB=0wO^X zT|rv-4$>l|bHi8nVx!@Vk|t^85b==?A{50Q;3{3DOL+&L?j>I~`kc#U1vh@NQY;cm zv^>EYp;^(DZdkf)x$^b018;0x171kO4lWp&F;^<;#Lz%9P_V6{UV1Lo4~i@jI%_jx z*d_Md&v}v?o+h`PDZ4@o#EsSsHK{3w5^Of8@MYZ~&7F&wkvw5#+hU}^y=<;loDT~; z&IBofh7|Dz#9Q%+i1;-TprrZkphx}Zr?CR7Pd zbYt}y)Z|MBZ)mQ}h%@P7(xrU&vZh-57zQ0V#BIEZ5&U;1ZN(KH6%UuVW zgvTEOQFaqR746BWqi-uUR7(v#8hx5Ny&Bk-<6Cl1P40PcVyib->&-pwJ-I2L+D;t0 zyRx>j>WBTiiM7Oo$X0i@)}7syhjwHXN^stN|EApcTcXn|t!$EVJ8oE2p|4aR*;O~H zs-IV|(TG7%RW-Yys+6aWn`}*VwLZrwZxxgebJxcl>LyebTbAu${ujVN%`4@jTX3mNqv+fJry{khuc#Ag5Go=@x#RIjeit+O?A7l|MeK$+uhBAGyS zeD&6S-`ee_$l!@Kk-zbx(XCQO}Ywnb&WH_BC{ilZB>p2F}~Wty-dl9ky<=gjcj-HRTBWdNO%$b8=0cF*Z=?k diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/response.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/__pycache__/response.cpython-312.pyc deleted file mode 100644 index 103cac970b269f8712e705d546a40fa43287e90f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1836 zcmbVN%}*Og6rcU@di@195C}xAO-W0vG|);_ORFdnlqP{tA_2LqEUlK^F>KfmXJ(D+ zs0UX~C3fhg3A50MPD}s}yb(!`$Fx$i-j^q(vG9+I%WM4593HM}AHB|U2Uc%Q5%}*N1 zcwhB&KV_tWPdJ*F@v}x&B2<&f4dNsp5J#ukU8NIYw;RaFHRN*Y8KSZx^xL(_4Fk&) z>a1%=LYWR4i)C4)94oSH&*EGpsxI}MvLrM+465$hGZjrGk)5$PU81}e2AtYm@A2m} zrzr_@qQsCKV#s$OH$!n`L!}9-Im%T~29%7E+C_Sd5?z#vkrtz*k)|22)4Q^4EK7A! zE=FlYGNCwboyO%m1{!Y7o z3TOQEy~NMC|M1g~ej1tbfG8~2sI{^5$@0ocneSgumtako;;SiDLsnw6#we#jvv6rD&a&I65iOz^R395KY7m1QA)d%?QlQs8ORL&FH;4<&o(+BJGC`^~`$x zFFvq*%CLAMZLeF*vLnj4C`8N(c$G4f26pJc0fY*DLl^CC#p5cW8TMcshhUq04*gsw z%g{lKJ7h-^QkA22>G|r%A64#f@LRbxH@8xmrF)QR1f7Ev3 zL^cY?;dt04*&E%9_R3At282DIq@USd-JvicNrzUgx)%xEr;&x@BJ`^3Q7qL9`J-u^ zKhDiIX-GTr;tCrCz=nWyvS-*tYy`-wPBsqmHrDeC!Y;r^Xgp%n@?RZ~VM6~e;M-{V z29h{jt`pAmsUNaNc~I!4iTRqQNSh|KP2EF2Ynu1!me-XeP16Z&(_}q(Vg+1?UemOK zAdD=0dpL-CF+?6o0ZCu13Ej&25e^_p;$HsrSu#715i6n$%ge@4L3TrtoM}Xq&)sHk z;&xnUJbkCcS>%wQXZ{0_ugH-qC-g&|3}0w2w8kE*BL{=$oAWK@v3maBxuK49=-{>D zPwKfAf2t<_d+xW)V&z9OmiPbK@^P<{it@&wd>fy|H^WV`}VM%+K QZ4>yk71%h!jX0A(0q2*;&j0`b diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/async_client.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/async_client.py deleted file mode 100644 index fc83926b..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/async_client.py +++ /dev/null @@ -1,309 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from typing import Dict, Union, Optional, cast -import io -import aiofiles - -import httpx - -import deprecation # type: ignore -from ..... import __version__ - -from .....utils import verboselogs -from .....options import DeepgramClientOptions -from ....common import AbstractAsyncRestClient -from ....common import DeepgramError, DeepgramTypeError - -from .helpers import is_text_source -from .options import SpeakRESTOptions, FileSource -from .response import SpeakRESTResponse - - -class AsyncSpeakRESTClient(AbstractAsyncRestClient): - """ - A client class for doing Text-to-Speech. - Provides methods for speaking from text. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - super().__init__(config) - - # pylint: disable=too-many-positional-arguments - - async def stream_raw( - self, - source: FileSource, - options: Optional[Union[Dict, SpeakRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/speak", - **kwargs, - ) -> httpx.Response: - """ - Speak from a text source and store as a Iterator[byte]. - - Args: - source (TextSource): The text source to speak. - options (SpeakRESTOptions): Additional options for the ingest (default is None). - addons (Dict): Additional options for the request (default is None). - headers (Dict): Additional headers for the request (default is None). - timeout (httpx.Timeout): The timeout for the request (default is None). - endpoint (str): The endpoint to use for the request (default is "v1/speak"). - - Returns: - httpx.Response: The direct httpx.Response object from the speak request. - For more information, see https://www.python-httpx.org/api/#response - - IMPORTANT: The response object's `close()` method should be called when done - in order to prevent connection leaks. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AsyncSpeakClient.stream ENTER") - - url = f"{self._config.url}/{endpoint}" - if is_text_source(source): - body = source - else: - self._logger.error("Unknown speak source type") - self._logger.debug("AsyncSpeakClient.stream LEAVE") - raise DeepgramTypeError("Unknown speak source type") - - if isinstance(options, SpeakRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AsyncSpeakClient.stream LEAVE") - raise DeepgramError("Fatal speak options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, SpeakRESTOptions): - self._logger.info("SpeakRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - - result = await self.post_raw( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - - self._logger.info("result: %s", str(result)) - self._logger.notice("speak succeeded") - self._logger.debug("AsyncSpeakClient.stream LEAVE") - return result - - async def stream_memory( - self, - source: FileSource, - options: Optional[Union[Dict, SpeakRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/speak", - **kwargs, - ) -> SpeakRESTResponse: - """ - Speak from a text source and store in memory. - - Args: - source (TextSource): The text source to speak. - options (SpeakRESTOptions): Additional options for the ingest (default is None). - addons (Dict): Additional options for the request (default is None). - headers (Dict): Additional headers for the request (default is None). - timeout (httpx.Timeout): The timeout for the request (default is None). - endpoint (str): The endpoint to use for the request (default is "v1/speak"). - - Returns: - SpeakRESTResponse: The response from the speak request. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AsyncSpeakClient.stream ENTER") - - url = f"{self._config.url}/{endpoint}" - if is_text_source(source): - body = source - else: - self._logger.error("Unknown speak source type") - self._logger.debug("AsyncSpeakClient.stream LEAVE") - raise DeepgramTypeError("Unknown speak source type") - - if isinstance(options, SpeakRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AsyncSpeakClient.stream LEAVE") - raise DeepgramError("Fatal speak options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, SpeakRESTOptions): - self._logger.info("SpeakRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - - return_vals = [ - "content-type", - "request-id", - "model-uuid", - "model-name", - "char-count", - "transfer-encoding", - "date", - ] - result = await self.post_memory( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - file_result=return_vals, - **kwargs, - ) - self._logger.info("result: %s", result) - resp = SpeakRESTResponse( - content_type=str(result["content-type"]), - request_id=str(result["request-id"]), - model_uuid=str(result["model-uuid"]), - model_name=str(result["model-name"]), - characters=int(str(result["char-count"])), - transfer_encoding=str(result["transfer-encoding"]), - date=str(result["date"]), - stream=cast(io.BytesIO, result["stream"]), - stream_memory=cast(io.BytesIO, result["stream"]), - ) - self._logger.verbose("resp Object: %s", str(resp)) - self._logger.notice("speak succeeded") - self._logger.debug("AsyncSpeakClient.stream LEAVE") - return resp - - @deprecation.deprecated( - deprecated_in="3.4.0", - removed_in="4.0.0", - current_version=__version__, - details="SpeakRESTClient.stream is deprecated. Use SpeakRESTClient.stream_memory instead.", - ) - async def stream( - self, - source: FileSource, - options: Optional[Union[Dict, SpeakRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/speak", - **kwargs, - ) -> SpeakRESTResponse: - """ - DEPRECATED: stream() is deprecated. Use stream_memory() instead. - """ - return await self.stream_memory( - source, - options=options, - addons=addons, - headers=headers, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - async def file( - self, - filename: str, - source: FileSource, - options: Optional[Union[Dict, SpeakRESTOptions]] = None, - addons: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/speak", - **kwargs, - ) -> SpeakRESTResponse: - """ - Speak from a text source and save to a file. - """ - return await self.save( - filename, - source, - options=options, - addons=addons, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - async def save( - self, - filename: str, - source: FileSource, - options: Optional[Union[Dict, SpeakRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/speak", - **kwargs, - ) -> SpeakRESTResponse: - """ - Speak from a text source and save to a file. - - Args: - source (TextSource): The text source to speak. - options (SpeakRESTOptions): Additional options for the ingest (default is None). - addons (Dict): Additional options for the request (default is None). - headers (Dict): Additional headers for the request (default is None). - timeout (httpx.Timeout): The timeout for the request (default is None). - endpoint (str): The endpoint to use for the request (default is "v1/speak"). - - Returns: - SpeakRESTResponse: The response from the speak request. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("AsyncSpeakClient.save ENTER") - - res = await self.stream_memory( - source, - options=options, - addons=addons, - headers=headers, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - if res.stream is None: - self._logger.error("stream is None") - self._logger.debug("AsyncSpeakClient.save LEAVE") - raise DeepgramError("BytesIO stream is None") - - # save to file - async with aiofiles.open(filename, "wb") as out: - await out.write(res.stream.getbuffer()) - await out.flush() - - # add filename to response - res.stream = None - res.filename = filename - - self._logger.debug("AsyncSpeakClient.save LEAVE") - return res - - # pylint: enable=too-many-positional-arguments diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/client.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/client.py deleted file mode 100644 index e17877e4..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/client.py +++ /dev/null @@ -1,309 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from typing import Dict, Union, Optional, cast -import io - -import httpx - -import deprecation # type: ignore -from ..... import __version__ - -from .....utils import verboselogs -from .....options import DeepgramClientOptions -from ....common import AbstractSyncRestClient -from ....common import DeepgramError, DeepgramTypeError -from .helpers import is_text_source - -from .options import SpeakRESTOptions, FileSource -from .response import SpeakRESTResponse - - -class SpeakRESTClient(AbstractSyncRestClient): - """ - A client class for doing Text-to-Speech. - Provides methods for speaking from text. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - super().__init__(config) - - # pylint: disable=too-many-positional-arguments - - def stream_raw( - self, - source: FileSource, - options: Optional[Union[Dict, SpeakRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/speak", - **kwargs, - ) -> httpx.Response: - """ - Speak from a text source and store as a Iterator[byte]. - - Args: - source (TextSource): The text source to speak. - options (SpeakRESTOptions): Additional options for the ingest (default is None). - addons (Dict): Additional options for the request (default is None). - headers (Dict): Additional headers for the request (default is None). - timeout (httpx.Timeout): The timeout for the request (default is None). - endpoint (str): The endpoint to use for the request (default is "v1/speak"). - - Returns: - httpx.Response: The direct httpx.Response object from the speak request. - For more information, see https://www.python-httpx.org/api/#response - - IMPORTANT: The response object's `close()` method should be called when done - in order to prevent connection leaks. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("SpeakClient.stream ENTER") - - url = f"{self._config.url}/{endpoint}" - if is_text_source(source): - body = source - else: - self._logger.error("Unknown speak source type") - self._logger.debug("SpeakClient.stream LEAVE") - raise DeepgramTypeError("Unknown speak source type") - - if isinstance(options, SpeakRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("SpeakClient.stream LEAVE") - raise DeepgramError("Fatal speak options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, SpeakRESTOptions): - self._logger.info("SpeakRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - - result = self.post_raw( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - **kwargs, - ) - - self._logger.info("result: %s", str(result)) - self._logger.notice("speak succeeded") - self._logger.debug("SpeakClient.stream LEAVE") - return result - - def stream_memory( - self, - source: FileSource, - options: Optional[Union[Dict, SpeakRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/speak", - **kwargs, - ) -> SpeakRESTResponse: - """ - Speak from a text source and store in memory. - - Args: - source (TextSource): The text source to speak. - options (SpeakRESTOptions): Additional options for the ingest (default is None). - addons (Dict): Additional options for the request (default is None). - headers (Dict): Additional headers for the request (default is None). - timeout (httpx.Timeout): The timeout for the request (default is None). - endpoint (str): The endpoint to use for the request (default is "v1/speak"). - - Returns: - SpeakRESTResponse: The response from the speak request. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("SpeakClient.stream ENTER") - - url = f"{self._config.url}/{endpoint}" - if is_text_source(source): - body = source - else: - self._logger.error("Unknown speak source type") - self._logger.debug("SpeakClient.stream LEAVE") - raise DeepgramTypeError("Unknown speak source type") - - if isinstance(options, SpeakRESTOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("SpeakClient.stream LEAVE") - raise DeepgramError("Fatal speak options error") - - self._logger.info("url: %s", url) - self._logger.info("source: %s", source) - if isinstance(options, SpeakRESTOptions): - self._logger.info("SpeakRESTOptions switching class -> dict") - options = options.to_dict() - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - - return_vals = [ - "content-type", - "request-id", - "model-uuid", - "model-name", - "char-count", - "transfer-encoding", - "date", - ] - result = self.post_memory( - url, - options=options, - addons=addons, - headers=headers, - json=body, - timeout=timeout, - file_result=return_vals, - **kwargs, - ) - - self._logger.info("result: %s", result) - resp = SpeakRESTResponse( - content_type=str(result["content-type"]), - request_id=str(result["request-id"]), - model_uuid=str(result["model-uuid"]), - model_name=str(result["model-name"]), - characters=int(str(result["char-count"])), - transfer_encoding=str(result["transfer-encoding"]), - date=str(result["date"]), - stream=cast(io.BytesIO, result["stream"]), - stream_memory=cast(io.BytesIO, result["stream"]), - ) - self._logger.verbose("resp Object: %s", resp) - self._logger.notice("speak succeeded") - self._logger.debug("SpeakClient.stream LEAVE") - return resp - - @deprecation.deprecated( - deprecated_in="3.4.0", - removed_in="4.0.0", - current_version=__version__, - details="SpeakRESTClient.stream is deprecated. Use SpeakRESTClient.stream_memory instead.", - ) - def stream( - self, - source: FileSource, - options: Optional[Union[Dict, SpeakRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/speak", - **kwargs, - ) -> SpeakRESTResponse: - """ - DEPRECATED: stream() is deprecated. Use stream_memory() instead. - """ - return self.stream_memory( - source, - options=options, - addons=addons, - headers=headers, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - async def file( - self, - filename: str, - source: FileSource, - options: Optional[Union[Dict, SpeakRESTOptions]] = None, - addons: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/speak", - **kwargs, - ) -> SpeakRESTResponse: - """ - Speak from a text source and save to a file. - """ - return self.save( - filename, - source, - options=options, - addons=addons, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - def save( - self, - filename: str, - source: FileSource, - options: Optional[Union[Dict, SpeakRESTOptions]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - timeout: Optional[httpx.Timeout] = None, - endpoint: str = "v1/speak", - **kwargs, - ) -> SpeakRESTResponse: - """ - Speak from a text source and save to a file. - - Args: - source (TextSource): The text source to speak. - options (SpeakRESTOptions): Additional options for the ingest (default is None). - addons (Dict): Additional options for the request (default is None). - headers (Dict): Additional headers for the request (default is None). - timeout (httpx.Timeout): The timeout for the request (default is None). - endpoint (str): The endpoint to use for the request (default is "v1/speak"). - - Returns: - SpeakRESTResponse: The response from the speak request. - - Raises: - DeepgramTypeError: Raised for known API errors. - """ - self._logger.debug("SpeakClient.save ENTER") - - res = self.stream_memory( - source, - options=options, - addons=addons, - headers=headers, - timeout=timeout, - endpoint=endpoint, - **kwargs, - ) - - if res.stream is None: - self._logger.error("stream is None") - self._logger.debug("SpeakClient.save LEAVE") - raise DeepgramError("BytesIO stream is None") - - # save to file - with open(filename, "wb+") as file: - file.write(res.stream.getbuffer()) - file.flush() - - # add filename to response - res.stream = None - res.filename = filename - - self._logger.debug("SpeakClient.save LEAVE") - return res - - # pylint: enable=too-many-positional-arguments diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/helpers.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/helpers.py deleted file mode 100644 index 3232c1e7..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/helpers.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .options import SpeakSource - - -def is_text_source(provided_source: SpeakSource) -> bool: - """ - Check if the provided source is a text source. - """ - return "text" in provided_source - - -def is_readstream_source(provided_source: SpeakSource) -> bool: - """ - Check if the provided source is a readstream source. - """ - return "stream" in provided_source diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/options.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/options.py deleted file mode 100644 index 9740abde..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/options.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from io import BufferedReader -from typing import Union, Optional -import logging - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from .....utils import verboselogs -from ....common import TextSource, BufferSource, StreamSource, FileSource, BaseResponse - - -@dataclass -class SpeakRESTOptions(BaseResponse): - """ - Contains all the options for the SpeakOptions. - - Reference: - https://developers.deepgram.com/reference/text-to-speech-api - """ - - model: Optional[str] = field( - default="aura-2-thalia-en", - metadata=dataclass_config(exclude=lambda f: f is None), - ) - encoding: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - container: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - sample_rate: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - bit_rate: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def check(self): - """ - Check the SpeakOptions for any missing or invalid values. - """ - logger = verboselogs.VerboseLogger(__name__) - logger.addHandler(logging.StreamHandler()) - prev = logger.level - logger.setLevel(verboselogs.ERROR) - - # no op at the moment - - logger.setLevel(prev) - - return True - - -SpeakOptions = SpeakRESTOptions - - -# unqiue -SpeakSource = Union[FileSource, BufferedReader] -SpeakRestSource = SpeakSource -SpeakRESTSource = SpeakSource # pylint: disable=invalid-name diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/response.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/response.py deleted file mode 100644 index 30801e30..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/rest/response.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from typing import Optional, Dict, Any -import io - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from ....common import ( - BaseResponse, -) - - -# Speak Response Types: - - -@dataclass -class SpeakRESTResponse(BaseResponse): # pylint: disable=too-many-instance-attributes - """ - A class for representing a response from the speak endpoint. - """ - - content_type: str = "" - request_id: str = "" - model_uuid: str = "" - model_name: str = "" - characters: int = 0 - transfer_encoding: str = "" - date: str = "" - filename: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - # pylint: disable=W0511 - # TODO: stream will be deprecated in a future release. Please use stream_memory instead. - stream: Optional[io.BytesIO] = field( - default=None, - metadata=dataclass_config(exclude=lambda f: True), - ) - # pylint: enable=W0511 - stream_memory: Optional[io.BytesIO] = field( - default=None, - metadata=dataclass_config(exclude=lambda f: True), - ) diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__init__.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__init__.py deleted file mode 100644 index 5245b934..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from .client import SpeakWebSocketClient, SpeakWSClient -from .async_client import AsyncSpeakWebSocketClient, AsyncSpeakWSClient -from .response import ( - #### top level - MetadataResponse, - FlushedResponse, - ClearedResponse, - WarningResponse, - #### shared - OpenResponse, - CloseResponse, - UnhandledResponse, - ErrorResponse, -) -from .options import SpeakWSOptions diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4b841c7a8816955643df4bd5f8bf59553a3cb75e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 660 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 Dcv}E< diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/options.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/options.cpython-312.pyc deleted file mode 100644 index f8dc1043908ed72d00036fb3f59cecb847f09b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3106 zcmcImO>7&-6`tMYE?4{&EhVv4E25M*F4anm(-bj`#AxCMiEG0Fq__bH7K_o&kXmVf z*qNak2@Jr43rHs`=)o?KL$861BE9wKdoNKf!0Hx33lv4+n;oi`ocd;#BqTa+d&wN$ z&b*(QH}8G#&HgE$&mb7>KfJg4i!?(2kc+{v`jcJrd;PTlJtUK`&uD!E5;Rng+YJMBh;GD?;xCX`k5*t{8fQ5f4Fv;=&ye*<`91Pko? znDf|dc+@9gX}M9@@S2azWTWf`Wh)VUdb>dF%bV;Bjf$w*LC z(+H~RHz6W5Lq{}4bf6|NZlQarJ|V9c0(tnTdCSOIR%{3X1X#F z7nWNTuYa_h1f6gFHdBUiB?<-hLSDwcUlyyh9I2e}awB4Dt*rVsiy39JL}fZdmtIoK zRUumZQngCx2BfA%8DAunwweqFi*6KD*+9K27!EmX94rX>u~-n%0&h|3t}gtFuJFiR zr$TMGHICa1FTA!OR zERHn&*!A0lLItD=ZQ!;qVmqJ$%W{a#AR^Si@&8<(jl+hlB*`ftNetMeTt5fonZCUU zLKVp_x<7kg+^=*IdmebP4PlRn7dF4k(_fbUos~qLndLZW`P5-p(C_lt^CyqBS3HrN z*)M(&%X;tQ?1wOsI9of8La6~`(DFXfJ9L$kuBThRG7YsuF{8J%U{0p!bp8x`07bk9ab~?Yiu-$o3Jolx2 zE(!H(FY88F!T1Gx9a$H%Z?)pG##`$HzC=LdE)0fXuYy%XptC{)k($WV@eO$+uGz0Tgi_wjf*fw2xg{{dEY$)#Q z;1~Z0NEaR1=+yMX()@mD{@%q0rPsHuL%Z__tc8OMQlpbdS|iF1zg z%Qp7=0RRA#$aNehaTAXZf1#Y@$B9h=o5{bY*Z@GsMaRKm7zr$YyEvFlOZkkFd!b;n za;bXb59I7sNn~G0o)y`llLw_BXOc+B@ZSUZHF}aVP5Vg!ot-@#pZiN`c7Oh@gVNQB&-`&2rdu8XX9x_bpiH&AnhUT?DQ{BIK?O^8mk)h96-S@Xwcll1xLprGB(A@bE zl{u?>ZTIxump+|NRILBG%h$GUPJL}_=ImojGhewo(L?a*S$T6(MOR&*Qi^piVzO*w zOKi3PKulJq3L5*dWM_v_rJTv1%F$p`?#TYaY$^MRG%?%4^LYYZ_=gPwkjk1=M~(y& zejk$LUS>Z771=cS8$cc#nx_3bgR~d_hUWf?3jadi{|deFPc-)xdg-x+^z4!Tsy4Y> Q?;-f~3}8Hw40W~t0PR@OxBvhE diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/response.cpython-312.pyc b/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/__pycache__/response.cpython-312.pyc deleted file mode 100644 index 5408315d6840092bd0dd1d480cbadd538caf4742..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1752 zcmb_c&2JM&6rcU{`ip!);*pRB2^tHQ5;)H~V2`)W?A~5=Y z-Q4`!BIGqXkr`XQ72CcYJH8XUz8e?(f_|l(N%Dt z5>9-B5#L;gs`(Z(eVaSnW!80I!7FIbMsLSyxN7ze&nRAYeD>qzQXR%PTu(QC2XyO{9&KVEaq~LT?vAReH!IVAqZF+27#!;o0TOq zp=N@BCP|vntP3>(>J(7V$Ow>p=&XFxUYA_R_U*N``|VXOx3aX?-cGwA|E|N6ti8>X z?e3Bnr%q3-om6vxaa>Y z(n`dsI8vmV&N`1C{Y;M)LTA+yXEB9iX=3VsP){Sh3i%oj)?d<~Dh z3~<;L&xp8N&56cz-P8>VrbCc*(n z;D25e5Ilq;f^J9sxoL6qJwCqM2k-j9KjvG3_cGv-1Aw7r7{}cjvW91 diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/async_client.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/async_client.py deleted file mode 100644 index c69debcf..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/async_client.py +++ /dev/null @@ -1,706 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import asyncio -import json -import logging -from typing import Dict, Union, Optional, cast, Any, Callable -from datetime import datetime -import threading - -from .....utils import verboselogs -from .....options import DeepgramClientOptions -from ...enums import SpeakWebSocketEvents, SpeakWebSocketMessage -from ....common import AbstractAsyncWebSocketClient -from ....common import DeepgramError - -from .response import ( - OpenResponse, - MetadataResponse, - FlushedResponse, - ClearedResponse, - CloseResponse, - WarningResponse, - ErrorResponse, - UnhandledResponse, -) -from .options import SpeakWSOptions - -from .....audio.microphone import Microphone -from .....audio.speaker import Speaker, RATE, CHANNELS, PLAYBACK_DELTA - -ONE_SECOND = 1 -HALF_SECOND = 0.5 -DEEPGRAM_INTERVAL = 5 -PING_INTERVAL = 20 - - -class AsyncSpeakWSClient( - AbstractAsyncWebSocketClient -): # pylint: disable=too-many-instance-attributes - """ - Client for interacting with Deepgram's text-to-speech services over WebSockets. - - This class provides methods to establish a WebSocket connection for TTS synthesis and handle real-time TTS synthesis events. - - Args: - config (DeepgramClientOptions): all the options for the client. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - _event_handlers: Dict[SpeakWebSocketEvents, list] - - _flush_thread: Union[asyncio.Task, None] - _last_datagram: Optional[datetime] = None - _flush_count: int - - _kwargs: Optional[Dict] = None - _addons: Optional[Dict] = None - _options: Optional[Dict] = None - _headers: Optional[Dict] = None - - _speaker_created: bool = False - _speaker: Optional[Speaker] = None - _microphone: Optional[Microphone] = None - - def __init__( - self, config: DeepgramClientOptions, microphone: Optional[Microphone] = None - ): - if config is None: - raise DeepgramError("Config is required") - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - - self._config = config - self._endpoint = "v1/speak" - - self._flush_thread = None - - # auto flush - self._last_datagram = None - self._flush_count = 0 - - # microphone - self._microphone = microphone - - # init handlers - self._event_handlers = { - event: [] for event in SpeakWebSocketEvents.__members__.values() - } - - if self._config.options.get("speaker_playback") == "true": - self._logger.info("speaker_playback is enabled") - rate = self._config.options.get("speaker_playback_rate") - if rate is None: - rate = RATE - channels = self._config.options.get("speaker_playback_channels") - if channels is None: - channels = CHANNELS - playback_delta_in_ms = self._config.options.get( - "speaker_playback_delta_in_ms" - ) - if playback_delta_in_ms is None: - playback_delta_in_ms = PLAYBACK_DELTA - device_index = self._config.options.get("speaker_playback_device_index") - - self._logger.debug("rate: %s", rate) - self._logger.debug("channels: %s", channels) - self._logger.debug("device_index: %s", device_index) - - self._speaker_created = True - - if device_index is not None: - self._speaker = Speaker( - rate=rate, - channels=channels, - last_play_delta_in_ms=playback_delta_in_ms, - verbose=self._config.verbose, - output_device_index=device_index, - microphone=self._microphone, - ) - else: - self._speaker = Speaker( - rate=rate, - channels=channels, - last_play_delta_in_ms=playback_delta_in_ms, - verbose=self._config.verbose, - microphone=self._microphone, - ) - - # call the parent constructor - super().__init__(self._config, self._endpoint) - - # pylint: disable=too-many-branches,too-many-statements - async def start( - self, - options: Optional[Union[SpeakWSOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - members: Optional[Dict] = None, - **kwargs, - ) -> bool: - """ - Starts the WebSocket connection for text-to-speech synthesis. - """ - self._logger.debug("AsyncSpeakWebSocketClient.start ENTER") - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - self._logger.info("members: %s", members) - self._logger.info("kwargs: %s", kwargs) - - if isinstance(options, SpeakWSOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("AsyncSpeakWebSocketClient.start LEAVE") - raise DeepgramError("Fatal text-to-speech options error") - - self._addons = addons - self._headers = headers - - # add "members" as members of the class - if members is not None: - self.__dict__.update(members) - - # set kwargs as members of the class - if kwargs is not None: - self._kwargs = kwargs - else: - self._kwargs = {} - - if isinstance(options, SpeakWSOptions): - self._logger.info("SpeakWSOptions switching class -> dict") - self._options = options.to_dict() - elif options is not None: - self._options = options - else: - self._options = {} - - try: - # speaker substitutes the listening thread - if self._speaker is not None: - self._logger.notice("passing speaker to delegate_listening") - super().delegate_listening(self._speaker) - - # call parent start - if ( - await super().start( - self._options, - self._addons, - self._headers, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - is False - ): - self._logger.error("AsyncSpeakWebSocketClient.start failed") - self._logger.debug("AsyncSpeakWebSocketClient.start LEAVE") - return False - - if self._speaker is not None: - self._logger.notice("start delegate_listening thread") - self._speaker.start() - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # flush thread - if self._config.is_auto_flush_speak_enabled(): - self._logger.notice("autoflush is enabled") - self._flush_thread = asyncio.create_task(self._flush()) - else: - self._logger.notice("autoflush is disabled") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("start succeeded") - self._logger.debug("AsyncSpeakWebSocketClient.start LEAVE") - return True - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "WebSocketException in AsyncSpeakWebSocketClient.start: %s", e - ) - self._logger.debug("AsyncSpeakWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect") is True: - raise - return False - - # pylint: enable=too-many-branches,too-many-statements - - def on(self, event: SpeakWebSocketEvents, handler: Callable) -> None: - """ - Registers event handlers for specific events. - """ - self._logger.info("event subscribed: %s", event) - if event in SpeakWebSocketEvents.__members__.values() and callable(handler): - self._event_handlers[event].append(handler) - - # triggers the registered event handlers for a specific event - async def _emit(self, event: SpeakWebSocketEvents, *args, **kwargs) -> None: - """ - Emits events to the registered event handlers. - """ - self._logger.debug("AsyncSpeakWebSocketClient._emit ENTER") - self._logger.debug("callback handlers for: %s", event) - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - tasks = [] - for handler in self._event_handlers[event]: - task = asyncio.create_task(handler(self, *args, **kwargs)) - tasks.append(task) - - if tasks: - self._logger.debug("waiting for tasks to finish...") - await asyncio.gather(*filter(None, tasks), return_exceptions=True) - tasks.clear() - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.debug("AsyncSpeakWebSocketClient._emit LEAVE") - - async def _process_text(self, message: Union[str, bytes]) -> None: - """ - Processes messages received over the WebSocket connection. - """ - self._logger.debug("AsyncSpeakWebSocketClient._process_text ENTER") - - try: - self._logger.debug("Text data received") - - if len(message) == 0: - self._logger.debug("message is empty") - self._logger.debug("AsyncSpeakWebSocketClient._process_text LEAVE") - return - - data = json.loads(message) - response_type = data.get("type") - self._logger.debug("response_type: %s, data: %s", response_type, data) - - match response_type: - case SpeakWebSocketEvents.Open: - open_result: OpenResponse = OpenResponse.from_json(message) - self._logger.verbose("OpenResponse: %s", open_result) - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Open), - open=open_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Metadata: - meta_result: MetadataResponse = MetadataResponse.from_json(message) - self._logger.verbose("MetadataResponse: %s", meta_result) - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Metadata), - metadata=meta_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Flushed: - fl_result: FlushedResponse = FlushedResponse.from_json(message) - self._logger.verbose("FlushedResponse: %s", fl_result) - - # auto flush - if self._config.is_inspecting_speak(): - self._flush_count -= 1 - self._logger.debug( - "Decrement AutoFlush count: %d", - self._flush_count, - ) - - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Flushed), - flushed=fl_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Cleared: - clear_result: ClearedResponse = ClearedResponse.from_json(message) - self._logger.verbose("ClearedResponse: %s", clear_result) - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Cleared), - cleared=clear_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Close: - close_result: CloseResponse = CloseResponse.from_json(message) - self._logger.verbose("CloseResponse: %s", close_result) - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Close), - close=close_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Warning: - war_warning: WarningResponse = WarningResponse.from_json(message) - self._logger.verbose("WarningResponse: %s", war_warning) - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Warning), - warning=war_warning, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Error: - err_error: ErrorResponse = ErrorResponse.from_json(message) - self._logger.verbose("ErrorResponse: %s", err_error) - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Error), - error=err_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case _: - self._logger.warning( - "Unknown Message: response_type: %s, data: %s", - response_type, - data, - ) - unhandled_error: UnhandledResponse = UnhandledResponse( - type=SpeakWebSocketEvents(SpeakWebSocketEvents.Unhandled), - raw=str(message), - ) - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Unhandled), - unhandled=unhandled_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.notice("_process_text Succeeded") - self._logger.debug("AsyncSpeakWebSocketClient._process_text LEAVE") - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in AsyncSpeakWebSocketClient._process_text: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in AsyncSpeakWebSocketClient._process_text", - f"{e}", - "Exception", - ) - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - await super()._signal_exit() - - self._logger.debug("AsyncSpeakWebSocketClient._process_text LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - # pylint: enable=too-many-return-statements,too-many-statements - - async def _process_binary(self, message: bytes) -> None: - self._logger.debug("SpeakWebSocketClient._process_binary ENTER") - self._logger.debug("Binary data received") - - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.AudioData), - data=message, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.notice("_process_binary Succeeded") - self._logger.debug("SpeakWebSocketClient._process_binary LEAVE") - - ## pylint: disable=too-many-return-statements - async def _flush(self) -> None: - self._logger.debug("AsyncSpeakWebSocketClient._flush ENTER") - - delta_in_ms_str = self._config.options.get("auto_flush_speak_delta") - if delta_in_ms_str is None: - self._logger.error("auto_flush_speak_delta is None") - self._logger.debug("AsyncSpeakWebSocketClient._flush LEAVE") - return - delta_in_ms = float(delta_in_ms_str) - - while True: - try: - await asyncio.sleep(HALF_SECOND) - - if self._exit_event.is_set(): - self._logger.notice("_flush exiting gracefully") - self._logger.debug("AsyncSpeakWebSocketClient._flush LEAVE") - return - - if self._last_datagram is None: - self._logger.debug("AutoFlush last_datagram is None") - continue - - delta = datetime.now() - self._last_datagram - diff_in_ms = delta.total_seconds() * 1000 - self._logger.debug("AutoFlush delta: %f", diff_in_ms) - if diff_in_ms < delta_in_ms: - self._logger.debug("AutoFlush delta is less than threshold") - continue - - await self.flush() - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "Exception in AsyncSpeakWebSocketClient._flush: %s", e - ) - e_error: ErrorResponse = ErrorResponse( - "Exception in AsyncSpeakWebSocketClient._flush", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in AsyncSpeakWebSocketClient._flush: %s", str(e) - ) - await self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - await super()._signal_exit() - - self._logger.debug("AsyncSpeakWebSocketClient._flush LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - # pylint: enable=too-many-return-statements - - async def send_text(self, text_input: str) -> bool: - """ - Sends text to the WebSocket connection to generate audio. - - Args: - text_input (str): The raw text to be synthesized. This function will automatically wrap - the text in a JSON object of type "Speak" with the key "text". - - Returns: - bool: True if the text was successfully sent, False otherwise. - """ - return await self.send_raw(json.dumps({"type": "Speak", "text": text_input})) - - async def send(self, data: Union[bytes, str]) -> bool: - """ - Alias for send_text. Please see send_text for more information. - """ - if isinstance(data, bytes): - self._logger.error("send() failed - data is bytes") - return False - - return await self.send_text(data) - - # pylint: disable=unused-argument - async def send_control( - self, msg_type: Union[SpeakWebSocketMessage, str], data: Optional[str] = "" - ) -> bool: - """ - Sends a control message consisting of type SpeakWebSocketEvents over the WebSocket connection. - - Args: - msg_type (SpeakWebSocketEvents): The type of control message to send. - (Optional) data (str): The data to send with the control message. - - Returns: - bool: True if the control message was successfully sent, False otherwise. - """ - control_msg = json.dumps({"type": msg_type}) - return await self.send_raw(control_msg) - - # pylint: enable=unused-argument - - # pylint: disable=too-many-return-statements,too-many-branches,too-many-statements - async def send_raw(self, msg: str) -> bool: - """ - Sends a raw/control message over the WebSocket connection. This message must contain a valid JSON object. - - Args: - msg (str): The raw message to send over the WebSocket connection. - - Returns: - bool: True if the message was successfully sent, False otherwise. - """ - self._logger.spam("AsyncSpeakWebSocketClient.send_raw ENTER") - - if self._config.is_inspecting_speak(): - try: - _tmp_json = json.loads(msg) - if "type" in _tmp_json: - self._logger.debug( - "Inspecting Message: Sending %s", _tmp_json["type"] - ) - match _tmp_json["type"]: - case SpeakWebSocketMessage.Speak: - inspect_res = await self._inspect() - if not inspect_res: - self._logger.error("inspect_res failed") - case SpeakWebSocketMessage.Flush: - self._last_datagram = None - self._flush_count += 1 - self._logger.debug( - "Increment Flush count: %d", self._flush_count - ) - except Exception as e: # pylint: disable=broad-except - self._logger.error("send_raw() failed - Exception: %s", str(e)) - - try: - if await super().send(msg) is False: - self._logger.error("send_raw() failed") - self._logger.spam("AsyncSpeakWebSocketClient.send_raw LEAVE") - return False - self._logger.spam("send_raw() succeeded") - self._logger.spam("AsyncSpeakWebSocketClient.send_raw LEAVE") - return True - except Exception as e: # pylint: disable=broad-except - self._logger.error("send_raw() failed - Exception: %s", str(e)) - self._logger.spam("AsyncSpeakWebSocketClient.send_raw LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return False - - # pylint: enable=too-many-return-statements,too-many-branches - - async def flush(self) -> bool: - """ - Flushes the current buffer and returns generated audio - """ - self._logger.spam("AsyncSpeakWebSocketClient.flush ENTER") - - self._logger.notice("Sending Flush...") - ret = await self.send_control(SpeakWebSocketMessage.Flush) - - if not ret: - self._logger.error("flush failed") - self._logger.spam("AsyncSpeakWebSocketClient.flush LEAVE") - return False - - self._logger.notice("flush succeeded") - self._logger.spam("AsyncSpeakWebSocketClient.flush LEAVE") - - return True - - async def clear(self) -> bool: - """ - Clears the current buffer on the server - """ - self._logger.spam("AsyncSpeakWebSocketClient.clear ENTER") - - self._logger.notice("Sending Clear...") - ret = await self.send_control(SpeakWebSocketMessage.Clear) - - if not ret: - self._logger.error("clear failed") - self._logger.spam("AsyncSpeakWebSocketClient.clear LEAVE") - return False - - self._logger.notice("clear succeeded") - self._logger.spam("AsyncSpeakWebSocketClient.clear LEAVE") - - return True - - async def wait_for_complete(self): - """ - This method will block until the speak is done playing sound. - """ - self._logger.spam("AsyncSpeakWebSocketClient.wait_for_complete ENTER") - - if self._speaker is None: - self._logger.error("speaker is None. Return immediately") - return - - loop = asyncio.get_event_loop() - await loop.run_in_executor(None, self._speaker.wait_for_complete) - self._logger.notice("wait_for_complete succeeded") - self._logger.spam("AsyncSpeakWebSocketClient.wait_for_complete LEAVE") - - async def _close_message(self) -> bool: - return await self.send_control(SpeakWebSocketMessage.Close) - - async def finish(self) -> bool: - """ - Closes the WebSocket connection gracefully. - """ - self._logger.debug("AsyncSpeakWebSocketClient.finish ENTER") - - # stop the threads - self._logger.verbose("cancelling tasks...") - try: - # call parent finish - if await super().finish() is False: - self._logger.error("AsyncListenWebSocketClient.finish failed") - - if self._speaker is not None and self._speaker_created: - self._speaker.finish() - self._speaker_created = False - - # Before cancelling, check if the tasks were created - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - tasks = [] - - if self._speaker is not None: - self._logger.notice("stopping speaker...") - self._speaker.finish() - self._speaker = None - self._logger.notice("speaker stopped") - - if self._flush_thread is not None: - self._logger.notice("stopping _flush_thread...") - self._flush_thread.cancel() - tasks.append(self._flush_thread) - self._logger.notice("_flush_thread cancelled") - - # Use asyncio.gather to wait for tasks to be cancelled - # Prevent indefinite waiting by setting a timeout - await asyncio.wait_for(asyncio.gather(*tasks), timeout=10) - self._logger.notice("threads joined") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("finish succeeded") - self._logger.spam("AsyncSpeakWebSocketClient.finish LEAVE") - return True - - except asyncio.CancelledError: - self._logger.debug("tasks cancelled") - self._logger.debug("AsyncSpeakWebSocketClient.finish LEAVE") - return False - - except asyncio.TimeoutError as e: - self._logger.error("tasks cancellation timed out: %s", e) - self._logger.debug("AsyncSpeakWebSocketClient.finish LEAVE") - return False - - async def _inspect(self) -> bool: - # auto flush_inspect is generically used to track any messages you might want to snoop on - # place additional logic here to inspect messages of interest - - # for auto flush functionality - # set the last datagram - self._last_datagram = datetime.now() - self._logger.debug( - "AutoFlush last received: %s", - str(self._last_datagram), - ) - - return True - - -AsyncSpeakWebSocketClient = AsyncSpeakWSClient diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/client.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/client.py deleted file mode 100644 index d14c3603..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/client.py +++ /dev/null @@ -1,686 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import json -import time -import logging -from typing import Dict, Union, Optional, cast, Any, Callable -from datetime import datetime -import threading - -from .....utils import verboselogs -from .....options import DeepgramClientOptions -from ...enums import SpeakWebSocketEvents, SpeakWebSocketMessage -from ....common import AbstractSyncWebSocketClient -from ....common import DeepgramError - -from .response import ( - OpenResponse, - MetadataResponse, - FlushedResponse, - ClearedResponse, - CloseResponse, - WarningResponse, - ErrorResponse, - UnhandledResponse, -) -from .options import SpeakWSOptions - -from .....audio.microphone import Microphone -from .....audio.speaker import Speaker, RATE, CHANNELS, PLAYBACK_DELTA - -ONE_SECOND = 1 -HALF_SECOND = 0.5 -DEEPGRAM_INTERVAL = 5 -PING_INTERVAL = 20 - - -class SpeakWSClient( - AbstractSyncWebSocketClient -): # pylint: disable=too-many-instance-attributes - """ - Client for interacting with Deepgram's text-to-speech services over WebSockets. - - This class provides methods to establish a WebSocket connection for TTS synthesis and handle real-time TTS synthesis events. - - Args: - config (DeepgramClientOptions): all the options for the client. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _endpoint: str - - _event_handlers: Dict[SpeakWebSocketEvents, list] - - _flush_thread: Union[threading.Thread, None] - _lock_flush: threading.Lock - _last_datagram: Optional[datetime] = None - _flush_count: int - - _kwargs: Optional[Dict] = None - _addons: Optional[Dict] = None - _options: Optional[Dict] = None - _headers: Optional[Dict] = None - - _speaker_created: bool = False - _speaker: Optional[Speaker] = None - _microphone: Optional[Microphone] = None - - def __init__( - self, config: DeepgramClientOptions, microphone: Optional[Microphone] = None - ): - if config is None: - raise DeepgramError("Config is required") - - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - - self._config = config - self._endpoint = "v1/speak" - self._lock_flush = threading.Lock() - - self._flush_thread = None - - # auto flush - self._last_datagram = None - self._flush_count = 0 - - # microphone - self._microphone = microphone - - # init handlers - self._event_handlers = { - event: [] for event in SpeakWebSocketEvents.__members__.values() - } - - if self._config.options.get("speaker_playback") == "true": - self._logger.info("speaker_playback is enabled") - rate = self._config.options.get("speaker_playback_rate") - if rate is None: - rate = RATE - channels = self._config.options.get("speaker_playback_channels") - if channels is None: - channels = CHANNELS - playback_delta_in_ms = self._config.options.get( - "speaker_playback_delta_in_ms" - ) - if playback_delta_in_ms is None: - playback_delta_in_ms = PLAYBACK_DELTA - device_index = self._config.options.get("speaker_playback_device_index") - - self._logger.debug("rate: %s", rate) - self._logger.debug("channels: %s", channels) - self._logger.debug("device_index: %s", device_index) - - self._speaker_created = True - - if device_index is not None: - self._speaker = Speaker( - rate=rate, - channels=channels, - last_play_delta_in_ms=playback_delta_in_ms, - verbose=self._config.verbose, - output_device_index=device_index, - microphone=self._microphone, - ) - else: - self._speaker = Speaker( - rate=rate, - channels=channels, - last_play_delta_in_ms=playback_delta_in_ms, - verbose=self._config.verbose, - microphone=self._microphone, - ) - - # call the parent constructor - super().__init__(self._config, self._endpoint) - - # pylint: disable=too-many-statements,too-many-branches - def start( - self, - options: Optional[Union[SpeakWSOptions, Dict]] = None, - addons: Optional[Dict] = None, - headers: Optional[Dict] = None, - members: Optional[Dict] = None, - **kwargs, - ) -> bool: - """ - Starts the WebSocket connection for text-to-speech synthesis. - """ - self._logger.debug("SpeakWebSocketClient.start ENTER") - self._logger.info("options: %s", options) - self._logger.info("addons: %s", addons) - self._logger.info("headers: %s", headers) - self._logger.info("members: %s", members) - self._logger.info("kwargs: %s", kwargs) - - if isinstance(options, SpeakWSOptions) and not options.check(): - self._logger.error("options.check failed") - self._logger.debug("SpeakWebSocketClient.start LEAVE") - raise DeepgramError("Fatal text-to-speech options error") - - self._addons = addons - self._headers = headers - - # add "members" as members of the class - if members is not None: - self.__dict__.update(members) - - # set kwargs as members of the class - if kwargs is not None: - self._kwargs = kwargs - else: - self._kwargs = {} - - if isinstance(options, SpeakWSOptions): - self._logger.info("SpeakWSOptions switching class -> dict") - self._options = options.to_dict() - elif options is not None: - self._options = options - else: - self._options = {} - - try: - # speaker substitutes the listening thread - if self._speaker is not None: - self._logger.notice("passing speaker to delegate_listening") - super().delegate_listening(self._speaker) - - # call parent start - if ( - super().start( - self._options, - self._addons, - self._headers, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - is False - ): - self._logger.error("SpeakWebSocketClient.start failed") - self._logger.debug("SpeakWebSocketClient.start LEAVE") - return False - - if self._speaker is not None: - self._logger.notice("start delegate_listening thread") - self._speaker.start() - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # flush thread - if self._config.is_auto_flush_speak_enabled(): - self._logger.notice("autoflush is enabled") - self._flush_thread = threading.Thread(target=self._flush) - self._flush_thread.start() - else: - self._logger.notice("autoflush is disabled") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("start succeeded") - self._logger.debug("SpeakWebSocketClient.start LEAVE") - return True - - except Exception as e: # pylint: disable=broad-except - self._logger.error( - "WebSocketException in SpeakWebSocketClient.start: %s", e - ) - self._logger.debug("SpeakWebSocketClient.start LEAVE") - if self._config.options.get("termination_exception_connect") is True: - raise - return False - - # pylint: enable=too-many-statements,too-many-branches - - def on(self, event: SpeakWebSocketEvents, handler: Callable) -> None: - """ - Registers event handlers for specific events. - """ - self._logger.info("event subscribed: %s", event) - if event in SpeakWebSocketEvents.__members__.values() and callable(handler): - self._event_handlers[event].append(handler) - - def _emit(self, event: SpeakWebSocketEvents, *args, **kwargs) -> None: - """ - Emits events to the registered event handlers. - """ - self._logger.debug("SpeakWebSocketClient._emit ENTER") - self._logger.debug("callback handlers for: %s", event) - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.debug("callback handlers for: %s", event) - for handler in self._event_handlers[event]: - handler(self, *args, **kwargs) - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("after running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.debug("ListenWebSocketClient._emit LEAVE") - - def _process_text(self, message: str) -> None: - """ - Processes messages received over the WebSocket connection. - """ - self._logger.debug("SpeakWebSocketClient._process_text ENTER") - - try: - self._logger.debug("Text data received") - - if len(message) == 0: - self._logger.debug("message is empty") - self._logger.debug("SpeakWebSocketClient._process_text LEAVE") - return - - data = json.loads(message) - response_type = data.get("type") - self._logger.debug("response_type: %s, data: %s", response_type, data) - - match response_type: - case SpeakWebSocketEvents.Open: - open_result: OpenResponse = OpenResponse.from_json(message) - self._logger.verbose("OpenResponse: %s", open_result) - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Open), - open=open_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Metadata: - meta_result: MetadataResponse = MetadataResponse.from_json(message) - self._logger.verbose("MetadataResponse: %s", meta_result) - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Metadata), - metadata=meta_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Flushed: - fl_result: FlushedResponse = FlushedResponse.from_json(message) - self._logger.verbose("FlushedResponse: %s", fl_result) - - # auto flush - if self._config.is_inspecting_speak(): - with self._lock_flush: - self._flush_count -= 1 - self._logger.debug( - "Decrement Flush count: %d", - self._flush_count, - ) - - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Flushed), - flushed=fl_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Cleared: - clear_result: ClearedResponse = ClearedResponse.from_json(message) - self._logger.verbose("ClearedResponse: %s", clear_result) - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Cleared), - cleared=clear_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Close: - close_result: CloseResponse = CloseResponse.from_json(message) - self._logger.verbose("CloseResponse: %s", close_result) - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Close), - close=close_result, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Warning: - war_warning: WarningResponse = WarningResponse.from_json(message) - self._logger.verbose("WarningResponse: %s", war_warning) - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Warning), - warning=war_warning, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case SpeakWebSocketEvents.Error: - err_error: ErrorResponse = ErrorResponse.from_json(message) - self._logger.verbose("ErrorResponse: %s", err_error) - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Error), - error=err_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - case _: - self._logger.warning( - "Unknown Message: response_type: %s, data: %s", - response_type, - data, - ) - unhandled_error: UnhandledResponse = UnhandledResponse( - type=SpeakWebSocketEvents(SpeakWebSocketEvents.Unhandled), - raw=message, - ) - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Unhandled), - unhandled=unhandled_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.notice("_process_text Succeeded") - self._logger.debug("SpeakWebSocketClient._process_text LEAVE") - - except Exception as e: # pylint: disable=broad-except - self._logger.error("Exception in SpeakWebSocketClient._process_text: %s", e) - e_error: ErrorResponse = ErrorResponse( - "Exception in SpeakWebSocketClient._process_text", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in SpeakWebSocketClient._process_text: %s", str(e) - ) - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Error), - e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - super()._signal_exit() - - self._logger.debug("SpeakWebSocketClient._process_text LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - # pylint: enable=too-many-return-statements,too-many-statements - - def _process_binary(self, message: bytes) -> None: - self._logger.debug("SpeakWebSocketClient._process_binary ENTER") - self._logger.debug("Binary data received") - - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.AudioData), - data=message, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - self._logger.notice("_process_binary Succeeded") - self._logger.debug("SpeakWebSocketClient._process_binary LEAVE") - - # pylint: disable=too-many-return-statements - def _flush(self) -> None: - self._logger.debug("SpeakWebSocketClient._flush ENTER") - - delta_in_ms_str = self._config.options.get("auto_flush_speak_delta") - if delta_in_ms_str is None: - self._logger.error("auto_flush_speak_delta is None") - self._logger.debug("SpeakWebSocketClient._flush LEAVE") - return - delta_in_ms = float(delta_in_ms_str) - - while True: - try: - self._exit_event.wait(timeout=HALF_SECOND) - - if self._exit_event.is_set(): - self._logger.notice("_flush exiting gracefully") - self._logger.debug("ListenWebSocketClient._flush LEAVE") - return - - if self._last_datagram is None: - self._logger.debug("AutoFlush last_datagram is None") - continue - - with self._lock_flush: - delta = datetime.now() - self._last_datagram - diff_in_ms = delta.total_seconds() * 1000 - self._logger.debug("AutoFlush delta: %f", diff_in_ms) - if diff_in_ms < delta_in_ms: - self._logger.debug("AutoFlush delta is less than threshold") - continue - - self.flush() - - except Exception as e: # pylint: disable=broad-except - self._logger.error("Exception in SpeakWebSocketClient._flush: %s", e) - e_error: ErrorResponse = ErrorResponse( - "Exception in SpeakWebSocketClient._flush", - f"{e}", - "Exception", - ) - self._logger.error( - "Exception in SpeakWebSocketClient._flush: %s", str(e) - ) - self._emit( - SpeakWebSocketEvents(SpeakWebSocketEvents.Error), - error=e_error, - **dict(cast(Dict[Any, Any], self._kwargs)), - ) - - # signal exit and close - super()._signal_exit() - - self._logger.debug("SpeakWebSocketClient._flush LEAVE") - - if self._config.options.get("termination_exception") is True: - raise - return - - # pylint: enable=too-many-return-statements - - def send_text(self, text_input: str) -> bool: - """ - Sends text to the WebSocket connection to generate audio. - - Args: - text_input (str): The raw text to be synthesized. This function will automatically wrap - the text in a JSON object of type "Speak" with the key "text". - - Returns: - bool: True if the text was successfully sent, False otherwise. - """ - return self.send_raw(json.dumps({"type": "Speak", "text": text_input})) - - def send(self, data: Union[str, bytes]) -> bool: - """ - Alias for send_text. Please see send_text for more information. - """ - if isinstance(data, bytes): - self._logger.error("send() failed - data is bytes") - return False - - return self.send_text(data) - - # pylint: disable=unused-argument - def send_control( - self, msg_type: Union[SpeakWebSocketMessage, str], data: Optional[str] = "" - ) -> bool: - """ - Sends a control message consisting of type SpeakWebSocketEvents over the WebSocket connection. - - Args: - msg_type (SpeakWebSocketEvents): The type of control message to send. - (Optional) data (str): The data to send with the control message. - - Returns: - bool: True if the control message was successfully sent, False otherwise. - """ - control_msg = json.dumps({"type": msg_type}) - return self.send_raw(control_msg) - - # pylint: enable=unused-argument - - # pylint: disable=too-many-return-statements,too-many-branches,too-many-statements - def send_raw(self, msg: str) -> bool: - """ - Sends a raw/control message over the WebSocket connection. This message must contain a valid JSON object. - - Args: - msg (str): The raw message to send over the WebSocket connection. - - Returns: - bool: True if the message was successfully sent, False otherwise. - """ - self._logger.spam("SpeakWebSocketClient.send_raw ENTER") - - if self._config.is_inspecting_speak(): - try: - _tmp_json = json.loads(msg) - if "type" in _tmp_json: - self._logger.debug( - "Inspecting Message: Sending %s", _tmp_json["type"] - ) - match _tmp_json["type"]: - case SpeakWebSocketMessage.Speak: - inspect_res = self._inspect() - if not inspect_res: - self._logger.error("inspect_res failed") - case SpeakWebSocketMessage.Flush: - with self._lock_flush: - self._last_datagram = None - self._flush_count += 1 - self._logger.debug( - "Increment Flush count: %d", self._flush_count - ) - except Exception as e: # pylint: disable=broad-except - self._logger.error("send_raw() failed - Exception: %s", str(e)) - - try: - if super().send(msg) is False: - self._logger.error("send_raw() failed") - self._logger.spam("SpeakWebSocketClient.send_raw LEAVE") - return False - self._logger.spam("send_raw() succeeded") - self._logger.spam("SpeakWebSocketClient.send_raw LEAVE") - return True - except Exception as e: # pylint: disable=broad-except - self._logger.error("send_raw() failed - Exception: %s", str(e)) - self._logger.spam("SpeakWebSocketClient.send_raw LEAVE") - if self._config.options.get("termination_exception_send") is True: - raise - return False - - # pylint: enable=too-many-return-statements,too-many-branches - - def flush(self) -> bool: - """ - Flushes the current buffer and returns generated audio - """ - self._logger.spam("SpeakWebSocketClient.flush ENTER") - - self._logger.notice("Sending Flush...") - ret = self.send_control(SpeakWebSocketMessage.Flush) - - if not ret: - self._logger.error("flush failed") - self._logger.spam("SpeakWebSocketClient.flush LEAVE") - return False - - self._logger.notice("flush succeeded") - self._logger.spam("SpeakWebSocketClient.flush LEAVE") - - return True - - def clear(self) -> bool: - """ - Clears the current buffer on the server - """ - self._logger.spam("SpeakWebSocketClient.clear ENTER") - - self._logger.notice("Sending Clear...") - ret = self.send_control(SpeakWebSocketMessage.Clear) - - if not ret: - self._logger.error("clear failed") - self._logger.spam("SpeakWebSocketClient.clear LEAVE") - return False - - self._logger.notice("clear succeeded") - self._logger.spam("SpeakWebSocketClient.clear LEAVE") - - return True - - def wait_for_complete(self): - """ - This method will block until the speak is done playing sound. - """ - self._logger.spam("SpeakWebSocketClient.wait_for_complete ENTER") - - if self._speaker is None: - self._logger.error("speaker is None. Return immediately") - raise DeepgramError("Speaker is not initialized") - - self._speaker.wait_for_complete() - self._logger.notice("wait_for_complete succeeded") - self._logger.spam("SpeakWebSocketClient.wait_for_complete LEAVE") - - def _close_message(self) -> bool: - return self.send_control(SpeakWebSocketMessage.Close) - - # closes the WebSocket connection gracefully - def finish(self) -> bool: - """ - Closes the WebSocket connection gracefully. - """ - self._logger.spam("SpeakWebSocketClient.finish ENTER") - - # call parent finish which calls signal_exit - if super().finish() is False: - self._logger.error("ListenWebSocketClient.finish failed") - - if self._speaker is not None and self._speaker_created: - self._speaker.finish() - self._speaker_created = False - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - # stop the threads - if self._speaker is not None: - self._logger.verbose("stopping speaker...") - self._speaker.finish() - self._speaker = None - self._logger.notice("speaker stopped") - - if self._flush_thread is not None: - self._logger.verbose("sdtopping _flush_thread...") - self._flush_thread.join() - self._flush_thread = None - self._logger.notice("_flush_thread joined") - - # debug the threads - for thread in threading.enumerate(): - self._logger.debug("before running thread: %s", thread.name) - self._logger.debug("number of active threads: %s", threading.active_count()) - - self._logger.notice("finish succeeded") - self._logger.spam("SpeakWebSocketClient.finish LEAVE") - return True - - def _inspect(self) -> bool: - # auto flush_inspect is generically used to track any messages you might want to snoop on - # place additional logic here to inspect messages of interest - - # for auto flush functionality - # set the last datagram - with self._lock_flush: - self._last_datagram = datetime.now() - self._logger.debug( - "AutoFlush last received: %s", - str(self._last_datagram), - ) - - return True - - -SpeakWebSocketClient = SpeakWSClient diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/options.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/options.py deleted file mode 100644 index 20e5f56c..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/options.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from io import BufferedReader -from typing import Union, Optional -import logging - -from dataclasses import dataclass, field -from dataclasses_json import config as dataclass_config - -from .....utils import verboselogs -from ....common import BaseResponse - - -@dataclass -class SpeakWSOptions(BaseResponse): - """ - Contains all the options for the SpeakOptions. - - Reference: - https://developers.deepgram.com/reference/transform-text-to-speech-websocket - """ - - model: Optional[str] = field( - default="aura-2-thalia-en", - metadata=dataclass_config(exclude=lambda f: f is None), - ) - encoding: Optional[str] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - # container: Optional[str] = field( - # default=None, metadata=dataclass_config(exclude=lambda f: f is None) - # ) - sample_rate: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - bit_rate: Optional[int] = field( - default=None, metadata=dataclass_config(exclude=lambda f: f is None) - ) - - def __getitem__(self, key): - _dict = self.to_dict() - return _dict[key] - - def __setitem__(self, key, val): - self.__dict__[key] = val - - def __str__(self) -> str: - return self.to_json(indent=4) - - def check(self): - """ - Check the SpeakOptions for any missing or invalid values. - """ - logger = verboselogs.VerboseLogger(__name__) - logger.addHandler(logging.StreamHandler()) - prev = logger.level - logger.setLevel(verboselogs.ERROR) - - # no op at the moment - - logger.setLevel(prev) - - return True diff --git a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/response.py b/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/response.py deleted file mode 100644 index a5efc4e3..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak/v1/websocket/response.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - - -from dataclasses import dataclass - -from ....common import ( - BaseResponse, - OpenResponse, - CloseResponse, - ErrorResponse, - UnhandledResponse, -) - - -# Speak Response Types: - - -@dataclass -class MetadataResponse(BaseResponse): - """ - Metadata object - """ - - type: str = "" - request_id: str = "" - - -@dataclass -class FlushedResponse(BaseResponse): - """ - Flushed Message from the Deepgram Platform - """ - - type: str = "" - sequence_id: int = 0 - - -@dataclass -class ClearedResponse(BaseResponse): - """ - Cleared object - """ - - type: str = "" - sequence_id: int = 0 - - -@dataclass -class WarningResponse(BaseResponse): - """ - Warning Message from the Deepgram Platform - """ - - warn_code: str = "" - warn_msg: str = "" - type: str = "" diff --git a/venv/Lib/site-packages/deepgram/clients/speak_router.py b/venv/Lib/site-packages/deepgram/clients/speak_router.py deleted file mode 100644 index 7290ed48..00000000 --- a/venv/Lib/site-packages/deepgram/clients/speak_router.py +++ /dev/null @@ -1,171 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -from importlib import import_module -import logging -import deprecation # type: ignore - -from .. import __version__ -from .speak.v1.rest.client import SpeakRESTClient -from ..utils import verboselogs -from ..options import DeepgramClientOptions -from .errors import DeepgramModuleError - - -class SpeakRouter: - """ - This class provides a Speak Clients for making requests to the Deepgram API with various configuration options. - - Attributes: - config_options (DeepgramClientOptions): An optional configuration object specifying client options. - - Methods: - rest: (Preferred) Returns a Threaded REST Client instance for interacting with Deepgram's transcription services. - websocket: (Preferred) Returns an Threaded WebSocket Client instance for interacting with Deepgram's prerecorded transcription services. - - asyncrest: Returns an Async REST Client instance for interacting with Deepgram's transcription services. - asyncwebsocket: Returns an Async WebSocket Client instance for interacting with Deepgram's prerecorded transcription services. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - - def __init__(self, config: DeepgramClientOptions): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - - # when this is removed, remove --disable=W0622 from Makefile - # pylint: disable=unused-argument - @deprecation.deprecated( - deprecated_in="3.4.0", - removed_in="4.0.0", - current_version=__version__, - details="deepgram.speak.v1 is deprecated. Use deepgram.speak.rest or deepgram.speak.websocket instead.", - ) - def v(self, version: str = ""): - """ - DEPRECATED: deepgram.speak.v1 is deprecated. Use deepgram.speak.rest or deepgram.speak.websocket instead. - """ - return SpeakRESTClient(self._config) - - # pylint: enable=unused-argument - - @property - def rest(self): - """ - Returns a Threaded REST Client instance for interacting with Deepgram's prerecorded Text-to-Speech services. - """ - return self.Version(self._config, "rest") - - @property - def asyncrest(self): - """ - Returns an Async REST Client instance for interacting with Deepgram's prerecorded Text-to-Speech services. - """ - return self.Version(self._config, "asyncrest") - - @property - def websocket(self): - """ - Returns a Threaded WebSocket Client instance for interacting with Deepgram's Text-to-Speech services. - """ - return self.Version(self._config, "websocket") - - @property - def asyncwebsocket(self): - """ - Returns an Async WebSocket Client instance for interacting with Deepgram's Text-to-Speech services. - """ - return self.Version(self._config, "asyncwebsocket") - - # INTERNAL CLASSES - class Version: - """ - Represents a version of the Deepgram API. - """ - - _logger: verboselogs.VerboseLogger - _config: DeepgramClientOptions - _parent: str - - def __init__(self, config, parent: str): - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(config.verbose) - self._config = config - self._parent = parent - - # FUTURE VERSIONING: - # When v2 or v1.1beta1 or etc. This allows easy access to the latest version of the API. - # @property - # def latest(self): - # match self._parent: - # case "live": - # return LiveClient(self._config) - # case "prerecorded": - # return PreRecordedClient(self._config) - # case _: - # raise DeepgramModuleError("Invalid parent") - - def v(self, version: str = ""): - """ - Returns a specific version of the Deepgram API. - """ - self._logger.debug("Version.v ENTER") - self._logger.info("version: %s", version) - if len(version) == 0: - self._logger.error("version is empty") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Invalid module version") - - type = "" - file_name = "" - class_name = "" - match self._parent: - case "websocket": - type = "websocket" - file_name = "client" - class_name = "SpeakWebSocketClient" - case "asyncwebsocket": - type = "websocket" - file_name = "async_client" - class_name = "AsyncSpeakWebSocketClient" - case "rest": - type = "rest" - file_name = "client" - class_name = "SpeakRESTClient" - case "asyncrest": - type = "rest" - file_name = "async_client" - class_name = "AsyncSpeakRESTClient" - case _: - self._logger.error("parent unknown: %s", self._parent) - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Invalid parent type") - - # create class path - path = f"deepgram.clients.speak.v{version}.{type}.{file_name}" - self._logger.info("path: %s", path) - self._logger.info("class_name: %s", class_name) - - # import class - mod = import_module(path) - if mod is None: - self._logger.error("module path is None") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Unable to find package") - - my_class = getattr(mod, class_name) - if my_class is None: - self._logger.error("my_class is None") - self._logger.debug("Version.v LEAVE") - raise DeepgramModuleError("Unable to find class") - - # instantiate class - my_class = my_class(self._config) - self._logger.notice("Version.v succeeded") - self._logger.debug("Version.v LEAVE") - return my_class diff --git a/venv/Lib/site-packages/deepgram/errors.py b/venv/Lib/site-packages/deepgram/errors.py index 85f2128f..001d696d 100644 --- a/venv/Lib/site-packages/deepgram/errors.py +++ b/venv/Lib/site-packages/deepgram/errors.py @@ -1,16 +1,88 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT +from typing import Union, Optional +import websockets.exceptions +import urllib.error +import aiohttp +import uuid -class DeepgramApiKeyError(Exception): - """ - Base class for exceptions raised for a missing Deepgram API Key. +class DeepgramError(Exception): + pass + + +class DeepgramSetupError(DeepgramError, ValueError): + pass + + +class DeepgramApiError(DeepgramError): + """An error returned by the Deepgram API. - Attributes: - message (str): The error message describing the exception. + If the error was raised by an http client, the client's error message + is accessible via the `http_library_error` field. This may be useful + for handling different error codes, such as 429s or 503s. + + The `error` field is set to the API's error message (dict), if avilable. + Otherwise the `error` field is set to the parent exception's message (str). + + The `warning` field is set to the API's warning messages (list[str]), if available. + + The `request_id` field is set to the API's request ID, if available. """ + def __init__( + self, + *args: object, + http_library_error: Optional[ + Union[ + urllib.error.HTTPError, + urllib.error.URLError, + websockets.exceptions.InvalidHandshake, + aiohttp.ClientResponseError, + aiohttp.ClientError, + ] + ] = None, + ): + super().__init__(*args) + self.http_library_error = http_library_error + self.error: Union[str, dict] # If you change the type, change it in the docstring as well! + self.warnings: Optional[list[str]] = None # If you change the type, change it in the docstring as well! + self.request_id: Optional[uuid.UUID] = None + self.http_error_status: Optional[int] = None + + # Set the `error`, `warning`, and `request_id` fields from the incoming data object + if isinstance(args[0], dict) and "err_msg" in args[0]: + error_or_warning_data = args[0] + self.error = error_or_warning_data["err_msg"] + if "metadata" in error_or_warning_data and "warnings" in error_or_warning_data["metadata"]: + self.warnings = error_or_warning_data["metadata"]["warnings"] + elif "warnings" in error_or_warning_data: # Occurs when `raise_warnings_as_errors` is enabled + self.warnings = error_or_warning_data["warnings"] + if "metadata" in error_or_warning_data and "request_id" in error_or_warning_data["metadata"]: # Occurs when Deepgram returns a success response (for warnings) + self.request_id = uuid.UUID(error_or_warning_data["request_id"]) + elif "request_id" in error_or_warning_data: # Occurs when Deepgram returns a failed response + self.request_id = uuid.UUID(error_or_warning_data["request_id"]) + elif isinstance(args[0], str): + self.error = args[0] + else: + self.error = str(args[0]) + + # Set the error code from the underlying exception, if possible + if http_library_error is not None: + # Note: The following Exceptions do not have HTTP error codes: + # - urllib.error.URLError + # - websockets.exceptions.InvalidHandshake + # - aiohttp.ClientError + if isinstance(http_library_error, urllib.error.HTTPError): + self.http_error_status = http_library_error.code + elif isinstance(http_library_error, aiohttp.ClientResponseError): + self.http_error_status = http_library_error.status - def __init__(self, message: str): - super().__init__(message) - self.name = "DeepgramApiKeyError" + def __str__(self) -> str: + if self.request_id: + if self.warnings: + warning_string = f"\n\n{self.warnings}" + else: + warning_string = "" + if self.http_error_status: + return f"Request `{self.request_id}` returned {self.http_error_status}: {self.error}" + warning_string + else: + return f"Request `{self.request_id}` returned {self.error}" + warning_string + return super().__str__() diff --git a/venv/Lib/site-packages/deepgram/extra.py b/venv/Lib/site-packages/deepgram/extra.py new file mode 100644 index 00000000..0c8d1020 --- /dev/null +++ b/venv/Lib/site-packages/deepgram/extra.py @@ -0,0 +1,113 @@ +import warnings + +from ._types import PrerecordedTranscriptionResponse, Options +from ._enums import Caption + +class Extra: + """ + Extra post-processing to transform raw Deepgram responses to conveniently-formatted outputs. + """ + + def __init__(self, options: Options) -> None: + self.options = options + + """ + Helper function to transform a seconds mark into a formatted timestamp. + I.e. 6.564 -> 00:00:06,564 + + :param seconds:float + :param separator:str + :return Formatted timestamp string. + """ + def _format_timestamp(self, seconds: float, separator: str): + hours = int(seconds // 3600) + minutes = int((seconds % 3600) // 60) + secs = int(seconds % 60) + millis = int((seconds - int(seconds)) * 1000) + return f"{hours:02}:{minutes:02}:{secs:02}{separator}{millis:03}" + + """ + Transform a Deepgram PrerecordedTranscriptionResponse into a set of captions. + + :param response:PrerecordedTranscriptionResponse: Deepgram response. + :param format:Caption: The caption format enum (SRT or WebVTT). + :param line_length:int: Number of words in each caption line. + :return A string containing the response's captions. + """ + def _to_caption( + self, + response: PrerecordedTranscriptionResponse, + format: Caption, + line_length: int, + ): + if "utterances" in response["results"]: + utterances = response["results"]["utterances"] + else: + warnings.warn( + "Enabling the Utterances feature is strongly recommended for captioning. Utterances allow " + "captions to be delimited by pauses. Add request parameter `'utterances': True`." + ) + utterances = response["results"]["channels"][0]["alternatives"] + captions = [] + line_counter = 1 + if format is Caption.WEBVTT: + captions.append("WEBVTT") + for utt_index, utt in enumerate(utterances): + words = utterances[utt_index]["words"] + word_text = "punctuated_word" if "punctuated_word" in words[0] else "word" + for i in range(0, len(words), line_length): + start_time = words[i]["start"] + end_index = min(len(words) - 1, i + line_length - 1) + end_time = words[end_index]["end"] + text = " ".join([w[word_text] for w in words[i:end_index + 1]]) + separator = "," if format is Caption.SRT else '.' + prefix = "" if format is Caption.SRT else "- " + caption = ( + f"{line_counter}\n" + f"{self._format_timestamp(start_time, separator)} --> " + f"{self._format_timestamp(end_time, separator)}\n" + f"{prefix}{text}" + ) + captions.append(caption) + line_counter += 1 + return "\n\n".join(captions) + + """ + Transform a Deepgram PrerecordedTranscriptionResponse into SRT captions. + + :param response:PrerecordedTranscriptionResponse: Deepgram response. + :param line_length:int: Number of words in each caption line. Defaults to 8. + :param readable:bool: If the captions should be printed in a human-readable format, + instead of with newline characters. Defaults to True. + :return Nothing if readable=True, string of captions if readable=False. + """ + def to_SRT( + self, + response: PrerecordedTranscriptionResponse, + line_length: int=8, + readable: bool=True + ): + captions = self._to_caption(response, Caption.SRT, line_length) + if not readable: + return captions + print(captions) + + """ + Transform a Deepgram PrerecordedTranscriptionResponse into WebVTT captions. + + :param response:PrerecordedTranscriptionResponse: Deepgram response. + :param line_length:int: Number of words in each caption line. Defaults to 8. + :param readable:bool: If the captions should be printed in a human-readable format, + instead of with newline characters. Defaults to True. + :return Nothing if readable=True, string of captions if readable=False. + """ + def to_WebVTT( + self, + response: PrerecordedTranscriptionResponse, + line_length: int=8, + readable: bool=True + ): + captions = self._to_caption(response, Caption.WEBVTT, line_length) + if not readable: + return captions + print(captions) diff --git a/venv/Lib/site-packages/deepgram/invitations.py b/venv/Lib/site-packages/deepgram/invitations.py new file mode 100644 index 00000000..c98dbca4 --- /dev/null +++ b/venv/Lib/site-packages/deepgram/invitations.py @@ -0,0 +1,47 @@ +from ._types import Options, Invitation, InvitationResponse +from ._utils import _request + + +class Invitations: + _root = "/projects" + + def __init__(self, options: Options) -> None: + self.options = options + + async def list_invitations(self, project_id: str) -> Invitation: + """Returns all active invitations on a given project.""" + + return await _request(f'{self._root}/{project_id}/invites', self.options) + + + async def send_invitation(self, project_id: str, option: Invitation) -> InvitationResponse: + """Sends an invitation to a given email address to join a given project""" + + return await _request(f'{self._root}/{project_id}/invites', + self.options, + method='POST', + payload=option, + headers={'Content-Type': 'application/json'}) + + + async def remove_invitation(self, project_id: str, email: str) -> None: + """Removes the invitation of the specified email from the + specified project.""" + + await _request( + f'{self._root}/{project_id}/invites/{email}', + self.options, + method='DELETE' + ) + + async def leave_project(self, project_id: str) -> None: + """Removes the authenticated account from the specified project.""" + + await _request( + f'{self._root}/{project_id}/leave', + self.options, + method='DELETE' + ) + + + diff --git a/venv/Lib/site-packages/deepgram/keys.py b/venv/Lib/site-packages/deepgram/keys.py new file mode 100644 index 00000000..65b479e0 --- /dev/null +++ b/venv/Lib/site-packages/deepgram/keys.py @@ -0,0 +1,39 @@ +from typing import List +from ._types import Options, Key, KeyResponse +from ._utils import _request +import datetime + +class Keys: + _root = "/projects" + + def __init__(self, options: Options) -> None: + self.options = options + + async def list(self, project_id: str) -> KeyResponse: + """Retrieves all keys associated with the provided projectId.""" + return await _request( + f'{self._root}/{project_id}/keys', self.options + ) + + async def get(self, project_id: str, key: str) -> Key: + """Retrieves a specific key associated with the provided projectId.""" + return await _request( + f'{self._root}/{project_id}/keys/{key}', self.options + ) + + async def create( + self, project_id: str, comment: str, scopes: List[str], tags: List[str], expiration_date: datetime, time_to_live_in_seconds: int + ) -> Key: + """Creates an API key with the provided scopes.""" + return await _request( + f'{self._root}/{project_id}/keys', self.options, + method='POST', payload={'comment': comment, 'scopes': scopes, 'tags': tags, 'expiration_date': expiration_date, 'time_to_live_in_seconds': time_to_live_in_seconds}, + headers={'Content-Type': 'application/json'} + ) + + async def delete(self, project_id: str, key: str) -> None: + """Deletes an API key.""" + await _request( + f'{self._root}/{project_id}/keys/{key}', self.options, + method='DELETE' + ) diff --git a/venv/Lib/site-packages/deepgram/members.py b/venv/Lib/site-packages/deepgram/members.py new file mode 100644 index 00000000..a988a24a --- /dev/null +++ b/venv/Lib/site-packages/deepgram/members.py @@ -0,0 +1,24 @@ +from ._types import Options, Member +from ._utils import _request + + +class Members: + _root = "/projects" + + def __init__(self, options: Options) -> None: + self.options = options + + async def list_members(self, project_id: str) -> Member: + """Returns all member account objects for all of the accounts in + the specified project.""" + + return await _request(f'{self._root}/{project_id}/members', self.options) + + + async def remove_member(self, project_id: str, member_id: str) -> None: + """Removes the specified member account from the specified project.""" + + await _request( + f'{self._root}/{project_id}/members/{member_id}', self.options, + method='DELETE' + ) diff --git a/venv/Lib/site-packages/deepgram/options.py b/venv/Lib/site-packages/deepgram/options.py deleted file mode 100644 index ce43480a..00000000 --- a/venv/Lib/site-packages/deepgram/options.py +++ /dev/null @@ -1,245 +0,0 @@ -# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import sys -import re -import os -from typing import Dict, Optional -import logging -import numbers - -from deepgram import __version__ -from .utils import verboselogs -from .errors import DeepgramApiKeyError - - -class DeepgramClientOptions: # pylint: disable=too-many-instance-attributes - """ - Represents options for configuring a Deepgram client. - - This class allows you to customize various options for interacting with the Deepgram API. - - Attributes: - api_key: (Optional) A Deepgram API key used for authentication. Default uses the `DEEPGRAM_API_KEY` environment variable. - url: (Optional) The URL used to interact with production, On-prem, and other Deepgram environments. Defaults to `api.deepgram.com`. - verbose: (Optional) The logging level for the client. Defaults to `verboselogs.WARNING`. - headers: (Optional) Headers for initializing the client. - options: (Optional) Additional options for initializing the client. - """ - - _logger: verboselogs.VerboseLogger - _inspect_listen: bool = False - _inspect_speak: bool = False - - def __init__( - self, - api_key: str = "", - url: str = "", - verbose: int = verboselogs.WARNING, - headers: Optional[Dict] = None, - options: Optional[Dict] = None, - ): # pylint: disable=too-many-positional-arguments - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - - if api_key is None: - api_key = "" - - self.verbose = verbose - self.api_key = api_key - - if headers is None: - headers = {} - self._update_headers(headers=headers) - - if len(url) == 0: - url = "api.deepgram.com" - self.url = self._get_url(url) - - if options is None: - options = {} - self.options = options - - if self.is_auto_flush_reply_enabled(): - self._inspect_listen = True - if self.is_auto_flush_speak_enabled(): - self._inspect_speak = True - - def set_apikey(self, api_key: str): - """ - set_apikey: Sets the API key for the client. - - Args: - api_key: The Deepgram API key used for authentication. - """ - self.api_key = api_key - self._update_headers() - - def _get_url(self, url) -> str: - if not re.match(r"^https?://", url, re.IGNORECASE): - url = "https://" + url - return url.strip("/") - - def _update_headers(self, headers: Optional[Dict] = None): - self.headers = {} - self.headers["Accept"] = "application/json" - if self.api_key: - self.headers["Authorization"] = f"Token {self.api_key}" - elif "Authorization" in self.headers: - del self.headers["Authorization"] - self.headers[ - "User-Agent" - ] = f"@deepgram/sdk/{__version__} python/{sys.version_info[1]}.{sys.version_info[2]}" - # Overwrite / add any headers that were passed in - if headers: - self.headers.update(headers) - - def is_keep_alive_enabled(self) -> bool: - """ - is_keep_alive_enabled: Returns True if the client is configured to keep the connection alive. - """ - return self.options.get("keepalive", False) or self.options.get( - "keep_alive", False - ) - - def is_auto_flush_reply_enabled(self) -> bool: - """ - is_auto_flush_reply_enabled: Returns True if the client is configured to auto-flush for listen. - """ - auto_flush_reply_delta = float(self.options.get("auto_flush_reply_delta", 0)) - return ( - isinstance(auto_flush_reply_delta, numbers.Number) - and auto_flush_reply_delta > 0 - ) - - def is_auto_flush_speak_enabled(self) -> bool: - """ - is_auto_flush_speak_enabled: Returns True if the client is configured to auto-flush for speak. - """ - auto_flush_speak_delta = float(self.options.get("auto_flush_speak_delta", 0)) - return ( - isinstance(auto_flush_speak_delta, numbers.Number) - and auto_flush_speak_delta > 0 - ) - - def is_inspecting_listen(self) -> bool: - """ - is_inspecting_listen: Returns True if the client is inspecting listen messages. - """ - return self._inspect_listen - - def is_inspecting_speak(self) -> bool: - """ - is_inspecting_speak: Returns True if the client is inspecting speak messages. - """ - return self._inspect_speak - - -class ClientOptionsFromEnv( - DeepgramClientOptions -): # pylint: disable=too-many-branches, too-many-statements - """ - This class extends DeepgramClientOptions and will attempt to use environment variables first before defaults. - """ - - _logger: verboselogs.VerboseLogger - - def __init__( - self, - api_key: str = "", - url: str = "", - verbose: int = verboselogs.WARNING, - headers: Optional[Dict] = None, - options: Optional[Dict] = None, - ): # pylint: disable=too-many-positional-arguments - self._logger = verboselogs.VerboseLogger(__name__) - self._logger.addHandler(logging.StreamHandler()) - self._logger.setLevel(verboselogs.WARNING) # temporary set for setup - - if api_key is None: - api_key = "" - - if api_key == "": - api_key = os.getenv("DEEPGRAM_API_KEY", "") - if api_key == "": - self._logger.critical("Deepgram API KEY is not set") - raise DeepgramApiKeyError("Deepgram API KEY is not set") - - if url == "": - url = os.getenv("DEEPGRAM_HOST", "api.deepgram.com") - self._logger.notice(f"Deepgram host is set to {url}") - - if verbose == verboselogs.WARNING: - _loglevel = os.getenv("DEEPGRAM_LOGGING", "") - if _loglevel != "": - verbose = int(_loglevel) - if isinstance(verbose, str): - match verbose: - case "NOTSET": - self._logger.notice("Logging level is set to NOTSET") - verbose = verboselogs.NOTSET - case "SPAM": - self._logger.notice("Logging level is set to SPAM") - verbose = verboselogs.SPAM - case "DEBUG": - self._logger.notice("Logging level is set to DEBUG") - verbose = verboselogs.DEBUG - case "VERBOSE": - self._logger.notice("Logging level is set to VERBOSE") - verbose = verboselogs.VERBOSE - case "NOTICE": - self._logger.notice("Logging level is set to NOTICE") - verbose = verboselogs.NOTICE - case "WARNING": - self._logger.notice("Logging level is set to WARNING") - verbose = verboselogs.WARNING - case "SUCCESS": - self._logger.notice("Logging level is set to SUCCESS") - verbose = verboselogs.SUCCESS - case "ERROR": - self._logger.notice("Logging level is set to ERROR") - verbose = verboselogs.ERROR - case "CRITICAL": - self._logger.notice("Logging level is set to CRITICAL") - verbose = verboselogs.CRITICAL - case _: - self._logger.notice("Logging level is set to WARNING") - verbose = verboselogs.WARNING - self._logger.notice(f"Logging level is set to {verbose}") - - if headers is None: - headers = {} - for x in range(0, 20): - header = os.getenv(f"DEEPGRAM_HEADER_{x}", None) - if header is not None: - headers[header] = os.getenv(f"DEEPGRAM_HEADER_VALUE_{x}", None) - self._logger.debug( - "Deepgram header %s is set with value %s", - header, - headers[header], - ) - else: - break - if len(headers) == 0: - self._logger.notice("Deepgram headers are not set") - headers = None - - if options is None: - options = {} - for x in range(0, 20): - param = os.getenv(f"DEEPGRAM_PARAM_{x}", None) - if param is not None: - options[param] = os.getenv(f"DEEPGRAM_PARAM_VALUE_{x}", None) - self._logger.debug( - "Deepgram option %s is set with value %s", param, options[param] - ) - else: - break - if len(options) == 0: - self._logger.notice("Deepgram options are not set") - options = None - - super().__init__( - api_key=api_key, url=url, verbose=verbose, headers=headers, options=options - ) diff --git a/venv/Lib/site-packages/deepgram/projects.py b/venv/Lib/site-packages/deepgram/projects.py new file mode 100644 index 00000000..2d8de834 --- /dev/null +++ b/venv/Lib/site-packages/deepgram/projects.py @@ -0,0 +1,43 @@ +from ._types import Options, Project, ProjectResponse, UpdateResponse +from ._utils import _request + + +class Projects: + _root = "/projects" + + def __init__(self, options: Options) -> None: + self.options = options + + async def list(self) -> ProjectResponse: + """Returns all projects accessible by the API key.""" + return await _request(self._root, self.options) + + async def get(self, project_id: str) -> Project: + """Retrieves a specific project based on the provided projectId.""" + return await _request(f'{self._root}/{project_id}', self.options) + + async def create(self, name: str) -> Project: + """Creates a project.""" + return await _request( + self._root, self.options, + method='POST', payload={'name': name}, + headers={'Content-Type': 'application/json'} + ) + + + async def update(self, project_id: str, **payload) -> UpdateResponse: + """Updates a project's information.""" + + return await _request( + f'{self._root}/{project_id}', self.options, + method='PATCH', payload=payload, + headers={'Content-Type': 'application/json'} + ) + + + async def delete(self, project_id: str) -> None: + """Deletes a specific project based on the provided projectId.""" + await _request( + f'{self._root}/{project_id}', self.options, + method='DELETE' + ) diff --git a/venv/Lib/site-packages/deepgram/scopes.py b/venv/Lib/site-packages/deepgram/scopes.py new file mode 100644 index 00000000..75d107da --- /dev/null +++ b/venv/Lib/site-packages/deepgram/scopes.py @@ -0,0 +1,34 @@ +from ._types import Options, Scope, UpdateResponse +from ._utils import _request + + +class Scopes: + _root = "/projects" + + def __init__(self, options: Options) -> None: + self.options = options + + + async def get_scope(self, project_id: str, member_id: str) -> Scope: + """Returns the specified project scopes assigned + to the specified member.""" + + return await _request(f'{self._root}/{project_id}/members/{member_id}/scopes', self.options) + + + async def update_scope(self, project_id: str, member_id: str, scope: str) -> UpdateResponse: + """Updates the specified project scopes assigned to the + specified member.""" + + payload = {} + + if scope: + payload['scope'] = scope + + return await _request( + f'{self._root}/{project_id}/members/{member_id}/scopes', self.options, + method='PUT', payload=payload, + headers={'Content-Type': 'application/json'} + ) + + diff --git a/venv/Lib/site-packages/deepgram/transcription.py b/venv/Lib/site-packages/deepgram/transcription.py new file mode 100644 index 00000000..faff28a4 --- /dev/null +++ b/venv/Lib/site-packages/deepgram/transcription.py @@ -0,0 +1,391 @@ +from typing import Any, Union, Tuple, List, Dict, Awaitable, cast +import json +import asyncio +import inspect +from enum import Enum +from warnings import warn +import websockets.client +import websockets.exceptions +from ._types import (Options, PrerecordedOptions, LiveOptions, ToggleConfigOptions, + TranscriptionSource, PrerecordedTranscriptionResponse, + LiveTranscriptionResponse, Metadata, EventHandler) +from ._enums import LiveTranscriptionEvent +from ._utils import _request, _sync_request, _make_query_string, _socket_connect +from .errors import DeepgramApiError + + +class PrerecordedTranscription: + """This class provides an interface for doing transcription asynchronously on prerecorded audio files.""" + + _root = "/listen" + + def __init__(self, options: Options, + transcription_options: PrerecordedOptions, endpoint) -> None: + """ + This function initializes the options and transcription_options for the PrerecordedTranscription class. + + :param options:Options: Used to Pass in the options for the transcription. + :param transcription_options:PrerecordedOptions: Used to Specify the transcription options for a prerecorded audio file. + :return: Nothing. + + """ + self.options = options + if endpoint is not None: + self._root = endpoint + self.transcription_options = transcription_options + + async def __call__( + self, source: TranscriptionSource, timeout: float = None + ) -> PrerecordedTranscriptionResponse: + """ + The __call__ function is a special method that allows the class to be called + as a function. This is useful for creating instances of the class, where we can + call `PrerecordedTranscription()` and pass in arguments to set up an instance of + the class. For example: + + prerecorded_transcription = PrerecordedTranscription(...) + + :param source:TranscriptionSource: Used to Pass in the audio file. + :param timeout:float: (optional) The request timeout (if not set, defaults to `aiohttp`'s default timeout) + :return: A `PrerecordedTranscriptionResponse` object, which contains the transcription results. + + """ + + if 'buffer' in source and 'mimetype' not in source: + raise DeepgramApiError( + 'Mimetype must be provided if the source is bytes', + http_library_error=None, + ) + payload = cast( + Union[bytes, Dict], + source.get('buffer', {'url': source.get('url')}) + ) + content_type = cast(str, source.get('mimetype', 'application/json')) + return await _request( + f'{self._root}{_make_query_string(self.transcription_options)}', + self.options, method='POST', payload=payload, + headers={'Content-Type': content_type}, + timeout=timeout + ) + + +class SyncPrerecordedTranscription: + """This class provides an interface for doing transcription synchronously on prerecorded audio files.""" + + _root = "/listen" + + def __init__(self, options: Options, + transcription_options: PrerecordedOptions, endpoint) -> None: + """ + This function initializes the options and transcription_options for the PrerecordedTranscription class. + + :param options:Options: Used to Pass in the options for the transcription. + :param transcription_options:PrerecordedOptions: Used to Specify the transcription options for a prerecorded audio file. + :return: Nothing. + + """ + + self.options = options + if endpoint is not None: + self._root = endpoint + self.transcription_options = transcription_options + + def __call__( + self, source: TranscriptionSource, timeout: float = None + ) -> PrerecordedTranscriptionResponse: + + """ + The __call__ function is a special method that allows the class to be called + as a function. This is useful for creating instances of the class, where we can + call `SyncPrerecordedTranscription()` and pass in arguments to set up an instance of + the class. For example: + + sync_prerecorded_transcription = SyncPrerecordedTranscription(...) + + :param source:TranscriptionSource: Used to Pass in the audio file. + :param timeout:float: (optional) The request timeout, excluding the upload time of the audio file. + :return: A `prerecordedtranscriptionresponse` object, which contains the transcription results. + + """ + + if 'buffer' in source and 'mimetype' not in source: + raise DeepgramApiError( + 'Mimetype must be provided if the source is bytes', + http_library_error=None, + ) + payload = cast( + Union[bytes, Dict], + source.get('buffer', {'url': source.get('url')}) + ) + content_type = cast(str, source.get('mimetype', 'application/json')) + return _sync_request( + f'{self._root}{_make_query_string(self.transcription_options)}', + self.options, method='POST', payload=payload, + headers={'Content-Type': content_type}, + timeout=timeout + ) + + +class LiveTranscription: + """ + This class allows you to perform live transcription by connecting to Deepgram's Transcribe Streaming API. + It takes in options for the transcription job, and a callback function to handle events. + + """ + + _root = "/listen" + MESSAGE_TIMEOUT = 1.0 + + def __init__(self, options: Options, + transcription_options: LiveOptions, endpoint) -> None: + """ + The __init__ function is called when an instance of the class is created. + It initializes all of the attributes that are part of the object, and can be + accessed using "self." notation. In this case, it sets up a list to store any + messages received from Transcribe Streaming. + + :param options:Options: Used to Pass the options for the transcription job. + :param transcription_options:LiveOptions: Used to Pass in the configuration for the transcription job. + :return: None. + + """ + + self.options = options + if endpoint is not None: + self._root = endpoint + self.transcription_options = transcription_options + self.handlers: List[Tuple[LiveTranscriptionEvent, EventHandler]] = [] + # all received messages + self.received: List[Union[LiveTranscriptionResponse, Metadata]] = [] + # is the transcription job done? + self.done = False + self._socket = cast(websockets.client.WebSocketClientProtocol, None) + self._queue: asyncio.Queue[Tuple[bool, Any]] = asyncio.Queue() + + async def __call__(self) -> 'LiveTranscription': + """ + The __call__ function is a special method that allows the object to be called + as a function. In this case, it is used to connect the client and start the + transcription process. It returns itself after starting so that operations can + be chained. + + :return: The object itself. + + """ + self._socket = await _socket_connect( + f'{self._root}{_make_query_string(self.transcription_options)}', + self.options + ) + asyncio.create_task(self._start()) + return self + + async def _start(self) -> None: + """ + The _start function is the main function of the LiveTranscription class. + It is responsible for creating a websocket connection to Deepgram Transcribe, + and then listening for incoming messages from that socket. It also sends any + messages that are in its queue (which is populated by other functions). The + _start function will run until it receives a message with an empty transcription, + at which point it will close the socket and return. + + :return: None. + + """ + + asyncio.create_task(self._receiver()) + self._ping_handlers(LiveTranscriptionEvent.OPEN, self) + + while not self.done: + try: + incoming, body = await asyncio.wait_for(self._queue.get(), self.MESSAGE_TIMEOUT) + except asyncio.TimeoutError: + if self._socket.closed: + self.done = True + break + continue + + if incoming: + try: + parsed: Union[ + LiveTranscriptionResponse, Metadata + ] = json.loads(body) + # Stream-ending response is only a metadata object + self._ping_handlers( + LiveTranscriptionEvent.TRANSCRIPT_RECEIVED, + parsed + ) + self.received.append(parsed) + if 'sha256' in parsed: + self.done = True + except json.decoder.JSONDecodeError: + self._ping_handlers( + LiveTranscriptionEvent.ERROR, + f'Couldn\'t parse response JSON: {body}' + ) + else: + await self._socket.send(body) + self._ping_handlers( + LiveTranscriptionEvent.CLOSE, + self._socket.close_code + ) + + async def _receiver(self) -> None: + """ + The _receiver function is a coroutine that receives messages from the socket and puts them in a queue. + It is started by calling start_receiver() on an instance of AsyncSocket. It runs until the socket is closed, + or until an exception occurs. + + :return: None. + + """ + + while not self.done: + try: + body = await self._socket.recv() + self._queue.put_nowait((True, body)) + except websockets.exceptions.ConnectionClosedOK: + await self._queue.join() + self.done = True # socket closed, will terminate on next loop + + def _ping_handlers(self, event_type: LiveTranscriptionEvent, + body: Any) -> None: + """ + The _ping_handlers function is a callback that is called when the + transcription service sends a ping event. It calls all of the functions + in self.handlers, which are registered by calling add_ping_handler(). + + :param event_type:LiveTranscriptionEvent: Used to Determine if the function should be called. + :param body:Any: Used to Pass the event data to the handler function. + :return: The list of handlers for the event type. + + """ + + for handled_type, func in self.handlers: + if handled_type is event_type: + if inspect.iscoroutinefunction(func): + asyncio.create_task(cast(Awaitable[None], func(body))) + else: + func(body) + + # Public + + def register_handler(self, event_type: LiveTranscriptionEvent, + handler: EventHandler) -> None: + """Adds an event handler to the transcription client.""" + + self.handlers.append((event_type, handler)) + + # alias for incorrect method name in v0.1.x + def registerHandler(self, *args, **kwargs): + warn( + ( + "This method name is deprecated, " + "and will be removed in the future - " + "use `register_handler`." + ), + DeprecationWarning + ) + return self.register_handler(*args, **kwargs) + + def deregister_handler(self, event_type: LiveTranscriptionEvent, + handler: EventHandler) -> None: + """Removes an event handler from the transcription client.""" + + self.handlers.remove((event_type, handler)) + + # alias for incorrect method name in v0.1.x + def deregisterHandler(self, *args, **kwargs): + warn( + ( + "This method name is deprecated, " + "and will be removed in the future - " + "use `deregister_handler`." + ), + DeprecationWarning + ) + return self.deregister_handler(*args, **kwargs) + + def send(self, data: Union[bytes, str]) -> None: + """Sends data to the Deepgram endpoint.""" + + self._queue.put_nowait((False, data)) + + def configure(self, config: ToggleConfigOptions) -> None: + """Sends messages to configure transcription parameters mid-stream.""" + self._queue.put_nowait((False, json.dumps({ + "type": "Configure", + "processors": config + }))) + + def keep_alive(self) -> None: + """Keeps the connection open when no audio data is being sent.""" + self._queue.put_nowait((False, json.dumps({"type": "KeepAlive"}))) + + async def finish(self) -> None: + """Closes the connection to the Deepgram endpoint, + waiting until ASR is complete on all submitted data.""" + + self.send(json.dumps({"type": "CloseStream"})) # Set message for "data is finished sending" + while not self.done: + await asyncio.sleep(0.1) + + @property + def event(self) -> Enum: + """An enum representing different possible transcription events + that handlers can be registered against.""" + + return cast(Enum, LiveTranscriptionEvent) + + +class Transcription: + """ + This is the Transcription class. It provides two async methods, prerecorded and live, that + return transcription responses for audio files and live audio streams, respectively. + + """ + + def __init__(self, options: Options) -> None: + self.options = options + + async def prerecorded( + self, source: TranscriptionSource, + options: PrerecordedOptions = None, + endpoint = "/listen", + timeout: float = None, + **kwargs + ) -> PrerecordedTranscriptionResponse: + """Retrieves a transcription for an already-existing audio file, + local or web-hosted.""" + if options is None: + options = {} + full_options = cast(PrerecordedOptions, {**options, **kwargs}) + return await PrerecordedTranscription( + self.options, full_options, endpoint + )(source, timeout=timeout) + + def sync_prerecorded( + self, source: TranscriptionSource, + options: PrerecordedOptions = None, + endpoint = "/listen", + timeout: float = None, + **kwargs + ) -> PrerecordedTranscriptionResponse: + """Retrieves a transcription for an already-existing audio file, + local or web-hosted.""" + if options is None: + options = {} + full_options = cast(PrerecordedOptions, {**options, **kwargs}) + return SyncPrerecordedTranscription( + self.options, full_options, endpoint + )(source, timeout=timeout) + + async def live( + self, options: LiveOptions = None, endpoint = "/listen", **kwargs + ) -> LiveTranscription: + """Provides a client to send raw audio data to be transcribed.""" + if options is None: + options = {} + full_options = cast(LiveOptions, {**options, **kwargs}) + return await LiveTranscription( + self.options, full_options, endpoint + )() diff --git a/venv/Lib/site-packages/deepgram/usage.py b/venv/Lib/site-packages/deepgram/usage.py new file mode 100644 index 00000000..0c5736a6 --- /dev/null +++ b/venv/Lib/site-packages/deepgram/usage.py @@ -0,0 +1,54 @@ +from typing import cast +from ._types import (Options, UsageField, UsageFieldOptions, + UsageOptions, UsageRequest, UsageRequestList, + UsageRequestListOptions, UsageResponse) +from ._utils import _request, _make_query_string + + +class Usage: + _root = "/projects" + + def __init__(self, options: Options) -> None: + self.options = options + + async def list_requests( + self, project_id: str, options: UsageRequestListOptions = None + ) -> UsageRequestList: + """Retrieves a range of requests sent to a given project.""" + if options is None: + options = cast(UsageRequestListOptions, {}) + return await _request( + f'{self._root}/{project_id}/requests{_make_query_string(options)}', + self.options + ) + + async def get_request( + self, project_id: str, request_id: str + ) -> UsageRequest: + """Retrieves a single request sent to a given project.""" + return await _request( + f'{self._root}/{project_id}/requests/{request_id}', + self.options + ) + + async def get_usage( + self, project_id: str, options: UsageOptions = None + ) -> UsageResponse: + """Summarizes the usage for a given project.""" + if options is None: + options = cast(UsageOptions, {}) + return await _request( + f'{self._root}/{project_id}/usage{_make_query_string(options)}', + self.options + ) + + async def get_fields( + self, project_id: str, options: UsageFieldOptions = None + ) -> UsageField: + """Summarizes the options used in transcription for a given project.""" + if options is None: + options = cast(UsageFieldOptions, {}) + return await _request( + f'{self._root}/{project_id}/fields{_make_query_string(options)}', + self.options + ) diff --git a/venv/Lib/site-packages/deepgram/utils/__init__.py b/venv/Lib/site-packages/deepgram/utils/__init__.py deleted file mode 100644 index 21343d9d..00000000 --- a/venv/Lib/site-packages/deepgram/utils/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2024 Deepgram SDK contributors. All Rights Reserved. -# Use of this source code is governed by a MIT license that can be found in the LICENSE file. -# SPDX-License-Identifier: MIT - -import logging -from .verboselogs import VerboseLogger -from .verboselogs import ( - NOTICE, - SPAM, - SUCCESS, - VERBOSE, - WARNING, - ERROR, - FATAL, - CRITICAL, - INFO, - DEBUG, - NOTSET, -) diff --git a/venv/Lib/site-packages/deepgram/utils/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/deepgram/utils/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 9b6f058f3fcf7f421224791e8138f6a7be803329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 473 zcmXw#!D_-l5QcYSVxlqiQ2GG96g;%vODV({CDg`}sD&jUYL+yZHL@E8-=olH=&{ey zH(2PYCvT-51W(;<>l{A5f!+CsdAF=85Vd;iK0QMKK4o((8kJ&DiIZ_L_-=WqcYKvP7Gv_3aXGQsuB~Kq=st5LKXxY*wD6ew7(UJpaHox z!gQK5+{=>$(}u~*et+OOE?2_``=0CJ&~e-_zPPM7YR4le~F@JR25rLO`*8$=jruum(UTsd8&1P}qGJ2cZ2>w;q&=DQF)JYTb7+4edv| z^`KPDK>N|4)_oTTq5XKb9+Zkh(0(GQb>GF|2%$+DwNhIV*{TrHqFU)aEio&zrzLI; z_O{FrYv?wyhG8YGyFyUfipo;)&Gkt34dZVBZEC8;U8k2+3gZjezlkY8$r~KZ9>r+$H3k%Dd(XfIMH>T$=Ut5@7)=a0tU8CXhajDR(8Jy>r zZ^(t`U~iPcC~QsPe6eb|)iCqRhGprnGhH0*eAd@5`)t%&t6?iPxHc>UC!2INyWVt| ztGRX^w!e=en`KL^VU}i#1IsY?xH&D`cZy z!rz)V)NdPauy5i=WEWlO^Pf)Tm#%Zl_|lJOXBU^QP`=_i&81bxHtA%AHr%CE+E`th zvr9|dcIkztVXhbz%9kukn-yl%Ct9vu;}boHoX~ZPH;kqmv@nT{t zo{9=N0;y?i5N8bbWnPAKdlPD z;vkdjiENVLEySoI86w7ALJV^inufQUk`w?jIGc@hVaTKbfce}RCN*FO-YUub;*`VO z*yFIdIiI&c84i}(k$cf5-4(>1z(kn&v^oV^hT(q3X*e!K3?w38Rhc7s)2R2=Tc$~6 zjs#|u&LBtnTYi(s(-v`Iy2D}Pk}61Pb^@+ajtiqgwy@nBr{y%o;XLw$nLJ_r~M zcR36B#5QX71}4CL*v%>3qNeL3h?D$KGgyV^wRu{GgZps}CZ;h7>eDGCCCJ$t z__>SA$j%;27Qq?N=`dsh*TO;l!~--AlN%1J17EJgrHVJoEZ0=ih$ zrp#bwbsZP?HziFXcos4i1O74%^l2aKP>~$Yh0g=WnO(*=VFSSmfu(NrT{c4{;%drT zrt7eAZH)nm`bxJ}8}<#=W7t zLr;2CSG>}UkXhVdxJ^^XNQjg+Ghk3BgMj60?5CsO}a7%z&i(B<6wg2j! z6O0MqwCdomTm!ciM9G?r;$;uq8S}57O3^>iLoHfrRWMEBMJHqP>4pJ5XSY#fWOa)ahb0-4)xnWw*DT+kAvutXX)W5>Eqk!;~(DG zNx$_pbNJ4cd$V_Ee^-8JZhm_^lY4aOaVGa7N-}4^3g}x0p)bDl{&(!z832dj_c?nD z#aR%009KLyHb(m4#kN1-*uCH`?xat5!L=SvZ64arj6WKAoEb-O&wLfYtsDrh|Ka>) z;rsR1;hW&{I$;cHb@>kslry^ivzAfwdlI^CIi{`) z7GPsIJ&WR7DDc+I(kL=0@B%L`#X_t>Ooej5VPSfa9mDy!?4Bchp8SCX8Iq}vw?Ic{vwi8)E9?Ha-gFI<@8`D@gHSCL3#Vt z`J{6C#VARS+?%*N(Mdc_4&NKRJJ^YJ3+a(3>0{gJW1ZyF#L%zWzi4;VZYS{UiMuB{ y@t1L;4BaW;ukMhOvTWVIx This SDK only supports hosted usage of api.deepgram.com. + +* [Deepgram Python SDK](#deepgram-python-sdk) +* [Documentation](#documentation) +* [Getting an API Key](#getting-an-api-key) +* [Installation](#installation) +* [Examples](#examples) +* [Testing](#testing) +* [Configuration](#configuration) + * [Custom API Endpoint] [#custom-api-endpoint] +* [Transcription](#transcription) + * [Remote Files](#remote-files) + * [Local Files](#local-files) + * [Live Audio](#live-audio) + * [Parameters](#parameters) +* [Projects](#projects) + * [Get Projects](#get-projects) + * [Get Project](#get-project) + * [Update Project](#update-project) +* [Keys](#keys) + * [List Keys](#list-keys) + * [Get Key](#get-key) + * [Create Key](#create-key) + * [Delete Key](#delete-key) +* [Members](#members) + * [Get Members](#get-members) + * [Remove Member](#remove-member) +* [Scopes](#scopes) + * [Get Member Scopes](#get-member-scopes) + * [Update Scope](#update-scope) +* [Invitations](#invitations) + * [List Invites](#list-invites) + * [Send Invite](#send-invite) + * [Delete Invite](#delete-invite) + * [Leave Project](#leave-project) +* [Usage](#usage) + * [Get All Requests](#get-all-requests) + * [Get Request](#get-request) + * [Get Fields](#get-fields) +* [Billing](#billing) + * [Get All Balances](#get-all-balances) + * [Get Balance](#get-balance) +* [Development and Contributing](#development-and-contributing) +* [Getting Help](#getting-help) + +# Documentation + +You can learn more about the Deepgram API at [developers.deepgram.com](https://developers.deepgram.com/docs). + +# Getting an API Key + +🔑 To access the Deepgram API you will need a [free Deepgram API Key](https://console.deepgram.com/signup?jump=keys). + +# Installation + +```sh +pip install deepgram-sdk +``` +# Examples + +To quickly get started with examples for prerecorded and streaming, run the files in the example folder. See the README in that folder for more information on getting started. + +# Testing + +## Setup + +Run the following command to install `pytest` and `pytest-cov` as dev dependencies. + +``` +pip install -r requirements-dev.txt +``` + +## Run All Tests + +## Setup + +``` +pip install pytest +pip install pytest-cov +``` + +## Run All Tests + +``` +pytest --api-key tests/ +``` + +## Test Coverage Report + +``` +pytest --cov=deepgram --api-key tests/ +``` + +# Configuration + +To setup the configuration of the Deepgram Client, do the following: + +- Import the Deepgram client +- Create a Deepgram Client instance and pass in credentials to the constructor. + +```python +from deepgram import Deepgram + +DEEPGRAM_API_KEY = 'YOUR_API_KEY' +deepgram = Deepgram(DEEPGRAM_API_KEY) +``` + +## Custom API Endpoint + +In order to point the SDK at a different API environment (e.g., for on-prem deployments), you can pass in an object setting the `api_url` when initializing the Deepgram client. + +```py +dg_client = Deepgram({ + "api_key": DEEPGRAM_API_KEY, + "api_url": "http://localhost:8080/v1/listen" +}) +``` + +# Transcription + +## Remote Files + +```python +from deepgram import Deepgram +import asyncio, json + +DEEPGRAM_API_KEY = 'YOUR_API_KEY' +FILE_URL = 'https://static.deepgram.com/examples/interview_speech-analytics.wav' + +async def main(): + # Initializes the Deepgram SDK + deepgram = Deepgram(DEEPGRAM_API_KEY) + source = {'url': FILE_URL} + response = await asyncio.create_task( + deepgram.transcription.prerecorded(source, { + 'smart_format': True, + 'model': 'nova', + })) + print(json.dumps(response, indent=4)) + +asyncio.run(main()) +``` + +## Local Files + +```python +from deepgram import Deepgram +import json + +DEEPGRAM_API_KEY = 'YOUR_API_KEY' +PATH_TO_FILE = 'some/file.wav' + +def main(): + # Initializes the Deepgram SDK + deepgram = Deepgram(DEEPGRAM_API_KEY) + # Open the audio file + with open(PATH_TO_FILE, 'rb') as audio: + # ...or replace mimetype as appropriate + source = {'buffer': audio, 'mimetype': 'audio/wav'} + response = deepgram.transcription.sync_prerecorded(source, {'punctuate': True}) + print(json.dumps(response, indent=4)) + +main() +``` + +## Live Audio + +```python +from deepgram import Deepgram +import asyncio +import aiohttp + +# Your Deepgram API Key +DEEPGRAM_API_KEY = 'YOUR_API_KEY' + +# URL for the audio you would like to stream +URL = 'http://stream.live.vc.bbcmedia.co.uk/bbc_world_service' + +async def main(): + # Initialize the Deepgram SDK + deepgram = Deepgram(DEEPGRAM_API_KEY) + + # Create a websocket connection to Deepgram + # In this example, punctuation is turned on, interim results are turned off, and language is set to US English. + try: + deepgramLive = await deepgram.transcription.live({ 'punctuate': True, 'interim_results': False, 'language': 'en-US' }) + except Exception as e: + print(f'Could not open socket: {e}') + return + +# Listen for the connection to close + deepgramLive.registerHandler(deepgramLive.event.CLOSE, lambda c: print(f'Connection closed with code {c}.')) + + # Listen for any transcripts received from Deepgram and write them to the console + deepgramLive.registerHandler(deepgramLive.event.TRANSCRIPT_RECEIVED, print) + + # Listen for the connection to open and send streaming audio from the URL to Deepgram + async with aiohttp.ClientSession() as session: + async with session.get(URL) as audio: + while True: + data = await audio.content.readany() + deepgramLive.send(data) + + # If there's no data coming from the livestream then break out of the loop + if not data: + break + + # Indicate that we've finished sending data by sending the customary zero-byte message to the Deepgram streaming endpoint, and wait until we get back the final summary metadata object + await deepgramLive.finish() + +asyncio.run(main()) +``` + +## Parameters + +Query parameters like `punctuate` are added as part of the `TranscriptionOptions` `dict` in the `.prerecorded`/`.live` transcription call. +Multiple query parameters can be added similarly, and any dict will do - the types are provided for reference/convenience. + +```python +response = await dg_client.transcription.prerecorded(source, {'punctuate': True, 'keywords': ['first:5', 'second']}) +``` + +Depending on your preference, you can also add parameters as named arguments, instead. + +```python +response = await dg_client.transcription.prerecorded(source, punctuate=True, keywords=['first:5', 'second']) +``` + +# Projects + +The `Deepgram.projects` object provides access to manage projects associated with the API key you provided when instantiating the Deepgram client. + +## Get Projects + +### Get Projects Example Request + +```python +projects = await deepgram.projects.list() +``` + +### Get Projects Response + +```ts +{ + projects: [ + { + project_id: String, + name: String, + }, + ], +} +``` + +## Get Project + +Retrieves a project based on the provided project id. + +### Get a Project Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ----------------------------------------------- | +| project_id | String | A unique identifier for the project to retrieve | + +### Get a Project Example Request + +```python +project = await deepgram.projects.get(PROJECT_ID) +``` + +### Get a Project Response + +``` +{ + project_id: String, + name: String, +} +``` + +## Update Project + +Updates a project based on a provided project object. + +### Update Project Parameters + +| Parameter | Type | Description | +| --------- | ------ | ------------------------------------------------------------------------------- | +| project | Object | Object representing a project. Must contain `project_id` and `name` properties. | + + +### Update a Project Example Request + +```python +updateResponse = await deepgram.projects.update(project) +``` + +### Update a Project Response + +``` +{ + message: String; +} +``` + +# Keys + +The `Deepgram.keys` object provides access to manage keys associated with your projects. Every function provided will required a `PROJECT_ID` that your current has access to manage. + +## List Keys + +You can retrieve all keys for a given project using the `keys.list` function. + +### List Project API Keys Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ------------------------------------------------------------------- | +| project_id | String | A unique identifier for the project the API key will be created for | + +### List Project Keys Example Request + +```python +response = await deepgram.keys.list(PROJECT_ID) +``` + +### List Keys Response + +``` +{ + api_keys: [ + { + api_key_id: string, + comment: string, + created: string, + scopes: Array, + }, + ]; +} +``` + +## Create Key + +Create a new API key for a project using the `keys.create` function with a name for the key. + +### Create API Key Parameters + +| Parameter | Type | Description | +| --------------- | ------ | ------------------------------------------------------------------- | +| project_id | String | A unique identifier for the project the API key will be created for | +| comment_for_key | String | A comment to denote what the API key is for | +| scopes | Array | A permissions scopes of the key to create | + +### Create API Key Example Request + +```python +response = await deepgram.keys.create(PROJECT_ID, COMMENT_FOR_KEY, SCOPES) +``` + +### Create API Key Response + +``` +{ + api_key_id: string, + key: string, + comment: string, + created: string, + scopes: string[] +} +``` + +## Delete Key + +Delete an existing API key using the `keys.delete` method with project id and key id to delete. + +### Delete Key Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ------------------------------------------------------------------- | +| project_id | String | A unique identifier for the project the API key will be delete from | +| key_id | String | A unique identifier for the API key to delete | + +### Delete Key Example Request + +```python +await deepgram.keys.delete(PROJECT_ID, KEY_ID) +``` + +### Delete Key Response + +The `keys.delete` function returns a void. + +# Members + +The `deepgram.members` object provides access to the members endpoints of the Deepgram API. Each request is project based and will require a `project_id`. + +## Get Members + +You can retrieve all members on a given project using the `members.list_members` function. + +### Get Members Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ------------------------------------------------------------------ | +| project_id | String | A unique identifier for the project you wish to see the members of | + +### Get Members Example Request + +```python +response = await deepgram.members.list_members(PROJECT_ID) +``` + +### Get Members Response + +``` +{ + members: [ + { + member_id: string, + scopes: Array + email: string, + first_name: string, + last_name: string, + }, + ]; +} +``` + +## Remove Member + +You can remove a member from a given project using the `members.remove_member` function. + +### Remove Member Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ------------------------------------------------------------------ | +| project_id | String | A unique identifier for the project you wish to see the members of | +| member_id | String | A unique identifier for the member you wish to remove | + +### Remove Member Example Request + +```python +response = await deepgram.members.remove_member(PROJECT_ID, MEMBER_ID) +``` + +### Remove Member Response + +``` +{ + message: string; +} +``` +# Scopes + +The `deepgram.scopes` object provides access to the scopes endpoints of the Deepgram API. Each request is project based and will require a `project_id`. + +## Get Member Scopes + +You can retrieve all scopes of a member on a given project using the `scopes.get_scope` function. + +### Get Member Scopes Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ------------------------------------------------------------------------ | +| project_id | String | A unique identifier for the project you wish to see the member scopes of | +| member_id | String | A unique identifier for the member you wish to see member scopes of | + +### Get Member Scopes Example Request + +```python +response = await deepgram.scopes.get_scope(PROJECT_ID, MEMBER_ID) +``` + +### Get Member Scopes Response + +``` +{ + scopes: string[] +} +``` + +## Update Scope + +You can update the scope of a member on a given project using the `scopes.update_scope` function. + +### Update Scope Parameters + +| Parameter | Type | Description | +| ---------- | ------ | --------------------------------------------------------------------------- | +| project_id | String | A unique identifier for the project you wish to update the member scopes of | +| member_id | String | A unique identifier for the member you wish to update member scopes of | +| scopes | String | The scope you wish to update the member to | + +### Update Scope Example Request + +```python +response = await deepgram.scopes.update_scope(PROJECT_ID, MEMBER_ID, 'member') +``` + +### Update Scope Response + +``` +{ + message: string; +} +``` + +# Invitations + +The `deepgram.invitations` object provides access to the invites endpoints of the Deepgram API. Each request is project based and will require a `project_id`. + +## List Invites + +You can retrieve all active invitations on a given project using the `invitations.list_invitations` function. + +### List Invites Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ---------------------------------------------------------------------- | +| project_id | String | A unique identifier for the project you wish to see the invitations of | + +### List Invites Example Request + +```python +response = await deepgram.invitations.list_invitations(PROJECT_ID) +``` + +### List Invites Response + +``` +{ + members: [ + { + email: string, + scope: string, + }, + ]; +} +``` + +## Send Invite + +You can send an invitation to a given email address to join a given project using the `invitations.send_invitation` function. + +### Send Invite Parameters + +| Parameter | Type | Description | +| ---------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| project_id | String | A unique identifier for the project you wish to send an invitation from | +| option | Object | An object containing the email address of the person you wish to send an invite to, and the scope you want them to have in the project | + +### Send Invite Example Request + +```python +response = await deepgram.invitations.send_invitation(PROJECT_ID, { + email: 'example@email.com', + scope: 'member', +}) +``` + +### Send Invite Response + +``` +{ + message: string; +} +``` + +## Delete Invite + +Removes the invitation of the specified email from the specified project. + +### Delete Invite Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ---------------------------------------------------------------------- | +| project_id | String | A unique identifier for the project you wish to remove the invite from | +| email | String | The email address of the invitee | + +### Delete Invite Example Request + +```python +response = await deepgram.invitations.remove_invitation( + PROJECT_ID, + 'example@email.com' +) +``` + +### Delete Invite Response + +``` +{ + message: string; +} +``` + +## Leave Project + +Removes the authenticated account from the specified project. + +### Leave Project Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ----------------------------------------------------- | +| project_id | String | A unique identifier for the project you wish to leave | + +### Leave Project Example Request + +```python +response = await deepgram.invitations.leave_project(PROJECT_ID) +``` + +### Leave Project Response + +``` +{ + message: string; +} +``` + +# Usage + +The `deepgram.usage` object provides access to the usage endpoints of the Deepgram API. Each request is project based and will require a `project_id`. + +## Get All Requests + +Retrieves transcription requests for a project based on the provided options. + +### Get All Requests Parameters + +| Parameter | Type | Description | +| ---------- | ------ | --------------------------------------------------------- | +| project_id | String | A unique identifier for the project to retrieve usage for | +| options | Object | Parameters to filter requests. See below. | + +#### Get All Requests Options + +```python +{ + // The time to retrieve requests made since + // Example: "2020-01-01T00:00:00+00:00" + start?: String, + // The time to retrieve requests made until + // Example: "2021-01-01T00:00:00+00:00" + end?: String, + // Page of requests to return + // Defaults to 0 + page?: Number, + // Number of requests to return per page + // Defaults to 10. Maximum of 100 + limit?: Number, + // Filter by succeeded or failed requests + // By default, all requests are returned + status?: 'succeeded' | 'failed' +} +``` + +### Get All Requests Example Request + +```python +response = await deepgram.usage.list_requests(PROJECT_ID, { + 'limit': 10, + # other options are available +}) +``` + +### Get All Requests Response + +``` +{ + page: Number, + limit: Number, + requests?: [ + { + request_id: String; + created: String; + path: String; + accessor: String; + response?: { + details: { + usd: Number; + duration: Number; + total_audio: Number; + channels: Number; + streams: Number; + model: String; + method: String; + tags: String[]; + features: String[]; + config: { + multichannel?: Boolean; + interim_results?: Boolean; + punctuate?: Boolean; + ner?: Boolean; + utterances?: Boolean; + replace?: Boolean; + profanity_filter?: Boolean; + keywords?: Boolean; + diarize?: Boolean; + search?: Boolean; + redact?: Boolean; + alternatives?: Boolean; + numerals?: Boolean; + }; + } + }, || + { + message?: String; + }, + callback?: { + code: Number; + completed: String; + }, + }, + ]; +} +``` + +## Get Request + +Retrieves a specific transcription request for a project based on the provided `projectId` and `requestId`. + +### Get Request Parameters + +| Parameter | Type | Description | +| ---------- | ------ | --------------------------------------------------------- | +| project_id | String | A unique identifier for the project to retrieve usage for | +| request_id | String | Unique identifier of the request to retrieve | + +### Get Request Example Request + +```python +response = await deepgram.usage.get_request(PROJECT_ID, REQUEST_ID) +``` + +### Get Request Response + +``` +{ + request_id: String; + created: String; + path: String; + accessor: String; + response?: { + details: { + usd: Number; + duration: Number; + total_audio: Number; + channels: Number; + streams: Number; + model: String; + method: String; + tags: String[]; + features: String[]; + config: { + multichannel?: Boolean; + interim_results?: Boolean; + punctuate?: Boolean; + ner?: Boolean; + utterances?: Boolean; + replace?: Boolean; + profanity_filter?: Boolean; + keywords?: Boolean; + diarize?: Boolean; + search?: Boolean; + redact?: Boolean; + alternatives?: Boolean; + numerals?: Boolean; + }; + } + }, || + { + message?: String; + }, + callback?: { + code: Number; + completed: String; + } +} +``` + +## Get Usage + +Retrieves aggregated usage data for a project based on the provided options. + +### Get Usage Parameters + +| Parameter | Type | Description | +| ---------- | ------ | --------------------------------------------------------- | +| project_id | String | A unique identifier for the project to retrieve usage for | +| options | Object | Parameters to filter requests. See below. | + +#### Get Usage Options + +```python +{ + // The time to retrieve requests made since + // Example: "2020-01-01T00:00:00+00:00" + start?: String, + // The time to retrieve requests made until + // Example: "2021-01-01T00:00:00+00:00" + end?: String, + // Specific identifer for a request + accessor?: String, + // Array of tags used in requests + tag?: String[], + // Filter requests by method + method?: "sync" | "async" | "streaming", + // Filter requests by model used + model?: String, + // Filter only requests using multichannel feature + multichannel?: Boolean, + // Filter only requests using interim results feature + interim_results?: Boolean, + // Filter only requests using the punctuation feature + punctuate?: Boolean, + // Filter only requests using ner feature + ner?: Boolean, + // Filter only requests using utterances feature + utterances?: Boolean, + // Filter only requests using replace feature + replace?: Boolean, + // Filter only requests using profanity_filter feature + profanity_filter?: Boolean, + // Filter only requests using keywords feature + keywords?: Boolean, + // Filter only requests using diarization feature + diarize?: Boolean, + // Filter only requests using search feature + search?: Boolean, + // Filter only requests using redact feature + redact?: Boolean, + // Filter only requests using alternatives feature + alternatives?: Boolean, + // Filter only requests using numerals feature + numerals?: Boolean +} +``` + +### Get Usage Example Request + +```python +response = await deepgram.usage.get_usage(PROJECT_ID, { + 'start': '2020-01-01T00:00:00+00:00', + # other options are available +}) +``` + +### Get Usage Response + +``` +{ + start: String, + end: String, + resolution: { + units: String, + amount: Number + }; + results: [ + { + start: String, + end: String, + hours: Number, + requests: Number + } + ]; +} +``` + +## Get Fields + +Retrieves features used by the provided project_id based on the provided options. + +### Get Fields Parameters + +| Parameter | Type | Description | +| ---------- | ------ | --------------------------------------------------------------- | +| project_id | String | A unique identifier for the project to retrieve fields used for | +| options | Object | Parameters to filter requests. See below. | + +#### Get Fields Options + +```typescript +{ + // The time to retrieve requests made since + // Example: "2020-01-01T00:00:00+00:00" + start?: String, + // The time to retrieve requests made until + // Example: "2021-01-01T00:00:00+00:00" + end?: String +} +``` + +### Get Fields Example Request + +```python +response = await deepgram.usage.get_fields(PROJECT_ID, { + 'start': '2020-01-01T00:00:00+00:00', + # other options are available +}) +``` + +#### Get Fields Response + +``` +{ + tags: String[], + models: String[], + processing_methods: String[], + languages: String[], + features: String[] +} +``` + +# Billing + +The `deepgram.billing` object provides access to the balances endpoints of the Deepgram API. Each request is project based and will require a `project_id`. + + +## Get All Balances + +You can retrieve all balances on a given project using the `billing.list_balance` function. + +### Get All Balances Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ----------------------------------------------------------------------- | +| project_id | String | A unique identifier for the project you wish to see the balance info of | + +### Get All Balances Example Request + +```python +response = await deepgram.billing.list_balance(PROJECT_ID) +``` + +### Get All Balances Response + +``` +{ + balances: [ + { + balance_id: string + amount: number + units: string + purchase: string + } + ] +} +``` + +## Get Balance + +You can retrieve all balances on a given project using the `billing.get_balance` function. + +### Get Balance Parameters + +| Parameter | Type | Description | +| ---------- | ------ | ----------------------------------------------------------------------- | +| project_id | String | A unique identifier for the project you wish to see the balance info of | +| balance_id | String | A unique identifier for the balance you wish to see the balance info of | + +### Get Balance Example Request + +```python +const response = deepgram.billing.get_balance(PROJECT_ID, BALANCE_ID) +``` + +### Get Balance Response + +``` +{ + balance: { + balance_id: string; + amount: number; + units: string; + purchase: string; + } +} +``` + +# Development and Contributing + +Interested in contributing? We ❤️ pull requests! + +To make sure our community is safe for all, be sure to review and agree to our +[Code of Conduct](./CODE_OF_CONDUCT.md). Then see the +[Contribution](./CONTRIBUTING.md) guidelines for more information. + +# Getting Help + +We love to hear from you so if you have questions, comments or find a bug in the +project, let us know! You can either: + +- [Open an issue in this repository](https://github.com/deepgram/deepgram-python-sdk/issues/new) +- [Join the Deepgram Github Discussions Community](https://github.com/orgs/deepgram/discussions) +- [Join the Deepgram Discord Community](https://discord.gg/xWRaCDBtW4) + +[license]: LICENSE.txt + + diff --git a/venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/RECORD b/venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/RECORD new file mode 100644 index 00000000..f1221ab1 --- /dev/null +++ b/venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/RECORD @@ -0,0 +1,39 @@ +deepgram/__init__.py,sha256=yskGjCYkzt9DIG9BizXuqqQnTg3_IbFItHC8ew3b14c,2127 +deepgram/__pycache__/__init__.cpython-312.pyc,, +deepgram/__pycache__/_constants.cpython-312.pyc,, +deepgram/__pycache__/_enums.cpython-312.pyc,, +deepgram/__pycache__/_types.cpython-312.pyc,, +deepgram/__pycache__/_utils.cpython-312.pyc,, +deepgram/__pycache__/_version.cpython-312.pyc,, +deepgram/__pycache__/billing.cpython-312.pyc,, +deepgram/__pycache__/errors.cpython-312.pyc,, +deepgram/__pycache__/extra.cpython-312.pyc,, +deepgram/__pycache__/invitations.cpython-312.pyc,, +deepgram/__pycache__/keys.cpython-312.pyc,, +deepgram/__pycache__/members.cpython-312.pyc,, +deepgram/__pycache__/projects.cpython-312.pyc,, +deepgram/__pycache__/scopes.cpython-312.pyc,, +deepgram/__pycache__/transcription.cpython-312.pyc,, +deepgram/__pycache__/usage.cpython-312.pyc,, +deepgram/_constants.py,sha256=EEYmkv_-aNTvqIH8fca7P7mzItVM-uvVBqR0pZNpTn8,49 +deepgram/_enums.py,sha256=ZpgDwcV-EZAJ0RpkOLaTYTtg0TaE-CMSLWl3NLKAhrI,226 +deepgram/_types.py,sha256=oOHJsoaJKPcKt63moSg58PRB0zw7VnGZk_Lw1LxhKKY,9156 +deepgram/_utils.py,sha256=lH7qY8bjeSSOqHMeKSA_lova4WB_GfB3YOrsXTRangc,9663 +deepgram/_version.py,sha256=oVNlkZ967jzwDYde_JFnxJlmjNK42f0XhFKROknSgOw,24 +deepgram/billing.py,sha256=f9fbHcMTjhGnwbpdSDK6O_-FnsxqurMRHgo5pqxzYbI,708 +deepgram/errors.py,sha256=bmEkgYen2ZQW7EhpshqZQAu8UqyRFbLxNS2-lGjipn8,3904 +deepgram/extra.py,sha256=stQNvvilKNlQtqtjkFgOeKzlmwIiJB8wboACmKKa6vw,4529 +deepgram/invitations.py,sha256=ALzRwvoGKoZKRjq2dfST543lqfVlLQ-d3C3OCZbRuCg,1517 +deepgram/keys.py,sha256=MA1f6LBmZdD8T7qZOJ30CRcc_JqHVyg_obBhAC5BGU4,1509 +deepgram/members.py,sha256=TVdQYLmypquJ5cPwwNs3bXZF25o2FwjGCPKw2PMw4x8,745 +deepgram/projects.py,sha256=N3_iV9YfDfgqf0WWqHI_OZOzwK44VzvfQgo-4TrHsxQ,1443 +deepgram/scopes.py,sha256=z_LVWI2NgUfgJoAzlPHQeq4O-whbQffiib1gN5-bkgI,1003 +deepgram/transcription.py,sha256=xs-gdJnomVXS__6Cjqpwg7QdJWksobn2EYwRqLDHABY,15370 +deepgram/usage.py,sha256=7sRwuQe-QNYO0BSoDGRawfre3wk56sfb6RjNTO4B6qk,1901 +deepgram_sdk-2.12.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +deepgram_sdk-2.12.0.dist-info/LICENSE,sha256=mj1MHMQqj2_8WE8rl5d7-Q3i5zkcuqrHWuwQm5Ztr2A,1065 +deepgram_sdk-2.12.0.dist-info/METADATA,sha256=OLzyOWSof1gNBLIAecYbAcixd14xUc085Pkgfe4dX0o,27644 +deepgram_sdk-2.12.0.dist-info/RECORD,, +deepgram_sdk-2.12.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +deepgram_sdk-2.12.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +deepgram_sdk-2.12.0.dist-info/top_level.txt,sha256=i_v4rcE13LLCmMx7hzaEbCMVU8YYUpWNu6eNCU3_UQs,9 diff --git a/venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/REQUESTED b/venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/WHEEL b/venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/WHEEL new file mode 100644 index 00000000..ba48cbcf --- /dev/null +++ b/venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.41.3) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/top_level.txt b/venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/top_level.txt similarity index 100% rename from venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/top_level.txt rename to venv/Lib/site-packages/deepgram_sdk-2.12.0.dist-info/top_level.txt diff --git a/venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/METADATA b/venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/METADATA deleted file mode 100644 index 9d1bfbae..00000000 --- a/venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/METADATA +++ /dev/null @@ -1,844 +0,0 @@ -Metadata-Version: 2.4 -Name: deepgram-sdk -Version: 4.2.0 -Summary: The official Python SDK for the Deepgram automated speech recognition platform. -Home-page: https://github.com/deepgram/deepgram-python-sdk -Author: Deepgram -Author-email: devrel@deepgram.com -License: MIT -Keywords: deepgram,deepgram speech-to-text -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: 3 -Description-Content-Type: text/markdown -License-File: LICENSE -Requires-Dist: httpx>=0.25.2 -Requires-Dist: websockets>=12.0 -Requires-Dist: dataclasses-json>=0.6.3 -Requires-Dist: typing_extensions>=4.9.0 -Requires-Dist: aiohttp>=3.9.1 -Requires-Dist: aiofiles>=23.2.1 -Requires-Dist: aenum>=3.1.0 -Requires-Dist: deprecation>=2.1.0 -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: description-content-type -Dynamic: home-page -Dynamic: keywords -Dynamic: license -Dynamic: license-file -Dynamic: requires-dist -Dynamic: summary - -# Deepgram Python SDK - -[![Discord](https://dcbadge.vercel.app/api/server/xWRaCDBtW4?style=flat)](https://discord.gg/xWRaCDBtW4) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/deepgram/deepgram-python-sdk/CI)](https://github.com/deepgram/deepgram-python-sdk/actions/workflows/CI.yml) [![PyPI](https://img.shields.io/pypi/v/deepgram-sdk)](https://pypi.org/project/deepgram-sdk/) -[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg?style=flat-rounded)](./.github/CODE_OF_CONDUCT.md) - -Official Python SDK for [Deepgram](https://www.deepgram.com/). Power your apps with world-class speech and Language AI models. - -- [Documentation](#documentation) -- [Migrating from earlier versions](#migrating-from-earlier-versions) - - [V2 to V3](#v2-to-v3) - - [V3.*\ to V4](#v3-to-v4) -- [Requirements](#requirements) -- [Installation](#installation) -- [Initialization](#initialization) - - [Getting an API Key](#getting-an-api-key) -- [Pre-Recorded (Synchronous)](#pre-recorded-synchronous) - - [Remote Files (Synchronous)](#remote-files-synchronous) - - [Local Files (Synchronous)](#local-files-synchronous) -- [Pre-Recorded (Asynchronous / Callbacks)](#pre-recorded-asynchronous--callbacks) - - [Remote Files (Asynchronous)](#remote-files-asynchronous) - - [Local Files (Asynchronous)](#local-files-asynchronous) -- [Streaming Audio](#streaming-audio) -- [Transcribing to Captions](#transcribing-to-captions) -- [Voice Agent](#voice-agent) -- [Text to Speech REST](#text-to-speech-rest) -- [Text to Speech Streaming](#text-to-speech-streaming) -- [Text Intelligence](#text-intelligence) -- [Authentication](#authentication) - - [Get Token Details](#get-token-details) - - [Grant Token](#grant-token) -- [Projects](#projects) - - [Get Projects](#get-projects) - - [Get Project](#get-project) - - [Update Project](#update-project) - - [Delete Project](#delete-project) -- [Keys](#keys) - - [List Keys](#list-keys) - - [Get Key](#get-key) - - [Create Key](#create-key) - - [Delete Key](#delete-key) -- [Members](#members) - - [Get Members](#get-members) - - [Remove Member](#remove-member) -- [Scopes](#scopes) - - [Get Member Scopes](#get-member-scopes) - - [Update Scope](#update-scope) -- [Invitations](#invitations) - - [List Invites](#list-invites) - - [Send Invite](#send-invite) - - [Delete Invite](#delete-invite) - - [Leave Project](#leave-project) -- [Usage](#usage) - - [Get All Requests](#get-all-requests) - - [Get Request](#get-request) - - [Summarize Usage](#summarize-usage) - - [Get Fields](#get-fields) -- [Billing](#billing) - - [Get All Balances](#get-all-balances) - - [Get Balance](#get-balance) -- [Models](#models) - - [Get All Project Models](#get-all-project-models) - - [Get Model](#get-model) -- [On-Prem APIs](#on-prem-apis) - - [List On-Prem credentials](#list-on-prem-credentials) - - [Get On-Prem credentials](#get-on-prem-credentials) - - [Create On-Prem credentials](#create-on-prem-credentials) - - [Delete On-Prem credentials](#delete-on-prem-credentials) -- [Logging](#logging) -- [Backwards Compatibility](#backwards-compatibility) -- [Development and Contributing](#development-and-contributing) -- [Getting Help](#getting-help) - -## Documentation - -You can learn more about the Deepgram API at [developers.deepgram.com](https://developers.deepgram.com/docs). - -## Migrating from earlier versions - -### V2 to V3 - -We have published [a migration guide on our docs](https://developers.deepgram.com/sdks/python-sdk/v2-to-v3-migration), showing how to move from v2 to v3. - -### V3.\* to V4 - -The Voice Agent interfaces have been updated to use the new Voice Agent V1 API. Please refer to our [Documentation](https://developers.deepgram.com/docs/voice-agent-v1-migration) on Migration to new V1 Agent API. - -## Requirements - -[Python](https://www.python.org/downloads/) (version ^3.10) - -## Installation - -To install the latest version available: - -```sh -pip install deepgram-sdk -``` - -## Initialization - -All of the examples below will require `DeepgramClient`. - -```python -from deepgram import DeepgramClient - -# Initialize the client -deepgram = DeepgramClient("YOUR_API_KEY") # Replace with your API key -``` - -### Getting an API Key - -🔑 To access the Deepgram API you will need a [free Deepgram API Key](https://console.deepgram.com/signup?jump=keys). - -## Pre-Recorded (Synchronous) - -### Remote Files (Synchronous) - -Transcribe audio from a URL. - -```python - -from deepgram import PrerecordedOptions - -response = deepgram.listen.rest.v("1").transcribe_url( - source={"url": "https://dpgr.am/spacewalk.wav"}, - options=PrerecordedOptions(model="nova-3") # Apply other options -) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/speech-to-text-api/listen). - -[See the Example for more info](./examples/speech-to-text/rest/sync/url/main.py). - -### Local Files (Synchronous) - -Transcribe audio from a file. - -```python -from deepgram import PrerecordedOptions - -response = deepgram.listen.rest.v("1").transcribe_file( - source=open("path/to/your/audio.wav", "rb"), - options=PrerecordedOptions(model="nova-3") # Apply other options -) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/speech-to-text-api/listen). - -[See the Example for more info](./examples/speech-to-text/rest/sync/file/main.py). - -## Pre-Recorded (Asynchronous / Callbacks) - -### Remote Files (Asynchronous) - -Transcribe audio from a URL. - -```python -from deepgram import PrerecordedOptions - -response = deepgram.listen.rest.v("1").transcribe_url_async( - source={"url": "https://dpgr.am/spacewalk.wav"}, - callback_url="https://your-callback-url.com/webhook", - options=PrerecordedOptions(model="nova-3") # Apply other options -) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/speech-to-text-api/listen). - -[See the Example for more info](./examples/speech-to-text/rest/async/url/main.py). - -### Local Files (Asynchronous) - -Transcribe audio from a file. - -```python -from deepgram import PrerecordedOptions - -response = deepgram.listen.rest.v("1").transcribe_file_async( - source=open("path/to/your/audio.wav", "rb"), - callback_url="https://your-callback-url.com/webhook", - options=PrerecordedOptions(model="nova-3") # Apply other options -) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/speech-to-text-api/listen). - -[See the Example for more info](./examples/speech-to-text/rest/async/file/main.py). - -## Streaming Audio - -Transcribe streaming audio. - -```python -from deepgram import LiveOptions, LiveTranscriptionEvents - -# Create a websocket connection -connection = deepgram.listen.websocket.v("1") - -# Handle transcription events -@connection.on(LiveTranscriptionEvents.Transcript) -def handle_transcript(result): - print(result.channel.alternatives[0].transcript) - -# Start connection with streaming options -connection.start(LiveOptions(model="nova-3", language="en-US")) - -# Send audio data -connection.send(open("path/to/your/audio.wav", "rb").read()) - -# Close when done -connection.finish() -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/streaming-api). - -[See the Examples for more info](./examples/speech-to-text/websocket/). - -## Transcribing to Captions - -Transcribe audio to captions. - -### WebVTT - -```python -from deepgram_captions import DeepgramConverter, webvtt - -transcription = DeepgramConverter(dg_response) -captions = webvtt(transcription) -``` - -### SRT - -```python -from deepgram_captions import DeepgramConverter, srt - -transcription = DeepgramConverter(dg_response) -captions = srt(transcription) -``` - -[See our stand alone captions library for more information.](https://github.com/deepgram/deepgram-python-captions). - -## Voice Agent - -Configure a Voice Agent. - -```python -from deepgram import ( - SettingsOptions -) - -# Create websocket connection -connection = deepgram.agent.websocket.v("1") - -# Configure agent settings -options = SettingsOptions() -options.language = "en" -options.agent.think.provider.type = "open_ai" -options.agent.think.provider.model = "gpt-4o-mini" -options.agent.think.prompt = "You are a helpful AI assistant." -options.agent.listen.provider.type = "deepgram" -options.agent.listen.provider.model = "nova-3" -options.agent.speak.provider.type = "deepgram" -options.agent.speak.provider.model ="aura-2-thalia-en" - -options.greeting = "Hello, I'm your AI assistant." - -# Start the connection -connection.start(options) - -# Close the connection -connection.finish() -``` - -This example demonstrates: - -- Setting up a WebSocket connection -- Configuring the agent with speech, language, and audio settings -- Handling various agent events (speech, transcripts, audio) -- Sending audio data and keeping the connection alive - -For a complete implementation, you would need to: - -1. Add your audio input source (e.g., microphone) -2. Implement audio playback for the agent's responses -3. Handle any function calls if your agent uses them -4. Add proper error handling and connection management - -[See our API reference for more info](https://developers.deepgram.com/reference/voice-agent-api/agent). - -[See the Examples for more info](./examples/agent/). - -## Text to Speech REST - -Convert text into speech using the REST API. - -```python -from deepgram import SpeakOptions - -# Configure speech options -options = SpeakOptions(model="aura-2-thalia-en") - -# Convert text to speech and save to file -response = deepgram.speak.rest.v("1").save( - "output.mp3", - {"text": "Hello world!"}, - options -) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/text-to-speech-api/speak). - -[See the Example for more info](./examples/text-to-speech/rest/). - -## Text to Speech Streaming - -Convert streaming text into speech using a Websocket. - -```python -from deepgram import ( - SpeakWSOptions, - SpeakWebSocketEvents -) - -# Create websocket connection -connection = deepgram.speak.websocket.v("1") - -# Handle audio data -@connection.on(SpeakWebSocketEvents.AudioData) - -# Configure streaming options -options = SpeakWSOptions( - model="aura-2-thalia-en", - encoding="linear16", - sample_rate=16000 -) - -# Start connection and send text -connection.start(options) -connection.send_text("Hello, this is a text to speech example.") -connection.flush() -connection.wait_for_complete() - -# Close when done -connection.finish() -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/text-to-speech-api/speak). - -[See the Examples for more info](./examples/text-to-speech/websocket/). - -## Text Intelligence - -Analyze text. - -```python -from deepgram import ReadOptions - -# Configure read options -options = ReadOptions( - model="nova-3", - language="en" -) - -# Process text for intelligence -response = deepgram.read.rest.v("1").process( - text="The quick brown fox jumps over the lazy dog.", - options=options -) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/text-intelligence-api/text-read). - -## Authentication - -### Get Token Details - -Retrieves the details of the current authentication token. - -```python -response = deepgram.manage.rest.v("1").get_token_details() -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/authentication). - -### Grant Token - -Creates a temporary token with a 30-second TTL. - -```python -response = deepgram.auth.v("1").grant_token() - -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/token-based-auth-api/grant-token). - -[See The Examples for more info](./examples/auth/) - -## Projects - -### Get Projects - -Returns all projects accessible by the API key. - -```python -response = deepgram.manage.v("1").get_projects() -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/projects/list). - -[See The Example for more info](./examples/manage/projects/main.py). - -### Get Project - -Retrieves a specific project based on the provided project_id. - -```python -response = deepgram.manage.v("1").get_project(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/projects/get). - -[See The Example for more info](./examples/manage/projects/main.py). - -### Update Project - -Update a project. - -```python -response = deepgram.manage.v("1").update_project(myProjectId, options) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/projects/update). - -[See The Example for more info](./examples/manage/projects/main.py). - -### Delete Project - -Delete a project. - -```python -response = deepgram.manage.v("1").delete_project(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/projects/delete). - -[See The Example for more info](./examples/manage/projects/main.py). - -## Keys - -### List Keys - -Retrieves all keys associated with the provided project_id. - -```python -response = deepgram.manage.v("1").get_keys(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/keys/list) - -[See The Example for more info](./examples/manage/keys/main.py). - -### Get Key - -Retrieves a specific key associated with the provided project_id. - -```python -response = deepgram.manage.v("1").get_key(myProjectId, myKeyId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/keys/get) - -[See The Example for more info](./examples/manage/keys/main.py). - -### Create Key - -Creates an API key with the provided scopes. - -```python - response = deepgram.manage.v("1").create_key(myProjectId, options) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/keys/create) - -[See The Example for more info](./examples/manage/keys/main.py). - -### Delete Key - -Deletes a specific key associated with the provided project_id. - -```python -response = deepgram.manage.v("1").delete_key(myProjectId, myKeyId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/keys/delete) - -[See The Example for more info](./examples/manage/keys/main.py). - -## Members - -### Get Members - -Retrieves account objects for all of the accounts in the specified project_id. - -```python -response = deepgram.manage.v("1").get_members(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/members/list). - -[See The Example for more info](./examples/manage/members/main.py). - -### Remove Member - -Removes member account for specified member_id. - -```python -response = deepgram.manage.v("1").remove_member(myProjectId, MemberId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/members/delete). - -[See The Example for more info](./examples/manage/members/main.py). - -## Scopes - -### Get Member Scopes - -Retrieves scopes of the specified member in the specified project. - -```python -response = deepgram.manage.v("1").get_member_scopes(myProjectId, memberId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/scopes/list). - -[See The Example for more info](./examples/manage/scopes/main.py). - -### Update Scope - -Updates the scope for the specified member in the specified project. - -```python -response = deepgram.manage.v("1").update_member_scope(myProjectId, memberId, options) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/scopes/update). - -[See The Example for more info](./examples/manage/scopes/main.py). - -## Invitations - -### List Invites - -Retrieves all invitations associated with the provided project_id. - -```python -response = deepgram.manage.v("1").get_invites(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/invitations/list). - -### Send Invite - -Sends an invitation to the provided email address. - -```python -response = deepgram.manage.v("1").send_invite(myProjectId, options) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/invitations/create). - -### Delete Invite - -Removes the specified invitation from the project. - -```python -response = deepgram.manage.v("1").delete_invite(myProjectId, email) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/invitations/delete). - -### Leave Project - -```python -response = deepgram.manage.v("1").leave_project(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/invitations/leave). - -## Usage - -### Get All Requests - -Retrieves all requests associated with the provided project_id based on the provided options. - -```python -response = deepgram.manage.v("1").get_usage_requests(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/usage/list-requests). - -### Get Request - -Retrieves a specific request associated with the provided project_id - -```python -response = deepgram.manage.v("1").get_usage_request(myProjectId, RequestId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/usage/get-request). - -### Get Fields - -Lists the features, models, tags, languages, and processing method used for requests in the specified project. - -```python -response = deepgram.manage.v("1").get_usage_fields(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/usage/list-fields). - -### Summarize Usage - -`Deprecated` Retrieves the usage for a specific project. Use Get Project Usage Breakdown for a more comprehensive usage summary. - -```python -response = deepgram.manage.v("1").get_usage_summary(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/usage/get). - -## Billing - -### Get All Balances - -Retrieves the list of balance info for the specified project. - -```python -response = deepgram.manage.v("1").get_balances(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/balances/list). - -### Get Balance - -Retrieves the balance info for the specified project and balance_id. - -```python -response = deepgram.manage.v("1").get_balance(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/balances/get). - -## Models - -### Get All Project Models - -Retrieves all models available for a given project. - -```python -response = deepgram.manage.v("1").get_project_models(myProjectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/projects/list-models). - -### Get Model - -Retrieves details of a specific model. - -```python -response = deepgram.manage.v("1").get_project_model(myProjectId, ModelId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/management-api/projects/get-model). - -## On-Prem APIs - -### List On-Prem credentials - -Lists sets of distribution credentials for the specified project. - -```python -response = deepgram.selfhosted.v("1").list_selfhosted_credentials(projectId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/self-hosted-api/list-credentials). - -### Get On-Prem credentials - -Returns a set of distribution credentials for the specified project. - -```python -response = deepgram.selfhosted.v("1").get_selfhosted_credentials(projectId, distributionCredentialsId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/self-hosted-api/get-credentials). - -### Create On-Prem credentials - -Creates a set of distribution credentials for the specified project. - -```python -response = deepgram.selfhosted.v("1").create_selfhosted_credentials(project_id, options) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/self-hosted-api/create-credentials). - -### Delete On-Prem credentials - -Deletes a set of distribution credentials for the specified project. - -```python -response = deepgram.selfhosted.v("1").delete_selfhosted_credentials(projectId, distributionCredentialId) -``` - -[See our API reference for more info](https://developers.deepgram.com/reference/self-hosted-api/delete-credentials). - -## Pinning Versions - -To ensure your application remains stable and reliable, we recommend using version pinning in your project. This is a best practice in Python development that helps prevent unexpected changes. You can pin to a major version (like `==4.*`) for a good balance of stability and updates, or to a specific version (like `==4.1.0`) for maximum stability. We've included some helpful resources about [version pinning](https://discuss.python.org/t/how-to-pin-a-package-to-a-specific-major-version-or-lower/17077) and [dependency management](https://www.easypost.com/dependency-pinning-guide) if you'd like to learn more. For a deeper understanding of how version numbers work, check out[semantic versioning](https://semver.org/). - -In a `requirements.txt` file, you can pin to a specific version like this: - -```sh -deepgram-sdk==4.1.0 -``` - -Or using pip: - -```sh -pip install deepgram-sdk==4.1.0 -``` - -## Logging - -This SDK provides logging as a means to troubleshoot and debug issues encountered. By default, this SDK will enable `Information` level messages and higher (ie `Warning`, `Error`, etc) when you initialize the library as follows: - -```python -deepgram: DeepgramClient = DeepgramClient() -``` - -To increase the logging output/verbosity for debug or troubleshooting purposes, you can set the `DEBUG` level but using this code: - -```python -config: DeepgramClientOptions = DeepgramClientOptions( - verbose=logging.DEBUG, -) -deepgram: DeepgramClient = DeepgramClient("", config) -``` - -## Testing - -### Daily and Unit Tests - -If you are looking to use, run, contribute or modify to the daily/unit tests, then you need to install the following dependencies: - -```bash -pip install -r requirements-dev.txt -``` - -### Daily Tests - -The daily tests invoke a series of checks against the actual/real API endpoint and save the results in the `tests/response_data` folder. This response data is updated nightly to reflect the latest response from the server. Running the daily tests does require a `DEEPGRAM_API_KEY` set in your environment variables. - -To run the Daily Tests: - -```bash -make daily-test -``` - -#### Unit Tests - -The unit tests invoke a series of checks against mock endpoints using the responses saved in `tests/response_data` from the daily tests. These tests are meant to simulate running against the endpoint without actually reaching out to the endpoint; running the unit tests does require a `DEEPGRAM_API_KEY` set in your environment variables, but you will not actually reach out to the server. - -```bash -make unit-test -``` - -## Backwards Compatibility - -We follow semantic versioning (semver) to ensure a smooth upgrade experience. Within a major version (like `4.*`), we will maintain backward compatibility so your code will continue to work without breaking changes. When we release a new major version (like moving from `3.*` to `4.*`), we may introduce breaking changes to improve the SDK. We'll always document these changes clearly in our release notes to help you upgrade smoothly. - -Older SDK versions will receive Priority 1 (P1) bug support only. Security issues, both in our code and dependencies, are promptly addressed. Significant bugs without clear workarounds are also given priority attention. - -## Development and Contributing - -Interested in contributing? We ❤️ pull requests! - -To make sure our community is safe for all, be sure to review and agree to our -[Code of Conduct](CODE_OF_CONDUCT.md). Then see the -[Contribution](CONTRIBUTING.md) guidelines for more information. - -In order to develop new features for the SDK itself, you first need to uninstall any previous installation of the `deepgram-sdk` and then install/pip the dependencies contained in the `requirements.txt` then instruct python (via pip) to use the SDK by installing it locally. - -From the root of the repo, that would entail: - -```bash -pip uninstall deepgram-sdk -pip install -r requirements.txt -pip install -e . -``` - -## Getting Help - -We love to hear from you so if you have questions, comments or find a bug in the -project, let us know! You can either: - -- [Open an issue in this repository](https://github.com/deepgram/deepgram-python-sdk/issues/new) -- [Join the Deepgram Github Discussions Community](https://github.com/orgs/deepgram/discussions) -- [Join the Deepgram Discord Community](https://discord.gg/xWRaCDBtW4) diff --git a/venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/RECORD b/venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/RECORD deleted file mode 100644 index 9dba23f3..00000000 --- a/venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/RECORD +++ /dev/null @@ -1,223 +0,0 @@ -deepgram/__init__.py,sha256=kln0NVvKBJ0ablYtWdSUqolZsln5YW5OaDoVy5sEOoo,7207 -deepgram/__pycache__/__init__.cpython-312.pyc,, -deepgram/__pycache__/client.cpython-312.pyc,, -deepgram/__pycache__/errors.cpython-312.pyc,, -deepgram/__pycache__/options.cpython-312.pyc,, -deepgram/audio/__init__.py,sha256=yluAOVzIdSqqsBtVQzxHSPURKfGAxtBLhGN2xmWq_uk,677 -deepgram/audio/__pycache__/__init__.cpython-312.pyc,, -deepgram/audio/microphone/__init__.py,sha256=4mlErQgfu8sj6AnDNiQGcauMoyPYLxz-UJXFkDkXkAU,329 -deepgram/audio/microphone/__pycache__/__init__.cpython-312.pyc,, -deepgram/audio/microphone/__pycache__/constants.cpython-312.pyc,, -deepgram/audio/microphone/__pycache__/errors.cpython-312.pyc,, -deepgram/audio/microphone/__pycache__/microphone.cpython-312.pyc,, -deepgram/audio/microphone/constants.py,sha256=3Nv655J7a48Q-HU35Ml2vak14vO5_Sd-6AxZ78lsxCc,326 -deepgram/audio/microphone/errors.py,sha256=cPcyWoHUdFCCDBORg6JCmCx5CjOj0pwy94fpjAg-4VY,656 -deepgram/audio/microphone/microphone.py,sha256=NII5KlUOuIcpP8S-M3Ijh2erfztuB-XxwdAgRQeIlDM,9545 -deepgram/audio/speaker/__init__.py,sha256=qpaZbGafC5Bv50yHbY_90T_KxIbBxCh-L9_7EMFEYbI,336 -deepgram/audio/speaker/__pycache__/__init__.cpython-312.pyc,, -deepgram/audio/speaker/__pycache__/constants.cpython-312.pyc,, -deepgram/audio/speaker/__pycache__/errors.cpython-312.pyc,, -deepgram/audio/speaker/__pycache__/speaker.cpython-312.pyc,, -deepgram/audio/speaker/constants.py,sha256=0I02aFd8mjPERmjIfywlok_-BkM_gohfyIy92OjwmZo,381 -deepgram/audio/speaker/errors.py,sha256=pBzH90zf9rMhK6xpjvyavYZH6-PdbjCY87fvsHynI2o,639 -deepgram/audio/speaker/speaker.py,sha256=1ZJwwLAQko-rBDqDPOUTBM60-T3RlzWtL7HepTntWwk,13707 -deepgram/client.py,sha256=X0tFjZGKF6t2oSgqOVy8BHQzyWnL86e87HZ5Gx6r07E,17515 -deepgram/clients/__init__.py,sha256=OGXeEMZDvLcyp1YSvILycwBux4c9d3-YlKJwmt4PGFg,6980 -deepgram/clients/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/__pycache__/agent_router.cpython-312.pyc,, -deepgram/clients/__pycache__/errors.cpython-312.pyc,, -deepgram/clients/__pycache__/listen_router.cpython-312.pyc,, -deepgram/clients/__pycache__/read_router.cpython-312.pyc,, -deepgram/clients/__pycache__/speak_router.cpython-312.pyc,, -deepgram/clients/agent/__init__.py,sha256=sQ2oa1XjOZJ2kP8Cj5mG56oGQHvFw8tOWR-vHNnFHo0,1121 -deepgram/clients/agent/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/agent/__pycache__/client.cpython-312.pyc,, -deepgram/clients/agent/__pycache__/enums.cpython-312.pyc,, -deepgram/clients/agent/client.py,sha256=u__QRG7SNmmbkaZKbVxphtkhhxOHDYSRCzXB0ZDe42E,3467 -deepgram/clients/agent/enums.py,sha256=PdoOHRSnuR0YhA7WmkEWR8_4Lxv_yGs79PBMOkZMcCk,1199 -deepgram/clients/agent/v1/__init__.py,sha256=Xdl40wxUU856qh1IgFOkEKv8K1K7kQx8JwLAKfDZoC0,1214 -deepgram/clients/agent/v1/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/agent/v1/websocket/__init__.py,sha256=Gy209uZBNcla0adx32rLUiLYyCIsUim08maXPMBz324,1095 -deepgram/clients/agent/v1/websocket/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/agent/v1/websocket/__pycache__/async_client.cpython-312.pyc,, -deepgram/clients/agent/v1/websocket/__pycache__/client.cpython-312.pyc,, -deepgram/clients/agent/v1/websocket/__pycache__/options.cpython-312.pyc,, -deepgram/clients/agent/v1/websocket/__pycache__/response.cpython-312.pyc,, -deepgram/clients/agent/v1/websocket/async_client.py,sha256=Z_dkLqqCb0Y4Erk5ckx2dEXgEgP1W7-qz0vWLQxU9t4,27925 -deepgram/clients/agent/v1/websocket/client.py,sha256=PowSm3ol2ROm5IsvAPMWIG4RqIK_kaSAP3PKCcXYrWY,26823 -deepgram/clients/agent/v1/websocket/options.py,sha256=Grt9JnraOJqKc-4KRVFqOrqEbP2l9RNmFEDRvHSGfuc,10672 -deepgram/clients/agent/v1/websocket/response.py,sha256=kHul80uAqOgWNkSstWeWij6hW-5KYqXWpSClhatQ6lY,2589 -deepgram/clients/agent_router.py,sha256=ODNOSmwa5LAu4I_4bRGP_1gDjPppiBiNePCOr-9QJEY,4812 -deepgram/clients/analyze/__init__.py,sha256=Y6_b6JT3v92zVD9r3C89YH9sLGewAfYTiLVRWdrLu1Q,867 -deepgram/clients/analyze/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/analyze/__pycache__/client.cpython-312.pyc,, -deepgram/clients/analyze/client.py,sha256=chknRcygzDL-yVM0Q8lJHi-jRFZIyntGZeZSSQe4JQs,2613 -deepgram/clients/analyze/v1/__init__.py,sha256=coTuK8O-5VQX4aRuTji7c3N8ILK0hoYAQsXe2hQPHNI,828 -deepgram/clients/analyze/v1/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/analyze/v1/__pycache__/async_client.cpython-312.pyc,, -deepgram/clients/analyze/v1/__pycache__/client.cpython-312.pyc,, -deepgram/clients/analyze/v1/__pycache__/helpers.cpython-312.pyc,, -deepgram/clients/analyze/v1/__pycache__/options.cpython-312.pyc,, -deepgram/clients/analyze/v1/__pycache__/response.cpython-312.pyc,, -deepgram/clients/analyze/v1/async_client.py,sha256=xWmmN_8WWVPTuaWeTX_RKaskq2ocV1FLgSgjiAmYyUk,13286 -deepgram/clients/analyze/v1/client.py,sha256=W6DlR2QaV4-opHSj6sYAepHbSh0H2Up4zRYHtKax4X4,13171 -deepgram/clients/analyze/v1/helpers.py,sha256=rXCvbu1wXZhXjTDGQx2dtomQdf4UMdzPFbGyFoOlxMQ,746 -deepgram/clients/analyze/v1/options.py,sha256=Yu9BQd1bQK1-X5lto2fBkLKKsnW8nxP3ql5YLV9S-0Q,2598 -deepgram/clients/analyze/v1/response.py,sha256=MIQV4e8u_h7Hfeioz4pObqcnwKLDHm6MnNT64NMXdwc,3816 -deepgram/clients/auth/__init__.py,sha256=f5ul6qUKYQNCHcLJzwEtda9WJMz46OJ0LHs_soP7gvg,318 -deepgram/clients/auth/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/auth/__pycache__/client.cpython-312.pyc,, -deepgram/clients/auth/client.py,sha256=7cE4C8qSBaV536t88YGK63KLuWKv-JR0zfsJzRxbVQs,541 -deepgram/clients/auth/v1/__init__.py,sha256=3wx1uwB2PaPNzp-rn2K7dGQzDsD_MxJYX_JsdUtTFmw,320 -deepgram/clients/auth/v1/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/auth/v1/__pycache__/async_client.cpython-312.pyc,, -deepgram/clients/auth/v1/__pycache__/client.cpython-312.pyc,, -deepgram/clients/auth/v1/__pycache__/response.cpython-312.pyc,, -deepgram/clients/auth/v1/async_client.py,sha256=wNzNHkft4056DzfoLZJQ2l_HiWI38dqrEmX4IK48kFc,1825 -deepgram/clients/auth/v1/client.py,sha256=1c_Luizqoo8VIyF4mQMGCLnEJjka73eZg29ldVMohXA,1806 -deepgram/clients/auth/v1/response.py,sha256=5f_Rar5oH12REj8oQ_hj1glqn91_9dIqjS1SAu8C0aQ,708 -deepgram/clients/common/__init__.py,sha256=i8ymuZHN6aw7cuVeox8C-9s5WaUFrwWjDLPEUsfPN1k,2213 -deepgram/clients/common/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/common/v1/__init__.py,sha256=bqz4wmjzWsxyC6cLBXxvmWNiqGpLfVySDyxdxDFXViM,1106 -deepgram/clients/common/v1/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/abstract_async_rest.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/abstract_async_websocket.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/abstract_sync_rest.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/abstract_sync_websocket.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/enums.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/errors.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/helpers.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/options.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/rest_response.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/shared_response.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/websocket_events.cpython-312.pyc,, -deepgram/clients/common/v1/__pycache__/websocket_response.cpython-312.pyc,, -deepgram/clients/common/v1/abstract_async_rest.py,sha256=4_jZuB1ETMja4DGg9BabA7Pr22W7SC3gb85xeB7QJRE,12927 -deepgram/clients/common/v1/abstract_async_websocket.py,sha256=568wodHQdtrRMleo5O4QM23ZCvrlJYBnO7LB29tQsyI,20841 -deepgram/clients/common/v1/abstract_sync_rest.py,sha256=IgM9cMLQJx-EMupb7AHNevSyt2MZcRwZx-u19xn3Sq8,12612 -deepgram/clients/common/v1/abstract_sync_websocket.py,sha256=4eQrz_Y5vWCvtUTwGu-p3TptSPPsdRi_1FVJmxK_gvs,20461 -deepgram/clients/common/v1/enums.py,sha256=f66HjY5EHg1y7QgT23in5_V1fnMA1GO2xZpQ9b6q3Ww,450 -deepgram/clients/common/v1/errors.py,sha256=BM9ZtJcE-hmgBApP7P58tI3BSdnP4I1AeKud4M3hLQ4,2344 -deepgram/clients/common/v1/helpers.py,sha256=lod5Nu1gZ1L-K_jGN9yN88YTRj5Y3HfEyMzP9xfbOUs,1939 -deepgram/clients/common/v1/options.py,sha256=_8y3CtSCSU3EOCT_TERZvA-I_YJwK5m6OLS6QX-DbGw,1749 -deepgram/clients/common/v1/rest_response.py,sha256=RTlkNlC01jjm3kJ1X6LnfmWEVZuUIEhyjVfAg2oNuFg,3918 -deepgram/clients/common/v1/shared_response.py,sha256=k0mh2KQMEblNUqlkNC5DVy2_BJkFKLg4pmPrcUah-Bw,2044 -deepgram/clients/common/v1/websocket_events.py,sha256=c-gRRVD5JPdA8xIBmd79xuzbKja-lB2QpqV8FDOg8g8,534 -deepgram/clients/common/v1/websocket_response.py,sha256=ohv01NuxptcAdBthdLIUeA7GHpJ5mnk61DgoiBhF8ho,1161 -deepgram/clients/errors.py,sha256=SeAaY9o_x0G2zfLvkf_99kvnCQM4XL6C55GNR7C3ELw,518 -deepgram/clients/listen/__init__.py,sha256=0qrpHWQOMfNDb4I3Dwzt_VoYFkPin_TDePMGpUFBsFU,1920 -deepgram/clients/listen/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/listen/__pycache__/client.cpython-312.pyc,, -deepgram/clients/listen/__pycache__/enums.cpython-312.pyc,, -deepgram/clients/listen/client.py,sha256=eEun_s4IQDXoqLHkYNpVgDTd6pmTzluvcJtlEHHNKxI,5794 -deepgram/clients/listen/enums.py,sha256=ylHcsr8gtAq69ijiHN47Q63HhpjT5zi7prtklslFk1E,721 -deepgram/clients/listen/v1/__init__.py,sha256=Lvy-nqWOj0wPBiXc14Qw1XBuZ4N3foE5lYaHuwnEVZo,2664 -deepgram/clients/listen/v1/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/listen/v1/rest/__init__.py,sha256=mYEjKwAZEipFFUybqVoHl7t7RBMCbnIrSS3P0FX-P5I,1175 -deepgram/clients/listen/v1/rest/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/listen/v1/rest/__pycache__/async_client.cpython-312.pyc,, -deepgram/clients/listen/v1/rest/__pycache__/client.cpython-312.pyc,, -deepgram/clients/listen/v1/rest/__pycache__/helpers.cpython-312.pyc,, -deepgram/clients/listen/v1/rest/__pycache__/options.cpython-312.pyc,, -deepgram/clients/listen/v1/rest/__pycache__/response.cpython-312.pyc,, -deepgram/clients/listen/v1/rest/async_client.py,sha256=PhLvHN5GLNDvRA9QkI4Vcl8_KeOO92dt8C9bUnb_yxM,13638 -deepgram/clients/listen/v1/rest/client.py,sha256=t4LOLyETj4hbNOL-rsXk0eVyOSGTgPl4WEwpX8VKa9g,13572 -deepgram/clients/listen/v1/rest/helpers.py,sha256=tNMcGIXnPeKOchi9HJ4nac9yLITJ9HG_j1A5gGqgJ-4,762 -deepgram/clients/listen/v1/rest/options.py,sha256=Uaj3fM4bbmoq6zQwrl-dPZ8Og0GId9VMOAfIlS2k8QA,6648 -deepgram/clients/listen/v1/rest/response.py,sha256=HHy7YOHLYGBzc4NIoXfd4bXqQ-ops0e1NZ-Rd9omqrA,14101 -deepgram/clients/listen/v1/websocket/__init__.py,sha256=1L1bcaKvO02RPiUWl9a49LEgQxh6lVccKAzeWzoXmis,819 -deepgram/clients/listen/v1/websocket/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/listen/v1/websocket/__pycache__/async_client.cpython-312.pyc,, -deepgram/clients/listen/v1/websocket/__pycache__/client.cpython-312.pyc,, -deepgram/clients/listen/v1/websocket/__pycache__/options.cpython-312.pyc,, -deepgram/clients/listen/v1/websocket/__pycache__/response.cpython-312.pyc,, -deepgram/clients/listen/v1/websocket/async_client.py,sha256=zedQHRFL0G7Sg9Gsan6hmB9dd85Fiq_bAMT_UjHfKnw,23125 -deepgram/clients/listen/v1/websocket/client.py,sha256=o80o7SzX2Byp7I-7uwfqTOJ7C5AP70xXCVUeWcc0bqY,22804 -deepgram/clients/listen/v1/websocket/options.py,sha256=Fo7prf7nek4Ktc2H8xHMvnoTwvJdJkIpIntrx5uaiAc,6081 -deepgram/clients/listen/v1/websocket/response.py,sha256=CfLejy3Io54rOz7XWll3GXgoS6J0f41lnU94xZLSe7w,5718 -deepgram/clients/listen_router.py,sha256=xJ_09tlG62tba7txruvFvGtmb3qs9Ep5Wfp_hxK1xdo,8376 -deepgram/clients/live/__init__.py,sha256=EvLKoa_ewpN8uojRPdNQ7yTnOMqnsxXHHAzDIw9U-Tg,572 -deepgram/clients/live/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/live/v1/__init__.py,sha256=lSyv1CfXfrV-67tn53Znfhw5AiZ1dRaJV7isw4pjPXk,591 -deepgram/clients/live/v1/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/live/v1/__pycache__/client.cpython-312.pyc,, -deepgram/clients/live/v1/__pycache__/enums.cpython-312.pyc,, -deepgram/clients/live/v1/client.py,sha256=sJB5YvCOtVrCVD_l8usrrZwxlavnXJgYj9pZqtArKnk,1504 -deepgram/clients/live/v1/enums.py,sha256=h3zbI22I9tqPgUVE-6V2X_OR00Cb4dfpiBJ9mRze-Hw,242 -deepgram/clients/manage/__init__.py,sha256=EhzJKuOT9QKk_s0dBKpsjQ4lwCvhhWaxlQdEvvkcsxQ,1104 -deepgram/clients/manage/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/manage/__pycache__/client.cpython-312.pyc,, -deepgram/clients/manage/client.py,sha256=gnosDmhpQKPNcG4kZgQ80e2Tk4FzwjVGm78MMa5LIvo,3759 -deepgram/clients/manage/v1/__init__.py,sha256=Ng6zQQFd0b-5aV3QdzGi_1Hz73SbhRpfKqAUHdRo2wk,1114 -deepgram/clients/manage/v1/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/manage/v1/__pycache__/async_client.cpython-312.pyc,, -deepgram/clients/manage/v1/__pycache__/client.cpython-312.pyc,, -deepgram/clients/manage/v1/__pycache__/options.cpython-312.pyc,, -deepgram/clients/manage/v1/__pycache__/response.cpython-312.pyc,, -deepgram/clients/manage/v1/async_client.py,sha256=OCSsO4akPc2yDjxuz7qJnpzJuorJxbskDLTnbkL2HIk,42360 -deepgram/clients/manage/v1/client.py,sha256=K2-kr9MIqVJMAAQfKXfNrSE07gnf_CFrcu7jbmFr8MA,42054 -deepgram/clients/manage/v1/options.py,sha256=5FNK7wtpvdpJ2cWbgrgWCcLg2X4oQlPvBBBEbHKhq2w,5070 -deepgram/clients/manage/v1/response.py,sha256=WZihXc_TkhGZ2GWC__6qJMd2wfYjXohQhv0reQawI1Y,16668 -deepgram/clients/prerecorded/__init__.py,sha256=98vyFGku8WhtUT-8LM7K55i8MNADteGB4KcdPh2hKm8,511 -deepgram/clients/prerecorded/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/prerecorded/v1/__init__.py,sha256=fbvUd_1tG8VJmf4isodXz60sBheH6R4-WWnEt_INtSo,531 -deepgram/clients/prerecorded/v1/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/prerecorded/v1/__pycache__/client.cpython-312.pyc,, -deepgram/clients/prerecorded/v1/__pycache__/errors.cpython-312.pyc,, -deepgram/clients/prerecorded/v1/client.py,sha256=rVHIZfcO2Q-Wu3hMAzx-3MEmpKMx-Y7EUD7SFMWD3J0,1303 -deepgram/clients/prerecorded/v1/errors.py,sha256=eKZ-swaEh0Zia7ZdbbPa_idKhPKmQSy-cQYhNuwVado,1044 -deepgram/clients/read_router.py,sha256=0fb6vvS1O0vDuKcE_ZNkAYYOQgzZsqgySD-Ba2c-6iM,4769 -deepgram/clients/selfhosted/__init__.py,sha256=RLUDITdO3MfNi93bl9SfUGmRcVUxhXOOJ2MoM9fTBlM,308 -deepgram/clients/selfhosted/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/selfhosted/__pycache__/client.cpython-312.pyc,, -deepgram/clients/selfhosted/client.py,sha256=6pGDktgr8dgGllX9EaVd6F2JF9woFFmDCMPj27F-Cio,666 -deepgram/clients/selfhosted/v1/__init__.py,sha256=rUUckO_Kt5dCLeRKzu908SNMzPdD0XVcyKxuOe6L6qU,281 -deepgram/clients/selfhosted/v1/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/selfhosted/v1/__pycache__/async_client.cpython-312.pyc,, -deepgram/clients/selfhosted/v1/__pycache__/client.cpython-312.pyc,, -deepgram/clients/selfhosted/v1/async_client.py,sha256=zqsYnxqFiY1biZ-4zTjpP6tGc6E5fl7Me7GsoHAZC1s,6354 -deepgram/clients/selfhosted/v1/client.py,sha256=GrjndD0UHOf8_Z3L08NSX6wVqjQlQ9KS6iTlWsoPhFI,6309 -deepgram/clients/speak/__init__.py,sha256=eLF6ntT7zVRJq2yVaEu7d0rUAdxVXb25xUNkry4pKWA,1101 -deepgram/clients/speak/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/speak/__pycache__/client.cpython-312.pyc,, -deepgram/clients/speak/__pycache__/enums.cpython-312.pyc,, -deepgram/clients/speak/client.py,sha256=y6lSNR_Gnl6kORjVU63jit2Wh_AddxunE0mZl42kv2w,2884 -deepgram/clients/speak/enums.py,sha256=P1dQfgpJgx3dbwlE39s-rX88tx3GNGiJyEew9X7cb2k,903 -deepgram/clients/speak/v1/__init__.py,sha256=IIu6A0cQkL39tAph2iktnqQKcr7OKroIQssnvNI_kek,1026 -deepgram/clients/speak/v1/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/speak/v1/rest/__init__.py,sha256=igYW2BarSlyY-EyqZjHYnbIwnoE4yxsbMOkP_G5e5HE,551 -deepgram/clients/speak/v1/rest/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/speak/v1/rest/__pycache__/async_client.cpython-312.pyc,, -deepgram/clients/speak/v1/rest/__pycache__/client.cpython-312.pyc,, -deepgram/clients/speak/v1/rest/__pycache__/helpers.cpython-312.pyc,, -deepgram/clients/speak/v1/rest/__pycache__/options.cpython-312.pyc,, -deepgram/clients/speak/v1/rest/__pycache__/response.cpython-312.pyc,, -deepgram/clients/speak/v1/rest/async_client.py,sha256=LL3ueO-wF6BJ6KgyQnRVmgD_2wCEg8JrLHCBChAus-g,10888 -deepgram/clients/speak/v1/rest/client.py,sha256=XrWG5JxdXFl58KjSDtJpXzfSoaiKYgiGlRMhMI7tshU,10729 -deepgram/clients/speak/v1/rest/helpers.py,sha256=SRAKIt9gysCDKV5eN37ZWXoj4LKawCL0uPRbk6y-aF4,566 -deepgram/clients/speak/v1/rest/options.py,sha256=YZ34ph48RFw7JBt3FePV-U9Q8gULXymC7mN12-96P9k,1872 -deepgram/clients/speak/v1/rest/response.py,sha256=caVeilf2yZHziquyH2GZkcescWsXzbyNwIssiZ8eM2I,1302 -deepgram/clients/speak/v1/websocket/__init__.py,sha256=ZScBs2NXEmXHVL2rRT7CYi-NF-Stx_J1LuvEjRQnCz8,580 -deepgram/clients/speak/v1/websocket/__pycache__/__init__.cpython-312.pyc,, -deepgram/clients/speak/v1/websocket/__pycache__/async_client.cpython-312.pyc,, -deepgram/clients/speak/v1/websocket/__pycache__/client.cpython-312.pyc,, -deepgram/clients/speak/v1/websocket/__pycache__/options.cpython-312.pyc,, -deepgram/clients/speak/v1/websocket/__pycache__/response.cpython-312.pyc,, -deepgram/clients/speak/v1/websocket/async_client.py,sha256=C___hgMRu5p1s0B2klv1YROKe1XXHSuJuA43B4WiMAE,27624 -deepgram/clients/speak/v1/websocket/client.py,sha256=sL3tbIgzkmhSnWmQ7YVSKAX5PMjz6LIr7GGihny5kLY,26454 -deepgram/clients/speak/v1/websocket/options.py,sha256=gkL-Nap2IVED2Pf-uqQfA7pym8oKp3kHYLLjwYAj4OA,1885 -deepgram/clients/speak/v1/websocket/response.py,sha256=bclXcz40jaRe7BhgSGApwA3LMtKVpZ62XZVE2G01IC4,977 -deepgram/clients/speak_router.py,sha256=hLw_sh258iwxw7X7AxgAuvzyJbjRV1K0F-OngKeFgCk,6561 -deepgram/errors.py,sha256=9J2DuCAv3Oc7XFwhxFJM5xGMdMOG5Ygojdy0sViCiSo,519 -deepgram/options.py,sha256=eTwy8j1Zl7YOiscOBjcGZEF_qnK4nTmV_lb-UznTPkI,9277 -deepgram/utils/__init__.py,sha256=LHLuOBMz5e_060rPaiVqoxUltqpJedLOOLRUkPC4XDo,404 -deepgram/utils/__pycache__/__init__.cpython-312.pyc,, -deepgram/utils/verboselogs/__init__.py,sha256=DSrWTO3FXiIVAxiY_gJMyJ8x81iZXe08QXU9OeeB7_0,5480 -deepgram/utils/verboselogs/__pycache__/__init__.cpython-312.pyc,, -deepgram_sdk-4.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -deepgram_sdk-4.2.0.dist-info/METADATA,sha256=ZTyo9WcPi8akUNFMTX14yxEtQYtG3mvF2R1OMfxGO90,25652 -deepgram_sdk-4.2.0.dist-info/RECORD,, -deepgram_sdk-4.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -deepgram_sdk-4.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 -deepgram_sdk-4.2.0.dist-info/licenses/LICENSE,sha256=mj1MHMQqj2_8WE8rl5d7-Q3i5zkcuqrHWuwQm5Ztr2A,1065 -deepgram_sdk-4.2.0.dist-info/top_level.txt,sha256=i_v4rcE13LLCmMx7hzaEbCMVU8YYUpWNu6eNCU3_UQs,9 diff --git a/venv/Lib/site-packages/distro/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/distro/__pycache__/__init__.cpython-312.pyc index 1ff27ed0e9b7d2f60f98811ed5bddd9a6caab12a..4cc74270e783bf93222728ab8aa9e9206203150f 100644 GIT binary patch delta 29 jcmZ3>zLuTuG%qg~0}v!Kd1P?2Y~*ubW{jEa&m0E;UGfGh delta 29 jcmZ3>zLuTuG%qg~0}v>#cgwiSyphj=nNfeTKXV)aY=s9g diff --git a/venv/Lib/site-packages/distro/__pycache__/distro.cpython-312.pyc b/venv/Lib/site-packages/distro/__pycache__/distro.cpython-312.pyc index 1754cb966cc2592fb88506530c8ab07fd60bc6f5..bdea3a8df110332d81d2d2607285956e9e8a50e9 100644 GIT binary patch delta 32 mcmX@Kg!#}CX1>$Byj%=GkjUhbG4a?&K0^-1n9U9xOs4>#AqiFh delta 32 mcmX@Kg!#}CX1>$Byj%=Gpt#;GL+s#2K0^*h{ml*>Os4>!3JDYd diff --git a/venv/Lib/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc index 84170da869f38e4ce446819a67df36c6d3b9dffb..669d5b85f58db52c285e3b29351501385b73166e 100644 GIT binary patch delta 29 jcmbQhJAs$?G%qg~0}v!Kd1Tmb#jM*&1Tq^(oW|;<^ delta 29 jcmbQKK2x3dG%qg~0}u$WcgxV($jisfsJ~f;xmExGW~v5v diff --git a/venv/Lib/site-packages/fastapi-0.115.14.dist-info/INSTALLER b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/fastapi-0.115.14.dist-info/METADATA b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/METADATA new file mode 100644 index 00000000..b67c559a --- /dev/null +++ b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/METADATA @@ -0,0 +1,563 @@ +Metadata-Version: 2.1 +Name: fastapi +Version: 0.115.14 +Summary: FastAPI framework, high performance, easy to learn, fast to code, ready for production +Author-Email: =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= +Classifier: Intended Audience :: Information Technology +Classifier: Intended Audience :: System Administrators +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python +Classifier: Topic :: Internet +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Software Development +Classifier: Typing :: Typed +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: Framework :: AsyncIO +Classifier: Framework :: FastAPI +Classifier: Framework :: Pydantic +Classifier: Framework :: Pydantic :: 1 +Classifier: Framework :: Pydantic :: 2 +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers +Classifier: Topic :: Internet :: WWW/HTTP +Project-URL: Homepage, https://github.com/fastapi/fastapi +Project-URL: Documentation, https://fastapi.tiangolo.com/ +Project-URL: Repository, https://github.com/fastapi/fastapi +Project-URL: Issues, https://github.com/fastapi/fastapi/issues +Project-URL: Changelog, https://fastapi.tiangolo.com/release-notes/ +Requires-Python: >=3.8 +Requires-Dist: starlette<0.47.0,>=0.40.0 +Requires-Dist: pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4 +Requires-Dist: typing-extensions>=4.8.0 +Provides-Extra: standard +Requires-Dist: fastapi-cli[standard]>=0.0.5; extra == "standard" +Requires-Dist: httpx>=0.23.0; extra == "standard" +Requires-Dist: jinja2>=3.1.5; extra == "standard" +Requires-Dist: python-multipart>=0.0.18; extra == "standard" +Requires-Dist: email-validator>=2.0.0; extra == "standard" +Requires-Dist: uvicorn[standard]>=0.12.0; extra == "standard" +Provides-Extra: all +Requires-Dist: fastapi-cli[standard]>=0.0.5; extra == "all" +Requires-Dist: httpx>=0.23.0; extra == "all" +Requires-Dist: jinja2>=3.1.5; extra == "all" +Requires-Dist: python-multipart>=0.0.18; extra == "all" +Requires-Dist: itsdangerous>=1.1.0; extra == "all" +Requires-Dist: pyyaml>=5.3.1; extra == "all" +Requires-Dist: ujson!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,>=4.0.1; extra == "all" +Requires-Dist: orjson>=3.2.1; extra == "all" +Requires-Dist: email-validator>=2.0.0; extra == "all" +Requires-Dist: uvicorn[standard]>=0.12.0; extra == "all" +Requires-Dist: pydantic-settings>=2.0.0; extra == "all" +Requires-Dist: pydantic-extra-types>=2.0.0; extra == "all" +Description-Content-Type: text/markdown + +

+ FastAPI +

+

+ FastAPI framework, high performance, easy to learn, fast to code, ready for production +

+

+ + Test + + + Coverage + + + Package version + + + Supported Python versions + +

+ +--- + +**Documentation**: https://fastapi.tiangolo.com + +**Source Code**: https://github.com/fastapi/fastapi + +--- + +FastAPI is a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints. + +The key features are: + +* **Fast**: Very high performance, on par with **NodeJS** and **Go** (thanks to Starlette and Pydantic). [One of the fastest Python frameworks available](#performance). +* **Fast to code**: Increase the speed to develop features by about 200% to 300%. * +* **Fewer bugs**: Reduce about 40% of human (developer) induced errors. * +* **Intuitive**: Great editor support. Completion everywhere. Less time debugging. +* **Easy**: Designed to be easy to use and learn. Less time reading docs. +* **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs. +* **Robust**: Get production-ready code. With automatic interactive documentation. +* **Standards-based**: Based on (and fully compatible with) the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema. + +* estimation based on tests on an internal development team, building production applications. + +## Sponsors + + + + + + + + + + + + + + + + + + + + + + +Other sponsors + +## Opinions + +"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._" + +
Kabir Khan - Microsoft (ref)
+ +--- + +"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_" + +
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+ +--- + +"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_" + +
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+ +--- + +"_I’m over the moon excited about **FastAPI**. It’s so fun!_" + +
Brian Okken - Python Bytes podcast host (ref)
+ +--- + +"_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._" + +
Timothy Crosley - Hug creator (ref)
+ +--- + +"_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_" + +"_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_" + +
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
+ +--- + +"_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._" + +
Deon Pillsbury - Cisco (ref)
+ +--- + +## **Typer**, the FastAPI of CLIs + + + +If you are building a CLI app to be used in the terminal instead of a web API, check out **Typer**. + +**Typer** is FastAPI's little sibling. And it's intended to be the **FastAPI of CLIs**. ⌨️ 🚀 + +## Requirements + +FastAPI stands on the shoulders of giants: + +* Starlette for the web parts. +* Pydantic for the data parts. + +## Installation + +Create and activate a virtual environment and then install FastAPI: + +
+ +```console +$ pip install "fastapi[standard]" + +---> 100% +``` + +
+ +**Note**: Make sure you put `"fastapi[standard]"` in quotes to ensure it works in all terminals. + +## Example + +### Create it + +Create a file `main.py` with: + +```Python +from typing import Union + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} +``` + +
+Or use async def... + +If your code uses `async` / `await`, use `async def`: + +```Python hl_lines="9 14" +from typing import Union + +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +async def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +async def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} +``` + +**Note**: + +If you don't know, check the _"In a hurry?"_ section about `async` and `await` in the docs. + +
+ +### Run it + +Run the server with: + +
+ +```console +$ fastapi dev main.py + + ╭────────── FastAPI CLI - Development mode ───────────╮ + │ │ + │ Serving at: http://127.0.0.1:8000 │ + │ │ + │ API docs: http://127.0.0.1:8000/docs │ + │ │ + │ Running in development mode, for production use: │ + │ │ + │ fastapi run │ + │ │ + ╰─────────────────────────────────────────────────────╯ + +INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp'] +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [2248755] using WatchFiles +INFO: Started server process [2248757] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +
+About the command fastapi dev main.py... + +The command `fastapi dev` reads your `main.py` file, detects the **FastAPI** app in it, and starts a server using Uvicorn. + +By default, `fastapi dev` will start with auto-reload enabled for local development. + +You can read more about it in the FastAPI CLI docs. + +
+ +### Check it + +Open your browser at http://127.0.0.1:8000/items/5?q=somequery. + +You will see the JSON response as: + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +You already created an API that: + +* Receives HTTP requests in the _paths_ `/` and `/items/{item_id}`. +* Both _paths_ take `GET` operations (also known as HTTP _methods_). +* The _path_ `/items/{item_id}` has a _path parameter_ `item_id` that should be an `int`. +* The _path_ `/items/{item_id}` has an optional `str` _query parameter_ `q`. + +### Interactive API docs + +Now go to http://127.0.0.1:8000/docs. + +You will see the automatic interactive API documentation (provided by Swagger UI): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### Alternative API docs + +And now, go to http://127.0.0.1:8000/redoc. + +You will see the alternative automatic documentation (provided by ReDoc): + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## Example upgrade + +Now modify the file `main.py` to receive a body from a `PUT` request. + +Declare the body using standard Python types, thanks to Pydantic. + +```Python hl_lines="4 9-12 25-27" +from typing import Union + +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + price: float + is_offer: Union[bool, None] = None + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: Union[str, None] = None): + return {"item_id": item_id, "q": q} + + +@app.put("/items/{item_id}") +def update_item(item_id: int, item: Item): + return {"item_name": item.name, "item_id": item_id} +``` + +The `fastapi dev` server should reload automatically. + +### Interactive API docs upgrade + +Now go to http://127.0.0.1:8000/docs. + +* The interactive API documentation will be automatically updated, including the new body: + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +* Click on the button "Try it out", it allows you to fill the parameters and directly interact with the API: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) + +* Then click on the "Execute" button, the user interface will communicate with your API, send the parameters, get the results and show them on the screen: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) + +### Alternative API docs upgrade + +And now, go to http://127.0.0.1:8000/redoc. + +* The alternative documentation will also reflect the new query parameter and body: + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### Recap + +In summary, you declare **once** the types of parameters, body, etc. as function parameters. + +You do that with standard modern Python types. + +You don't have to learn a new syntax, the methods or classes of a specific library, etc. + +Just standard **Python**. + +For example, for an `int`: + +```Python +item_id: int +``` + +or for a more complex `Item` model: + +```Python +item: Item +``` + +...and with that single declaration you get: + +* Editor support, including: + * Completion. + * Type checks. +* Validation of data: + * Automatic and clear errors when the data is invalid. + * Validation even for deeply nested JSON objects. +* Conversion of input data: coming from the network to Python data and types. Reading from: + * JSON. + * Path parameters. + * Query parameters. + * Cookies. + * Headers. + * Forms. + * Files. +* Conversion of output data: converting from Python data and types to network data (as JSON): + * Convert Python types (`str`, `int`, `float`, `bool`, `list`, etc). + * `datetime` objects. + * `UUID` objects. + * Database models. + * ...and many more. +* Automatic interactive API documentation, including 2 alternative user interfaces: + * Swagger UI. + * ReDoc. + +--- + +Coming back to the previous code example, **FastAPI** will: + +* Validate that there is an `item_id` in the path for `GET` and `PUT` requests. +* Validate that the `item_id` is of type `int` for `GET` and `PUT` requests. + * If it is not, the client will see a useful, clear error. +* Check if there is an optional query parameter named `q` (as in `http://127.0.0.1:8000/items/foo?q=somequery`) for `GET` requests. + * As the `q` parameter is declared with `= None`, it is optional. + * Without the `None` it would be required (as is the body in the case with `PUT`). +* For `PUT` requests to `/items/{item_id}`, read the body as JSON: + * Check that it has a required attribute `name` that should be a `str`. + * Check that it has a required attribute `price` that has to be a `float`. + * Check that it has an optional attribute `is_offer`, that should be a `bool`, if present. + * All this would also work for deeply nested JSON objects. +* Convert from and to JSON automatically. +* Document everything with OpenAPI, that can be used by: + * Interactive documentation systems. + * Automatic client code generation systems, for many languages. +* Provide 2 interactive documentation web interfaces directly. + +--- + +We just scratched the surface, but you already get the idea of how it all works. + +Try changing the line with: + +```Python + return {"item_name": item.name, "item_id": item_id} +``` + +...from: + +```Python + ... "item_name": item.name ... +``` + +...to: + +```Python + ... "item_price": item.price ... +``` + +...and see how your editor will auto-complete the attributes and know their types: + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +For a more complete example including more features, see the Tutorial - User Guide. + +**Spoiler alert**: the tutorial - user guide includes: + +* Declaration of **parameters** from other different places as: **headers**, **cookies**, **form fields** and **files**. +* How to set **validation constraints** as `maximum_length` or `regex`. +* A very powerful and easy to use **Dependency Injection** system. +* Security and authentication, including support for **OAuth2** with **JWT tokens** and **HTTP Basic** auth. +* More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic). +* **GraphQL** integration with Strawberry and other libraries. +* Many extra features (thanks to Starlette) as: + * **WebSockets** + * extremely easy tests based on HTTPX and `pytest` + * **CORS** + * **Cookie Sessions** + * ...and more. + +## Performance + +Independent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as one of the fastest Python frameworks available, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*) + +To understand more about it, see the section Benchmarks. + +## Dependencies + +FastAPI depends on Pydantic and Starlette. + +### `standard` Dependencies + +When you install FastAPI with `pip install "fastapi[standard]"` it comes with the `standard` group of optional dependencies: + +Used by Pydantic: + +* email-validator - for email validation. + +Used by Starlette: + +* httpx - Required if you want to use the `TestClient`. +* jinja2 - Required if you want to use the default template configuration. +* python-multipart - Required if you want to support form "parsing", with `request.form()`. + +Used by FastAPI / Starlette: + +* uvicorn - for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving. +* `fastapi-cli` - to provide the `fastapi` command. + +### Without `standard` Dependencies + +If you don't want to include the `standard` optional dependencies, you can install with `pip install fastapi` instead of `pip install "fastapi[standard]"`. + +### Additional Optional Dependencies + +There are some additional dependencies you might want to install. + +Additional optional Pydantic dependencies: + +* pydantic-settings - for settings management. +* pydantic-extra-types - for extra types to be used with Pydantic. + +Additional optional FastAPI dependencies: + +* orjson - Required if you want to use `ORJSONResponse`. +* ujson - Required if you want to use `UJSONResponse`. + +## License + +This project is licensed under the terms of the MIT license. diff --git a/venv/Lib/site-packages/fastapi-0.115.14.dist-info/RECORD b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/RECORD new file mode 100644 index 00000000..b14145eb --- /dev/null +++ b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/RECORD @@ -0,0 +1,97 @@ +../../Scripts/fastapi.exe,sha256=HeMeOECE5j0VKhIfzIDfMnAA4LATyaoAegFr0AGuWKM,108404 +fastapi-0.115.14.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +fastapi-0.115.14.dist-info/METADATA,sha256=BKQS5L_nvCHYJUCYQujjjM8dxMoJDV84thmsHYxZiI0,27180 +fastapi-0.115.14.dist-info/RECORD,, +fastapi-0.115.14.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +fastapi-0.115.14.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90 +fastapi-0.115.14.dist-info/entry_points.txt,sha256=GCf-WbIZxyGT4MUmrPGj1cOHYZoGsNPHAvNkT6hnGeA,61 +fastapi-0.115.14.dist-info/licenses/LICENSE,sha256=Tsif_IFIW5f-xYSy1KlhAy7v_oNEU4lP2cEnSQbMdE4,1086 +fastapi/__init__.py,sha256=zto_Knb1xNkut8EXy4Q4enLzjY6UIFsGKNCJUQpgcwc,1082 +fastapi/__main__.py,sha256=bKePXLdO4SsVSM6r9SVoLickJDcR2c0cTOxZRKq26YQ,37 +fastapi/__pycache__/__init__.cpython-312.pyc,, +fastapi/__pycache__/__main__.cpython-312.pyc,, +fastapi/__pycache__/_compat.cpython-312.pyc,, +fastapi/__pycache__/applications.cpython-312.pyc,, +fastapi/__pycache__/background.cpython-312.pyc,, +fastapi/__pycache__/cli.cpython-312.pyc,, +fastapi/__pycache__/concurrency.cpython-312.pyc,, +fastapi/__pycache__/datastructures.cpython-312.pyc,, +fastapi/__pycache__/encoders.cpython-312.pyc,, +fastapi/__pycache__/exception_handlers.cpython-312.pyc,, +fastapi/__pycache__/exceptions.cpython-312.pyc,, +fastapi/__pycache__/logger.cpython-312.pyc,, +fastapi/__pycache__/param_functions.cpython-312.pyc,, +fastapi/__pycache__/params.cpython-312.pyc,, +fastapi/__pycache__/requests.cpython-312.pyc,, +fastapi/__pycache__/responses.cpython-312.pyc,, +fastapi/__pycache__/routing.cpython-312.pyc,, +fastapi/__pycache__/staticfiles.cpython-312.pyc,, +fastapi/__pycache__/templating.cpython-312.pyc,, +fastapi/__pycache__/testclient.cpython-312.pyc,, +fastapi/__pycache__/types.cpython-312.pyc,, +fastapi/__pycache__/utils.cpython-312.pyc,, +fastapi/__pycache__/websockets.cpython-312.pyc,, +fastapi/_compat.py,sha256=PwGTZd6d-u2o6YF9M8pQahuBtD_3q3Kpj7vU5-ngChc,24228 +fastapi/applications.py,sha256=rZTr0Ix-vdMwh6MQGCI_NC-Ir9lpfIGHHBY-JnNWZ_E,176550 +fastapi/background.py,sha256=rouLirxUANrcYC824MSMypXL_Qb2HYg2YZqaiEqbEKI,1768 +fastapi/cli.py,sha256=OYhZb0NR_deuT5ofyPF2NoNBzZDNOP8Salef2nk-HqA,418 +fastapi/concurrency.py,sha256=MirfowoSpkMQZ8j_g0ZxaQKpV6eB3G-dB5TgcXCrgEA,1424 +fastapi/datastructures.py,sha256=b2PEz77XGq-u3Ur1Inwk0AGjOsQZO49yF9C7IPJ15cY,5766 +fastapi/dependencies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +fastapi/dependencies/__pycache__/__init__.cpython-312.pyc,, +fastapi/dependencies/__pycache__/models.cpython-312.pyc,, +fastapi/dependencies/__pycache__/utils.cpython-312.pyc,, +fastapi/dependencies/models.py,sha256=Pjl6vx-4nZ5Tta9kJa3-RfQKkXtCpS09-FhMgs9eWNs,1507 +fastapi/dependencies/utils.py,sha256=wGN-BAb0NpG-89nA_OllS0F4wYwGfhHgb8IuT3MTqck,36619 +fastapi/encoders.py,sha256=LvwYmFeOz4tVwvgBoC5rvZnbr7hZr73KGrU8O7zSptU,11068 +fastapi/exception_handlers.py,sha256=MBrIOA-ugjJDivIi4rSsUJBdTsjuzN76q4yh0q1COKw,1332 +fastapi/exceptions.py,sha256=taNixuFEXb67lI1bnX1ubq8y8TseJ4yoPlWjyP0fTzk,4969 +fastapi/logger.py,sha256=I9NNi3ov8AcqbsbC9wl1X-hdItKgYt2XTrx1f99Zpl4,54 +fastapi/middleware/__init__.py,sha256=oQDxiFVcc1fYJUOIFvphnK7pTT5kktmfL32QXpBFvvo,58 +fastapi/middleware/__pycache__/__init__.cpython-312.pyc,, +fastapi/middleware/__pycache__/cors.cpython-312.pyc,, +fastapi/middleware/__pycache__/gzip.cpython-312.pyc,, +fastapi/middleware/__pycache__/httpsredirect.cpython-312.pyc,, +fastapi/middleware/__pycache__/trustedhost.cpython-312.pyc,, +fastapi/middleware/__pycache__/wsgi.cpython-312.pyc,, +fastapi/middleware/cors.py,sha256=ynwjWQZoc_vbhzZ3_ZXceoaSrslHFHPdoM52rXr0WUU,79 +fastapi/middleware/gzip.py,sha256=xM5PcsH8QlAimZw4VDvcmTnqQamslThsfe3CVN2voa0,79 +fastapi/middleware/httpsredirect.py,sha256=rL8eXMnmLijwVkH7_400zHri1AekfeBd6D6qs8ix950,115 +fastapi/middleware/trustedhost.py,sha256=eE5XGRxGa7c5zPnMJDGp3BxaL25k5iVQlhnv-Pk0Pss,109 +fastapi/middleware/wsgi.py,sha256=Z3Ue-7wni4lUZMvH3G9ek__acgYdJstbnpZX_HQAboY,79 +fastapi/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +fastapi/openapi/__pycache__/__init__.cpython-312.pyc,, +fastapi/openapi/__pycache__/constants.cpython-312.pyc,, +fastapi/openapi/__pycache__/docs.cpython-312.pyc,, +fastapi/openapi/__pycache__/models.cpython-312.pyc,, +fastapi/openapi/__pycache__/utils.cpython-312.pyc,, +fastapi/openapi/constants.py,sha256=adGzmis1L1HJRTE3kJ5fmHS_Noq6tIY6pWv_SFzoFDU,153 +fastapi/openapi/docs.py,sha256=zSDv4xY6XHcKsaG4zyk1HqSnrZtfZFBB0J7ZBk5YHPE,10345 +fastapi/openapi/models.py,sha256=PqkxQiqcEgjKuhfUIWPZPQcyTcubtUCB3vcObLsB7VE,15397 +fastapi/openapi/utils.py,sha256=e00G_p0IdpiffBUaq31BUyiloXbpld8RryKYnYKisdY,23964 +fastapi/param_functions.py,sha256=JHNPLIYvoAwdnZZavIVsxOat8x23fX_Kl33reh7HKl8,64019 +fastapi/params.py,sha256=g450axUBQgQJODdtM7WBxZbQj9Z64inFvadrgHikBbU,28237 +fastapi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +fastapi/requests.py,sha256=zayepKFcienBllv3snmWI20Gk0oHNVLU4DDhqXBb4LU,142 +fastapi/responses.py,sha256=QNQQlwpKhQoIPZTTWkpc9d_QGeGZ_aVQPaDV3nQ8m7c,1761 +fastapi/routing.py,sha256=gnGRnOzM-CBOYj7hI0bZlC_5c-RQKh6BPmlsDD8IVUo,176315 +fastapi/security/__init__.py,sha256=bO8pNmxqVRXUjfl2mOKiVZLn0FpBQ61VUYVjmppnbJw,881 +fastapi/security/__pycache__/__init__.cpython-312.pyc,, +fastapi/security/__pycache__/api_key.cpython-312.pyc,, +fastapi/security/__pycache__/base.cpython-312.pyc,, +fastapi/security/__pycache__/http.cpython-312.pyc,, +fastapi/security/__pycache__/oauth2.cpython-312.pyc,, +fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc,, +fastapi/security/__pycache__/utils.cpython-312.pyc,, +fastapi/security/api_key.py,sha256=cBI5Z4zWVjL1uJrsjTeLy7MafHPAO2HQPzTrpyoIYWA,9094 +fastapi/security/base.py,sha256=dl4pvbC-RxjfbWgPtCWd8MVU-7CB2SZ22rJDXVCXO6c,141 +fastapi/security/http.py,sha256=rWR2x-5CUsjWmRucYthwRig6MG1o-boyrr4Xo-PuuxU,13606 +fastapi/security/oauth2.py,sha256=M1AFIDT7G3oQChq83poI3eg8ZDeibcvnGmya2CTS7JY,22036 +fastapi/security/open_id_connect_url.py,sha256=8vizZ2tGqEp1ur8SwtVgyHJhGAJ5AqahgcvSpaIioDI,2722 +fastapi/security/utils.py,sha256=bd8T0YM7UQD5ATKucr1bNtAvz_Y3__dVNAv5UebiPvc,293 +fastapi/staticfiles.py,sha256=iirGIt3sdY2QZXd36ijs3Cj-T0FuGFda3cd90kM9Ikw,69 +fastapi/templating.py,sha256=4zsuTWgcjcEainMJFAlW6-gnslm6AgOS1SiiDWfmQxk,76 +fastapi/testclient.py,sha256=nBvaAmX66YldReJNZXPOk1sfuo2Q6hs8bOvIaCep6LQ,66 +fastapi/types.py,sha256=nFb36sK3DSoqoyo7Miwy3meKK5UdFBgkAgLSzQlUVyI,383 +fastapi/utils.py,sha256=y8Bj5ttMaI9tS4D60OUgXqKnktBr99NdYUnHHV9LgoY,7948 +fastapi/websockets.py,sha256=419uncYObEKZG0YcrXscfQQYLSWoE10jqxVMetGdR98,222 diff --git a/venv/Lib/site-packages/fastapi-0.115.14.dist-info/REQUESTED b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/fastapi-0.115.14.dist-info/WHEEL b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/WHEEL new file mode 100644 index 00000000..45ec8c4e --- /dev/null +++ b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: pdm-backend (2.4.4) +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/venv/Lib/site-packages/fastapi-0.115.14.dist-info/entry_points.txt b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/entry_points.txt new file mode 100644 index 00000000..b81849e1 --- /dev/null +++ b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +fastapi = fastapi.cli:main + +[gui_scripts] + diff --git a/venv/Lib/site-packages/fastapi-0.115.14.dist-info/licenses/LICENSE b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/licenses/LICENSE new file mode 100644 index 00000000..3e92463e --- /dev/null +++ b/venv/Lib/site-packages/fastapi-0.115.14.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Sebastián Ramírez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/venv/Lib/site-packages/fastapi/__init__.py b/venv/Lib/site-packages/fastapi/__init__.py new file mode 100644 index 00000000..e672ec9e --- /dev/null +++ b/venv/Lib/site-packages/fastapi/__init__.py @@ -0,0 +1,25 @@ +"""FastAPI framework, high performance, easy to learn, fast to code, ready for production""" + +__version__ = "0.115.14" + +from starlette import status as status + +from .applications import FastAPI as FastAPI +from .background import BackgroundTasks as BackgroundTasks +from .datastructures import UploadFile as UploadFile +from .exceptions import HTTPException as HTTPException +from .exceptions import WebSocketException as WebSocketException +from .param_functions import Body as Body +from .param_functions import Cookie as Cookie +from .param_functions import Depends as Depends +from .param_functions import File as File +from .param_functions import Form as Form +from .param_functions import Header as Header +from .param_functions import Path as Path +from .param_functions import Query as Query +from .param_functions import Security as Security +from .requests import Request as Request +from .responses import Response as Response +from .routing import APIRouter as APIRouter +from .websockets import WebSocket as WebSocket +from .websockets import WebSocketDisconnect as WebSocketDisconnect diff --git a/venv/Lib/site-packages/fastapi/__main__.py b/venv/Lib/site-packages/fastapi/__main__.py new file mode 100644 index 00000000..fc36465f --- /dev/null +++ b/venv/Lib/site-packages/fastapi/__main__.py @@ -0,0 +1,3 @@ +from fastapi.cli import main + +main() diff --git a/venv/Lib/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a55750b4a2685a3e559587d359bb2bddb411715 GIT binary patch literal 1088 zcmYk5NpI9J6vv&;lG&%7=}u{LVHwedN`*s(5M8KR6`|4vBr8&I6VEi7Bo4OIGCgtU z1MnI6EZn#;QVIL#3GRebcuMnVa5tRB)0)SCXYh=HdgHB$)3+N$$d#QftIbJB zPZ;mcT1S58$cia%Gai!2rLz_#qGw5F1(fh;)@s8ZWnJb$l2hXKELd#CoOy{WeHNV- z9?vf>KAB%!I##^}flTw(toy=c zQAAz&x@GlE$MKl!IQ_EY98)f!5ims<3J<7+LK&D#ze3_T@Li(%6g;OwrNi6l@VpAt zJR)KK90r|mD!8dv(VOuIUVs2Es%SkXaH>u_iS(feuKp9etfZo(s-&i*u4GWjkdg*S zzre407rd!#5niVI7kpTG6HZL}QHPHxS304GLLZ6XqY&U@AYai1D7xHUTec4bbZu{M zZSC9ZRCFba?PKPlP5!}x*hU$ya1mQTij`h#U+UanR>}NnMKS%$(0PBL27<^J6pws7N-^!$9Q{s zhQzp}7H5~_7sQn1XC|jQrl;nW#FVAxmBsjECdCwImZa(yBqnDkrl%IiKn>K7j|bTi uAFo$X`HRCQH$SB`C)KWq186oQ5Et_Ti4V+-jEr{~WF9iGw6Ybk0Yv~LRXef( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/_compat.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52d218ae3ca1f93950833f64425c4d745fa304c0 GIT binary patch literal 28302 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

LB52z|VS-aOPA$#pSkHz1(THb|7v` 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 Q(LkX2TI3fB-*B7%e|p(XX#fBK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/background.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/background.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ec0952406142ccae9c9703acc0aadbe3925f7b2 GIT binary patch literal 2360 zcmcIm&5smC6tAA1Z)O-)76rsm84{f)Fq3%LH5)OkpkyO%P|(9Trl+>MdbZi_uC}UX zKVV5nBoSg%JQzF@;z2|FOT4h0v@dAXL~lbDBjMz$?w$`J8ZUNsUwysz>b+mp`_+6` zt(FmdAK&dR|CUGSXEhjpxwNz0hRzLSBU|&3ueCKl)6QsWobhx&+s?&(-OKxhcEK;U zi+-tH(ohD`lAXP+C0^R)3_6AE+!bW!Y3{b3&Sp0XM)7wwFfx%oA8bU$6U6h#l1B|K zs=Z3Al^$pPz&=OBiZJx3G#>;^5=reyKgq19bcS%^pAD%MX=kj&Ya)y3V0#lfA3*{X zwKW^HGq%>&?F`M*9L>{$li3IB5Ny%bhruRuc9!PPKb3l!Xl$@MKRq##cI~`faEe!v zquIqPmG+LSXkBYp&LX446_n%@Bwfbv&0~vs9<`*)0?Zt|G|Cc7l_r+UMB+8q^Y9YI z7T`f`OdLr$CYVzZvOrM0Oav^`Aa*HeAhBd%2?m}Eqh>i?c$*R%`;1demRMh67ybgJ z7O%edIuUaI%mTKVC9uOd9wUxp$lq@)OBsr}R?7iZ61q+4lAy;t*0h-4l6}dzOT5-N zhof;0Eh7!!&>{TVI`Kn~CINN3-Ec!Lvm|bZGasj(vFnG7%ZU);2#(-1$i$w6AwD*o zY8d5Y)}{_#ow)Ntb-=AL2a#WV1PJwVLGly$5zVHVu4hkAHz<4a?cpWi?P+EIeanQ^-_Jbr7|8n zZN^bIQg6d_jzgBskO|qSx8P{)qmw(dQtx#m_DRG>U||J-(){QA$0uaQCp7ms&=asc zuG=KG9a}Y?1o=pk%>=-L`4mq^oJOiL=T!E2fG^flVCr+YzBqAYDv9A0ohXd@r8rl( zJaHRkoqk|lxb-(smHTsW|J71lT2K$Fc+%2Qr7f@C;B1fQE_+;ja-x!)N}X_K#W(EsDg+}rfGRZ2-6e_ROR9Fqc=~?b>0z_ zi_RMh3+Fl~saTOL?5r}^qVqktZk<&ctaeVjOC13Wax?@w2BHw1l$R#Btr>3cDR6vY z@0cfJk{T7r^ROxof_QitJvfYZ?YXwLRXcbyd#5&YQ{Ju3e7(9=o4He**#;G4RHLG4 z2E?bP8I?^Fh^OzVe#JCD=o2qpDVQekvuSd8p%I7MfOts>cux>7C^14HjxMUEFj&;{ zOw-W#Zcq~HQXS{&;fmj*SSUZj0`c$)x}VvfD-K@Tlbii<=QH0|rmw&CrGEY0t;&HP zDz!l-J2kzn=c_vhdZAjoua|1&K@L<0d(p0`&sMLk4)&?hezbe~M&t9w;8`^~fXX}n zd=7f|5eU9#xb>p3Bg)H-&<%P?5-O)?8r~P~Q7LJ2%s+9I(cZJerN?lOrV=+MT?aN6 z!1*FUDTYP;1c;&f1|^%Tx~6IO5dIaNzK3SF(Ckmy>Q(E* V#mm}*{EOP`ou`|BAZTMpe*q8rqBj5l literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/cli.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/cli.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bd803c7e6ce3dc923f118506932f72b1d05f960 GIT binary patch literal 648 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16e18d8f1900c6884c5cca729ee914007ffa7dda GIT binary patch literal 10914 zcmcgSTWlNGm3R0YzC=l+BZG0iACi0Si9U2>ySHRopM*K zOYV+!%RR9kxi{9!@VqHO?u+%YvM<#y55xvo*`FGehhjsl97yeucgA+IazkoZj>e+$ zuGlVC52kj@Be4;APizmXH>O7AvDlbA9vg>xlhmBrEANZ#llRB=%Lifyw1;Rf zb>*`ea?UaqzxcPlY~AmMcyRu zadam=1o`%S4l{_&;;{Lp24ov4Oh|qc*D6WvjGv1h1**K%!D@d)k3-GD@>Z66nLIw0 z`&k}fc>~LXEZ;>B(I)r{OPy~LIs&CV@OOe9r+x4}0Dn<>DCzk}E_RZ3&>k8=%g}Zj zxz5puX$fX6Iw^G>1(?(gc#-Wez8MTjNpw!kr8Fs- z&~&FnU(eAfr@K$lL{b)0P;^YCb8^(B`_5dvdEkU3DO6SU09MYVHLA>s32MNmsdg)) zyv8aAw;~>_MLcLC0&~YjQJdHKi#dg22^qr|sHUM9c!8#=B5E1s(n6L-dEI^@y`b}x zVk#xhrl{^Xg(5r7B~?x5FJ!f3CM~9P=cQa0f!IfPUQRC9yOd;9djCBl+S5Hy(H7%39dNY$u&=c2bTDy9arf*(7mz=$-CN;VzD<)nO zuT%BvoTzGIHaSMq36NM(N3#pc2#{o1FEVI=>@F$${O>$>@42_0Uv)&DLJQG75>3Q! zim4o}Q43XKYRyC8+tj+T&6X%}uU!THKFx`2Fy)Cg)n|z2Hri@iqc-suU7X{=K8){ZT_ZDE>Jes_0A-1qU8h5-+N8jjd@F#O_x>yIzVcq|F8Qm;5YS++O2t)>BrT~RlueVi$igIG*>Myj$i!IQ_h?{$ zX<+}_z{GZvpeAo@k>`OPU(%fHmvC$m&NR8&E&u>iJ2n{ zh5JN9^RT2uN z*@nW_R3DrWco0`LSL+EVXQ0C?@Ta~6*zhp`tRZx9K@!ti zG6CEEH520+Zi?UlfFCjfMOB536v$hc0z14_Y*Hz3o2NAd=aMufF{nwdUJiQu+vG4Y z{#tUFLUda$aMB%GAg=s7B!NyB+2oVa*q1Xv3T znH(D(XkzrCQ3G{=@+>%y3vd!9L_DnluZHX`m<%|w2utD-%=jAz>xiIc7~v`v3p+){ zo76ax*_6oC(7bj@$gy>nm6)gULR=N+sCc1%ubVP<In(r1sF1qXaCnGirY*a%^>s_u#q#DIj7!G_5>QX{6ZVl%MI8Rw@eB*gSi zb155J1XgEh6lScFggx|*aSDF@WKDSB%(oJTgUkhb86q+82;H|i)y9z|S#;;!%7smr zXftZdyKfRDYy;fwpm^1>i8}*WH;{f^vI1dnn>tOm$+PI)8YAXC4@@Ua<=zefH}59Z z1V}hT(2e?G-G>jEkQg>^XW!D0ifi-vr|mVQ+U@4$KoxUCLeoyT`zCIFm#%bJauYc{yp znCF%LEm{P%s@1AmH0OgiFfgx65^qVYaBuI*H{P}9T~Hd!2lEX#A?kknz?OL#G-oo- z4$lK~oi8?R!D!qTqdDK459FIz;B^&tj6mI};4K47TUPzPYTJQo39lts(hgarIagJ~ z(d%R}lqay8!K_*g=R-H}YM?G{ku_Xhn_rvpmQ6VF_D+yD1oE0Y)zuaH~Z6?n44mbbI@kf>MuSIdKei$)giqNlPM1gjYcT<47&LU738REI;{ z^o}HS5sU-eYXs5NTTBEQ4h9BC3&Lr*_=Q*sLm^pwjS4DU(L;O%aTt=u=*qaWHW@H- z#_fTGx01*N_=4MGgi$JZ5k_Ez@kJt)gqrC%T>)AsrI>=~$_%@JKHN&C=0=#~WL-dl zELMnbIV~m&RlI3vOl2ksdP0IEYT_*1@*9zfn#*Q03S5q|5M_%IUZxPP$S9~d3o+1U z)W;~jY8gVxBvd91Q*F}p<=|R$%D5W;{_wn}Wz{2NW9FUtsFoDd*WqDd6db=XEeBp4 zxKY+k`j{CEP3wUhY9?(t&8qIeYSgVe@RmWr>lEc2X6G@(t19IpW)~pS`FLE(WVCo3 zZg{G#%6Ad|GGtMH+y2y97b#|c|9K2UAZib2vv3>Mk8v8uQ->_kcWDJT8wI^gV67<%?x@NHW_bSUj@Rgds(YEUuA+;rJ5u;Qd%uUz7*mP@Z$ur+Sw!4! zT(+~T-@H+aqxJMgt5!81Z?>p94^ukM9^uSBl39c2uFNee#hGSy$e9UrpV5=G>jA66 z;xfHTf$8qROF-pCR4rf{*t}GCppA8o>Mn}PsVaJ7)`i*EzwF9dxrX{DJt3QjDLL)0PYoWcX{=HB3 z9e=d%bZOt|wS6ysNo;|=rN+^sf3;_HBh#S|$16_2fEz?U zxa#is=*Y_TU)g_k>65=(ADG-|ZYf@WZ=~QZyBod{w&89n4*Ymw-QD+OV5q=94t8v` z^(?6$zVZGWD?j*W+gjUX;l-v3A5OnNy)yBeuDwrMI#yeD z{32Bjw=Erg7~c8Yo>3^4yNAmCW97a*<$=BB!Tn&p-sYkYOxL%!9B%(Qw6D1ss5Fv2 zM~eQXS06S;D-*!Ga*#B3t@53Q0URGBK05rd{Hx3VGPT-vcHR9_8I=THUy^{Qp>PT` zd*tse`Fl4Sg>pDj?t)<(FgXoPY>E={HZ}jZ-5+SE*r8vg%i!@_x34hy_Y3P`d`N;J z{K&C9^D|E=xNBwqT5xQYAKU0Z@~HoKssH#||4EqWPNBs26x_w`4PQ$!vGn|Je9_NB zVDI;iKJ@p(G*8N=@&0S01TWcO%>09;h{u4;z8Tsm&odlZxRPg}GuT=C9|9yw= zypw$D^i1!tf7%e5?z4Z|?>j$g`*aV7^2|s6eprPDEtsX!9xJv zxwE42O9TZUd=-pz6m$?3jFc50W*8gm`1&)SO3o_qU}7E{Hiardgt12tm7NE=3-)L5 zAe1IVYsL&iV3K|q&&k;5 zWbfx>^Zz9OR9X_Y zS(*4G^a=f>qqO_zQ><5Zbv|b+J3J*{Z^aJ9Ck{_xf5izUID4Fde>nfc^TopzH`aNm zKXSB`94*C#iU(V~n;1T<`x!=S$ zLRbzHr?+sR(t_ny;%qJ+sI*}@LY$4oP^BHq9oW9V(uw6RqrDr;Jw~|~%YuQ^hvj~w zeE`dY$V)9d_`*Qh;VT7%vLjdwl^p?WbQi)V#9e?kZ(;I_3Fx#+8jFKPZE5n|h2`Ou zNwC|%%8^q4!PT~drRMKEC7qnDa+K!=%dN1LE%Pe_D=nYcS2{|6D#|d=YJYp^^TRC<4>J{^hGP_dVcl!^J|^ct0YnxCY}IT z2eJreVFEiZ%b=}c6Y$0Bw%6^PtL$km^S;k`U&Uq%G(NREJl=}k>G6GGcY9qGJEB0J zhPE=_SZui$WQcY|bRwb)5%~sJCBzU1za4RiAs!^b2<*^|nhUA%NX>)Pd_h;`I}B-> zBjIif%Yj%f#Bw8+C+w!WrKa%`zjs>#Ew0KLX3t8@Mp}C7%Q6rSDnuATTVNzvyv1MZJJj!~qT*khoMdhia85mAJso!jXWUcyGLRQm7D&;b4b3$wx4>8<1~DX)6r{8yp)H$oK}jnGPue5q zim4W~v?gqi=`HxuK4Gh7L!mLhf zfd-65+GzM`ct$eg2SD7PoGX5Pr!d8-&>%wkUG6rE05xp`_oJ^<2n=D9v?8B2QB zG_5Pt&}S^Bb31D0b7U&1_nbccvObm=9T~o;PmUx;hf*Vn zxZ`Ejn>h--nsYQp?FClM$!-}@L5ayK{3_prxIiQ*t1W>k#+I$*bTL4LxFffz?!G3^U}ZMaZi;bUnp0khzG7c zN3&2`4$%1z6oa)uGDkD0oz0sO&GF8HW!sD)uh}6KeiXPrYXuQeSP1Pf3jCPkR$X0P z4=0BEGZP%P$Xpm1No8K6eBQQ7nMEs~qeHW_XlE8_aWONRpU&{SO;47xx%uoY<(Zi* z9H^8(1@)+MK%dJN4HGg&OG{4MoNbr%f2^@~*cOk*$3gr;{}TK~uWcYVj#hi@k~ z65mbjDRMw76Is>%ZPyw2-$Sa z8bR{X!Sai;De)@gvM7Y(%~?eoaEy4W(LkK|GQLq5bC((gSe+12F{gV2B!u2Ug za14|5fe^TsHR5mm=+yhCwu8@XMF;QjZ?AoQ?VII$(b2L({6{N9_G`Z*4Sz%NkYlA+ zdIzL0rGC#>+JF>kbDG?)iMnq#uQH*f?yfZxXILGEY;=OP)df3ma?#^X{fqjoIKy%| ztQVyik$`^#X#9|98`7Pw40_sjss2@&La8_;saX;8vR#12J2>n29uBc*B1!wq3SwY=7DD(rhVNZoQ>xNzb E0_Ju1aR2}S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c83d659c848c069743d126fd0ebd20d2ec19737 GIT binary patch literal 7153 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/requests.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/requests.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08b8b7e96ee859dd0d5de7f8241683ef73bbdfeb GIT binary patch literal 263 zcmX@j%ge<81l^YsGWvk@V-N=hn4pZ$GC;<3h7^Vr#vF!R#wbQc5St0eW{P5BWT<4; zWO)fvs>yhZ&m$xxz&SrJFEzO&Gd~X~!XA`bSejZ~;-|@cOQ^Ucu_!0Cq$E|Z2qIcs z#0=C}!~!H%GJFOZ^2^)VDkiizwWv78+tV{7#wE2lyClCLrYt`*In^;eHLoP5EH$qz z#wRl=rZ}@CRkt89IXf{uwKyg%5omltrasJQy@JYL95%W6DWy57c14^(vl)T7m>WoZ TU}j`wyvtyJkHN5r9mod&!-hzK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/responses.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/responses.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae278fdf95f226fecd3ec70bf5c7b00421c9c925 GIT binary patch literal 2391 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 afA={<`uUtVJ0S#Cjd)A@3x+gJz5f7&QFNaG literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71a75c07e6ffe1b08490c40a9450953a6b770d3c GIT binary patch literal 235 zcmX@j%ge<81l^YsGF*Z5V-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zZ? z!6k_$naOUMIjO~dnoPGui%SxVa#Bl5QuTl=piCM_ridA+dL_eWkfvXL&Q>v@#i>Qb zG2Wh@Au%qg#n~nK1u8W`oF=eTFWidXPNioHlC8@dviOJcC>8ZsrX^B81 s3o`YQ4Av{C{Ka9Do1apelWJGQ0W_Wwh>Jmt56p~=jQ1F9ir9c00KGv$^8f$< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/templating.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/templating.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3022a79196e97f964190ca85b0702c721f928956 GIT binary patch literal 237 zcmX@j%ge<81l^YsGJJsaV-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zaN zUYU7WiAEu*xdl0iC8@=JnoPGuic1oUa#Bl5QuRt8;+c8rMa)1AD;Yk6^!@U6wu%WY zPAw{q@%Ho#iE&9S&MwI>h$+j@Oip!7Pt7ZdDND^Oi}A@!iYd-4N!2Y#OwLYBPc4o~ vO9Yx-kg1O_SFfP*7l%!5eoARhs$CHW&~!#1E(S3^Ff%eT-eYhsVgqsjN(n-# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/testclient.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/testclient.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..665bacaa3dc21dcd971f8fa2372522d2e6f47bf1 GIT binary patch literal 232 zcmX@j%ge<81l^YsGMs?)V-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zYX zA*sbB&N-Q>c_n_DOt(aeOA?E6QcFrw^-6#e$zX{hW}w=Y44*+-e)&3E#e^2878S>M zdwPb%xTF?mm*f}3l;vk8r#hwsjfp8s%`1!X$xMnV&MZmQEl5nxPE1cNj!8=dnq82o pk1$uSpz;@oO>TZlX-=wL5eLw8Mj$Q*F+MOeGBVy{uqSlF4+Svj+CQ+(fhZ@%xnot^nmDix7fuRlKDc%dNlOD2P5 zUIynq5xhY@@|6%_$%Rmf3b>%iSPj)k!&;3(0v26^}_2kEQbpm~LcA4KOs>}AHn-{|49QvuT$>L(#?@tD zTw7_Uz)gwI2<7@}93-)D+7C$vi-`{*ADag+p@e}yXiyabeJ$CFeQxIlX|I&I&ID&% z12L7#b8pw6BuEP(qWmY8Kd0E zKWd3Yut-v_1~KD$BlZ?rN9bIL(7#9Z8Fw`Unz>IJjTLtuvQ3tx?sgJ*P-{ZW+--=r z-KW8tn*|JRrNrALO~~AJk};A7)A=E)Y5Siw7bX5y2>0ovXe{0k%60|(RTV|~hMe!{ z$`4fgf@*zK`;Bh=EKl~XPj_3V>gn>S)xX#HTz=d`V_%(#y@k%~q5jFK?$~D|GMnnO z_ookUceSIL-nBdZ^4$})SDx*U%%>^&Y)!QPv~2Zxirp;H+xx*o8 zMd`J5=iGD8J@<9)dGTLeE<1tpHxJ&q;%p)0&)CpQO%d3>Y#`(oxkyAJatRXFzFe4t zwjp6i@?oAs9G@^IO<_~g95yE{VN22)wkB<1Thbo3Cmmr&(iwIpU11laH749iPuRm? zF5wM(VZ13(m8=d|Cw*aG(jWFGYr-|jKsb=B4c8`v;b5{ZT*v6miTY$ixFOjXZe(ps zqAA%NZces@TUgtg5R$FoRtDP=ZOQg(FNFE)K(3irZn&7X2&i{uvtp!|t_l}4Gx)(_0#KDIjCM;qHqXwoXS z!!G*84zUyV7J^;vf%bFaURb+XG8fm^^-RkRr(+gFK(}A)hJ7?hjYYbB&$Qf?Ef~=Q zBMvNZq29-Eeq=Pnsm{0@5u-{pmWax7$fml+FI_kp89IG(=*-CI&s6?IYC$y)$771> zJ~yXCFDImP(b?H}YD%@9pH<@NR5YRTW0Im8#}{TL)pRihIMo=7$_j9=dP9oNoRJog z0n*ZikX3bDxHNoXbbMqe^7;YQ{z_DqhSI6Y_>^itmlmbOskoF7)usyzVl<`1V`H%^ zQZo88DJ9V;@;FIpnyR*oDN&k?rzBBzl|Z%v+w0Lp9Cidm)d?vTmr_b3F3WS5wH+GN z>S1XzI+su`B%(3tN;)A*RCN?_$RT79hd=U8Ou1e~bqkd>%1Cr4tyOEptTnWL!~ z4%G_}0RC;i4Am`?Axqo>mw~5$l~90`5^aWjS%eq43@7q4pf=v)WFtqQWxPt9WQ>GN zqvOZTz)0oyzxk%hAHZq=t3j*|LS=z7#G`opM<6?nGe3R~_&)wOg#H8-?1_)3l#qdf z#v-aOHb*HQXvIckn3@Q}52uHYPF$2FDo>ml85y4#mgE^FJv(tV9gj&TreM&-RVj6K z;%xl#gbb(FI~$G7M5iQqViH6pIvekwQ{oA^Z+1a#0g=3%78fGXL?S&eiIK@Pt(=ke z!;IbVC!c_7iR3NSSxbH1<9lSOE)Ywt`CDSKnhRdy^>5WTtJ@6Day6 z!DSdmuUUTH)z|$}XfedAybLeKKqb`zGAzPALmb@?17y5af%ZYI`llo%f~$gxMw5|L zG%3mS5OlqOltHML$dgMNJN`nA>2+W13H_e00NtZ^TG4jI_5YA=C3NF1%26p-(T z>Sa$MQtVDsneIh;E0x}zi&J<~PA2Ujr`ofe#1|QfgUqWYU>TKFBNBjA9L8}jxb-;T zud(+TvjI*o2(vT102>2=Hh_>CI1(p|21TbK)R!>>-p!Hn$!53=pRwHKzAT>gqB-Se zRQ5_L-Ks2_GbCdc4WAkoZ54d|8QZj}G))N*`HVHr>374CRB(4XSc3spVa%8^7SZ^r zxje!~6pPMIw8Tlqc8B|0Zj7`O#j4{KX6>;xY3Lvn?4aV*`=;GGRQ^s^m0=wcO&RVJ zBAS2A>vN0beZxF?kH19bxsY`fM9CgarP82R;Fj4n(&I21uI31Q=rOEbLWG$5>8B+sT(vLvwUZxv31A~-65Hjd2*%9W@hL@&Xm z3UOJ83ffRzWosh@6t+HLWKvj2&jDLWn3KV70JWz1SiewSy~Y&S!FGO%WtY@9)h93; z^H;AG*ViM6U|o8I(R50BE5s&?MN@#3(OLi`GXFrC1sa5u6Wul@jRx5>L%Y9K(h539m^}QAnn#bX2&aD6{g>{{Et- z>r>*<)Kof=?u(_9{mL9LgXhz)pLZ`?S^pO#WTPl2v>qzeJU0tQO`=|GIA5Cs)0mW) zEu<(ophz?|s@kRZViL2=vg$kqNU%waE@ana;wR;R2@6UOlNi-JGmo+$qZ|vRqUomU zN~;)Q0zzK}Iutc|1F9ub2#{dcgWBHp16ia08%uS*rsWAS1nhU7&(}7tO?`FoDR1bo zU$+;mBp^Jf>AUm%Z(dlo=L7ZY-8t96rBgV>>i*bu-L-OcRar@WZS8!dwI9_r=Q{@T z4Q=_xj=a#5uWSC+WpTNm@-~~j;CGn(Tb{a{r+xJlR9S2L|74Jsvtn=y!-ZhELQW0)?fAeg&Y77ZE0BCojgcE+HT zlu>Eyb)}??lxm%_OouKltf07J;K)tu0gO(pQQ+R8Eb$P$aMT;0kVZ z8Hv)aBjI)g9WH+}{9U8Yf6)Xq9pye9%9tXh(*z1wL;0)=010Y$eC zm%l(!x(%S{Dfj3QPy|XanMQA8M*)iRZINkoCw3H|DBU5V_4n8x6=ICf(57(uAjk;rT@64T6EB!YoXByt%-q)3FG z0XDj~ftDrIt{E-dnC5bz;!`bGqHtqHjDTgup0dq33Y*Xf#w8xB^pgh^d)DQLS^p08NX^O{%t(G+$hYt-L%m2}R?~ zOf!8QnPHWLKiL3EdWn2zCstqH<6m|b%*5)?S{k-$yO*7h{B^g^+&r^%Zp-3ZIk#bH zyEDJOm_7d5#@?}fuyZqbBo{og?8Q;O2)@@h@wt|hHj^7F0j;tpi24943 zU(2SiJ?Cp*JNM9cVA+~?__7Y*5ADs4qq&Zw_uty69a}z~?>?}6cC{(z+?%gy+pOu$ z)%0%G4CZPEAJ!atLU>p83b)mFBJZzRI}4scfAxxW)7zedpzXwOPknysfp=el2coA| zQq{h0`knm?`@OCW@6gf+*zV8zZ}%^aY(R_`Xt*_Vb7pDegY)^;J)5nEbFGK5qd6aJ z`pk9Pg>Vh{3!gRLZbmqeZ))3Y>d!T?;r00jVY6Xhu3;bc1$VTB&Q0N9PB@5tO?iuR z(^C7uQVZwV+`ie=n``R*Zxb)rA9?GZ^28;q+3q?2-Ffl}54dI9hP4sg9INZYU%vm# zt>*oCXVu5&ub7tDX zbg77(0$z+(L<3k=90>)q2l)hinNP^C(ZeYDD$}KqNTb7AG(u=o8j1b^ggGX#^o}x( z4(Zwn`0_{z!L)hw8r7X?Ep1Tr@})@0Q;)>8!~y#6T_IsUDueG1Z#D+cPwWxm3Pvs% zYQP&41&D1V3hyql&;wC`D9pzb3E?t^3(53V=$F&!)MGphP=0pESHxx#(p4$(gJI$g zm5YSTsui5&6ofYr8zY2SCT%i^%ihqsD4IYB{pT*LCQNM5kWurc4z@K~xswMK&OiZp1&;9Bgc(}IXf3eo*eg5xkCX>0~B()7IudfcT z9$I;6>Fk!T=GLK`hgLh+d~1n^zJaB)`9Rys+iUyRUjOaH=M%qqJKHgs^&JGXqZZOA zT57>WG0R2KzLgwZfXjlULIV?6(}>+sKuC5KEG9UdQi|B8QEGP-$hm^Msf!$Qm3I*@ z+3+fP9};6AR0gFaQZVZ-w7MfLvTXBo$uTZZ{EPqsR}etsD4hWUn!t*Qg@s+E>R<^Q z2%nQth21xu1rpVwJvtDML|j(ryMP0uiE#j>P!)4%#n`HJ&vU8xyK@o;0nlVds&1 zRk_X=Hakz`I!`?89LjbKXMHE1y=hxA8c#(q!d4wx2+A6FQB9gN^o)X_OGty& zKf|AV6DpLH*3H1)Tww3RKcofuE*+VNC{ed3Sund*D&i9yVa+UVEB&1FROIQjKh{&&Z3GU}l08fdqT; zrvUmPkpBt(WX$cdG>$vCd~Wp&IBrWP^WGXr;+TTVM#!h_oUl4PK#I|?YSkkjEmlDd0B(LU8tP+_hpc7is=Wof!f4zS$koA;e*1&dkOS z))ygfIG2!))4u~8Dq#6AsJ;TvaoiTM{Ri=ULpr`U*g3=Z1gh^?6(HQ6KNI)&1{6yOFCo zxlIh5pa>i`@QG1%jwQ4sNq=p^f8uR^1(T-bDzs=C!W2r>#D zYkD7>-y6Jd`~6GV?pJdSXL8kN3rGm7gYhU8`?7(9Iq#tY52#1gwb@|z`k8F-aIX4D!2~E+x!I9*G_C$T>*&sz M_C2)#k_p!T0p6O{;{X5v literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc b/venv/Lib/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..408b43e77a5f3365441e57d1f6ce2c5114f69659 GIT binary patch literal 312 zcmX@j%ge<81l^YsGVTHC#~=<2FhLogHGqui3@HpLj5!Rsj8Tk?AT|?_%@oB1W-|lX z%u&pY43#XJtS>>@G#PJkhNmV4=O<^UmH;`zaE?o6adLiMUTQK(m=7)-T#{Il>Zi$a zOQg6Yu_!0Cq$E|ZJT<8pY(Q}lGtkT;77)P-Bvvwf29gZFe4VXgLW@(2ietPzJwsw# zQj4=o@(W_h@-vfD9n(|uN@B`V^U7j;GLvG8GfPr+3lfvF6Vp?RW6~0VwiIOQBW%zs ssQkrYlbfGXnv-f*1PT;JATH(u5+9fu85!>~nBQgazQ^EL!~qln0EF9DkpKVy literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/_compat.py b/venv/Lib/site-packages/fastapi/_compat.py new file mode 100644 index 00000000..227ad837 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/_compat.py @@ -0,0 +1,664 @@ +from collections import deque +from copy import copy +from dataclasses import dataclass, is_dataclass +from enum import Enum +from functools import lru_cache +from typing import ( + Any, + Callable, + Deque, + Dict, + FrozenSet, + List, + Mapping, + Sequence, + Set, + Tuple, + Type, + Union, + cast, +) + +from fastapi.exceptions import RequestErrorModel +from fastapi.types import IncEx, ModelNameMap, UnionType +from pydantic import BaseModel, create_model +from pydantic.version import VERSION as PYDANTIC_VERSION +from starlette.datastructures import UploadFile +from typing_extensions import Annotated, Literal, get_args, get_origin + +PYDANTIC_VERSION_MINOR_TUPLE = tuple(int(x) for x in PYDANTIC_VERSION.split(".")[:2]) +PYDANTIC_V2 = PYDANTIC_VERSION_MINOR_TUPLE[0] == 2 + + +sequence_annotation_to_type = { + Sequence: list, + List: list, + list: list, + Tuple: tuple, + tuple: tuple, + Set: set, + set: set, + FrozenSet: frozenset, + frozenset: frozenset, + Deque: deque, + deque: deque, +} + +sequence_types = tuple(sequence_annotation_to_type.keys()) + +Url: Type[Any] + +if PYDANTIC_V2: + from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationError + from pydantic import TypeAdapter + from pydantic import ValidationError as ValidationError + from pydantic._internal._schema_generation_shared import ( # type: ignore[attr-defined] + GetJsonSchemaHandler as GetJsonSchemaHandler, + ) + from pydantic._internal._typing_extra import eval_type_lenient + from pydantic._internal._utils import lenient_issubclass as lenient_issubclass + from pydantic.fields import FieldInfo + from pydantic.json_schema import GenerateJsonSchema as GenerateJsonSchema + from pydantic.json_schema import JsonSchemaValue as JsonSchemaValue + from pydantic_core import CoreSchema as CoreSchema + from pydantic_core import PydanticUndefined, PydanticUndefinedType + from pydantic_core import Url as Url + + try: + from pydantic_core.core_schema import ( + with_info_plain_validator_function as with_info_plain_validator_function, + ) + except ImportError: # pragma: no cover + from pydantic_core.core_schema import ( + general_plain_validator_function as with_info_plain_validator_function, # noqa: F401 + ) + + RequiredParam = PydanticUndefined + Undefined = PydanticUndefined + UndefinedType = PydanticUndefinedType + evaluate_forwardref = eval_type_lenient + Validator = Any + + class BaseConfig: + pass + + class ErrorWrapper(Exception): + pass + + @dataclass + class ModelField: + field_info: FieldInfo + name: str + mode: Literal["validation", "serialization"] = "validation" + + @property + def alias(self) -> str: + a = self.field_info.alias + return a if a is not None else self.name + + @property + def required(self) -> bool: + return self.field_info.is_required() + + @property + def default(self) -> Any: + return self.get_default() + + @property + def type_(self) -> Any: + return self.field_info.annotation + + def __post_init__(self) -> None: + self._type_adapter: TypeAdapter[Any] = TypeAdapter( + Annotated[self.field_info.annotation, self.field_info] + ) + + def get_default(self) -> Any: + if self.field_info.is_required(): + return Undefined + return self.field_info.get_default(call_default_factory=True) + + def validate( + self, + value: Any, + values: Dict[str, Any] = {}, # noqa: B006 + *, + loc: Tuple[Union[int, str], ...] = (), + ) -> Tuple[Any, Union[List[Dict[str, Any]], None]]: + try: + return ( + self._type_adapter.validate_python(value, from_attributes=True), + None, + ) + except ValidationError as exc: + return None, _regenerate_error_with_loc( + errors=exc.errors(include_url=False), loc_prefix=loc + ) + + def serialize( + self, + value: Any, + *, + mode: Literal["json", "python"] = "json", + include: Union[IncEx, None] = None, + exclude: Union[IncEx, None] = None, + by_alias: bool = True, + exclude_unset: bool = False, + exclude_defaults: bool = False, + exclude_none: bool = False, + ) -> Any: + # What calls this code passes a value that already called + # self._type_adapter.validate_python(value) + return self._type_adapter.dump_python( + value, + mode=mode, + include=include, + exclude=exclude, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + ) + + def __hash__(self) -> int: + # Each ModelField is unique for our purposes, to allow making a dict from + # ModelField to its JSON Schema. + return id(self) + + def get_annotation_from_field_info( + annotation: Any, field_info: FieldInfo, field_name: str + ) -> Any: + return annotation + + def _normalize_errors(errors: Sequence[Any]) -> List[Dict[str, Any]]: + return errors # type: ignore[return-value] + + def _model_rebuild(model: Type[BaseModel]) -> None: + model.model_rebuild() + + def _model_dump( + model: BaseModel, mode: Literal["json", "python"] = "json", **kwargs: Any + ) -> Any: + return model.model_dump(mode=mode, **kwargs) + + def _get_model_config(model: BaseModel) -> Any: + return model.model_config + + def get_schema_from_model_field( + *, + field: ModelField, + schema_generator: GenerateJsonSchema, + model_name_map: ModelNameMap, + field_mapping: Dict[ + Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue + ], + separate_input_output_schemas: bool = True, + ) -> Dict[str, Any]: + override_mode: Union[Literal["validation"], None] = ( + None if separate_input_output_schemas else "validation" + ) + # This expects that GenerateJsonSchema was already used to generate the definitions + json_schema = field_mapping[(field, override_mode or field.mode)] + if "$ref" not in json_schema: + # TODO remove when deprecating Pydantic v1 + # Ref: https://github.com/pydantic/pydantic/blob/d61792cc42c80b13b23e3ffa74bc37ec7c77f7d1/pydantic/schema.py#L207 + json_schema["title"] = ( + field.field_info.title or field.alias.title().replace("_", " ") + ) + return json_schema + + def get_compat_model_name_map(fields: List[ModelField]) -> ModelNameMap: + return {} + + def get_definitions( + *, + fields: List[ModelField], + schema_generator: GenerateJsonSchema, + model_name_map: ModelNameMap, + separate_input_output_schemas: bool = True, + ) -> Tuple[ + Dict[ + Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue + ], + Dict[str, Dict[str, Any]], + ]: + override_mode: Union[Literal["validation"], None] = ( + None if separate_input_output_schemas else "validation" + ) + inputs = [ + (field, override_mode or field.mode, field._type_adapter.core_schema) + for field in fields + ] + field_mapping, definitions = schema_generator.generate_definitions( + inputs=inputs + ) + for item_def in cast(Dict[str, Dict[str, Any]], definitions).values(): + if "description" in item_def: + item_description = cast(str, item_def["description"]).split("\f")[0] + item_def["description"] = item_description + return field_mapping, definitions # type: ignore[return-value] + + def is_scalar_field(field: ModelField) -> bool: + from fastapi import params + + return field_annotation_is_scalar( + field.field_info.annotation + ) and not isinstance(field.field_info, params.Body) + + def is_sequence_field(field: ModelField) -> bool: + return field_annotation_is_sequence(field.field_info.annotation) + + def is_scalar_sequence_field(field: ModelField) -> bool: + return field_annotation_is_scalar_sequence(field.field_info.annotation) + + def is_bytes_field(field: ModelField) -> bool: + return is_bytes_or_nonable_bytes_annotation(field.type_) + + def is_bytes_sequence_field(field: ModelField) -> bool: + return is_bytes_sequence_annotation(field.type_) + + def copy_field_info(*, field_info: FieldInfo, annotation: Any) -> FieldInfo: + cls = type(field_info) + merged_field_info = cls.from_annotation(annotation) + new_field_info = copy(field_info) + new_field_info.metadata = merged_field_info.metadata + new_field_info.annotation = merged_field_info.annotation + return new_field_info + + def serialize_sequence_value(*, field: ModelField, value: Any) -> Sequence[Any]: + origin_type = ( + get_origin(field.field_info.annotation) or field.field_info.annotation + ) + assert issubclass(origin_type, sequence_types) # type: ignore[arg-type] + return sequence_annotation_to_type[origin_type](value) # type: ignore[no-any-return] + + def get_missing_field_error(loc: Tuple[str, ...]) -> Dict[str, Any]: + error = ValidationError.from_exception_data( + "Field required", [{"type": "missing", "loc": loc, "input": {}}] + ).errors(include_url=False)[0] + error["input"] = None + return error # type: ignore[return-value] + + def create_body_model( + *, fields: Sequence[ModelField], model_name: str + ) -> Type[BaseModel]: + field_params = {f.name: (f.field_info.annotation, f.field_info) for f in fields} + BodyModel: Type[BaseModel] = create_model(model_name, **field_params) # type: ignore[call-overload] + return BodyModel + + def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: + return [ + ModelField(field_info=field_info, name=name) + for name, field_info in model.model_fields.items() + ] + +else: + from fastapi.openapi.constants import REF_PREFIX as REF_PREFIX + from pydantic import AnyUrl as Url # noqa: F401 + from pydantic import ( # type: ignore[assignment] + BaseConfig as BaseConfig, # noqa: F401 + ) + from pydantic import ValidationError as ValidationError # noqa: F401 + from pydantic.class_validators import ( # type: ignore[no-redef] + Validator as Validator, # noqa: F401 + ) + from pydantic.error_wrappers import ( # type: ignore[no-redef] + ErrorWrapper as ErrorWrapper, # noqa: F401 + ) + from pydantic.errors import MissingError + from pydantic.fields import ( # type: ignore[attr-defined] + SHAPE_FROZENSET, + SHAPE_LIST, + SHAPE_SEQUENCE, + SHAPE_SET, + SHAPE_SINGLETON, + SHAPE_TUPLE, + SHAPE_TUPLE_ELLIPSIS, + ) + from pydantic.fields import FieldInfo as FieldInfo + from pydantic.fields import ( # type: ignore[no-redef,attr-defined] + ModelField as ModelField, # noqa: F401 + ) + + # Keeping old "Required" functionality from Pydantic V1, without + # shadowing typing.Required. + RequiredParam: Any = Ellipsis # type: ignore[no-redef] + from pydantic.fields import ( # type: ignore[no-redef,attr-defined] + Undefined as Undefined, + ) + from pydantic.fields import ( # type: ignore[no-redef, attr-defined] + UndefinedType as UndefinedType, # noqa: F401 + ) + from pydantic.schema import ( + field_schema, + get_flat_models_from_fields, + get_model_name_map, + model_process_schema, + ) + from pydantic.schema import ( # type: ignore[no-redef] # noqa: F401 + get_annotation_from_field_info as get_annotation_from_field_info, + ) + from pydantic.typing import ( # type: ignore[no-redef] + evaluate_forwardref as evaluate_forwardref, # noqa: F401 + ) + from pydantic.utils import ( # type: ignore[no-redef] + lenient_issubclass as lenient_issubclass, # noqa: F401 + ) + + GetJsonSchemaHandler = Any # type: ignore[assignment,misc] + JsonSchemaValue = Dict[str, Any] # type: ignore[misc] + CoreSchema = Any # type: ignore[assignment,misc] + + sequence_shapes = { + SHAPE_LIST, + SHAPE_SET, + SHAPE_FROZENSET, + SHAPE_TUPLE, + SHAPE_SEQUENCE, + SHAPE_TUPLE_ELLIPSIS, + } + sequence_shape_to_type = { + SHAPE_LIST: list, + SHAPE_SET: set, + SHAPE_TUPLE: tuple, + SHAPE_SEQUENCE: list, + SHAPE_TUPLE_ELLIPSIS: list, + } + + @dataclass + class GenerateJsonSchema: # type: ignore[no-redef] + ref_template: str + + class PydanticSchemaGenerationError(Exception): # type: ignore[no-redef] + pass + + def with_info_plain_validator_function( # type: ignore[misc] + function: Callable[..., Any], + *, + ref: Union[str, None] = None, + metadata: Any = None, + serialization: Any = None, + ) -> Any: + return {} + + def get_model_definitions( + *, + flat_models: Set[Union[Type[BaseModel], Type[Enum]]], + model_name_map: Dict[Union[Type[BaseModel], Type[Enum]], str], + ) -> Dict[str, Any]: + definitions: Dict[str, Dict[str, Any]] = {} + for model in flat_models: + m_schema, m_definitions, m_nested_models = model_process_schema( + model, model_name_map=model_name_map, ref_prefix=REF_PREFIX + ) + definitions.update(m_definitions) + model_name = model_name_map[model] + if "description" in m_schema: + m_schema["description"] = m_schema["description"].split("\f")[0] + definitions[model_name] = m_schema + return definitions + + def is_pv1_scalar_field(field: ModelField) -> bool: + from fastapi import params + + field_info = field.field_info + if not ( + field.shape == SHAPE_SINGLETON # type: ignore[attr-defined] + and not lenient_issubclass(field.type_, BaseModel) + and not lenient_issubclass(field.type_, dict) + and not field_annotation_is_sequence(field.type_) + and not is_dataclass(field.type_) + and not isinstance(field_info, params.Body) + ): + return False + if field.sub_fields: # type: ignore[attr-defined] + if not all( + is_pv1_scalar_field(f) + for f in field.sub_fields # type: ignore[attr-defined] + ): + return False + return True + + def is_pv1_scalar_sequence_field(field: ModelField) -> bool: + if (field.shape in sequence_shapes) and not lenient_issubclass( # type: ignore[attr-defined] + field.type_, BaseModel + ): + if field.sub_fields is not None: # type: ignore[attr-defined] + for sub_field in field.sub_fields: # type: ignore[attr-defined] + if not is_pv1_scalar_field(sub_field): + return False + return True + if _annotation_is_sequence(field.type_): + return True + return False + + def _normalize_errors(errors: Sequence[Any]) -> List[Dict[str, Any]]: + use_errors: List[Any] = [] + for error in errors: + if isinstance(error, ErrorWrapper): + new_errors = ValidationError( # type: ignore[call-arg] + errors=[error], model=RequestErrorModel + ).errors() + use_errors.extend(new_errors) + elif isinstance(error, list): + use_errors.extend(_normalize_errors(error)) + else: + use_errors.append(error) + return use_errors + + def _model_rebuild(model: Type[BaseModel]) -> None: + model.update_forward_refs() + + def _model_dump( + model: BaseModel, mode: Literal["json", "python"] = "json", **kwargs: Any + ) -> Any: + return model.dict(**kwargs) + + def _get_model_config(model: BaseModel) -> Any: + return model.__config__ # type: ignore[attr-defined] + + def get_schema_from_model_field( + *, + field: ModelField, + schema_generator: GenerateJsonSchema, + model_name_map: ModelNameMap, + field_mapping: Dict[ + Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue + ], + separate_input_output_schemas: bool = True, + ) -> Dict[str, Any]: + # This expects that GenerateJsonSchema was already used to generate the definitions + return field_schema( # type: ignore[no-any-return] + field, model_name_map=model_name_map, ref_prefix=REF_PREFIX + )[0] + + def get_compat_model_name_map(fields: List[ModelField]) -> ModelNameMap: + models = get_flat_models_from_fields(fields, known_models=set()) + return get_model_name_map(models) # type: ignore[no-any-return] + + def get_definitions( + *, + fields: List[ModelField], + schema_generator: GenerateJsonSchema, + model_name_map: ModelNameMap, + separate_input_output_schemas: bool = True, + ) -> Tuple[ + Dict[ + Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue + ], + Dict[str, Dict[str, Any]], + ]: + models = get_flat_models_from_fields(fields, known_models=set()) + return {}, get_model_definitions( + flat_models=models, model_name_map=model_name_map + ) + + def is_scalar_field(field: ModelField) -> bool: + return is_pv1_scalar_field(field) + + def is_sequence_field(field: ModelField) -> bool: + return field.shape in sequence_shapes or _annotation_is_sequence(field.type_) # type: ignore[attr-defined] + + def is_scalar_sequence_field(field: ModelField) -> bool: + return is_pv1_scalar_sequence_field(field) + + def is_bytes_field(field: ModelField) -> bool: + return lenient_issubclass(field.type_, bytes) + + def is_bytes_sequence_field(field: ModelField) -> bool: + return field.shape in sequence_shapes and lenient_issubclass(field.type_, bytes) # type: ignore[attr-defined] + + def copy_field_info(*, field_info: FieldInfo, annotation: Any) -> FieldInfo: + return copy(field_info) + + def serialize_sequence_value(*, field: ModelField, value: Any) -> Sequence[Any]: + return sequence_shape_to_type[field.shape](value) # type: ignore[no-any-return,attr-defined] + + def get_missing_field_error(loc: Tuple[str, ...]) -> Dict[str, Any]: + missing_field_error = ErrorWrapper(MissingError(), loc=loc) # type: ignore[call-arg] + new_error = ValidationError([missing_field_error], RequestErrorModel) + return new_error.errors()[0] # type: ignore[return-value] + + def create_body_model( + *, fields: Sequence[ModelField], model_name: str + ) -> Type[BaseModel]: + BodyModel = create_model(model_name) + for f in fields: + BodyModel.__fields__[f.name] = f # type: ignore[index] + return BodyModel + + def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: + return list(model.__fields__.values()) # type: ignore[attr-defined] + + +def _regenerate_error_with_loc( + *, errors: Sequence[Any], loc_prefix: Tuple[Union[str, int], ...] +) -> List[Dict[str, Any]]: + updated_loc_errors: List[Any] = [ + {**err, "loc": loc_prefix + err.get("loc", ())} + for err in _normalize_errors(errors) + ] + + return updated_loc_errors + + +def _annotation_is_sequence(annotation: Union[Type[Any], None]) -> bool: + if lenient_issubclass(annotation, (str, bytes)): + return False + return lenient_issubclass(annotation, sequence_types) + + +def field_annotation_is_sequence(annotation: Union[Type[Any], None]) -> bool: + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + for arg in get_args(annotation): + if field_annotation_is_sequence(arg): + return True + return False + return _annotation_is_sequence(annotation) or _annotation_is_sequence( + get_origin(annotation) + ) + + +def value_is_sequence(value: Any) -> bool: + return isinstance(value, sequence_types) and not isinstance(value, (str, bytes)) # type: ignore[arg-type] + + +def _annotation_is_complex(annotation: Union[Type[Any], None]) -> bool: + return ( + lenient_issubclass(annotation, (BaseModel, Mapping, UploadFile)) + or _annotation_is_sequence(annotation) + or is_dataclass(annotation) + ) + + +def field_annotation_is_complex(annotation: Union[Type[Any], None]) -> bool: + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + return any(field_annotation_is_complex(arg) for arg in get_args(annotation)) + + return ( + _annotation_is_complex(annotation) + or _annotation_is_complex(origin) + or hasattr(origin, "__pydantic_core_schema__") + or hasattr(origin, "__get_pydantic_core_schema__") + ) + + +def field_annotation_is_scalar(annotation: Any) -> bool: + # handle Ellipsis here to make tuple[int, ...] work nicely + return annotation is Ellipsis or not field_annotation_is_complex(annotation) + + +def field_annotation_is_scalar_sequence(annotation: Union[Type[Any], None]) -> bool: + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + at_least_one_scalar_sequence = False + for arg in get_args(annotation): + if field_annotation_is_scalar_sequence(arg): + at_least_one_scalar_sequence = True + continue + elif not field_annotation_is_scalar(arg): + return False + return at_least_one_scalar_sequence + return field_annotation_is_sequence(annotation) and all( + field_annotation_is_scalar(sub_annotation) + for sub_annotation in get_args(annotation) + ) + + +def is_bytes_or_nonable_bytes_annotation(annotation: Any) -> bool: + if lenient_issubclass(annotation, bytes): + return True + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + for arg in get_args(annotation): + if lenient_issubclass(arg, bytes): + return True + return False + + +def is_uploadfile_or_nonable_uploadfile_annotation(annotation: Any) -> bool: + if lenient_issubclass(annotation, UploadFile): + return True + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + for arg in get_args(annotation): + if lenient_issubclass(arg, UploadFile): + return True + return False + + +def is_bytes_sequence_annotation(annotation: Any) -> bool: + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + at_least_one = False + for arg in get_args(annotation): + if is_bytes_sequence_annotation(arg): + at_least_one = True + continue + return at_least_one + return field_annotation_is_sequence(annotation) and all( + is_bytes_or_nonable_bytes_annotation(sub_annotation) + for sub_annotation in get_args(annotation) + ) + + +def is_uploadfile_sequence_annotation(annotation: Any) -> bool: + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + at_least_one = False + for arg in get_args(annotation): + if is_uploadfile_sequence_annotation(arg): + at_least_one = True + continue + return at_least_one + return field_annotation_is_sequence(annotation) and all( + is_uploadfile_or_nonable_uploadfile_annotation(sub_annotation) + for sub_annotation in get_args(annotation) + ) + + +@lru_cache +def get_cached_model_fields(model: Type[BaseModel]) -> List[ModelField]: + return get_model_fields(model) diff --git a/venv/Lib/site-packages/fastapi/applications.py b/venv/Lib/site-packages/fastapi/applications.py new file mode 100644 index 00000000..05c7bd2b --- /dev/null +++ b/venv/Lib/site-packages/fastapi/applications.py @@ -0,0 +1,4588 @@ +from enum import Enum +from typing import ( + Any, + Awaitable, + Callable, + Coroutine, + Dict, + List, + Optional, + Sequence, + Type, + TypeVar, + Union, +) + +from fastapi import routing +from fastapi.datastructures import Default, DefaultPlaceholder +from fastapi.exception_handlers import ( + http_exception_handler, + request_validation_exception_handler, + websocket_request_validation_exception_handler, +) +from fastapi.exceptions import RequestValidationError, WebSocketRequestValidationError +from fastapi.logger import logger +from fastapi.openapi.docs import ( + get_redoc_html, + get_swagger_ui_html, + get_swagger_ui_oauth2_redirect_html, +) +from fastapi.openapi.utils import get_openapi +from fastapi.params import Depends +from fastapi.types import DecoratedCallable, IncEx +from fastapi.utils import generate_unique_id +from starlette.applications import Starlette +from starlette.datastructures import State +from starlette.exceptions import HTTPException +from starlette.middleware import Middleware +from starlette.middleware.base import BaseHTTPMiddleware +from starlette.requests import Request +from starlette.responses import HTMLResponse, JSONResponse, Response +from starlette.routing import BaseRoute +from starlette.types import ASGIApp, Lifespan, Receive, Scope, Send +from typing_extensions import Annotated, Doc, deprecated + +AppType = TypeVar("AppType", bound="FastAPI") + + +class FastAPI(Starlette): + """ + `FastAPI` app class, the main entrypoint to use FastAPI. + + Read more in the + [FastAPI docs for First Steps](https://fastapi.tiangolo.com/tutorial/first-steps/). + + ## Example + + ```python + from fastapi import FastAPI + + app = FastAPI() + ``` + """ + + def __init__( + self: AppType, + *, + debug: Annotated[ + bool, + Doc( + """ + Boolean indicating if debug tracebacks should be returned on server + errors. + + Read more in the + [Starlette docs for Applications](https://www.starlette.io/applications/#instantiating-the-application). + """ + ), + ] = False, + routes: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + **Note**: you probably shouldn't use this parameter, it is inherited + from Starlette and supported for compatibility. + + --- + + A list of routes to serve incoming HTTP and WebSocket requests. + """ + ), + deprecated( + """ + You normally wouldn't use this parameter with FastAPI, it is inherited + from Starlette and supported for compatibility. + + In FastAPI, you normally would use the *path operation methods*, + like `app.get()`, `app.post()`, etc. + """ + ), + ] = None, + title: Annotated[ + str, + Doc( + """ + The title of the API. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more in the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI(title="ChimichangApp") + ``` + """ + ), + ] = "FastAPI", + summary: Annotated[ + Optional[str], + Doc( + """ + A short summary of the API. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more in the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI(summary="Deadpond's favorite app. Nuff said.") + ``` + """ + ), + ] = None, + description: Annotated[ + str, + Doc( + ''' + A description of the API. Supports Markdown (using + [CommonMark syntax](https://commonmark.org/)). + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more in the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI( + description=""" + ChimichangApp API helps you do awesome stuff. 🚀 + + ## Items + + You can **read items**. + + ## Users + + You will be able to: + + * **Create users** (_not implemented_). + * **Read users** (_not implemented_). + + """ + ) + ``` + ''' + ), + ] = "", + version: Annotated[ + str, + Doc( + """ + The version of the API. + + **Note** This is the version of your application, not the version of + the OpenAPI specification nor the version of FastAPI being used. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more in the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI(version="0.0.1") + ``` + """ + ), + ] = "0.1.0", + openapi_url: Annotated[ + Optional[str], + Doc( + """ + The URL where the OpenAPI schema will be served from. + + If you set it to `None`, no OpenAPI schema will be served publicly, and + the default automatic endpoints `/docs` and `/redoc` will also be + disabled. + + Read more in the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#openapi-url). + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI(openapi_url="/api/v1/openapi.json") + ``` + """ + ), + ] = "/openapi.json", + openapi_tags: Annotated[ + Optional[List[Dict[str, Any]]], + Doc( + """ + A list of tags used by OpenAPI, these are the same `tags` you can set + in the *path operations*, like: + + * `@app.get("/users/", tags=["users"])` + * `@app.get("/items/", tags=["items"])` + + The order of the tags can be used to specify the order shown in + tools like Swagger UI, used in the automatic path `/docs`. + + It's not required to specify all the tags used. + + The tags that are not declared MAY be organized randomly or based + on the tools' logic. Each tag name in the list MUST be unique. + + The value of each item is a `dict` containing: + + * `name`: The name of the tag. + * `description`: A short description of the tag. + [CommonMark syntax](https://commonmark.org/) MAY be used for rich + text representation. + * `externalDocs`: Additional external documentation for this tag. If + provided, it would contain a `dict` with: + * `description`: A short description of the target documentation. + [CommonMark syntax](https://commonmark.org/) MAY be used for + rich text representation. + * `url`: The URL for the target documentation. Value MUST be in + the form of a URL. + + Read more in the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-tags). + + **Example** + + ```python + from fastapi import FastAPI + + tags_metadata = [ + { + "name": "users", + "description": "Operations with users. The **login** logic is also here.", + }, + { + "name": "items", + "description": "Manage items. So _fancy_ they have their own docs.", + "externalDocs": { + "description": "Items external docs", + "url": "https://fastapi.tiangolo.com/", + }, + }, + ] + + app = FastAPI(openapi_tags=tags_metadata) + ``` + """ + ), + ] = None, + servers: Annotated[ + Optional[List[Dict[str, Union[str, Any]]]], + Doc( + """ + A `list` of `dict`s with connectivity information to a target server. + + You would use it, for example, if your application is served from + different domains and you want to use the same Swagger UI in the + browser to interact with each of them (instead of having multiple + browser tabs open). Or if you want to leave fixed the possible URLs. + + If the servers `list` is not provided, or is an empty `list`, the + default value would be a `dict` with a `url` value of `/`. + + Each item in the `list` is a `dict` containing: + + * `url`: A URL to the target host. This URL supports Server Variables + and MAY be relative, to indicate that the host location is relative + to the location where the OpenAPI document is being served. Variable + substitutions will be made when a variable is named in `{`brackets`}`. + * `description`: An optional string describing the host designated by + the URL. [CommonMark syntax](https://commonmark.org/) MAY be used for + rich text representation. + * `variables`: A `dict` between a variable name and its value. The value + is used for substitution in the server's URL template. + + Read more in the + [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/#additional-servers). + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI( + servers=[ + {"url": "https://stag.example.com", "description": "Staging environment"}, + {"url": "https://prod.example.com", "description": "Production environment"}, + ] + ) + ``` + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of global dependencies, they will be applied to each + *path operation*, including in sub-routers. + + Read more about it in the + [FastAPI docs for Global Dependencies](https://fastapi.tiangolo.com/tutorial/dependencies/global-dependencies/). + + **Example** + + ```python + from fastapi import Depends, FastAPI + + from .dependencies import func_dep_1, func_dep_2 + + app = FastAPI(dependencies=[Depends(func_dep_1), Depends(func_dep_2)]) + ``` + """ + ), + ] = None, + default_response_class: Annotated[ + Type[Response], + Doc( + """ + The default response class to be used. + + Read more in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class). + + **Example** + + ```python + from fastapi import FastAPI + from fastapi.responses import ORJSONResponse + + app = FastAPI(default_response_class=ORJSONResponse) + ``` + """ + ), + ] = Default(JSONResponse), + redirect_slashes: Annotated[ + bool, + Doc( + """ + Whether to detect and redirect slashes in URLs when the client doesn't + use the same format. + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI(redirect_slashes=True) # the default + + @app.get("/items/") + async def read_items(): + return [{"item_id": "Foo"}] + ``` + + With this app, if a client goes to `/items` (without a trailing slash), + they will be automatically redirected with an HTTP status code of 307 + to `/items/`. + """ + ), + ] = True, + docs_url: Annotated[ + Optional[str], + Doc( + """ + The path to the automatic interactive API documentation. + It is handled in the browser by Swagger UI. + + The default URL is `/docs`. You can disable it by setting it to `None`. + + If `openapi_url` is set to `None`, this will be automatically disabled. + + Read more in the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#docs-urls). + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI(docs_url="/documentation", redoc_url=None) + ``` + """ + ), + ] = "/docs", + redoc_url: Annotated[ + Optional[str], + Doc( + """ + The path to the alternative automatic interactive API documentation + provided by ReDoc. + + The default URL is `/redoc`. You can disable it by setting it to `None`. + + If `openapi_url` is set to `None`, this will be automatically disabled. + + Read more in the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#docs-urls). + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI(docs_url="/documentation", redoc_url="redocumentation") + ``` + """ + ), + ] = "/redoc", + swagger_ui_oauth2_redirect_url: Annotated[ + Optional[str], + Doc( + """ + The OAuth2 redirect endpoint for the Swagger UI. + + By default it is `/docs/oauth2-redirect`. + + This is only used if you use OAuth2 (with the "Authorize" button) + with Swagger UI. + """ + ), + ] = "/docs/oauth2-redirect", + swagger_ui_init_oauth: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + OAuth2 configuration for the Swagger UI, by default shown at `/docs`. + + Read more about the available configuration options in the + [Swagger UI docs](https://swagger.io/docs/open-source-tools/swagger-ui/usage/oauth2/). + """ + ), + ] = None, + middleware: Annotated[ + Optional[Sequence[Middleware]], + Doc( + """ + List of middleware to be added when creating the application. + + In FastAPI you would normally do this with `app.add_middleware()` + instead. + + Read more in the + [FastAPI docs for Middleware](https://fastapi.tiangolo.com/tutorial/middleware/). + """ + ), + ] = None, + exception_handlers: Annotated[ + Optional[ + Dict[ + Union[int, Type[Exception]], + Callable[[Request, Any], Coroutine[Any, Any, Response]], + ] + ], + Doc( + """ + A dictionary with handlers for exceptions. + + In FastAPI, you would normally use the decorator + `@app.exception_handler()`. + + Read more in the + [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/). + """ + ), + ] = None, + on_startup: Annotated[ + Optional[Sequence[Callable[[], Any]]], + Doc( + """ + A list of startup event handler functions. + + You should instead use the `lifespan` handlers. + + Read more in the [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). + """ + ), + ] = None, + on_shutdown: Annotated[ + Optional[Sequence[Callable[[], Any]]], + Doc( + """ + A list of shutdown event handler functions. + + You should instead use the `lifespan` handlers. + + Read more in the + [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). + """ + ), + ] = None, + lifespan: Annotated[ + Optional[Lifespan[AppType]], + Doc( + """ + A `Lifespan` context manager handler. This replaces `startup` and + `shutdown` functions with a single context manager. + + Read more in the + [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). + """ + ), + ] = None, + terms_of_service: Annotated[ + Optional[str], + Doc( + """ + A URL to the Terms of Service for your API. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more at the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). + + **Example** + + ```python + app = FastAPI(terms_of_service="http://example.com/terms/") + ``` + """ + ), + ] = None, + contact: Annotated[ + Optional[Dict[str, Union[str, Any]]], + Doc( + """ + A dictionary with the contact information for the exposed API. + + It can contain several fields. + + * `name`: (`str`) The name of the contact person/organization. + * `url`: (`str`) A URL pointing to the contact information. MUST be in + the format of a URL. + * `email`: (`str`) The email address of the contact person/organization. + MUST be in the format of an email address. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more at the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). + + **Example** + + ```python + app = FastAPI( + contact={ + "name": "Deadpoolio the Amazing", + "url": "http://x-force.example.com/contact/", + "email": "dp@x-force.example.com", + } + ) + ``` + """ + ), + ] = None, + license_info: Annotated[ + Optional[Dict[str, Union[str, Any]]], + Doc( + """ + A dictionary with the license information for the exposed API. + + It can contain several fields. + + * `name`: (`str`) **REQUIRED** (if a `license_info` is set). The + license name used for the API. + * `identifier`: (`str`) An [SPDX](https://spdx.dev/) license expression + for the API. The `identifier` field is mutually exclusive of the `url` + field. Available since OpenAPI 3.1.0, FastAPI 0.99.0. + * `url`: (`str`) A URL to the license used for the API. This MUST be + the format of a URL. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more at the + [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api). + + **Example** + + ```python + app = FastAPI( + license_info={ + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0.html", + } + ) + ``` + """ + ), + ] = None, + openapi_prefix: Annotated[ + str, + Doc( + """ + A URL prefix for the OpenAPI URL. + """ + ), + deprecated( + """ + "openapi_prefix" has been deprecated in favor of "root_path", which + follows more closely the ASGI standard, is simpler, and more + automatic. + """ + ), + ] = "", + root_path: Annotated[ + str, + Doc( + """ + A path prefix handled by a proxy that is not seen by the application + but is seen by external clients, which affects things like Swagger UI. + + Read more about it at the + [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/). + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI(root_path="/api/v1") + ``` + """ + ), + ] = "", + root_path_in_servers: Annotated[ + bool, + Doc( + """ + To disable automatically generating the URLs in the `servers` field + in the autogenerated OpenAPI using the `root_path`. + + Read more about it in the + [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/#disable-automatic-server-from-root_path). + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI(root_path_in_servers=False) + ``` + """ + ), + ] = True, + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses to be shown in OpenAPI. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/). + + And in the + [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + OpenAPI callbacks that should apply to all *path operations*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + webhooks: Annotated[ + Optional[routing.APIRouter], + Doc( + """ + Add OpenAPI webhooks. This is similar to `callbacks` but it doesn't + depend on specific *path operations*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + **Note**: This is available since OpenAPI 3.1.0, FastAPI 0.99.0. + + Read more about it in the + [FastAPI docs for OpenAPI Webhooks](https://fastapi.tiangolo.com/advanced/openapi-webhooks/). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark all *path operations* as deprecated. You probably don't need it, + but it's available. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + To include (or not) all the *path operations* in the generated OpenAPI. + You probably don't need it, but it's available. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + swagger_ui_parameters: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Parameters to configure Swagger UI, the autogenerated interactive API + documentation (by default at `/docs`). + + Read more about it in the + [FastAPI docs about how to Configure Swagger UI](https://fastapi.tiangolo.com/how-to/configure-swagger-ui/). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[routing.APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + separate_input_output_schemas: Annotated[ + bool, + Doc( + """ + Whether to generate separate OpenAPI schemas for request body and + response body when the results would be more precise. + + This is particularly useful when automatically generating clients. + + For example, if you have a model like: + + ```python + from pydantic import BaseModel + + class Item(BaseModel): + name: str + tags: list[str] = [] + ``` + + When `Item` is used for input, a request body, `tags` is not required, + the client doesn't have to provide it. + + But when using `Item` for output, for a response body, `tags` is always + available because it has a default value, even if it's just an empty + list. So, the client should be able to always expect it. + + In this case, there would be two different schemas, one for input and + another one for output. + """ + ), + ] = True, + **extra: Annotated[ + Any, + Doc( + """ + Extra keyword arguments to be stored in the app, not used by FastAPI + anywhere. + """ + ), + ], + ) -> None: + self.debug = debug + self.title = title + self.summary = summary + self.description = description + self.version = version + self.terms_of_service = terms_of_service + self.contact = contact + self.license_info = license_info + self.openapi_url = openapi_url + self.openapi_tags = openapi_tags + self.root_path_in_servers = root_path_in_servers + self.docs_url = docs_url + self.redoc_url = redoc_url + self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url + self.swagger_ui_init_oauth = swagger_ui_init_oauth + self.swagger_ui_parameters = swagger_ui_parameters + self.servers = servers or [] + self.separate_input_output_schemas = separate_input_output_schemas + self.extra = extra + self.openapi_version: Annotated[ + str, + Doc( + """ + The version string of OpenAPI. + + FastAPI will generate OpenAPI version 3.1.0, and will output that as + the OpenAPI version. But some tools, even though they might be + compatible with OpenAPI 3.1.0, might not recognize it as a valid. + + So you could override this value to trick those tools into using + the generated OpenAPI. Have in mind that this is a hack. But if you + avoid using features added in OpenAPI 3.1.0, it might work for your + use case. + + This is not passed as a parameter to the `FastAPI` class to avoid + giving the false idea that FastAPI would generate a different OpenAPI + schema. It is only available as an attribute. + + **Example** + + ```python + from fastapi import FastAPI + + app = FastAPI() + + app.openapi_version = "3.0.2" + ``` + """ + ), + ] = "3.1.0" + self.openapi_schema: Optional[Dict[str, Any]] = None + if self.openapi_url: + assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'" + assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'" + # TODO: remove when discarding the openapi_prefix parameter + if openapi_prefix: + logger.warning( + '"openapi_prefix" has been deprecated in favor of "root_path", which ' + "follows more closely the ASGI standard, is simpler, and more " + "automatic. Check the docs at " + "https://fastapi.tiangolo.com/advanced/sub-applications/" + ) + self.webhooks: Annotated[ + routing.APIRouter, + Doc( + """ + The `app.webhooks` attribute is an `APIRouter` with the *path + operations* that will be used just for documentation of webhooks. + + Read more about it in the + [FastAPI docs for OpenAPI Webhooks](https://fastapi.tiangolo.com/advanced/openapi-webhooks/). + """ + ), + ] = webhooks or routing.APIRouter() + self.root_path = root_path or openapi_prefix + self.state: Annotated[ + State, + Doc( + """ + A state object for the application. This is the same object for the + entire application, it doesn't change from request to request. + + You normally wouldn't use this in FastAPI, for most of the cases you + would instead use FastAPI dependencies. + + This is simply inherited from Starlette. + + Read more about it in the + [Starlette docs for Applications](https://www.starlette.io/applications/#storing-state-on-the-app-instance). + """ + ), + ] = State() + self.dependency_overrides: Annotated[ + Dict[Callable[..., Any], Callable[..., Any]], + Doc( + """ + A dictionary with overrides for the dependencies. + + Each key is the original dependency callable, and the value is the + actual dependency that should be called. + + This is for testing, to replace expensive dependencies with testing + versions. + + Read more about it in the + [FastAPI docs for Testing Dependencies with Overrides](https://fastapi.tiangolo.com/advanced/testing-dependencies/). + """ + ), + ] = {} + self.router: routing.APIRouter = routing.APIRouter( + routes=routes, + redirect_slashes=redirect_slashes, + dependency_overrides_provider=self, + on_startup=on_startup, + on_shutdown=on_shutdown, + lifespan=lifespan, + default_response_class=default_response_class, + dependencies=dependencies, + callbacks=callbacks, + deprecated=deprecated, + include_in_schema=include_in_schema, + responses=responses, + generate_unique_id_function=generate_unique_id_function, + ) + self.exception_handlers: Dict[ + Any, Callable[[Request, Any], Union[Response, Awaitable[Response]]] + ] = {} if exception_handlers is None else dict(exception_handlers) + self.exception_handlers.setdefault(HTTPException, http_exception_handler) + self.exception_handlers.setdefault( + RequestValidationError, request_validation_exception_handler + ) + self.exception_handlers.setdefault( + WebSocketRequestValidationError, + # Starlette still has incorrect type specification for the handlers + websocket_request_validation_exception_handler, # type: ignore + ) + + self.user_middleware: List[Middleware] = ( + [] if middleware is None else list(middleware) + ) + self.middleware_stack: Union[ASGIApp, None] = None + self.setup() + + def openapi(self) -> Dict[str, Any]: + """ + Generate the OpenAPI schema of the application. This is called by FastAPI + internally. + + The first time it is called it stores the result in the attribute + `app.openapi_schema`, and next times it is called, it just returns that same + result. To avoid the cost of generating the schema every time. + + If you need to modify the generated OpenAPI schema, you could modify it. + + Read more in the + [FastAPI docs for OpenAPI](https://fastapi.tiangolo.com/how-to/extending-openapi/). + """ + if not self.openapi_schema: + self.openapi_schema = get_openapi( + title=self.title, + version=self.version, + openapi_version=self.openapi_version, + summary=self.summary, + description=self.description, + terms_of_service=self.terms_of_service, + contact=self.contact, + license_info=self.license_info, + routes=self.routes, + webhooks=self.webhooks.routes, + tags=self.openapi_tags, + servers=self.servers, + separate_input_output_schemas=self.separate_input_output_schemas, + ) + return self.openapi_schema + + def setup(self) -> None: + if self.openapi_url: + urls = (server_data.get("url") for server_data in self.servers) + server_urls = {url for url in urls if url} + + async def openapi(req: Request) -> JSONResponse: + root_path = req.scope.get("root_path", "").rstrip("/") + if root_path not in server_urls: + if root_path and self.root_path_in_servers: + self.servers.insert(0, {"url": root_path}) + server_urls.add(root_path) + return JSONResponse(self.openapi()) + + self.add_route(self.openapi_url, openapi, include_in_schema=False) + if self.openapi_url and self.docs_url: + + async def swagger_ui_html(req: Request) -> HTMLResponse: + root_path = req.scope.get("root_path", "").rstrip("/") + openapi_url = root_path + self.openapi_url + oauth2_redirect_url = self.swagger_ui_oauth2_redirect_url + if oauth2_redirect_url: + oauth2_redirect_url = root_path + oauth2_redirect_url + return get_swagger_ui_html( + openapi_url=openapi_url, + title=f"{self.title} - Swagger UI", + oauth2_redirect_url=oauth2_redirect_url, + init_oauth=self.swagger_ui_init_oauth, + swagger_ui_parameters=self.swagger_ui_parameters, + ) + + self.add_route(self.docs_url, swagger_ui_html, include_in_schema=False) + + if self.swagger_ui_oauth2_redirect_url: + + async def swagger_ui_redirect(req: Request) -> HTMLResponse: + return get_swagger_ui_oauth2_redirect_html() + + self.add_route( + self.swagger_ui_oauth2_redirect_url, + swagger_ui_redirect, + include_in_schema=False, + ) + if self.openapi_url and self.redoc_url: + + async def redoc_html(req: Request) -> HTMLResponse: + root_path = req.scope.get("root_path", "").rstrip("/") + openapi_url = root_path + self.openapi_url + return get_redoc_html( + openapi_url=openapi_url, title=f"{self.title} - ReDoc" + ) + + self.add_route(self.redoc_url, redoc_html, include_in_schema=False) + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if self.root_path: + scope["root_path"] = self.root_path + await super().__call__(scope, receive, send) + + def add_api_route( + self, + path: str, + endpoint: Callable[..., Any], + *, + response_model: Any = Default(None), + status_code: Optional[int] = None, + tags: Optional[List[Union[str, Enum]]] = None, + dependencies: Optional[Sequence[Depends]] = None, + summary: Optional[str] = None, + description: Optional[str] = None, + response_description: str = "Successful Response", + responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, + deprecated: Optional[bool] = None, + methods: Optional[List[str]] = None, + operation_id: Optional[str] = None, + response_model_include: Optional[IncEx] = None, + response_model_exclude: Optional[IncEx] = None, + response_model_by_alias: bool = True, + response_model_exclude_unset: bool = False, + response_model_exclude_defaults: bool = False, + response_model_exclude_none: bool = False, + include_in_schema: bool = True, + response_class: Union[Type[Response], DefaultPlaceholder] = Default( + JSONResponse + ), + name: Optional[str] = None, + openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), + ) -> None: + self.router.add_api_route( + path, + endpoint=endpoint, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=methods, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def api_route( + self, + path: str, + *, + response_model: Any = Default(None), + status_code: Optional[int] = None, + tags: Optional[List[Union[str, Enum]]] = None, + dependencies: Optional[Sequence[Depends]] = None, + summary: Optional[str] = None, + description: Optional[str] = None, + response_description: str = "Successful Response", + responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, + deprecated: Optional[bool] = None, + methods: Optional[List[str]] = None, + operation_id: Optional[str] = None, + response_model_include: Optional[IncEx] = None, + response_model_exclude: Optional[IncEx] = None, + response_model_by_alias: bool = True, + response_model_exclude_unset: bool = False, + response_model_exclude_defaults: bool = False, + response_model_exclude_none: bool = False, + include_in_schema: bool = True, + response_class: Type[Response] = Default(JSONResponse), + name: Optional[str] = None, + openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[routing.APIRoute], str] = Default( + generate_unique_id + ), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + def decorator(func: DecoratedCallable) -> DecoratedCallable: + self.router.add_api_route( + path, + func, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=methods, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + return func + + return decorator + + def add_api_websocket_route( + self, + path: str, + endpoint: Callable[..., Any], + name: Optional[str] = None, + *, + dependencies: Optional[Sequence[Depends]] = None, + ) -> None: + self.router.add_api_websocket_route( + path, + endpoint, + name=name, + dependencies=dependencies, + ) + + def websocket( + self, + path: Annotated[ + str, + Doc( + """ + WebSocket path. + """ + ), + ], + name: Annotated[ + Optional[str], + Doc( + """ + A name for the WebSocket. Only used internally. + """ + ), + ] = None, + *, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be used for this + WebSocket. + + Read more about it in the + [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). + """ + ), + ] = None, + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Decorate a WebSocket function. + + Read more about it in the + [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). + + **Example** + + ```python + from fastapi import FastAPI, WebSocket + + app = FastAPI() + + @app.websocket("/ws") + async def websocket_endpoint(websocket: WebSocket): + await websocket.accept() + while True: + data = await websocket.receive_text() + await websocket.send_text(f"Message text was: {data}") + ``` + """ + + def decorator(func: DecoratedCallable) -> DecoratedCallable: + self.add_api_websocket_route( + path, + func, + name=name, + dependencies=dependencies, + ) + return func + + return decorator + + def include_router( + self, + router: Annotated[routing.APIRouter, Doc("The `APIRouter` to include.")], + *, + prefix: Annotated[str, Doc("An optional path prefix for the router.")] = "", + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to all the *path operations* in this + router. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to all the + *path operations* in this router. + + Read more about it in the + [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). + + **Example** + + ```python + from fastapi import Depends, FastAPI + + from .dependencies import get_token_header + from .internal import admin + + app = FastAPI() + + app.include_router( + admin.router, + dependencies=[Depends(get_token_header)], + ) + ``` + """ + ), + ] = None, + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses to be shown in OpenAPI. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/). + + And in the + [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark all the *path operations* in this router as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + **Example** + + ```python + from fastapi import FastAPI + + from .internal import old_api + + app = FastAPI() + + app.include_router( + old_api.router, + deprecated=True, + ) + ``` + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include (or not) all the *path operations* in this router in the + generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + **Example** + + ```python + from fastapi import FastAPI + + from .internal import old_api + + app = FastAPI() + + app.include_router( + old_api.router, + include_in_schema=False, + ) + ``` + """ + ), + ] = True, + default_response_class: Annotated[ + Type[Response], + Doc( + """ + Default response class to be used for the *path operations* in this + router. + + Read more in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class). + + **Example** + + ```python + from fastapi import FastAPI + from fastapi.responses import ORJSONResponse + + from .internal import old_api + + app = FastAPI() + + app.include_router( + old_api.router, + default_response_class=ORJSONResponse, + ) + ``` + """ + ), + ] = Default(JSONResponse), + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[routing.APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> None: + """ + Include an `APIRouter` in the same app. + + Read more about it in the + [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/). + + ## Example + + ```python + from fastapi import FastAPI + + from .users import users_router + + app = FastAPI() + + app.include_router(users_router) + ``` + """ + self.router.include_router( + router, + prefix=prefix, + tags=tags, + dependencies=dependencies, + responses=responses, + deprecated=deprecated, + include_in_schema=include_in_schema, + default_response_class=default_response_class, + callbacks=callbacks, + generate_unique_id_function=generate_unique_id_function, + ) + + def get( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[routing.APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP GET operation. + + ## Example + + ```python + from fastapi import FastAPI + + app = FastAPI() + + @app.get("/items/") + def read_items(): + return [{"name": "Empanada"}, {"name": "Arepa"}] + ``` + """ + return self.router.get( + path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def put( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[routing.APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP PUT operation. + + ## Example + + ```python + from fastapi import FastAPI + from pydantic import BaseModel + + class Item(BaseModel): + name: str + description: str | None = None + + app = FastAPI() + + @app.put("/items/{item_id}") + def replace_item(item_id: str, item: Item): + return {"message": "Item replaced", "id": item_id} + ``` + """ + return self.router.put( + path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def post( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[routing.APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP POST operation. + + ## Example + + ```python + from fastapi import FastAPI + from pydantic import BaseModel + + class Item(BaseModel): + name: str + description: str | None = None + + app = FastAPI() + + @app.post("/items/") + def create_item(item: Item): + return {"message": "Item created"} + ``` + """ + return self.router.post( + path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def delete( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[routing.APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP DELETE operation. + + ## Example + + ```python + from fastapi import FastAPI + + app = FastAPI() + + @app.delete("/items/{item_id}") + def delete_item(item_id: str): + return {"message": "Item deleted"} + ``` + """ + return self.router.delete( + path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def options( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[routing.APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP OPTIONS operation. + + ## Example + + ```python + from fastapi import FastAPI + + app = FastAPI() + + @app.options("/items/") + def get_item_options(): + return {"additions": ["Aji", "Guacamole"]} + ``` + """ + return self.router.options( + path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def head( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[routing.APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP HEAD operation. + + ## Example + + ```python + from fastapi import FastAPI, Response + + app = FastAPI() + + @app.head("/items/", status_code=204) + def get_items_headers(response: Response): + response.headers["X-Cat-Dog"] = "Alone in the world" + ``` + """ + return self.router.head( + path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def patch( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[routing.APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP PATCH operation. + + ## Example + + ```python + from fastapi import FastAPI + from pydantic import BaseModel + + class Item(BaseModel): + name: str + description: str | None = None + + app = FastAPI() + + @app.patch("/items/") + def update_item(item: Item): + return {"message": "Item updated in place"} + ``` + """ + return self.router.patch( + path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def trace( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[routing.APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP TRACE operation. + + ## Example + + ```python + from fastapi import FastAPI + + app = FastAPI() + + @app.trace("/items/{item_id}") + def trace_item(item_id: str): + return None + ``` + """ + return self.router.trace( + path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def websocket_route( + self, path: str, name: Union[str, None] = None + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + def decorator(func: DecoratedCallable) -> DecoratedCallable: + self.router.add_websocket_route(path, func, name=name) + return func + + return decorator + + @deprecated( + """ + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + """ + ) + def on_event( + self, + event_type: Annotated[ + str, + Doc( + """ + The type of event. `startup` or `shutdown`. + """ + ), + ], + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add an event handler for the application. + + `on_event` is deprecated, use `lifespan` event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/#alternative-events-deprecated). + """ + return self.router.on_event(event_type) + + def middleware( + self, + middleware_type: Annotated[ + str, + Doc( + """ + The type of middleware. Currently only supports `http`. + """ + ), + ], + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a middleware to the application. + + Read more about it in the + [FastAPI docs for Middleware](https://fastapi.tiangolo.com/tutorial/middleware/). + + ## Example + + ```python + import time + from typing import Awaitable, Callable + + from fastapi import FastAPI, Request, Response + + app = FastAPI() + + + @app.middleware("http") + async def add_process_time_header( + request: Request, call_next: Callable[[Request], Awaitable[Response]] + ) -> Response: + start_time = time.time() + response = await call_next(request) + process_time = time.time() - start_time + response.headers["X-Process-Time"] = str(process_time) + return response + ``` + """ + + def decorator(func: DecoratedCallable) -> DecoratedCallable: + self.add_middleware(BaseHTTPMiddleware, dispatch=func) + return func + + return decorator + + def exception_handler( + self, + exc_class_or_status_code: Annotated[ + Union[int, Type[Exception]], + Doc( + """ + The Exception class this would handle, or a status code. + """ + ), + ], + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add an exception handler to the app. + + Read more about it in the + [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/). + + ## Example + + ```python + from fastapi import FastAPI, Request + from fastapi.responses import JSONResponse + + + class UnicornException(Exception): + def __init__(self, name: str): + self.name = name + + + app = FastAPI() + + + @app.exception_handler(UnicornException) + async def unicorn_exception_handler(request: Request, exc: UnicornException): + return JSONResponse( + status_code=418, + content={"message": f"Oops! {exc.name} did something. There goes a rainbow..."}, + ) + ``` + """ + + def decorator(func: DecoratedCallable) -> DecoratedCallable: + self.add_exception_handler(exc_class_or_status_code, func) + return func + + return decorator diff --git a/venv/Lib/site-packages/fastapi/background.py b/venv/Lib/site-packages/fastapi/background.py new file mode 100644 index 00000000..203578a4 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/background.py @@ -0,0 +1,59 @@ +from typing import Any, Callable + +from starlette.background import BackgroundTasks as StarletteBackgroundTasks +from typing_extensions import Annotated, Doc, ParamSpec + +P = ParamSpec("P") + + +class BackgroundTasks(StarletteBackgroundTasks): + """ + A collection of background tasks that will be called after a response has been + sent to the client. + + Read more about it in the + [FastAPI docs for Background Tasks](https://fastapi.tiangolo.com/tutorial/background-tasks/). + + ## Example + + ```python + from fastapi import BackgroundTasks, FastAPI + + app = FastAPI() + + + def write_notification(email: str, message=""): + with open("log.txt", mode="w") as email_file: + content = f"notification for {email}: {message}" + email_file.write(content) + + + @app.post("/send-notification/{email}") + async def send_notification(email: str, background_tasks: BackgroundTasks): + background_tasks.add_task(write_notification, email, message="some notification") + return {"message": "Notification sent in the background"} + ``` + """ + + def add_task( + self, + func: Annotated[ + Callable[P, Any], + Doc( + """ + The function to call after the response is sent. + + It can be a regular `def` function or an `async def` function. + """ + ), + ], + *args: P.args, + **kwargs: P.kwargs, + ) -> None: + """ + Add a function to be called in the background after the response is sent. + + Read more about it in the + [FastAPI docs for Background Tasks](https://fastapi.tiangolo.com/tutorial/background-tasks/). + """ + return super().add_task(func, *args, **kwargs) diff --git a/venv/Lib/site-packages/fastapi/cli.py b/venv/Lib/site-packages/fastapi/cli.py new file mode 100644 index 00000000..8d3301e9 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/cli.py @@ -0,0 +1,13 @@ +try: + from fastapi_cli.cli import main as cli_main + +except ImportError: # pragma: no cover + cli_main = None # type: ignore + + +def main() -> None: + if not cli_main: # type: ignore[truthy-function] + message = 'To use the fastapi command, please install "fastapi[standard]":\n\n\tpip install "fastapi[standard]"\n' + print(message) + raise RuntimeError(message) # noqa: B904 + cli_main() diff --git a/venv/Lib/site-packages/fastapi/concurrency.py b/venv/Lib/site-packages/fastapi/concurrency.py new file mode 100644 index 00000000..3202c707 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/concurrency.py @@ -0,0 +1,39 @@ +from contextlib import asynccontextmanager as asynccontextmanager +from typing import AsyncGenerator, ContextManager, TypeVar + +import anyio.to_thread +from anyio import CapacityLimiter +from starlette.concurrency import iterate_in_threadpool as iterate_in_threadpool # noqa +from starlette.concurrency import run_in_threadpool as run_in_threadpool # noqa +from starlette.concurrency import ( # noqa + run_until_first_complete as run_until_first_complete, +) + +_T = TypeVar("_T") + + +@asynccontextmanager +async def contextmanager_in_threadpool( + cm: ContextManager[_T], +) -> AsyncGenerator[_T, None]: + # blocking __exit__ from running waiting on a free thread + # can create race conditions/deadlocks if the context manager itself + # has its own internal pool (e.g. a database connection pool) + # to avoid this we let __exit__ run without a capacity limit + # since we're creating a new limiter for each call, any non-zero limit + # works (1 is arbitrary) + exit_limiter = CapacityLimiter(1) + try: + yield await run_in_threadpool(cm.__enter__) + except Exception as e: + ok = bool( + await anyio.to_thread.run_sync( + cm.__exit__, type(e), e, e.__traceback__, limiter=exit_limiter + ) + ) + if not ok: + raise e + else: + await anyio.to_thread.run_sync( + cm.__exit__, None, None, None, limiter=exit_limiter + ) diff --git a/venv/Lib/site-packages/fastapi/datastructures.py b/venv/Lib/site-packages/fastapi/datastructures.py new file mode 100644 index 00000000..cf8406b0 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/datastructures.py @@ -0,0 +1,204 @@ +from typing import ( + Any, + BinaryIO, + Callable, + Dict, + Iterable, + Optional, + Type, + TypeVar, + cast, +) + +from fastapi._compat import ( + PYDANTIC_V2, + CoreSchema, + GetJsonSchemaHandler, + JsonSchemaValue, + with_info_plain_validator_function, +) +from starlette.datastructures import URL as URL # noqa: F401 +from starlette.datastructures import Address as Address # noqa: F401 +from starlette.datastructures import FormData as FormData # noqa: F401 +from starlette.datastructures import Headers as Headers # noqa: F401 +from starlette.datastructures import QueryParams as QueryParams # noqa: F401 +from starlette.datastructures import State as State # noqa: F401 +from starlette.datastructures import UploadFile as StarletteUploadFile +from typing_extensions import Annotated, Doc + + +class UploadFile(StarletteUploadFile): + """ + A file uploaded in a request. + + Define it as a *path operation function* (or dependency) parameter. + + If you are using a regular `def` function, you can use the `upload_file.file` + attribute to access the raw standard Python file (blocking, not async), useful and + needed for non-async code. + + Read more about it in the + [FastAPI docs for Request Files](https://fastapi.tiangolo.com/tutorial/request-files/). + + ## Example + + ```python + from typing import Annotated + + from fastapi import FastAPI, File, UploadFile + + app = FastAPI() + + + @app.post("/files/") + async def create_file(file: Annotated[bytes, File()]): + return {"file_size": len(file)} + + + @app.post("/uploadfile/") + async def create_upload_file(file: UploadFile): + return {"filename": file.filename} + ``` + """ + + file: Annotated[ + BinaryIO, + Doc("The standard Python file object (non-async)."), + ] + filename: Annotated[Optional[str], Doc("The original file name.")] + size: Annotated[Optional[int], Doc("The size of the file in bytes.")] + headers: Annotated[Headers, Doc("The headers of the request.")] + content_type: Annotated[ + Optional[str], Doc("The content type of the request, from the headers.") + ] + + async def write( + self, + data: Annotated[ + bytes, + Doc( + """ + The bytes to write to the file. + """ + ), + ], + ) -> None: + """ + Write some bytes to the file. + + You normally wouldn't use this from a file you read in a request. + + To be awaitable, compatible with async, this is run in threadpool. + """ + return await super().write(data) + + async def read( + self, + size: Annotated[ + int, + Doc( + """ + The number of bytes to read from the file. + """ + ), + ] = -1, + ) -> bytes: + """ + Read some bytes from the file. + + To be awaitable, compatible with async, this is run in threadpool. + """ + return await super().read(size) + + async def seek( + self, + offset: Annotated[ + int, + Doc( + """ + The position in bytes to seek to in the file. + """ + ), + ], + ) -> None: + """ + Move to a position in the file. + + Any next read or write will be done from that position. + + To be awaitable, compatible with async, this is run in threadpool. + """ + return await super().seek(offset) + + async def close(self) -> None: + """ + Close the file. + + To be awaitable, compatible with async, this is run in threadpool. + """ + return await super().close() + + @classmethod + def __get_validators__(cls: Type["UploadFile"]) -> Iterable[Callable[..., Any]]: + yield cls.validate + + @classmethod + def validate(cls: Type["UploadFile"], v: Any) -> Any: + if not isinstance(v, StarletteUploadFile): + raise ValueError(f"Expected UploadFile, received: {type(v)}") + return v + + @classmethod + def _validate(cls, __input_value: Any, _: Any) -> "UploadFile": + if not isinstance(__input_value, StarletteUploadFile): + raise ValueError(f"Expected UploadFile, received: {type(__input_value)}") + return cast(UploadFile, __input_value) + + if not PYDANTIC_V2: + + @classmethod + def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None: + field_schema.update({"type": "string", "format": "binary"}) + + @classmethod + def __get_pydantic_json_schema__( + cls, core_schema: CoreSchema, handler: GetJsonSchemaHandler + ) -> JsonSchemaValue: + return {"type": "string", "format": "binary"} + + @classmethod + def __get_pydantic_core_schema__( + cls, source: Type[Any], handler: Callable[[Any], CoreSchema] + ) -> CoreSchema: + return with_info_plain_validator_function(cls._validate) + + +class DefaultPlaceholder: + """ + You shouldn't use this class directly. + + It's used internally to recognize when a default value has been overwritten, even + if the overridden default value was truthy. + """ + + def __init__(self, value: Any): + self.value = value + + def __bool__(self) -> bool: + return bool(self.value) + + def __eq__(self, o: object) -> bool: + return isinstance(o, DefaultPlaceholder) and o.value == self.value + + +DefaultType = TypeVar("DefaultType") + + +def Default(value: DefaultType) -> DefaultType: + """ + You shouldn't use this function directly. + + It's used internally to recognize when a default value has been overwritten, even + if the overridden default value was truthy. + """ + return DefaultPlaceholder(value) # type: ignore diff --git a/venv/Lib/site-packages/fastapi/dependencies/__init__.py b/venv/Lib/site-packages/fastapi/dependencies/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d200cfed17d432faaeb93c2d7af4840504f9180 GIT binary patch literal 185 zcmX@j%ge<81l^YsGC=fW5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!ig31y2`x@7Dvt5? z^bCn{NiEJU$uEd0%g;C5r~UHjE~HWjEqIh GKo$VQ2r?l6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc b/venv/Lib/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c4ec2a98f3de2d570a62b0f316e500ea196e07f GIT binary patch literal 2728 zcmZuz&2Jk;6rWv>9e*Zm9Otu5o92T!X%e7mL8wqdsz7N8&?bOZLCa=$l9;T$?##Mi z=phG?f)G+TH9Zj|4n^$&Bo6r#khs`566r_?5aPfsC`d@0cyGNnPMVSSxAQ({=FNL= z_lHCxN??5Y<2x(A2MPHdiP`|#8~f|zjK1Pn%%1V=6&b(5%mUB2#TN|0On+0}E8r9RPr~F5VMJ3bqN($Q z1sJuIi@>#1EyzNwiG{m>!UrS)loZu8mC2g#>#&IoXIYkWWeY6hEvO4~1z58(BuppI zL^>kFx}Gz#OxI;p*RzgQuyG#O^_vC5u1a_uyvr6{H*z`0HSm~1*ZDEv@-RXK*N=1IT@2pEyI=;Zn500g=?9`1(9*tSl%#K zjb$blmJHz<`OJjH@+@aT5Hn0nz^<4r#`8tqjH@BwvZ4pzWAbaNuR{BFhep# zXha({=#f5R4I05CHR25#p(8aCEM!%4A#61rsnHBRTKt`cQNxO8$JlY!>hq#LFA2Oh zE5=ewDoT85+?TdDSR{O2M+2|f=XEylT6|tt1Mis6>u%s3_jx@HyjGug0(hb7Ui}>< zJxQB(lJ&B%mGbpYHQ2Tz5AVb3c+gqD)6=XEbPk`ekF{E{>WQleKD#`hJy!QeR67GL z;e?D__OjB*xlqzA7F#k3wyQ50rt9#cjO7h?Mb8`D$O;*U4#0~wDzU;0i}5;XI?if_ z)yUYQW7SpTjhQb~^}^-)T9tzvvR@F_Z`11`jrP4M+i0*?1%fe0q&6796J=T==g48|$YF zFPAU8{Nsh!zF(|7`FdsadS&oNscUYXe%9>uH~2(_ICBd;H=FL~$H4_}MMxr007-55 zJn<7qV_NMN3}F}{jWB}X z1qKf#>7wJZwD2{&v{5(QCg4d@pT)evmxVX3pf&7^KHjv&P*crIAc6Fm|2fbe}zsR$vetl%@+NA zSZ?)fpSt+{+|Eb%$gC6MP2E00dBy$WAB3w&kDso@Hp*lq7#yRz<9X!pU*J)F5( zdi{-^nKwaN0F#w1ac_F-{c`W)<k=$n62B{;8CZv!u4 zHhoOS>c2lsaICdzPKDfJK9gInW`UOvUTS%Xf_3ZNux#d91%TWcTV zi|`xd{bN*f&P#%WiScjvV)fVLIsPoT#{v^q0QLfkqWnUJe<4#pk*Pn((9dLiFGSSX hKdP#X?h%0f0FZkg8TAD1%Dl2i5IxafDo(vq{|7;iw37e; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/dependencies/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/fastapi/dependencies/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..285fdda6707b05c5f9f07ff511cdb4c4a3629ebd GIT binary patch literal 38752 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 None: + self.cache_key = (self.call, tuple(sorted(set(self.security_scopes or [])))) diff --git a/venv/Lib/site-packages/fastapi/dependencies/utils.py b/venv/Lib/site-packages/fastapi/dependencies/utils.py new file mode 100644 index 00000000..081b63a8 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/dependencies/utils.py @@ -0,0 +1,1001 @@ +import inspect +from contextlib import AsyncExitStack, contextmanager +from copy import copy, deepcopy +from dataclasses import dataclass +from typing import ( + Any, + Callable, + Coroutine, + Dict, + ForwardRef, + List, + Mapping, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) + +import anyio +from fastapi import params +from fastapi._compat import ( + PYDANTIC_V2, + ErrorWrapper, + ModelField, + RequiredParam, + Undefined, + _regenerate_error_with_loc, + copy_field_info, + create_body_model, + evaluate_forwardref, + field_annotation_is_scalar, + get_annotation_from_field_info, + get_cached_model_fields, + get_missing_field_error, + is_bytes_field, + is_bytes_sequence_field, + is_scalar_field, + is_scalar_sequence_field, + is_sequence_field, + is_uploadfile_or_nonable_uploadfile_annotation, + is_uploadfile_sequence_annotation, + lenient_issubclass, + sequence_types, + serialize_sequence_value, + value_is_sequence, +) +from fastapi.background import BackgroundTasks +from fastapi.concurrency import ( + asynccontextmanager, + contextmanager_in_threadpool, +) +from fastapi.dependencies.models import Dependant, SecurityRequirement +from fastapi.logger import logger +from fastapi.security.base import SecurityBase +from fastapi.security.oauth2 import OAuth2, SecurityScopes +from fastapi.security.open_id_connect_url import OpenIdConnect +from fastapi.utils import create_model_field, get_path_param_names +from pydantic import BaseModel +from pydantic.fields import FieldInfo +from starlette.background import BackgroundTasks as StarletteBackgroundTasks +from starlette.concurrency import run_in_threadpool +from starlette.datastructures import ( + FormData, + Headers, + ImmutableMultiDict, + QueryParams, + UploadFile, +) +from starlette.requests import HTTPConnection, Request +from starlette.responses import Response +from starlette.websockets import WebSocket +from typing_extensions import Annotated, get_args, get_origin + +multipart_not_installed_error = ( + 'Form data requires "python-multipart" to be installed. \n' + 'You can install "python-multipart" with: \n\n' + "pip install python-multipart\n" +) +multipart_incorrect_install_error = ( + 'Form data requires "python-multipart" to be installed. ' + 'It seems you installed "multipart" instead. \n' + 'You can remove "multipart" with: \n\n' + "pip uninstall multipart\n\n" + 'And then install "python-multipart" with: \n\n' + "pip install python-multipart\n" +) + + +def ensure_multipart_is_installed() -> None: + try: + from python_multipart import __version__ + + # Import an attribute that can be mocked/deleted in testing + assert __version__ > "0.0.12" + except (ImportError, AssertionError): + try: + # __version__ is available in both multiparts, and can be mocked + from multipart import __version__ # type: ignore[no-redef,import-untyped] + + assert __version__ + try: + # parse_options_header is only available in the right multipart + from multipart.multipart import ( # type: ignore[import-untyped] + parse_options_header, + ) + + assert parse_options_header + except ImportError: + logger.error(multipart_incorrect_install_error) + raise RuntimeError(multipart_incorrect_install_error) from None + except ImportError: + logger.error(multipart_not_installed_error) + raise RuntimeError(multipart_not_installed_error) from None + + +def get_param_sub_dependant( + *, + param_name: str, + depends: params.Depends, + path: str, + security_scopes: Optional[List[str]] = None, +) -> Dependant: + assert depends.dependency + return get_sub_dependant( + depends=depends, + dependency=depends.dependency, + path=path, + name=param_name, + security_scopes=security_scopes, + ) + + +def get_parameterless_sub_dependant(*, depends: params.Depends, path: str) -> Dependant: + assert callable(depends.dependency), ( + "A parameter-less dependency must have a callable dependency" + ) + return get_sub_dependant(depends=depends, dependency=depends.dependency, path=path) + + +def get_sub_dependant( + *, + depends: params.Depends, + dependency: Callable[..., Any], + path: str, + name: Optional[str] = None, + security_scopes: Optional[List[str]] = None, +) -> Dependant: + security_requirement = None + security_scopes = security_scopes or [] + if isinstance(depends, params.Security): + dependency_scopes = depends.scopes + security_scopes.extend(dependency_scopes) + if isinstance(dependency, SecurityBase): + use_scopes: List[str] = [] + if isinstance(dependency, (OAuth2, OpenIdConnect)): + use_scopes = security_scopes + security_requirement = SecurityRequirement( + security_scheme=dependency, scopes=use_scopes + ) + sub_dependant = get_dependant( + path=path, + call=dependency, + name=name, + security_scopes=security_scopes, + use_cache=depends.use_cache, + ) + if security_requirement: + sub_dependant.security_requirements.append(security_requirement) + return sub_dependant + + +CacheKey = Tuple[Optional[Callable[..., Any]], Tuple[str, ...]] + + +def get_flat_dependant( + dependant: Dependant, + *, + skip_repeats: bool = False, + visited: Optional[List[CacheKey]] = None, +) -> Dependant: + if visited is None: + visited = [] + visited.append(dependant.cache_key) + + flat_dependant = Dependant( + path_params=dependant.path_params.copy(), + query_params=dependant.query_params.copy(), + header_params=dependant.header_params.copy(), + cookie_params=dependant.cookie_params.copy(), + body_params=dependant.body_params.copy(), + security_requirements=dependant.security_requirements.copy(), + use_cache=dependant.use_cache, + path=dependant.path, + ) + for sub_dependant in dependant.dependencies: + if skip_repeats and sub_dependant.cache_key in visited: + continue + flat_sub = get_flat_dependant( + sub_dependant, skip_repeats=skip_repeats, visited=visited + ) + flat_dependant.path_params.extend(flat_sub.path_params) + flat_dependant.query_params.extend(flat_sub.query_params) + flat_dependant.header_params.extend(flat_sub.header_params) + flat_dependant.cookie_params.extend(flat_sub.cookie_params) + flat_dependant.body_params.extend(flat_sub.body_params) + flat_dependant.security_requirements.extend(flat_sub.security_requirements) + return flat_dependant + + +def _get_flat_fields_from_params(fields: List[ModelField]) -> List[ModelField]: + if not fields: + return fields + first_field = fields[0] + if len(fields) == 1 and lenient_issubclass(first_field.type_, BaseModel): + fields_to_extract = get_cached_model_fields(first_field.type_) + return fields_to_extract + return fields + + +def get_flat_params(dependant: Dependant) -> List[ModelField]: + flat_dependant = get_flat_dependant(dependant, skip_repeats=True) + path_params = _get_flat_fields_from_params(flat_dependant.path_params) + query_params = _get_flat_fields_from_params(flat_dependant.query_params) + header_params = _get_flat_fields_from_params(flat_dependant.header_params) + cookie_params = _get_flat_fields_from_params(flat_dependant.cookie_params) + return path_params + query_params + header_params + cookie_params + + +def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature: + signature = inspect.signature(call) + globalns = getattr(call, "__globals__", {}) + typed_params = [ + inspect.Parameter( + name=param.name, + kind=param.kind, + default=param.default, + annotation=get_typed_annotation(param.annotation, globalns), + ) + for param in signature.parameters.values() + ] + typed_signature = inspect.Signature(typed_params) + return typed_signature + + +def get_typed_annotation(annotation: Any, globalns: Dict[str, Any]) -> Any: + if isinstance(annotation, str): + annotation = ForwardRef(annotation) + annotation = evaluate_forwardref(annotation, globalns, globalns) + return annotation + + +def get_typed_return_annotation(call: Callable[..., Any]) -> Any: + signature = inspect.signature(call) + annotation = signature.return_annotation + + if annotation is inspect.Signature.empty: + return None + + globalns = getattr(call, "__globals__", {}) + return get_typed_annotation(annotation, globalns) + + +def get_dependant( + *, + path: str, + call: Callable[..., Any], + name: Optional[str] = None, + security_scopes: Optional[List[str]] = None, + use_cache: bool = True, +) -> Dependant: + path_param_names = get_path_param_names(path) + endpoint_signature = get_typed_signature(call) + signature_params = endpoint_signature.parameters + dependant = Dependant( + call=call, + name=name, + path=path, + security_scopes=security_scopes, + use_cache=use_cache, + ) + for param_name, param in signature_params.items(): + is_path_param = param_name in path_param_names + param_details = analyze_param( + param_name=param_name, + annotation=param.annotation, + value=param.default, + is_path_param=is_path_param, + ) + if param_details.depends is not None: + sub_dependant = get_param_sub_dependant( + param_name=param_name, + depends=param_details.depends, + path=path, + security_scopes=security_scopes, + ) + dependant.dependencies.append(sub_dependant) + continue + if add_non_field_param_to_dependency( + param_name=param_name, + type_annotation=param_details.type_annotation, + dependant=dependant, + ): + assert param_details.field is None, ( + f"Cannot specify multiple FastAPI annotations for {param_name!r}" + ) + continue + assert param_details.field is not None + if isinstance(param_details.field.field_info, params.Body): + dependant.body_params.append(param_details.field) + else: + add_param_to_fields(field=param_details.field, dependant=dependant) + return dependant + + +def add_non_field_param_to_dependency( + *, param_name: str, type_annotation: Any, dependant: Dependant +) -> Optional[bool]: + if lenient_issubclass(type_annotation, Request): + dependant.request_param_name = param_name + return True + elif lenient_issubclass(type_annotation, WebSocket): + dependant.websocket_param_name = param_name + return True + elif lenient_issubclass(type_annotation, HTTPConnection): + dependant.http_connection_param_name = param_name + return True + elif lenient_issubclass(type_annotation, Response): + dependant.response_param_name = param_name + return True + elif lenient_issubclass(type_annotation, StarletteBackgroundTasks): + dependant.background_tasks_param_name = param_name + return True + elif lenient_issubclass(type_annotation, SecurityScopes): + dependant.security_scopes_param_name = param_name + return True + return None + + +@dataclass +class ParamDetails: + type_annotation: Any + depends: Optional[params.Depends] + field: Optional[ModelField] + + +def analyze_param( + *, + param_name: str, + annotation: Any, + value: Any, + is_path_param: bool, +) -> ParamDetails: + field_info = None + depends = None + type_annotation: Any = Any + use_annotation: Any = Any + if annotation is not inspect.Signature.empty: + use_annotation = annotation + type_annotation = annotation + # Extract Annotated info + if get_origin(use_annotation) is Annotated: + annotated_args = get_args(annotation) + type_annotation = annotated_args[0] + fastapi_annotations = [ + arg + for arg in annotated_args[1:] + if isinstance(arg, (FieldInfo, params.Depends)) + ] + fastapi_specific_annotations = [ + arg + for arg in fastapi_annotations + if isinstance(arg, (params.Param, params.Body, params.Depends)) + ] + if fastapi_specific_annotations: + fastapi_annotation: Union[FieldInfo, params.Depends, None] = ( + fastapi_specific_annotations[-1] + ) + else: + fastapi_annotation = None + # Set default for Annotated FieldInfo + if isinstance(fastapi_annotation, FieldInfo): + # Copy `field_info` because we mutate `field_info.default` below. + field_info = copy_field_info( + field_info=fastapi_annotation, annotation=use_annotation + ) + assert ( + field_info.default is Undefined or field_info.default is RequiredParam + ), ( + f"`{field_info.__class__.__name__}` default value cannot be set in" + f" `Annotated` for {param_name!r}. Set the default value with `=` instead." + ) + if value is not inspect.Signature.empty: + assert not is_path_param, "Path parameters cannot have default values" + field_info.default = value + else: + field_info.default = RequiredParam + # Get Annotated Depends + elif isinstance(fastapi_annotation, params.Depends): + depends = fastapi_annotation + # Get Depends from default value + if isinstance(value, params.Depends): + assert depends is None, ( + "Cannot specify `Depends` in `Annotated` and default value" + f" together for {param_name!r}" + ) + assert field_info is None, ( + "Cannot specify a FastAPI annotation in `Annotated` and `Depends` as a" + f" default value together for {param_name!r}" + ) + depends = value + # Get FieldInfo from default value + elif isinstance(value, FieldInfo): + assert field_info is None, ( + "Cannot specify FastAPI annotations in `Annotated` and default value" + f" together for {param_name!r}" + ) + field_info = value + if PYDANTIC_V2: + field_info.annotation = type_annotation + + # Get Depends from type annotation + if depends is not None and depends.dependency is None: + # Copy `depends` before mutating it + depends = copy(depends) + depends.dependency = type_annotation + + # Handle non-param type annotations like Request + if lenient_issubclass( + type_annotation, + ( + Request, + WebSocket, + HTTPConnection, + Response, + StarletteBackgroundTasks, + SecurityScopes, + ), + ): + assert depends is None, f"Cannot specify `Depends` for type {type_annotation!r}" + assert field_info is None, ( + f"Cannot specify FastAPI annotation for type {type_annotation!r}" + ) + # Handle default assignations, neither field_info nor depends was not found in Annotated nor default value + elif field_info is None and depends is None: + default_value = value if value is not inspect.Signature.empty else RequiredParam + if is_path_param: + # We might check here that `default_value is RequiredParam`, but the fact is that the same + # parameter might sometimes be a path parameter and sometimes not. See + # `tests/test_infer_param_optionality.py` for an example. + field_info = params.Path(annotation=use_annotation) + elif is_uploadfile_or_nonable_uploadfile_annotation( + type_annotation + ) or is_uploadfile_sequence_annotation(type_annotation): + field_info = params.File(annotation=use_annotation, default=default_value) + elif not field_annotation_is_scalar(annotation=type_annotation): + field_info = params.Body(annotation=use_annotation, default=default_value) + else: + field_info = params.Query(annotation=use_annotation, default=default_value) + + field = None + # It's a field_info, not a dependency + if field_info is not None: + # Handle field_info.in_ + if is_path_param: + assert isinstance(field_info, params.Path), ( + f"Cannot use `{field_info.__class__.__name__}` for path param" + f" {param_name!r}" + ) + elif ( + isinstance(field_info, params.Param) + and getattr(field_info, "in_", None) is None + ): + field_info.in_ = params.ParamTypes.query + use_annotation_from_field_info = get_annotation_from_field_info( + use_annotation, + field_info, + param_name, + ) + if isinstance(field_info, params.Form): + ensure_multipart_is_installed() + if not field_info.alias and getattr(field_info, "convert_underscores", None): + alias = param_name.replace("_", "-") + else: + alias = field_info.alias or param_name + field_info.alias = alias + field = create_model_field( + name=param_name, + type_=use_annotation_from_field_info, + default=field_info.default, + alias=alias, + required=field_info.default in (RequiredParam, Undefined), + field_info=field_info, + ) + if is_path_param: + assert is_scalar_field(field=field), ( + "Path params must be of one of the supported types" + ) + elif isinstance(field_info, params.Query): + assert ( + is_scalar_field(field) + or is_scalar_sequence_field(field) + or ( + lenient_issubclass(field.type_, BaseModel) + # For Pydantic v1 + and getattr(field, "shape", 1) == 1 + ) + ) + + return ParamDetails(type_annotation=type_annotation, depends=depends, field=field) + + +def add_param_to_fields(*, field: ModelField, dependant: Dependant) -> None: + field_info = field.field_info + field_info_in = getattr(field_info, "in_", None) + if field_info_in == params.ParamTypes.path: + dependant.path_params.append(field) + elif field_info_in == params.ParamTypes.query: + dependant.query_params.append(field) + elif field_info_in == params.ParamTypes.header: + dependant.header_params.append(field) + else: + assert field_info_in == params.ParamTypes.cookie, ( + f"non-body parameters must be in path, query, header or cookie: {field.name}" + ) + dependant.cookie_params.append(field) + + +def is_coroutine_callable(call: Callable[..., Any]) -> bool: + if inspect.isroutine(call): + return inspect.iscoroutinefunction(call) + if inspect.isclass(call): + return False + dunder_call = getattr(call, "__call__", None) # noqa: B004 + return inspect.iscoroutinefunction(dunder_call) + + +def is_async_gen_callable(call: Callable[..., Any]) -> bool: + if inspect.isasyncgenfunction(call): + return True + dunder_call = getattr(call, "__call__", None) # noqa: B004 + return inspect.isasyncgenfunction(dunder_call) + + +def is_gen_callable(call: Callable[..., Any]) -> bool: + if inspect.isgeneratorfunction(call): + return True + dunder_call = getattr(call, "__call__", None) # noqa: B004 + return inspect.isgeneratorfunction(dunder_call) + + +async def solve_generator( + *, call: Callable[..., Any], stack: AsyncExitStack, sub_values: Dict[str, Any] +) -> Any: + if is_gen_callable(call): + cm = contextmanager_in_threadpool(contextmanager(call)(**sub_values)) + elif is_async_gen_callable(call): + cm = asynccontextmanager(call)(**sub_values) + return await stack.enter_async_context(cm) + + +@dataclass +class SolvedDependency: + values: Dict[str, Any] + errors: List[Any] + background_tasks: Optional[StarletteBackgroundTasks] + response: Response + dependency_cache: Dict[Tuple[Callable[..., Any], Tuple[str]], Any] + + +async def solve_dependencies( + *, + request: Union[Request, WebSocket], + dependant: Dependant, + body: Optional[Union[Dict[str, Any], FormData]] = None, + background_tasks: Optional[StarletteBackgroundTasks] = None, + response: Optional[Response] = None, + dependency_overrides_provider: Optional[Any] = None, + dependency_cache: Optional[Dict[Tuple[Callable[..., Any], Tuple[str]], Any]] = None, + async_exit_stack: AsyncExitStack, + embed_body_fields: bool, +) -> SolvedDependency: + values: Dict[str, Any] = {} + errors: List[Any] = [] + if response is None: + response = Response() + del response.headers["content-length"] + response.status_code = None # type: ignore + dependency_cache = dependency_cache or {} + sub_dependant: Dependant + for sub_dependant in dependant.dependencies: + sub_dependant.call = cast(Callable[..., Any], sub_dependant.call) + sub_dependant.cache_key = cast( + Tuple[Callable[..., Any], Tuple[str]], sub_dependant.cache_key + ) + call = sub_dependant.call + use_sub_dependant = sub_dependant + if ( + dependency_overrides_provider + and dependency_overrides_provider.dependency_overrides + ): + original_call = sub_dependant.call + call = getattr( + dependency_overrides_provider, "dependency_overrides", {} + ).get(original_call, original_call) + use_path: str = sub_dependant.path # type: ignore + use_sub_dependant = get_dependant( + path=use_path, + call=call, + name=sub_dependant.name, + security_scopes=sub_dependant.security_scopes, + ) + + solved_result = await solve_dependencies( + request=request, + dependant=use_sub_dependant, + body=body, + background_tasks=background_tasks, + response=response, + dependency_overrides_provider=dependency_overrides_provider, + dependency_cache=dependency_cache, + async_exit_stack=async_exit_stack, + embed_body_fields=embed_body_fields, + ) + background_tasks = solved_result.background_tasks + dependency_cache.update(solved_result.dependency_cache) + if solved_result.errors: + errors.extend(solved_result.errors) + continue + if sub_dependant.use_cache and sub_dependant.cache_key in dependency_cache: + solved = dependency_cache[sub_dependant.cache_key] + elif is_gen_callable(call) or is_async_gen_callable(call): + solved = await solve_generator( + call=call, stack=async_exit_stack, sub_values=solved_result.values + ) + elif is_coroutine_callable(call): + solved = await call(**solved_result.values) + else: + solved = await run_in_threadpool(call, **solved_result.values) + if sub_dependant.name is not None: + values[sub_dependant.name] = solved + if sub_dependant.cache_key not in dependency_cache: + dependency_cache[sub_dependant.cache_key] = solved + path_values, path_errors = request_params_to_args( + dependant.path_params, request.path_params + ) + query_values, query_errors = request_params_to_args( + dependant.query_params, request.query_params + ) + header_values, header_errors = request_params_to_args( + dependant.header_params, request.headers + ) + cookie_values, cookie_errors = request_params_to_args( + dependant.cookie_params, request.cookies + ) + values.update(path_values) + values.update(query_values) + values.update(header_values) + values.update(cookie_values) + errors += path_errors + query_errors + header_errors + cookie_errors + if dependant.body_params: + ( + body_values, + body_errors, + ) = await request_body_to_args( # body_params checked above + body_fields=dependant.body_params, + received_body=body, + embed_body_fields=embed_body_fields, + ) + values.update(body_values) + errors.extend(body_errors) + if dependant.http_connection_param_name: + values[dependant.http_connection_param_name] = request + if dependant.request_param_name and isinstance(request, Request): + values[dependant.request_param_name] = request + elif dependant.websocket_param_name and isinstance(request, WebSocket): + values[dependant.websocket_param_name] = request + if dependant.background_tasks_param_name: + if background_tasks is None: + background_tasks = BackgroundTasks() + values[dependant.background_tasks_param_name] = background_tasks + if dependant.response_param_name: + values[dependant.response_param_name] = response + if dependant.security_scopes_param_name: + values[dependant.security_scopes_param_name] = SecurityScopes( + scopes=dependant.security_scopes + ) + return SolvedDependency( + values=values, + errors=errors, + background_tasks=background_tasks, + response=response, + dependency_cache=dependency_cache, + ) + + +def _validate_value_with_model_field( + *, field: ModelField, value: Any, values: Dict[str, Any], loc: Tuple[str, ...] +) -> Tuple[Any, List[Any]]: + if value is None: + if field.required: + return None, [get_missing_field_error(loc=loc)] + else: + return deepcopy(field.default), [] + v_, errors_ = field.validate(value, values, loc=loc) + if isinstance(errors_, ErrorWrapper): + return None, [errors_] + elif isinstance(errors_, list): + new_errors = _regenerate_error_with_loc(errors=errors_, loc_prefix=()) + return None, new_errors + else: + return v_, [] + + +def _get_multidict_value( + field: ModelField, values: Mapping[str, Any], alias: Union[str, None] = None +) -> Any: + alias = alias or field.alias + if is_sequence_field(field) and isinstance(values, (ImmutableMultiDict, Headers)): + value = values.getlist(alias) + else: + value = values.get(alias, None) + if ( + value is None + or ( + isinstance(field.field_info, params.Form) + and isinstance(value, str) # For type checks + and value == "" + ) + or (is_sequence_field(field) and len(value) == 0) + ): + if field.required: + return + else: + return deepcopy(field.default) + return value + + +def request_params_to_args( + fields: Sequence[ModelField], + received_params: Union[Mapping[str, Any], QueryParams, Headers], +) -> Tuple[Dict[str, Any], List[Any]]: + values: Dict[str, Any] = {} + errors: List[Dict[str, Any]] = [] + + if not fields: + return values, errors + + first_field = fields[0] + fields_to_extract = fields + single_not_embedded_field = False + default_convert_underscores = True + if len(fields) == 1 and lenient_issubclass(first_field.type_, BaseModel): + fields_to_extract = get_cached_model_fields(first_field.type_) + single_not_embedded_field = True + # If headers are in a Pydantic model, the way to disable convert_underscores + # would be with Header(convert_underscores=False) at the Pydantic model level + default_convert_underscores = getattr( + first_field.field_info, "convert_underscores", True + ) + + params_to_process: Dict[str, Any] = {} + + processed_keys = set() + + for field in fields_to_extract: + alias = None + if isinstance(received_params, Headers): + # Handle fields extracted from a Pydantic Model for a header, each field + # doesn't have a FieldInfo of type Header with the default convert_underscores=True + convert_underscores = getattr( + field.field_info, "convert_underscores", default_convert_underscores + ) + if convert_underscores: + alias = ( + field.alias + if field.alias != field.name + else field.name.replace("_", "-") + ) + value = _get_multidict_value(field, received_params, alias=alias) + if value is not None: + params_to_process[field.name] = value + processed_keys.add(alias or field.alias) + processed_keys.add(field.name) + + for key, value in received_params.items(): + if key not in processed_keys: + params_to_process[key] = value + + if single_not_embedded_field: + field_info = first_field.field_info + assert isinstance(field_info, params.Param), ( + "Params must be subclasses of Param" + ) + loc: Tuple[str, ...] = (field_info.in_.value,) + v_, errors_ = _validate_value_with_model_field( + field=first_field, value=params_to_process, values=values, loc=loc + ) + return {first_field.name: v_}, errors_ + + for field in fields: + value = _get_multidict_value(field, received_params) + field_info = field.field_info + assert isinstance(field_info, params.Param), ( + "Params must be subclasses of Param" + ) + loc = (field_info.in_.value, field.alias) + v_, errors_ = _validate_value_with_model_field( + field=field, value=value, values=values, loc=loc + ) + if errors_: + errors.extend(errors_) + else: + values[field.name] = v_ + return values, errors + + +def is_union_of_base_models(field_type: Any) -> bool: + """Check if field type is a Union where all members are BaseModel subclasses.""" + from fastapi.types import UnionType + + origin = get_origin(field_type) + + # Check if it's a Union type (covers both typing.Union and types.UnionType in Python 3.10+) + if origin is not Union and origin is not UnionType: + return False + + union_args = get_args(field_type) + + for arg in union_args: + if not lenient_issubclass(arg, BaseModel): + return False + + return True + + +def _should_embed_body_fields(fields: List[ModelField]) -> bool: + if not fields: + return False + # More than one dependency could have the same field, it would show up as multiple + # fields but it's the same one, so count them by name + body_param_names_set = {field.name for field in fields} + # A top level field has to be a single field, not multiple + if len(body_param_names_set) > 1: + return True + first_field = fields[0] + # If it explicitly specifies it is embedded, it has to be embedded + if getattr(first_field.field_info, "embed", None): + return True + # If it's a Form (or File) field, it has to be a BaseModel (or a union of BaseModels) to be top level + # otherwise it has to be embedded, so that the key value pair can be extracted + if ( + isinstance(first_field.field_info, params.Form) + and not lenient_issubclass(first_field.type_, BaseModel) + and not is_union_of_base_models(first_field.type_) + ): + return True + return False + + +async def _extract_form_body( + body_fields: List[ModelField], + received_body: FormData, +) -> Dict[str, Any]: + values = {} + first_field = body_fields[0] + first_field_info = first_field.field_info + + for field in body_fields: + value = _get_multidict_value(field, received_body) + if ( + isinstance(first_field_info, params.File) + and is_bytes_field(field) + and isinstance(value, UploadFile) + ): + value = await value.read() + elif ( + is_bytes_sequence_field(field) + and isinstance(first_field_info, params.File) + and value_is_sequence(value) + ): + # For types + assert isinstance(value, sequence_types) # type: ignore[arg-type] + results: List[Union[bytes, str]] = [] + + async def process_fn( + fn: Callable[[], Coroutine[Any, Any, Any]], + ) -> None: + result = await fn() + results.append(result) # noqa: B023 + + async with anyio.create_task_group() as tg: + for sub_value in value: + tg.start_soon(process_fn, sub_value.read) + value = serialize_sequence_value(field=field, value=results) + if value is not None: + values[field.alias] = value + for key, value in received_body.items(): + if key not in values: + values[key] = value + return values + + +async def request_body_to_args( + body_fields: List[ModelField], + received_body: Optional[Union[Dict[str, Any], FormData]], + embed_body_fields: bool, +) -> Tuple[Dict[str, Any], List[Dict[str, Any]]]: + values: Dict[str, Any] = {} + errors: List[Dict[str, Any]] = [] + assert body_fields, "request_body_to_args() should be called with fields" + single_not_embedded_field = len(body_fields) == 1 and not embed_body_fields + first_field = body_fields[0] + body_to_process = received_body + + fields_to_extract: List[ModelField] = body_fields + + if single_not_embedded_field and lenient_issubclass(first_field.type_, BaseModel): + fields_to_extract = get_cached_model_fields(first_field.type_) + + if isinstance(received_body, FormData): + body_to_process = await _extract_form_body(fields_to_extract, received_body) + + if single_not_embedded_field: + loc: Tuple[str, ...] = ("body",) + v_, errors_ = _validate_value_with_model_field( + field=first_field, value=body_to_process, values=values, loc=loc + ) + return {first_field.name: v_}, errors_ + for field in body_fields: + loc = ("body", field.alias) + value: Optional[Any] = None + if body_to_process is not None: + try: + value = body_to_process.get(field.alias) + # If the received body is a list, not a dict + except AttributeError: + errors.append(get_missing_field_error(loc)) + continue + v_, errors_ = _validate_value_with_model_field( + field=field, value=value, values=values, loc=loc + ) + if errors_: + errors.extend(errors_) + else: + values[field.name] = v_ + return values, errors + + +def get_body_field( + *, flat_dependant: Dependant, name: str, embed_body_fields: bool +) -> Optional[ModelField]: + """ + Get a ModelField representing the request body for a path operation, combining + all body parameters into a single field if necessary. + + Used to check if it's form data (with `isinstance(body_field, params.Form)`) + or JSON and to generate the JSON Schema for a request body. + + This is **not** used to validate/parse the request body, that's done with each + individual body parameter. + """ + if not flat_dependant.body_params: + return None + first_param = flat_dependant.body_params[0] + if not embed_body_fields: + return first_param + model_name = "Body_" + name + BodyModel = create_body_model( + fields=flat_dependant.body_params, model_name=model_name + ) + required = any(True for f in flat_dependant.body_params if f.required) + BodyFieldInfo_kwargs: Dict[str, Any] = { + "annotation": BodyModel, + "alias": "body", + } + if not required: + BodyFieldInfo_kwargs["default"] = None + if any(isinstance(f.field_info, params.File) for f in flat_dependant.body_params): + BodyFieldInfo: Type[params.Body] = params.File + elif any(isinstance(f.field_info, params.Form) for f in flat_dependant.body_params): + BodyFieldInfo = params.Form + else: + BodyFieldInfo = params.Body + + body_param_media_types = [ + f.field_info.media_type + for f in flat_dependant.body_params + if isinstance(f.field_info, params.Body) + ] + if len(set(body_param_media_types)) == 1: + BodyFieldInfo_kwargs["media_type"] = body_param_media_types[0] + final_field = create_model_field( + name="body", + type_=BodyModel, + required=required, + alias="body", + field_info=BodyFieldInfo(**BodyFieldInfo_kwargs), + ) + return final_field diff --git a/venv/Lib/site-packages/fastapi/encoders.py b/venv/Lib/site-packages/fastapi/encoders.py new file mode 100644 index 00000000..451ea076 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/encoders.py @@ -0,0 +1,343 @@ +import dataclasses +import datetime +from collections import defaultdict, deque +from decimal import Decimal +from enum import Enum +from ipaddress import ( + IPv4Address, + IPv4Interface, + IPv4Network, + IPv6Address, + IPv6Interface, + IPv6Network, +) +from pathlib import Path, PurePath +from re import Pattern +from types import GeneratorType +from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union +from uuid import UUID + +from fastapi.types import IncEx +from pydantic import BaseModel +from pydantic.color import Color +from pydantic.networks import AnyUrl, NameEmail +from pydantic.types import SecretBytes, SecretStr +from typing_extensions import Annotated, Doc + +from ._compat import PYDANTIC_V2, UndefinedType, Url, _model_dump + + +# Taken from Pydantic v1 as is +def isoformat(o: Union[datetime.date, datetime.time]) -> str: + return o.isoformat() + + +# Taken from Pydantic v1 as is +# TODO: pv2 should this return strings instead? +def decimal_encoder(dec_value: Decimal) -> Union[int, float]: + """ + Encodes a Decimal as int of there's no exponent, otherwise float + + This is useful when we use ConstrainedDecimal to represent Numeric(x,0) + where a integer (but not int typed) is used. Encoding this as a float + results in failed round-tripping between encode and parse. + Our Id type is a prime example of this. + + >>> decimal_encoder(Decimal("1.0")) + 1.0 + + >>> decimal_encoder(Decimal("1")) + 1 + """ + if dec_value.as_tuple().exponent >= 0: # type: ignore[operator] + return int(dec_value) + else: + return float(dec_value) + + +ENCODERS_BY_TYPE: Dict[Type[Any], Callable[[Any], Any]] = { + bytes: lambda o: o.decode(), + Color: str, + datetime.date: isoformat, + datetime.datetime: isoformat, + datetime.time: isoformat, + datetime.timedelta: lambda td: td.total_seconds(), + Decimal: decimal_encoder, + Enum: lambda o: o.value, + frozenset: list, + deque: list, + GeneratorType: list, + IPv4Address: str, + IPv4Interface: str, + IPv4Network: str, + IPv6Address: str, + IPv6Interface: str, + IPv6Network: str, + NameEmail: str, + Path: str, + Pattern: lambda o: o.pattern, + SecretBytes: str, + SecretStr: str, + set: list, + UUID: str, + Url: str, + AnyUrl: str, +} + + +def generate_encoders_by_class_tuples( + type_encoder_map: Dict[Any, Callable[[Any], Any]], +) -> Dict[Callable[[Any], Any], Tuple[Any, ...]]: + encoders_by_class_tuples: Dict[Callable[[Any], Any], Tuple[Any, ...]] = defaultdict( + tuple + ) + for type_, encoder in type_encoder_map.items(): + encoders_by_class_tuples[encoder] += (type_,) + return encoders_by_class_tuples + + +encoders_by_class_tuples = generate_encoders_by_class_tuples(ENCODERS_BY_TYPE) + + +def jsonable_encoder( + obj: Annotated[ + Any, + Doc( + """ + The input object to convert to JSON. + """ + ), + ], + include: Annotated[ + Optional[IncEx], + Doc( + """ + Pydantic's `include` parameter, passed to Pydantic models to set the + fields to include. + """ + ), + ] = None, + exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Pydantic's `exclude` parameter, passed to Pydantic models to set the + fields to exclude. + """ + ), + ] = None, + by_alias: Annotated[ + bool, + Doc( + """ + Pydantic's `by_alias` parameter, passed to Pydantic models to define if + the output should use the alias names (when provided) or the Python + attribute names. In an API, if you set an alias, it's probably because you + want to use it in the result, so you probably want to leave this set to + `True`. + """ + ), + ] = True, + exclude_unset: Annotated[ + bool, + Doc( + """ + Pydantic's `exclude_unset` parameter, passed to Pydantic models to define + if it should exclude from the output the fields that were not explicitly + set (and that only had their default values). + """ + ), + ] = False, + exclude_defaults: Annotated[ + bool, + Doc( + """ + Pydantic's `exclude_defaults` parameter, passed to Pydantic models to define + if it should exclude from the output the fields that had the same default + value, even when they were explicitly set. + """ + ), + ] = False, + exclude_none: Annotated[ + bool, + Doc( + """ + Pydantic's `exclude_none` parameter, passed to Pydantic models to define + if it should exclude from the output any fields that have a `None` value. + """ + ), + ] = False, + custom_encoder: Annotated[ + Optional[Dict[Any, Callable[[Any], Any]]], + Doc( + """ + Pydantic's `custom_encoder` parameter, passed to Pydantic models to define + a custom encoder. + """ + ), + ] = None, + sqlalchemy_safe: Annotated[ + bool, + Doc( + """ + Exclude from the output any fields that start with the name `_sa`. + + This is mainly a hack for compatibility with SQLAlchemy objects, they + store internal SQLAlchemy-specific state in attributes named with `_sa`, + and those objects can't (and shouldn't be) serialized to JSON. + """ + ), + ] = True, +) -> Any: + """ + Convert any object to something that can be encoded in JSON. + + This is used internally by FastAPI to make sure anything you return can be + encoded as JSON before it is sent to the client. + + You can also use it yourself, for example to convert objects before saving them + in a database that supports only JSON. + + Read more about it in the + [FastAPI docs for JSON Compatible Encoder](https://fastapi.tiangolo.com/tutorial/encoder/). + """ + custom_encoder = custom_encoder or {} + if custom_encoder: + if type(obj) in custom_encoder: + return custom_encoder[type(obj)](obj) + else: + for encoder_type, encoder_instance in custom_encoder.items(): + if isinstance(obj, encoder_type): + return encoder_instance(obj) + if include is not None and not isinstance(include, (set, dict)): + include = set(include) + if exclude is not None and not isinstance(exclude, (set, dict)): + exclude = set(exclude) + if isinstance(obj, BaseModel): + # TODO: remove when deprecating Pydantic v1 + encoders: Dict[Any, Any] = {} + if not PYDANTIC_V2: + encoders = getattr(obj.__config__, "json_encoders", {}) # type: ignore[attr-defined] + if custom_encoder: + encoders.update(custom_encoder) + obj_dict = _model_dump( + obj, + mode="json", + include=include, + exclude=exclude, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_none=exclude_none, + exclude_defaults=exclude_defaults, + ) + if "__root__" in obj_dict: + obj_dict = obj_dict["__root__"] + return jsonable_encoder( + obj_dict, + exclude_none=exclude_none, + exclude_defaults=exclude_defaults, + # TODO: remove when deprecating Pydantic v1 + custom_encoder=encoders, + sqlalchemy_safe=sqlalchemy_safe, + ) + if dataclasses.is_dataclass(obj): + obj_dict = dataclasses.asdict(obj) + return jsonable_encoder( + obj_dict, + include=include, + exclude=exclude, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, + ) + if isinstance(obj, Enum): + return obj.value + if isinstance(obj, PurePath): + return str(obj) + if isinstance(obj, (str, int, float, type(None))): + return obj + if isinstance(obj, UndefinedType): + return None + if isinstance(obj, dict): + encoded_dict = {} + allowed_keys = set(obj.keys()) + if include is not None: + allowed_keys &= set(include) + if exclude is not None: + allowed_keys -= set(exclude) + for key, value in obj.items(): + if ( + ( + not sqlalchemy_safe + or (not isinstance(key, str)) + or (not key.startswith("_sa")) + ) + and (value is not None or not exclude_none) + and key in allowed_keys + ): + encoded_key = jsonable_encoder( + key, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_none=exclude_none, + custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, + ) + encoded_value = jsonable_encoder( + value, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_none=exclude_none, + custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, + ) + encoded_dict[encoded_key] = encoded_value + return encoded_dict + if isinstance(obj, (list, set, frozenset, GeneratorType, tuple, deque)): + encoded_list = [] + for item in obj: + encoded_list.append( + jsonable_encoder( + item, + include=include, + exclude=exclude, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, + ) + ) + return encoded_list + + if type(obj) in ENCODERS_BY_TYPE: + return ENCODERS_BY_TYPE[type(obj)](obj) + for encoder, classes_tuple in encoders_by_class_tuples.items(): + if isinstance(obj, classes_tuple): + return encoder(obj) + + try: + data = dict(obj) + except Exception as e: + errors: List[Exception] = [] + errors.append(e) + try: + data = vars(obj) + except Exception as e: + errors.append(e) + raise ValueError(errors) from e + return jsonable_encoder( + data, + include=include, + exclude=exclude, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, + ) diff --git a/venv/Lib/site-packages/fastapi/exception_handlers.py b/venv/Lib/site-packages/fastapi/exception_handlers.py new file mode 100644 index 00000000..6c2ba7fe --- /dev/null +++ b/venv/Lib/site-packages/fastapi/exception_handlers.py @@ -0,0 +1,34 @@ +from fastapi.encoders import jsonable_encoder +from fastapi.exceptions import RequestValidationError, WebSocketRequestValidationError +from fastapi.utils import is_body_allowed_for_status_code +from fastapi.websockets import WebSocket +from starlette.exceptions import HTTPException +from starlette.requests import Request +from starlette.responses import JSONResponse, Response +from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY, WS_1008_POLICY_VIOLATION + + +async def http_exception_handler(request: Request, exc: HTTPException) -> Response: + headers = getattr(exc, "headers", None) + if not is_body_allowed_for_status_code(exc.status_code): + return Response(status_code=exc.status_code, headers=headers) + return JSONResponse( + {"detail": exc.detail}, status_code=exc.status_code, headers=headers + ) + + +async def request_validation_exception_handler( + request: Request, exc: RequestValidationError +) -> JSONResponse: + return JSONResponse( + status_code=HTTP_422_UNPROCESSABLE_ENTITY, + content={"detail": jsonable_encoder(exc.errors())}, + ) + + +async def websocket_request_validation_exception_handler( + websocket: WebSocket, exc: WebSocketRequestValidationError +) -> None: + await websocket.close( + code=WS_1008_POLICY_VIOLATION, reason=jsonable_encoder(exc.errors()) + ) diff --git a/venv/Lib/site-packages/fastapi/exceptions.py b/venv/Lib/site-packages/fastapi/exceptions.py new file mode 100644 index 00000000..44d4ada8 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/exceptions.py @@ -0,0 +1,176 @@ +from typing import Any, Dict, Optional, Sequence, Type, Union + +from pydantic import BaseModel, create_model +from starlette.exceptions import HTTPException as StarletteHTTPException +from starlette.exceptions import WebSocketException as StarletteWebSocketException +from typing_extensions import Annotated, Doc + + +class HTTPException(StarletteHTTPException): + """ + An HTTP exception you can raise in your own code to show errors to the client. + + This is for client errors, invalid authentication, invalid data, etc. Not for server + errors in your code. + + Read more about it in the + [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/). + + ## Example + + ```python + from fastapi import FastAPI, HTTPException + + app = FastAPI() + + items = {"foo": "The Foo Wrestlers"} + + + @app.get("/items/{item_id}") + async def read_item(item_id: str): + if item_id not in items: + raise HTTPException(status_code=404, detail="Item not found") + return {"item": items[item_id]} + ``` + """ + + def __init__( + self, + status_code: Annotated[ + int, + Doc( + """ + HTTP status code to send to the client. + """ + ), + ], + detail: Annotated[ + Any, + Doc( + """ + Any data to be sent to the client in the `detail` key of the JSON + response. + """ + ), + ] = None, + headers: Annotated[ + Optional[Dict[str, str]], + Doc( + """ + Any headers to send to the client in the response. + """ + ), + ] = None, + ) -> None: + super().__init__(status_code=status_code, detail=detail, headers=headers) + + +class WebSocketException(StarletteWebSocketException): + """ + A WebSocket exception you can raise in your own code to show errors to the client. + + This is for client errors, invalid authentication, invalid data, etc. Not for server + errors in your code. + + Read more about it in the + [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). + + ## Example + + ```python + from typing import Annotated + + from fastapi import ( + Cookie, + FastAPI, + WebSocket, + WebSocketException, + status, + ) + + app = FastAPI() + + @app.websocket("/items/{item_id}/ws") + async def websocket_endpoint( + *, + websocket: WebSocket, + session: Annotated[str | None, Cookie()] = None, + item_id: str, + ): + if session is None: + raise WebSocketException(code=status.WS_1008_POLICY_VIOLATION) + await websocket.accept() + while True: + data = await websocket.receive_text() + await websocket.send_text(f"Session cookie is: {session}") + await websocket.send_text(f"Message text was: {data}, for item ID: {item_id}") + ``` + """ + + def __init__( + self, + code: Annotated[ + int, + Doc( + """ + A closing code from the + [valid codes defined in the specification](https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1). + """ + ), + ], + reason: Annotated[ + Union[str, None], + Doc( + """ + The reason to close the WebSocket connection. + + It is UTF-8-encoded data. The interpretation of the reason is up to the + application, it is not specified by the WebSocket specification. + + It could contain text that could be human-readable or interpretable + by the client code, etc. + """ + ), + ] = None, + ) -> None: + super().__init__(code=code, reason=reason) + + +RequestErrorModel: Type[BaseModel] = create_model("Request") +WebSocketErrorModel: Type[BaseModel] = create_model("WebSocket") + + +class FastAPIError(RuntimeError): + """ + A generic, FastAPI-specific error. + """ + + +class ValidationException(Exception): + def __init__(self, errors: Sequence[Any]) -> None: + self._errors = errors + + def errors(self) -> Sequence[Any]: + return self._errors + + +class RequestValidationError(ValidationException): + def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None: + super().__init__(errors) + self.body = body + + +class WebSocketRequestValidationError(ValidationException): + pass + + +class ResponseValidationError(ValidationException): + def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None: + super().__init__(errors) + self.body = body + + def __str__(self) -> str: + message = f"{len(self._errors)} validation errors:\n" + for err in self._errors: + message += f" {err}\n" + return message diff --git a/venv/Lib/site-packages/fastapi/logger.py b/venv/Lib/site-packages/fastapi/logger.py new file mode 100644 index 00000000..5b2c4ad5 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/logger.py @@ -0,0 +1,3 @@ +import logging + +logger = logging.getLogger("fastapi") diff --git a/venv/Lib/site-packages/fastapi/middleware/__init__.py b/venv/Lib/site-packages/fastapi/middleware/__init__.py new file mode 100644 index 00000000..620296d5 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/middleware/__init__.py @@ -0,0 +1 @@ +from starlette.middleware import Middleware as Middleware diff --git a/venv/Lib/site-packages/fastapi/middleware/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/fastapi/middleware/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc98e2f727ed2af5c897d4c7f0936e721e983d76 GIT binary patch literal 241 zcmX@j%ge<81l^YsGOU2~V-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zYX zzL_a0IjQA|MX7$8Ot(aeOA?E6QcFrw^>X17Ma)38D;Yk6wEPNlwu%WYPAw{q@%Ho# ziE&9S&MwI>h$+j@Oip!7Pt7ZdDND^Oi}A@!iYd-4N!2Y#OwLYBPc4o~O9Yx-kg1O_ wS3f>JGcU6wK3=b&@)w6qZhlH>PO4oI2hbWuAT9z`V-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zY% z&i+BczL_a0IjQA|MX7$8Ot&P9OA?E6QcFrw^>X17ddc}k#YN0OO)D8bgY^Cia<+;I zElw>ej`8;N42f|`EzT~`vQFkByGxL!f!FAkgB{FKt1RJ$S$pcRZjTnu7-U}j`wyvN{H#0KO50K#BJ Ay#N3J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/middleware/__pycache__/gzip.cpython-312.pyc b/venv/Lib/site-packages/fastapi/middleware/__pycache__/gzip.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e97bc05e92a4e27e91319603580ce8a3fdfbabc GIT binary patch literal 246 zcmX@j%ge<81l^YsGW>z`V-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zY% z?opWqzL_a0IjQA|MX7$8Ot&P9OA?E6QcFrw^>X17dg)b}1x3t2O)D8bgY^Cia<+;I zElw>ej`8;N42f|`EzT~`vQFkByGxL!f!FAkgB{FKt1RJ$S$pcRZjTnu7-U}j`wyvN{H#0KO50PGw;(Y&J25@AI3_I-Xj4I^KEf7#6kGHPDt~d<G zw;(Y&J25@AI3_I-Xiq_=KEe)tBs=s9Dt~d<z`V-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zY% z;lb{nzL_a0IjQA|MX7$8Ot&P9OA?E6QcFrw^>X17dgaCGnMKS%O)D8bgY^Cia<+;I zElw>ej`8;N42f|`EzT~`vQFkByGxL!f!FAkgB{FKt1RJ$S$pcRZjTnu7-U}j`wyvN{H#0KO50LLOl A#sB~S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/middleware/cors.py b/venv/Lib/site-packages/fastapi/middleware/cors.py new file mode 100644 index 00000000..8dfaad0d --- /dev/null +++ b/venv/Lib/site-packages/fastapi/middleware/cors.py @@ -0,0 +1 @@ +from starlette.middleware.cors import CORSMiddleware as CORSMiddleware # noqa diff --git a/venv/Lib/site-packages/fastapi/middleware/gzip.py b/venv/Lib/site-packages/fastapi/middleware/gzip.py new file mode 100644 index 00000000..bbeb2cc7 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/middleware/gzip.py @@ -0,0 +1 @@ +from starlette.middleware.gzip import GZipMiddleware as GZipMiddleware # noqa diff --git a/venv/Lib/site-packages/fastapi/middleware/httpsredirect.py b/venv/Lib/site-packages/fastapi/middleware/httpsredirect.py new file mode 100644 index 00000000..b7a3d8e0 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/middleware/httpsredirect.py @@ -0,0 +1,3 @@ +from starlette.middleware.httpsredirect import ( # noqa + HTTPSRedirectMiddleware as HTTPSRedirectMiddleware, +) diff --git a/venv/Lib/site-packages/fastapi/middleware/trustedhost.py b/venv/Lib/site-packages/fastapi/middleware/trustedhost.py new file mode 100644 index 00000000..08d7e035 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/middleware/trustedhost.py @@ -0,0 +1,3 @@ +from starlette.middleware.trustedhost import ( # noqa + TrustedHostMiddleware as TrustedHostMiddleware, +) diff --git a/venv/Lib/site-packages/fastapi/middleware/wsgi.py b/venv/Lib/site-packages/fastapi/middleware/wsgi.py new file mode 100644 index 00000000..c4c6a797 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/middleware/wsgi.py @@ -0,0 +1 @@ +from starlette.middleware.wsgi import WSGIMiddleware as WSGIMiddleware # noqa diff --git a/venv/Lib/site-packages/fastapi/openapi/__init__.py b/venv/Lib/site-packages/fastapi/openapi/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c2deaa5fb06ecfd292f3c9041d6a1c67d130572 GIT binary patch literal 180 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/openapi/constants.py b/venv/Lib/site-packages/fastapi/openapi/constants.py new file mode 100644 index 00000000..d724ee3c --- /dev/null +++ b/venv/Lib/site-packages/fastapi/openapi/constants.py @@ -0,0 +1,3 @@ +METHODS_WITH_BODY = {"GET", "HEAD", "POST", "PUT", "DELETE", "PATCH"} +REF_PREFIX = "#/components/schemas/" +REF_TEMPLATE = "#/components/schemas/{model}" diff --git a/venv/Lib/site-packages/fastapi/openapi/docs.py b/venv/Lib/site-packages/fastapi/openapi/docs.py new file mode 100644 index 00000000..f181b43c --- /dev/null +++ b/venv/Lib/site-packages/fastapi/openapi/docs.py @@ -0,0 +1,344 @@ +import json +from typing import Any, Dict, Optional + +from fastapi.encoders import jsonable_encoder +from starlette.responses import HTMLResponse +from typing_extensions import Annotated, Doc + +swagger_ui_default_parameters: Annotated[ + Dict[str, Any], + Doc( + """ + Default configurations for Swagger UI. + + You can use it as a template to add any other configurations needed. + """ + ), +] = { + "dom_id": "#swagger-ui", + "layout": "BaseLayout", + "deepLinking": True, + "showExtensions": True, + "showCommonExtensions": True, +} + + +def get_swagger_ui_html( + *, + openapi_url: Annotated[ + str, + Doc( + """ + The OpenAPI URL that Swagger UI should load and use. + + This is normally done automatically by FastAPI using the default URL + `/openapi.json`. + """ + ), + ], + title: Annotated[ + str, + Doc( + """ + The HTML `` content, normally shown in the browser tab. + """ + ), + ], + swagger_js_url: Annotated[ + str, + Doc( + """ + The URL to use to load the Swagger UI JavaScript. + + It is normally set to a CDN URL. + """ + ), + ] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js", + swagger_css_url: Annotated[ + str, + Doc( + """ + The URL to use to load the Swagger UI CSS. + + It is normally set to a CDN URL. + """ + ), + ] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css", + swagger_favicon_url: Annotated[ + str, + Doc( + """ + The URL of the favicon to use. It is normally shown in the browser tab. + """ + ), + ] = "https://fastapi.tiangolo.com/img/favicon.png", + oauth2_redirect_url: Annotated[ + Optional[str], + Doc( + """ + The OAuth2 redirect URL, it is normally automatically handled by FastAPI. + """ + ), + ] = None, + init_oauth: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + A dictionary with Swagger UI OAuth2 initialization configurations. + """ + ), + ] = None, + swagger_ui_parameters: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Configuration parameters for Swagger UI. + + It defaults to [swagger_ui_default_parameters][fastapi.openapi.docs.swagger_ui_default_parameters]. + """ + ), + ] = None, +) -> HTMLResponse: + """ + Generate and return the HTML that loads Swagger UI for the interactive + API docs (normally served at `/docs`). + + You would only call this function yourself if you needed to override some parts, + for example the URLs to use to load Swagger UI's JavaScript and CSS. + + Read more about it in the + [FastAPI docs for Configure Swagger UI](https://fastapi.tiangolo.com/how-to/configure-swagger-ui/) + and the [FastAPI docs for Custom Docs UI Static Assets (Self-Hosting)](https://fastapi.tiangolo.com/how-to/custom-docs-ui-assets/). + """ + current_swagger_ui_parameters = swagger_ui_default_parameters.copy() + if swagger_ui_parameters: + current_swagger_ui_parameters.update(swagger_ui_parameters) + + html = f""" + <!DOCTYPE html> + <html> + <head> + <link type="text/css" rel="stylesheet" href="{swagger_css_url}"> + <link rel="shortcut icon" href="{swagger_favicon_url}"> + <title>{title} + + +

+ + + + + + """ + return HTMLResponse(html) + + +def get_redoc_html( + *, + openapi_url: Annotated[ + str, + Doc( + """ + The OpenAPI URL that ReDoc should load and use. + + This is normally done automatically by FastAPI using the default URL + `/openapi.json`. + """ + ), + ], + title: Annotated[ + str, + Doc( + """ + The HTML `` content, normally shown in the browser tab. + """ + ), + ], + redoc_js_url: Annotated[ + str, + Doc( + """ + The URL to use to load the ReDoc JavaScript. + + It is normally set to a CDN URL. + """ + ), + ] = "https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js", + redoc_favicon_url: Annotated[ + str, + Doc( + """ + The URL of the favicon to use. It is normally shown in the browser tab. + """ + ), + ] = "https://fastapi.tiangolo.com/img/favicon.png", + with_google_fonts: Annotated[ + bool, + Doc( + """ + Load and use Google Fonts. + """ + ), + ] = True, +) -> HTMLResponse: + """ + Generate and return the HTML response that loads ReDoc for the alternative + API docs (normally served at `/redoc`). + + You would only call this function yourself if you needed to override some parts, + for example the URLs to use to load ReDoc's JavaScript and CSS. + + Read more about it in the + [FastAPI docs for Custom Docs UI Static Assets (Self-Hosting)](https://fastapi.tiangolo.com/how-to/custom-docs-ui-assets/). + """ + html = f""" + <!DOCTYPE html> + <html> + <head> + <title>{title} + + + + """ + if with_google_fonts: + html += """ + + """ + html += f""" + + + + + + + + + + + """ + return HTMLResponse(html) + + +def get_swagger_ui_oauth2_redirect_html() -> HTMLResponse: + """ + Generate the HTML response with the OAuth2 redirection for Swagger UI. + + You normally don't need to use or change this. + """ + # copied from https://github.com/swagger-api/swagger-ui/blob/v4.14.0/dist/oauth2-redirect.html + html = """ + + + + Swagger UI: OAuth2 Redirect + + + + + + """ + return HTMLResponse(content=html) diff --git a/venv/Lib/site-packages/fastapi/openapi/models.py b/venv/Lib/site-packages/fastapi/openapi/models.py new file mode 100644 index 00000000..ed07b40f --- /dev/null +++ b/venv/Lib/site-packages/fastapi/openapi/models.py @@ -0,0 +1,445 @@ +from enum import Enum +from typing import Any, Callable, Dict, Iterable, List, Optional, Set, Type, Union + +from fastapi._compat import ( + PYDANTIC_V2, + CoreSchema, + GetJsonSchemaHandler, + JsonSchemaValue, + _model_rebuild, + with_info_plain_validator_function, +) +from fastapi.logger import logger +from pydantic import AnyUrl, BaseModel, Field +from typing_extensions import Annotated, Literal, TypedDict +from typing_extensions import deprecated as typing_deprecated + +try: + import email_validator + + assert email_validator # make autoflake ignore the unused import + from pydantic import EmailStr +except ImportError: # pragma: no cover + + class EmailStr(str): # type: ignore + @classmethod + def __get_validators__(cls) -> Iterable[Callable[..., Any]]: + yield cls.validate + + @classmethod + def validate(cls, v: Any) -> str: + logger.warning( + "email-validator not installed, email fields will be treated as str.\n" + "To install, run: pip install email-validator" + ) + return str(v) + + @classmethod + def _validate(cls, __input_value: Any, _: Any) -> str: + logger.warning( + "email-validator not installed, email fields will be treated as str.\n" + "To install, run: pip install email-validator" + ) + return str(__input_value) + + @classmethod + def __get_pydantic_json_schema__( + cls, core_schema: CoreSchema, handler: GetJsonSchemaHandler + ) -> JsonSchemaValue: + return {"type": "string", "format": "email"} + + @classmethod + def __get_pydantic_core_schema__( + cls, source: Type[Any], handler: Callable[[Any], CoreSchema] + ) -> CoreSchema: + return with_info_plain_validator_function(cls._validate) + + +class BaseModelWithConfig(BaseModel): + if PYDANTIC_V2: + model_config = {"extra": "allow"} + + else: + + class Config: + extra = "allow" + + +class Contact(BaseModelWithConfig): + name: Optional[str] = None + url: Optional[AnyUrl] = None + email: Optional[EmailStr] = None + + +class License(BaseModelWithConfig): + name: str + identifier: Optional[str] = None + url: Optional[AnyUrl] = None + + +class Info(BaseModelWithConfig): + title: str + summary: Optional[str] = None + description: Optional[str] = None + termsOfService: Optional[str] = None + contact: Optional[Contact] = None + license: Optional[License] = None + version: str + + +class ServerVariable(BaseModelWithConfig): + enum: Annotated[Optional[List[str]], Field(min_length=1)] = None + default: str + description: Optional[str] = None + + +class Server(BaseModelWithConfig): + url: Union[AnyUrl, str] + description: Optional[str] = None + variables: Optional[Dict[str, ServerVariable]] = None + + +class Reference(BaseModel): + ref: str = Field(alias="$ref") + + +class Discriminator(BaseModel): + propertyName: str + mapping: Optional[Dict[str, str]] = None + + +class XML(BaseModelWithConfig): + name: Optional[str] = None + namespace: Optional[str] = None + prefix: Optional[str] = None + attribute: Optional[bool] = None + wrapped: Optional[bool] = None + + +class ExternalDocumentation(BaseModelWithConfig): + description: Optional[str] = None + url: AnyUrl + + +class Schema(BaseModelWithConfig): + # Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-json-schema-core-vocabu + # Core Vocabulary + schema_: Optional[str] = Field(default=None, alias="$schema") + vocabulary: Optional[str] = Field(default=None, alias="$vocabulary") + id: Optional[str] = Field(default=None, alias="$id") + anchor: Optional[str] = Field(default=None, alias="$anchor") + dynamicAnchor: Optional[str] = Field(default=None, alias="$dynamicAnchor") + ref: Optional[str] = Field(default=None, alias="$ref") + dynamicRef: Optional[str] = Field(default=None, alias="$dynamicRef") + defs: Optional[Dict[str, "SchemaOrBool"]] = Field(default=None, alias="$defs") + comment: Optional[str] = Field(default=None, alias="$comment") + # Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-a-vocabulary-for-applying-s + # A Vocabulary for Applying Subschemas + allOf: Optional[List["SchemaOrBool"]] = None + anyOf: Optional[List["SchemaOrBool"]] = None + oneOf: Optional[List["SchemaOrBool"]] = None + not_: Optional["SchemaOrBool"] = Field(default=None, alias="not") + if_: Optional["SchemaOrBool"] = Field(default=None, alias="if") + then: Optional["SchemaOrBool"] = None + else_: Optional["SchemaOrBool"] = Field(default=None, alias="else") + dependentSchemas: Optional[Dict[str, "SchemaOrBool"]] = None + prefixItems: Optional[List["SchemaOrBool"]] = None + # TODO: uncomment and remove below when deprecating Pydantic v1 + # It generales a list of schemas for tuples, before prefixItems was available + # items: Optional["SchemaOrBool"] = None + items: Optional[Union["SchemaOrBool", List["SchemaOrBool"]]] = None + contains: Optional["SchemaOrBool"] = None + properties: Optional[Dict[str, "SchemaOrBool"]] = None + patternProperties: Optional[Dict[str, "SchemaOrBool"]] = None + additionalProperties: Optional["SchemaOrBool"] = None + propertyNames: Optional["SchemaOrBool"] = None + unevaluatedItems: Optional["SchemaOrBool"] = None + unevaluatedProperties: Optional["SchemaOrBool"] = None + # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-structural + # A Vocabulary for Structural Validation + type: Optional[str] = None + enum: Optional[List[Any]] = None + const: Optional[Any] = None + multipleOf: Optional[float] = Field(default=None, gt=0) + maximum: Optional[float] = None + exclusiveMaximum: Optional[float] = None + minimum: Optional[float] = None + exclusiveMinimum: Optional[float] = None + maxLength: Optional[int] = Field(default=None, ge=0) + minLength: Optional[int] = Field(default=None, ge=0) + pattern: Optional[str] = None + maxItems: Optional[int] = Field(default=None, ge=0) + minItems: Optional[int] = Field(default=None, ge=0) + uniqueItems: Optional[bool] = None + maxContains: Optional[int] = Field(default=None, ge=0) + minContains: Optional[int] = Field(default=None, ge=0) + maxProperties: Optional[int] = Field(default=None, ge=0) + minProperties: Optional[int] = Field(default=None, ge=0) + required: Optional[List[str]] = None + dependentRequired: Optional[Dict[str, Set[str]]] = None + # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-vocabularies-for-semantic-c + # Vocabularies for Semantic Content With "format" + format: Optional[str] = None + # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-the-conten + # A Vocabulary for the Contents of String-Encoded Data + contentEncoding: Optional[str] = None + contentMediaType: Optional[str] = None + contentSchema: Optional["SchemaOrBool"] = None + # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-basic-meta + # A Vocabulary for Basic Meta-Data Annotations + title: Optional[str] = None + description: Optional[str] = None + default: Optional[Any] = None + deprecated: Optional[bool] = None + readOnly: Optional[bool] = None + writeOnly: Optional[bool] = None + examples: Optional[List[Any]] = None + # Ref: OpenAPI 3.1.0: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#schema-object + # Schema Object + discriminator: Optional[Discriminator] = None + xml: Optional[XML] = None + externalDocs: Optional[ExternalDocumentation] = None + example: Annotated[ + Optional[Any], + typing_deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = None + + +# Ref: https://json-schema.org/draft/2020-12/json-schema-core.html#name-json-schema-documents +# A JSON Schema MUST be an object or a boolean. +SchemaOrBool = Union[Schema, bool] + + +class Example(TypedDict, total=False): + summary: Optional[str] + description: Optional[str] + value: Optional[Any] + externalValue: Optional[AnyUrl] + + if PYDANTIC_V2: # type: ignore [misc] + __pydantic_config__ = {"extra": "allow"} + + else: + + class Config: + extra = "allow" + + +class ParameterInType(Enum): + query = "query" + header = "header" + path = "path" + cookie = "cookie" + + +class Encoding(BaseModelWithConfig): + contentType: Optional[str] = None + headers: Optional[Dict[str, Union["Header", Reference]]] = None + style: Optional[str] = None + explode: Optional[bool] = None + allowReserved: Optional[bool] = None + + +class MediaType(BaseModelWithConfig): + schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema") + example: Optional[Any] = None + examples: Optional[Dict[str, Union[Example, Reference]]] = None + encoding: Optional[Dict[str, Encoding]] = None + + +class ParameterBase(BaseModelWithConfig): + description: Optional[str] = None + required: Optional[bool] = None + deprecated: Optional[bool] = None + # Serialization rules for simple scenarios + style: Optional[str] = None + explode: Optional[bool] = None + allowReserved: Optional[bool] = None + schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema") + example: Optional[Any] = None + examples: Optional[Dict[str, Union[Example, Reference]]] = None + # Serialization rules for more complex scenarios + content: Optional[Dict[str, MediaType]] = None + + +class Parameter(ParameterBase): + name: str + in_: ParameterInType = Field(alias="in") + + +class Header(ParameterBase): + pass + + +class RequestBody(BaseModelWithConfig): + description: Optional[str] = None + content: Dict[str, MediaType] + required: Optional[bool] = None + + +class Link(BaseModelWithConfig): + operationRef: Optional[str] = None + operationId: Optional[str] = None + parameters: Optional[Dict[str, Union[Any, str]]] = None + requestBody: Optional[Union[Any, str]] = None + description: Optional[str] = None + server: Optional[Server] = None + + +class Response(BaseModelWithConfig): + description: str + headers: Optional[Dict[str, Union[Header, Reference]]] = None + content: Optional[Dict[str, MediaType]] = None + links: Optional[Dict[str, Union[Link, Reference]]] = None + + +class Operation(BaseModelWithConfig): + tags: Optional[List[str]] = None + summary: Optional[str] = None + description: Optional[str] = None + externalDocs: Optional[ExternalDocumentation] = None + operationId: Optional[str] = None + parameters: Optional[List[Union[Parameter, Reference]]] = None + requestBody: Optional[Union[RequestBody, Reference]] = None + # Using Any for Specification Extensions + responses: Optional[Dict[str, Union[Response, Any]]] = None + callbacks: Optional[Dict[str, Union[Dict[str, "PathItem"], Reference]]] = None + deprecated: Optional[bool] = None + security: Optional[List[Dict[str, List[str]]]] = None + servers: Optional[List[Server]] = None + + +class PathItem(BaseModelWithConfig): + ref: Optional[str] = Field(default=None, alias="$ref") + summary: Optional[str] = None + description: Optional[str] = None + get: Optional[Operation] = None + put: Optional[Operation] = None + post: Optional[Operation] = None + delete: Optional[Operation] = None + options: Optional[Operation] = None + head: Optional[Operation] = None + patch: Optional[Operation] = None + trace: Optional[Operation] = None + servers: Optional[List[Server]] = None + parameters: Optional[List[Union[Parameter, Reference]]] = None + + +class SecuritySchemeType(Enum): + apiKey = "apiKey" + http = "http" + oauth2 = "oauth2" + openIdConnect = "openIdConnect" + + +class SecurityBase(BaseModelWithConfig): + type_: SecuritySchemeType = Field(alias="type") + description: Optional[str] = None + + +class APIKeyIn(Enum): + query = "query" + header = "header" + cookie = "cookie" + + +class APIKey(SecurityBase): + type_: SecuritySchemeType = Field(default=SecuritySchemeType.apiKey, alias="type") + in_: APIKeyIn = Field(alias="in") + name: str + + +class HTTPBase(SecurityBase): + type_: SecuritySchemeType = Field(default=SecuritySchemeType.http, alias="type") + scheme: str + + +class HTTPBearer(HTTPBase): + scheme: Literal["bearer"] = "bearer" + bearerFormat: Optional[str] = None + + +class OAuthFlow(BaseModelWithConfig): + refreshUrl: Optional[str] = None + scopes: Dict[str, str] = {} + + +class OAuthFlowImplicit(OAuthFlow): + authorizationUrl: str + + +class OAuthFlowPassword(OAuthFlow): + tokenUrl: str + + +class OAuthFlowClientCredentials(OAuthFlow): + tokenUrl: str + + +class OAuthFlowAuthorizationCode(OAuthFlow): + authorizationUrl: str + tokenUrl: str + + +class OAuthFlows(BaseModelWithConfig): + implicit: Optional[OAuthFlowImplicit] = None + password: Optional[OAuthFlowPassword] = None + clientCredentials: Optional[OAuthFlowClientCredentials] = None + authorizationCode: Optional[OAuthFlowAuthorizationCode] = None + + +class OAuth2(SecurityBase): + type_: SecuritySchemeType = Field(default=SecuritySchemeType.oauth2, alias="type") + flows: OAuthFlows + + +class OpenIdConnect(SecurityBase): + type_: SecuritySchemeType = Field( + default=SecuritySchemeType.openIdConnect, alias="type" + ) + openIdConnectUrl: str + + +SecurityScheme = Union[APIKey, HTTPBase, OAuth2, OpenIdConnect, HTTPBearer] + + +class Components(BaseModelWithConfig): + schemas: Optional[Dict[str, Union[Schema, Reference]]] = None + responses: Optional[Dict[str, Union[Response, Reference]]] = None + parameters: Optional[Dict[str, Union[Parameter, Reference]]] = None + examples: Optional[Dict[str, Union[Example, Reference]]] = None + requestBodies: Optional[Dict[str, Union[RequestBody, Reference]]] = None + headers: Optional[Dict[str, Union[Header, Reference]]] = None + securitySchemes: Optional[Dict[str, Union[SecurityScheme, Reference]]] = None + links: Optional[Dict[str, Union[Link, Reference]]] = None + # Using Any for Specification Extensions + callbacks: Optional[Dict[str, Union[Dict[str, PathItem], Reference, Any]]] = None + pathItems: Optional[Dict[str, Union[PathItem, Reference]]] = None + + +class Tag(BaseModelWithConfig): + name: str + description: Optional[str] = None + externalDocs: Optional[ExternalDocumentation] = None + + +class OpenAPI(BaseModelWithConfig): + openapi: str + info: Info + jsonSchemaDialect: Optional[str] = None + servers: Optional[List[Server]] = None + # Using Any for Specification Extensions + paths: Optional[Dict[str, Union[PathItem, Any]]] = None + webhooks: Optional[Dict[str, Union[PathItem, Reference]]] = None + components: Optional[Components] = None + security: Optional[List[Dict[str, List[str]]]] = None + tags: Optional[List[Tag]] = None + externalDocs: Optional[ExternalDocumentation] = None + + +_model_rebuild(Schema) +_model_rebuild(Operation) +_model_rebuild(Encoding) diff --git a/venv/Lib/site-packages/fastapi/openapi/utils.py b/venv/Lib/site-packages/fastapi/openapi/utils.py new file mode 100644 index 00000000..808646cc --- /dev/null +++ b/venv/Lib/site-packages/fastapi/openapi/utils.py @@ -0,0 +1,569 @@ +import http.client +import inspect +import warnings +from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, Type, Union, cast + +from fastapi import routing +from fastapi._compat import ( + GenerateJsonSchema, + JsonSchemaValue, + ModelField, + Undefined, + get_compat_model_name_map, + get_definitions, + get_schema_from_model_field, + lenient_issubclass, +) +from fastapi.datastructures import DefaultPlaceholder +from fastapi.dependencies.models import Dependant +from fastapi.dependencies.utils import ( + _get_flat_fields_from_params, + get_flat_dependant, + get_flat_params, +) +from fastapi.encoders import jsonable_encoder +from fastapi.openapi.constants import METHODS_WITH_BODY, REF_PREFIX, REF_TEMPLATE +from fastapi.openapi.models import OpenAPI +from fastapi.params import Body, ParamTypes +from fastapi.responses import Response +from fastapi.types import ModelNameMap +from fastapi.utils import ( + deep_dict_update, + generate_operation_id_for_path, + is_body_allowed_for_status_code, +) +from pydantic import BaseModel +from starlette.responses import JSONResponse +from starlette.routing import BaseRoute +from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY +from typing_extensions import Literal + +validation_error_definition = { + "title": "ValidationError", + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + "required": ["loc", "msg", "type"], +} + +validation_error_response_definition = { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": REF_PREFIX + "ValidationError"}, + } + }, +} + +status_code_ranges: Dict[str, str] = { + "1XX": "Information", + "2XX": "Success", + "3XX": "Redirection", + "4XX": "Client Error", + "5XX": "Server Error", + "DEFAULT": "Default Response", +} + + +def get_openapi_security_definitions( + flat_dependant: Dependant, +) -> Tuple[Dict[str, Any], List[Dict[str, Any]]]: + security_definitions = {} + operation_security = [] + for security_requirement in flat_dependant.security_requirements: + security_definition = jsonable_encoder( + security_requirement.security_scheme.model, + by_alias=True, + exclude_none=True, + ) + security_name = security_requirement.security_scheme.scheme_name + security_definitions[security_name] = security_definition + operation_security.append({security_name: security_requirement.scopes}) + return security_definitions, operation_security + + +def _get_openapi_operation_parameters( + *, + dependant: Dependant, + schema_generator: GenerateJsonSchema, + model_name_map: ModelNameMap, + field_mapping: Dict[ + Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue + ], + separate_input_output_schemas: bool = True, +) -> List[Dict[str, Any]]: + parameters = [] + flat_dependant = get_flat_dependant(dependant, skip_repeats=True) + path_params = _get_flat_fields_from_params(flat_dependant.path_params) + query_params = _get_flat_fields_from_params(flat_dependant.query_params) + header_params = _get_flat_fields_from_params(flat_dependant.header_params) + cookie_params = _get_flat_fields_from_params(flat_dependant.cookie_params) + parameter_groups = [ + (ParamTypes.path, path_params), + (ParamTypes.query, query_params), + (ParamTypes.header, header_params), + (ParamTypes.cookie, cookie_params), + ] + default_convert_underscores = True + if len(flat_dependant.header_params) == 1: + first_field = flat_dependant.header_params[0] + if lenient_issubclass(first_field.type_, BaseModel): + default_convert_underscores = getattr( + first_field.field_info, "convert_underscores", True + ) + for param_type, param_group in parameter_groups: + for param in param_group: + field_info = param.field_info + # field_info = cast(Param, field_info) + if not getattr(field_info, "include_in_schema", True): + continue + param_schema = get_schema_from_model_field( + field=param, + schema_generator=schema_generator, + model_name_map=model_name_map, + field_mapping=field_mapping, + separate_input_output_schemas=separate_input_output_schemas, + ) + name = param.alias + convert_underscores = getattr( + param.field_info, + "convert_underscores", + default_convert_underscores, + ) + if ( + param_type == ParamTypes.header + and param.alias == param.name + and convert_underscores + ): + name = param.name.replace("_", "-") + + parameter = { + "name": name, + "in": param_type.value, + "required": param.required, + "schema": param_schema, + } + if field_info.description: + parameter["description"] = field_info.description + openapi_examples = getattr(field_info, "openapi_examples", None) + example = getattr(field_info, "example", None) + if openapi_examples: + parameter["examples"] = jsonable_encoder(openapi_examples) + elif example != Undefined: + parameter["example"] = jsonable_encoder(example) + if getattr(field_info, "deprecated", None): + parameter["deprecated"] = True + parameters.append(parameter) + return parameters + + +def get_openapi_operation_request_body( + *, + body_field: Optional[ModelField], + schema_generator: GenerateJsonSchema, + model_name_map: ModelNameMap, + field_mapping: Dict[ + Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue + ], + separate_input_output_schemas: bool = True, +) -> Optional[Dict[str, Any]]: + if not body_field: + return None + assert isinstance(body_field, ModelField) + body_schema = get_schema_from_model_field( + field=body_field, + schema_generator=schema_generator, + model_name_map=model_name_map, + field_mapping=field_mapping, + separate_input_output_schemas=separate_input_output_schemas, + ) + field_info = cast(Body, body_field.field_info) + request_media_type = field_info.media_type + required = body_field.required + request_body_oai: Dict[str, Any] = {} + if required: + request_body_oai["required"] = required + request_media_content: Dict[str, Any] = {"schema": body_schema} + if field_info.openapi_examples: + request_media_content["examples"] = jsonable_encoder( + field_info.openapi_examples + ) + elif field_info.example != Undefined: + request_media_content["example"] = jsonable_encoder(field_info.example) + request_body_oai["content"] = {request_media_type: request_media_content} + return request_body_oai + + +def generate_operation_id( + *, route: routing.APIRoute, method: str +) -> str: # pragma: nocover + warnings.warn( + "fastapi.openapi.utils.generate_operation_id() was deprecated, " + "it is not used internally, and will be removed soon", + DeprecationWarning, + stacklevel=2, + ) + if route.operation_id: + return route.operation_id + path: str = route.path_format + return generate_operation_id_for_path(name=route.name, path=path, method=method) + + +def generate_operation_summary(*, route: routing.APIRoute, method: str) -> str: + if route.summary: + return route.summary + return route.name.replace("_", " ").title() + + +def get_openapi_operation_metadata( + *, route: routing.APIRoute, method: str, operation_ids: Set[str] +) -> Dict[str, Any]: + operation: Dict[str, Any] = {} + if route.tags: + operation["tags"] = route.tags + operation["summary"] = generate_operation_summary(route=route, method=method) + if route.description: + operation["description"] = route.description + operation_id = route.operation_id or route.unique_id + if operation_id in operation_ids: + message = ( + f"Duplicate Operation ID {operation_id} for function " + + f"{route.endpoint.__name__}" + ) + file_name = getattr(route.endpoint, "__globals__", {}).get("__file__") + if file_name: + message += f" at {file_name}" + warnings.warn(message, stacklevel=1) + operation_ids.add(operation_id) + operation["operationId"] = operation_id + if route.deprecated: + operation["deprecated"] = route.deprecated + return operation + + +def get_openapi_path( + *, + route: routing.APIRoute, + operation_ids: Set[str], + schema_generator: GenerateJsonSchema, + model_name_map: ModelNameMap, + field_mapping: Dict[ + Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue + ], + separate_input_output_schemas: bool = True, +) -> Tuple[Dict[str, Any], Dict[str, Any], Dict[str, Any]]: + path = {} + security_schemes: Dict[str, Any] = {} + definitions: Dict[str, Any] = {} + assert route.methods is not None, "Methods must be a list" + if isinstance(route.response_class, DefaultPlaceholder): + current_response_class: Type[Response] = route.response_class.value + else: + current_response_class = route.response_class + assert current_response_class, "A response class is needed to generate OpenAPI" + route_response_media_type: Optional[str] = current_response_class.media_type + if route.include_in_schema: + for method in route.methods: + operation = get_openapi_operation_metadata( + route=route, method=method, operation_ids=operation_ids + ) + parameters: List[Dict[str, Any]] = [] + flat_dependant = get_flat_dependant(route.dependant, skip_repeats=True) + security_definitions, operation_security = get_openapi_security_definitions( + flat_dependant=flat_dependant + ) + if operation_security: + operation.setdefault("security", []).extend(operation_security) + if security_definitions: + security_schemes.update(security_definitions) + operation_parameters = _get_openapi_operation_parameters( + dependant=route.dependant, + schema_generator=schema_generator, + model_name_map=model_name_map, + field_mapping=field_mapping, + separate_input_output_schemas=separate_input_output_schemas, + ) + parameters.extend(operation_parameters) + if parameters: + all_parameters = { + (param["in"], param["name"]): param for param in parameters + } + required_parameters = { + (param["in"], param["name"]): param + for param in parameters + if param.get("required") + } + # Make sure required definitions of the same parameter take precedence + # over non-required definitions + all_parameters.update(required_parameters) + operation["parameters"] = list(all_parameters.values()) + if method in METHODS_WITH_BODY: + request_body_oai = get_openapi_operation_request_body( + body_field=route.body_field, + schema_generator=schema_generator, + model_name_map=model_name_map, + field_mapping=field_mapping, + separate_input_output_schemas=separate_input_output_schemas, + ) + if request_body_oai: + operation["requestBody"] = request_body_oai + if route.callbacks: + callbacks = {} + for callback in route.callbacks: + if isinstance(callback, routing.APIRoute): + ( + cb_path, + cb_security_schemes, + cb_definitions, + ) = get_openapi_path( + route=callback, + operation_ids=operation_ids, + schema_generator=schema_generator, + model_name_map=model_name_map, + field_mapping=field_mapping, + separate_input_output_schemas=separate_input_output_schemas, + ) + callbacks[callback.name] = {callback.path: cb_path} + operation["callbacks"] = callbacks + if route.status_code is not None: + status_code = str(route.status_code) + else: + # It would probably make more sense for all response classes to have an + # explicit default status_code, and to extract it from them, instead of + # doing this inspection tricks, that would probably be in the future + # TODO: probably make status_code a default class attribute for all + # responses in Starlette + response_signature = inspect.signature(current_response_class.__init__) + status_code_param = response_signature.parameters.get("status_code") + if status_code_param is not None: + if isinstance(status_code_param.default, int): + status_code = str(status_code_param.default) + operation.setdefault("responses", {}).setdefault(status_code, {})[ + "description" + ] = route.response_description + if route_response_media_type and is_body_allowed_for_status_code( + route.status_code + ): + response_schema = {"type": "string"} + if lenient_issubclass(current_response_class, JSONResponse): + if route.response_field: + response_schema = get_schema_from_model_field( + field=route.response_field, + schema_generator=schema_generator, + model_name_map=model_name_map, + field_mapping=field_mapping, + separate_input_output_schemas=separate_input_output_schemas, + ) + else: + response_schema = {} + operation.setdefault("responses", {}).setdefault( + status_code, {} + ).setdefault("content", {}).setdefault(route_response_media_type, {})[ + "schema" + ] = response_schema + if route.responses: + operation_responses = operation.setdefault("responses", {}) + for ( + additional_status_code, + additional_response, + ) in route.responses.items(): + process_response = additional_response.copy() + process_response.pop("model", None) + status_code_key = str(additional_status_code).upper() + if status_code_key == "DEFAULT": + status_code_key = "default" + openapi_response = operation_responses.setdefault( + status_code_key, {} + ) + assert isinstance(process_response, dict), ( + "An additional response must be a dict" + ) + field = route.response_fields.get(additional_status_code) + additional_field_schema: Optional[Dict[str, Any]] = None + if field: + additional_field_schema = get_schema_from_model_field( + field=field, + schema_generator=schema_generator, + model_name_map=model_name_map, + field_mapping=field_mapping, + separate_input_output_schemas=separate_input_output_schemas, + ) + media_type = route_response_media_type or "application/json" + additional_schema = ( + process_response.setdefault("content", {}) + .setdefault(media_type, {}) + .setdefault("schema", {}) + ) + deep_dict_update(additional_schema, additional_field_schema) + status_text: Optional[str] = status_code_ranges.get( + str(additional_status_code).upper() + ) or http.client.responses.get(int(additional_status_code)) + description = ( + process_response.get("description") + or openapi_response.get("description") + or status_text + or "Additional Response" + ) + deep_dict_update(openapi_response, process_response) + openapi_response["description"] = description + http422 = str(HTTP_422_UNPROCESSABLE_ENTITY) + all_route_params = get_flat_params(route.dependant) + if (all_route_params or route.body_field) and not any( + status in operation["responses"] + for status in [http422, "4XX", "default"] + ): + operation["responses"][http422] = { + "description": "Validation Error", + "content": { + "application/json": { + "schema": {"$ref": REF_PREFIX + "HTTPValidationError"} + } + }, + } + if "ValidationError" not in definitions: + definitions.update( + { + "ValidationError": validation_error_definition, + "HTTPValidationError": validation_error_response_definition, + } + ) + if route.openapi_extra: + deep_dict_update(operation, route.openapi_extra) + path[method.lower()] = operation + return path, security_schemes, definitions + + +def get_fields_from_routes( + routes: Sequence[BaseRoute], +) -> List[ModelField]: + body_fields_from_routes: List[ModelField] = [] + responses_from_routes: List[ModelField] = [] + request_fields_from_routes: List[ModelField] = [] + callback_flat_models: List[ModelField] = [] + for route in routes: + if getattr(route, "include_in_schema", None) and isinstance( + route, routing.APIRoute + ): + if route.body_field: + assert isinstance(route.body_field, ModelField), ( + "A request body must be a Pydantic Field" + ) + body_fields_from_routes.append(route.body_field) + if route.response_field: + responses_from_routes.append(route.response_field) + if route.response_fields: + responses_from_routes.extend(route.response_fields.values()) + if route.callbacks: + callback_flat_models.extend(get_fields_from_routes(route.callbacks)) + params = get_flat_params(route.dependant) + request_fields_from_routes.extend(params) + + flat_models = callback_flat_models + list( + body_fields_from_routes + responses_from_routes + request_fields_from_routes + ) + return flat_models + + +def get_openapi( + *, + title: str, + version: str, + openapi_version: str = "3.1.0", + summary: Optional[str] = None, + description: Optional[str] = None, + routes: Sequence[BaseRoute], + webhooks: Optional[Sequence[BaseRoute]] = None, + tags: Optional[List[Dict[str, Any]]] = None, + servers: Optional[List[Dict[str, Union[str, Any]]]] = None, + terms_of_service: Optional[str] = None, + contact: Optional[Dict[str, Union[str, Any]]] = None, + license_info: Optional[Dict[str, Union[str, Any]]] = None, + separate_input_output_schemas: bool = True, +) -> Dict[str, Any]: + info: Dict[str, Any] = {"title": title, "version": version} + if summary: + info["summary"] = summary + if description: + info["description"] = description + if terms_of_service: + info["termsOfService"] = terms_of_service + if contact: + info["contact"] = contact + if license_info: + info["license"] = license_info + output: Dict[str, Any] = {"openapi": openapi_version, "info": info} + if servers: + output["servers"] = servers + components: Dict[str, Dict[str, Any]] = {} + paths: Dict[str, Dict[str, Any]] = {} + webhook_paths: Dict[str, Dict[str, Any]] = {} + operation_ids: Set[str] = set() + all_fields = get_fields_from_routes(list(routes or []) + list(webhooks or [])) + model_name_map = get_compat_model_name_map(all_fields) + schema_generator = GenerateJsonSchema(ref_template=REF_TEMPLATE) + field_mapping, definitions = get_definitions( + fields=all_fields, + schema_generator=schema_generator, + model_name_map=model_name_map, + separate_input_output_schemas=separate_input_output_schemas, + ) + for route in routes or []: + if isinstance(route, routing.APIRoute): + result = get_openapi_path( + route=route, + operation_ids=operation_ids, + schema_generator=schema_generator, + model_name_map=model_name_map, + field_mapping=field_mapping, + separate_input_output_schemas=separate_input_output_schemas, + ) + if result: + path, security_schemes, path_definitions = result + if path: + paths.setdefault(route.path_format, {}).update(path) + if security_schemes: + components.setdefault("securitySchemes", {}).update( + security_schemes + ) + if path_definitions: + definitions.update(path_definitions) + for webhook in webhooks or []: + if isinstance(webhook, routing.APIRoute): + result = get_openapi_path( + route=webhook, + operation_ids=operation_ids, + schema_generator=schema_generator, + model_name_map=model_name_map, + field_mapping=field_mapping, + separate_input_output_schemas=separate_input_output_schemas, + ) + if result: + path, security_schemes, path_definitions = result + if path: + webhook_paths.setdefault(webhook.path_format, {}).update(path) + if security_schemes: + components.setdefault("securitySchemes", {}).update( + security_schemes + ) + if path_definitions: + definitions.update(path_definitions) + if definitions: + components["schemas"] = {k: definitions[k] for k in sorted(definitions)} + if components: + output["components"] = components + output["paths"] = paths + if webhook_paths: + output["webhooks"] = webhook_paths + if tags: + output["tags"] = tags + return jsonable_encoder(OpenAPI(**output), by_alias=True, exclude_none=True) # type: ignore diff --git a/venv/Lib/site-packages/fastapi/param_functions.py b/venv/Lib/site-packages/fastapi/param_functions.py new file mode 100644 index 00000000..b3621626 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/param_functions.py @@ -0,0 +1,2360 @@ +from typing import Any, Callable, Dict, List, Optional, Sequence, Union + +from fastapi import params +from fastapi._compat import Undefined +from fastapi.openapi.models import Example +from typing_extensions import Annotated, Doc, deprecated + +_Unset: Any = Undefined + + +def Path( # noqa: N802 + default: Annotated[ + Any, + Doc( + """ + Default value if the parameter field is not set. + + This doesn't affect `Path` parameters as the value is always required. + The parameter is available only for compatibility. + """ + ), + ] = ..., + *, + default_factory: Annotated[ + Union[Callable[[], Any], None], + Doc( + """ + A callable to generate the default value. + + This doesn't affect `Path` parameters as the value is always required. + The parameter is available only for compatibility. + """ + ), + ] = _Unset, + alias: Annotated[ + Optional[str], + Doc( + """ + An alternative name for the parameter field. + + This will be used to extract the data and for the generated OpenAPI. + It is particularly useful when you can't use the name you want because it + is a Python reserved keyword or similar. + """ + ), + ] = None, + alias_priority: Annotated[ + Union[int, None], + Doc( + """ + Priority of the alias. This affects whether an alias generator is used. + """ + ), + ] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Whitelist' validation step. The parameter field will be the single one + allowed by the alias or set of aliases defined. + """ + ), + ] = None, + serialization_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Blacklist' validation step. The vanilla parameter field will be the + single one of the alias' or set of aliases' fields and all the other + fields will be ignored at serialization time. + """ + ), + ] = None, + title: Annotated[ + Optional[str], + Doc( + """ + Human-readable title. + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Human-readable description. + """ + ), + ] = None, + gt: Annotated[ + Optional[float], + Doc( + """ + Greater than. If set, value must be greater than this. Only applicable to + numbers. + """ + ), + ] = None, + ge: Annotated[ + Optional[float], + Doc( + """ + Greater than or equal. If set, value must be greater than or equal to + this. Only applicable to numbers. + """ + ), + ] = None, + lt: Annotated[ + Optional[float], + Doc( + """ + Less than. If set, value must be less than this. Only applicable to numbers. + """ + ), + ] = None, + le: Annotated[ + Optional[float], + Doc( + """ + Less than or equal. If set, value must be less than or equal to this. + Only applicable to numbers. + """ + ), + ] = None, + min_length: Annotated[ + Optional[int], + Doc( + """ + Minimum length for strings. + """ + ), + ] = None, + max_length: Annotated[ + Optional[int], + Doc( + """ + Maximum length for strings. + """ + ), + ] = None, + pattern: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + ] = None, + regex: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Annotated[ + Union[str, None], + Doc( + """ + Parameter field name for discriminating the type in a tagged union. + """ + ), + ] = None, + strict: Annotated[ + Union[bool, None], + Doc( + """ + If `True`, strict validation is applied to the field. + """ + ), + ] = _Unset, + multiple_of: Annotated[ + Union[float, None], + Doc( + """ + Value must be a multiple of this. Only applicable to numbers. + """ + ), + ] = _Unset, + allow_inf_nan: Annotated[ + Union[bool, None], + Doc( + """ + Allow `inf`, `-inf`, `nan`. Only applicable to numbers. + """ + ), + ] = _Unset, + max_digits: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of allow digits for strings. + """ + ), + ] = _Unset, + decimal_places: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of decimal places allowed for numbers. + """ + ), + ] = _Unset, + examples: Annotated[ + Optional[List[Any]], + Doc( + """ + Example values for this field. + """ + ), + ] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Annotated[ + Optional[Dict[str, Example]], + Doc( + """ + OpenAPI-specific examples. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Swagger UI (that provides the `/docs` interface) has better support for the + OpenAPI-specific examples than the JSON Schema `examples`, that's the main + use case for this. + + Read more about it in the + [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). + """ + ), + ] = None, + deprecated: Annotated[ + Union[deprecated, str, bool, None], + Doc( + """ + Mark this parameter field as deprecated. + + It will affect the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + To include (or not) this parameter field in the generated OpenAPI. + You probably don't need it, but it's available. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = True, + json_schema_extra: Annotated[ + Union[Dict[str, Any], None], + Doc( + """ + Any additional JSON schema data. + """ + ), + ] = None, + **extra: Annotated[ + Any, + Doc( + """ + Include extra fields used by the JSON Schema. + """ + ), + deprecated( + """ + The `extra` kwargs is deprecated. Use `json_schema_extra` instead. + """ + ), + ], +) -> Any: + """ + Declare a path parameter for a *path operation*. + + Read more about it in the + [FastAPI docs for Path Parameters and Numeric Validations](https://fastapi.tiangolo.com/tutorial/path-params-numeric-validations/). + + ```python + from typing import Annotated + + from fastapi import FastAPI, Path + + app = FastAPI() + + + @app.get("/items/{item_id}") + async def read_items( + item_id: Annotated[int, Path(title="The ID of the item to get")], + ): + return {"item_id": item_id} + ``` + """ + return params.Path( + default=default, + default_factory=default_factory, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + example=example, + examples=examples, + openapi_examples=openapi_examples, + deprecated=deprecated, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +def Query( # noqa: N802 + default: Annotated[ + Any, + Doc( + """ + Default value if the parameter field is not set. + """ + ), + ] = Undefined, + *, + default_factory: Annotated[ + Union[Callable[[], Any], None], + Doc( + """ + A callable to generate the default value. + + This doesn't affect `Path` parameters as the value is always required. + The parameter is available only for compatibility. + """ + ), + ] = _Unset, + alias: Annotated[ + Optional[str], + Doc( + """ + An alternative name for the parameter field. + + This will be used to extract the data and for the generated OpenAPI. + It is particularly useful when you can't use the name you want because it + is a Python reserved keyword or similar. + """ + ), + ] = None, + alias_priority: Annotated[ + Union[int, None], + Doc( + """ + Priority of the alias. This affects whether an alias generator is used. + """ + ), + ] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Whitelist' validation step. The parameter field will be the single one + allowed by the alias or set of aliases defined. + """ + ), + ] = None, + serialization_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Blacklist' validation step. The vanilla parameter field will be the + single one of the alias' or set of aliases' fields and all the other + fields will be ignored at serialization time. + """ + ), + ] = None, + title: Annotated[ + Optional[str], + Doc( + """ + Human-readable title. + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Human-readable description. + """ + ), + ] = None, + gt: Annotated[ + Optional[float], + Doc( + """ + Greater than. If set, value must be greater than this. Only applicable to + numbers. + """ + ), + ] = None, + ge: Annotated[ + Optional[float], + Doc( + """ + Greater than or equal. If set, value must be greater than or equal to + this. Only applicable to numbers. + """ + ), + ] = None, + lt: Annotated[ + Optional[float], + Doc( + """ + Less than. If set, value must be less than this. Only applicable to numbers. + """ + ), + ] = None, + le: Annotated[ + Optional[float], + Doc( + """ + Less than or equal. If set, value must be less than or equal to this. + Only applicable to numbers. + """ + ), + ] = None, + min_length: Annotated[ + Optional[int], + Doc( + """ + Minimum length for strings. + """ + ), + ] = None, + max_length: Annotated[ + Optional[int], + Doc( + """ + Maximum length for strings. + """ + ), + ] = None, + pattern: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + ] = None, + regex: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Annotated[ + Union[str, None], + Doc( + """ + Parameter field name for discriminating the type in a tagged union. + """ + ), + ] = None, + strict: Annotated[ + Union[bool, None], + Doc( + """ + If `True`, strict validation is applied to the field. + """ + ), + ] = _Unset, + multiple_of: Annotated[ + Union[float, None], + Doc( + """ + Value must be a multiple of this. Only applicable to numbers. + """ + ), + ] = _Unset, + allow_inf_nan: Annotated[ + Union[bool, None], + Doc( + """ + Allow `inf`, `-inf`, `nan`. Only applicable to numbers. + """ + ), + ] = _Unset, + max_digits: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of allow digits for strings. + """ + ), + ] = _Unset, + decimal_places: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of decimal places allowed for numbers. + """ + ), + ] = _Unset, + examples: Annotated[ + Optional[List[Any]], + Doc( + """ + Example values for this field. + """ + ), + ] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Annotated[ + Optional[Dict[str, Example]], + Doc( + """ + OpenAPI-specific examples. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Swagger UI (that provides the `/docs` interface) has better support for the + OpenAPI-specific examples than the JSON Schema `examples`, that's the main + use case for this. + + Read more about it in the + [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). + """ + ), + ] = None, + deprecated: Annotated[ + Union[deprecated, str, bool, None], + Doc( + """ + Mark this parameter field as deprecated. + + It will affect the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + To include (or not) this parameter field in the generated OpenAPI. + You probably don't need it, but it's available. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = True, + json_schema_extra: Annotated[ + Union[Dict[str, Any], None], + Doc( + """ + Any additional JSON schema data. + """ + ), + ] = None, + **extra: Annotated[ + Any, + Doc( + """ + Include extra fields used by the JSON Schema. + """ + ), + deprecated( + """ + The `extra` kwargs is deprecated. Use `json_schema_extra` instead. + """ + ), + ], +) -> Any: + return params.Query( + default=default, + default_factory=default_factory, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + example=example, + examples=examples, + openapi_examples=openapi_examples, + deprecated=deprecated, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +def Header( # noqa: N802 + default: Annotated[ + Any, + Doc( + """ + Default value if the parameter field is not set. + """ + ), + ] = Undefined, + *, + default_factory: Annotated[ + Union[Callable[[], Any], None], + Doc( + """ + A callable to generate the default value. + + This doesn't affect `Path` parameters as the value is always required. + The parameter is available only for compatibility. + """ + ), + ] = _Unset, + alias: Annotated[ + Optional[str], + Doc( + """ + An alternative name for the parameter field. + + This will be used to extract the data and for the generated OpenAPI. + It is particularly useful when you can't use the name you want because it + is a Python reserved keyword or similar. + """ + ), + ] = None, + alias_priority: Annotated[ + Union[int, None], + Doc( + """ + Priority of the alias. This affects whether an alias generator is used. + """ + ), + ] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Whitelist' validation step. The parameter field will be the single one + allowed by the alias or set of aliases defined. + """ + ), + ] = None, + serialization_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Blacklist' validation step. The vanilla parameter field will be the + single one of the alias' or set of aliases' fields and all the other + fields will be ignored at serialization time. + """ + ), + ] = None, + convert_underscores: Annotated[ + bool, + Doc( + """ + Automatically convert underscores to hyphens in the parameter field name. + + Read more about it in the + [FastAPI docs for Header Parameters](https://fastapi.tiangolo.com/tutorial/header-params/#automatic-conversion) + """ + ), + ] = True, + title: Annotated[ + Optional[str], + Doc( + """ + Human-readable title. + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Human-readable description. + """ + ), + ] = None, + gt: Annotated[ + Optional[float], + Doc( + """ + Greater than. If set, value must be greater than this. Only applicable to + numbers. + """ + ), + ] = None, + ge: Annotated[ + Optional[float], + Doc( + """ + Greater than or equal. If set, value must be greater than or equal to + this. Only applicable to numbers. + """ + ), + ] = None, + lt: Annotated[ + Optional[float], + Doc( + """ + Less than. If set, value must be less than this. Only applicable to numbers. + """ + ), + ] = None, + le: Annotated[ + Optional[float], + Doc( + """ + Less than or equal. If set, value must be less than or equal to this. + Only applicable to numbers. + """ + ), + ] = None, + min_length: Annotated[ + Optional[int], + Doc( + """ + Minimum length for strings. + """ + ), + ] = None, + max_length: Annotated[ + Optional[int], + Doc( + """ + Maximum length for strings. + """ + ), + ] = None, + pattern: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + ] = None, + regex: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Annotated[ + Union[str, None], + Doc( + """ + Parameter field name for discriminating the type in a tagged union. + """ + ), + ] = None, + strict: Annotated[ + Union[bool, None], + Doc( + """ + If `True`, strict validation is applied to the field. + """ + ), + ] = _Unset, + multiple_of: Annotated[ + Union[float, None], + Doc( + """ + Value must be a multiple of this. Only applicable to numbers. + """ + ), + ] = _Unset, + allow_inf_nan: Annotated[ + Union[bool, None], + Doc( + """ + Allow `inf`, `-inf`, `nan`. Only applicable to numbers. + """ + ), + ] = _Unset, + max_digits: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of allow digits for strings. + """ + ), + ] = _Unset, + decimal_places: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of decimal places allowed for numbers. + """ + ), + ] = _Unset, + examples: Annotated[ + Optional[List[Any]], + Doc( + """ + Example values for this field. + """ + ), + ] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Annotated[ + Optional[Dict[str, Example]], + Doc( + """ + OpenAPI-specific examples. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Swagger UI (that provides the `/docs` interface) has better support for the + OpenAPI-specific examples than the JSON Schema `examples`, that's the main + use case for this. + + Read more about it in the + [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). + """ + ), + ] = None, + deprecated: Annotated[ + Union[deprecated, str, bool, None], + Doc( + """ + Mark this parameter field as deprecated. + + It will affect the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + To include (or not) this parameter field in the generated OpenAPI. + You probably don't need it, but it's available. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = True, + json_schema_extra: Annotated[ + Union[Dict[str, Any], None], + Doc( + """ + Any additional JSON schema data. + """ + ), + ] = None, + **extra: Annotated[ + Any, + Doc( + """ + Include extra fields used by the JSON Schema. + """ + ), + deprecated( + """ + The `extra` kwargs is deprecated. Use `json_schema_extra` instead. + """ + ), + ], +) -> Any: + return params.Header( + default=default, + default_factory=default_factory, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + convert_underscores=convert_underscores, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + example=example, + examples=examples, + openapi_examples=openapi_examples, + deprecated=deprecated, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +def Cookie( # noqa: N802 + default: Annotated[ + Any, + Doc( + """ + Default value if the parameter field is not set. + """ + ), + ] = Undefined, + *, + default_factory: Annotated[ + Union[Callable[[], Any], None], + Doc( + """ + A callable to generate the default value. + + This doesn't affect `Path` parameters as the value is always required. + The parameter is available only for compatibility. + """ + ), + ] = _Unset, + alias: Annotated[ + Optional[str], + Doc( + """ + An alternative name for the parameter field. + + This will be used to extract the data and for the generated OpenAPI. + It is particularly useful when you can't use the name you want because it + is a Python reserved keyword or similar. + """ + ), + ] = None, + alias_priority: Annotated[ + Union[int, None], + Doc( + """ + Priority of the alias. This affects whether an alias generator is used. + """ + ), + ] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Whitelist' validation step. The parameter field will be the single one + allowed by the alias or set of aliases defined. + """ + ), + ] = None, + serialization_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Blacklist' validation step. The vanilla parameter field will be the + single one of the alias' or set of aliases' fields and all the other + fields will be ignored at serialization time. + """ + ), + ] = None, + title: Annotated[ + Optional[str], + Doc( + """ + Human-readable title. + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Human-readable description. + """ + ), + ] = None, + gt: Annotated[ + Optional[float], + Doc( + """ + Greater than. If set, value must be greater than this. Only applicable to + numbers. + """ + ), + ] = None, + ge: Annotated[ + Optional[float], + Doc( + """ + Greater than or equal. If set, value must be greater than or equal to + this. Only applicable to numbers. + """ + ), + ] = None, + lt: Annotated[ + Optional[float], + Doc( + """ + Less than. If set, value must be less than this. Only applicable to numbers. + """ + ), + ] = None, + le: Annotated[ + Optional[float], + Doc( + """ + Less than or equal. If set, value must be less than or equal to this. + Only applicable to numbers. + """ + ), + ] = None, + min_length: Annotated[ + Optional[int], + Doc( + """ + Minimum length for strings. + """ + ), + ] = None, + max_length: Annotated[ + Optional[int], + Doc( + """ + Maximum length for strings. + """ + ), + ] = None, + pattern: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + ] = None, + regex: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Annotated[ + Union[str, None], + Doc( + """ + Parameter field name for discriminating the type in a tagged union. + """ + ), + ] = None, + strict: Annotated[ + Union[bool, None], + Doc( + """ + If `True`, strict validation is applied to the field. + """ + ), + ] = _Unset, + multiple_of: Annotated[ + Union[float, None], + Doc( + """ + Value must be a multiple of this. Only applicable to numbers. + """ + ), + ] = _Unset, + allow_inf_nan: Annotated[ + Union[bool, None], + Doc( + """ + Allow `inf`, `-inf`, `nan`. Only applicable to numbers. + """ + ), + ] = _Unset, + max_digits: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of allow digits for strings. + """ + ), + ] = _Unset, + decimal_places: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of decimal places allowed for numbers. + """ + ), + ] = _Unset, + examples: Annotated[ + Optional[List[Any]], + Doc( + """ + Example values for this field. + """ + ), + ] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Annotated[ + Optional[Dict[str, Example]], + Doc( + """ + OpenAPI-specific examples. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Swagger UI (that provides the `/docs` interface) has better support for the + OpenAPI-specific examples than the JSON Schema `examples`, that's the main + use case for this. + + Read more about it in the + [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). + """ + ), + ] = None, + deprecated: Annotated[ + Union[deprecated, str, bool, None], + Doc( + """ + Mark this parameter field as deprecated. + + It will affect the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + To include (or not) this parameter field in the generated OpenAPI. + You probably don't need it, but it's available. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = True, + json_schema_extra: Annotated[ + Union[Dict[str, Any], None], + Doc( + """ + Any additional JSON schema data. + """ + ), + ] = None, + **extra: Annotated[ + Any, + Doc( + """ + Include extra fields used by the JSON Schema. + """ + ), + deprecated( + """ + The `extra` kwargs is deprecated. Use `json_schema_extra` instead. + """ + ), + ], +) -> Any: + return params.Cookie( + default=default, + default_factory=default_factory, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + example=example, + examples=examples, + openapi_examples=openapi_examples, + deprecated=deprecated, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +def Body( # noqa: N802 + default: Annotated[ + Any, + Doc( + """ + Default value if the parameter field is not set. + """ + ), + ] = Undefined, + *, + default_factory: Annotated[ + Union[Callable[[], Any], None], + Doc( + """ + A callable to generate the default value. + + This doesn't affect `Path` parameters as the value is always required. + The parameter is available only for compatibility. + """ + ), + ] = _Unset, + embed: Annotated[ + Union[bool, None], + Doc( + """ + When `embed` is `True`, the parameter will be expected in a JSON body as a + key instead of being the JSON body itself. + + This happens automatically when more than one `Body` parameter is declared. + + Read more about it in the + [FastAPI docs for Body - Multiple Parameters](https://fastapi.tiangolo.com/tutorial/body-multiple-params/#embed-a-single-body-parameter). + """ + ), + ] = None, + media_type: Annotated[ + str, + Doc( + """ + The media type of this parameter field. Changing it would affect the + generated OpenAPI, but currently it doesn't affect the parsing of the data. + """ + ), + ] = "application/json", + alias: Annotated[ + Optional[str], + Doc( + """ + An alternative name for the parameter field. + + This will be used to extract the data and for the generated OpenAPI. + It is particularly useful when you can't use the name you want because it + is a Python reserved keyword or similar. + """ + ), + ] = None, + alias_priority: Annotated[ + Union[int, None], + Doc( + """ + Priority of the alias. This affects whether an alias generator is used. + """ + ), + ] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Whitelist' validation step. The parameter field will be the single one + allowed by the alias or set of aliases defined. + """ + ), + ] = None, + serialization_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Blacklist' validation step. The vanilla parameter field will be the + single one of the alias' or set of aliases' fields and all the other + fields will be ignored at serialization time. + """ + ), + ] = None, + title: Annotated[ + Optional[str], + Doc( + """ + Human-readable title. + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Human-readable description. + """ + ), + ] = None, + gt: Annotated[ + Optional[float], + Doc( + """ + Greater than. If set, value must be greater than this. Only applicable to + numbers. + """ + ), + ] = None, + ge: Annotated[ + Optional[float], + Doc( + """ + Greater than or equal. If set, value must be greater than or equal to + this. Only applicable to numbers. + """ + ), + ] = None, + lt: Annotated[ + Optional[float], + Doc( + """ + Less than. If set, value must be less than this. Only applicable to numbers. + """ + ), + ] = None, + le: Annotated[ + Optional[float], + Doc( + """ + Less than or equal. If set, value must be less than or equal to this. + Only applicable to numbers. + """ + ), + ] = None, + min_length: Annotated[ + Optional[int], + Doc( + """ + Minimum length for strings. + """ + ), + ] = None, + max_length: Annotated[ + Optional[int], + Doc( + """ + Maximum length for strings. + """ + ), + ] = None, + pattern: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + ] = None, + regex: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Annotated[ + Union[str, None], + Doc( + """ + Parameter field name for discriminating the type in a tagged union. + """ + ), + ] = None, + strict: Annotated[ + Union[bool, None], + Doc( + """ + If `True`, strict validation is applied to the field. + """ + ), + ] = _Unset, + multiple_of: Annotated[ + Union[float, None], + Doc( + """ + Value must be a multiple of this. Only applicable to numbers. + """ + ), + ] = _Unset, + allow_inf_nan: Annotated[ + Union[bool, None], + Doc( + """ + Allow `inf`, `-inf`, `nan`. Only applicable to numbers. + """ + ), + ] = _Unset, + max_digits: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of allow digits for strings. + """ + ), + ] = _Unset, + decimal_places: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of decimal places allowed for numbers. + """ + ), + ] = _Unset, + examples: Annotated[ + Optional[List[Any]], + Doc( + """ + Example values for this field. + """ + ), + ] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Annotated[ + Optional[Dict[str, Example]], + Doc( + """ + OpenAPI-specific examples. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Swagger UI (that provides the `/docs` interface) has better support for the + OpenAPI-specific examples than the JSON Schema `examples`, that's the main + use case for this. + + Read more about it in the + [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). + """ + ), + ] = None, + deprecated: Annotated[ + Union[deprecated, str, bool, None], + Doc( + """ + Mark this parameter field as deprecated. + + It will affect the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + To include (or not) this parameter field in the generated OpenAPI. + You probably don't need it, but it's available. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = True, + json_schema_extra: Annotated[ + Union[Dict[str, Any], None], + Doc( + """ + Any additional JSON schema data. + """ + ), + ] = None, + **extra: Annotated[ + Any, + Doc( + """ + Include extra fields used by the JSON Schema. + """ + ), + deprecated( + """ + The `extra` kwargs is deprecated. Use `json_schema_extra` instead. + """ + ), + ], +) -> Any: + return params.Body( + default=default, + default_factory=default_factory, + embed=embed, + media_type=media_type, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + example=example, + examples=examples, + openapi_examples=openapi_examples, + deprecated=deprecated, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +def Form( # noqa: N802 + default: Annotated[ + Any, + Doc( + """ + Default value if the parameter field is not set. + """ + ), + ] = Undefined, + *, + default_factory: Annotated[ + Union[Callable[[], Any], None], + Doc( + """ + A callable to generate the default value. + + This doesn't affect `Path` parameters as the value is always required. + The parameter is available only for compatibility. + """ + ), + ] = _Unset, + media_type: Annotated[ + str, + Doc( + """ + The media type of this parameter field. Changing it would affect the + generated OpenAPI, but currently it doesn't affect the parsing of the data. + """ + ), + ] = "application/x-www-form-urlencoded", + alias: Annotated[ + Optional[str], + Doc( + """ + An alternative name for the parameter field. + + This will be used to extract the data and for the generated OpenAPI. + It is particularly useful when you can't use the name you want because it + is a Python reserved keyword or similar. + """ + ), + ] = None, + alias_priority: Annotated[ + Union[int, None], + Doc( + """ + Priority of the alias. This affects whether an alias generator is used. + """ + ), + ] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Whitelist' validation step. The parameter field will be the single one + allowed by the alias or set of aliases defined. + """ + ), + ] = None, + serialization_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Blacklist' validation step. The vanilla parameter field will be the + single one of the alias' or set of aliases' fields and all the other + fields will be ignored at serialization time. + """ + ), + ] = None, + title: Annotated[ + Optional[str], + Doc( + """ + Human-readable title. + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Human-readable description. + """ + ), + ] = None, + gt: Annotated[ + Optional[float], + Doc( + """ + Greater than. If set, value must be greater than this. Only applicable to + numbers. + """ + ), + ] = None, + ge: Annotated[ + Optional[float], + Doc( + """ + Greater than or equal. If set, value must be greater than or equal to + this. Only applicable to numbers. + """ + ), + ] = None, + lt: Annotated[ + Optional[float], + Doc( + """ + Less than. If set, value must be less than this. Only applicable to numbers. + """ + ), + ] = None, + le: Annotated[ + Optional[float], + Doc( + """ + Less than or equal. If set, value must be less than or equal to this. + Only applicable to numbers. + """ + ), + ] = None, + min_length: Annotated[ + Optional[int], + Doc( + """ + Minimum length for strings. + """ + ), + ] = None, + max_length: Annotated[ + Optional[int], + Doc( + """ + Maximum length for strings. + """ + ), + ] = None, + pattern: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + ] = None, + regex: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Annotated[ + Union[str, None], + Doc( + """ + Parameter field name for discriminating the type in a tagged union. + """ + ), + ] = None, + strict: Annotated[ + Union[bool, None], + Doc( + """ + If `True`, strict validation is applied to the field. + """ + ), + ] = _Unset, + multiple_of: Annotated[ + Union[float, None], + Doc( + """ + Value must be a multiple of this. Only applicable to numbers. + """ + ), + ] = _Unset, + allow_inf_nan: Annotated[ + Union[bool, None], + Doc( + """ + Allow `inf`, `-inf`, `nan`. Only applicable to numbers. + """ + ), + ] = _Unset, + max_digits: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of allow digits for strings. + """ + ), + ] = _Unset, + decimal_places: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of decimal places allowed for numbers. + """ + ), + ] = _Unset, + examples: Annotated[ + Optional[List[Any]], + Doc( + """ + Example values for this field. + """ + ), + ] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Annotated[ + Optional[Dict[str, Example]], + Doc( + """ + OpenAPI-specific examples. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Swagger UI (that provides the `/docs` interface) has better support for the + OpenAPI-specific examples than the JSON Schema `examples`, that's the main + use case for this. + + Read more about it in the + [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). + """ + ), + ] = None, + deprecated: Annotated[ + Union[deprecated, str, bool, None], + Doc( + """ + Mark this parameter field as deprecated. + + It will affect the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + To include (or not) this parameter field in the generated OpenAPI. + You probably don't need it, but it's available. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = True, + json_schema_extra: Annotated[ + Union[Dict[str, Any], None], + Doc( + """ + Any additional JSON schema data. + """ + ), + ] = None, + **extra: Annotated[ + Any, + Doc( + """ + Include extra fields used by the JSON Schema. + """ + ), + deprecated( + """ + The `extra` kwargs is deprecated. Use `json_schema_extra` instead. + """ + ), + ], +) -> Any: + return params.Form( + default=default, + default_factory=default_factory, + media_type=media_type, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + example=example, + examples=examples, + openapi_examples=openapi_examples, + deprecated=deprecated, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +def File( # noqa: N802 + default: Annotated[ + Any, + Doc( + """ + Default value if the parameter field is not set. + """ + ), + ] = Undefined, + *, + default_factory: Annotated[ + Union[Callable[[], Any], None], + Doc( + """ + A callable to generate the default value. + + This doesn't affect `Path` parameters as the value is always required. + The parameter is available only for compatibility. + """ + ), + ] = _Unset, + media_type: Annotated[ + str, + Doc( + """ + The media type of this parameter field. Changing it would affect the + generated OpenAPI, but currently it doesn't affect the parsing of the data. + """ + ), + ] = "multipart/form-data", + alias: Annotated[ + Optional[str], + Doc( + """ + An alternative name for the parameter field. + + This will be used to extract the data and for the generated OpenAPI. + It is particularly useful when you can't use the name you want because it + is a Python reserved keyword or similar. + """ + ), + ] = None, + alias_priority: Annotated[ + Union[int, None], + Doc( + """ + Priority of the alias. This affects whether an alias generator is used. + """ + ), + ] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Whitelist' validation step. The parameter field will be the single one + allowed by the alias or set of aliases defined. + """ + ), + ] = None, + serialization_alias: Annotated[ + Union[str, None], + Doc( + """ + 'Blacklist' validation step. The vanilla parameter field will be the + single one of the alias' or set of aliases' fields and all the other + fields will be ignored at serialization time. + """ + ), + ] = None, + title: Annotated[ + Optional[str], + Doc( + """ + Human-readable title. + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Human-readable description. + """ + ), + ] = None, + gt: Annotated[ + Optional[float], + Doc( + """ + Greater than. If set, value must be greater than this. Only applicable to + numbers. + """ + ), + ] = None, + ge: Annotated[ + Optional[float], + Doc( + """ + Greater than or equal. If set, value must be greater than or equal to + this. Only applicable to numbers. + """ + ), + ] = None, + lt: Annotated[ + Optional[float], + Doc( + """ + Less than. If set, value must be less than this. Only applicable to numbers. + """ + ), + ] = None, + le: Annotated[ + Optional[float], + Doc( + """ + Less than or equal. If set, value must be less than or equal to this. + Only applicable to numbers. + """ + ), + ] = None, + min_length: Annotated[ + Optional[int], + Doc( + """ + Minimum length for strings. + """ + ), + ] = None, + max_length: Annotated[ + Optional[int], + Doc( + """ + Maximum length for strings. + """ + ), + ] = None, + pattern: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + ] = None, + regex: Annotated[ + Optional[str], + Doc( + """ + RegEx pattern for strings. + """ + ), + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Annotated[ + Union[str, None], + Doc( + """ + Parameter field name for discriminating the type in a tagged union. + """ + ), + ] = None, + strict: Annotated[ + Union[bool, None], + Doc( + """ + If `True`, strict validation is applied to the field. + """ + ), + ] = _Unset, + multiple_of: Annotated[ + Union[float, None], + Doc( + """ + Value must be a multiple of this. Only applicable to numbers. + """ + ), + ] = _Unset, + allow_inf_nan: Annotated[ + Union[bool, None], + Doc( + """ + Allow `inf`, `-inf`, `nan`. Only applicable to numbers. + """ + ), + ] = _Unset, + max_digits: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of allow digits for strings. + """ + ), + ] = _Unset, + decimal_places: Annotated[ + Union[int, None], + Doc( + """ + Maximum number of decimal places allowed for numbers. + """ + ), + ] = _Unset, + examples: Annotated[ + Optional[List[Any]], + Doc( + """ + Example values for this field. + """ + ), + ] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Annotated[ + Optional[Dict[str, Example]], + Doc( + """ + OpenAPI-specific examples. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Swagger UI (that provides the `/docs` interface) has better support for the + OpenAPI-specific examples than the JSON Schema `examples`, that's the main + use case for this. + + Read more about it in the + [FastAPI docs for Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#using-the-openapi_examples-parameter). + """ + ), + ] = None, + deprecated: Annotated[ + Union[deprecated, str, bool, None], + Doc( + """ + Mark this parameter field as deprecated. + + It will affect the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + To include (or not) this parameter field in the generated OpenAPI. + You probably don't need it, but it's available. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = True, + json_schema_extra: Annotated[ + Union[Dict[str, Any], None], + Doc( + """ + Any additional JSON schema data. + """ + ), + ] = None, + **extra: Annotated[ + Any, + Doc( + """ + Include extra fields used by the JSON Schema. + """ + ), + deprecated( + """ + The `extra` kwargs is deprecated. Use `json_schema_extra` instead. + """ + ), + ], +) -> Any: + return params.File( + default=default, + default_factory=default_factory, + media_type=media_type, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + example=example, + examples=examples, + openapi_examples=openapi_examples, + deprecated=deprecated, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +def Depends( # noqa: N802 + dependency: Annotated[ + Optional[Callable[..., Any]], + Doc( + """ + A "dependable" callable (like a function). + + Don't call it directly, FastAPI will call it for you, just pass the object + directly. + """ + ), + ] = None, + *, + use_cache: Annotated[ + bool, + Doc( + """ + By default, after a dependency is called the first time in a request, if + the dependency is declared again for the rest of the request (for example + if the dependency is needed by several dependencies), the value will be + re-used for the rest of the request. + + Set `use_cache` to `False` to disable this behavior and ensure the + dependency is called again (if declared more than once) in the same request. + """ + ), + ] = True, +) -> Any: + """ + Declare a FastAPI dependency. + + It takes a single "dependable" callable (like a function). + + Don't call it directly, FastAPI will call it for you. + + Read more about it in the + [FastAPI docs for Dependencies](https://fastapi.tiangolo.com/tutorial/dependencies/). + + **Example** + + ```python + from typing import Annotated + + from fastapi import Depends, FastAPI + + app = FastAPI() + + + async def common_parameters(q: str | None = None, skip: int = 0, limit: int = 100): + return {"q": q, "skip": skip, "limit": limit} + + + @app.get("/items/") + async def read_items(commons: Annotated[dict, Depends(common_parameters)]): + return commons + ``` + """ + return params.Depends(dependency=dependency, use_cache=use_cache) + + +def Security( # noqa: N802 + dependency: Annotated[ + Optional[Callable[..., Any]], + Doc( + """ + A "dependable" callable (like a function). + + Don't call it directly, FastAPI will call it for you, just pass the object + directly. + """ + ), + ] = None, + *, + scopes: Annotated[ + Optional[Sequence[str]], + Doc( + """ + OAuth2 scopes required for the *path operation* that uses this Security + dependency. + + The term "scope" comes from the OAuth2 specification, it seems to be + intentionally vague and interpretable. It normally refers to permissions, + in cases to roles. + + These scopes are integrated with OpenAPI (and the API docs at `/docs`). + So they are visible in the OpenAPI specification. + ) + """ + ), + ] = None, + use_cache: Annotated[ + bool, + Doc( + """ + By default, after a dependency is called the first time in a request, if + the dependency is declared again for the rest of the request (for example + if the dependency is needed by several dependencies), the value will be + re-used for the rest of the request. + + Set `use_cache` to `False` to disable this behavior and ensure the + dependency is called again (if declared more than once) in the same request. + """ + ), + ] = True, +) -> Any: + """ + Declare a FastAPI Security dependency. + + The only difference with a regular dependency is that it can declare OAuth2 + scopes that will be integrated with OpenAPI and the automatic UI docs (by default + at `/docs`). + + It takes a single "dependable" callable (like a function). + + Don't call it directly, FastAPI will call it for you. + + Read more about it in the + [FastAPI docs for Security](https://fastapi.tiangolo.com/tutorial/security/) and + in the + [FastAPI docs for OAuth2 scopes](https://fastapi.tiangolo.com/advanced/security/oauth2-scopes/). + + **Example** + + ```python + from typing import Annotated + + from fastapi import Security, FastAPI + + from .db import User + from .security import get_current_active_user + + app = FastAPI() + + @app.get("/users/me/items/") + async def read_own_items( + current_user: Annotated[User, Security(get_current_active_user, scopes=["items"])] + ): + return [{"item_id": "Foo", "owner": current_user.username}] + ``` + """ + return params.Security(dependency=dependency, scopes=scopes, use_cache=use_cache) diff --git a/venv/Lib/site-packages/fastapi/params.py b/venv/Lib/site-packages/fastapi/params.py new file mode 100644 index 00000000..8f5601dd --- /dev/null +++ b/venv/Lib/site-packages/fastapi/params.py @@ -0,0 +1,786 @@ +import warnings +from enum import Enum +from typing import Any, Callable, Dict, List, Optional, Sequence, Union + +from fastapi.openapi.models import Example +from pydantic.fields import FieldInfo +from typing_extensions import Annotated, deprecated + +from ._compat import ( + PYDANTIC_V2, + PYDANTIC_VERSION_MINOR_TUPLE, + Undefined, +) + +_Unset: Any = Undefined + + +class ParamTypes(Enum): + query = "query" + header = "header" + path = "path" + cookie = "cookie" + + +class Param(FieldInfo): + in_: ParamTypes + + def __init__( + self, + default: Any = Undefined, + *, + default_factory: Union[Callable[[], Any], None] = _Unset, + annotation: Optional[Any] = None, + alias: Optional[str] = None, + alias_priority: Union[int, None] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Union[str, None] = None, + serialization_alias: Union[str, None] = None, + title: Optional[str] = None, + description: Optional[str] = None, + gt: Optional[float] = None, + ge: Optional[float] = None, + lt: Optional[float] = None, + le: Optional[float] = None, + min_length: Optional[int] = None, + max_length: Optional[int] = None, + pattern: Optional[str] = None, + regex: Annotated[ + Optional[str], + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Union[str, None] = None, + strict: Union[bool, None] = _Unset, + multiple_of: Union[float, None] = _Unset, + allow_inf_nan: Union[bool, None] = _Unset, + max_digits: Union[int, None] = _Unset, + decimal_places: Union[int, None] = _Unset, + examples: Optional[List[Any]] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Optional[Dict[str, Example]] = None, + deprecated: Union[deprecated, str, bool, None] = None, + include_in_schema: bool = True, + json_schema_extra: Union[Dict[str, Any], None] = None, + **extra: Any, + ): + if example is not _Unset: + warnings.warn( + "`example` has been deprecated, please use `examples` instead", + category=DeprecationWarning, + stacklevel=4, + ) + self.example = example + self.include_in_schema = include_in_schema + self.openapi_examples = openapi_examples + kwargs = dict( + default=default, + default_factory=default_factory, + alias=alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + discriminator=discriminator, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + **extra, + ) + if examples is not None: + kwargs["examples"] = examples + if regex is not None: + warnings.warn( + "`regex` has been deprecated, please use `pattern` instead", + category=DeprecationWarning, + stacklevel=4, + ) + current_json_schema_extra = json_schema_extra or extra + if PYDANTIC_VERSION_MINOR_TUPLE < (2, 7): + self.deprecated = deprecated + else: + kwargs["deprecated"] = deprecated + if PYDANTIC_V2: + kwargs.update( + { + "annotation": annotation, + "alias_priority": alias_priority, + "validation_alias": validation_alias, + "serialization_alias": serialization_alias, + "strict": strict, + "json_schema_extra": current_json_schema_extra, + } + ) + kwargs["pattern"] = pattern or regex + else: + kwargs["regex"] = pattern or regex + kwargs.update(**current_json_schema_extra) + use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset} + + super().__init__(**use_kwargs) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.default})" + + +class Path(Param): + in_ = ParamTypes.path + + def __init__( + self, + default: Any = ..., + *, + default_factory: Union[Callable[[], Any], None] = _Unset, + annotation: Optional[Any] = None, + alias: Optional[str] = None, + alias_priority: Union[int, None] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Union[str, None] = None, + serialization_alias: Union[str, None] = None, + title: Optional[str] = None, + description: Optional[str] = None, + gt: Optional[float] = None, + ge: Optional[float] = None, + lt: Optional[float] = None, + le: Optional[float] = None, + min_length: Optional[int] = None, + max_length: Optional[int] = None, + pattern: Optional[str] = None, + regex: Annotated[ + Optional[str], + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Union[str, None] = None, + strict: Union[bool, None] = _Unset, + multiple_of: Union[float, None] = _Unset, + allow_inf_nan: Union[bool, None] = _Unset, + max_digits: Union[int, None] = _Unset, + decimal_places: Union[int, None] = _Unset, + examples: Optional[List[Any]] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Optional[Dict[str, Example]] = None, + deprecated: Union[deprecated, str, bool, None] = None, + include_in_schema: bool = True, + json_schema_extra: Union[Dict[str, Any], None] = None, + **extra: Any, + ): + assert default is ..., "Path parameters cannot have a default value" + self.in_ = self.in_ + super().__init__( + default=default, + default_factory=default_factory, + annotation=annotation, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + deprecated=deprecated, + example=example, + examples=examples, + openapi_examples=openapi_examples, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +class Query(Param): + in_ = ParamTypes.query + + def __init__( + self, + default: Any = Undefined, + *, + default_factory: Union[Callable[[], Any], None] = _Unset, + annotation: Optional[Any] = None, + alias: Optional[str] = None, + alias_priority: Union[int, None] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Union[str, None] = None, + serialization_alias: Union[str, None] = None, + title: Optional[str] = None, + description: Optional[str] = None, + gt: Optional[float] = None, + ge: Optional[float] = None, + lt: Optional[float] = None, + le: Optional[float] = None, + min_length: Optional[int] = None, + max_length: Optional[int] = None, + pattern: Optional[str] = None, + regex: Annotated[ + Optional[str], + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Union[str, None] = None, + strict: Union[bool, None] = _Unset, + multiple_of: Union[float, None] = _Unset, + allow_inf_nan: Union[bool, None] = _Unset, + max_digits: Union[int, None] = _Unset, + decimal_places: Union[int, None] = _Unset, + examples: Optional[List[Any]] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Optional[Dict[str, Example]] = None, + deprecated: Union[deprecated, str, bool, None] = None, + include_in_schema: bool = True, + json_schema_extra: Union[Dict[str, Any], None] = None, + **extra: Any, + ): + super().__init__( + default=default, + default_factory=default_factory, + annotation=annotation, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + deprecated=deprecated, + example=example, + examples=examples, + openapi_examples=openapi_examples, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +class Header(Param): + in_ = ParamTypes.header + + def __init__( + self, + default: Any = Undefined, + *, + default_factory: Union[Callable[[], Any], None] = _Unset, + annotation: Optional[Any] = None, + alias: Optional[str] = None, + alias_priority: Union[int, None] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Union[str, None] = None, + serialization_alias: Union[str, None] = None, + convert_underscores: bool = True, + title: Optional[str] = None, + description: Optional[str] = None, + gt: Optional[float] = None, + ge: Optional[float] = None, + lt: Optional[float] = None, + le: Optional[float] = None, + min_length: Optional[int] = None, + max_length: Optional[int] = None, + pattern: Optional[str] = None, + regex: Annotated[ + Optional[str], + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Union[str, None] = None, + strict: Union[bool, None] = _Unset, + multiple_of: Union[float, None] = _Unset, + allow_inf_nan: Union[bool, None] = _Unset, + max_digits: Union[int, None] = _Unset, + decimal_places: Union[int, None] = _Unset, + examples: Optional[List[Any]] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Optional[Dict[str, Example]] = None, + deprecated: Union[deprecated, str, bool, None] = None, + include_in_schema: bool = True, + json_schema_extra: Union[Dict[str, Any], None] = None, + **extra: Any, + ): + self.convert_underscores = convert_underscores + super().__init__( + default=default, + default_factory=default_factory, + annotation=annotation, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + deprecated=deprecated, + example=example, + examples=examples, + openapi_examples=openapi_examples, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +class Cookie(Param): + in_ = ParamTypes.cookie + + def __init__( + self, + default: Any = Undefined, + *, + default_factory: Union[Callable[[], Any], None] = _Unset, + annotation: Optional[Any] = None, + alias: Optional[str] = None, + alias_priority: Union[int, None] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Union[str, None] = None, + serialization_alias: Union[str, None] = None, + title: Optional[str] = None, + description: Optional[str] = None, + gt: Optional[float] = None, + ge: Optional[float] = None, + lt: Optional[float] = None, + le: Optional[float] = None, + min_length: Optional[int] = None, + max_length: Optional[int] = None, + pattern: Optional[str] = None, + regex: Annotated[ + Optional[str], + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Union[str, None] = None, + strict: Union[bool, None] = _Unset, + multiple_of: Union[float, None] = _Unset, + allow_inf_nan: Union[bool, None] = _Unset, + max_digits: Union[int, None] = _Unset, + decimal_places: Union[int, None] = _Unset, + examples: Optional[List[Any]] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Optional[Dict[str, Example]] = None, + deprecated: Union[deprecated, str, bool, None] = None, + include_in_schema: bool = True, + json_schema_extra: Union[Dict[str, Any], None] = None, + **extra: Any, + ): + super().__init__( + default=default, + default_factory=default_factory, + annotation=annotation, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + deprecated=deprecated, + example=example, + examples=examples, + openapi_examples=openapi_examples, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +class Body(FieldInfo): + def __init__( + self, + default: Any = Undefined, + *, + default_factory: Union[Callable[[], Any], None] = _Unset, + annotation: Optional[Any] = None, + embed: Union[bool, None] = None, + media_type: str = "application/json", + alias: Optional[str] = None, + alias_priority: Union[int, None] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Union[str, None] = None, + serialization_alias: Union[str, None] = None, + title: Optional[str] = None, + description: Optional[str] = None, + gt: Optional[float] = None, + ge: Optional[float] = None, + lt: Optional[float] = None, + le: Optional[float] = None, + min_length: Optional[int] = None, + max_length: Optional[int] = None, + pattern: Optional[str] = None, + regex: Annotated[ + Optional[str], + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Union[str, None] = None, + strict: Union[bool, None] = _Unset, + multiple_of: Union[float, None] = _Unset, + allow_inf_nan: Union[bool, None] = _Unset, + max_digits: Union[int, None] = _Unset, + decimal_places: Union[int, None] = _Unset, + examples: Optional[List[Any]] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Optional[Dict[str, Example]] = None, + deprecated: Union[deprecated, str, bool, None] = None, + include_in_schema: bool = True, + json_schema_extra: Union[Dict[str, Any], None] = None, + **extra: Any, + ): + self.embed = embed + self.media_type = media_type + if example is not _Unset: + warnings.warn( + "`example` has been deprecated, please use `examples` instead", + category=DeprecationWarning, + stacklevel=4, + ) + self.example = example + self.include_in_schema = include_in_schema + self.openapi_examples = openapi_examples + kwargs = dict( + default=default, + default_factory=default_factory, + alias=alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + discriminator=discriminator, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + **extra, + ) + if examples is not None: + kwargs["examples"] = examples + if regex is not None: + warnings.warn( + "`regex` has been deprecated, please use `pattern` instead", + category=DeprecationWarning, + stacklevel=4, + ) + current_json_schema_extra = json_schema_extra or extra + if PYDANTIC_VERSION_MINOR_TUPLE < (2, 7): + self.deprecated = deprecated + else: + kwargs["deprecated"] = deprecated + if PYDANTIC_V2: + kwargs.update( + { + "annotation": annotation, + "alias_priority": alias_priority, + "validation_alias": validation_alias, + "serialization_alias": serialization_alias, + "strict": strict, + "json_schema_extra": current_json_schema_extra, + } + ) + kwargs["pattern"] = pattern or regex + else: + kwargs["regex"] = pattern or regex + kwargs.update(**current_json_schema_extra) + + use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset} + + super().__init__(**use_kwargs) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.default})" + + +class Form(Body): + def __init__( + self, + default: Any = Undefined, + *, + default_factory: Union[Callable[[], Any], None] = _Unset, + annotation: Optional[Any] = None, + media_type: str = "application/x-www-form-urlencoded", + alias: Optional[str] = None, + alias_priority: Union[int, None] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Union[str, None] = None, + serialization_alias: Union[str, None] = None, + title: Optional[str] = None, + description: Optional[str] = None, + gt: Optional[float] = None, + ge: Optional[float] = None, + lt: Optional[float] = None, + le: Optional[float] = None, + min_length: Optional[int] = None, + max_length: Optional[int] = None, + pattern: Optional[str] = None, + regex: Annotated[ + Optional[str], + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Union[str, None] = None, + strict: Union[bool, None] = _Unset, + multiple_of: Union[float, None] = _Unset, + allow_inf_nan: Union[bool, None] = _Unset, + max_digits: Union[int, None] = _Unset, + decimal_places: Union[int, None] = _Unset, + examples: Optional[List[Any]] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Optional[Dict[str, Example]] = None, + deprecated: Union[deprecated, str, bool, None] = None, + include_in_schema: bool = True, + json_schema_extra: Union[Dict[str, Any], None] = None, + **extra: Any, + ): + super().__init__( + default=default, + default_factory=default_factory, + annotation=annotation, + media_type=media_type, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + deprecated=deprecated, + example=example, + examples=examples, + openapi_examples=openapi_examples, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +class File(Form): + def __init__( + self, + default: Any = Undefined, + *, + default_factory: Union[Callable[[], Any], None] = _Unset, + annotation: Optional[Any] = None, + media_type: str = "multipart/form-data", + alias: Optional[str] = None, + alias_priority: Union[int, None] = _Unset, + # TODO: update when deprecating Pydantic v1, import these types + # validation_alias: str | AliasPath | AliasChoices | None + validation_alias: Union[str, None] = None, + serialization_alias: Union[str, None] = None, + title: Optional[str] = None, + description: Optional[str] = None, + gt: Optional[float] = None, + ge: Optional[float] = None, + lt: Optional[float] = None, + le: Optional[float] = None, + min_length: Optional[int] = None, + max_length: Optional[int] = None, + pattern: Optional[str] = None, + regex: Annotated[ + Optional[str], + deprecated( + "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." + ), + ] = None, + discriminator: Union[str, None] = None, + strict: Union[bool, None] = _Unset, + multiple_of: Union[float, None] = _Unset, + allow_inf_nan: Union[bool, None] = _Unset, + max_digits: Union[int, None] = _Unset, + decimal_places: Union[int, None] = _Unset, + examples: Optional[List[Any]] = None, + example: Annotated[ + Optional[Any], + deprecated( + "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " + "although still supported. Use examples instead." + ), + ] = _Unset, + openapi_examples: Optional[Dict[str, Example]] = None, + deprecated: Union[deprecated, str, bool, None] = None, + include_in_schema: bool = True, + json_schema_extra: Union[Dict[str, Any], None] = None, + **extra: Any, + ): + super().__init__( + default=default, + default_factory=default_factory, + annotation=annotation, + media_type=media_type, + alias=alias, + alias_priority=alias_priority, + validation_alias=validation_alias, + serialization_alias=serialization_alias, + title=title, + description=description, + gt=gt, + ge=ge, + lt=lt, + le=le, + min_length=min_length, + max_length=max_length, + pattern=pattern, + regex=regex, + discriminator=discriminator, + strict=strict, + multiple_of=multiple_of, + allow_inf_nan=allow_inf_nan, + max_digits=max_digits, + decimal_places=decimal_places, + deprecated=deprecated, + example=example, + examples=examples, + openapi_examples=openapi_examples, + include_in_schema=include_in_schema, + json_schema_extra=json_schema_extra, + **extra, + ) + + +class Depends: + def __init__( + self, dependency: Optional[Callable[..., Any]] = None, *, use_cache: bool = True + ): + self.dependency = dependency + self.use_cache = use_cache + + def __repr__(self) -> str: + attr = getattr(self.dependency, "__name__", type(self.dependency).__name__) + cache = "" if self.use_cache else ", use_cache=False" + return f"{self.__class__.__name__}({attr}{cache})" + + +class Security(Depends): + def __init__( + self, + dependency: Optional[Callable[..., Any]] = None, + *, + scopes: Optional[Sequence[str]] = None, + use_cache: bool = True, + ): + super().__init__(dependency=dependency, use_cache=use_cache) + self.scopes = scopes or [] diff --git a/venv/Lib/site-packages/fastapi/py.typed b/venv/Lib/site-packages/fastapi/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/fastapi/requests.py b/venv/Lib/site-packages/fastapi/requests.py new file mode 100644 index 00000000..d16552c0 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/requests.py @@ -0,0 +1,2 @@ +from starlette.requests import HTTPConnection as HTTPConnection # noqa: F401 +from starlette.requests import Request as Request # noqa: F401 diff --git a/venv/Lib/site-packages/fastapi/responses.py b/venv/Lib/site-packages/fastapi/responses.py new file mode 100644 index 00000000..6c8db6f3 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/responses.py @@ -0,0 +1,48 @@ +from typing import Any + +from starlette.responses import FileResponse as FileResponse # noqa +from starlette.responses import HTMLResponse as HTMLResponse # noqa +from starlette.responses import JSONResponse as JSONResponse # noqa +from starlette.responses import PlainTextResponse as PlainTextResponse # noqa +from starlette.responses import RedirectResponse as RedirectResponse # noqa +from starlette.responses import Response as Response # noqa +from starlette.responses import StreamingResponse as StreamingResponse # noqa + +try: + import ujson +except ImportError: # pragma: nocover + ujson = None # type: ignore + + +try: + import orjson +except ImportError: # pragma: nocover + orjson = None # type: ignore + + +class UJSONResponse(JSONResponse): + """ + JSON response using the high-performance ujson library to serialize data to JSON. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/). + """ + + def render(self, content: Any) -> bytes: + assert ujson is not None, "ujson must be installed to use UJSONResponse" + return ujson.dumps(content, ensure_ascii=False).encode("utf-8") + + +class ORJSONResponse(JSONResponse): + """ + JSON response using the high-performance orjson library to serialize data to JSON. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/). + """ + + def render(self, content: Any) -> bytes: + assert orjson is not None, "orjson must be installed to use ORJSONResponse" + return orjson.dumps( + content, option=orjson.OPT_NON_STR_KEYS | orjson.OPT_SERIALIZE_NUMPY + ) diff --git a/venv/Lib/site-packages/fastapi/routing.py b/venv/Lib/site-packages/fastapi/routing.py new file mode 100644 index 00000000..bf61a65c --- /dev/null +++ b/venv/Lib/site-packages/fastapi/routing.py @@ -0,0 +1,4439 @@ +import asyncio +import dataclasses +import email.message +import inspect +import json +from contextlib import AsyncExitStack, asynccontextmanager +from enum import Enum, IntEnum +from typing import ( + Any, + AsyncIterator, + Callable, + Coroutine, + Dict, + List, + Mapping, + Optional, + Sequence, + Set, + Tuple, + Type, + Union, +) + +from fastapi import params +from fastapi._compat import ( + ModelField, + Undefined, + _get_model_config, + _model_dump, + _normalize_errors, + lenient_issubclass, +) +from fastapi.datastructures import Default, DefaultPlaceholder +from fastapi.dependencies.models import Dependant +from fastapi.dependencies.utils import ( + _should_embed_body_fields, + get_body_field, + get_dependant, + get_flat_dependant, + get_parameterless_sub_dependant, + get_typed_return_annotation, + solve_dependencies, +) +from fastapi.encoders import jsonable_encoder +from fastapi.exceptions import ( + FastAPIError, + RequestValidationError, + ResponseValidationError, + WebSocketRequestValidationError, +) +from fastapi.types import DecoratedCallable, IncEx +from fastapi.utils import ( + create_cloned_field, + create_model_field, + generate_unique_id, + get_value_or_default, + is_body_allowed_for_status_code, +) +from pydantic import BaseModel +from starlette import routing +from starlette.concurrency import run_in_threadpool +from starlette.exceptions import HTTPException +from starlette.requests import Request +from starlette.responses import JSONResponse, Response +from starlette.routing import ( + BaseRoute, + Match, + compile_path, + get_name, + request_response, + websocket_session, +) +from starlette.routing import Mount as Mount # noqa +from starlette.types import AppType, ASGIApp, Lifespan, Scope +from starlette.websockets import WebSocket +from typing_extensions import Annotated, Doc, deprecated + + +def _prepare_response_content( + res: Any, + *, + exclude_unset: bool, + exclude_defaults: bool = False, + exclude_none: bool = False, +) -> Any: + if isinstance(res, BaseModel): + read_with_orm_mode = getattr(_get_model_config(res), "read_with_orm_mode", None) + if read_with_orm_mode: + # Let from_orm extract the data from this model instead of converting + # it now to a dict. + # Otherwise, there's no way to extract lazy data that requires attribute + # access instead of dict iteration, e.g. lazy relationships. + return res + return _model_dump( + res, + by_alias=True, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + ) + elif isinstance(res, list): + return [ + _prepare_response_content( + item, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + ) + for item in res + ] + elif isinstance(res, dict): + return { + k: _prepare_response_content( + v, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + ) + for k, v in res.items() + } + elif dataclasses.is_dataclass(res): + return dataclasses.asdict(res) + return res + + +def _merge_lifespan_context( + original_context: Lifespan[Any], nested_context: Lifespan[Any] +) -> Lifespan[Any]: + @asynccontextmanager + async def merged_lifespan( + app: AppType, + ) -> AsyncIterator[Optional[Mapping[str, Any]]]: + async with original_context(app) as maybe_original_state: + async with nested_context(app) as maybe_nested_state: + if maybe_nested_state is None and maybe_original_state is None: + yield None # old ASGI compatibility + else: + yield {**(maybe_nested_state or {}), **(maybe_original_state or {})} + + return merged_lifespan # type: ignore[return-value] + + +async def serialize_response( + *, + field: Optional[ModelField] = None, + response_content: Any, + include: Optional[IncEx] = None, + exclude: Optional[IncEx] = None, + by_alias: bool = True, + exclude_unset: bool = False, + exclude_defaults: bool = False, + exclude_none: bool = False, + is_coroutine: bool = True, +) -> Any: + if field: + errors = [] + if not hasattr(field, "serialize"): + # pydantic v1 + response_content = _prepare_response_content( + response_content, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + ) + if is_coroutine: + value, errors_ = field.validate(response_content, {}, loc=("response",)) + else: + value, errors_ = await run_in_threadpool( + field.validate, response_content, {}, loc=("response",) + ) + if isinstance(errors_, list): + errors.extend(errors_) + elif errors_: + errors.append(errors_) + if errors: + raise ResponseValidationError( + errors=_normalize_errors(errors), body=response_content + ) + + if hasattr(field, "serialize"): + return field.serialize( + value, + include=include, + exclude=exclude, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + ) + + return jsonable_encoder( + value, + include=include, + exclude=exclude, + by_alias=by_alias, + exclude_unset=exclude_unset, + exclude_defaults=exclude_defaults, + exclude_none=exclude_none, + ) + else: + return jsonable_encoder(response_content) + + +async def run_endpoint_function( + *, dependant: Dependant, values: Dict[str, Any], is_coroutine: bool +) -> Any: + # Only called by get_request_handler. Has been split into its own function to + # facilitate profiling endpoints, since inner functions are harder to profile. + assert dependant.call is not None, "dependant.call must be a function" + + if is_coroutine: + return await dependant.call(**values) + else: + return await run_in_threadpool(dependant.call, **values) + + +def get_request_handler( + dependant: Dependant, + body_field: Optional[ModelField] = None, + status_code: Optional[int] = None, + response_class: Union[Type[Response], DefaultPlaceholder] = Default(JSONResponse), + response_field: Optional[ModelField] = None, + response_model_include: Optional[IncEx] = None, + response_model_exclude: Optional[IncEx] = None, + response_model_by_alias: bool = True, + response_model_exclude_unset: bool = False, + response_model_exclude_defaults: bool = False, + response_model_exclude_none: bool = False, + dependency_overrides_provider: Optional[Any] = None, + embed_body_fields: bool = False, +) -> Callable[[Request], Coroutine[Any, Any, Response]]: + assert dependant.call is not None, "dependant.call must be a function" + is_coroutine = asyncio.iscoroutinefunction(dependant.call) + is_body_form = body_field and isinstance(body_field.field_info, params.Form) + if isinstance(response_class, DefaultPlaceholder): + actual_response_class: Type[Response] = response_class.value + else: + actual_response_class = response_class + + async def app(request: Request) -> Response: + response: Union[Response, None] = None + async with AsyncExitStack() as file_stack: + try: + body: Any = None + if body_field: + if is_body_form: + body = await request.form() + file_stack.push_async_callback(body.close) + else: + body_bytes = await request.body() + if body_bytes: + json_body: Any = Undefined + content_type_value = request.headers.get("content-type") + if not content_type_value: + json_body = await request.json() + else: + message = email.message.Message() + message["content-type"] = content_type_value + if message.get_content_maintype() == "application": + subtype = message.get_content_subtype() + if subtype == "json" or subtype.endswith("+json"): + json_body = await request.json() + if json_body != Undefined: + body = json_body + else: + body = body_bytes + except json.JSONDecodeError as e: + validation_error = RequestValidationError( + [ + { + "type": "json_invalid", + "loc": ("body", e.pos), + "msg": "JSON decode error", + "input": {}, + "ctx": {"error": e.msg}, + } + ], + body=e.doc, + ) + raise validation_error from e + except HTTPException: + # If a middleware raises an HTTPException, it should be raised again + raise + except Exception as e: + http_error = HTTPException( + status_code=400, detail="There was an error parsing the body" + ) + raise http_error from e + errors: List[Any] = [] + async with AsyncExitStack() as async_exit_stack: + solved_result = await solve_dependencies( + request=request, + dependant=dependant, + body=body, + dependency_overrides_provider=dependency_overrides_provider, + async_exit_stack=async_exit_stack, + embed_body_fields=embed_body_fields, + ) + errors = solved_result.errors + if not errors: + raw_response = await run_endpoint_function( + dependant=dependant, + values=solved_result.values, + is_coroutine=is_coroutine, + ) + if isinstance(raw_response, Response): + if raw_response.background is None: + raw_response.background = solved_result.background_tasks + response = raw_response + else: + response_args: Dict[str, Any] = { + "background": solved_result.background_tasks + } + # If status_code was set, use it, otherwise use the default from the + # response class, in the case of redirect it's 307 + current_status_code = ( + status_code + if status_code + else solved_result.response.status_code + ) + if current_status_code is not None: + response_args["status_code"] = current_status_code + if solved_result.response.status_code: + response_args["status_code"] = ( + solved_result.response.status_code + ) + content = await serialize_response( + field=response_field, + response_content=raw_response, + include=response_model_include, + exclude=response_model_exclude, + by_alias=response_model_by_alias, + exclude_unset=response_model_exclude_unset, + exclude_defaults=response_model_exclude_defaults, + exclude_none=response_model_exclude_none, + is_coroutine=is_coroutine, + ) + response = actual_response_class(content, **response_args) + if not is_body_allowed_for_status_code(response.status_code): + response.body = b"" + response.headers.raw.extend(solved_result.response.headers.raw) + if errors: + validation_error = RequestValidationError( + _normalize_errors(errors), body=body + ) + raise validation_error + if response is None: + raise FastAPIError( + "No response object was returned. There's a high chance that the " + "application code is raising an exception and a dependency with yield " + "has a block with a bare except, or a block with except Exception, " + "and is not raising the exception again. Read more about it in the " + "docs: https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/#dependencies-with-yield-and-except" + ) + return response + + return app + + +def get_websocket_app( + dependant: Dependant, + dependency_overrides_provider: Optional[Any] = None, + embed_body_fields: bool = False, +) -> Callable[[WebSocket], Coroutine[Any, Any, Any]]: + async def app(websocket: WebSocket) -> None: + async with AsyncExitStack() as async_exit_stack: + # TODO: remove this scope later, after a few releases + # This scope fastapi_astack is no longer used by FastAPI, kept for + # compatibility, just in case + websocket.scope["fastapi_astack"] = async_exit_stack + solved_result = await solve_dependencies( + request=websocket, + dependant=dependant, + dependency_overrides_provider=dependency_overrides_provider, + async_exit_stack=async_exit_stack, + embed_body_fields=embed_body_fields, + ) + if solved_result.errors: + raise WebSocketRequestValidationError( + _normalize_errors(solved_result.errors) + ) + assert dependant.call is not None, "dependant.call must be a function" + await dependant.call(**solved_result.values) + + return app + + +class APIWebSocketRoute(routing.WebSocketRoute): + def __init__( + self, + path: str, + endpoint: Callable[..., Any], + *, + name: Optional[str] = None, + dependencies: Optional[Sequence[params.Depends]] = None, + dependency_overrides_provider: Optional[Any] = None, + ) -> None: + self.path = path + self.endpoint = endpoint + self.name = get_name(endpoint) if name is None else name + self.dependencies = list(dependencies or []) + self.path_regex, self.path_format, self.param_convertors = compile_path(path) + self.dependant = get_dependant(path=self.path_format, call=self.endpoint) + for depends in self.dependencies[::-1]: + self.dependant.dependencies.insert( + 0, + get_parameterless_sub_dependant(depends=depends, path=self.path_format), + ) + self._flat_dependant = get_flat_dependant(self.dependant) + self._embed_body_fields = _should_embed_body_fields( + self._flat_dependant.body_params + ) + self.app = websocket_session( + get_websocket_app( + dependant=self.dependant, + dependency_overrides_provider=dependency_overrides_provider, + embed_body_fields=self._embed_body_fields, + ) + ) + + def matches(self, scope: Scope) -> Tuple[Match, Scope]: + match, child_scope = super().matches(scope) + if match != Match.NONE: + child_scope["route"] = self + return match, child_scope + + +class APIRoute(routing.Route): + def __init__( + self, + path: str, + endpoint: Callable[..., Any], + *, + response_model: Any = Default(None), + status_code: Optional[int] = None, + tags: Optional[List[Union[str, Enum]]] = None, + dependencies: Optional[Sequence[params.Depends]] = None, + summary: Optional[str] = None, + description: Optional[str] = None, + response_description: str = "Successful Response", + responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, + deprecated: Optional[bool] = None, + name: Optional[str] = None, + methods: Optional[Union[Set[str], List[str]]] = None, + operation_id: Optional[str] = None, + response_model_include: Optional[IncEx] = None, + response_model_exclude: Optional[IncEx] = None, + response_model_by_alias: bool = True, + response_model_exclude_unset: bool = False, + response_model_exclude_defaults: bool = False, + response_model_exclude_none: bool = False, + include_in_schema: bool = True, + response_class: Union[Type[Response], DefaultPlaceholder] = Default( + JSONResponse + ), + dependency_overrides_provider: Optional[Any] = None, + callbacks: Optional[List[BaseRoute]] = None, + openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Union[ + Callable[["APIRoute"], str], DefaultPlaceholder + ] = Default(generate_unique_id), + ) -> None: + self.path = path + self.endpoint = endpoint + if isinstance(response_model, DefaultPlaceholder): + return_annotation = get_typed_return_annotation(endpoint) + if lenient_issubclass(return_annotation, Response): + response_model = None + else: + response_model = return_annotation + self.response_model = response_model + self.summary = summary + self.response_description = response_description + self.deprecated = deprecated + self.operation_id = operation_id + self.response_model_include = response_model_include + self.response_model_exclude = response_model_exclude + self.response_model_by_alias = response_model_by_alias + self.response_model_exclude_unset = response_model_exclude_unset + self.response_model_exclude_defaults = response_model_exclude_defaults + self.response_model_exclude_none = response_model_exclude_none + self.include_in_schema = include_in_schema + self.response_class = response_class + self.dependency_overrides_provider = dependency_overrides_provider + self.callbacks = callbacks + self.openapi_extra = openapi_extra + self.generate_unique_id_function = generate_unique_id_function + self.tags = tags or [] + self.responses = responses or {} + self.name = get_name(endpoint) if name is None else name + self.path_regex, self.path_format, self.param_convertors = compile_path(path) + if methods is None: + methods = ["GET"] + self.methods: Set[str] = {method.upper() for method in methods} + if isinstance(generate_unique_id_function, DefaultPlaceholder): + current_generate_unique_id: Callable[[APIRoute], str] = ( + generate_unique_id_function.value + ) + else: + current_generate_unique_id = generate_unique_id_function + self.unique_id = self.operation_id or current_generate_unique_id(self) + # normalize enums e.g. http.HTTPStatus + if isinstance(status_code, IntEnum): + status_code = int(status_code) + self.status_code = status_code + if self.response_model: + assert is_body_allowed_for_status_code(status_code), ( + f"Status code {status_code} must not have a response body" + ) + response_name = "Response_" + self.unique_id + self.response_field = create_model_field( + name=response_name, + type_=self.response_model, + mode="serialization", + ) + # Create a clone of the field, so that a Pydantic submodel is not returned + # as is just because it's an instance of a subclass of a more limited class + # e.g. UserInDB (containing hashed_password) could be a subclass of User + # that doesn't have the hashed_password. But because it's a subclass, it + # would pass the validation and be returned as is. + # By being a new field, no inheritance will be passed as is. A new model + # will always be created. + # TODO: remove when deprecating Pydantic v1 + self.secure_cloned_response_field: Optional[ModelField] = ( + create_cloned_field(self.response_field) + ) + else: + self.response_field = None # type: ignore + self.secure_cloned_response_field = None + self.dependencies = list(dependencies or []) + self.description = description or inspect.cleandoc(self.endpoint.__doc__ or "") + # if a "form feed" character (page break) is found in the description text, + # truncate description text to the content preceding the first "form feed" + self.description = self.description.split("\f")[0].strip() + response_fields = {} + for additional_status_code, response in self.responses.items(): + assert isinstance(response, dict), "An additional response must be a dict" + model = response.get("model") + if model: + assert is_body_allowed_for_status_code(additional_status_code), ( + f"Status code {additional_status_code} must not have a response body" + ) + response_name = f"Response_{additional_status_code}_{self.unique_id}" + response_field = create_model_field( + name=response_name, type_=model, mode="serialization" + ) + response_fields[additional_status_code] = response_field + if response_fields: + self.response_fields: Dict[Union[int, str], ModelField] = response_fields + else: + self.response_fields = {} + + assert callable(endpoint), "An endpoint must be a callable" + self.dependant = get_dependant(path=self.path_format, call=self.endpoint) + for depends in self.dependencies[::-1]: + self.dependant.dependencies.insert( + 0, + get_parameterless_sub_dependant(depends=depends, path=self.path_format), + ) + self._flat_dependant = get_flat_dependant(self.dependant) + self._embed_body_fields = _should_embed_body_fields( + self._flat_dependant.body_params + ) + self.body_field = get_body_field( + flat_dependant=self._flat_dependant, + name=self.unique_id, + embed_body_fields=self._embed_body_fields, + ) + self.app = request_response(self.get_route_handler()) + + def get_route_handler(self) -> Callable[[Request], Coroutine[Any, Any, Response]]: + return get_request_handler( + dependant=self.dependant, + body_field=self.body_field, + status_code=self.status_code, + response_class=self.response_class, + response_field=self.secure_cloned_response_field, + response_model_include=self.response_model_include, + response_model_exclude=self.response_model_exclude, + response_model_by_alias=self.response_model_by_alias, + response_model_exclude_unset=self.response_model_exclude_unset, + response_model_exclude_defaults=self.response_model_exclude_defaults, + response_model_exclude_none=self.response_model_exclude_none, + dependency_overrides_provider=self.dependency_overrides_provider, + embed_body_fields=self._embed_body_fields, + ) + + def matches(self, scope: Scope) -> Tuple[Match, Scope]: + match, child_scope = super().matches(scope) + if match != Match.NONE: + child_scope["route"] = self + return match, child_scope + + +class APIRouter(routing.Router): + """ + `APIRouter` class, used to group *path operations*, for example to structure + an app in multiple files. It would then be included in the `FastAPI` app, or + in another `APIRouter` (ultimately included in the app). + + Read more about it in the + [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/). + + ## Example + + ```python + from fastapi import APIRouter, FastAPI + + app = FastAPI() + router = APIRouter() + + + @router.get("/users/", tags=["users"]) + async def read_users(): + return [{"username": "Rick"}, {"username": "Morty"}] + + + app.include_router(router) + ``` + """ + + def __init__( + self, + *, + prefix: Annotated[str, Doc("An optional path prefix for the router.")] = "", + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to all the *path operations* in this + router. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to all the + *path operations* in this router. + + Read more about it in the + [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). + """ + ), + ] = None, + default_response_class: Annotated[ + Type[Response], + Doc( + """ + The default response class to be used. + + Read more in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class). + """ + ), + ] = Default(JSONResponse), + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses to be shown in OpenAPI. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/). + + And in the + [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + OpenAPI callbacks that should apply to all *path operations* in this + router. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + routes: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + **Note**: you probably shouldn't use this parameter, it is inherited + from Starlette and supported for compatibility. + + --- + + A list of routes to serve incoming HTTP and WebSocket requests. + """ + ), + deprecated( + """ + You normally wouldn't use this parameter with FastAPI, it is inherited + from Starlette and supported for compatibility. + + In FastAPI, you normally would use the *path operation methods*, + like `router.get()`, `router.post()`, etc. + """ + ), + ] = None, + redirect_slashes: Annotated[ + bool, + Doc( + """ + Whether to detect and redirect slashes in URLs when the client doesn't + use the same format. + """ + ), + ] = True, + default: Annotated[ + Optional[ASGIApp], + Doc( + """ + Default function handler for this router. Used to handle + 404 Not Found errors. + """ + ), + ] = None, + dependency_overrides_provider: Annotated[ + Optional[Any], + Doc( + """ + Only used internally by FastAPI to handle dependency overrides. + + You shouldn't need to use it. It normally points to the `FastAPI` app + object. + """ + ), + ] = None, + route_class: Annotated[ + Type[APIRoute], + Doc( + """ + Custom route (*path operation*) class to be used by this router. + + Read more about it in the + [FastAPI docs for Custom Request and APIRoute class](https://fastapi.tiangolo.com/how-to/custom-request-and-route/#custom-apiroute-class-in-a-router). + """ + ), + ] = APIRoute, + on_startup: Annotated[ + Optional[Sequence[Callable[[], Any]]], + Doc( + """ + A list of startup event handler functions. + + You should instead use the `lifespan` handlers. + + Read more in the [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). + """ + ), + ] = None, + on_shutdown: Annotated[ + Optional[Sequence[Callable[[], Any]]], + Doc( + """ + A list of shutdown event handler functions. + + You should instead use the `lifespan` handlers. + + Read more in the + [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). + """ + ), + ] = None, + # the generic to Lifespan[AppType] is the type of the top level application + # which the router cannot know statically, so we use typing.Any + lifespan: Annotated[ + Optional[Lifespan[Any]], + Doc( + """ + A `Lifespan` context manager handler. This replaces `startup` and + `shutdown` functions with a single context manager. + + Read more in the + [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark all *path operations* in this router as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + To include (or not) all the *path operations* in this router in the + generated OpenAPI. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + generate_unique_id_function: Annotated[ + Callable[[APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> None: + super().__init__( + routes=routes, + redirect_slashes=redirect_slashes, + default=default, + on_startup=on_startup, + on_shutdown=on_shutdown, + lifespan=lifespan, + ) + if prefix: + assert prefix.startswith("/"), "A path prefix must start with '/'" + assert not prefix.endswith("/"), ( + "A path prefix must not end with '/', as the routes will start with '/'" + ) + self.prefix = prefix + self.tags: List[Union[str, Enum]] = tags or [] + self.dependencies = list(dependencies or []) + self.deprecated = deprecated + self.include_in_schema = include_in_schema + self.responses = responses or {} + self.callbacks = callbacks or [] + self.dependency_overrides_provider = dependency_overrides_provider + self.route_class = route_class + self.default_response_class = default_response_class + self.generate_unique_id_function = generate_unique_id_function + + def route( + self, + path: str, + methods: Optional[List[str]] = None, + name: Optional[str] = None, + include_in_schema: bool = True, + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + def decorator(func: DecoratedCallable) -> DecoratedCallable: + self.add_route( + path, + func, + methods=methods, + name=name, + include_in_schema=include_in_schema, + ) + return func + + return decorator + + def add_api_route( + self, + path: str, + endpoint: Callable[..., Any], + *, + response_model: Any = Default(None), + status_code: Optional[int] = None, + tags: Optional[List[Union[str, Enum]]] = None, + dependencies: Optional[Sequence[params.Depends]] = None, + summary: Optional[str] = None, + description: Optional[str] = None, + response_description: str = "Successful Response", + responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, + deprecated: Optional[bool] = None, + methods: Optional[Union[Set[str], List[str]]] = None, + operation_id: Optional[str] = None, + response_model_include: Optional[IncEx] = None, + response_model_exclude: Optional[IncEx] = None, + response_model_by_alias: bool = True, + response_model_exclude_unset: bool = False, + response_model_exclude_defaults: bool = False, + response_model_exclude_none: bool = False, + include_in_schema: bool = True, + response_class: Union[Type[Response], DefaultPlaceholder] = Default( + JSONResponse + ), + name: Optional[str] = None, + route_class_override: Optional[Type[APIRoute]] = None, + callbacks: Optional[List[BaseRoute]] = None, + openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Union[ + Callable[[APIRoute], str], DefaultPlaceholder + ] = Default(generate_unique_id), + ) -> None: + route_class = route_class_override or self.route_class + responses = responses or {} + combined_responses = {**self.responses, **responses} + current_response_class = get_value_or_default( + response_class, self.default_response_class + ) + current_tags = self.tags.copy() + if tags: + current_tags.extend(tags) + current_dependencies = self.dependencies.copy() + if dependencies: + current_dependencies.extend(dependencies) + current_callbacks = self.callbacks.copy() + if callbacks: + current_callbacks.extend(callbacks) + current_generate_unique_id = get_value_or_default( + generate_unique_id_function, self.generate_unique_id_function + ) + route = route_class( + self.prefix + path, + endpoint=endpoint, + response_model=response_model, + status_code=status_code, + tags=current_tags, + dependencies=current_dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=combined_responses, + deprecated=deprecated or self.deprecated, + methods=methods, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema and self.include_in_schema, + response_class=current_response_class, + name=name, + dependency_overrides_provider=self.dependency_overrides_provider, + callbacks=current_callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=current_generate_unique_id, + ) + self.routes.append(route) + + def api_route( + self, + path: str, + *, + response_model: Any = Default(None), + status_code: Optional[int] = None, + tags: Optional[List[Union[str, Enum]]] = None, + dependencies: Optional[Sequence[params.Depends]] = None, + summary: Optional[str] = None, + description: Optional[str] = None, + response_description: str = "Successful Response", + responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None, + deprecated: Optional[bool] = None, + methods: Optional[List[str]] = None, + operation_id: Optional[str] = None, + response_model_include: Optional[IncEx] = None, + response_model_exclude: Optional[IncEx] = None, + response_model_by_alias: bool = True, + response_model_exclude_unset: bool = False, + response_model_exclude_defaults: bool = False, + response_model_exclude_none: bool = False, + include_in_schema: bool = True, + response_class: Type[Response] = Default(JSONResponse), + name: Optional[str] = None, + callbacks: Optional[List[BaseRoute]] = None, + openapi_extra: Optional[Dict[str, Any]] = None, + generate_unique_id_function: Callable[[APIRoute], str] = Default( + generate_unique_id + ), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + def decorator(func: DecoratedCallable) -> DecoratedCallable: + self.add_api_route( + path, + func, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=methods, + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + return func + + return decorator + + def add_api_websocket_route( + self, + path: str, + endpoint: Callable[..., Any], + name: Optional[str] = None, + *, + dependencies: Optional[Sequence[params.Depends]] = None, + ) -> None: + current_dependencies = self.dependencies.copy() + if dependencies: + current_dependencies.extend(dependencies) + + route = APIWebSocketRoute( + self.prefix + path, + endpoint=endpoint, + name=name, + dependencies=current_dependencies, + dependency_overrides_provider=self.dependency_overrides_provider, + ) + self.routes.append(route) + + def websocket( + self, + path: Annotated[ + str, + Doc( + """ + WebSocket path. + """ + ), + ], + name: Annotated[ + Optional[str], + Doc( + """ + A name for the WebSocket. Only used internally. + """ + ), + ] = None, + *, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be used for this + WebSocket. + + Read more about it in the + [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). + """ + ), + ] = None, + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Decorate a WebSocket function. + + Read more about it in the + [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). + + **Example** + + ## Example + + ```python + from fastapi import APIRouter, FastAPI, WebSocket + + app = FastAPI() + router = APIRouter() + + @router.websocket("/ws") + async def websocket_endpoint(websocket: WebSocket): + await websocket.accept() + while True: + data = await websocket.receive_text() + await websocket.send_text(f"Message text was: {data}") + + app.include_router(router) + ``` + """ + + def decorator(func: DecoratedCallable) -> DecoratedCallable: + self.add_api_websocket_route( + path, func, name=name, dependencies=dependencies + ) + return func + + return decorator + + def websocket_route( + self, path: str, name: Union[str, None] = None + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + def decorator(func: DecoratedCallable) -> DecoratedCallable: + self.add_websocket_route(path, func, name=name) + return func + + return decorator + + def include_router( + self, + router: Annotated["APIRouter", Doc("The `APIRouter` to include.")], + *, + prefix: Annotated[str, Doc("An optional path prefix for the router.")] = "", + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to all the *path operations* in this + router. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to all the + *path operations* in this router. + + Read more about it in the + [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). + """ + ), + ] = None, + default_response_class: Annotated[ + Type[Response], + Doc( + """ + The default response class to be used. + + Read more in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class). + """ + ), + ] = Default(JSONResponse), + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses to be shown in OpenAPI. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/). + + And in the + [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies). + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + OpenAPI callbacks that should apply to all *path operations* in this + router. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark all *path operations* in this router as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include (or not) all the *path operations* in this router in the + generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = True, + generate_unique_id_function: Annotated[ + Callable[[APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> None: + """ + Include another `APIRouter` in the same current `APIRouter`. + + Read more about it in the + [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/). + + ## Example + + ```python + from fastapi import APIRouter, FastAPI + + app = FastAPI() + internal_router = APIRouter() + users_router = APIRouter() + + @users_router.get("/users/") + def read_users(): + return [{"name": "Rick"}, {"name": "Morty"}] + + internal_router.include_router(users_router) + app.include_router(internal_router) + ``` + """ + if prefix: + assert prefix.startswith("/"), "A path prefix must start with '/'" + assert not prefix.endswith("/"), ( + "A path prefix must not end with '/', as the routes will start with '/'" + ) + else: + for r in router.routes: + path = getattr(r, "path") # noqa: B009 + name = getattr(r, "name", "unknown") + if path is not None and not path: + raise FastAPIError( + f"Prefix and path cannot be both empty (path operation: {name})" + ) + if responses is None: + responses = {} + for route in router.routes: + if isinstance(route, APIRoute): + combined_responses = {**responses, **route.responses} + use_response_class = get_value_or_default( + route.response_class, + router.default_response_class, + default_response_class, + self.default_response_class, + ) + current_tags = [] + if tags: + current_tags.extend(tags) + if route.tags: + current_tags.extend(route.tags) + current_dependencies: List[params.Depends] = [] + if dependencies: + current_dependencies.extend(dependencies) + if route.dependencies: + current_dependencies.extend(route.dependencies) + current_callbacks = [] + if callbacks: + current_callbacks.extend(callbacks) + if route.callbacks: + current_callbacks.extend(route.callbacks) + current_generate_unique_id = get_value_or_default( + route.generate_unique_id_function, + router.generate_unique_id_function, + generate_unique_id_function, + self.generate_unique_id_function, + ) + self.add_api_route( + prefix + route.path, + route.endpoint, + response_model=route.response_model, + status_code=route.status_code, + tags=current_tags, + dependencies=current_dependencies, + summary=route.summary, + description=route.description, + response_description=route.response_description, + responses=combined_responses, + deprecated=route.deprecated or deprecated or self.deprecated, + methods=route.methods, + operation_id=route.operation_id, + response_model_include=route.response_model_include, + response_model_exclude=route.response_model_exclude, + response_model_by_alias=route.response_model_by_alias, + response_model_exclude_unset=route.response_model_exclude_unset, + response_model_exclude_defaults=route.response_model_exclude_defaults, + response_model_exclude_none=route.response_model_exclude_none, + include_in_schema=route.include_in_schema + and self.include_in_schema + and include_in_schema, + response_class=use_response_class, + name=route.name, + route_class_override=type(route), + callbacks=current_callbacks, + openapi_extra=route.openapi_extra, + generate_unique_id_function=current_generate_unique_id, + ) + elif isinstance(route, routing.Route): + methods = list(route.methods or []) + self.add_route( + prefix + route.path, + route.endpoint, + methods=methods, + include_in_schema=route.include_in_schema, + name=route.name, + ) + elif isinstance(route, APIWebSocketRoute): + current_dependencies = [] + if dependencies: + current_dependencies.extend(dependencies) + if route.dependencies: + current_dependencies.extend(route.dependencies) + self.add_api_websocket_route( + prefix + route.path, + route.endpoint, + dependencies=current_dependencies, + name=route.name, + ) + elif isinstance(route, routing.WebSocketRoute): + self.add_websocket_route( + prefix + route.path, route.endpoint, name=route.name + ) + for handler in router.on_startup: + self.add_event_handler("startup", handler) + for handler in router.on_shutdown: + self.add_event_handler("shutdown", handler) + self.lifespan_context = _merge_lifespan_context( + self.lifespan_context, + router.lifespan_context, + ) + + def get( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP GET operation. + + ## Example + + ```python + from fastapi import APIRouter, FastAPI + + app = FastAPI() + router = APIRouter() + + @router.get("/items/") + def read_items(): + return [{"name": "Empanada"}, {"name": "Arepa"}] + + app.include_router(router) + ``` + """ + return self.api_route( + path=path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=["GET"], + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def put( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP PUT operation. + + ## Example + + ```python + from fastapi import APIRouter, FastAPI + from pydantic import BaseModel + + class Item(BaseModel): + name: str + description: str | None = None + + app = FastAPI() + router = APIRouter() + + @router.put("/items/{item_id}") + def replace_item(item_id: str, item: Item): + return {"message": "Item replaced", "id": item_id} + + app.include_router(router) + ``` + """ + return self.api_route( + path=path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=["PUT"], + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def post( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP POST operation. + + ## Example + + ```python + from fastapi import APIRouter, FastAPI + from pydantic import BaseModel + + class Item(BaseModel): + name: str + description: str | None = None + + app = FastAPI() + router = APIRouter() + + @router.post("/items/") + def create_item(item: Item): + return {"message": "Item created"} + + app.include_router(router) + ``` + """ + return self.api_route( + path=path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=["POST"], + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def delete( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP DELETE operation. + + ## Example + + ```python + from fastapi import APIRouter, FastAPI + + app = FastAPI() + router = APIRouter() + + @router.delete("/items/{item_id}") + def delete_item(item_id: str): + return {"message": "Item deleted"} + + app.include_router(router) + ``` + """ + return self.api_route( + path=path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=["DELETE"], + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def options( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP OPTIONS operation. + + ## Example + + ```python + from fastapi import APIRouter, FastAPI + + app = FastAPI() + router = APIRouter() + + @router.options("/items/") + def get_item_options(): + return {"additions": ["Aji", "Guacamole"]} + + app.include_router(router) + ``` + """ + return self.api_route( + path=path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=["OPTIONS"], + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def head( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP HEAD operation. + + ## Example + + ```python + from fastapi import APIRouter, FastAPI + from pydantic import BaseModel + + class Item(BaseModel): + name: str + description: str | None = None + + app = FastAPI() + router = APIRouter() + + @router.head("/items/", status_code=204) + def get_items_headers(response: Response): + response.headers["X-Cat-Dog"] = "Alone in the world" + + app.include_router(router) + ``` + """ + return self.api_route( + path=path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=["HEAD"], + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def patch( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP PATCH operation. + + ## Example + + ```python + from fastapi import APIRouter, FastAPI + from pydantic import BaseModel + + class Item(BaseModel): + name: str + description: str | None = None + + app = FastAPI() + router = APIRouter() + + @router.patch("/items/") + def update_item(item: Item): + return {"message": "Item updated in place"} + + app.include_router(router) + ``` + """ + return self.api_route( + path=path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=["PATCH"], + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + def trace( + self, + path: Annotated[ + str, + Doc( + """ + The URL path to be used for this *path operation*. + + For example, in `http://example.com/items`, the path is `/items`. + """ + ), + ], + *, + response_model: Annotated[ + Any, + Doc( + """ + The type to use for the response. + + It could be any valid Pydantic *field* type. So, it doesn't have to + be a Pydantic model, it could be other things, like a `list`, `dict`, + etc. + + It will be used for: + + * Documentation: the generated OpenAPI (and the UI at `/docs`) will + show it as the response (JSON Schema). + * Serialization: you could return an arbitrary object and the + `response_model` would be used to serialize that object into the + corresponding JSON. + * Filtering: the JSON sent to the client will only contain the data + (fields) defined in the `response_model`. If you returned an object + that contains an attribute `password` but the `response_model` does + not include that field, the JSON sent to the client would not have + that `password`. + * Validation: whatever you return will be serialized with the + `response_model`, converting any data as necessary to generate the + corresponding JSON. But if the data in the object returned is not + valid, that would mean a violation of the contract with the client, + so it's an error from the API developer. So, FastAPI will raise an + error and return a 500 error code (Internal Server Error). + + Read more about it in the + [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/). + """ + ), + ] = Default(None), + status_code: Annotated[ + Optional[int], + Doc( + """ + The default status code to be used for the response. + + You could override the status code by returning a response directly. + + Read more about it in the + [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). + """ + ), + ] = None, + tags: Annotated[ + Optional[List[Union[str, Enum]]], + Doc( + """ + A list of tags to be applied to the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags). + """ + ), + ] = None, + dependencies: Annotated[ + Optional[Sequence[params.Depends]], + Doc( + """ + A list of dependencies (using `Depends()`) to be applied to the + *path operation*. + + Read more about it in the + [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/). + """ + ), + ] = None, + summary: Annotated[ + Optional[str], + Doc( + """ + A summary for the *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + A description for the *path operation*. + + If not provided, it will be extracted automatically from the docstring + of the *path operation function*. + + It can contain Markdown. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/). + """ + ), + ] = None, + response_description: Annotated[ + str, + Doc( + """ + The description for the default response. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = "Successful Response", + responses: Annotated[ + Optional[Dict[Union[int, str], Dict[str, Any]]], + Doc( + """ + Additional responses that could be returned by this *path operation*. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + deprecated: Annotated[ + Optional[bool], + Doc( + """ + Mark this *path operation* as deprecated. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + operation_id: Annotated[ + Optional[str], + Doc( + """ + Custom operation ID to be used by this *path operation*. + + By default, it is generated automatically. + + If you provide a custom operation ID, you need to make sure it is + unique for the whole API. + + You can customize the + operation ID generation with the parameter + `generate_unique_id_function` in the `FastAPI` class. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = None, + response_model_include: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to include only certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_exclude: Annotated[ + Optional[IncEx], + Doc( + """ + Configuration passed to Pydantic to exclude certain fields in the + response data. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = None, + response_model_by_alias: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response model + should be serialized by alias when an alias is used. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude). + """ + ), + ] = True, + response_model_exclude_unset: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that were not set and + have their default values. This is different from + `response_model_exclude_defaults` in that if the fields are set, + they will be included in the response, even if the value is the same + as the default. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_defaults: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data + should have all the fields, including the ones that have the same value + as the default. This is different from `response_model_exclude_unset` + in that if the fields are set but contain the same default values, + they will be excluded from the response. + + When `True`, default values are omitted from the response. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter). + """ + ), + ] = False, + response_model_exclude_none: Annotated[ + bool, + Doc( + """ + Configuration passed to Pydantic to define if the response data should + exclude fields set to `None`. + + This is much simpler (less smart) than `response_model_exclude_unset` + and `response_model_exclude_defaults`. You probably want to use one of + those two instead of this one, as those allow returning `None` values + when it makes sense. + + Read more about it in the + [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none). + """ + ), + ] = False, + include_in_schema: Annotated[ + bool, + Doc( + """ + Include this *path operation* in the generated OpenAPI schema. + + This affects the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi). + """ + ), + ] = True, + response_class: Annotated[ + Type[Response], + Doc( + """ + Response class to be used for this *path operation*. + + This will not be used if you return a response directly. + + Read more about it in the + [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse). + """ + ), + ] = Default(JSONResponse), + name: Annotated[ + Optional[str], + Doc( + """ + Name for this *path operation*. Only used internally. + """ + ), + ] = None, + callbacks: Annotated[ + Optional[List[BaseRoute]], + Doc( + """ + List of *path operations* that will be used as OpenAPI callbacks. + + This is only for OpenAPI documentation, the callbacks won't be used + directly. + + It will be added to the generated OpenAPI (e.g. visible at `/docs`). + + Read more about it in the + [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/). + """ + ), + ] = None, + openapi_extra: Annotated[ + Optional[Dict[str, Any]], + Doc( + """ + Extra metadata to be included in the OpenAPI schema for this *path + operation*. + + Read more about it in the + [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema). + """ + ), + ] = None, + generate_unique_id_function: Annotated[ + Callable[[APIRoute], str], + Doc( + """ + Customize the function used to generate unique IDs for the *path + operations* shown in the generated OpenAPI. + + This is particularly useful when automatically generating clients or + SDKs for your API. + + Read more about it in the + [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function). + """ + ), + ] = Default(generate_unique_id), + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add a *path operation* using an HTTP TRACE operation. + + ## Example + + ```python + from fastapi import APIRouter, FastAPI + from pydantic import BaseModel + + class Item(BaseModel): + name: str + description: str | None = None + + app = FastAPI() + router = APIRouter() + + @router.trace("/items/{item_id}") + def trace_item(item_id: str): + return None + + app.include_router(router) + ``` + """ + return self.api_route( + path=path, + response_model=response_model, + status_code=status_code, + tags=tags, + dependencies=dependencies, + summary=summary, + description=description, + response_description=response_description, + responses=responses, + deprecated=deprecated, + methods=["TRACE"], + operation_id=operation_id, + response_model_include=response_model_include, + response_model_exclude=response_model_exclude, + response_model_by_alias=response_model_by_alias, + response_model_exclude_unset=response_model_exclude_unset, + response_model_exclude_defaults=response_model_exclude_defaults, + response_model_exclude_none=response_model_exclude_none, + include_in_schema=include_in_schema, + response_class=response_class, + name=name, + callbacks=callbacks, + openapi_extra=openapi_extra, + generate_unique_id_function=generate_unique_id_function, + ) + + @deprecated( + """ + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + """ + ) + def on_event( + self, + event_type: Annotated[ + str, + Doc( + """ + The type of event. `startup` or `shutdown`. + """ + ), + ], + ) -> Callable[[DecoratedCallable], DecoratedCallable]: + """ + Add an event handler for the router. + + `on_event` is deprecated, use `lifespan` event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/#alternative-events-deprecated). + """ + + def decorator(func: DecoratedCallable) -> DecoratedCallable: + self.add_event_handler(event_type, func) + return func + + return decorator diff --git a/venv/Lib/site-packages/fastapi/security/__init__.py b/venv/Lib/site-packages/fastapi/security/__init__.py new file mode 100644 index 00000000..3aa6bf21 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/security/__init__.py @@ -0,0 +1,15 @@ +from .api_key import APIKeyCookie as APIKeyCookie +from .api_key import APIKeyHeader as APIKeyHeader +from .api_key import APIKeyQuery as APIKeyQuery +from .http import HTTPAuthorizationCredentials as HTTPAuthorizationCredentials +from .http import HTTPBasic as HTTPBasic +from .http import HTTPBasicCredentials as HTTPBasicCredentials +from .http import HTTPBearer as HTTPBearer +from .http import HTTPDigest as HTTPDigest +from .oauth2 import OAuth2 as OAuth2 +from .oauth2 import OAuth2AuthorizationCodeBearer as OAuth2AuthorizationCodeBearer +from .oauth2 import OAuth2PasswordBearer as OAuth2PasswordBearer +from .oauth2 import OAuth2PasswordRequestForm as OAuth2PasswordRequestForm +from .oauth2 import OAuth2PasswordRequestFormStrict as OAuth2PasswordRequestFormStrict +from .oauth2 import SecurityScopes as SecurityScopes +from .open_id_connect_url import OpenIdConnect as OpenIdConnect diff --git a/venv/Lib/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cabfb59bbfea95315675ea626f07ad1792aaf1cc GIT binary patch literal 837 zcmZ{i%We}f6ox&yOsLJ%?FkxQ zfd}9jcmv*n9m`0=h7~)c?z-aGX^XPJvVML4Ikt~IbG|!H9l`kg<8*djMCg|`*Q0O+ z7vBKBpa2C{h$0JHmgWL*0T&Dxfs43kxD=M6GAZUJ|2$8bCBMjLp;LRqKR{cXYZd)Bf! z7>^EVHspNH=s$lzNk9eo#w!0Nr6L1+`(Qd94^lPbf_);2@pvd`Kx4&7C?Q|d`8^_; z4`%DetS_pYI3>bVFm9inQK?{$eXLL40lKrI^b{j!NcV6wn!5W`&J|DG1!q1ToWb947c^eDui1N7GDROI#Ge!R!0rbk z72LcpuU^>qJQg$Md5@CpvidCIK^oFsu?KSj&3a`f2DevXcEbU#PCIeK8` Yy&Rq7=tYiR<>+0Gp8Q15#Vy$O7btn`$N&HU literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc b/venv/Lib/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..893e6d23e723b26718e238c0ccf88e3e01b29be3 GIT binary patch literal 9688 zcmeHNZ)_Y#72mzRe?Fgm_SJS=nxxa%NqiQ7Vw!qJBtGrPfMO;afif9}uWtk_IX6sudtU0OHG~XC&w+-kaGy z-<=(&1d7^{O*}jE=FQBTH*enj-t4{I(UFkg`R+UUnQsqB(x0#pJP|)rdkZp4k}m18 zDHY|MEMq=ohKfo~DTZ@lURKOVF`A3=eAtW?B@Bf z6}!vGUi?JKHEc^WGa)ZJ_W1EfX~m0+_i+pAlM}R1W`7$%24EwTj$p0H$oTv(l_M_@J>h> zW&BL{xa|@cW`QNS6(blV-6YuQl?wobjMPF>9a-Le?;$=V=+d?)5pkT}>WAss=o6{)Iv2~{oHdfCK$QdOTVYo=e5L|qt# zB6VkMouRfp#c`PzK4se`>xJ^N#QNaHdNAn-l6J^A`yn|itwg%3p;%f2iC6D{@aP#@lB_~X8iOTrDa$5! zqmwg+Lv%W2Skxh4wglIS*i$^;(gbLlOPm?IZ0h6`B_(Fh89LR8VR3dQwmt86-f(9) zu`ZQ`d@h}4uq$vV=nBdXc14OOBMGTNh-ZjBn{ur0j8Or4A3r9h;7U9XfVVbx!8i7rP>t3)yn}&tiChe^W`p|+_ zESbKj`Fy@qfvstAEn&;pp?2;s&m^r4kX zgH0Geu5SrxS9lqDv0sMT-2cetnGG;qBe30^d?veYc(wz@T3SbM6{}&c z|4ZrcoYZ~-2jw~ek5q8sHQ2^`h_SH`19u15BX9@$9+Gb`wLI77x^A1jNdb4T$+wg5 z@%TRWJp(1e6X15|P-7#_Op*K=7ReKk$)PT~m;A$;>CpThG7kuX55Y~e!ES{7>qVRc zP@%!f!oqnka%z7~tmC z1e@0?4jG!V8JscP1ES`Fb8>x`!MRDG0rFV{p)EN=HAWds`!uyS*hz%|J0iA3zz2u5 zRQoX`OVS#y)D;6_hBb6Ki`*@bA-^gw%8LL_UJkt~|3F@pRP2jCi=hSC>5~D4&Ia%~ zsDk$_k6aoEkcHOKfU+2d63WJ(inJUa_d^X( zq;J2P-gP;>>uP%Va(ejnd)^#f9)0tHB{@`8^VR2oyUNu8VYy!)RbsPXH|)Hq^>D#eTixc`F7lxZvgr3lX|zW zB)fQD9oSb2`|85J(!Gh={m5goR<-@ry5DGtk&L zY-u>cxsd;6*n;uXt&oL~#@OaMA&W4_O=1?YYOO(wXy!*P3wuG~Hy5)&!`67EX}}Ew z794F9H%)7x!U%W@eg>RL3JDuR5H^UF{A9*!AAUe+3m*|-3!xCiZ3wKzV4px_-7L3O z2he<1aa`gjHwUQ6|0{s@^=h*X6!}@k&1^SpohFbR6{-;M>+`s=n$a=a12m@@26J3< zrnm7xtV7@*0(;Gez+Y{F!0HR?rOur<4S@v?{B*-#hWEn&fMY`K4m*G<-vIlvdrL}7Map14^D@X#E`t%x19YmNqA@2uBh%og<<)w)W+plcfcd38h<<9-p7*@n@j62(q zZ|jZuwjtlX27H=CeAuGYxwl2ZJ#!%_QXfTrv=XbQShnY z`~>4uU%-zMpTgAn;}#o?|%!S3gNDcP{m-MK!n;X_br6l0LuTPD_&o(w-Blq6{@&- zgevw<9ijdWPJMP56aEdKUoL(|K&8;sO@qq1q6Dbi4i~=cK~&UrvEfmy#pG?wjA6o+ zilp&Oj~8_-CHS@@enipdf2Pga@JSfHRc86cywh-F-y3iQ-)FO@;MXw>FJZkN_$bf*bgCFuZ{0AytdacU8BzO3&tJk$w0Xg`63;!*P*Da({;ln+(@R)JL6)wNM#XCxV zE6Xu2pIi$f{xE(>{Bq<=>;y35wYc*nByb-q%kN8f{8>8izLe$vcfBu-{9f9#8f}xe ooZq@C!E3euYqEUk{P3!T@70CSQ&=2bmGHe<@{51xMXt<$0gkt-CjbBd literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..160b70cbdfc7719bd6bee5006cf5a6f2ec86803d GIT binary patch literal 499 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 a3Xp!SWtp(Z@^LZC6aEXn-h~{7*#8G`-Ail$ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc b/venv/Lib/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7375ee09ee1268d9024bf92997590d9a450d8045 GIT binary patch literal 18445 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 X@%7%!nnd59o(_)7W51D5@Z|m<>^2G} literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc b/venv/Lib/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b835322e1dd3f32d8ada4c2b3beb41af116694eb GIT binary patch literal 3210 zcmcgu&2JmW6`$SZw@6V`WLmB5WYD;&=npzgf}m&u2Xqv-f*m=q z?3;aW-n@_Bd$WHi6mkT{n_o0q9|HAPTntBYKgr-)vj;gr+S& z*-q6{nojuXcBY=ubkfhZbM>62Q~pFdU(ahg?HAgU^~rXzUNneFenD7fi?A$D-Lm2{ z>sBvUnfN;{Dn^vK&{19(I6lyY3mqOTuouH1;I4uf`AgjG3QzUUIFh5lFPD~HdFh(V z^&WVUzQ|wga*49j$g`h$@@f0*g^Onv=I38pte8=@76hSk6lak&AG&UALOd4+i=Ep* z+$5aT4MyrFGwK#I;m=};_bis=37#|wPqEZ3Bi_+8e*gqa11HUsNNav(gr6PZ=SKJw zz|ZKN`MsQGh84C_^(>p@IaVB=(M+(ZtwepIXI4rg0f%n5ISNAuZJrLIMxCx|@j!X5 zgK?#8aAn?=z7@o8C~JDD>k3cIOKrw!0lD_dU2^@MHA9( z@iw;ur_G}Y#-%Gfoq{L_$AvZ*A{5b7_;C6z3xDIMS_K-3W2wbQjlF#Fe0)qSL8-{2 zV>kBfL*5VwG`57ICDq)R*aG25(;l4#z>1hj0@^X+7aQJ2SGbQ1r(MiAX?2(jA{K|$iYE_EFd=8aD?ml zevi5cK40eol|$8z>2(4|CBRP$xxNQDrcOXLy!MM{lQwqo*FXm(S5$?xan|uAZ=9g( zPzzeye|3Az2+#s8gF0)D=R1H5@CPafLWG5*P4R+N8g?O~h^yU#ftX1Mv_{~VRzPH9 zF${QPA3v5_a3=hq5}RE=wz(H}>AC~{gEuW_4XSp~Cr1i=A9YX!pbP>Ke!oTt-NT(i zwV(tbNl-jv)(>%k#RN`ZB--Gr*MY)$VA#6TlXMR7LishP4J-)1r&@!WAJaK(SRfBt z9qNYRRgdpeeD0v_5^Q?-j~B^~g6SqvLmt^QHm%#nEhqvUo5bGbnAZ$hHsIYA+&wa` zq()xA5_Uh3+)Th~cwLenshDuDh$2Yorcg;m(|fM1mqW(=DB0GJtZnNCY}--B*6q`_ zb&C^NvXx|%klb&^+OYF!m6|8&FnC-?ltlbrUwbMh>yueeo zy;0udN_F_Y1h&X$VS1h1ZyBUKw|(T~o#*abW;u5~@m8*%B8PwS#i80qM}J@axccR> z+ULh=*Asur%x?ei==H?g#U0p5qV%BZqm4ZW@);gA+x|fd^dCW-x_akoURe0k{2_0dd{{1 z#9f~Qc=NXXYS;1c)`eBtw&9`#Bxh01l1d2t(iCWXlvoKvUmV0WhFkmyrjLo3MH;=* zpDucufR+3VrY-WVX(coLr%0jHpTTJkrhjnbXUQJ}whkTL&KJMR7yG7Jn%c1vg~`5^ zEEK=B(uZ>WG|H4o`LXT%%#BOGd0ERPN;5lF3gyx$mo4Y|2T|_W|CT$Ba;M3GN4N7+ zTGu4%nnGPA)b+@L+|COqql|3w$Oo%^0*_DT?mYeJ$@@sgj$-#%tV~5I)$71*5l5yx zsK+XnA=G76_XrsW1WPPBFq9ZpY;^@bdu@dV+f}psFmZE~RDwc{+l!{m{VPPG2Uy^BelVxT$5J{kd zhk%#fdiJLH2mB9StR4(=QSjs~5>Gk#CPvW*^Z35+ee>Sqy)T#N2*%5gPnzc_A>Ss)D`izNkdA%*TP69kMVncG@UKyakibWE@IjxKYViJ{BZu{u(JHQ zvU*TieYgIpa{Itt*u6Vg8x+IC$M>!cZhml2jnPgv1JC%nn~PRM+UrT%$uOnmwC@`t zk6HC7rb+2W)=r8PZpj6t_JS(FG-8y}FXZgV_vzxWdg1knSLG2y{MDNqT-jrT>(8T~ I9`b3cU*-au3;+NC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/fastapi/security/api_key.py b/venv/Lib/site-packages/fastapi/security/api_key.py new file mode 100644 index 00000000..70c2dca8 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/security/api_key.py @@ -0,0 +1,288 @@ +from typing import Optional + +from fastapi.openapi.models import APIKey, APIKeyIn +from fastapi.security.base import SecurityBase +from starlette.exceptions import HTTPException +from starlette.requests import Request +from starlette.status import HTTP_403_FORBIDDEN +from typing_extensions import Annotated, Doc + + +class APIKeyBase(SecurityBase): + @staticmethod + def check_api_key(api_key: Optional[str], auto_error: bool) -> Optional[str]: + if not api_key: + if auto_error: + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" + ) + return None + return api_key + + +class APIKeyQuery(APIKeyBase): + """ + API key authentication using a query parameter. + + This defines the name of the query parameter that should be provided in the request + with the API key and integrates that into the OpenAPI documentation. It extracts + the key value sent in the query parameter automatically and provides it as the + dependency result. But it doesn't define how to send that API key to the client. + + ## Usage + + Create an instance object and use that object as the dependency in `Depends()`. + + The dependency result will be a string containing the key value. + + ## Example + + ```python + from fastapi import Depends, FastAPI + from fastapi.security import APIKeyQuery + + app = FastAPI() + + query_scheme = APIKeyQuery(name="api_key") + + + @app.get("/items/") + async def read_items(api_key: str = Depends(query_scheme)): + return {"api_key": api_key} + ``` + """ + + def __init__( + self, + *, + name: Annotated[ + str, + Doc("Query parameter name."), + ], + scheme_name: Annotated[ + Optional[str], + Doc( + """ + Security scheme name. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Security scheme description. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + auto_error: Annotated[ + bool, + Doc( + """ + By default, if the query parameter is not provided, `APIKeyQuery` will + automatically cancel the request and send the client an error. + + If `auto_error` is set to `False`, when the query parameter is not + available, instead of erroring out, the dependency result will be + `None`. + + This is useful when you want to have optional authentication. + + It is also useful when you want to have authentication that can be + provided in one of multiple optional ways (for example, in a query + parameter or in an HTTP Bearer token). + """ + ), + ] = True, + ): + self.model: APIKey = APIKey( + **{"in": APIKeyIn.query}, # type: ignore[arg-type] + name=name, + description=description, + ) + self.scheme_name = scheme_name or self.__class__.__name__ + self.auto_error = auto_error + + async def __call__(self, request: Request) -> Optional[str]: + api_key = request.query_params.get(self.model.name) + return self.check_api_key(api_key, self.auto_error) + + +class APIKeyHeader(APIKeyBase): + """ + API key authentication using a header. + + This defines the name of the header that should be provided in the request with + the API key and integrates that into the OpenAPI documentation. It extracts + the key value sent in the header automatically and provides it as the dependency + result. But it doesn't define how to send that key to the client. + + ## Usage + + Create an instance object and use that object as the dependency in `Depends()`. + + The dependency result will be a string containing the key value. + + ## Example + + ```python + from fastapi import Depends, FastAPI + from fastapi.security import APIKeyHeader + + app = FastAPI() + + header_scheme = APIKeyHeader(name="x-key") + + + @app.get("/items/") + async def read_items(key: str = Depends(header_scheme)): + return {"key": key} + ``` + """ + + def __init__( + self, + *, + name: Annotated[str, Doc("Header name.")], + scheme_name: Annotated[ + Optional[str], + Doc( + """ + Security scheme name. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Security scheme description. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + auto_error: Annotated[ + bool, + Doc( + """ + By default, if the header is not provided, `APIKeyHeader` will + automatically cancel the request and send the client an error. + + If `auto_error` is set to `False`, when the header is not available, + instead of erroring out, the dependency result will be `None`. + + This is useful when you want to have optional authentication. + + It is also useful when you want to have authentication that can be + provided in one of multiple optional ways (for example, in a header or + in an HTTP Bearer token). + """ + ), + ] = True, + ): + self.model: APIKey = APIKey( + **{"in": APIKeyIn.header}, # type: ignore[arg-type] + name=name, + description=description, + ) + self.scheme_name = scheme_name or self.__class__.__name__ + self.auto_error = auto_error + + async def __call__(self, request: Request) -> Optional[str]: + api_key = request.headers.get(self.model.name) + return self.check_api_key(api_key, self.auto_error) + + +class APIKeyCookie(APIKeyBase): + """ + API key authentication using a cookie. + + This defines the name of the cookie that should be provided in the request with + the API key and integrates that into the OpenAPI documentation. It extracts + the key value sent in the cookie automatically and provides it as the dependency + result. But it doesn't define how to set that cookie. + + ## Usage + + Create an instance object and use that object as the dependency in `Depends()`. + + The dependency result will be a string containing the key value. + + ## Example + + ```python + from fastapi import Depends, FastAPI + from fastapi.security import APIKeyCookie + + app = FastAPI() + + cookie_scheme = APIKeyCookie(name="session") + + + @app.get("/items/") + async def read_items(session: str = Depends(cookie_scheme)): + return {"session": session} + ``` + """ + + def __init__( + self, + *, + name: Annotated[str, Doc("Cookie name.")], + scheme_name: Annotated[ + Optional[str], + Doc( + """ + Security scheme name. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Security scheme description. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + auto_error: Annotated[ + bool, + Doc( + """ + By default, if the cookie is not provided, `APIKeyCookie` will + automatically cancel the request and send the client an error. + + If `auto_error` is set to `False`, when the cookie is not available, + instead of erroring out, the dependency result will be `None`. + + This is useful when you want to have optional authentication. + + It is also useful when you want to have authentication that can be + provided in one of multiple optional ways (for example, in a cookie or + in an HTTP Bearer token). + """ + ), + ] = True, + ): + self.model: APIKey = APIKey( + **{"in": APIKeyIn.cookie}, # type: ignore[arg-type] + name=name, + description=description, + ) + self.scheme_name = scheme_name or self.__class__.__name__ + self.auto_error = auto_error + + async def __call__(self, request: Request) -> Optional[str]: + api_key = request.cookies.get(self.model.name) + return self.check_api_key(api_key, self.auto_error) diff --git a/venv/Lib/site-packages/fastapi/security/base.py b/venv/Lib/site-packages/fastapi/security/base.py new file mode 100644 index 00000000..c43555de --- /dev/null +++ b/venv/Lib/site-packages/fastapi/security/base.py @@ -0,0 +1,6 @@ +from fastapi.openapi.models import SecurityBase as SecurityBaseModel + + +class SecurityBase: + model: SecurityBaseModel + scheme_name: str diff --git a/venv/Lib/site-packages/fastapi/security/http.py b/venv/Lib/site-packages/fastapi/security/http.py new file mode 100644 index 00000000..9ab2df3c --- /dev/null +++ b/venv/Lib/site-packages/fastapi/security/http.py @@ -0,0 +1,423 @@ +import binascii +from base64 import b64decode +from typing import Optional + +from fastapi.exceptions import HTTPException +from fastapi.openapi.models import HTTPBase as HTTPBaseModel +from fastapi.openapi.models import HTTPBearer as HTTPBearerModel +from fastapi.security.base import SecurityBase +from fastapi.security.utils import get_authorization_scheme_param +from pydantic import BaseModel +from starlette.requests import Request +from starlette.status import HTTP_401_UNAUTHORIZED, HTTP_403_FORBIDDEN +from typing_extensions import Annotated, Doc + + +class HTTPBasicCredentials(BaseModel): + """ + The HTTP Basic credentials given as the result of using `HTTPBasic` in a + dependency. + + Read more about it in the + [FastAPI docs for HTTP Basic Auth](https://fastapi.tiangolo.com/advanced/security/http-basic-auth/). + """ + + username: Annotated[str, Doc("The HTTP Basic username.")] + password: Annotated[str, Doc("The HTTP Basic password.")] + + +class HTTPAuthorizationCredentials(BaseModel): + """ + The HTTP authorization credentials in the result of using `HTTPBearer` or + `HTTPDigest` in a dependency. + + The HTTP authorization header value is split by the first space. + + The first part is the `scheme`, the second part is the `credentials`. + + For example, in an HTTP Bearer token scheme, the client will send a header + like: + + ``` + Authorization: Bearer deadbeef12346 + ``` + + In this case: + + * `scheme` will have the value `"Bearer"` + * `credentials` will have the value `"deadbeef12346"` + """ + + scheme: Annotated[ + str, + Doc( + """ + The HTTP authorization scheme extracted from the header value. + """ + ), + ] + credentials: Annotated[ + str, + Doc( + """ + The HTTP authorization credentials extracted from the header value. + """ + ), + ] + + +class HTTPBase(SecurityBase): + def __init__( + self, + *, + scheme: str, + scheme_name: Optional[str] = None, + description: Optional[str] = None, + auto_error: bool = True, + ): + self.model = HTTPBaseModel(scheme=scheme, description=description) + self.scheme_name = scheme_name or self.__class__.__name__ + self.auto_error = auto_error + + async def __call__( + self, request: Request + ) -> Optional[HTTPAuthorizationCredentials]: + authorization = request.headers.get("Authorization") + scheme, credentials = get_authorization_scheme_param(authorization) + if not (authorization and scheme and credentials): + if self.auto_error: + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" + ) + else: + return None + return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials) + + +class HTTPBasic(HTTPBase): + """ + HTTP Basic authentication. + + ## Usage + + Create an instance object and use that object as the dependency in `Depends()`. + + The dependency result will be an `HTTPBasicCredentials` object containing the + `username` and the `password`. + + Read more about it in the + [FastAPI docs for HTTP Basic Auth](https://fastapi.tiangolo.com/advanced/security/http-basic-auth/). + + ## Example + + ```python + from typing import Annotated + + from fastapi import Depends, FastAPI + from fastapi.security import HTTPBasic, HTTPBasicCredentials + + app = FastAPI() + + security = HTTPBasic() + + + @app.get("/users/me") + def read_current_user(credentials: Annotated[HTTPBasicCredentials, Depends(security)]): + return {"username": credentials.username, "password": credentials.password} + ``` + """ + + def __init__( + self, + *, + scheme_name: Annotated[ + Optional[str], + Doc( + """ + Security scheme name. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + realm: Annotated[ + Optional[str], + Doc( + """ + HTTP Basic authentication realm. + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Security scheme description. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + auto_error: Annotated[ + bool, + Doc( + """ + By default, if the HTTP Basic authentication is not provided (a + header), `HTTPBasic` will automatically cancel the request and send the + client an error. + + If `auto_error` is set to `False`, when the HTTP Basic authentication + is not available, instead of erroring out, the dependency result will + be `None`. + + This is useful when you want to have optional authentication. + + It is also useful when you want to have authentication that can be + provided in one of multiple optional ways (for example, in HTTP Basic + authentication or in an HTTP Bearer token). + """ + ), + ] = True, + ): + self.model = HTTPBaseModel(scheme="basic", description=description) + self.scheme_name = scheme_name or self.__class__.__name__ + self.realm = realm + self.auto_error = auto_error + + async def __call__( # type: ignore + self, request: Request + ) -> Optional[HTTPBasicCredentials]: + authorization = request.headers.get("Authorization") + scheme, param = get_authorization_scheme_param(authorization) + if self.realm: + unauthorized_headers = {"WWW-Authenticate": f'Basic realm="{self.realm}"'} + else: + unauthorized_headers = {"WWW-Authenticate": "Basic"} + if not authorization or scheme.lower() != "basic": + if self.auto_error: + raise HTTPException( + status_code=HTTP_401_UNAUTHORIZED, + detail="Not authenticated", + headers=unauthorized_headers, + ) + else: + return None + invalid_user_credentials_exc = HTTPException( + status_code=HTTP_401_UNAUTHORIZED, + detail="Invalid authentication credentials", + headers=unauthorized_headers, + ) + try: + data = b64decode(param).decode("ascii") + except (ValueError, UnicodeDecodeError, binascii.Error): + raise invalid_user_credentials_exc # noqa: B904 + username, separator, password = data.partition(":") + if not separator: + raise invalid_user_credentials_exc + return HTTPBasicCredentials(username=username, password=password) + + +class HTTPBearer(HTTPBase): + """ + HTTP Bearer token authentication. + + ## Usage + + Create an instance object and use that object as the dependency in `Depends()`. + + The dependency result will be an `HTTPAuthorizationCredentials` object containing + the `scheme` and the `credentials`. + + ## Example + + ```python + from typing import Annotated + + from fastapi import Depends, FastAPI + from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer + + app = FastAPI() + + security = HTTPBearer() + + + @app.get("/users/me") + def read_current_user( + credentials: Annotated[HTTPAuthorizationCredentials, Depends(security)] + ): + return {"scheme": credentials.scheme, "credentials": credentials.credentials} + ``` + """ + + def __init__( + self, + *, + bearerFormat: Annotated[Optional[str], Doc("Bearer token format.")] = None, + scheme_name: Annotated[ + Optional[str], + Doc( + """ + Security scheme name. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Security scheme description. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + auto_error: Annotated[ + bool, + Doc( + """ + By default, if the HTTP Bearer token is not provided (in an + `Authorization` header), `HTTPBearer` will automatically cancel the + request and send the client an error. + + If `auto_error` is set to `False`, when the HTTP Bearer token + is not available, instead of erroring out, the dependency result will + be `None`. + + This is useful when you want to have optional authentication. + + It is also useful when you want to have authentication that can be + provided in one of multiple optional ways (for example, in an HTTP + Bearer token or in a cookie). + """ + ), + ] = True, + ): + self.model = HTTPBearerModel(bearerFormat=bearerFormat, description=description) + self.scheme_name = scheme_name or self.__class__.__name__ + self.auto_error = auto_error + + async def __call__( + self, request: Request + ) -> Optional[HTTPAuthorizationCredentials]: + authorization = request.headers.get("Authorization") + scheme, credentials = get_authorization_scheme_param(authorization) + if not (authorization and scheme and credentials): + if self.auto_error: + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" + ) + else: + return None + if scheme.lower() != "bearer": + if self.auto_error: + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, + detail="Invalid authentication credentials", + ) + else: + return None + return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials) + + +class HTTPDigest(HTTPBase): + """ + HTTP Digest authentication. + + ## Usage + + Create an instance object and use that object as the dependency in `Depends()`. + + The dependency result will be an `HTTPAuthorizationCredentials` object containing + the `scheme` and the `credentials`. + + ## Example + + ```python + from typing import Annotated + + from fastapi import Depends, FastAPI + from fastapi.security import HTTPAuthorizationCredentials, HTTPDigest + + app = FastAPI() + + security = HTTPDigest() + + + @app.get("/users/me") + def read_current_user( + credentials: Annotated[HTTPAuthorizationCredentials, Depends(security)] + ): + return {"scheme": credentials.scheme, "credentials": credentials.credentials} + ``` + """ + + def __init__( + self, + *, + scheme_name: Annotated[ + Optional[str], + Doc( + """ + Security scheme name. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Security scheme description. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + auto_error: Annotated[ + bool, + Doc( + """ + By default, if the HTTP Digest is not provided, `HTTPDigest` will + automatically cancel the request and send the client an error. + + If `auto_error` is set to `False`, when the HTTP Digest is not + available, instead of erroring out, the dependency result will + be `None`. + + This is useful when you want to have optional authentication. + + It is also useful when you want to have authentication that can be + provided in one of multiple optional ways (for example, in HTTP + Digest or in a cookie). + """ + ), + ] = True, + ): + self.model = HTTPBaseModel(scheme="digest", description=description) + self.scheme_name = scheme_name or self.__class__.__name__ + self.auto_error = auto_error + + async def __call__( + self, request: Request + ) -> Optional[HTTPAuthorizationCredentials]: + authorization = request.headers.get("Authorization") + scheme, credentials = get_authorization_scheme_param(authorization) + if not (authorization and scheme and credentials): + if self.auto_error: + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" + ) + else: + return None + if scheme.lower() != "digest": + if self.auto_error: + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, + detail="Invalid authentication credentials", + ) + else: + return None + return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials) diff --git a/venv/Lib/site-packages/fastapi/security/oauth2.py b/venv/Lib/site-packages/fastapi/security/oauth2.py new file mode 100644 index 00000000..88e394db --- /dev/null +++ b/venv/Lib/site-packages/fastapi/security/oauth2.py @@ -0,0 +1,653 @@ +from typing import Any, Dict, List, Optional, Union, cast + +from fastapi.exceptions import HTTPException +from fastapi.openapi.models import OAuth2 as OAuth2Model +from fastapi.openapi.models import OAuthFlows as OAuthFlowsModel +from fastapi.param_functions import Form +from fastapi.security.base import SecurityBase +from fastapi.security.utils import get_authorization_scheme_param +from starlette.requests import Request +from starlette.status import HTTP_401_UNAUTHORIZED, HTTP_403_FORBIDDEN + +# TODO: import from typing when deprecating Python 3.9 +from typing_extensions import Annotated, Doc + + +class OAuth2PasswordRequestForm: + """ + This is a dependency class to collect the `username` and `password` as form data + for an OAuth2 password flow. + + The OAuth2 specification dictates that for a password flow the data should be + collected using form data (instead of JSON) and that it should have the specific + fields `username` and `password`. + + All the initialization parameters are extracted from the request. + + Read more about it in the + [FastAPI docs for Simple OAuth2 with Password and Bearer](https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/). + + ## Example + + ```python + from typing import Annotated + + from fastapi import Depends, FastAPI + from fastapi.security import OAuth2PasswordRequestForm + + app = FastAPI() + + + @app.post("/login") + def login(form_data: Annotated[OAuth2PasswordRequestForm, Depends()]): + data = {} + data["scopes"] = [] + for scope in form_data.scopes: + data["scopes"].append(scope) + if form_data.client_id: + data["client_id"] = form_data.client_id + if form_data.client_secret: + data["client_secret"] = form_data.client_secret + return data + ``` + + Note that for OAuth2 the scope `items:read` is a single scope in an opaque string. + You could have custom internal logic to separate it by colon characters (`:`) or + similar, and get the two parts `items` and `read`. Many applications do that to + group and organize permissions, you could do it as well in your application, just + know that that it is application specific, it's not part of the specification. + """ + + def __init__( + self, + *, + grant_type: Annotated[ + Union[str, None], + Form(pattern="^password$"), + Doc( + """ + The OAuth2 spec says it is required and MUST be the fixed string + "password". Nevertheless, this dependency class is permissive and + allows not passing it. If you want to enforce it, use instead the + `OAuth2PasswordRequestFormStrict` dependency. + """ + ), + ] = None, + username: Annotated[ + str, + Form(), + Doc( + """ + `username` string. The OAuth2 spec requires the exact field name + `username`. + """ + ), + ], + password: Annotated[ + str, + Form(json_schema_extra={"format": "password"}), + Doc( + """ + `password` string. The OAuth2 spec requires the exact field name + `password". + """ + ), + ], + scope: Annotated[ + str, + Form(), + Doc( + """ + A single string with actually several scopes separated by spaces. Each + scope is also a string. + + For example, a single string with: + + ```python + "items:read items:write users:read profile openid" + ```` + + would represent the scopes: + + * `items:read` + * `items:write` + * `users:read` + * `profile` + * `openid` + """ + ), + ] = "", + client_id: Annotated[ + Union[str, None], + Form(), + Doc( + """ + If there's a `client_id`, it can be sent as part of the form fields. + But the OAuth2 specification recommends sending the `client_id` and + `client_secret` (if any) using HTTP Basic auth. + """ + ), + ] = None, + client_secret: Annotated[ + Union[str, None], + Form(json_schema_extra={"format": "password"}), + Doc( + """ + If there's a `client_password` (and a `client_id`), they can be sent + as part of the form fields. But the OAuth2 specification recommends + sending the `client_id` and `client_secret` (if any) using HTTP Basic + auth. + """ + ), + ] = None, + ): + self.grant_type = grant_type + self.username = username + self.password = password + self.scopes = scope.split() + self.client_id = client_id + self.client_secret = client_secret + + +class OAuth2PasswordRequestFormStrict(OAuth2PasswordRequestForm): + """ + This is a dependency class to collect the `username` and `password` as form data + for an OAuth2 password flow. + + The OAuth2 specification dictates that for a password flow the data should be + collected using form data (instead of JSON) and that it should have the specific + fields `username` and `password`. + + All the initialization parameters are extracted from the request. + + The only difference between `OAuth2PasswordRequestFormStrict` and + `OAuth2PasswordRequestForm` is that `OAuth2PasswordRequestFormStrict` requires the + client to send the form field `grant_type` with the value `"password"`, which + is required in the OAuth2 specification (it seems that for no particular reason), + while for `OAuth2PasswordRequestForm` `grant_type` is optional. + + Read more about it in the + [FastAPI docs for Simple OAuth2 with Password and Bearer](https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/). + + ## Example + + ```python + from typing import Annotated + + from fastapi import Depends, FastAPI + from fastapi.security import OAuth2PasswordRequestForm + + app = FastAPI() + + + @app.post("/login") + def login(form_data: Annotated[OAuth2PasswordRequestFormStrict, Depends()]): + data = {} + data["scopes"] = [] + for scope in form_data.scopes: + data["scopes"].append(scope) + if form_data.client_id: + data["client_id"] = form_data.client_id + if form_data.client_secret: + data["client_secret"] = form_data.client_secret + return data + ``` + + Note that for OAuth2 the scope `items:read` is a single scope in an opaque string. + You could have custom internal logic to separate it by colon characters (`:`) or + similar, and get the two parts `items` and `read`. Many applications do that to + group and organize permissions, you could do it as well in your application, just + know that that it is application specific, it's not part of the specification. + + + grant_type: the OAuth2 spec says it is required and MUST be the fixed string "password". + This dependency is strict about it. If you want to be permissive, use instead the + OAuth2PasswordRequestForm dependency class. + username: username string. The OAuth2 spec requires the exact field name "username". + password: password string. The OAuth2 spec requires the exact field name "password". + scope: Optional string. Several scopes (each one a string) separated by spaces. E.g. + "items:read items:write users:read profile openid" + client_id: optional string. OAuth2 recommends sending the client_id and client_secret (if any) + using HTTP Basic auth, as: client_id:client_secret + client_secret: optional string. OAuth2 recommends sending the client_id and client_secret (if any) + using HTTP Basic auth, as: client_id:client_secret + """ + + def __init__( + self, + grant_type: Annotated[ + str, + Form(pattern="^password$"), + Doc( + """ + The OAuth2 spec says it is required and MUST be the fixed string + "password". This dependency is strict about it. If you want to be + permissive, use instead the `OAuth2PasswordRequestForm` dependency + class. + """ + ), + ], + username: Annotated[ + str, + Form(), + Doc( + """ + `username` string. The OAuth2 spec requires the exact field name + `username`. + """ + ), + ], + password: Annotated[ + str, + Form(), + Doc( + """ + `password` string. The OAuth2 spec requires the exact field name + `password". + """ + ), + ], + scope: Annotated[ + str, + Form(), + Doc( + """ + A single string with actually several scopes separated by spaces. Each + scope is also a string. + + For example, a single string with: + + ```python + "items:read items:write users:read profile openid" + ```` + + would represent the scopes: + + * `items:read` + * `items:write` + * `users:read` + * `profile` + * `openid` + """ + ), + ] = "", + client_id: Annotated[ + Union[str, None], + Form(), + Doc( + """ + If there's a `client_id`, it can be sent as part of the form fields. + But the OAuth2 specification recommends sending the `client_id` and + `client_secret` (if any) using HTTP Basic auth. + """ + ), + ] = None, + client_secret: Annotated[ + Union[str, None], + Form(), + Doc( + """ + If there's a `client_password` (and a `client_id`), they can be sent + as part of the form fields. But the OAuth2 specification recommends + sending the `client_id` and `client_secret` (if any) using HTTP Basic + auth. + """ + ), + ] = None, + ): + super().__init__( + grant_type=grant_type, + username=username, + password=password, + scope=scope, + client_id=client_id, + client_secret=client_secret, + ) + + +class OAuth2(SecurityBase): + """ + This is the base class for OAuth2 authentication, an instance of it would be used + as a dependency. All other OAuth2 classes inherit from it and customize it for + each OAuth2 flow. + + You normally would not create a new class inheriting from it but use one of the + existing subclasses, and maybe compose them if you want to support multiple flows. + + Read more about it in the + [FastAPI docs for Security](https://fastapi.tiangolo.com/tutorial/security/). + """ + + def __init__( + self, + *, + flows: Annotated[ + Union[OAuthFlowsModel, Dict[str, Dict[str, Any]]], + Doc( + """ + The dictionary of OAuth2 flows. + """ + ), + ] = OAuthFlowsModel(), + scheme_name: Annotated[ + Optional[str], + Doc( + """ + Security scheme name. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Security scheme description. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + auto_error: Annotated[ + bool, + Doc( + """ + By default, if no HTTP Authorization header is provided, required for + OAuth2 authentication, it will automatically cancel the request and + send the client an error. + + If `auto_error` is set to `False`, when the HTTP Authorization header + is not available, instead of erroring out, the dependency result will + be `None`. + + This is useful when you want to have optional authentication. + + It is also useful when you want to have authentication that can be + provided in one of multiple optional ways (for example, with OAuth2 + or in a cookie). + """ + ), + ] = True, + ): + self.model = OAuth2Model( + flows=cast(OAuthFlowsModel, flows), description=description + ) + self.scheme_name = scheme_name or self.__class__.__name__ + self.auto_error = auto_error + + async def __call__(self, request: Request) -> Optional[str]: + authorization = request.headers.get("Authorization") + if not authorization: + if self.auto_error: + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" + ) + else: + return None + return authorization + + +class OAuth2PasswordBearer(OAuth2): + """ + OAuth2 flow for authentication using a bearer token obtained with a password. + An instance of it would be used as a dependency. + + Read more about it in the + [FastAPI docs for Simple OAuth2 with Password and Bearer](https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/). + """ + + def __init__( + self, + tokenUrl: Annotated[ + str, + Doc( + """ + The URL to obtain the OAuth2 token. This would be the *path operation* + that has `OAuth2PasswordRequestForm` as a dependency. + """ + ), + ], + scheme_name: Annotated[ + Optional[str], + Doc( + """ + Security scheme name. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + scopes: Annotated[ + Optional[Dict[str, str]], + Doc( + """ + The OAuth2 scopes that would be required by the *path operations* that + use this dependency. + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Security scheme description. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + auto_error: Annotated[ + bool, + Doc( + """ + By default, if no HTTP Authorization header is provided, required for + OAuth2 authentication, it will automatically cancel the request and + send the client an error. + + If `auto_error` is set to `False`, when the HTTP Authorization header + is not available, instead of erroring out, the dependency result will + be `None`. + + This is useful when you want to have optional authentication. + + It is also useful when you want to have authentication that can be + provided in one of multiple optional ways (for example, with OAuth2 + or in a cookie). + """ + ), + ] = True, + refreshUrl: Annotated[ + Optional[str], + Doc( + """ + The URL to refresh the token and obtain a new one. + """ + ), + ] = None, + ): + if not scopes: + scopes = {} + flows = OAuthFlowsModel( + password=cast( + Any, + { + "tokenUrl": tokenUrl, + "refreshUrl": refreshUrl, + "scopes": scopes, + }, + ) + ) + super().__init__( + flows=flows, + scheme_name=scheme_name, + description=description, + auto_error=auto_error, + ) + + async def __call__(self, request: Request) -> Optional[str]: + authorization = request.headers.get("Authorization") + scheme, param = get_authorization_scheme_param(authorization) + if not authorization or scheme.lower() != "bearer": + if self.auto_error: + raise HTTPException( + status_code=HTTP_401_UNAUTHORIZED, + detail="Not authenticated", + headers={"WWW-Authenticate": "Bearer"}, + ) + else: + return None + return param + + +class OAuth2AuthorizationCodeBearer(OAuth2): + """ + OAuth2 flow for authentication using a bearer token obtained with an OAuth2 code + flow. An instance of it would be used as a dependency. + """ + + def __init__( + self, + authorizationUrl: str, + tokenUrl: Annotated[ + str, + Doc( + """ + The URL to obtain the OAuth2 token. + """ + ), + ], + refreshUrl: Annotated[ + Optional[str], + Doc( + """ + The URL to refresh the token and obtain a new one. + """ + ), + ] = None, + scheme_name: Annotated[ + Optional[str], + Doc( + """ + Security scheme name. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + scopes: Annotated[ + Optional[Dict[str, str]], + Doc( + """ + The OAuth2 scopes that would be required by the *path operations* that + use this dependency. + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Security scheme description. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + auto_error: Annotated[ + bool, + Doc( + """ + By default, if no HTTP Authorization header is provided, required for + OAuth2 authentication, it will automatically cancel the request and + send the client an error. + + If `auto_error` is set to `False`, when the HTTP Authorization header + is not available, instead of erroring out, the dependency result will + be `None`. + + This is useful when you want to have optional authentication. + + It is also useful when you want to have authentication that can be + provided in one of multiple optional ways (for example, with OAuth2 + or in a cookie). + """ + ), + ] = True, + ): + if not scopes: + scopes = {} + flows = OAuthFlowsModel( + authorizationCode=cast( + Any, + { + "authorizationUrl": authorizationUrl, + "tokenUrl": tokenUrl, + "refreshUrl": refreshUrl, + "scopes": scopes, + }, + ) + ) + super().__init__( + flows=flows, + scheme_name=scheme_name, + description=description, + auto_error=auto_error, + ) + + async def __call__(self, request: Request) -> Optional[str]: + authorization = request.headers.get("Authorization") + scheme, param = get_authorization_scheme_param(authorization) + if not authorization or scheme.lower() != "bearer": + if self.auto_error: + raise HTTPException( + status_code=HTTP_401_UNAUTHORIZED, + detail="Not authenticated", + headers={"WWW-Authenticate": "Bearer"}, + ) + else: + return None # pragma: nocover + return param + + +class SecurityScopes: + """ + This is a special class that you can define in a parameter in a dependency to + obtain the OAuth2 scopes required by all the dependencies in the same chain. + + This way, multiple dependencies can have different scopes, even when used in the + same *path operation*. And with this, you can access all the scopes required in + all those dependencies in a single place. + + Read more about it in the + [FastAPI docs for OAuth2 scopes](https://fastapi.tiangolo.com/advanced/security/oauth2-scopes/). + """ + + def __init__( + self, + scopes: Annotated[ + Optional[List[str]], + Doc( + """ + This will be filled by FastAPI. + """ + ), + ] = None, + ): + self.scopes: Annotated[ + List[str], + Doc( + """ + The list of all the scopes required by dependencies. + """ + ), + ] = scopes or [] + self.scope_str: Annotated[ + str, + Doc( + """ + All the scopes required by all the dependencies in a single string + separated by spaces, as defined in the OAuth2 specification. + """ + ), + ] = " ".join(self.scopes) diff --git a/venv/Lib/site-packages/fastapi/security/open_id_connect_url.py b/venv/Lib/site-packages/fastapi/security/open_id_connect_url.py new file mode 100644 index 00000000..c8cceb91 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/security/open_id_connect_url.py @@ -0,0 +1,84 @@ +from typing import Optional + +from fastapi.openapi.models import OpenIdConnect as OpenIdConnectModel +from fastapi.security.base import SecurityBase +from starlette.exceptions import HTTPException +from starlette.requests import Request +from starlette.status import HTTP_403_FORBIDDEN +from typing_extensions import Annotated, Doc + + +class OpenIdConnect(SecurityBase): + """ + OpenID Connect authentication class. An instance of it would be used as a + dependency. + """ + + def __init__( + self, + *, + openIdConnectUrl: Annotated[ + str, + Doc( + """ + The OpenID Connect URL. + """ + ), + ], + scheme_name: Annotated[ + Optional[str], + Doc( + """ + Security scheme name. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + description: Annotated[ + Optional[str], + Doc( + """ + Security scheme description. + + It will be included in the generated OpenAPI (e.g. visible at `/docs`). + """ + ), + ] = None, + auto_error: Annotated[ + bool, + Doc( + """ + By default, if no HTTP Authorization header is provided, required for + OpenID Connect authentication, it will automatically cancel the request + and send the client an error. + + If `auto_error` is set to `False`, when the HTTP Authorization header + is not available, instead of erroring out, the dependency result will + be `None`. + + This is useful when you want to have optional authentication. + + It is also useful when you want to have authentication that can be + provided in one of multiple optional ways (for example, with OpenID + Connect or in a cookie). + """ + ), + ] = True, + ): + self.model = OpenIdConnectModel( + openIdConnectUrl=openIdConnectUrl, description=description + ) + self.scheme_name = scheme_name or self.__class__.__name__ + self.auto_error = auto_error + + async def __call__(self, request: Request) -> Optional[str]: + authorization = request.headers.get("Authorization") + if not authorization: + if self.auto_error: + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" + ) + else: + return None + return authorization diff --git a/venv/Lib/site-packages/fastapi/security/utils.py b/venv/Lib/site-packages/fastapi/security/utils.py new file mode 100644 index 00000000..fa7a450b --- /dev/null +++ b/venv/Lib/site-packages/fastapi/security/utils.py @@ -0,0 +1,10 @@ +from typing import Optional, Tuple + + +def get_authorization_scheme_param( + authorization_header_value: Optional[str], +) -> Tuple[str, str]: + if not authorization_header_value: + return "", "" + scheme, _, param = authorization_header_value.partition(" ") + return scheme, param diff --git a/venv/Lib/site-packages/fastapi/staticfiles.py b/venv/Lib/site-packages/fastapi/staticfiles.py new file mode 100644 index 00000000..299015d4 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/staticfiles.py @@ -0,0 +1 @@ +from starlette.staticfiles import StaticFiles as StaticFiles # noqa diff --git a/venv/Lib/site-packages/fastapi/templating.py b/venv/Lib/site-packages/fastapi/templating.py new file mode 100644 index 00000000..0cb86848 --- /dev/null +++ b/venv/Lib/site-packages/fastapi/templating.py @@ -0,0 +1 @@ +from starlette.templating import Jinja2Templates as Jinja2Templates # noqa diff --git a/venv/Lib/site-packages/fastapi/testclient.py b/venv/Lib/site-packages/fastapi/testclient.py new file mode 100644 index 00000000..4012406a --- /dev/null +++ b/venv/Lib/site-packages/fastapi/testclient.py @@ -0,0 +1 @@ +from starlette.testclient import TestClient as TestClient # noqa diff --git a/venv/Lib/site-packages/fastapi/types.py b/venv/Lib/site-packages/fastapi/types.py new file mode 100644 index 00000000..3205654c --- /dev/null +++ b/venv/Lib/site-packages/fastapi/types.py @@ -0,0 +1,10 @@ +import types +from enum import Enum +from typing import Any, Callable, Dict, Set, Type, TypeVar, Union + +from pydantic import BaseModel + +DecoratedCallable = TypeVar("DecoratedCallable", bound=Callable[..., Any]) +UnionType = getattr(types, "UnionType", Union) +ModelNameMap = Dict[Union[Type[BaseModel], Type[Enum]], str] +IncEx = Union[Set[int], Set[str], Dict[int, Any], Dict[str, Any]] diff --git a/venv/Lib/site-packages/fastapi/utils.py b/venv/Lib/site-packages/fastapi/utils.py new file mode 100644 index 00000000..4c7350fe --- /dev/null +++ b/venv/Lib/site-packages/fastapi/utils.py @@ -0,0 +1,220 @@ +import re +import warnings +from dataclasses import is_dataclass +from typing import ( + TYPE_CHECKING, + Any, + Dict, + MutableMapping, + Optional, + Set, + Type, + Union, + cast, +) +from weakref import WeakKeyDictionary + +import fastapi +from fastapi._compat import ( + PYDANTIC_V2, + BaseConfig, + ModelField, + PydanticSchemaGenerationError, + Undefined, + UndefinedType, + Validator, + lenient_issubclass, +) +from fastapi.datastructures import DefaultPlaceholder, DefaultType +from pydantic import BaseModel, create_model +from pydantic.fields import FieldInfo +from typing_extensions import Literal + +if TYPE_CHECKING: # pragma: nocover + from .routing import APIRoute + +# Cache for `create_cloned_field` +_CLONED_TYPES_CACHE: MutableMapping[Type[BaseModel], Type[BaseModel]] = ( + WeakKeyDictionary() +) + + +def is_body_allowed_for_status_code(status_code: Union[int, str, None]) -> bool: + if status_code is None: + return True + # Ref: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#patterned-fields-1 + if status_code in { + "default", + "1XX", + "2XX", + "3XX", + "4XX", + "5XX", + }: + return True + current_status_code = int(status_code) + return not (current_status_code < 200 or current_status_code in {204, 205, 304}) + + +def get_path_param_names(path: str) -> Set[str]: + return set(re.findall("{(.*?)}", path)) + + +def create_model_field( + name: str, + type_: Any, + class_validators: Optional[Dict[str, Validator]] = None, + default: Optional[Any] = Undefined, + required: Union[bool, UndefinedType] = Undefined, + model_config: Type[BaseConfig] = BaseConfig, + field_info: Optional[FieldInfo] = None, + alias: Optional[str] = None, + mode: Literal["validation", "serialization"] = "validation", +) -> ModelField: + class_validators = class_validators or {} + if PYDANTIC_V2: + field_info = field_info or FieldInfo( + annotation=type_, default=default, alias=alias + ) + else: + field_info = field_info or FieldInfo() + kwargs = {"name": name, "field_info": field_info} + if PYDANTIC_V2: + kwargs.update({"mode": mode}) + else: + kwargs.update( + { + "type_": type_, + "class_validators": class_validators, + "default": default, + "required": required, + "model_config": model_config, + "alias": alias, + } + ) + try: + return ModelField(**kwargs) # type: ignore[arg-type] + except (RuntimeError, PydanticSchemaGenerationError): + raise fastapi.exceptions.FastAPIError( + "Invalid args for response field! Hint: " + f"check that {type_} is a valid Pydantic field type. " + "If you are using a return type annotation that is not a valid Pydantic " + "field (e.g. Union[Response, dict, None]) you can disable generating the " + "response model from the type annotation with the path operation decorator " + "parameter response_model=None. Read more: " + "https://fastapi.tiangolo.com/tutorial/response-model/" + ) from None + + +def create_cloned_field( + field: ModelField, + *, + cloned_types: Optional[MutableMapping[Type[BaseModel], Type[BaseModel]]] = None, +) -> ModelField: + if PYDANTIC_V2: + return field + # cloned_types caches already cloned types to support recursive models and improve + # performance by avoiding unnecessary cloning + if cloned_types is None: + cloned_types = _CLONED_TYPES_CACHE + + original_type = field.type_ + if is_dataclass(original_type) and hasattr(original_type, "__pydantic_model__"): + original_type = original_type.__pydantic_model__ + use_type = original_type + if lenient_issubclass(original_type, BaseModel): + original_type = cast(Type[BaseModel], original_type) + use_type = cloned_types.get(original_type) + if use_type is None: + use_type = create_model(original_type.__name__, __base__=original_type) + cloned_types[original_type] = use_type + for f in original_type.__fields__.values(): + use_type.__fields__[f.name] = create_cloned_field( + f, cloned_types=cloned_types + ) + new_field = create_model_field(name=field.name, type_=use_type) + new_field.has_alias = field.has_alias # type: ignore[attr-defined] + new_field.alias = field.alias # type: ignore[misc] + new_field.class_validators = field.class_validators # type: ignore[attr-defined] + new_field.default = field.default # type: ignore[misc] + new_field.required = field.required # type: ignore[misc] + new_field.model_config = field.model_config # type: ignore[attr-defined] + new_field.field_info = field.field_info + new_field.allow_none = field.allow_none # type: ignore[attr-defined] + new_field.validate_always = field.validate_always # type: ignore[attr-defined] + if field.sub_fields: # type: ignore[attr-defined] + new_field.sub_fields = [ # type: ignore[attr-defined] + create_cloned_field(sub_field, cloned_types=cloned_types) + for sub_field in field.sub_fields # type: ignore[attr-defined] + ] + if field.key_field: # type: ignore[attr-defined] + new_field.key_field = create_cloned_field( # type: ignore[attr-defined] + field.key_field, # type: ignore[attr-defined] + cloned_types=cloned_types, + ) + new_field.validators = field.validators # type: ignore[attr-defined] + new_field.pre_validators = field.pre_validators # type: ignore[attr-defined] + new_field.post_validators = field.post_validators # type: ignore[attr-defined] + new_field.parse_json = field.parse_json # type: ignore[attr-defined] + new_field.shape = field.shape # type: ignore[attr-defined] + new_field.populate_validators() # type: ignore[attr-defined] + return new_field + + +def generate_operation_id_for_path( + *, name: str, path: str, method: str +) -> str: # pragma: nocover + warnings.warn( + "fastapi.utils.generate_operation_id_for_path() was deprecated, " + "it is not used internally, and will be removed soon", + DeprecationWarning, + stacklevel=2, + ) + operation_id = f"{name}{path}" + operation_id = re.sub(r"\W", "_", operation_id) + operation_id = f"{operation_id}_{method.lower()}" + return operation_id + + +def generate_unique_id(route: "APIRoute") -> str: + operation_id = f"{route.name}{route.path_format}" + operation_id = re.sub(r"\W", "_", operation_id) + assert route.methods + operation_id = f"{operation_id}_{list(route.methods)[0].lower()}" + return operation_id + + +def deep_dict_update(main_dict: Dict[Any, Any], update_dict: Dict[Any, Any]) -> None: + for key, value in update_dict.items(): + if ( + key in main_dict + and isinstance(main_dict[key], dict) + and isinstance(value, dict) + ): + deep_dict_update(main_dict[key], value) + elif ( + key in main_dict + and isinstance(main_dict[key], list) + and isinstance(update_dict[key], list) + ): + main_dict[key] = main_dict[key] + update_dict[key] + else: + main_dict[key] = value + + +def get_value_or_default( + first_item: Union[DefaultPlaceholder, DefaultType], + *extra_items: Union[DefaultPlaceholder, DefaultType], +) -> Union[DefaultPlaceholder, DefaultType]: + """ + Pass items or `DefaultPlaceholder`s by descending priority. + + The first one to _not_ be a `DefaultPlaceholder` will be returned. + + Otherwise, the first item (a `DefaultPlaceholder`) will be returned. + """ + items = (first_item,) + extra_items + for item in items: + if not isinstance(item, DefaultPlaceholder): + return item + return first_item diff --git a/venv/Lib/site-packages/fastapi/websockets.py b/venv/Lib/site-packages/fastapi/websockets.py new file mode 100644 index 00000000..55a4ac4a --- /dev/null +++ b/venv/Lib/site-packages/fastapi/websockets.py @@ -0,0 +1,3 @@ +from starlette.websockets import WebSocket as WebSocket # noqa +from starlette.websockets import WebSocketDisconnect as WebSocketDisconnect # noqa +from starlette.websockets import WebSocketState as WebSocketState # noqa diff --git a/venv/Lib/site-packages/frozenlist/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/frozenlist/__pycache__/__init__.cpython-312.pyc index ab7c311393b931c579a446277c1c09fe5791edda..fbfe40ff7fcb70540d316e140bf6aefcf680d52b 100644 GIT binary patch delta 29 jcmca2e?^}6G%qg~0}v!Kd1Or5$oqkbF=q2WrfWO^ey#~B delta 29 jcmca2e?^}6G%qg~0}v>#cgwKZ$oqkbQGfG4rfWO^f1e2w diff --git a/venv/Lib/site-packages/google/protobuf/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/__pycache__/__init__.cpython-312.pyc index 4cec346776e8cf16621a4320b52b050c474e382d..acbff8294b92c1288d988083da17e6f0effabb99 100644 GIT binary patch delta 35 pcmcb}c#)C!G%qg~0}v!Kd1Rza$xkXxi}^lAlzXray762>`Ee3d{fi diff --git a/venv/Lib/site-packages/google/protobuf/__pycache__/descriptor.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/__pycache__/descriptor.cpython-312.pyc index dc4d89f4e328bb74c882d71f65ca87a1c88b3a56..b35453a51df14f51ed17127888997630bcfc11cb 100644 GIT binary patch delta 41 vcmdmfoO%0kX1>$Byj%=GkjUhbp?7&BpBW2ROhHk8Nq$mkTFhoYmdyJA3>giL delta 41 vcmdmfoO%0kX1>$Byj%=GAiCZy!|LotJ~I|B{eq(WlKiC7H2uwfESdKK5$_F{ diff --git a/venv/Lib/site-packages/google/protobuf/__pycache__/descriptor_database.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/__pycache__/descriptor_database.cpython-312.pyc index 005b53da491c1947714fd5d50b5ddf0c5f247fae..02e675cf34699a55785e568f77b017335e7832de 100644 GIT binary patch delta 38 scmaED@!Ep-G%qg~0}v!Kd1Tz#$eYK=6;n`@Uy`3xnijLUmGPMr0O`pL%K!iX delta 38 scmaED@!Ep-G%qg~0}zO=cgrx?$eYK=rC(5#Uy`3xnx?$Byj%=GkjUhb@%r#az8~ydF$G2WCHYCEX)&7xI9^``06I($tpET3 delta 41 wcmeypoB8){X1>$Byj%=GAiCZyW758jd_UN^^b3meOY)OS)ATnBaJ;?>05^#bQ~&?~ diff --git a/venv/Lib/site-packages/google/protobuf/__pycache__/duration_pb2.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/__pycache__/duration_pb2.cpython-312.pyc index 31aaa6b908b5eb35781b28c3fab7c1148fc55890..27ff694c2bf706d59a120b65eff06dc7712857d0 100644 GIT binary patch delta 38 scmey)_nnXTG%qg~0}v!Kd1M%E@~ delta 41 wcmZp;%G7X`iSINoFBbz4h^}|b$ez5B?*W!B<(K3qm8QjPzRjp@3jp2X32B3IOA-3snFB delta 39 tcmexv^4)~*G%qg~0}zO=cgr|0xsi{Dl}o>%D8D2>sWeT0vkGglC;;w}3!4A{ diff --git a/venv/Lib/site-packages/google/protobuf/__pycache__/reflection.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/__pycache__/reflection.cpython-312.pyc index e07ff1886d9153e12e27e2bd9940df3c49f36210..f16340606e3f21a0753bb57c7aa71e5347948070 100644 GIT binary patch delta 37 rcmbQpF_DA!G%qg~0}v!Kd1UsWeT0^G&uTq5%2~4H5tV diff --git a/venv/Lib/site-packages/google/protobuf/__pycache__/text_encoding.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/__pycache__/text_encoding.cpython-312.pyc index 0d4a0aa504c571dc5e5f3628293e4595db714c8b..b0fff9bc200b884b66393a5abe5ce57d7c0f83f1 100644 GIT binary patch delta 38 scmX@Fa9)A;G%qg~0}v!Kd1Ul&1q?`6c;DrD^)jzuC6`W@DVC003#{ B5Iz6^ diff --git a/venv/Lib/site-packages/google/protobuf/__pycache__/timestamp_pb2.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/__pycache__/timestamp_pb2.cpython-312.pyc index c84504dc942f98d76ed6b8c20d8a2e169a696d1d..7643bbb79dee14efcd9d8e42bd7f0545478cd5f7 100644 GIT binary patch delta 38 scmZqVZ{+7a&CAQh00fCl9vL^C@_MpOUdklAIg?F-5dd)|2Ri@& diff --git a/venv/Lib/site-packages/google/protobuf/__pycache__/unknown_fields.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/__pycache__/unknown_fields.cpython-312.pyc index 9f5d95b8828714d0f5754e1bcc7b50bf8a4f2541..3db00309a80dbdf7f63bda7538920e0e5b3b324d 100644 GIT binary patch delta 39 tcmX@2ctnx!G%qg~0}v!Kd1OTLY~;&g=87pO$}h=JDou;o+{Em}3jonD3nl;n delta 39 tcmX@2ctnx!G%qg~0}zO=cgy(6y^$}AnM=Q*D8D2>sWeT0a}%=@F975x3(5ch diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/__init__.cpython-312.pyc index 1dd68a215dd71a5d46c912e3137b65fe1e243477..e1c22b857f0ff705adc2d56c0d5f98a91042dcac 100644 GIT binary patch delta 44 ycmdnXxR;UlG%qg~0}v!Kd1Q!B$xkXxi^}^lAlzXrk|Ntl3J9Pn4>>&f-V3NyA8zv diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/api_implementation.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/api_implementation.cpython-312.pyc index 4d9639755f03f66c903e94a7f868afc1f7e4405a..60f48eefd07d75e11728cf704b080f9ed1b8724d 100644 GIT binary patch delta 48 zcmaDS`A(AWG%qg~0}v!Kd1N>WZ{&NyEF4o%lwXpcRGJo(nOBlpl$V$jvze3SDF*;$ CXb-;t delta 48 zcmaDS`A(AWG%qg~0}zO=cgxr;w2|)xv#@?aQGQ8&QfZogW?o5ZQC?z>{$@^=ryKxx CgAfP+ diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/builder.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/builder.cpython-312.pyc index 6f42d514375b734f5204b91a08feca00685f9c86..931855d8b5b06a553fffcc6c2e4275ccfa278e4d 100644 GIT binary patch delta 47 zcmeCw>eS*r&CAQh00fCl9vN*Lc}-Y_V+xA$OY)OS(_%97N>YpR5_4iUhp=wt2LLu% B4!8gS delta 47 zcmeCw>eS*r&CAQh00g4z-7*9=@|v&;>lYN|m*gjvrs-$qm82HsCFbaF4q@HO4*)EY B4jKRe diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/containers.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/containers.cpython-312.pyc index eba8d290acfe0b23526ef12bcf6c42a59424b587..0c6723329baa3f9b437f44c35e95cfaf90521d18 100644 GIT binary patch delta 50 zcmey_$n>+3iSINoFBbz4Br+3iSINoFBbz4h^}|bm>;&0Z$F!`enC-wNq$mknto{^oZ~ulWIT CV-U6g diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/extension_dict.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/extension_dict.cpython-312.pyc index 910ebb752ae21b36026f313abfdd181f491fe0d6..45d196ce1857ba266c6f969b4184031e1071805a 100644 GIT binary patch delta 47 zcmbR0GS!9mG%qg~0}v!Kd1UzbSCU$kmzbl!*@)$_EC4$K B4ut>! diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/field_mask.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/field_mask.cpython-312.pyc index e9af34a900a22514a99979d671cb4c967fd233c5..89cd011d0354a082cb703e2eb090a4cf0c8b3890 100644 GIT binary patch delta 48 zcmdm)yEB*XG%qg~0}v!Kd1QoXZRFd>Bpg#vlwXpcRGJo(nOBlpl$V$jv-v*LEn@(5 CJ`nN% delta 48 zcmdm)yEB*XG%qg~0}zO=cgv8|+{m|&Nm#$2D8D2>sWeSLGp{7IC@(QbfAf8&TgCu! C!w``G diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/message_listener.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/message_listener.cpython-312.pyc index 01a946a7309535f7d66ebf1d319016dbb232f270..13bd47c23e2a1314fcdf565f6ac7ed6de2704034 100644 GIT binary patch delta 48 zcmew)^ht>CG%qg~0}v!Kd1UZ&Y~*8O7mg_?$}h=JDou;Y%qvMP%1g|N*{sg)%>)2M C-3}iB delta 48 zcmew)^ht>CG%qg~0}zO=cgwiJzLAfOU0A=MD8D2>sWeSLGp{7IC@(Qbf3rHfHxmG1 Cfeya_ diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/python_edition_defaults.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/python_edition_defaults.cpython-312.pyc index 148fec00ac1a4e861a6e43c250ff3fa265caac3b..dcbe5719e408a832886039e76d8c2ee877a504fe 100644 GIT binary patch delta 46 zcmeBR>0seK&CAQh00fCl9vN3R^3G!vjwvY0FUe0TO^eCQD@iTNOU#LxypPcf04>!H A>i_@% delta 46 zcmeBR>0seK&CAQh00g4z-7+q0zbSCU$kmzbkJc^{(}05NzD Az5oCK diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/python_message.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/python_message.cpython-312.pyc index 54f790476d444309ba1e82332b9564121ba1d201..3d82241e0cb3c0860c5b5fcffc4bbc16dfd402d5 100644 GIT binary patch delta 50 zcmZqq$K3LdneQ|&FBbz4BrZ>E5-enC-wNq$mknto@V3 E0I^gOJ^%m! diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/type_checkers.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/type_checkers.cpython-312.pyc index f10e21bec39e9f830f2f024f9844dc7392fc1933..dc37f5b33004b4c973ac0a75c76d7eb0bf7f0c7d 100644 GIT binary patch delta 50 zcmZ25mvO;dM!wU$yj%=GkjUhb@yc!^-)k}9n1Z7GlKiC7w3y7ilGLKS#GIJTJmOQ# E0hinn3jhEB delta 50 zcmZ25mvO;dM!wU$yj%=GAiCZy!`F5r-)k{p{eq(WlKiC7H2uuHlGLKS#2o$2JmOQ# E0f{CMMF0Q* diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/well_known_types.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/well_known_types.cpython-312.pyc index c56b7d67a28d5a9b199a90b3922c28a047d9cb69..529b1d9a76b40c960dc9eddfc9952b825f7b60f7 100644 GIT binary patch delta 50 zcmezIgYm}?M!wU$yj%=GkjUhb@iTfO-)~mon1Z7GlKiC7w3y7ilGLKS#GIJTGHfwr E0N?@=q5uE@ delta 50 zcmezIgYm}?M!wU$yj%=GAiCZy!zpqj-)~l7{eq(WlKiC7H2uuHlGLKS#2o$2GHfwr E0L};z!2kdN diff --git a/venv/Lib/site-packages/google/protobuf/internal/__pycache__/wire_format.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/internal/__pycache__/wire_format.cpython-312.pyc index 478158e8ebfb6f8577f994b8526632e0ff1ffc05..18588d38d2273b352fd0ad0728efbbc9a17500f4 100644 GIT binary patch delta 48 zcmccbaNmLNG%qg~0}v!Kd1Ne+*~rJrCLB{xlwXpcRGJo(nOBlpl$V$jvssPJQVIZK Ch7SM$ delta 48 zcmccbaNmLNG%qg~0}zO=cgt8Wy^)WVO<2F6D8D2>sWeSLGp{7IC@(Qbf3q5!r4#^Y CC=TKP diff --git a/venv/Lib/site-packages/google/protobuf/pyext/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/pyext/__pycache__/__init__.cpython-312.pyc index 8acaef3be3d938712b26080d5f691d3f85de3822..d9239b94bf6d5750b9bb764b731dd84447bd7e7f 100644 GIT binary patch delta 39 tcmdnRxQmhdG%qg~0}v!Kc}(Ok5{M}%$}h=JDou+is7$RWiJ91|3jor83`76` delta 39 tcmdnRxQmhdG%qg~0}zO=cbmvvB%ohVlwXpcRGOw=P?=g$qCc@$7Xa0-3>*Le diff --git a/venv/Lib/site-packages/google/protobuf/pyext/__pycache__/cpp_message.cpython-312.pyc b/venv/Lib/site-packages/google/protobuf/pyext/__pycache__/cpp_message.cpython-312.pyc index 74c5d9d50832a4403c3c22549b3d898dc535437d..e48e123d91bc575b707d740cadbf9a2b2489cbf4 100644 GIT binary patch delta 44 ycmZqSZQzcguLpx{+@_Go$|Gbzcgr|0w2{w`l~I3lENcfN0E5g3AOHXW diff --git a/venv/Lib/site-packages/h11/__pycache__/_connection.cpython-312.pyc b/venv/Lib/site-packages/h11/__pycache__/_connection.cpython-312.pyc index 21f15fe9c0cdcf073cc5f05f9d5dcdedebb80b7c..3af04d3cd6ae8551b9fe1823cbfe0625e184b716 100644 GIT binary patch delta 32 mcmX@Th4J(jM!wU$yj%=GkjUhb(UiTB&y$5QW^)9~=THEm_6fcK delta 32 mcmX@Th4J(jM!wU$yj%=Gps?O8<9)_PK2H`#{ml_9pF;tyt_o!U diff --git a/venv/Lib/site-packages/h11/__pycache__/_events.cpython-312.pyc b/venv/Lib/site-packages/h11/__pycache__/_events.cpython-312.pyc index dd454e9703472d27d16632f44384fc2db4500a98..65cfe71e94f926b93fc830ce9d882337d1cec4e1 100644 GIT binary patch delta 30 kcmbQ0J}aH?G%qg~0}v!Kd1N%|Z{&+)VT{?F!D6Hj0DhMTyZ`_I delta 30 kcmbQ0J}aH?G%qg~0}v>zcgqma+sGHm!l=JFgT+W60Dd6{hX4Qo diff --git a/venv/Lib/site-packages/h11/__pycache__/_headers.cpython-312.pyc b/venv/Lib/site-packages/h11/__pycache__/_headers.cpython-312.pyc index 1c7ef16441105c7335142a9ec9d9abb5ae8e1ff2..b9cdc53ffee2280750ef468067948320807262ab 100644 GIT binary patch delta 30 kcmdmFx5zcgt9#v61f-JEQ*Qo9vO|0Ekft@&Et; diff --git a/venv/Lib/site-packages/h11/__pycache__/_readers.cpython-312.pyc b/venv/Lib/site-packages/h11/__pycache__/_readers.cpython-312.pyc index 84745bbb94b1afe2b2543f80a65e31b3a29ee8eb..95acb44f04846bacf4b7a22cc5c80cc4d70ab750 100644 GIT binary patch delta 30 kcmZ4Gy~>;KG%qg~0}v!Kd1Q1bZR8VWXN=jb!rmqa0C^e*UjP6A delta 30 kcmZ4Gy~>;KG%qg~0}v>zcgyHg+{h=&&Zxgxg}qG<0Di9rp#T5? diff --git a/venv/Lib/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc b/venv/Lib/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc index 2882619716ba842c87d18165bbc3fa55002a4dbd..d27d6e78ba1ce064c75833b23259ded5f7913889 100644 GIT binary patch delta 30 kcmcbhazTafG%qg~0}v!Kd1T0nZseQH#2B-A5z{(;0C|%K@Bjb+ delta 30 kcmcbhazTafG%qg~0}v>zcgtuI*~mAUiBW&^BBpix0E86?lK=n! diff --git a/venv/Lib/site-packages/h11/__pycache__/_state.cpython-312.pyc b/venv/Lib/site-packages/h11/__pycache__/_state.cpython-312.pyc index 1602c623adf9ebb049151ab3da2851037fa6990e..63f583b87b3c1669c50a495d778256daec6ae16a 100644 GIT binary patch delta 30 kcmZp1YH{K_&CAQh00fCl9vL#G8~I+cFve{D!NMa00CSrM&Hw-a delta 30 kcmZp1YH{K_&CAQh00au_-7?l2Z{&N)!l=Lb2Mdo30Dw&hoB#j- diff --git a/venv/Lib/site-packages/h11/__pycache__/_util.cpython-312.pyc b/venv/Lib/site-packages/h11/__pycache__/_util.cpython-312.pyc index 87e3b47026de4bbe956b9805d7d70ae5e9acb112..e51952bca40733eb663405c97f08abcae099cb03 100644 GIT binary patch delta 29 jcmcbwa$kk_G%qg~0}v!Kd1TDr$h(N0F=q1y_Vruzcgv92$h(N0QGfFW_Vruzcgt8ek++#qf8siO#;Cv9f=!wY0DB$>3IG5A diff --git a/venv/Lib/site-packages/httpcore/__pycache__/_api.cpython-312.pyc b/venv/Lib/site-packages/httpcore/__pycache__/_api.cpython-312.pyc index 8f48a618ffa01866abf04483c5b42c24991cffcf..ce5d1d6b88e9a1d6a39566a1939ada562b92b78e 100644 GIT binary patch delta 29 jcmZ24yIz*}G%qg~0}v!Kd1S2E$a|cXF=q2s)>|9^bwUWH delta 29 jcmZ24yIz*}G%qg~0}!aMcgyhF$a|cXQGfGQ)>|9^b~6Z! diff --git a/venv/Lib/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc b/venv/Lib/site-packages/httpcore/__pycache__/_exceptions.cpython-312.pyc index ea6c953a0b48bb23c55425d9d6e578076e528eba..473b886a89181ad5b9c6905af649bf8769af95c0 100644 GIT binary patch delta 29 jcmaDR@l1mEG%qg~0}v!Kd1QRt$eY2;7_+&I`2z<4e(MOQ delta 29 jcmaDR@l1mEG%qg~0}!aMcgt9?kvD^xQGat8^9K$9fOrU+ diff --git a/venv/Lib/site-packages/httpcore/__pycache__/_models.cpython-312.pyc b/venv/Lib/site-packages/httpcore/__pycache__/_models.cpython-312.pyc index e1ef7b1ed274b1439d2381bd846756666d623409..7776d9b2526a75a98c676be85290123bf03c8e22 100644 GIT binary patch delta 32 mcmX@Oh4J7PM!wU$yj%=GkjUhbaocSpUl%K5%;uS_D?$LK9tsu! delta 32 ncmX@Oh4J7PM!wU$yj%=GpuXNMMaTL1t6 diff --git a/venv/Lib/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc b/venv/Lib/site-packages/httpcore/__pycache__/_trace.cpython-312.pyc index fdb518ffd2771e9c0b70a540abde770477e0c57e..b75086a14281b6f864c865ffd6c9bdfa043c1366 100644 GIT binary patch delta 29 jcmcbleMy`5G%qg~0}v!Kd1Tz)$oq_$F=q1@=6iwwgU|_r delta 29 jcmcbleMy`5G%qg~0}!aMcgrZ)$oq_$QGfFn=6iwwge3`E diff --git a/venv/Lib/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc b/venv/Lib/site-packages/httpcore/__pycache__/_utils.cpython-312.pyc index 6bc68b296394a35d4f03641d6d3c721458a152b1..b461dd07665f3d9c18429d8b7b4aaeb702cbe06b 100644 GIT binary patch delta 29 jcmeyx`HPeHG%qg~0}v!Kd1R<<4@Py&CAQh00fCl9vSyH@_u9Hh>1@uuFOl0+04!IR}%om1q+h^ delta 36 qcmeB(>4@Py&CAQh00ipm-7*+A@_u9H(2q|nuFOl;-^|VOR}%obvI@)q diff --git a/venv/Lib/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-312.pyc index 09ebd7edb31771ed398a837642cbb26be5fc8e4a..d123747f5b1336a23e2adac553277f6976e2dc5d 100644 GIT binary patch delta 39 tcmcaGlkvh#M!wU$yj%=GkjUhbVeh(;uY#E)CO)yaGA}u1b04#lCjjKq3$FkG delta 39 tcmcaGlkvh#M!wU$yj%=GpuXNMW47}~z6xdz{rJS<%DiO#&3(*Ho&fT63?Kji diff --git a/venv/Lib/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_async/__pycache__/http11.cpython-312.pyc index 5bd5bfbb308fe825b2ace10bbda9d2e93fec86bd..bde7a8d384d9671b304cd8fb3a441067bc3c49a2 100644 GIT binary patch delta 39 tcmZpg$JjKFk?%AwFBbz4Brw~?76CO)yaGA}u1^KoWtZvflV3-AB{ delta 39 tcmZpg$JjKFk?%AwFBbz4sIPa+urS-mw~?7cKR&UzGA~(w^KoWtZvfc53yS~% diff --git a/venv/Lib/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_async/__pycache__/http2.cpython-312.pyc index ccc28a97d96ff6c4b0145f87d134f188c28f70a6..a79f6995f7dae1cdb15735a60583081cf2ae563a 100644 GIT binary patch delta 39 ucmX^5mGS6TM!wU$yj%=GkjUhbaUp&q-x+3(nE1rv%Dm*5&5xKLmjM6~B@S`` delta 39 ucmX^5mGS6TM!wU$yj%=GpuXNMqak)9-x+2O{rJS<%DiO#&5xKLmjM6~R}MD- diff --git a/venv/Lib/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-312.pyc index 5dbd7164fa6c33178325f73d4ef9734718f4f101..6d1c773f69cbb55052c54a06f6c02522771b6de3 100644 GIT binary patch delta 39 tcmX@m!+4;Fk?%AwFBbz4BruUnU}1;*^Bj?0|4Rd3)KJs diff --git a/venv/Lib/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_async/__pycache__/interfaces.cpython-312.pyc index 61d9d01cce4af149ada1323de4fc64161ace9137..703935ed9e5b2977bdd7dbce92dd0a6e37d3dd39 100644 GIT binary patch delta 36 qcmaE*^Gb*JG%qg~0}v!Kd1QRp$UC2fBPKqvxH2y}X7d)7ZGr&M@eBL_ delta 36 qcmaE*^Gb*JG%qg~0}!aMcgslM$UC2fLq9&TxH2zUfAbcWZGr&I?F)(k diff --git a/venv/Lib/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-312.pyc index 43a2aaf64888a6a4a5f85e1a4d150636df7b551c..86d04f92a724e0c8c0af591809bf5bb80da9e25b 100644 GIT binary patch delta 39 tcmey^%=odHk?%AwFBbz4BrQxF#ztt3^D)! delta 39 tcmey^%=odHk?%AwFBbz4sIPa+5H#D!x0;VbKR&UzGA~(w^FclXV*u`=3-bT~ diff --git a/venv/Lib/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_backends/__pycache__/__init__.cpython-312.pyc index 894437d8ff998f93ff29d1182cd699eb96ede65c..9ae64c6f1cfa61c31aa42213327cb1327086e3d1 100644 GIT binary patch delta 34 ocmdnaxSf&vG%qg~0}v!Kc}(Ok;f{$vv~v4S2+OM!wfk9 delta 40 ucmZ4LywsWRG%qg~0}!aMcgtuI*~mAYiCaHDDKR-aH7})DfAa>WuW|tE^9;QJ diff --git a/venv/Lib/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_backends/__pycache__/auto.cpython-312.pyc index 529d97cfdd99ecec69f220fc8b424eb0b1978514..6b0bcdfa8a017749272e9239ab1368a59cf7d673 100644 GIT binary patch delta 39 tcmew?@>zuUG%qg~0}v!Kd1P$b$a{^6J0?CUF*!RmFQqtU^E;+ib^!2i4DtW~ delta 39 tcmew?@>zuUG%qg~0}!aMcgv{T$a{^6TR%Q2F*!RmFQr(2^E;+ib^!9~4AlSt diff --git a/venv/Lib/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_backends/__pycache__/base.cpython-312.pyc index c77e153c4aaf2e2de43750f7ff7419a6a8b80d5c..403e62ccda0249dfe054691b377e5ea43276d5d0 100644 GIT binary patch delta 40 ucmeBG>s8}B&CAQh00fCl9vSXD8~MtaxMSjz5|gu2^HPdqHcw!x6#xLrnhP-i delta 40 ucmeBG>s8}B&CAQh00ipm-7+3=Z{#ay;?|E(N=(j9%}XiP-#me-RsaCs)eGVP diff --git a/venv/Lib/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_backends/__pycache__/mock.cpython-312.pyc index 9fd9c8d0f88ceae1b573490ed38ede23d31cec62..e1d323c23a52397b635e8a1029ffa9dbc16dc53b 100644 GIT binary patch delta 40 ucmaEA{?wfBG%qg~0}v!Kd1TZGY~<5t;*N<=N=(j9%}Xhc+3dkIR}ui}Vhhy( delta 40 ucmaEA{?wfBG%qg~0}!aMcguLozmZR$iCaHDDKR-aH7})Df3pYETuA`>*9=?$ diff --git a/venv/Lib/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_backends/__pycache__/sync.cpython-312.pyc index a3500bc63f301b79226f2b248558761a3845cbb6..049ed0b8b31e5b6bf3f5be4b82f160cd54ee8595 100644 GIT binary patch delta 40 ucmbOhIW3a!G%qg~0}v!Kd1Oc_Y~(x5${iD*l$e~InwL@>v-t_@CN%)!bPS0A delta 40 ucmbOhIW3a!G%qg~0}!aMcgxU}-^h2Gm0LePDKR-aH7})DfAbU8O=vw1a>w*mn1i3}wG delta 40 ucmez7`puQ^G%qg~0}!aMcgx5T-^e$KiCaHDDKR-aH7})DfAeZ4Zv_AWoeZ1+ diff --git a/venv/Lib/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_sync/__pycache__/__init__.cpython-312.pyc index dbf24c7ae4843764f85c363d3da16f59e2300338..ef09017bbb1c2e7475232f07d160953cba23a543 100644 GIT binary patch delta 35 pcmbQqGn0q+G%qg~0}v!Kd1TDl$UBjVJtn@mGA}u1^HQb~W&of23G)B| delta 35 pcmbQqGn0q+G%qg~0}!aMcgrZ<$UBjVT|d6KGA~(w^HQb~W&oog3F80& diff --git a/venv/Lib/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_sync/__pycache__/connection.cpython-312.pyc index 7dd24cd52a2aacb99940a48ef586c5f2dcc20a75..fb743a67b49963708b5215a1c0b179e0a629fbfb 100644 GIT binary patch delta 36 qcmZ1yxFnG8G%qg~0}v!Kd1UY?Zsfbe%pMb8T$z^~v-unO#4=xH2zUfAdG?%_;!ECJR>p diff --git a/venv/Lib/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-312.pyc index 6084e5c7adfa101cb8ec739fb491c5b2dcdaa7fa..081cfc3c62fb6b891455d65f7bbbc32ad0293fba 100644 GIT binary patch delta 38 scmdl!iE;ZRM!wU$yj%=GkjUhbao>3(UjQ?EOnh-=UUJOlROU;r0NMTv<^TWy delta 38 scmdl!iE;ZRM!wU$yj%=GpuXNM!`f*hUjQ?^etdCdUb6n?ROU;r0Mrxi_@% delta 38 scmaFW#rUd=k?%AwFBbz4sIPa+SYon~Z!R;tetdCdUb6n?P0TwS0qnI5g#Z8m diff --git a/venv/Lib/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_sync/__pycache__/http2.cpython-312.pyc index fa2d17d3322dda023749f5388727f0a8ad34d404..a014fef8f7beabda7bbffa45f9fd97d4d8489307 100644 GIT binary patch delta 38 scmZ2=jd9gAM!wU$yj%=GkjUhbu_JaP-)3g^nE2w#yyTe8CzzAc0q(C1zW@LL delta 38 scmZ2=jd9gAM!wU$yj%=GpuXNMBO`hv-)3fZ{rKX_ykz~&CzzAc0q*Y%ga7~l diff --git a/venv/Lib/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-312.pyc index f0d1fceae96af3ef075a4c1b408de500697be50e..4e668fd94eab2a9d27001663ae8825ca9bc3a39a 100644 GIT binary patch delta 38 scmeBgW9)BZg(My>Mb_%iLtWl#}`-TCF^h2W_@A{0L7pR!~g&Q diff --git a/venv/Lib/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc b/venv/Lib/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-312.pyc index 3036415921b9a720d0d71c39ec3bf4ba09efe509..be87defb9ff64bba79f186d381e821a5790bb8e4 100644 GIT binary patch delta 36 qcmZ3gxm1(yG%qg~0}v!Kd1N#SZsfCOVULL~uFOl0*&M(UDgXed;R%EQ delta 36 qcmZ3gxm1(yG%qg~0}!aMcgy%8u#wN2ge1uFOl0*(}BPO%DLLZwiV4 delta 36 qcmbPGHKB^{G%qg~0}!aMcgxT--N?tv$F3h=T$z`wzgdd!n;rnTVhT$D diff --git a/venv/Lib/site-packages/httpx/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/httpx/__pycache__/__init__.cpython-312.pyc index fca42c0c466608e3550aa19918311736fe86b01b..48d4c896f8eccb2883399631dc1849210c5eb9af 100644 GIT binary patch delta 29 jcmdlhuvdWhG%qg~0}v!Kd1O4<$oqteF=q28CT~^%c$)}@ delta 29 jcmdlhuvdWhG%qg~0}yDhcgv{W$oqteQGfF%CT~^%c}NIl diff --git a/venv/Lib/site-packages/httpx/__pycache__/__version__.cpython-312.pyc b/venv/Lib/site-packages/httpx/__pycache__/__version__.cpython-312.pyc index c25dcaf36c35ef1a72f99a3328da7a47faf379a1..c7618fa76cac0919173f3d8894de452b885842e9 100644 GIT binary patch delta 26 gcmZ3@w3>$Byj%=GkjUhbF_mK@pB@Ke%w}7TyiWk7b_t#U delta 32 mcmZ4em3j47X1>$Byj%=GpuOHLV-v$hK0OXb{mr%t6;MCv9H;I{1fAd1-d diff --git a/venv/Lib/site-packages/httpx/__pycache__/_models.cpython-312.pyc b/venv/Lib/site-packages/httpx/__pycache__/_models.cpython-312.pyc index 18a993384640031cdffdefd1876621d5bc8c20a1..0ebb577954d01e3cf36c07a0ec6bfcdc6232760f 100644 GIT binary patch delta 32 ncmcb5lKJXMX1>$Byj%=GkjUhbF>~`qzMrg&F`GHq&fWt6v}X$? delta 32 ncmcb5lKJXMX1>$Byj%=GpuOHLW6rvbd_P$k^*3{{oxKMDx?l@y diff --git a/venv/Lib/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc b/venv/Lib/site-packages/httpx/__pycache__/_multipart.cpython-312.pyc index d5b9d187dc70f56804a81bc02b551ee8d182d1bf..41f186ece0625c68d91ff571301cd698fb63f6b3 100644 GIT binary patch delta 30 kcmbP{H6x4fG%qg~0}v!Kd1TC2-^e$Kg)wIHLY8s^0E1x&i~s-t delta 30 kcmbP{H6x4fG%qg~0}yDhcgrYN+sHSGg;9U=LY8s^0EZ_CrvLx| diff --git a/venv/Lib/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc b/venv/Lib/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc index 3c882f267122f8f9c9ef2066d378329e29ed963f..be2c4c5a0145c3f97560e773bbf043b02f9e413b 100644 GIT binary patch delta 29 jcmeCS=(gZJ&CAQh00fCl9vLe)@}6O1jM;pP%}^8oawiA{ delta 29 jcmeCS=(gZJ&CAQh00i3W-7?rW@}6O1)ZcuI%}^8oa3}|> diff --git a/venv/Lib/site-packages/httpx/__pycache__/_types.cpython-312.pyc b/venv/Lib/site-packages/httpx/__pycache__/_types.cpython-312.pyc index bc008da750969e3ceb861840f25a2572af89de11..edc7f6666974fd706754bbc203b8c3b7e7c2dd31 100644 GIT binary patch delta 30 kcmaDX`&gFmG%qg~0}v!Kd1SEjY~#deYd0CYkI^#A|> delta 30 kcmaDX`&gFmG%qg~0}yDhcgvW{y^)WbjZuHI6x&G-0D*c3$^ZZW diff --git a/venv/Lib/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc b/venv/Lib/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc index 613f89a66546fb5a35ae88bf020c44aa00e5ab93..79e844b6264c764df9c8c0c1b5513b65f9f35470 100644 GIT binary patch delta 39 tcmX@m!FZs9k?%AwFBbz4Brt6DDv3I7s$t`zd3==nw9a_<~hPk3;^Nn3$g$J diff --git a/venv/Lib/site-packages/httpx/__pycache__/_urls.cpython-312.pyc b/venv/Lib/site-packages/httpx/__pycache__/_urls.cpython-312.pyc index a0033f9a0a6b43522f9cdc279e34fd9fc8aa2620..1a139a53169b8bcd62bde3777e428a10a23ed981 100644 GIT binary patch delta 39 tcmeCa#n^p|k?%AwFBbz4Brt6&j+vav=nMeN%nM=w delta 40 ucmZ3(yoQr7vvX}6vu3S#k^P&0QKz+U;qFB delta 42 wcmeCR?zQGS&CAQh00i3W-7;!LH}ail=GBicDN4*MF32w`Dc0Zoig~dl00jXJzW@LL diff --git a/venv/Lib/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc index 6f903175adecdf88c66e0773ad48f4552e72e685..8923a96126cde0024b8981a5586706cf09d2e89d 100644 GIT binary patch delta 42 wcmbOvH%X4~G%qg~0}v!Kd1M%JZRC?=;*E(fDN4*MF32w`DUR7}!gP-Z0NXSR-2eap delta 42 wcmbOvH%X4~G%qg~0}yDhcgwiVxsgwjiB~_qq$n}3xFEl%q*#Bm3DZ3u0Q43Np#T5? diff --git a/venv/Lib/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc b/venv/Lib/site-packages/httpx/_transports/__pycache__/default.cpython-312.pyc index 2d757e6374d8d3c1db094fe74d7cd3e730cc9eee..67129ca508da40370508efe010672a440d7d57b5 100644 GIT binary patch delta 44 ycmccK%6Pq%k?%AwFBbz4Br?hR4^ delta 44 ycmccK%6Pq%k?%AwFBbz4Xs>t6m~Xa`kCBU4Kfa_WF|W8Fzo?{Gf3pnNZVLb_cn#G6 diff --git a/venv/Lib/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc b/venv/Lib/site-packages/httpx/_transports/__pycache__/mock.cpython-312.pyc index 6b8bb16e5d0e2c8849db56c4b445fb5034109c7b..52482ee05ff84a5299442fbec9e596d589213b6a 100644 GIT binary patch delta 41 vcmZqUZ{z1Z&CAQh00fCl9vQzk@~SiO#>AHtCFT_u*5B;ND6hG%qg~0}v!Kd1T}XZ{(|H;*E(fDN4*MF32w`DUR7Zjp>&-0PD6hG%qg~0}yDhcgwgbw2`lxiB~_qq$n}3xFEl%q*#CRG^StT00k@!y#N3J diff --git a/venv/Lib/site-packages/idna/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/idna/__pycache__/__init__.cpython-312.pyc index b741a48c5b992e00078f2bb2e50b9ea6ef810520..863466ea277fb16de16b497b2df186edf4ed2966 100644 GIT binary patch delta 27 hcmaFN_Lzzcgsjw$ji*AKbem?6aZxg28sXx diff --git a/venv/Lib/site-packages/idna/__pycache__/core.cpython-312.pyc b/venv/Lib/site-packages/idna/__pycache__/core.cpython-312.pyc index f2791514d14adabc854c50a3dc18ef0d9f3e17b4..6f0a4907374d572b5d136fe938657e2eca2bb977 100644 GIT binary patch delta 30 kcmbPRH@A-OG%qg~0}v!Kd1U06Zsfbq%owxz9kaeQ0E$fr^Z)<= delta 30 kcmbPRH@A-OG%qg~0}v>zcgxsrypiudGo$|Icg*_M0Fzezcgx7y$oqkXQGfG47F$*Tc*+P{ diff --git a/venv/Lib/site-packages/idna/__pycache__/package_data.cpython-312.pyc b/venv/Lib/site-packages/idna/__pycache__/package_data.cpython-312.pyc index 9488a73aba8405352674334bb169f2cf53261146..73d556b05680979bebe7f6b409a95016d79a9049 100644 GIT binary patch delta 26 gcmX@cc#M(vG%qg~0}v!Kd1Q!9zcgql+$lJuIKXHN?09eKb!~g&Q diff --git a/venv/Lib/site-packages/jiter/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/jiter/__pycache__/__init__.cpython-312.pyc index fdd55e3433dd0979d3e28acfe5113eea9b2e88c3..7c9b1c50c2b557866f77c911670c87e8d1f77266 100644 GIT binary patch delta 26 gcmX@bbc%`hG%qg~0}v!Kd1Pcyzcgskh$ora6f8x(T0AK?M4FCWD diff --git a/venv/Lib/site-packages/jwt/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/jwt/__pycache__/__init__.cpython-312.pyc index 884231fca1a41e64802719293d5a65d1e77e1bba..e91692ff0310dc7afb4ab09a24e78d90d1afab0e 100644 GIT binary patch delta 28 icmcc5bDxLzG%qg~0}v!Kd1U8~J83F~)3O!4%C60AzIr+W-In delta 30 kcmZpcX_nzT&CAQh00biI-7zGx1Y90AsKSEC2ui delta 26 gcmey#^plDAG%qg~0}zO;cgwJz$oqs*f8wWh0A~jXTL1t6 diff --git a/venv/Lib/site-packages/livekit/agents/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/__pycache__/__init__.cpython-312.pyc index 54718518d779c35afc7625becb693eefe1af3561..ce346dafe720b5736af5334be0e10a6761aac8d3 100644 GIT binary patch delta 36 qcmZ21xmc3-G%qg~0}v!Kd1P$e$UB*xBPKCDHLs*NX7dX6-z)&L=nFUi delta 36 qcmZ21xmc3-G%qg~0}!wtbkE?}$UB*xLq9P+HLs*tfAb3V-z)&D%L diff --git a/venv/Lib/site-packages/livekit/agents/__pycache__/job.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/__pycache__/job.cpython-312.pyc index 6300e88fec21cdbed9eb80eae6bd41696f1cf704..42261acbeb752cc386c371fa8815d7ca7d537eeb 100644 GIT binary patch delta 39 tcmZoW$=G(1k?%AwFBbz4Br$PNIqmI`(N delta 36 qcmeAd?HA=e&CAQh00gWD-81HIPzeCHl?jai diff --git a/venv/Lib/site-packages/livekit/agents/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/__pycache__/version.cpython-312.pyc index d16ced180ee333d69612ca41e46fb77b53efb4ff..59d65bb0e1b74686afa2e271b2778449b4ae3a22 100644 GIT binary patch delta 33 ncmX@lc%G5>G%qg~0}v!Kd1PcvG%qg~0}!wtbkB&K$lK1LpO~JSS5mA$agH$nn0*P@ diff --git a/venv/Lib/site-packages/livekit/agents/__pycache__/worker.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/__pycache__/worker.cpython-312.pyc index 58d20f4eb25b60ed9c6de6c6b89c881b766c474f..9d2f965f334283e0958c8d973fa28b7d2ea1d184 100644 GIT binary patch delta 39 tcmZpj!`wQDneQ|&FBbz4Br~nhi4m delta 40 ucmeBk?sMin&CAQh00gWD-7{D=^49b6=qIM9=9LudC+B49Z=S*XO&9>&9t;)$ diff --git a/venv/Lib/site-packages/livekit/agents/cli/__pycache__/log.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/cli/__pycache__/log.cpython-312.pyc index dff74e148774d5f736470bc9b7916354ef538345..2e8347efbc84f4cd2d7aa27bd37eceb96dd1e842 100644 GIT binary patch delta 41 vcmewz`8$&DG%qg~0}v!Kd1ScAZ{(ZG%oCHCo|;!u9Fv@r8MApkvyUbK4cHAQ delta 41 vcmewz`8$&DG%qg~0}!wtbk7Kq+sHSSnMXe{JvFbSSU))@Q-AY%W*_EwGWG%qg~0}v!Kd1UbOY~%}N;fYC1Pt7YSj!DkRjM<#e@{bPy?vV_3 delta 41 vcmaE>_EwGWG%qg~0}!wtbkA7Iy^$}Jg-1UzJvFbSSU))@Q-5M`4v-x8UP}n4m1D& delta 43 xcmaDA^eTw&G%qg~0}!wtbk7J7-^h24iBCT#-Yj@dkm$y@>e@yHA* delta 41 vcmca;deM~cG%qg~0}!wtbk8`$wUMuZiAO&%JvFbSSU#-Yj@fL;GKCKS+?oqe delta 41 vcmX@AdQ_F~G%qg~0}!wtbkEq%vyo4ng-1UzJvFbSSUP&_ diff --git a/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/inference_proc_lazy_main.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/inference_proc_lazy_main.cpython-312.pyc index b56aa93cfd806b540956ab7edfa6f882fc50c3bd..5eff6ba77f098434242e6e0755a24b4fa58ce88d 100644 GIT binary patch delta 40 ucmbPcJk6N*G%qg~0}v!Kd1Rc}$m_z)6O)*pnpaXBlUa})vpJU8QVam!?+dR0 delta 40 ucmbPcJk6N*G%qg~0}!wtbkFeH$m_z)qo0_bnpaY+pIMNszd4rKQVamt#S0Js diff --git a/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/job_executor.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/job_executor.cpython-312.pyc index be0a74468afecd50b4ac3c4fc143c9c32eea9613..46b94171ab0b7e6136d9915a760a7da3d0cec476 100644 GIT binary patch delta 40 ucmca4dP$V`G%qg~0}v!Kd1QRp$g9T06O)*pnpaXBlUa})v)P_$G6w+arwkzg delta 40 ucmca4dP$V`G%qg~0}!wtbk8`nkynk0M?Wz=HLs*tKeHfNf3rQ)WDWr8Q47uh diff --git a/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/job_proc_executor.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/job_proc_executor.cpython-312.pyc index d140a631f8a24c08d86d6c31bec9757e041ac3b8..e91569fb99d455327572390c069203e829bddc5d 100644 GIT binary patch delta 40 ucmccUf6<@!G%qg~0}v!Kd1O4=$jidc6O)*pnpaXBlUa})vsspXivj@m=M01Z delta 40 ucmccUf6<@!G%qg~0}!wtbk8u^$jidcqo0_bnpaY+pIMNszgd=jivj@b5eu;Z diff --git a/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/job_proc_lazy_main.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/job_proc_lazy_main.cpython-312.pyc index f3173aba8c17733d0932d31b9e6f6fbd437ed709..42a3e544292833857dfc70d1b9c136d9812fbe26 100644 GIT binary patch delta 43 xcmaDef$_}*M!wU$yj%=GkjUhbvD9EApD+tgOk#R!UP*CGW=K diff --git a/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/log_queue.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/log_queue.cpython-312.pyc index 16a901854e5b91a788280e0e2949116c73d3777b..f59fc6964467c458b6682059f1b829585f8a59b3 100644 GIT binary patch delta 40 ucmX@5c}kP_G%qg~0}v!Kd1UO|$m_+#6O)*pnpaXBlUa})vpJb5T?hc|NDL?d delta 40 ucmX@5c}kP_G%qg~0}!wtbkFeJ$m_+#qo0_bnpaY+pIMNszd4yHT?hc?U<;Q3 diff --git a/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/proc_client.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/proc_client.cpython-312.pyc index 5e65567cb52ec9950e82f2f877832fa35d2a7010..87b3e479e4726ee748d044f9fe078c4cec91fe8c 100644 GIT binary patch delta 41 vcmccReaoBgG%qg~0}v!Kd1T0nZ{*v?%oCHCo|;!u9Ftj)9JBcXGnWzo{f-Qm delta 41 vcmccReaoBgG%qg~0}!wtbkC?3+sL<#nMXe{JvFbSSU9o|;!u9Ftj)9JAS$(?ksb3d0PG delta 41 vcmewu_c4y|G%qg~0}!wtbkDdTw~JvFbSSUQ>6G9A> diff --git a/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/proto.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/ipc/__pycache__/proto.cpython-312.pyc index 1115ab5d50dbb1493b2c75e3ebea7fe6c86465ea..b4b51ec83dd44e83f68410a15f95fbf11e88d4f5 100644 GIT binary patch delta 41 vcmcbWc`K9eG%qg~0}v!Kd1PeCY~*{)#uJm6o|;!u9Ftj)9JBc^+g)7%6qgQT delta 41 vcmcbWc`K9eG%qg~0}!wtbkAs%-pKcujYmH*JvFbSSU*Z%jhP(Db^-v!FAG%w delta 40 ucmZ3;w~&wTG%qg~0}!wtbkDfXzLC$KjYmH*JvFbSSU)ExSATLO+X(>Io(s(Y diff --git a/venv/Lib/site-packages/livekit/agents/llm/__pycache__/_strict.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/llm/__pycache__/_strict.cpython-312.pyc index 644fdaffbfec96d55aa8e7d3b9530a9c98ae1ce6..ae8c44084c168631267b766a93631cab840b5d9b 100644 GIT binary patch delta 41 vcmZp+Y_{Y(&CAQh00fCl9vPal8~Oa0cw!RMQ}arSV{&qGV>V|nNlO6$)e#F9 delta 41 vcmZp+Y_{Y(&CAQh00gWD-7}(PHuCu~@#rU}r{*wU;>Tk|ql9mDh-Pj8w diff --git a/venv/Lib/site-packages/livekit/agents/llm/__pycache__/chat_context.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/llm/__pycache__/chat_context.cpython-312.pyc index 0d18be07cb711ab8c06a16eef9aa8dffdbed0c5a..9a3b744340a146a739bb966bf8d81781f43f2a41 100644 GIT binary patch delta 43 xcmZo~VQg<<oZ|NlZ`8D=Ci2$;pk`e3-+<5&#GF4OIXD delta 43 xcmZo~VQg<<oa*PfSnED=F5`$;s8%Y~+(-<%vm5Pt7YSj>*Z%joEC%TBZ*G?!yc4 delta 41 vcmZ3Lxhj+IG%qg~0}!wtbkDGs-^eG$%A=o{o|;!ute=yUtH0TVwM-uX@)`@m diff --git a/venv/Lib/site-packages/livekit/agents/llm/__pycache__/realtime.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/llm/__pycache__/realtime.cpython-312.pyc index d18e1aa656638223b599965c1a23893c25f0ee07..52ca60be282bb4fa43c725e95e580e7ccff19dc2 100644 GIT binary patch delta 40 ucmbQ^ILDFqG%qg~0}v!Kd1M^g$orC+CnhmHHLs*NCMPF1W-}AZEExdtkZ>O&CAQh00fCl9vN$8H}b`?@Wdphr{SX#%!)&nW_c=@DmJ^ delta 41 vcmeAT>kZ>O&CAQh00gWD-7_}IY~+h$;n7b_Pt7YS*3Zew)!$sfGF1%#^ok5| diff --git a/venv/Lib/site-packages/livekit/agents/llm/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/llm/__pycache__/utils.cpython-312.pyc index b6fcf74f4553f9ef2b54d74519e84f5c07366951..0045216c0d8fd6289c31757aead8962607fc8ced 100644 GIT binary patch delta 41 vcmaD?`L2@hG%qg~0}v!Kd1UmPZsf~n=ZQ&7Pt7YSj>*Z%joIAEo@xpJ8T}2M delta 41 vcmaD?`L2@hG%qg~0}!wtbkATn*~pjA&ZD20o|;!ute=yUtG~IEJ=GKd5mXHB diff --git a/venv/Lib/site-packages/livekit/agents/metrics/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/metrics/__pycache__/__init__.cpython-312.pyc index 950f1a1be1f466fff1d88d40c704a159f8ad87b0..491c67056946a6b65dda8349e4b4e393868b797e 100644 GIT binary patch delta 43 xcmbQvHl2<4G%qg~0}v!Kd1Q2NTvIso|54Eq28 diff --git a/venv/Lib/site-packages/livekit/agents/metrics/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/metrics/__pycache__/base.cpython-312.pyc index fde7d3ecbf36f5451bb9f8b729777ebce578ba1b..61e21049fb5c2813c34c656b3c504cb7c18ab964 100644 GIT binary patch delta 45 zcmdm?xI>ZeG%qg~0}v!Kd1UDGZRGP|7KlkqPt7YSj>%0eDauSPj@g{W?8gfL6ABF` delta 45 zcmdm?xI>ZeG%qg~0}!wtbkEqtyOGa_SwKHAJvFbSSU)$lq$o4FSbuXCvmY-2C6Nt- diff --git a/venv/Lib/site-packages/livekit/agents/metrics/__pycache__/usage_collector.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/metrics/__pycache__/usage_collector.cpython-312.pyc index bcc6d70c67b3f0a01a9726db18f49c752936c495..b5e28dae27e0fbcf8bd87929d9cc3bd1976e3151 100644 GIT binary patch delta 44 ycmbOxF-?N^G%qg~0}v!Kd1SoZ$Q#8Z5R;gmnpaXBlbc#nl$l%{v$>pUJ|_Sb4-Mo1 delta 44 ycmbOxF-?N^G%qg~0}!wtbk8`lkvED-KtC}(HLs*tKR30cC^NZOe{(t0d`4Gh!( diff --git a/venv/Lib/site-packages/livekit/agents/stt/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/stt/__pycache__/__init__.cpython-312.pyc index e95ea2c11bbe3d6782d25f33d54ebf1116a603a5..d05969f9bcc47b2f0f8d8424c26036a5b1b3e552 100644 GIT binary patch delta 39 tcmZo=Z)N8_&CAQh00fCl9vQ|Pd9N|?#3ZJt=9Lu36ql65On%Qa4FJN`3&0CmHx&i<@L=QOt delta 43 ycmex6iSh3wM!wU$yj%=Gz|_j7dyS%_}L6Dap@H&C9GxjhURmGywo0R}LBg delta 44 ycmeyt`h%7CG%qg~0}!wtbkFeG$m_)ob5Mr&G%qg~0}v!Kd1SoV$g9sG7?YTunpaXBQ<9&ZnwMFX8nfA#;|nVQFqaOz delta 45 zcmX>ob5Mr&G%qg~0}!wtbkCT(kyoEXP(Lv}HLs*tza&39H7~O&Re!TD#}`%rE9VYK diff --git a/venv/Lib/site-packages/livekit/agents/tokenize/__pycache__/_basic_word.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/tokenize/__pycache__/_basic_word.cpython-312.pyc index 8107019ef32f80fae82e443f93e2d629aebc202a..44d8d0418a4a6d2c3072ff4f9eb320f6892bd7ca 100644 GIT binary patch delta 45 zcmew)_(_oWG%qg~0}v!Kd1UP0$h(bIFeWiQHLs*NrX)W*H7~O&HD>b_Ryk$>Mja0e delta 45 zcmew)_(_oWG%qg~0}!wtbkC^Y$h(bIP(Lv}HLs*tza&39H7~O&Re$ppRyk$>LlF+9 diff --git a/venv/Lib/site-packages/livekit/agents/tokenize/__pycache__/basic.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/tokenize/__pycache__/basic.cpython-312.pyc index e9571349ca156485a85258386053169b3ca589a1..bc07536b3e5db857e40729b46608aefec4026e1a 100644 GIT binary patch delta 45 zcmX@4dPtS`G%qg~0}v!Kd1S2K$jiwr7?YTunpaXBQ<9&ZnwMFX8naoQc{V=)CtMBc delta 45 zcmX@4dPtS`G%qg~0}!wtbkDHf$jiwrsGpdgnpaY+Uy`4lnwMFXs=ryCc{V=)9}o>y diff --git a/venv/Lib/site-packages/livekit/agents/tokenize/__pycache__/token_stream.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/tokenize/__pycache__/token_stream.cpython-312.pyc index cad51c1cdff6339dc37321e6409f6824edb82463..1de284165733172b06ad418e719cb47620bba195 100644 GIT binary patch delta 45 zcmaE0^uUPsG%qg~0}v!Kd1Tz&$g9O77?YTunpaXBQ<9&ZnwMFX8nfAhMM4w+J?aiM delta 45 zcmaE0^uUPsG%qg~0}!wtbkFeJ$g9O7sGpdgnpaY+Uy`4lnwMFXs=wKTMM4w+GL8*| diff --git a/venv/Lib/site-packages/livekit/agents/tokenize/__pycache__/tokenizer.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/tokenize/__pycache__/tokenizer.cpython-312.pyc index 0a869612cb7157c76a9bab665b087189be97cc06..df4cd40b91caf24acc21c297aa14aab7b0b23386 100644 GIT binary patch delta 52 zcmZ3iyI7a^G%qg~0}v!Kd1UO~$Xmk5cx!VLqd%iyOk#R!UP*CGNq%-}US?Hl%;rZ- G2ZaHb^$~gi delta 52 zcmZ3iyI7a^G%qg~0}!wtbk7Lh$Xmk5_-k_$qd%jdeqwrRUP-ZjNq%-}US?IQ{^mza G2ZaHX{}BxU diff --git a/venv/Lib/site-packages/livekit/agents/tokenize/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/tokenize/__pycache__/utils.cpython-312.pyc index 5665c8b44bbea511711a2d97f4393de2260d55af..861bad2cf65fc7a4b453f917175c81242e726aee 100644 GIT binary patch delta 46 zcmbOvJxQAHG%qg~0}v!Kd1T0NZRG1_6pTqsPt7YSjw#8{PR+}#N{!jPitz#e5Ok#R!UP*CG2@r4QWSNl-04DMc_5c6? delta 43 wcmZ2@pK;-RM!wU$yj%=Gz?$al0``l0QK+;6aWAK diff --git a/venv/Lib/site-packages/livekit/agents/utils/__pycache__/connection_pool.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/__pycache__/connection_pool.cpython-312.pyc index cb28c0b0b7fa1a9e50f7737be5c2d5853317c5db..1ac35421d72edeb5884f5bc35614e0c5d8a6b0e3 100644 GIT binary patch delta 42 wcmbQ@GR1}WG%qg~0}v!Kd1QRu$a{s2FD5ZPHLs*NrnDq8r#NQwdp1>R0256P3IG5A delta 42 wcmbQ@GR1}WG%qg~0}!wtbkA_!$a{s2Pd_m|HLs*tzqBMXr&xdUdp1>R00qYlGXMYp diff --git a/venv/Lib/site-packages/livekit/agents/utils/__pycache__/exp_filter.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/__pycache__/exp_filter.cpython-312.pyc index 60cf5e984328193ffe9d8b93ae083f15faaec891..db5e3a61fffcd26440b24c725f171f93a60942e7 100644 GIT binary patch delta 42 wcmey(`n+a delta 42 wcmey(`VYH~;_u diff --git a/venv/Lib/site-packages/livekit/agents/utils/__pycache__/http_context.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/__pycache__/http_context.cpython-312.pyc index f2ade4c57e53fa59de8f0e7f92c87c4670fa4b28..ebf970eb8f31d5640fea38187e60acd73a7f9824 100644 GIT binary patch delta 43 xcmdlYvPFdNG%qg~0}v!Kd1Pp?Z{)LK=8H*8Pt7YSjwvn4%qfo99Kn2t4FK@d43hu= delta 43 xcmdlYvPFdNG%qg~0}!wtbkF$6wvo?n+a diff --git a/venv/Lib/site-packages/livekit/agents/utils/__pycache__/moving_average.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/__pycache__/moving_average.cpython-312.pyc index 20cd2906c50131c4fa1a1abac25cd5298cce92d1..14651dc10382a7a53128857aeb1befcbcf04b5b4 100644 GIT binary patch delta 43 xcmX@Ze}qbX17)&Kwi delta 42 wcmX>qbX17hnD00)%}g8%>k diff --git a/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/__init__.cpython-312.pyc index 09229118d731bc151f7d5821949471b6d844f8de..c7220c4f48536f4aecac467ea23ad795670d7054 100644 GIT binary patch delta 45 zcmcb}evzH`G%qg~0}v!Kd1PpA>qunXfXZ{&+&5{gMoPt7YSjwvn4%qfmZ%*>D3T*dT35dc-8 B50n4^ delta 47 zcmaFm@ydhmG%qg~0}!wtbkCS5w2?20Nk~62JvFbSSiiI+GpATTF*9F(a~0DEMF3$$ B503x< diff --git a/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/debug.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/debug.cpython-312.pyc index c6f4fd2f5685f8b5555bed2285b0b79f6ce2e2a3..baeb79097539f593ded4195f187b55e379582d2e 100644 GIT binary patch delta 46 zcmbQmHH(Y)G%qg~0}v!Kd1TaYHLs*tzqBMXr&vERGhctR4D&xm05Yl$ AYXATM diff --git a/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/duplex_unix.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/duplex_unix.cpython-312.pyc index 069bf7b11c5c0f2741be7e2f465c3e174f322bcb..4b994df53f3286ad2ee002fcc630fd9db62e9e68 100644 GIT binary patch delta 47 zcmZ2%wAhI6G%qg~0}v!Kd1T1*ZshA`6pBeqPt7YSjwvn4%qfmZ%*>D3yqd8>8~`*U B4vqi- delta 47 zcmZ2%wAhI6G%qg~0}!wtbkA7DvyrcxQAj^AJvFbSSiiI+GpATTF*9F(^J>NlaR5f_ B4#ofg diff --git a/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/interval.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/interval.cpython-312.pyc index 6f9b3987ec81289529235aeb97c04dde4d8d2349..55e103bc84d1ef1c3d7cc1d69edd0cc7cefb9fcc 100644 GIT binary patch delta 46 zcmdlWu|b0OG%qg~0}v!Kd1PGL$m`E26qA^qnpaXBQ(BUlQyi0+nIE$`kMR%}05|Ur A+yDRo delta 46 zcmdlWu|b0OG%qg~0}!wtbkCT(k=LJ5NIx+>HLs*tzqBMXr&vERGhcsm9^)Y{05m8L ARR910 diff --git a/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/itertools.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/itertools.cpython-312.pyc index a8ba47045356acdb1ee5787e335e339c361317ad..52dc640d7011b3cba6f6bbb62808607474a61298 100644 GIT binary patch delta 47 zcmaE$^FW91G%qg~0}v!Kd1N?qZ{(ZIBovdFo|;!u98+47nNu8-n3*55c{9^mVE|2I B4`BcR delta 47 zcmaE$^FW91G%qg~0}!wtbkDfYwUKW!laPL5dTL%tv3_YuW=^qwVrIVn=FLoNg#ltJ B52^qF diff --git a/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/sleep.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/sleep.cpython-312.pyc index 393fff3600fa595fc1d1c8d26b54518cc0724c93..0c4b37ed7cdacb0415b6e309473120a20f6d8363 100644 GIT binary patch delta 46 zcmX>jeMXx1G%qg~0}v!Kd1P$g$XmxK6qA^qnpaXBQ(BUlQyi0+nIE%xE~7pV07M=R A%m4rY delta 46 zcmX>jeMXx1G%qg~0}!wtbk8W>$XmxKq@S3cnpaY+Us{rxQ>>qunXkWjE~7pV06wG+ AHUIzs diff --git a/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/task_set.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/task_set.cpython-312.pyc index 3526c6f094dc2d6dabf855a90140fd67205e4687..b8ce369754294bf8dd8854b4e694128af9494259 100644 GIT binary patch delta 46 zcmaFJ|B#>eG%qg~0}v!Kd1Ul%eG%qg~0}!wtbkE4!$h(k9NIx+>HLs*tzqBMXr&vERGhcu60VYLO07YmH Ab^rhX diff --git a/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/utils.cpython-312.pyc index 1822030b454f80157dd827ed4e9d40ffb8339b10..56c576731526031fd9d88ebf3677f6528ebfbfb3 100644 GIT binary patch delta 47 zcmcb?dxMwnG%qg~0}v!Kd1UZ1Z{)kkEEJQNo|;!u98+47nNu8-n3*55`6KglCICPr B4}1Us delta 47 zcmcb?dxMwnG%qg~0}!wtbkBIlw2|*3vygsbdTL%tv3_YuW=^qwVrIVn=8w$JnE+h@ B5DEYQ diff --git a/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/wait_group.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/aio/__pycache__/wait_group.cpython-312.pyc index a91b5a83cf41717c4b4de050dd6e8a0b749fd29e..f903c2433061024b84b53b051d98ba0d6d7b6b98 100644 GIT binary patch delta 46 zcmaFB`+%4CG%qg~0}v!Kd1O4_$ScYu6qA^qnpaXBQ(BUlQyi0+nIE&+glP>606>Ng AtpET3 delta 46 zcmaFB`+%4CG%qg~0}!wtbk8`skyn&SNIx+>HLs*tzqBMXr&vERGhctR3DX)D06$s| AJpcdz diff --git a/venv/Lib/site-packages/livekit/agents/utils/codecs/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/codecs/__pycache__/__init__.cpython-312.pyc index 91f85ea1531380224b4932f5236491194e47fcf7..150a6109cbc0852575bccfc693d2c5e4394118a5 100644 GIT binary patch delta 48 zcmZo?X=mX*&CAQh00fCl9vQhCdE*&HV-nL-^Gb?iN=q_xier-VQ&N+QVL;eB=9LudmzHGa6zeDFr=%tq>rZZEYy$u_ CP!5Rz diff --git a/venv/Lib/site-packages/livekit/agents/utils/codecs/__pycache__/decoder.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/codecs/__pycache__/decoder.cpython-312.pyc index 150d741a8a1d49e944b10753bdb8bb8631a14b11..2ee1a0027b6d57be0538fab5122f1c83c1bca225 100644 GIT binary patch delta 50 zcmbP|Jtdp(G%qg~0}v!Kd1QQ1-^jO=Su`dwJvFbSIHt5DGp9HvIX@*exj1I?3Fb3~ E0F|>5wEzGB delta 50 zcmbP|Jtdp(G%qg~0}!wtbkBIAwvlfsv#5SzdTL%tv3_YuW=^qwa(+r`a3QUCw| diff --git a/venv/Lib/site-packages/livekit/agents/utils/hw/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/hw/__pycache__/__init__.cpython-312.pyc index a16bfc69b3ab446446b17ed097dcda0d710cf393..4109e73c2be12fc42c62ffbf7a469201777e075e 100644 GIT binary patch delta 44 ycmdnXvX_PTG%qg~0}v!Kd1O>>{8pLoG%qg~0}v!Kd1NSXZ{*`*5{yYqPt7YSjwvn4%qfn^D395!$#jGt04$RY A>i_@% delta 46 zcmaE>{8pLoG%qg~0}!wtbk8`$wULjDNl-sAJvFbSSiiI+GpATTqg;QpCesmq07A45 AL;wH) diff --git a/venv/Lib/site-packages/livekit/agents/utils/images/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/images/__pycache__/__init__.cpython-312.pyc index 544ec851b058af340d4015241ddb66fbb935eb3e..cfd7ba6d678c2a7c7d4f8bc480cb53effca81ce4 100644 GIT binary patch delta 48 zcmZo;X=C9%&CAQh00fCl9vP(@c@r2#V-nL-^Gb?iN=q_xieoZ!f!yMl$xVzc05?Go A00000 delta 48 zcmZo;X=C9%&CAQh00gWD-7}&$@+L5f>L;eB=9LudmzHGa6zgZ^0=dQdlbaY@05&)d AlmGw# diff --git a/venv/Lib/site-packages/livekit/agents/utils/images/__pycache__/image.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/utils/images/__pycache__/image.cpython-312.pyc index 39ef8fa7e1fcfac49413ed7bfb750ea2ada70d1f..b9b405c21a3d719cb309197498c59946d3de8de1 100644 GIT binary patch delta 50 zcmeA*>owy$&CAQh00fCl9vRkB8~G%eMPm}vQ}arSV@gXhbBbd!bAjCAn9VlK7sUZn C#t%;b delta 50 zcmeA*>owy$&CAQh00gWD-7~r*H}Xj`i|Qw)r{z9^f<`nB^<^s9J`kQT-FNy;I DU;+&6M!wU$yj%=GkjUhbQ53h4Pn(4=CNVuVucSDpEI%_jHD&6M!wU$yj%=Gz%M!wU$yj%=GkjUhbvEFVYpBgh?Ok#R!UP*CGS$<}6YRqOQ=E(s7KUEHO delta 45 zcmcb*obl>%M!wU$yj%=Gzy7Pt7YSjw#E}Oiqp2Y|i>l6ae%v42=K) delta 43 xcmZ2#w$zO8G%qg~0}!wtbkFD%+{h=*%BP>0o|;!utY4O&nVhP>*_`#AC;$Q^495Tf diff --git a/venv/Lib/site-packages/livekit/agents/voice/__pycache__/generation.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/voice/__pycache__/generation.cpython-312.pyc index f00184a3f3efe8ec337c0434db4c3219bc6c6987..3d5bd03d3c2ceafffd5343334bb86f231bc2804f 100644 GIT binary patch delta 45 zcmbP!k#YJ(M!wU$yj%=GkjUhbAs4cd?-(mzOk#R!UP*CGS$<}6YRu+GtXq=+JZBF| delta 45 zcmbP!k#YJ(M!wU$yj%=GzjzGJL>`ibeOc_qdAW%-%Osrs8Av2INQ08Yja AumAu6 diff --git a/venv/Lib/site-packages/livekit/agents/voice/__pycache__/io.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/voice/__pycache__/io.cpython-312.pyc index d11bfa0df08da81b3036af1b68d77150b1083a84..4a1bbdbedaffeb8e449a8c0565463f8445e141ef 100644 GIT binary patch delta 45 zcmbO*k#WLAM!wU$yj%=GkjUhban^7npClV!Ok#R!UP*CGS$<}6YRqO+wrD2+Akz(Y delta 45 zcmbO*k#WLAM!wU$yj%=GzwxG%qg~0}v!Kd1QRt$ZNsE7n7KtnpaXBQo02p5lBme*a delta 42 wcmaE4^T>wxG%qg~0}!wtbkB(2$ZNsEr=OUfnpaY+UzVSloT|S$n1x>o01f#JZ2$lO diff --git a/venv/Lib/site-packages/livekit/agents/voice/avatar/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/voice/avatar/__pycache__/__init__.cpython-312.pyc index 5cff87d919cc5e49295b26d91575af775ef0733e..4f6c21044425eb3064307a5263bb897d6b562bb0 100644 GIT binary patch delta 48 zcmbQjHieD%G%qg~0}v!Kd1RDrCK{8No|;!u98;E`nVcGvSe96lSQNAQA)B;1 E0HXsDEdT%j delta 50 zcmewp{U@65G%qg~0}!wtbk8VJ+{m|&O;kTIJvFbSSidYkGdWd1u`ID9u}FXOLpEu3 E0I8D@{Qv*} diff --git a/venv/Lib/site-packages/livekit/agents/voice/avatar/__pycache__/_queue_io.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/voice/avatar/__pycache__/_queue_io.cpython-312.pyc index 0654185d3caed0bc1b49c5535aa5d95848d32a56..4ccc7c2e252aa554295e8cff57727250d5d36fff 100644 GIT binary patch delta 49 zcmX>neNLM9G%qg~0}v!Kd1Q2LneNLM9G%qg~0}!wtbkFeJ$orL9R6j92HLs*tzbrp9IaNQgEU_f9NPn|9%XUrx Db;b|9 diff --git a/venv/Lib/site-packages/livekit/agents/voice/avatar/__pycache__/_runner.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/voice/avatar/__pycache__/_runner.cpython-312.pyc index e0a579909f7e60763c403d5b1fd5622c03e36913..d563458c10baf221891310a8a87f91f92b9dece0 100644 GIT binary patch delta 50 zcmcZ@dNGvmG%qg~0}v!Kd1M4gZ{(ZLBpQ>Lo|;!u98;E`nVcGvSe96lSQNAQ5EH)! E0E)U0asU7T delta 50 zcmcZ@dNGvmG%qg~0}!wtbkCS7wUKW=lc;`TdTL%tv3^;8W^$^2Vp(EIVv+vlLrnY{ E0F|r|WB>pF diff --git a/venv/Lib/site-packages/livekit/agents/voice/avatar/__pycache__/_types.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/voice/avatar/__pycache__/_types.cpython-312.pyc index c12bbf3c62de14a0747ce19447414b943bf1723d..538a258ef8f95543ef25dc526fff7310b6d42c14 100644 GIT binary patch delta 49 zcmca9a#Mu&G%qg~0}v!Kd1NGR4 DNx diff --git a/venv/Lib/site-packages/livekit/agents/voice/room_io/__pycache__/_input.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/voice/room_io/__pycache__/_input.cpython-312.pyc index 4f65bb26f924e4d62b864dce051b68fa42c9ba1e..7a19f8adf4d7863aadd906530844844ca2f94c12 100644 GIT binary patch delta 51 zcmdm4v$KZpG%qg~0}v!Kd1SoP*~qt@T`VRsJvFbSIHoK=GdVS;C_g_pJ~KaN^KJGx FGXTB?5={UA delta 51 zcmdm4v$KZpG%qg~0}!wtbkA6)y^(J_yO@4rdTL%tv3^;8W^$^2QGR}Id}hA>=G*LX FW&pQr5xM{X diff --git a/venv/Lib/site-packages/livekit/agents/voice/room_io/__pycache__/_output.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/voice/room_io/__pycache__/_output.cpython-312.pyc index 513757c6f653382428c32e89ad89909aeb886388..f8a5232993e32a5094fb29e1f4574c89f882445d 100644 GIT binary patch delta 53 zcmZ3rgK^akM!wU$yj%=GkjUhb@xf*z9}k;YOk#R!UP*CGS$<}6YD`gner|kbe#~YA HwqKzDz=0AT delta 53 zcmZ3rgK^akM!wU$yj%=GzGR<`&CAQh00fCl9vM9n8~Ku%#9|WDQ}arSW6JU~lT%}g^7C`!GxK9Mw==aX F0|0-x5QP8$ delta 51 zcmeD4>GR<`&CAQh00gWD-7{W_Z{$m664OsiPt7YS)-TJ?OitA=%FoY@&&=1~+|Jal F3;>P!5RU)= diff --git a/venv/Lib/site-packages/livekit/agents/voice/room_io/__pycache__/room_io.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/voice/room_io/__pycache__/room_io.cpython-312.pyc index b84ef19b0a6fc4c2d610843f75309a2e570be17a..ed66c5826619cb2183ac70930e6a94f3876ed3b4 100644 GIT binary patch delta 53 zcmZ3snQ_@>M!wU$yj%=GkjUhbvBhO0-)&a0n8ftdyprOWvi!{C)R?0D{M`7={Fu%E IS(gU`0MN1%9{>OV delta 53 zcmZ3snQ_@>M!wU$yj%=GziAhXP%_}L6Da+4HPK_xkO3W)xF3Kz@$;{7- JnY@az2LQt>5}W`4 delta 55 zcmdnSvWRt LPk-|*CKr7G0Yno* diff --git a/venv/Lib/site-packages/livekit/agents/voice/transcription/__pycache__/_utils.cpython-312.pyc b/venv/Lib/site-packages/livekit/agents/voice/transcription/__pycache__/_utils.cpython-312.pyc index fca0e85041277e7596cb1fdb7dcdaccbf91c7d01..be4639bdff1ff3343183a11e3190236bde70dd23 100644 GIT binary patch delta 56 zcmbQhGl7TqG%qg~0}v!Kd1Or9$Q#Wp6O)*pnpaXBQ NGe0k8b2dwOF#t+O6tMsR delta 59 zcmX@~p7GFoM!wU$yj%=GzL(Ut>TkAZa$*4hg6aq8 diff --git a/venv/Lib/site-packages/livekit/api/__pycache__/access_token.cpython-312.pyc b/venv/Lib/site-packages/livekit/api/__pycache__/access_token.cpython-312.pyc index a880b59fd438722713de14fbb9be8e78f7e740fc..54feeb67566212ea4ece93fa73d5e963f09a1ecc 100644 GIT binary patch delta 34 ocmX>eb3BIcG%qg~0}v!Kd1O>7Y~eb3BIcG%qg~0}xoRcgv`i-^j$or0&H72njGiDQuAO`@6xd^=g delta 32 mcmbOzF;Rl|G%qg~0}xoRcgt9`k@p=ltA1iZrv4@tK@I?neF&rg diff --git a/venv/Lib/site-packages/livekit/api/__pycache__/livekit_api.cpython-312.pyc b/venv/Lib/site-packages/livekit/api/__pycache__/livekit_api.cpython-312.pyc index 7e39cd879d8a2c421d9c7f1db2f4be6f79441229..91f9b19852055ed80a4adfd2f2d8d682b4e624e0 100644 GIT binary patch delta 33 ncmaE)@koRBG%qg~0}v!Kd1P$f$orI&H72njGiLL5&TK9KtHKJR delta 33 ncmaE)@koRBG%qg~0}xoRcgt|y$orI&RX?#HQ-AY!&TK9KtIY~u diff --git a/venv/Lib/site-packages/livekit/api/__pycache__/room_service.cpython-312.pyc b/venv/Lib/site-packages/livekit/api/__pycache__/room_service.cpython-312.pyc index 5b3511492ad46a340c25a61f92ca979e21581575..6596b8b784e22d1bd4c82e1641e10105f3c8112b 100644 GIT binary patch delta 34 ocmdmiYdq`P0!3Lj!8*PEl4j)%#GQ+l39@n06A+8 AasU7T delta 46 zcmX@beTtj+G%qg~0}$lza?9}B$lJv%q+gIznx2_gte=vaT996pn5(~eC9@(E07TCY Ae*gdg diff --git a/venv/Lib/site-packages/livekit/plugins/deepgram/__pycache__/_utils.cpython-312.pyc b/venv/Lib/site-packages/livekit/plugins/deepgram/__pycache__/_utils.cpython-312.pyc index f976ea7d0b42abd37d81b026eeb21b58e2f262aa..86774e5d729442fdc65bad9b8cbfb346a9199c23 100644 GIT binary patch delta 54 zcmbOsHA9N;G%qg~0}v!Kd1M%IY~(w|EEH3aQ<|QcR~(a)np%)vl$aZ{`4#gDHpW|< JCv&wj0RX0-5vTwF delta 54 zcmbOsHA9N;G%qg~0}$lza?AM1zLD<~vygs4PHB2(Ua@{kYHC4xQDUzC=2y%s*cg9p Jp3K$C1OV4T63YMp diff --git a/venv/Lib/site-packages/livekit/plugins/deepgram/__pycache__/log.cpython-312.pyc b/venv/Lib/site-packages/livekit/plugins/deepgram/__pycache__/log.cpython-312.pyc index 0374d1016c2748443715ad4256cd7e52da413824..5b673a69fe359ac9f73b231f592bcac4d54a62b2 100644 GIT binary patch delta 43 xcmdnQw26uLG%qg~0}v!Kd1QD^=Eq09%p| AeEZ@_S+2AL E0DYSg2mk;8 diff --git a/venv/Lib/site-packages/livekit/plugins/deepgram/__pycache__/tts.cpython-312.pyc b/venv/Lib/site-packages/livekit/plugins/deepgram/__pycache__/tts.cpython-312.pyc index 8042c6eb1c2b6f62b6aba5dfb269e016b424d95d..90ac0773dd355669b15050143e7d93bd6befd8a4 100644 GIT binary patch delta 49 zcmeBJ!Pv2ak?%AwFBbz4BrF#sU14psmF diff --git a/venv/Lib/site-packages/livekit/plugins/elevenlabs/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/plugins/elevenlabs/__pycache__/__init__.cpython-312.pyc index 328a6f14a88cef4bdef2fc7678552906b5b5032e..3f4adc5f5c205f6f05f3ba95637d2300426e31d8 100644 GIT binary patch delta 48 zcmey!{gIpZG%qg~0}v!Kd1M^g$UA{qB&HyzG(9t~I3_hGwJbF+Co!owX7fg72POb< C6%Y>q delta 48 zcmey!{gIpZG%qg~0}$lza?9x6$UA{qM86=XG(9t~SU)u^BZ9R Dc8d@r diff --git a/venv/Lib/site-packages/livekit/plugins/elevenlabs/__pycache__/tts.cpython-312.pyc b/venv/Lib/site-packages/livekit/plugins/elevenlabs/__pycache__/tts.cpython-312.pyc index 37b0fed4a8a0a5e56b018d28ea963f7420377453..9519ade645593b7491c12c5e6b759d4558625824 100644 GIT binary patch delta 51 zcmZp=#n^O_kvj@rXZ&@Ju|O3CN(FuEHy7DF{wCaGZ)K` F3;?k05&i%G delta 51 zcmZp=#n^O$ delta 45 zcmcc3c$<;;G%qg~0}$lza?6OE$lETWUyxIpo|#vypPG|emYSE7m{hDkafLAeKo1W( diff --git a/venv/Lib/site-packages/livekit/plugins/groq/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/plugins/groq/__pycache__/__init__.cpython-312.pyc index 6eba53d1b547e790d5aa40e4d550aaa5fda5e393..f254185f953c408fd8aa89d5bfe040fd40545367 100644 GIT binary patch delta 43 xcmeyv^@oe^G%qg~0}v!Kd1R=uZshZ1=8GxFDNWDJD~?Go$}f!BoXRZD1ONr43}gTR delta 43 xcmeyv^@oe^G%qg~0}$A*cgy&}vXRe|nNPnUr!+k?uUJ35D8EpDb1Jhq696N%4K)A& diff --git a/venv/Lib/site-packages/livekit/plugins/groq/__pycache__/log.cpython-312.pyc b/venv/Lib/site-packages/livekit/plugins/groq/__pycache__/log.cpython-312.pyc index 7645690bd37f774078b06bb71037638abeb9f42f..6af6bcf6742051879e88b26d548ee899cad1f0d2 100644 GIT binary patch delta 39 tcmZ3*w2F!MG%qg~0}v!Kd1Sav?fC&IDx((_8 delta 44 ycmey)_nnXTG%qg~0}$A*cgx`0$oq;#K))cTG(9t~SUtLJoOE? diff --git a/venv/Lib/site-packages/livekit/plugins/openai/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/livekit/plugins/openai/__pycache__/version.cpython-312.pyc index 3ec6f901ccef9d2e5e6fb66a14ba31e2d3efb7aa..161ba076dce39a779c2a8c9cd2e64aae4298d027 100644 GIT binary patch delta 41 vcmcc4c%6~=G%qg~0}v!Jd1Pcv#`b%}dOTDN0SuDap)DjhWoV G*a-l2WDt=6 delta 52 zcmbQtGMR<u&(-;}g*U delta 56 zcmbQ;$1=N*h3_;kFBbz4*sgcW@O-tAFP~ddzaXbHJu|OZKffR~FELZUC^a#sBr`Wv KfAci%*53g8iWArX diff --git a/venv/Lib/site-packages/livekit/plugins/silero/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/plugins/silero/__pycache__/__init__.cpython-312.pyc index 5105335d8780e96c097b3c56d646af69228a210b..eae97fdf6b5d4944810bd5cc0a370609393c2165 100644 GIT binary patch delta 44 ycmZ3)wTO%NG%qg~0}v!Jd1Tz!$or2;Af_OvG(9t~IHou=C$%U)X0tRiI}-pP>VA>E#UYnIG%qg~0}v!Jd1M$(YnIG%qg~0}$A*cgrxG$h%xhzaXbHJu|OZzc@1|wJ2Y|D784hv?w{XSbyR< F0|2NR5!(O& diff --git a/venv/Lib/site-packages/livekit/protocol/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/protocol/__pycache__/__init__.cpython-312.pyc index e986bb28fe25a5d262f974d88325f4083e0245aa..5563f066e7850e38456ea2ccbc0fdad2279fd848 100644 GIT binary patch delta 38 scmbQqGLwbxG%qg~0}v!Jd1SCLZsgm{$Q4silwXpcoSzdj`81;+0IvWFrvLx| delta 38 scmbQqGLwbxG%qg~0}!aJcgy(Au#s;wBbR(^b delta 38 scmZ3hzgD03G%qg~0}!aJcgyhH$QvNSrC(5#Uy`4kpQFDyUBrzU0L?xM@&Et; diff --git a/venv/Lib/site-packages/livekit/protocol/__pycache__/agent_dispatch.cpython-312.pyc b/venv/Lib/site-packages/livekit/protocol/__pycache__/agent_dispatch.cpython-312.pyc index e31f02e7ea4f7225571bfee21c5eefeb71593e97..a3de961f0fba1069eb3a86a371718cebd141aef8 100644 GIT binary patch delta 38 scmaDa{$8B-G%qg~0}v!Jd1P$e$ScXk6;n`@Uy`4kpA)m$fNMV^0N0TVlmGw# delta 38 scmaDa{$8B-G%qg~0}!aJcgyJB$ScXkrC(5#Uy`4kpQFFofNMV^0NQE`eEGr@=VG%qg~0}v!Jd1ORxGr@=VG%qg~0}!aJcgqmj$jhwErC(5#Uy`4kpQFE7O8FZT0K}LI@Bjb+ diff --git a/venv/Lib/site-packages/livekit/protocol/__pycache__/egress.cpython-312.pyc b/venv/Lib/site-packages/livekit/protocol/__pycache__/egress.cpython-312.pyc index 7c5e309221119c4ff392ed2d79572920cbaf44b5..f283fe5cea24796453e8d6901a30479441b01ce4 100644 GIT binary patch delta 38 scmeCE?WpBF&CAQh00c=)9vM3}@~$)EiYX|{FUe2N&xzT5)a)=j0Otk`ApigX delta 38 scmeCE?WpBF&CAQh00b)Q-7*X|@~$)E(l02=FUe2N&(Ys})a)=j0OBbOtN;K2 diff --git a/venv/Lib/site-packages/livekit/protocol/__pycache__/ingress.cpython-312.pyc b/venv/Lib/site-packages/livekit/protocol/__pycache__/ingress.cpython-312.pyc index ede2c896e882cfcd10f2a8263bc19271b6b7bfe0..092f1feda48e5e4da45bbefa7acb76c1bbcd8559 100644 GIT binary patch delta 38 scmca+am|AFG%qg~0}v!Jd1S2G$a`CYE2f|*za&37KPP7MCy5kh0O`mK-~a#s delta 38 scmca+am|AFG%qg~0}!aJcgslI$a`CYOTVBfza&37KSzJ_Cy5kh0P24XuK)l5 diff --git a/venv/Lib/site-packages/livekit/protocol/__pycache__/metrics.cpython-312.pyc b/venv/Lib/site-packages/livekit/protocol/__pycache__/metrics.cpython-312.pyc index 10029e99fa1ecb093069ff44a928357745e09558..39e0e64e50d510359b6a94779517b838dc579742 100644 GIT binary patch delta 38 scmZpXX_4VQ&CAQh00c=)9vP1|@=oO8iYX|{FUe2N&xzT*f+vO%0LN|%h5!Hn delta 38 scmZpXX_4VQ&CAQh00b)Q-7@xVGd~vq^4<%y delta 41 vcmZ2Ai*eN~M!wU$yj%=Gpt9aAqrGS&AG0%;enC-wNq%yEj{at8XMQdK|8EQn diff --git a/venv/Lib/site-packages/livekit/protocol/__pycache__/room.cpython-312.pyc b/venv/Lib/site-packages/livekit/protocol/__pycache__/room.cpython-312.pyc index fc41ec98f242bc2e30855a8202b34910b60d6ef5..eb96088379778f35781a67f089d7e69efa9c5898 100644 GIT binary patch delta 39 tcmca_bKi#VG%qg~0}v!Jd1TnBZ{+ik;)*FK$}h=J&d-V2oFMg|835r_3^4!z delta 39 tcmca_bKi#VG%qg~0}!aJcguLCwvo?6ic7zsD8D2>IX_2#bAr@=W&rlT4DSE{ diff --git a/venv/Lib/site-packages/livekit/protocol/__pycache__/sip.cpython-312.pyc b/venv/Lib/site-packages/livekit/protocol/__pycache__/sip.cpython-312.pyc index 50b119479baed5f5a920576693c517094b121f9c..f40d7d2625029bc57fdeee253c4fa5a07f5bf58c 100644 GIT binary patch delta 41 vcmZ2_oN?)KM!wU$yj%=Gki_JX!98&!Uw#-@OhHk8Nq%yEPR!=^FgacT2aF8+ delta 41 vcmZ2_oN?)KM!wU$yj%=Gpt9aALv6xFzWgvQ{eq(WlKkZS9R1DhVRF0x5P=OS diff --git a/venv/Lib/site-packages/livekit/protocol/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/livekit/protocol/__pycache__/version.cpython-312.pyc index 2abca779dfd73c20123a436f03febf9e2aaa2187..0d3733d1c3b4c13f2554d0fff526bf2ce70dc2b5 100644 GIT binary patch delta 35 pcmX@dc#e_xG%qg~0}v!Jd1Q!B$xqJDiJ3Up5CElp3Vi?o delta 35 pcmX@dc#e_xG%qg~0}!aJcgql)$lJ!HUr>}^lAoNPqd#%3Apol*3XcE) diff --git a/venv/Lib/site-packages/livekit/protocol/__pycache__/webhook.cpython-312.pyc b/venv/Lib/site-packages/livekit/protocol/__pycache__/webhook.cpython-312.pyc index b5171eb1cdd25273cf4f931d2755f4b52dda3feb..8569661d68698ee31385ba66dac257136ef3b224 100644 GIT binary patch delta 38 scmbOvFiC*-G%qg~0}v!Jd1M4{CKmY&$ delta 38 scmbOvFiC*-G%qg~0}!aJcgrx|$a{s2OTVBfza&37KSzJ_Yc_R80L1DGGXMYp diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/__init__.cpython-312.pyc index fd2f2eacf30ec57e57715f1d085871f42e884b60..723727e6e935665f50bc393d8f46bbe96a7af537 100644 GIT binary patch delta 30 kcmaDU^-_xaG%qg~0}v!Jd2Hk^4RFWLC`8?ZeVE~F@36cN+ delta 31 lcmdmGy33UNG%qg~0}!aJciYIlpN&<&s3ci`^Le({!T^qv38er4 diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_filter.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_filter.cpython-312.pyc index 3dade8d3fa9aa8f6440a5c5292ba06b83f992575..54263a1ab3634d7e4b84aabfce241750a7de5997 100644 GIT binary patch delta 31 lcmZ3-y^fpvG%qg~0}v!Jd2Hlf$;=v4RFWLCc_;H%MgV+l2$>8 diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_frame.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_frame.cpython-312.pyc index 805b06772ace9a893bfb861db6f265e6902d1106..0cccf714a3a895fa86f95b41c9316d7aefbea0bd 100644 GIT binary patch delta 31 lcmbOiJTI90G%qg~0}v!Jd2Hl%<7AB~DoKvn9LDLP004oA2owMS delta 31 lcmbOiJTI90G%qg~0}!aJciYJA#>uK*RFbT}IgHao0RV-$2qypl diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_mixer.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_mixer.cpython-312.pyc index 2a5326b13eff3562b96a0f556a17126f66b969cd..43c2441ba20590c019377bc4e75bd8d3aa32b471 100644 GIT binary patch delta 31 lcmX>Uekh##G%qg~0}v!Jd2HkkVq%RcDoKvnoWzu%2>^?H2#){& delta 31 lcmX>Uekh##G%qg~0}!aJciYGv#Kfv!RFbT}If*Gj69A8`2%-Q0 diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_resampler.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_resampler.cpython-312.pyc index 3316db3ed368b86772f268fa36d0682e3cc4e27b..f793d796e56539ae4fe36c5b0e398648f8b5dc72 100644 GIT binary patch delta 31 lcmez7`puR5G%qg~0}v!Jd2Hm4U}B9aDoKvnoWazm005Lx2?PKD delta 31 lcmez7`puR5G%qg~0}!aJciYGv!NjUxRFbT}IfJQB0RWhS2^RnW diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_source.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_source.cpython-312.pyc index 678d0b5ce3be921689a9f8de6ce27fa2eb1837bd..bcf9c2358823744719a1a684ff9818390893bcc0 100644 GIT binary patch delta 31 lcmZ4Qx!#leG%qg~0}v!Jd2Hl1;be^|DoKvn?82EX4FG~q2pj+a delta 31 lcmZ4Qx!#leG%qg~0}!aJciYHq!pW*%RFbT}*@ZJ(8UTiX2rmEt diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_stream.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/audio_stream.cpython-312.pyc index 74f0ba5c223835cd8ca0f0a5411ca5fc59a15003..c5254f2b0e8884beea87e2f3b55bfa19dab26722 100644 GIT binary patch delta 31 lcmZ3Ty*iuwG%qg~0}v!Jd2Hl%W@e2kDoKvn9LyYH1OSPt2yOrX delta 31 lcmZ3Ty*iuwG%qg~0}!aJciYJA%*?7^RFbT}IhZ-Z2mp=R2!Q|q diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/data_stream.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/data_stream.cpython-312.pyc index 4a990df4177eb56f480eae2cf0a6f51e9447c11f..67c97d95dd9300d8a3e73f4ede3118b5e029141c 100644 GIT binary patch delta 33 ncmX>xjq$`ZM()$Ryj%=Gki_J%k^31lYfMo|a?Iv$%t7t|sb&gQ delta 33 ncmX>xjq$`ZM()$Ryj%=Gpt9a=Blk0AR{f%qWc|(Gn1kE_t(OXD diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/e2ee.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/e2ee.cpython-312.pyc index 7ffbf8be6bcf6ade407555ffbb8cb0ec3350bbd5..9cb47d89162f3b7e1583131eb7cf3c835795623f 100644 GIT binary patch delta 31 lcmX?@doY*#G%qg~0}v!Jd2HksWoC^jDoKvntjavc7yyjG2!{Xw delta 31 lcmX?@doY*#G%qg~0}!aJciYG<%FL=?RFbT}S(SN?F#wS92$}!@ diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/event_emitter.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/event_emitter.cpython-312.pyc index 154263d3bcb39b13b70ba57ad8619c2b52154f4a..9f0096ca6d55fef2c3ab51a37f172711b1b4fcea 100644 GIT binary patch delta 31 lcmX?Qcgl|YG%qg~0}v!Jd2Hk^WnzsfDoKvn+{$!R1^|k}2@3!K delta 31 lcmX?Qcgl|YG%qg~0}!aJciYHa%EYQ)RFbT}xs~at3;>Sv2_66d diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/log.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/log.cpython-312.pyc index 60dc292afc44041845f5b19c435966c557900716..aeefaeef297984b247f818f0fd0a778aa1e126f2 100644 GIT binary patch delta 28 icmbQtG?|I}G%qg~0}v!Jc}(O!#u`&pk{mPfnk@icBM038 delta 28 icmbQtG?|I}G%qg~0}!aJcbmw4j8(s=Bw2srHCq5-!3XdF diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/participant.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/participant.cpython-312.pyc index c12d9727425e8e57c0bdcca2405b09eb384574fa..9f7a8f8a91431e9022a8a1adb27ef933f4c2b0b6 100644 GIT binary patch delta 33 ncmbQbjcMvOChpU`yj%=Gki_J%kvo!=HKwQ}Ic9Sv>zb(moOcPs delta 33 ncmbQbjcMvOChpU`yj%=Gpt9a=BX=Y#tA0^Qvi{~w)-_WBpr{Gf diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/room.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/room.cpython-312.pyc index 2cbf34c06b82556847674b4e2c26af4df6b56a75..1c7811521e60e1d4aabb32e76351eb13ba2694fb 100644 GIT binary patch delta 33 ncmaF#lIhV)ChpU`yj%=Gki_J%k^4UfYfMo|a?ECa&daL-!z&9@ delta 33 ocmaF#lIhV)ChpU`yj%=Gpt9a=Blmv}R{f%qWc|(joR?Pv0LNSlW&i*H diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/rpc.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/rpc.cpython-312.pyc index bd291fc135e21b169d5daf8f0e0fe1994cbea1f3..b18d4e120a1a2097bab7d618dfaa0a73ef69d88d 100644 GIT binary patch delta 31 lcmaE<`%;(tG%qg~0}v!Jd2Hlbd^VW-G%qg~0}v!Jd2HlX;b4s^DoKvnY{D^95dezb2z~$n delta 31 lcmX>bd^VW-G%qg~0}!aJciYIV!ojLvRFbT}*@R=JA^?vM2$28) diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/track.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/track.cpython-312.pyc index 56d478dca22de89a85a9064c2aff638be0094c2f..9da438c9aff1e65e5846fcf962586e3fce4c4cc7 100644 GIT binary patch delta 31 lcmccadEJxyG%qg~0}v!Jd2HnV!^|2}RFWLCnTO@H0sxg|3043A delta 31 lcmccadEJxyG%qg~0}!aJciYJQhnZEss3ci`GY`vY1pt|r326WT diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/track_publication.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/track_publication.cpython-312.pyc index 4d9d80d5aaac5e6d83b7d449f2a0051520a979b1..72968906d98e5c77da055f6801c712ae4df06b0f 100644 GIT binary patch delta 31 lcmdmQz2BPqG%qg~0}v!Jd2HlvXJL&gDoKvnJe@^D5&(yj2zLMg delta 31 lcmdmQz2BPqG%qg~0}!aJciYI_&cdo+RFbT}c{+=RBmj%V2#Npz diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/transcription.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/transcription.cpython-312.pyc index 29eefdad5017fcc605ffcce6f1e5eb193b75f552..b39aaf970371d13e95b1d02ab01d35d8eb3242b2 100644 GIT binary patch delta 31 lcmdnWzLlN(G%qg~0}v!Jd2Hm~&Bz*4RFWLC`84AzMgV>$2?qcG delta 31 lcmdnWzLlN(G%qg~0}!aJciYIln~_z&s3ci`^J&Ici~xdH2^s(Z diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/utils.cpython-312.pyc index fa4a26a8f06a45776afba2393ece7fcc52802912..97c99cef1079470cff35bdeda6f4cfb909504bf2 100644 GIT binary patch delta 31 lcmew){z;tsG%qg~0}v!Jd2Hm~$H^K~RFWLC`5dPT69A7g2=V{` delta 31 lcmew){z;tsG%qg~0}!aJciYIlkCRous3ci`^EplxCIFLT2?YQE diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/version.cpython-312.pyc index d99ef3515fbc92a96fb74dbbc8c842c080b7ef86..232874575e10bab0e4e8ad59432488fbde4422db 100644 GIT binary patch delta 28 icmX@fc#@I(G%qg~0}v!Jc}(Q)V2vp%NsgH~!w>*wUkASc delta 28 icmX@fc#@I(G%qg~0}!aJcbmxF!Kz*h9LlH{Rh$j diff --git a/venv/Lib/site-packages/livekit/rtc/__pycache__/video_frame.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/__pycache__/video_frame.cpython-312.pyc index 1164bafbd06b050e57fff728d065ac1abe88a5c6..8c71b117e063f971e19f303f736d4b107338950b 100644 GIT binary patch delta 33 ncmbQx!8oCVk^3|+FBbz4Br$nx}^k{`4Ao@y~00O_g>%m4rY delta 38 scmcZ@aWR7XG%qg~0}!aJciYH)T$M+^s3ciGzMv?-Bwv5?J=J110PRu?vH$=8 diff --git a/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/data_stream_pb2.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/data_stream_pb2.cpython-312.pyc index cfa78e9840800939bb6edc2ceb7f29188194102f..757fc23bce37e76a09c8fb83dda88d2b6fe93bac 100644 GIT binary patch delta 38 scmey8_9cz`G%qg~0}v!Jd2Hmqtj!ZsRFWJMUr>}^k{`4Am39|90QrjzY5)KL delta 38 scmey8_9cz`G%qg~0}!aJciYH)S(`_{s3ciGzMv?-Bwv5?EA1|J0R1x!Pyhe` diff --git a/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/e2ee_pb2.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/e2ee_pb2.cpython-312.pyc index dea885b21a7045f49c5811fbcc3320d8b69abd55..f2ed4490511983325d6d42c77fb4398fdd23c990 100644 GIT binary patch delta 38 scmZ2%w%CmOG%qg~0}v!Jd2HnN73Ya5DoKusFDS|{$&cBbBEFv)0LH%yWdHyG delta 38 scmZ2%w%CmOG%qg~0}!aJciYJAE6$@|RFbS8Ur>}^lCQrxMSMRq0Lo_zO8@`> diff --git a/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/ffi_pb2.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/ffi_pb2.cpython-312.pyc index afcf05fb17de2425c9833273928a24698376c0e8..2d3dd94d19d4413fa073a2a4c6cec73243715767 100644 GIT binary patch delta 38 scmX?5dZ3j1G%qg~0}v!Jd2Hm~V!;zrRFWJMUr>}^k{`4Aw8d9O0PVpIVE_OC delta 38 scmX?5dZ3j1G%qg~0}!aJciYIl#ezq_s3ciGzMv?-Bwv5?X^XFn0P$%JM*si- diff --git a/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/handle_pb2.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/handle_pb2.cpython-312.pyc index acec456f3be46eaa10843d4968a3e49e2017b577..74b0038ac9fb3dbb818406fbf931b72062255843 100644 GIT binary patch delta 37 rcmZ3-wT_GXG%qg~0}v!Jd2Hm?WZ{V^DoKusFDS|{$&Z=r!14|Nt%VA~ delta 37 rcmZ3-wT_GXG%qg~0}!aJciYIV$-<*wRFbS8Ur>}^lCMA6f#n?lu}2E0 diff --git a/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/participant_pb2.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/participant_pb2.cpython-312.pyc index abafb9641a3efb54422be73b3834c1ce3f85079f..ffa81175165cc095081f3b45a6b9365b21ce19aa 100644 GIT binary patch delta 38 scmX>vdR~vdR~}^lCQtni?fvx0Li@y)c^nh diff --git a/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/room_pb2.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/room_pb2.cpython-312.pyc index 71177624d89994db249db9b95c031f790cae2d94..93aa4a76a5bac95ab47bcbfe274856c335da6f56 100644 GIT binary patch delta 40 ucmX?ek@3t$M()$Ryj%=Gki_J%k$Y|wPfSrsa!hRFWJMUr>}^k{`4A0T&|^0NIEO#sB~S delta 38 scmaDT`B0MkG%qg~0}!aJciYH)l8Z;bs3ciGzMv?-Bwv5?11?4;0NpSPtN;K2 diff --git a/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/stats_pb2.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/stats_pb2.cpython-312.pyc index 71d1666594026c7de63c6a720f9bcb74815a510f..6cf8f41c5d17e7bdcc323b8a9d2b56fd01fa6bf0 100644 GIT binary patch delta 38 scmexT|D~S$G%qg~0}v!Jd2Hm~X~`2)RFWJMUr>}^k{`4Af~5)@0RD;%9RL6T delta 38 scmexT|D~S$G%qg~0}!aJciYIl(~?KOs3ciGzMv?-Bwv5?1xpn+00Kb`0{{R3 diff --git a/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/track_pb2.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/track_pb2.cpython-312.pyc index bd82620898627b7d7ea419625029e826422fa4a3..61c08403bb69a65f7b143bc11304c590c6f85922 100644 GIT binary patch delta 38 scmeyS`%RboG%qg~0}v!Jd2HnF66T31DoKusFDS|{$&cB*P&kws0N}w40RR91 delta 38 scmeyS`%RboG%qg~0}!aJciYI_CCsB=RFbS8Ur>}^lCQscp>QZO0OV;4=Kufz diff --git a/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/track_publication_pb2.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/track_publication_pb2.cpython-312.pyc index c368e0ae5dc56444935b81df645680c4b3fdd74a..f804b3a5cab846357ba4c48f3cf7a692a3b29b3b 100644 GIT binary patch delta 38 scmcc3f198CG%qg~0}v!Jd2Hk^W8;Y_DoKusFDS|{$&cCG%jU-j0L^s^L;wH) delta 38 scmcc3f198CG%qg~0}!aJciYHa#>S&xRFbS8Ur>}^lCQtHm(7n60MQ)_DgXcg diff --git a/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/video_frame_pb2.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/_proto/__pycache__/video_frame_pb2.cpython-312.pyc index 711968d2d72bfcd549f598b4fd91024e56e6edca..556ad5e06ca0ad12918f2dee876eddd7906f7bcc 100644 GIT binary patch delta 38 scmX?Sdd`&lG%qg~0}v!Jd2Hl}^k{`4Ar`T0y0O0cs_W%F@ delta 38 scmX?Sdd`&lG%qg~0}!aJciYJQNQ_6ns3ciGzMv?-Bwv5?PqC}a0OXqt-2eap diff --git a/venv/Lib/site-packages/livekit/rtc/resources/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/livekit/rtc/resources/__pycache__/__init__.cpython-312.pyc index be640f3436edc9ed5b2bf529c4e9de1cbdb7d9c3..c54aacb90b4b91f30af04a59c92f8a2b866f2571 100644 GIT binary patch delta 38 scmey&_?eOWG%qg~0}v!Jc}(P9$sbcxk{nZ%TAW{6l$=@|Gx4wi0NPj#p8x;= delta 38 scmey&_?eOWG%qg~0}!aJcbmw)l3%~5Bw4>GwK%`DC^@xQf8t>S0Nwx$g#Z8m diff --git a/venv/Lib/site-packages/marshmallow/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/marshmallow/__pycache__/__init__.cpython-312.pyc index e4667ca6ceab4d07ec40df4a2d7c5149a9e8efe2..8d18c073eab9757bd607da085e68ecb9af22e5e6 100644 GIT binary patch delta 29 jcmZn{X&2!=&CAQh00c=)9vMqE@_u1sjM>b@&dLk`XCwy1 delta 29 jcmZn{X&2!=&CAQh00gBQ-7|tW@_u1s)Zfg+&dLk`ZLJ3f diff --git a/venv/Lib/site-packages/marshmallow/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/marshmallow/__pycache__/base.cpython-312.pyc index 2737a35669cca311cd64019dac1e5e8ded99af7e..af47f7c413343cf4724fc3306b6ca1966e174cc0 100644 GIT binary patch delta 29 jcmdljyjz&}G%qg~0}v!Jd1Ul&%Ql-G0BoQJr~m)} delta 30 kcmdlXy+fMsG%qg~0}zyMbkDfTy^)WPjZuHIEZb~$0Do@>)Bpeg diff --git a/venv/Lib/site-packages/marshmallow/__pycache__/decorators.cpython-312.pyc b/venv/Lib/site-packages/marshmallow/__pycache__/decorators.cpython-312.pyc index 4da8b33c1f464f0fe608ae4b6dc2fb0c14002410..035ba13860d94f02e746f2ebad8748b0dedc4320 100644 GIT binary patch delta 30 kcmZ4LvDAa_G%qg~0}v!Jd1Oc{Z{*v|%^0)!5O=Z!0C~y>{{R30 delta 30 kcmZ4LvDAa_G%qg~0}zyMbkERL+Q_$=n^AxBA?{=e0ENB?qyPW_ diff --git a/venv/Lib/site-packages/marshmallow/__pycache__/error_store.cpython-312.pyc b/venv/Lib/site-packages/marshmallow/__pycache__/error_store.cpython-312.pyc index 4ab6f61cf221925969522ada092e10ab3dacfd05..8cb4b16b668d64a34fbb1f3ce45033c92b9e3527 100644 GIT binary patch delta 29 jcmew;@==8MG%qg~0}v!Jd1URtXc4-HX delta 29 jcmca5eM_46G%qg~0}zyMbkC^R$jigTsJ~f?=>RtXe3A#s diff --git a/venv/Lib/site-packages/marshmallow/__pycache__/schema.cpython-312.pyc b/venv/Lib/site-packages/marshmallow/__pycache__/schema.cpython-312.pyc index 4d18ebd419472e0c59dedbbaf8904c9c8fef026c..715dc20c558c26a70f01a31a9a96ccd9830936bf 100644 GIT binary patch delta 39 ucmX@n!hE8IneQ|&FBbz4Br$np@Lb%;x001HX7dhKb$iBJn;*Dj)B*tLFAT&0 delta 39 ucmX@n!hE8IneQ|&FBbz4lx}p-cz=2$-%3_S{mnaA)$JL7ZGPaAQ40VGY7SKZ diff --git a/venv/Lib/site-packages/marshmallow/__pycache__/types.cpython-312.pyc b/venv/Lib/site-packages/marshmallow/__pycache__/types.cpython-312.pyc index aadd55e28265c72616b29244a54783d18cb417b6..c4b1074123b6dd100f50b01fdc537a23fa7d0372 100644 GIT binary patch delta 29 jcmdnazn!1=G%qg~0}v!Jd1Uw0#(`I3e*=)rkE68|jbA)K19st7W39A4A delta 39 tcmZ44&bYFjk?%AwFBbz4lx}p-SgyB`Pn(5Nf3p>ftRUmB%@Lx3dH~$@3gG|% diff --git a/venv/Lib/site-packages/marshmallow/__pycache__/validate.cpython-312.pyc b/venv/Lib/site-packages/marshmallow/__pycache__/validate.cpython-312.pyc index 967f5faf3d5fe106438fb6d24dc237152644ffcb..1b70836bf9a6e57349ed1af5f9a01a641a7530f8 100644 GIT binary patch delta 45 zcmZo{Vrpz+;ycaD%f$c$NlYFY9LXE`uCOrPn*5k$GGolzcgr}3rU1TO`{S+M5I(zR)%Hm9bnD=X?G1V zz0gWki4-a2M5L-xsvb&3D)rc7rAWQ>vKF+MNvl@sDVNF$mx@zoY;4n}9ckZt-xbjTm9GK-{J}tD38%*KpAdi@paK=@K!P>RNnA|_qyW{N&KrUxK!CXd zY8-FrDKP&908)?xSinIwu*cQ+q)-^(P$AxmY*>4zhVwCog|3FTr3*bRyJ4w34mFt( zMw^kFl>IZH3ZHWgzK`Jl@bxuVS{kE0+BaKLJ8q|)4b;(Dsq)t;#Hf%u>#f_({B8fp z|DUmi!I#hD_C|gPASl5HU-E!XFi?2?m3obH(mBRD2yo{G-~=GJ3mzP-gL{FyU>y#j=Zxmo5G4GZ;;n2Tqo{kD ztvKGOT_WKo+DN9BtfHx=az!s?T3$-G6jjOT`20p^$|$;CDu>VbM&@*^xHwg$-=b#N zmgA-DlDA@+a+7i~rJ1gW6?ODE`%h>I5!X}lt2$o8Iz{mEkU)a6tmwKdlL$46l)#~O zRF?CWU2?SL6^}wumUS(UO&8a}8g^WbW|D{cNP9iGuH{CHo~Dy<6O({ja!F`iaZJrz zc1h5t{nI#yjh65X5onX}lBQ$1hJubhXm`|C2eeo*dZdmN10A{JLa%sXfEsE9mla8!m|=d?;JK&TIdwE9b8ZJ ze!X-O`}bs>5N*K;Gr?ZHBQn9>>(}6zN^mlpzM6f{rDMuwrl;>@r?9)~S$1~KqGOy~ z#-^8D!{%CcM$2Vg&BG%$y%uE|yV>UDy&=n*snO}v-{d58yRe-ERF$@|F{AO;uU=HyYV>(kqh+V^9ZHm9pxM2J?zu0yfEEcPFW z1C@CH&cyb_VSKzCAOG&k_oe;#?X9UwyvL6Z`Y5v-e*A&|=1u=%W*=p!tCASlS=e4U zOpKKiW8dD{Ph8!)QMoj-m42AHpLryf(FJ;R=i2r)KYrOqGrOhTRewC=56|qQ8S1K_ z7z;c^gJm@M_{IUca)e%~b^!EhHOPvs_5-1F^W9HoKb-YDC;fER*9t%JtH1EC{l?G# q%+LQ-6#?pd0iX~)3L)CM5Iu1_=_sDO9ZwH)Pltu{nDF#1Naf#2<$Q1e literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/multipart/__pycache__/decoders.cpython-312.pyc b/venv/Lib/site-packages/multipart/__pycache__/decoders.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa1ef546717934ca33fdef8d23865ff98f3dbfec GIT binary patch literal 221 zcmX@j%ge<81jjxnWM}~C#~=<2FhLog`GAb+3@HpLj5!QznHU)=nKYSSf+RH=Z!v25 z0ZGY%%94!yy!hPGoRZ9f#G(?tl+@(>l+>c)l?cfoGE2#X%VUwGm eQks)$SHuA{oe_wOL5vT~jEszT8Pto|fE)k`Mn1Cu literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/multipart/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/multipart/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbc2f8abf59908ee931a30e243255e26502f3e9d GIT binary patch literal 225 zcmX@j%ge<81jjxnWM~2D#~=<2FhLog`GAb+3@HpLj5!QznHU)=nKYSSf+RH=Z!v25 z0ZHkC%94!yy!hPGoRZ9f#G(?t)QaTPf|AVqyyBG%pFwJW`8!+1gche36~}mcdWOWf zq!wqF~Xcn;nIRHyYK&=1( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/multipart/__pycache__/multipart.cpython-312.pyc b/venv/Lib/site-packages/multipart/__pycache__/multipart.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac8b6466ec23791a300512e8d4e983b6958d8ccb GIT binary patch literal 223 zcmX@j%ge<81jjxnWM~5E#~=<2FhLog`GAb+3@HpLj5!QznHU)=nKYSSf+RH=Z!v25 z0ZFNX%94!yy!hPGoRZ9f#G(>CIBO-tXOPlge$G}gp~b01#WCKVo*^+Vsm0kP`2{g$ z`I*V7j_Ij+B{5~Gd1Wy^nMpClnI);Z1&PVoiRr1uF>sUg;Viv^%3mBdx%nxjIjMF< Z96;k4fw&mN_`uA_$at4QqlgX20RX*2Kj{Df literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/multipart/decoders.py b/venv/Lib/site-packages/multipart/decoders.py new file mode 100644 index 00000000..31acdfbf --- /dev/null +++ b/venv/Lib/site-packages/multipart/decoders.py @@ -0,0 +1 @@ +from python_multipart.decoders import * diff --git a/venv/Lib/site-packages/multipart/exceptions.py b/venv/Lib/site-packages/multipart/exceptions.py new file mode 100644 index 00000000..36815d19 --- /dev/null +++ b/venv/Lib/site-packages/multipart/exceptions.py @@ -0,0 +1 @@ +from python_multipart.exceptions import * diff --git a/venv/Lib/site-packages/multipart/multipart.py b/venv/Lib/site-packages/multipart/multipart.py new file mode 100644 index 00000000..7bf567df --- /dev/null +++ b/venv/Lib/site-packages/multipart/multipart.py @@ -0,0 +1 @@ +from python_multipart.multipart import * diff --git a/venv/Lib/site-packages/numpy/__pycache__/__config__.cpython-312.pyc b/venv/Lib/site-packages/numpy/__pycache__/__config__.cpython-312.pyc index d376b59cb9141ec7093606e72773e5fef263bd3d..061d4eadeace0ee695677ea58f5e5317d9d4e1f0 100644 GIT binary patch delta 27 hcmeyV@l%8QG%qg~0}v!Jd2HnV#mpG9nT@4b003}G2R{G+ delta 27 hcmeyV@l%8QG%qg~0}x28ciYJQiGaE~>004902Xg=b diff --git a/venv/Lib/site-packages/numpy/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/numpy/__pycache__/__init__.cpython-312.pyc index 380e5abd896a03146f2b659d07899f9147353545..ba72520ef53bf6f1a21f56c87d6b2d70eff3d826 100644 GIT binary patch delta 29 jcmbPzhjI2DM()$Ryj%=Gki_J%k(*7KF=n%nGN(5HeN+b( delta 29 jcmbPzhjI2DM()$Ryj%=GAhF(UBR88eqyAc<09n=rzyJUM diff --git a/venv/Lib/site-packages/numpy/__pycache__/_distributor_init.cpython-312.pyc b/venv/Lib/site-packages/numpy/__pycache__/_distributor_init.cpython-312.pyc index d8ae2e558c019d0d7f26d408397dd70b807fbc51..ab53c3c80f62b1583e354eec12be73863d667ddb 100644 GIT binary patch delta 26 gcmeBR?O^3T&CAQh00hZQ9viu(nHXaxt1~4607XOv6#xJL delta 26 gcmeBR?O^3T&CAQh00a{2-8OPdGcoE*^=WE8vtC?2B!c3 diff --git a/venv/Lib/site-packages/numpy/__pycache__/_pytesttester.cpython-312.pyc b/venv/Lib/site-packages/numpy/__pycache__/_pytesttester.cpython-312.pyc index 17d32d68ece58bfcad0d1d63c8ed5071cffca507..30965b327c15a042c1fae297e5a91df9fa7d9bc8 100644 GIT binary patch delta 27 hcmdmEvd4t`G%qg~0}v!Ld2HnFV`GfjJd16SFaTvw2R#4) delta 27 hcmdmEvd4t`G%qg~0}x28ciYI_$Hu6?c^2CuVE|~@2XFuY diff --git a/venv/Lib/site-packages/numpy/__pycache__/dtypes.cpython-312.pyc b/venv/Lib/site-packages/numpy/__pycache__/dtypes.cpython-312.pyc index 0e7760ead711cd42f8e7a90d9adbf76659d2f2e8..7da0011dde1887a1a58f9bc725f3e7e1bb6bf6a7 100644 GIT binary patch delta 26 gcmeyt{ezqPG%qg~0}v!Ld2HksWMzz*EX#Tu09 diff --git a/venv/Lib/site-packages/numpy/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/numpy/__pycache__/exceptions.cpython-312.pyc index 655a7e4349d5e2f73d83af5c55c0cc3b6eaf615f..620696f7b38b791295be07d7f9fde8265d99973d 100644 GIT binary patch delta 27 hcmbR2GTDXuG%qg~0}v!Ld2Hm~%f=Y9`6Qc{Gyq}N2N?hW delta 27 hcmbR2GTDXuG%qg~0}x28ciYIlmyJ<>^GP-@X#izk2TT9} diff --git a/venv/Lib/site-packages/numpy/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/numpy/__pycache__/version.cpython-312.pyc index 6894cc39da90bebe653db88e51889bf92420ebc9..73971925e9d3298bc364ff3e10a8ba6490cc0240 100644 GIT binary patch delta 26 gcmbQqGLwb-G%qg~0}!Mzd2HmK&&U`vc{O7m08S$YNdN!< delta 26 gcmbQqGLwb-G%qg~0}x28ciYH4pOI02@@mFB08wlPdjJ3c diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/__init__.cpython-312.pyc index 9a520392240e0e16242b521871b2acd780580325..5c335132447086e2dedabc0b1d0020727bf186f4 100644 GIT binary patch delta 33 ncmbQEGe?K}G%qg~0}v!Jd2HlPI>FPPS-0ssc%4LJY+ diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/_add_newdocs_scalars.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/_add_newdocs_scalars.cpython-312.pyc index 832482214890dbcd005e7009a891eb2bbb70fdf3..5704ee5af007debf89ca55886f60c8ba7c79b484 100644 GIT binary patch delta 33 ncmbQ4J~N&BG%qg~0}v!Jd2HnV!^$2LpPXNm8nc;?ty>oWpwC(SjtseJ3;+w!4hR4M delta 42 xcmdlqfoanOChpU`yj%=GAi3UcBljwHcK!I|{GwF-&3oAA_%Qz392s)c7yuBS4ln=! diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/_machar.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/_machar.cpython-312.pyc index 49017d644f79a35149f492c528028243847949b4..f2bc06d6a7927f04204dbde24d223a2e10e6fbb5 100644 GIT binary patch delta 33 ncmbOoJv*BFG%qg~0}v!Jd2Hm)=3|eEPtGq&joDnwCnpa8mstr4 delta 33 ncmbOoJv*BFG%qg~0}x2AciYIF&Bv}EpPXNms=v9GPfi{Hn=T0w diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/_methods.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/_methods.cpython-312.pyc index fc8d35ce391593714e5d657db2a0e3625eb2bee6..bb1071beadf777893f30ca7794d6950723afa281 100644 GIT binary patch delta 33 ncmZ1+xj2&hG%qg~0}v!Jd2HlXWMhwsPtGq&joEC>R-gs|lY$7# delta 33 ncmZ1+xj2&hG%qg~0}x2AciYIV$i}W8pPXNms=wKotw0R`msbeW diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/_string_helpers.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/_string_helpers.cpython-312.pyc index b0e796e0ae3fd55125b8a5d93302fe5680bc5352..b5c60e04ec06c6ff339f8d67578dd7558e8ae03b 100644 GIT binary patch delta 33 ncmca0c|nriq!~^ delta 33 ncmZ1^yGWM%G%qg~0}x2AciYHa!^y56pPXNms=v99Q-l=&j;aWl diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/_ufunc_config.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/_ufunc_config.cpython-312.pyc index 7e30db228beca0b33de0f38eca79d2dae4ae9738..606863399531febc84f0757dfe4f84ccd896a347 100644 GIT binary patch delta 35 pcmX@!$auVwk^3|+FBbz4Br$nxjkBLvtFG`KsT*>ce2mr6$3G4s> delta 35 pcmX@!$auVwk^3|+FBbz4NUnF=$eqs5t{Y{~ALIc5ltu|q delta 33 ncmZqAXwTq2&CAQh00ffj-8OQYsI%+GC+8QX>Th;aKga_Bm>UUL diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/multiarray.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/multiarray.cpython-312.pyc index 9597eff34f120874f402a17ce4c5c3856bd4c21a..7d2a42bb36c6dc402975b03485bcbc08ce583d21 100644 GIT binary patch delta 35 pcmbP!ih24eX71Cxyj%=Gki_J%k^6@LdrW+Ceo<=7W-dYAD*(Mr3aJ19 delta 35 pcmbP!ih24eX71Cxyj%=GAi3UcBliyhcK!I|{GwF-&0K=KR{+5w3b6nH diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/numeric.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/numeric.cpython-312.pyc index f755580b44cc26142a2c18a5469a27cae1d5a3de..7b3c1d5b19b649401d7f0d340c531d193f8ed988 100644 GIT binary patch delta 39 tcmZ2`f_3c)R_@chyj%=Gki_J%k-LSDJtjUmzbG}Pc^cpLX?%>+Ljml)3?Bdh delta 39 ucmZ2`f_3c)R_@chyj%=GAi3UcBX&GYO7p3ZNo+p%V1OTc63IqTE diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/overrides.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/overrides.cpython-312.pyc index 62063bf11bac1e111532eef1dc27494a1a1447d1..f81ac6bfc7fbe74e406fcdae170bc6290a1ea099 100644 GIT binary patch delta 33 ncmca)d&!pjG%qg~0}v!Jd2Hm)U}2AmPtGq&joDnq5+MZuonZ-A delta 33 ncmca)d&!pjG%qg~0}x2AciYIF!NRT|pPXNms=v94B|-`Sp*9I$ diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/printoptions.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/printoptions.cpython-312.pyc index 900f1e40332ebd0c9089a25cfaf6fafddad4c6f2..7b6038604ae9d7f48d8791d290514bcd1cda95f4 100644 GIT binary patch delta 32 mcmZ3;zL1^!G%qg~0}v!Jd2HlnW@e9xPtGq&jhQUU+yek~bO*Np delta 32 mcmZ3;zL1^!G%qg~0}x2AciYI#%*?JIpPXNmsy|tjxd#AvK?lD8 diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/records.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/records.cpython-312.pyc index 9c4ffb212762cdae5cd3d89e866f074504eb5210..7fedca8e9c667e5196fd575a1bb975aeb59abfcc 100644 GIT binary patch delta 35 pcmZ3sg=yIqChpU`yj%=Gki_J%k^2-2drW+Ceo<=7<~uB2QvthX3nBmj delta 35 qcmZ3sg=yIqChpU`yj%=GAi3UcBljs5cK!I|{GwF-&39P5rUC%JI}0iR diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/shape_base.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/shape_base.cpython-312.pyc index b8a6c875dd29880e9d49535200ce2204913e491e..c5e8187e01b0ff53feec112907d6b31031cbdf94 100644 GIT binary patch delta 35 pcmeC_W$Ni=;y%sG%f$c$NlYFaxz$+MW8#zZi&A4YTd;&Q0RWzc2~Pk3 delta 35 pcmeC_W$Ni=;y%sG%f$c$lIz_za;veh>&GYO7p3ZNwqOZq0sx|030D9B diff --git a/venv/Lib/site-packages/numpy/_core/__pycache__/umath.cpython-312.pyc b/venv/Lib/site-packages/numpy/_core/__pycache__/umath.cpython-312.pyc index 8e8a2456fd0481f6645d0bf965ee49a090c2412e..61788866200882216d1b42ad44fc49191d451646 100644 GIT binary patch delta 32 mcmX@de~zE~G%qg~0}v!Ld2HkkXJ?OzPtGq&jhURuo(cel_6Vy0 delta 32 mcmX@de~zE~G%qg~0}x2AciYGv&d#nMpPXNmsy{iCJrw|oun4jM diff --git a/venv/Lib/site-packages/numpy/_typing/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/numpy/_typing/__pycache__/__init__.cpython-312.pyc index 71f974a76596db99dc013ac2b29fb40b7c561e95..df691658e1a33afddc0efcdb4b1118bb302c140a 100644 GIT binary patch delta 35 pcmaE>{#Kp)G%qg~0}v!Ld2Hks6XJ}CFR3iZ%uA2itR-}q5dg4d3L*di delta 35 pcmaE>{#Kp)G%qg~0}x2AciYG9Us73+nU}7=Sxe|JBLK9H3Ml{p diff --git a/venv/Lib/site-packages/numpy/_typing/__pycache__/_array_like.cpython-312.pyc b/venv/Lib/site-packages/numpy/_typing/__pycache__/_array_like.cpython-312.pyc index 0b0dc87dcb0399b85dade296f5676554ad7c9c4d..bbed1857ce6a9277d989b5fd08040df7a5a6e062 100644 GIT binary patch delta 35 pcmbQCJ42WIG%qg~0}v!Ld2Hlf$jKQKUs73+nU@~3c`N5*9ss6f3bOzJ delta 35 pcmbQCJ42WIG%qg~0}x2AciYIlkdsqCzNE4sGcR3#^H$EsJOHYV3c3IQ diff --git a/venv/Lib/site-packages/numpy/_typing/__pycache__/_char_codes.cpython-312.pyc b/venv/Lib/site-packages/numpy/_typing/__pycache__/_char_codes.cpython-312.pyc index 87c212ae28a6f28936f80c1b934f737ee9775e1b..3d897bfe7af1fa1a2d1f98aa6ae461fd2e88e0d0 100644 GIT binary patch delta 42 wcmbPkKHZ%AG%qg~0}v!Ld2Hlf!^C)N^A4s>qMR}DC6xu4dFe5mizQT;0Rm7A-2eap delta 42 xcmbPkKHZ%AG%qg~0}x2AciYIlhKcdl<{eC%L^<{2ODYR8^V0P<7fYxx0{{!a4FmuH diff --git a/venv/Lib/site-packages/numpy/_typing/__pycache__/_dtype_like.cpython-312.pyc b/venv/Lib/site-packages/numpy/_typing/__pycache__/_dtype_like.cpython-312.pyc index feb6372888c6d25251cf7b065264255c38a3b058..7dc2210856838952b52a1dcd93d38a5e89bea83c 100644 GIT binary patch delta 35 pcmX>scUX@5G%qg~0}v!Ld2HnV&BhrMUs73+nU@~3nV;Q+0|2kQ3FiO+ delta 35 pcmX>scUX@5G%qg~0}x2AciYJQn~hUHzNE4sGcR3#Ge5ft2LQ9>3GM&@ diff --git a/venv/Lib/site-packages/numpy/_typing/__pycache__/_nbit.cpython-312.pyc b/venv/Lib/site-packages/numpy/_typing/__pycache__/_nbit.cpython-312.pyc index 00a215669fc2eaab004edb72ff917c7fdadac707..28e3b55724fbce052a0b4d5413291bcfc9b292d5 100644 GIT binary patch delta 34 ocmdnRzKfmvG%qg~0}v!Ld2Hl<&%_xMUs73+nU@|jnVESz0Gyr);s5{u delta 34 ocmdnRzKfmvG%qg~0}x2AciYJQo{3XGzNE4sGcR3#GBfjb0HDAL=>Px# diff --git a/venv/Lib/site-packages/numpy/_typing/__pycache__/_nbit_base.cpython-312.pyc b/venv/Lib/site-packages/numpy/_typing/__pycache__/_nbit_base.cpython-312.pyc index 44723c3f4ee9c23b856f66f9f3b5a1d72de509d3..8d39c126f0bdc4073c1cff15f06a998269220df6 100644 GIT binary patch delta 35 pcmbOsH$#s5G%qg~0}v!Ld2Hks;^K^nFR3iZ%uA2itj6_;1pt=x34j0q delta 35 pcmbOsH$#s5G%qg~0}x2AciYG<#Kox}Us73+nU}7=S&i!x3jmuP35Ngx diff --git a/venv/Lib/site-packages/numpy/_typing/__pycache__/_nested_sequence.cpython-312.pyc b/venv/Lib/site-packages/numpy/_typing/__pycache__/_nested_sequence.cpython-312.pyc index adb2da602f42ff477836d58e0db00badb7455c5a..f888e60739c7f79e7f5c00d6eaac9bc70b11b358 100644 GIT binary patch delta 35 pcmX>ubzF-3G%qg~0}v!Ld2HmiXXlKGFR3iZ%uA2i9L)ZO6#%8>3M~Kt delta 35 pcmX>ubzF-3G%qg~0}x2AciYHq&(5hIUs73+nU}7=Ihg$mD*&nv3N!!! diff --git a/venv/Lib/site-packages/numpy/_typing/__pycache__/_scalars.cpython-312.pyc b/venv/Lib/site-packages/numpy/_typing/__pycache__/_scalars.cpython-312.pyc index 853ed1719d58364f34b2288aaf1782357033e9ba..97df2ebec07349edf945bab70bbf2a4911bacb19 100644 GIT binary patch delta 35 pcmZqUZsX=Y&CAQh00hZQ9vivMSvX_jODYR8^U`BBd$U+G0sxL|2)Y0O delta 35 pcmZqUZsX=Y&CAQh00ffj-8OQYvvBIimsA#H=B4Xz_GYnW1OSqi2*CgV diff --git a/venv/Lib/site-packages/numpy/_typing/__pycache__/_shape.cpython-312.pyc b/venv/Lib/site-packages/numpy/_typing/__pycache__/_shape.cpython-312.pyc index b3189608cd6cbc032e7f971a7d84dc19431cdb89..16eca63f8a5b08257be666ddfe8c374a59d97ddc 100644 GIT binary patch delta 34 ocmZo?X=mX+&CAQh00hZQ9vit^898I(ODYR8^U`A`&t%L40EvDHRsaA1 delta 34 ocmZo?X=mX+&CAQh00ffj-8OQ!GIHw2msA#H=B4XTp2?U80F9stT>t<8 diff --git a/venv/Lib/site-packages/numpy/_typing/__pycache__/_ufunc.cpython-312.pyc b/venv/Lib/site-packages/numpy/_typing/__pycache__/_ufunc.cpython-312.pyc index 8f253f2faf9e8bf2414891d46b308c73c65b9102..fc8c9f743ee00f48148f530a3cf4b1538f929b5b 100644 GIT binary patch delta 34 ocmaFC^n!`|G%qg~0}v!Ld2Hn7VC0O6FR3iZ%uA1%EW_vn0GO8u_y7O^ delta 34 ocmaFC^n!`|G%qg~0}x2AciYI#!N{o}Us73+nU}6VS%%RE0Gzo9{{R30 diff --git a/venv/Lib/site-packages/numpy/_utils/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/numpy/_utils/__pycache__/__init__.cpython-312.pyc index ae32e1c64606c84d7be56fb5343db0b9a1dbf605..b7385736b8a69e3edfef8511cc9bd2010d0c6041 100644 GIT binary patch delta 34 ocmX@5a7uyuG%qg~0}v!Ld2Hmqz|0X7Us{rxQyjDTF>^W(0H?AFX8-^I delta 34 ocmX@5a7uyuG%qg~0}x2AciYH)ftf=;zO*DWr&xdUW9D=o0IR18ZU6uP diff --git a/venv/Lib/site-packages/numpy/_utils/__pycache__/_convertions.cpython-312.pyc b/venv/Lib/site-packages/numpy/_utils/__pycache__/_convertions.cpython-312.pyc index a7a8d5e13276c0745c430582e213cbf1d81869cc..037cb335477ea085ebeaf281361ab2afec428326 100644 GIT binary patch delta 34 ocmdnNwu6oPG%qg~0}v!Ld2HmK!pIR5Us{rxQyjB-Ipah|0GI;_vH$=8 delta 34 ocmdnNwu6oPG%qg~0}x2AciYH4g^@!)zO*DWr&xdUa>j{_0Gs#;xc~qF diff --git a/venv/Lib/site-packages/numpy/_utils/__pycache__/_inspect.cpython-312.pyc b/venv/Lib/site-packages/numpy/_utils/__pycache__/_inspect.cpython-312.pyc index 3b5cc640af9a0a5ee79c7c0e51740ba593c85563..fb286fa38389bbeb67440ad0c26d66aaccfed3e9 100644 GIT binary patch delta 34 ocmX@>dDfHrG%qg~0}v!Ld2Hm?VBv^~FD=Q;DUR7}%`!;=0HzcPumAu6 delta 34 ocmX@>dDfHrG%qg~0}x2AciYIV!NQ>*Us{rxQ>?$)nq`s#0ICTIw*UYD diff --git a/venv/Lib/site-packages/numpy/fft/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/numpy/fft/__pycache__/__init__.cpython-312.pyc index b0a2c42b61b2146682ce41e5629f929eeb2e8c60..ba480a0d552f2a0f6904b052dc072c08f038c936 100644 GIT binary patch delta 30 kcmX@VPe%!ODoZze1z#V0B(K=Z2$lO diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/__init__.cpython-312.pyc index 2a9b08c021b9944b74413f36fe98a91f02c9337a..ed1a68f1bbee3ae036b958f1af0f462133919603 100644 GIT binary patch delta 31 lcmdlczD=C_G%qg~0}v!Ld2HmC;be`;$xMpbti##G1ORra2a5mz delta 31 lcmdlczD=C_G%qg~0}x28ciYG^NU2ax~( diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_array_utils_impl.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_array_utils_impl.cpython-312.pyc index 9d404cc15e7f8f7194c30d902114a9ee069f886a..a5f21142a3424488cd53becc1d364d1850207def 100644 GIT binary patch delta 31 lcmaDV@Kk{NG%qg~0}v!Ld2HmK!^RqulbIB=c@5i6MgWM%2?GEC delta 31 lcmaDV@Kk{NG%qg~0}x28ciYH4hmBP~Co@TZ^BT6Di~x)d2?+oI diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_arraypad_impl.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_arraypad_impl.cpython-312.pyc index 28c5c345e25cf49d508687a8ed8fa8b0bb1bf8d8..1cac7873bb4673f796febb78c74507f7371913f1 100644 GIT binary patch delta 33 ncmZ4Xh;i8?M()$Ryj%=Gkj&(*PfMsP_uu delta 33 ncmeCW$kcU_iTgA!FBbz4NUV3;$o-s^RX-;)Nq_Tq*2#+itUe0p diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_arrayterator_impl.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_arrayterator_impl.cpython-312.pyc index 50ba51ecce7618f551f5c41741326eeabd499473..353bea5e95316f0c71f6aacb4cb3d696ac5bbce6 100644 GIT binary patch delta 31 lcmeD8?)Tm0Lm?LHb0J6sl!T-o9XmyChpU`yj%=Gkj&(-o9XmyChpU`yj%=GAhF(UBX<%DtA0*qlK$o*mdH*3rS1uz diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_iotools.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_iotools.cpython-312.pyc index 700445008ee438222b8f8a2cd0fe47c2d3ff7f9e..9c85bc5830ce776c323e00b2b87e439edd99bf1d 100644 GIT binary patch delta 33 ncmaDgiRslOChpU`yj%=Gkj&($xn7Vgu$yj%=Gkj&($xn7Vgu$yj%=GAhF(UBllBYR{fmJB>m>EyxYI>GQO7r0QA-k3IG5A diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_npyio_impl.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_npyio_impl.cpython-312.pyc index e78ccdc2731c79c5feb8d7ba1fad05b9cdf24704..86fe4aae6a70bb09c5843f4150fc81ea654a2e0d 100644 GIT binary patch delta 37 rcmccdiS@=OR_@chyj%=Gkj&(N07^Ct4_c9Fu delta 37 scmccdiS@=OR_@chyj%=GAhF(UBlkNlR{fmJB>m=pT-*O~F-GM90Q!*)2LJ#7 diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_polynomial_impl.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_polynomial_impl.cpython-312.pyc index 19cff0018f1c0f9230c78c7bb0b6bda1814d5223..30ed43aa5c1bcadac0199fbdb6548f4e1ed79e9a 100644 GIT binary patch delta 33 ncmcb$i22qcX71Cxyj%=Gkj&(l~IS!&M!0JAF#3IG5A diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_scimath_impl.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_scimath_impl.cpython-312.pyc index beb4ee97b56a88d341a08385dd533431bcb41147..29737a27170c4e2f3c339e3473353449b268644e 100644 GIT binary patch delta 33 ncmbQ-&p5fCk^3|+FBbz4Br|zzl}FI6f}|0K^Fk{r~^~ diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_stride_tricks_impl.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_stride_tricks_impl.cpython-312.pyc index 80d5d58ccdf75dd77ae5c1bfe6bc13079db5cf36..b032f2133a75581c0981dbad414629278237e622 100644 GIT binary patch delta 33 ncmZpe$=EQHk^3|+FBbz4Br|zzPk;sEt<9+}{z3raM++YS delta 40 ucmdn8mT}8kM()$Ryj%=GAhF(UBR2~VtA0*qlKy59o&XERUz<~1{DlDKcnd`U diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_ufunclike_impl.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_ufunclike_impl.cpython-312.pyc index 0ce90c878f4ea909facf61660d08271b46fc301a..a0c450000a3e3dbd12c8643501beb93c3ca20057 100644 GIT binary patch delta 31 lcmca*am#}HG%qg~0}v!Ld2Hl diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_utils_impl.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_utils_impl.cpython-312.pyc index 0b6fc0c7399997cd868cfbca41e34c9863b38ac7..3a0baf82134e2826779175b1c09aad740ad67f79 100644 GIT binary patch delta 40 vcmex!obk_bM()$Ryj%=Gkj&(Gmx{@?-t7^@B4 delta 40 vcmex!obk_bM()$Ryj%=GAhF(UBlmB1R{fmJB>m0Y96tgWe{E)o{J{kP9NZ2A diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/_version.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/_version.cpython-312.pyc index c287ef245be77d9c8e084947fb125c72f47384a5..675b26283175e78e24dbf4059e2043d6f87abd66 100644 GIT binary patch delta 31 lcmaEE{M?xPG%qg~0}v!Ld2Hk^=Vpz`$xMpb+|HfA2LO&<2*CgV delta 31 lcmaEE{M?xPG%qg~0}x28ciYHa&dsWylbNKyxt%+K4*-#+2*&^b diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/array_utils.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/array_utils.cpython-312.pyc index 5feb17ea90d6a1639809e96990754dc7da6191be..a2fcc88f16ecccbfddcadc8e02bb91bc1105c737 100644 GIT binary patch delta 30 kcmcb_bcu=kG%qg~0}v!Ld2Hn7U}TNS$xMowEWv060B(8)?*IS* delta 30 kcmcb_bcu=kG%qg~0}x28ciYI#!N{tglbNJHS%T3D0CBqp^#A|> diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/format.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/format.cpython-312.pyc index b5af058167c80755feb6d8eb44aa6ffdf78c26ef..7204b9af01c07b1181d17d253329ffbcbc3dd6ee 100644 GIT binary patch delta 30 kcmeBR>tN$P&CAQh00hZQ9vit=F|o$vWG2N--o@kx0BAJ_y#N3J delta 30 kcmeBR>tN$P&CAQh00a{2-8OQsVq(?L$xPCpyo<>X0Bd#!!vFvP diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/introspect.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/introspect.cpython-312.pyc index e5e6daec3a255384de2506ec96274060e5e4d229..33996aeb99c16b7d11120079ebefe854ff811b3e 100644 GIT binary patch delta 31 lcmX>nc}|l1G%qg~0}v!Ld2Hmq&B+>*lbIB=`8DTbCIE^a36=l= delta 31 lcmX>nc}|l1G%qg~0}x28ciYH)o0C;PCo@TZ^J~t>OaP5#37h}` diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/mixins.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/mixins.cpython-312.pyc index 7a286af37bb998e7ed0343dfca73ce05953a0321..f280e2cf0f164cf603b50a0ef6286773fc8de8de 100644 GIT binary patch delta 31 lcmZp5Yjxv3&CAQh00hZQ9viv$GP1_xWG2OIKFesK2mpVF2!;Rv delta 31 lcmZp5Yjxv3&CAQh00a{2-8ORXWn|UQ$xPDUe3sEd5debD2#f## diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/npyio.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/npyio.cpython-312.pyc index 2f5f45722913750d460611a14d621bc5feb4e90e..52450a027a3273312f684c839ffd2a1643770dcb 100644 GIT binary patch delta 28 icmZo>YG&d-&CAQh00hZQ9uv6_v&Q6PCdEv=YybdSFbA0c delta 28 icmZo>YG&d-&CAQh00a{2-6nD$X4TKhOwylt*#H1t3kRP7 diff --git a/venv/Lib/site-packages/numpy/lib/__pycache__/scimath.cpython-312.pyc b/venv/Lib/site-packages/numpy/lib/__pycache__/scimath.cpython-312.pyc index a635a2624402e12f7ab0ace8f5e51885f41ce640..4d45829dc0dfcccd31d9f5e1ab48cd14c0b0f03e 100644 GIT binary patch delta 30 kcmeBY?q}vc&CAQh00hZQ9vivs8Chd;GLvE^`!hNK0Aj-i-v9sr delta 30 kcmeBY?q}vc&CAQh00a{2-8ORDGqUREWG3lP_Gfee0A>URj(z` diff --git a/venv/Lib/site-packages/numpy/linalg/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/numpy/linalg/__pycache__/__init__.cpython-312.pyc index 7c8bc8b4f53ebc42ceab57e4ffa11bbb50e9cc07..4db3aee1bf5bc3bfcb6b9b2911ee05dcc1a65d50 100644 GIT binary patch delta 33 ncmbOsG((8{G%qg~0}v!Ld2Hlf%E1wnlbM&8lO8j92S)+`iGvAG delta 33 ncmbOsG((8{G%qg~0}x28ciYIll!HS*Co?ZGCtZK?4vqu>ja>;< diff --git a/venv/Lib/site-packages/numpy/linalg/__pycache__/_linalg.cpython-312.pyc b/venv/Lib/site-packages/numpy/linalg/__pycache__/_linalg.cpython-312.pyc index 13b7cf0c614d381279b88ca241783931413698da..f0f7f8e7ba7b401cfc65a360f1363737e72696e5 100644 GIT binary patch delta 40 ucmdmdlYR3|cJ9->yj%=Gkj&(yj%=GAhF(UBexVEhkj0GUSdwVezPv$c3nQkwtE2hSquaK diff --git a/venv/Lib/site-packages/numpy/linalg/__pycache__/linalg.cpython-312.pyc b/venv/Lib/site-packages/numpy/linalg/__pycache__/linalg.cpython-312.pyc index 7c5454d5153e76ad58643966b3c895aba91f9ad5..5388825dac3800b025ee8917400431fa6a2443fc 100644 GIT binary patch delta 33 ncmey(_M46SG%qg~0}v!Ld2HmK#l#VllbM&8lO8j9Ez>ywo}&s$ delta 33 ncmey(_M46SG%qg~0}x28ciYH4i-|)&Co?ZGCtZK?TBdUVqJ0Wa diff --git a/venv/Lib/site-packages/numpy/ma/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/numpy/ma/__pycache__/__init__.cpython-312.pyc index 7b197fe07fa8f7715a37b2a620e9c52b36b1815a..92df85cee62ed63fdc63719bd2f2217ebebc809e 100644 GIT binary patch delta 29 jcmZqWZRO=Y&CAQh00hZQ9viut*jQq66JsU|vXuY;SV{&s delta 29 jcmZqWZRO=Y&CAQh00a{2-8OPFv9ajqChAWXWGevxTUZ7@ diff --git a/venv/Lib/site-packages/numpy/ma/__pycache__/core.cpython-312.pyc b/venv/Lib/site-packages/numpy/ma/__pycache__/core.cpython-312.pyc index 6e6eff8b90eff4eb0ea38507d851cf618ad98e72..e54b1bf5159e72bf62f05f85d80bf0823b25982f 100644 GIT binary patch delta 55 zcmeBc7Vc{n=045K%f$c$$xI#_xjWQYVsaB>HcwY;=U}|mEU(`#ug?g?OhC-MU0$Ch Ge-Z$tdk-D} delta 55 zcmeBc7Vc{n=045K%f$c$66@VIa(Ae)=;tQtZ=SB!&cXPrSzf%0dDax$K$xMpb?8$PV0|3w*3%mdT delta 39 tcmeC2#nd^AiTgA!FBbz4NUV3;$ZgERt)H7%Qj}SdlbNKy*^}i!2LRNS3&H>Z diff --git a/venv/Lib/site-packages/numpy/random/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/numpy/random/__pycache__/__init__.cpython-312.pyc index 81d25835ed607f7f4245898a977cd483b867f36a..d8de0019cad7708de520960e26cda31817cde570 100644 GIT binary patch delta 34 ocmX?Zb=->kG%qg~0}v!Ld2HmKEX@&9l$e*2pBuAzne;+N0IE(3YXATM delta 34 ocmX?Zb=->kG%qg~0}x28ciYH4S(-z?C^0W3KUaVAGUl$e*2pBuCJD{~e*0IQM;kN^Mx delta 34 ocmcaFc3+J9G%qg~0}x28ciYJQh?zsbC^0W3KUaVASLQ5s0IzZimH+?% diff --git a/venv/Lib/site-packages/numpy/rec/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/numpy/rec/__pycache__/__init__.cpython-312.pyc index bff65ebc13f7c11d4fa6edc6e922337d5c8dd867..5a35a0d5e8fa74e36578a2ca23d70b2dd317cce3 100644 GIT binary patch delta 28 icmeBX>Sp3T&CAQh00b#a9uv8bvc?ppCdW*?Y6bvYBnP(u delta 28 icmeBX>Sp3T&CAQh00a{2-6nD$Wz{cAP1c`y)eHb$@CUpA diff --git a/venv/Lib/site-packages/onnxruntime/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/onnxruntime/__pycache__/__init__.cpython-312.pyc index 6b629f8d6f4ed1acf7a4fd10db3a7a52a939c55b..58e56d8991892554a376d86cd5565b8ee09200a3 100644 GIT binary patch delta 27 hcmcbec{`K)G%qg~0}!Mzd2Hlf$;KG7c`KWm9sqWQ2fF|O delta 27 hcmcbec{`K)G%qg~0}z<4ciYIll8sS+^Hw%BJpg;82nzrJ diff --git a/venv/Lib/site-packages/onnxruntime/capi/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/onnxruntime/capi/__pycache__/__init__.cpython-312.pyc index c1d7d12af0ec271e2c62caca5c07b23ba57ce6da..a2bf241b0a0b17a4bc846897c419a98bab6bc578 100644 GIT binary patch delta 29 jcmdnWxRsInG%qg~0}!Mzc}(OkXNyTrEXa(R*r5vmXt4*$ delta 29 jcmdnWxRsInG%qg~0}z<4cbmvv&ZeK7Sdghdu|pRCZI1`+ diff --git a/venv/Lib/site-packages/onnxruntime/capi/__pycache__/_ld_preload.cpython-312.pyc b/venv/Lib/site-packages/onnxruntime/capi/__pycache__/_ld_preload.cpython-312.pyc index 2b706612735a74df8be60b10e5ffbd7925afc01d..bf5eb49b19def10c4f908b0bb4665621c15655d6 100644 GIT binary patch delta 29 jcmdnNxPy`VG%qg~0}!Mzc}(OkXNyTrEXa(R*kJ$wXlKUtdPEC7S22vPt5 diff --git a/venv/Lib/site-packages/onnxruntime/capi/__pycache__/build_and_package_info.cpython-312.pyc b/venv/Lib/site-packages/onnxruntime/capi/__pycache__/build_and_package_info.cpython-312.pyc index f0e89ec4ea7fe7001ffc5bb283a7a388b2e43203..6e75665345535e3c5a52568ed6d5186123db2a07 100644 GIT binary patch delta 29 jcmZo-YGUF(&CAQh00b#a9uv9Ou*D=N7G%au-0KPeV2B6j delta 29 jcmZo-YGUF(&CAQh00d_1-6nFcVbf1eEXdTKxYrc`Wo8Hp diff --git a/venv/Lib/site-packages/onnxruntime/capi/__pycache__/onnxruntime_inference_collection.cpython-312.pyc b/venv/Lib/site-packages/onnxruntime/capi/__pycache__/onnxruntime_inference_collection.cpython-312.pyc index 04a81f281502fc2e9b62c01083973e162df94121..a8a6a9385a11192a8687b993574b9f52c63fa527 100644 GIT binary patch delta 34 ocmcb(pZVf`X71Cxyj%=Gkiz7#kvo@#Ehag!ATwrj9ZT?S0Ju~Nx&QzG delta 34 ocmcb(pZVf`X71Cxyj%=GV7A_EBX=$fn|^X)L8kuZI+ozu0KN4J-2eap diff --git a/venv/Lib/site-packages/onnxruntime/capi/__pycache__/onnxruntime_validation.cpython-312.pyc b/venv/Lib/site-packages/onnxruntime/capi/__pycache__/onnxruntime_validation.cpython-312.pyc index 14ff37842156a1fb97637c606867a67a8e17bb5a..13eb13455662d89314d859b43e6ab5b2254367a3 100644 GIT binary patch delta 32 mcmaE<{ZgCzG%qg~0}!Mzd2HlnV`qy=PAtfb*(}a}i4OpeE(oRo delta 32 mcmaE<{ZgCzG%qg~0}z<4ciYI##?GdnoLG>lzge995+4AR&j`r? diff --git a/venv/Lib/site-packages/onnxruntime/capi/__pycache__/version_info.cpython-312.pyc b/venv/Lib/site-packages/onnxruntime/capi/__pycache__/version_info.cpython-312.pyc index f5ffd8e29ff442376ed59f0391115084125c85bb..c863d53a46d72d78690ac309fbb38f4092c6f7e2 100644 GIT binary patch delta 29 jcmcc3c$<;?G%qg~0}!Mzc}(Q)XNyTrEXa(RxWF0!az_YL delta 29 jcmcc3c$<;?G%qg~0}z<4cbmxF&!(T8Sdghdae*}ecO?jR diff --git a/venv/Lib/site-packages/openai/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/__init__.cpython-312.pyc index 1e4153f5523ce4494a6ec146189b812756225525..153c459a0dd9524ce17ce06731140f44be64c15d 100644 GIT binary patch delta 30 kcmbOkJu{l`G%qg~0}!M#d1Nfn+Q`?=#~8DD8XvPf0Ds~K^#A|> delta 30 kcmbOkJu{l`G%qg~0}$w}cgrx)+{o9?$Ed$~8XvPf0DsK~#Q*>R diff --git a/venv/Lib/site-packages/openai/__pycache__/_base_client.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_base_client.cpython-312.pyc index 45f9b4ca1cc740feae2e16bc8dce6c3528cd9a58..b61f8786716c19a05d27808ed133080286f31eed 100644 GIT binary patch delta 36 rcmbQTmSxIX7QWNGyj%=Gkjmtdv7Boo-*sNbnC54^+n@0=uHygz#A^#D delta 36 rcmbQTmSxIX7QWNGyj%=GptIgB;}z3JzU#b<`pwUHw?E@$T*m4n`MzS0DOE16951J delta 30 kcmdn%u-Ad_G%qg~0}$w}cgt{--pJR(!l=J_Hp?Pu0E3VSZ~y=R diff --git a/venv/Lib/site-packages/openai/__pycache__/_constants.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_constants.cpython-312.pyc index d289d6c1f3c1813d7803708fbd24a6b457740d23..3a551cc28befdca3ce37399a2c9ebd0114ccf452 100644 GIT binary patch delta 28 icmdnXx|fyrG%qg~0}!M#d1O4?$ZN*L7&F<0sS*HYC0?jQ{`u delta 30 kcmX?Ram<46G%qg~0}$w}cgxr(w2|))Go$|I*UZrp0F3$xH2?qr diff --git a/venv/Lib/site-packages/openai/__pycache__/_files.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_files.cpython-312.pyc index a97f42728ba608ef8b64f7fe7461a83293aef3a4..018cf50988fa361ed6ea1514e0d7ea68af5726da 100644 GIT binary patch delta 29 jcmaE%|3aVlG%qg~0}!M#d1TDq$jivg7_*t5`KAZ}dk_b% delta 29 jcmaE%|3aVlG%qg~0}$w}cgs-N$jivgsK1$?`KAZ}dbJ05 diff --git a/venv/Lib/site-packages/openai/__pycache__/_legacy_response.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_legacy_response.cpython-312.pyc index 4b6d383c7db12ba36eef94d205dfee55141a734d..41fd9cdb21b2ef40e6c18066eb62dc0c5787b35e 100644 GIT binary patch delta 32 mcmX@Lk@3_+ZzCsT%;p1}T>b!|vI$NA delta 32 mcmX@Lk@3_gBtqG|B diff --git a/venv/Lib/site-packages/openai/__pycache__/_models.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_models.cpython-312.pyc index 8d944a43f280468afbc3e3b9f892a9c05ae002e3..2ccaba6b44d80b44fa21476595795407ddcb50b1 100644 GIT binary patch delta 32 mcmX@|mhs42M!wU$yj%=Gkjmtd@u_+v9}fp(%w}nhm3aWMx(WjT delta 32 mcmX@|mhs42M!wU$yj%=GptIgBV`;@kJ{}H6{ms%GEAs%ehza-r diff --git a/venv/Lib/site-packages/openai/__pycache__/_module_client.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_module_client.cpython-312.pyc index 98af929a484ccf199b0b6b0f6d176ed6473d740c..ae3ccc4d12cb95f2df886c05d4b27037ef3c54e3 100644 GIT binary patch delta 30 kcmez5_{ov)G%qg~0}!M#d1S;0Y~+*RV2s(U&T(1-0EHk2=l}o! delta 30 kcmez5_{ov)G%qg~0}$w}cgr}>zmZRZgHeC8I>%`V0FcHAp8x;= diff --git a/venv/Lib/site-packages/openai/__pycache__/_qs.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_qs.cpython-312.pyc index 90ec7e5acfcc8a9f0443d439efe9872a6d06fbaa..746e45dd2d70ac3ac83cb0001ba9b4beb4f0fb14 100644 GIT binary patch delta 30 kcmX@Cdsvt6G%qg~0}!M#d1SN*Z{*`)VT{=<&9XuW0CzG6L;wH) delta 30 kcmX@Cdsvt6G%qg~0}$w}cguJuw2_a8g;9UAG|LJh0D@x&@&Et; diff --git a/venv/Lib/site-packages/openai/__pycache__/_resource.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_resource.cpython-312.pyc index 4b7d2ec938917f1cde82bb9c60e52f79ca0b6998..fdf4d532907808fc56e8fd903ff1126a5d759835 100644 GIT binary patch delta 29 jcmcaAa8-c!G%qg~0}!M#d1RDtxED-+oR;{mth%``Q7lCJL4S diff --git a/venv/Lib/site-packages/openai/__pycache__/_streaming.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_streaming.cpython-312.pyc index f0716dd810561665c1a62726c47eb037ed50e103..5cd87df28403426805bb51b912b526f5a766bf76 100644 GIT binary patch delta 32 mcmccF#(1-hk?%AwFBbz4q%wJAB$#gG`^mx>vzdc6&<+5bObF5d delta 32 mcmccF#(1-hk?%AwFBbz4=&X0kIA*+&?u=Ksx}YJqddN diff --git a/venv/Lib/site-packages/openai/__pycache__/_types.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_types.cpython-312.pyc index 152ac03e38441570f161811a5c8abf5584e6cc95..a5a0de57669c4883a426af32e6693c20cd6eed99 100644 GIT binary patch delta 30 kcmbPXF~frIG%qg~0}!M#d1RDIZsb$qV2s&p$njhl0C6e@ZvX%Q delta 30 kcmbPXF~frIG%qg~0}$w}cgvU|v5`-SgHeC8A;)uJ0C>O$)&Kwi diff --git a/venv/Lib/site-packages/openai/__pycache__/_version.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/_version.cpython-312.pyc index 9aa90c79120529c983d1ab70b87cf0ea3357a42c..3ac4730f842a027713686bbb6d61438f7f9ee839 100644 GIT binary patch delta 26 gcmaFD_=J)7G%qg~0}!M#d1Ne}$UB!YX5wl~0AQ*IjsO4v delta 26 gcmaFD_=J)7G%qg~0}$w}cgvVRk#{bm{>0Um0A%wA&j0`b diff --git a/venv/Lib/site-packages/openai/__pycache__/pagination.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/pagination.cpython-312.pyc index ac80b8dd78189edd1c2649ada42ce4bfc5b98148..998601b75a27c1c4f83b68fc96c12f98a6a618f6 100644 GIT binary patch delta 30 kcmeyY{8^drG%qg~0}!M#d1R>bZshyN#2B-gm-!hV0E3VSNB{r; delta 30 kcmeyY{8^drG%qg~0}$w}cgtACvytx~6QllSUgl?f0FVX=4*&oF diff --git a/venv/Lib/site-packages/openai/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/openai/__pycache__/version.cpython-312.pyc index 47ba1e070b9ffb3bfda4e9d60b3cdaac92811559..db4d1d0efe54383673902a367376939c18c85200 100644 GIT binary patch delta 26 gcmbQvG@Xg}G%qg~0}!M!d1N?F delta 35 pcmeyw`-zwLG%qg~0}$w}cgt9}kvD*iLqEQ>Br~U2e{w2YF95rJ3daBd diff --git a/venv/Lib/site-packages/openai/_utils/__pycache__/_logs.cpython-312.pyc b/venv/Lib/site-packages/openai/_utils/__pycache__/_logs.cpython-312.pyc index eed7c5168240022dcb61f0dcecaf77078bc1ecec..0ca9ec6bd7054f36540014555a0d4ab3da0b6915 100644 GIT binary patch delta 36 qcmbOxGEIc{G%qg~0}!M#d1MrB0&P$;>H^**u4-iX8x`xC%l5 delta 36 qcmbOxGEIc{G%qg~0}$w}cgt|!$lK1up&wsbl9^Mizj+Q*6*~Z{*a|QJ diff --git a/venv/Lib/site-packages/openai/_utils/__pycache__/_proxy.cpython-312.pyc b/venv/Lib/site-packages/openai/_utils/__pycache__/_proxy.cpython-312.pyc index 97cf220c09d181255af3357ac6a66eabeda05f9c..2a81cbe710e68bae85c68397d07dccabcd6bcc59 100644 GIT binary patch delta 36 qcmeB_>XhO=&CAQh00gN_9vMG2@>(%-#Kf1DWabpdZ1!i~#R&kbR|;hS delta 36 qcmeB_>XhO=&CAQh00cVg-7>asI%-|Wx4ixU8>!U{Y9 diff --git a/venv/Lib/site-packages/openai/_utils/__pycache__/_reflection.cpython-312.pyc b/venv/Lib/site-packages/openai/_utils/__pycache__/_reflection.cpython-312.pyc index 9f7881a605169ef72bce0f22026ed2e035116b79..3e3dde654c6af101a66d470c905729585c3a44b7 100644 GIT binary patch delta 36 qcmdlhxL1((G%qg~0}!M#d1UP0$a{*BBPPDIBr~TtX7hcBr~U2fAdqOO^g7q!V2a9 diff --git a/venv/Lib/site-packages/openai/_utils/__pycache__/_streams.cpython-312.pyc b/venv/Lib/site-packages/openai/_utils/__pycache__/_streams.cpython-312.pyc index 51e93c9fe9ecd6434c1609f012fa9e3444a334cd..88734b3bca32160c2e9f76dee493194fe58ec90a 100644 GIT binary patch delta 36 qcmaFP`ka;bG%qg~0}!M#d1UBr0&P$;>H^*=)nOnh^l5pb6^$ delta 36 qcmaFP`ka;bG%qg~0}$w}cgs-R$g9rCp&wsbl9^MizuAUyH6sAC`U&>{ diff --git a/venv/Lib/site-packages/openai/_utils/__pycache__/_sync.cpython-312.pyc b/venv/Lib/site-packages/openai/_utils/__pycache__/_sync.cpython-312.pyc index 8668ab46de50db0f6bca58d8798a95af487e3c42..67345964bd868801cdf236b6ca11f601e210b39f 100644 GIT binary patch delta 36 qcmew+`%RYjG%qg~0}!M#d1SO~0&P$;>H^*{sESh7$n3xeA>C delta 36 qcmew+`%RYjG%qg~0}$w}cgxV*$Scaqp&wsbl9^Mizgdg*3?~4-l?q<~ diff --git a/venv/Lib/site-packages/openai/_utils/__pycache__/_transform.cpython-312.pyc b/venv/Lib/site-packages/openai/_utils/__pycache__/_transform.cpython-312.pyc index f0fec6638264ff57e51038ca386134f8474c0a72..f1bb5b908d96b49fcf0cdcfa531619b31fae81f9 100644 GIT binary patch delta 37 rcmX?KdcKtJG%qg~0}!M#d1QRB+sLQD&Jhz|T9TPl9JASseWo!0-jfTx delta 37 rcmX?KdcKtJG%qg~0}$w}cgrxe-N>iF&Y>S)T9TPltiRceeWo!0)x diff --git a/venv/Lib/site-packages/openai/_utils/__pycache__/_typing.cpython-312.pyc b/venv/Lib/site-packages/openai/_utils/__pycache__/_typing.cpython-312.pyc index 46326397d794f3734f89de06736c48de5c358e7f..ae6b2025035ae48e2def039f91ed8e15bb399176 100644 GIT binary patch delta 37 rcmcbhaY2LcG%qg~0}!M#d1Oo!+Q@gAi6bVyv?Md9IA-%prgT97%sC69 delta 37 rcmcbhaY2LcG%qg~0}$w}cgy%CxRLKN6Ni3$X-Q^IvHs?lOzDCE+X@UK diff --git a/venv/Lib/site-packages/openai/_utils/__pycache__/_utils.cpython-312.pyc b/venv/Lib/site-packages/openai/_utils/__pycache__/_utils.cpython-312.pyc index 4c525f9a4595f82539b90e79d53cd9a932683162..fc4f041c5fd97098dae67a3ae44f3802b53ced62 100644 GIT binary patch delta 39 tcmZ49#<;wVk?%AwFBbz4q%wJA7sFetc<3W=^sGW@ delta 33 ncmca5a!Z8wG%qg~0}$x0cgvW)kvE=&RX-;)Nq=)8%S%=Op#2HY diff --git a/venv/Lib/site-packages/openai/lib/__pycache__/_pydantic.cpython-312.pyc b/venv/Lib/site-packages/openai/lib/__pycache__/_pydantic.cpython-312.pyc index 39258f469d9985397dd940bc311e2d939bb2de91..b7c0c0c207ee6ea77aa3cc88d8399ac397af46de 100644 GIT binary patch delta 34 ocmZoRZZ_sS&CAQh00gN_9vMAi8~J83v&Q6PCdF)C!+c#70F|E!zyJUM delta 34 ocmZoRZZ_sS&CAQh00g@0-7-FkZseQE%&MQ0nWVpY4fAzT0HQhyJpcdz diff --git a/venv/Lib/site-packages/openai/lib/__pycache__/_tools.cpython-312.pyc b/venv/Lib/site-packages/openai/lib/__pycache__/_tools.cpython-312.pyc index 870470de1cd473aa3ea7e6988a8088973da4b09c..0dd435fc8234c77bcd95991512bcd1493fa7da7b 100644 GIT binary patch delta 33 ncmZn_YZc=?&CAQh00gN_9vP1}^7=Eg#^hus#cWPwUcwFliH`{L delta 33 ncmZn_YZc=?&CAQh00g@0-7*$#=fpBx)&OipG}%w|Kjv=9Kjm) diff --git a/venv/Lib/site-packages/openai/lib/_parsing/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/lib/_parsing/__pycache__/__init__.cpython-312.pyc index 59e70e1fec738157e429d89513ca9dfd83754aec..634581d2662047534085d0db5349b1eb2fb055b4 100644 GIT binary patch delta 41 vcmbQvGM$C@G%qg~0}!M#d1R<>4a diff --git a/venv/Lib/site-packages/openai/lib/streaming/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/lib/streaming/__pycache__/__init__.cpython-312.pyc index e17a59471c503842680d49d5c0e5a715845228d3..ea5b0d1bc389a7462e69e0db9be9b67031ee5afa 100644 GIT binary patch delta 42 wcmdnOyoH(fG%qg~0}!M#d1N$iOipG}OmRt3YGQ6?UV6;tFpl%90Z<4J AhX4Qo delta 46 zcmZ4bf@$dsCce|Wyj%=Gpu65JDDNOipG}OmRt3YGQ6?UV2P&Mq)|KW?8Q9 Fc>ud05-|V( delta 51 zcmbR8iE+v&M!wU$yj%=Gpu65JBdcN~-)~M4{hZ7s{o<0M)WqD(ymbBKjKmWC&9YqI F^8mi{5$gZ| diff --git a/venv/Lib/site-packages/openai/lib/streaming/chat/__pycache__/_events.cpython-312.pyc b/venv/Lib/site-packages/openai/lib/streaming/chat/__pycache__/_events.cpython-312.pyc index a0f33412b692f51d26560963d89cf96568322bd4..0ad7d0ff8eff7d000824497f2186780006361777 100644 GIT binary patch delta 48 zcmX>oe^8$HG%qg~0}!M#d1P$e$eX|{5|fje6jNMMl$w~EnU@}uoRL@(v$>Jkfd>Fx C5D!uS delta 48 zcmX>oe^8$HG%qg~0}$x0cgwKa$eX|{qMwtQq+eW8l$w~EnU}7goRL_fzqygwfd>Fm CC=QkY diff --git a/venv/Lib/site-packages/openai/lib/streaming/chat/__pycache__/_types.cpython-312.pyc b/venv/Lib/site-packages/openai/lib/streaming/chat/__pycache__/_types.cpython-312.pyc index d49eb692e80326e4a7137dd528c275f96dee49e7..50d2997d12d10c33504efac37aba042ed6c89291 100644 GIT binary patch delta 47 zcmZ3=x|EgoG%qg~0}!M#d1QRw$jiqh5|fje6jNMMl$w~EnU@}uoRL@(Gg+Uh3;;Mp B4vYW* delta 47 zcmZ3=x|EgoG%qg~0}$x0cguLZk(ZB2L_a4pNx!(HC^a!RGcR2~IU}(|f3iMP82~ye B4mSV* diff --git a/venv/Lib/site-packages/openai/resources/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/__pycache__/__init__.cpython-312.pyc index b4d8e0d35881cbf37a27a48887ec4c93c6c70745..16fa001e3a491195f8bf480adae7f25673b44f4c 100644 GIT binary patch delta 39 tcmaDS|4yFoG%qg~0}!M#d1PpaZ{*|R=Z+~#EzU13N=_|~nXJrz8UWM13v>Vg delta 39 tcmaDS|4yFoG%qg~0}$x0cgqMA+sMbo&#hmSTAW{6l$=_uKUtaoGyvYO3$*|M diff --git a/venv/Lib/site-packages/openai/resources/__pycache__/batches.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/__pycache__/batches.cpython-312.pyc index 50f03cdf0a36f91ee5dd8329e1e0fcb957ebd6a4..77bb62044c47ae223802a090fa5e47e5fd4691a8 100644 GIT binary patch delta 40 ucmZ2qu)curG%qg~0}!M#d1Pb-ZshyM${kabTAW{6l$=@|vzebw!3Y5U)(n6E delta 40 ucmZ2qu)curG%qg~0}$x0cgx7|-^llkm0Q0kwK%`DC^@xQe=|Ruf)M})B@C4S diff --git a/venv/Lib/site-packages/openai/resources/__pycache__/completions.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/__pycache__/completions.cpython-312.pyc index df5abd8fcd295feb65011eb491f4dc18c9ed6a1b..499da7f92d743558e4b3f90f3e165cbc2a034192 100644 GIT binary patch delta 42 wcmex%o$=dsM!wU$yj%=Gkjmtdk^g=p-+OlMn4;9;{L-T2)Z&=U931bG0Z1+nb^rhX delta 42 xcmex%o$=dsM!wU$yj%=Gpu65Jo><7U!21C8rk0Y@WxOt_T3=Jq&yR delta 40 ucmZqmYxUzh&CAQh00g@0-7;3_Z{%xb<<>7sEzU13N=_}--#m{sT@e86g$!^2 diff --git a/venv/Lib/site-packages/openai/resources/__pycache__/files.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/__pycache__/files.cpython-312.pyc index 7cb2d717e25683f8196e96a10a74fe3e3aab70cb..4ca3897f12e4509b9e3c9b0f244097fd862d465a 100644 GIT binary patch delta 42 wcmbQZh;iZ~M!wU$yj%=GkjmtdAymGRZwWhhOi^laerZv1YH`fwz3d^L00AWpA^-pY delta 42 wcmbQZh;iZ~M!wU$yj%=Gpu65JL!x9O-x79i{i4+3{L-T2)MEY3d)Y%g0SN~UJ^%m! diff --git a/venv/Lib/site-packages/openai/resources/__pycache__/images.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/__pycache__/images.cpython-312.pyc index a0cded741cf77b67f9862ba1aa8cfdc6757607d4..3b4e93d586d6219e4f9a52290acbc7bb810970c7 100644 GIT binary patch delta 42 xcmZ3moN>W&M!wU$yj%=Gkjmtdv8rPu-xN0Pn4;9;{L-T2)Z&=UYuP^g000(A4s!qi delta 42 xcmZ3moN>W&M!wU$yj%=Gpu65J<6`SZzA0?n`bDY5`K3k4sm1!6*Rp-~0RSN)4zK_K diff --git a/venv/Lib/site-packages/openai/resources/__pycache__/models.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/__pycache__/models.cpython-312.pyc index 2f2d6595ceb205591d01bde7faecd1db0b02d0ee..1558ebeb17c4fbe43f704e169960a51b2fd20ee4 100644 GIT binary patch delta 40 ucmez6{>z>3G%qg~0}!M#d1MIbZscQO<&G&zEzU13N=_|~*(}R?R}KK~DGUq% delta 40 ucmez6{>z>3G%qg~0}$x0cguL7y^)WFm0Q0kwK%`DC^@xQf3qy>T{!>f_=)&CAQh00gN_9vN3Q@=jq9j44Vj&Mz%WPA!f}EKSMGkD0uQB?bT!3JxUz delta 44 ycmeC<>f_=)&CAQh00g@0-7=dG%qg~0}!M#d1SDvZ{&+$6^toLEzU13N=_|~Ni0pt%#Ybz&YCC%064D> AM*si- delta 46 zcmca%f5V>dG%qg~0}$x0cgqk^+sGHeDyUzSTAW{6l$=_upIDlbnXkXOoHbDj06_E( AJpcdz diff --git a/venv/Lib/site-packages/openai/resources/audio/__pycache__/transcriptions.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/audio/__pycache__/transcriptions.cpython-312.pyc index d9805122d00154b97d6d8131f04416d02d2135b5..00d8d23c0a909c833b3fe627787d44ed933a155a 100644 GIT binary patch delta 48 zcmdnCgK^sqM!wU$yj%=Gkjmtdp*DXbUlXTbOi^laerZv1YH>_rX-Z~(%;trhQ-c6; CqYzjC delta 48 zcmdnCgK^sqM!wU$yj%=Gpu65JLt@TGz9vpV{i4+3{L-T2)MEX_(v-}6{mlzGrv?E4 DcH0m$ diff --git a/venv/Lib/site-packages/openai/resources/audio/__pycache__/translations.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/audio/__pycache__/translations.cpython-312.pyc index d637c1b8bdc9c99d3c51b3624f1c6a019ca5aa89..aab5c31bc54b7dcb77bc874b5db84d39403697f9 100644 GIT binary patch delta 46 zcmX?{a5#bQG%qg~0}!M#d1S1z+sNn7E*MjkTAW{6l$=@|lUSOPnIE$`kNv6!08#-D Aj{pDw delta 46 zcmX?{a5#bQG%qg~0}$x0cgwK0-N@(9E~sCWTAW{6l$=_upIDlbnXkV&kNv6!08Dfb A3jhEB diff --git a/venv/Lib/site-packages/openai/resources/beta/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/beta/__pycache__/__init__.cpython-312.pyc index 546169eb3913ff6dd8dba7cb0e8b98f0c9445bfc..d2f9fdbbfab6502cc4a153690231c1623fd27113 100644 GIT binary patch delta 43 xcmcb>eu16$G%qg~0}!M#d1O4=$eYM45L1*|oL^d$oLU@{lveu16$G%qg~0}$x0cgxtkkvEZ9K))!pIKQ+gIki|nDYYa~e{vmj5C9h*4TJyy diff --git a/venv/Lib/site-packages/openai/resources/beta/__pycache__/assistants.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/beta/__pycache__/assistants.cpython-312.pyc index eb851777f9e9651dc1b7e0043e88fa8941e42925..2fb1f26cf902fffa230ad8970a83235bcf4a8401 100644 GIT binary patch delta 47 zcmaEKiSf}TM!wU$yj%=GkjmtdF>BjKzRBzYF-57x`K3k4sl_o#sU?Xqn>Vs=OauUm Cvk^c5 delta 47 zcmaEKiSf}TM!wU$yj%=Gpu65JW9g=ie3RJ)^ovr9^Gl18Q;YSJQcDu`H*aL$mG= delta 45 zcmZp7ZFl86&CAQh00g@0-7?ZdH}dUe5zsG6EzU13N=_}-Pf9IG)ZcuYWsNKVD)J7B diff --git a/venv/Lib/site-packages/openai/resources/beta/chat/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/beta/chat/__pycache__/__init__.cpython-312.pyc index 71ceac37858fd5fee845e18359bbf2ab6276e1b2..b0bc5c431b2b2a140d219240e02836285259337e 100644 GIT binary patch delta 48 zcmeyw^ofc0G%qg~0}!M#d1MG}7oL^d$oLU@{lv9WzbLghzqBYhwOBtXwIoqLIU}(|e{&OO GhaUj2Wf4>W diff --git a/venv/Lib/site-packages/openai/resources/beta/realtime/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/beta/realtime/__pycache__/__init__.cpython-312.pyc index fb6596745cb2456898e4a3603db082fd80bfc909..be4199204cbca74251cfc804fdb080bd8c3d82c3 100644 GIT binary patch delta 52 zcmX@baf*ZYG%qg~0}!M#d1P$f$a{%dGNvfCIKQ+gIkh+@DYYaK$W6>C$;?fSnf!w} F2mr1;5-|V( delta 52 zcmX@baf*ZYG%qg~0}$x0cgtwm$a{%dQoks*IKQ+gIki|nDYYaK$W6>C$;?gFpZtS4 F2mq|)5y1ce diff --git a/venv/Lib/site-packages/openai/resources/beta/realtime/__pycache__/realtime.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/beta/realtime/__pycache__/realtime.cpython-312.pyc index 0ff9f792ac7388c62a312dabd24307632dd36861..4e29d25e4c38b4a3a01fb7ddc82cf8ebf7110e85 100644 GIT binary patch delta 56 zcmdmSmubgcCce|Wyj%=GkjmtdA+&BIUpc2_Oi^laerZv1YH>_bYDprHo0wCQnVTB3 Jc^;?KQUDK`6RrRN delta 56 zcmdmSmubgcCce|Wyj%=Gpu65Jy`bDY5`K3k4sm1z9sU?X(ZemVJW^Stf J=6Re_O93xf6eIuu diff --git a/venv/Lib/site-packages/openai/resources/beta/realtime/__pycache__/sessions.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/beta/realtime/__pycache__/sessions.cpython-312.pyc index f7df431302f9a5cc597dc913f0d1e378f7dccd14..132a98b72bb575f37aa38715602de9f1d41997de 100644 GIT binary patch delta 54 zcmdm5xV4b)G%qg~0}!M#d1NR=Y~(9qm5eD$EzU13N=_|~NlGnA1acE|N-}d(V>ZuZ Hl`#eY(G(H_ delta 54 zcmdm5xV4b)G%qg~0}$x0cgrXX+sIeMDyd(TTAW{6l$=_upOjjX2;?T_lw{_n>TjOO HDq{=);(-zs diff --git a/venv/Lib/site-packages/openai/resources/beta/realtime/__pycache__/transcription_sessions.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/beta/realtime/__pycache__/transcription_sessions.cpython-312.pyc index 904a49ed7e4374621d264820f18ae5c211bc77e7..97c7a64046459535606734299881f74fb214f163 100644 GIT binary patch delta 58 zcmdnxzssNRG%qg~0}!M#d1Sa)Y~%}Pm5eD$EzU13N=_|~NlGnA1acE|N-}d(VQCmE L5ZyePRb2@H35gOI diff --git a/venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/__init__.cpython-312.pyc index abdf148828dbea909796f56fdd1ffd3ac79ccee6..8d55a4c80a4330b1f651428b32c7a4b572573d45 100644 GIT binary patch delta 51 zcmX@beu|y&hwlOi^laerZv1YH>_bYDr>DNk&m>VoGt$ J<_qkFZUFUU6K?&hw$Byj%=Gkjmtd;n=&8FM>}ZrYN;IzqBYhwKygzwIng7B%>%bF{L$Byj%=Gpu65JV^ix!z6d@E{i4+3{L-T2)MEXl)RIK~l8mC%#FS$F K&2@b1b^`$I852kV diff --git a/venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/__init__.cpython-312.pyc index 275c6efd4205b640adcf7f2b495ea8623cd8e550..83970d3729149d36b511fab7307c181b32ceab9c 100644 GIT binary patch delta 56 zcmdnPx`&nbG%qg~0}!M#d1R<;~bjVVek&Mz%WPA!f}N-ar@Daj~GO-w0{DJsn? Kj+tD-%bF{L=B Ss5GxQra44(dx$7wz9ImyZ55*c delta 64 zcmX^7mgVqU7QWNGyj%=Gpu65JgCTw+pQfm+eo<<1erZv1YO#J&YDuDgNk&m>VoI@o SQE6VWeshTE_7G9Vd_@4QHx(NI diff --git a/venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/steps.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/steps.cpython-312.pyc index 9ce2cb94dc555d062abbc65b07890f936d6d6ad2..ef31e17026996b85c60aae232d74bbabc5086b4e 100644 GIT binary patch delta 58 zcmbQAI6sl^G%qg~0}!M#d1TnQY~&MTlZ`1#EzU13N=_|~NlGnAj48<|N=-~Djwve5 MD~{Rh$QGvs00RpX1poj5 delta 58 zcmbQAI6sl^G%qg~0}$x0cgtAow2@DYO;*1swK%`DC^@xQKPj~&QNJXkC^a#qSih(= MuULPxBU_vn02ka71^@s6 diff --git a/venv/Lib/site-packages/openai/resources/chat/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/chat/__pycache__/__init__.cpython-312.pyc index 4ba5539a0f8c987adc39c3e7f7610887d5ee4c2f..f5c67d339226c0352435d9b6844e44dc732c5770 100644 GIT binary patch delta 43 xcmcb~dXts+G%qg~0}!M#d1MrAd+&CAQh00gN_9vRCv@=joqi784g&Mz%WPA!f}&PXhYNzTtL$Vn~9%+D*1 JnY@$90|30q5@G-V delta 55 zcmZod+&CAQh00g@0-7;D?@=joq(Jx9Z&Mz%WPA%3?&PXiLPtMOR$Vn~9%+D*< JpS+XF0|30d5&!@I diff --git a/venv/Lib/site-packages/openai/resources/chat/completions/__pycache__/completions.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/chat/completions/__pycache__/completions.cpython-312.pyc index 8603abef12977e2ec1ccfc3208e4a4235c5c7bd6..0802fbdf682aeedb87a6f95386cf0c49d0ac118d 100644 GIT binary patch delta 59 zcmbQdk9qPwX1>$Byj%=Gkjmtdq5OU$-zjdHn4;9;{L-T2)Z&=rjKq?d$Byj%=Gpu65Jcn3)Ltk0Hh F3ILB;5P$#x delta 51 zcmbPLKC7JXG%qg~0}$x0cgx7~-pI$zCZ=DMTAW{6l$=_upPZjpl9-v7T2!pRS)VQ2 F6abdk5NiMc diff --git a/venv/Lib/site-packages/openai/resources/containers/files/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/containers/files/__pycache__/__init__.cpython-312.pyc index f2caaa2d661e1337e34ab5d804f9a36311f6a7a0..1f1bd38e8f248028267d4d058238321bf943f174 100644 GIT binary patch delta 55 zcmcb>dV!VqG%qg~0}!M#d1QERdV!VqG%qg~0}$x0cgxV)$Q#cjqhFL-oL^d$oLa1(oS#>cn3Ei(rw Ku=x~=p$GsSnG<;c diff --git a/venv/Lib/site-packages/openai/resources/containers/files/__pycache__/files.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/containers/files/__pycache__/files.cpython-312.pyc index 9c6d88e3423c14c39d090b644860a73eb45fb14a..f35056be7ad3366ec5fb839e6e2bb1b111a00fe9 100644 GIT binary patch delta 59 zcmbQ($T+c)k?%AwFBbz4q%wJAEDYJm=gKA%Q|_j44Vj&Mz%WPA!f}ElbQPj+van diff --git a/venv/Lib/site-packages/openai/resources/evals/__pycache__/evals.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/evals/__pycache__/evals.cpython-312.pyc index 49c5410cad5a1f344bbd98daa1787927f2e3683e..4e970f0940cc0892e3a11a3cf59a7ff521555573 100644 GIT binary patch delta 48 zcmdlpg>lamM!wU$yj%=Gkjmtd;gzwGZx)+iOi^laerZv1YH>_zSz=Cc%;ueJ&CUR4 Cm=GHP delta 48 zcmdlpg>lamM!wU$yj%=Gpu65JV@v8rzFBO7`bDY5`K3k4sm1!KWr;b(`kQyMH9G?U DdT0=C diff --git a/venv/Lib/site-packages/openai/resources/evals/runs/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/evals/runs/__pycache__/__init__.cpython-312.pyc index 4e56fec36b405e78953649870316011189c8ccac..e040b1ff3a70987e8ae0c53fab05b6003b3e680a 100644 GIT binary patch delta 49 zcmaFB`hb=9G%qg~0}!M#d1MrC DZ?zBI diff --git a/venv/Lib/site-packages/openai/resources/evals/runs/__pycache__/output_items.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/evals/runs/__pycache__/output_items.cpython-312.pyc index 51339a303ebc89b6b082aa174ea97f26473718ea..2ad827dbdb236490ed312de88c847bde6efa8f9c 100644 GIT binary patch delta 51 zcmZ4OzuKSgG%qg~0}!M#d1Pc7ZRDHDDi%|eTAW{6l$=@|lUkOTQyf!NnpYgNc`xfb FMF5v95y=1m delta 51 zcmZ4OzuKSgG%qg~0}$x0cgxT-+{ibRRZPDqwK%`DC^@xQKea3|r&zzJG_P2H^Iq0> FiU5@55ljF8 diff --git a/venv/Lib/site-packages/openai/resources/evals/runs/__pycache__/runs.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/evals/runs/__pycache__/runs.cpython-312.pyc index f501b8342c4606321d9d8114c12bf50d573fb0bf..8ab551bebff3281c6d818b96888bdd97ea289a1e 100644 GIT binary patch delta 53 zcmX@t&v>q%k?%AwFBbz4q%wJAFeYu}o5>~?Qq%k?%AwFBbz4=&pCmXpi5>H=^Y32k007V}Y;s5{u diff --git a/venv/Lib/site-packages/openai/resources/fine_tuning/alpha/__pycache__/graders.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/fine_tuning/alpha/__pycache__/graders.cpython-312.pyc index 7c92c68b8e51cde127332c4eeb7942905bb05432..1cfbee4eb5d1a56427c4d43738da871a8e285ad1 100644 GIT binary patch delta 58 zcmZp1YjNW{&CAQh00gN_9vN!d8~JQmWn+p`i}Op1l2eOg(lYZ><4a2OGV{`75_1YN M5@R-Ju+EVM0P4UJ*Z=?k delta 43 xcmZp1YjNW{&CAQh00g@0-7M1e0Ak}6-2eap delta 62 zcmbQsHkXa}G%qg~0}$x0cgt9_k#{MRvVKu&aeir0a%!=DT4r8qd`W3uW?s5}az<)$ Qc0qn-UP-b3b2LRk$5>WsE diff --git a/venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/checkpoints.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/checkpoints.cpython-312.pyc index 3f2ebe8c33bd3563e2a065f5ae473be9167f49b4..ab5733ef786b6d0bec4d17dc84907631b62cd8a0 100644 GIT binary patch delta 56 zcmZ2%w%CmKG%qg~0}!M#d1QRt$Sck&6H}C0oL^d$oLU@{mYJ6tUs9TvnU@}um7i1` Kv)O_5u_yrTUlS|< delta 56 zcmZ2%w%CmKG%qg~0}$x0cgxV)$Sck&qhFL-oL^d$oLa1(mYJ6tUs9TvnU}7gm7i3s KzuAHHu_yr4;SwYO diff --git a/venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/jobs.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/jobs.cpython-312.pyc index e767a7ce637ea70b491028ea43c6d270b0b48769..94c791a0047a12247c6bf403825b6dcb9f3fdeb5 100644 GIT binary patch delta 59 zcmZ3yk8$xnM!wU$yj%=GkjmtdF@4HLzFTZEF-57x`K3k4sl_pAnR%)4C8c?pdFe4( N`ANkwn_1Z9BLGuh6oUW& delta 59 zcmZ3yk8$xnM!wU$yj%=Gpu65JgLUFYzFTZE`bDY5`K3k4sm1zfnR%)4C8c?pdFlFD N`ANn4n_1Z9BLG5R6RiLM diff --git a/venv/Lib/site-packages/openai/resources/uploads/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/uploads/__pycache__/__init__.cpython-312.pyc index 179aa0d52617e1ade3cb27d42fb7cb053fc68c01..6f7be8c8ad3dd6c24d5b88d5a34c5dda864689eb 100644 GIT binary patch delta 46 zcmX@kdYqN_G%qg~0}!M#d1QER_yK~8>RN^#8Qb~Z0x E0H$maUH||9 delta 50 zcmcb(oblpvM!wU$yj%=Gpu65J!!U6pUmBaReo<<1erZv1YO#K4K~8>RO0oXtb~Z0x E0F`SHfdBvi diff --git a/venv/Lib/site-packages/openai/resources/vector_stores/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/vector_stores/__pycache__/__init__.cpython-312.pyc index a6e738bb68608cfbae00d423cabc23d5031fc7b2..502c0fe3a54114af12d9d70a4ae7e35812d35540 100644 GIT binary patch delta 52 zcmeC-=;7c!&CAQh00gN_9vSu_iYH~?_QG79w0P;4U IVE-Eh02uZZ+5i9m delta 56 zcmX?ll=0|MM!wU$yj%=Gpu65J!=!N|-$Hgt{i4+3{L-T2)MEXz)Z~) diff --git a/venv/Lib/site-packages/openai/resources/vector_stores/__pycache__/vector_stores.cpython-312.pyc b/venv/Lib/site-packages/openai/resources/vector_stores/__pycache__/vector_stores.cpython-312.pyc index 0d1467d8fabb15435b6b9d63873f95038b7f72b1..5481af2549557081f94053174473da2a153aa675 100644 GIT binary patch delta 56 zcmex+jPdU=M!wU$yj%=GkjmtdA=JB(Pn|z7m(q!#OMP7+pR1OS@u2=)K~ diff --git a/venv/Lib/site-packages/openai/types/__pycache__/audio_model.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/audio_model.cpython-312.pyc index 2d7fe17b19e4e0fca360574aec473fa8101eb058..1beb9ef7c1d72f5df7c6e9b61a4809a3ec31424d 100644 GIT binary patch delta 35 pcmbQvJe`^EG%qg~0}!M#d1SCLZsap&WREGSEJ!Vmne4&n4*-WD2x0&L delta 35 pcmbQvJe`^EG%qg~0}$x0cgy(Cu#wN0kzK!}vLLlsf3gRoKLDQl33C7d diff --git a/venv/Lib/site-packages/openai/types/__pycache__/audio_response_format.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/audio_response_format.cpython-312.pyc index 40dc665a7abc98653ebec31635d6847b1b4a30c6..0bcfb34af7a09a83d826f94e52b51f725a27de06 100644 GIT binary patch delta 34 ocmbQmJd2t4G%qg~0}!M#d1P>HpF delta 34 ocmbQmJd2t4G%qg~0}$x0cgtYj$g9oBu3u7FkXo!i*`6^P0EwOmb^rhX diff --git a/venv/Lib/site-packages/openai/types/__pycache__/auto_file_chunking_strategy_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/auto_file_chunking_strategy_param.cpython-312.pyc index 923d1b1fd8fdd5a4466dc23bc1ffa968dbdda8d4..106c7e1f78e36b3fd8b71be053f584ee3fa306c8 100644 GIT binary patch delta 34 ocmeBT?PBFU&CAQh00gN_9vRsidHWgJV@fIuQj23IFJ^oW0FEFD{Qv*} delta 34 ocmeBT?PBFU&CAQh00g@0-7?}g^7b>b>z7m(q!#N>Ud;F$0Fz1z3IG5A diff --git a/venv/Lib/site-packages/openai/types/__pycache__/batch.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/batch.cpython-312.pyc index e94b0e1b881eca2c482e4e5944ea9ca0e62b9fd5..a1db9e0c13574c41ec41486774d36c7872bf4422 100644 GIT binary patch delta 35 pcmX>pa8iKxG%qg~0}!M#d1OrA$g9l69#c|TkXjtG*_=s;4FILk2{-@% delta 35 pcmX>pa8iKxG%qg~0}$x0cgt|t$g9l6u3u7FkXo$2*_=s;4FILV2>Jj3 diff --git a/venv/Lib/site-packages/openai/types/__pycache__/batch_create_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/batch_create_params.cpython-312.pyc index aba2c197ce5d8d969f5f05d7d70a0e5f83b4370c..7d7f7e476d5927329fcc9f2502d12b55aae4d6b4 100644 GIT binary patch delta 35 pcmcb{evO^?G%qg~0}!M#d1Ux*G%qg~0}!M#d1N$iG%qg~0}$x0cgx7z$a|8JUB9HVAhlS3@?FMf0H)Lm{r~^~ diff --git a/venv/Lib/site-packages/openai/types/__pycache__/batch_list_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/batch_list_params.cpython-312.pyc index 3e72134d764ddac4aa6d247129ca547b45e81d21..c73166c433a1b24e1afa988a2b84ace1e1795247 100644 GIT binary patch delta 34 ocmcb@a)pKWG%qg~0}!M#d1Tz&$eYQ?9#c|TkXjrwxt8%d0Hv%7p#T5? delta 34 ocmcb@a)pKWG%qg~0}$x0cgr}qkvEf(UB9HVAhlS3axLR^0ICWKq5uE@ diff --git a/venv/Lib/site-packages/openai/types/__pycache__/batch_request_counts.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/batch_request_counts.cpython-312.pyc index d599b82570086cf6c12ac806755b9f57ada3ec7c..1618161c1f9cca6fb5e81505c65d19f77c03519d 100644 GIT binary patch delta 34 ocmZ3+vW$iIG%qg~0}!M#d1S2E$eX~(9#c|TkXjrwxrA{O0F}`R-2eap delta 34 ocmZ3+vW$iIG%qg~0}$x0cgvWukvD;nUB9HVAhlS3atY%m0GhW6<^TWy diff --git a/venv/Lib/site-packages/openai/types/__pycache__/chat_model.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/chat_model.cpython-312.pyc index e1f4ce1786e5f44503136c0fbdfd8f9b4566627e..f93dfaf9c3c9b7c1afa587dc9eac678047627cab 100644 GIT binary patch delta 32 mcmZ3*w2F!MG%qg~0}!M#d1UOE$a{f3rlhhUwK!(t6E^^i$qGRL delta 32 mcmZ3*w2F!MG%qg~0}$x0cgxr~k@o_-eo19PYO(&rCvE_d$_i5e diff --git a/venv/Lib/site-packages/openai/types/__pycache__/completion.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/completion.cpython-312.pyc index 64c9bff790956de288d46e2e14b20330d64aef37..cdf1d9eaf96a9f10715f1ddc59faa624b306f7fd 100644 GIT binary patch delta 35 pcmaFQ{+^xpG%qg~0}!M#d1UO|$lJ-p9#c|TkXjtGc`j2BBLKJu3Y!1` delta 35 pcmaFQ{+^xpG%qg~0}$x0cgvWvk++kHUB9HVAhlS3^IWDNMgY5f3XcE) diff --git a/venv/Lib/site-packages/openai/types/__pycache__/completion_choice.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/completion_choice.cpython-312.pyc index 29a66eefa79bfb13dc7280d9fabf1518b18e3f93..7abef67e5e770d1cc3f49261e47a3dbda162d2ad 100644 GIT binary patch delta 35 pcmaFL`IM9QG%qg~0}!M#d1SoU$eX~#9#c|TkXjtGxrC{Z2>`Zb3Wxvz delta 35 pcmaFL`IM9QG%qg~0}$x0cgr}skvD;fUB9HVAhlS3a|u%+69BpX3Vr|p diff --git a/venv/Lib/site-packages/openai/types/__pycache__/completion_create_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/completion_create_params.cpython-312.pyc index aa11263da3228f518078c459cb22bade78956ab4..e5a82ba3ce36c83631bed64fc55881d64cb8a04c 100644 GIT binary patch delta 36 qcmX>mcubJ*G%qg~0}!M#d1U0tZRFEnWsfPTEJ!Vm*=)<&$qWFhVF|DR delta 36 qcmX>mcubJ*G%qg~0}$x0cgxr$yOB?Wm0iE2vLLlsf3q!XCo=%G-3kl< diff --git a/venv/Lib/site-packages/openai/types/__pycache__/completion_usage.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/completion_usage.cpython-312.pyc index 1d8a24d1f081a20d9316195f2235fc29009b463b..56db1642a7f4dbc43dc17336137864d6fcf1955b 100644 GIT binary patch delta 35 pcmey({hOQjG%qg~0}!M#d1U9#c|TkXjtGxtytm834YU3g-X- delta 35 pcmey({hOQjG%qg~0}$x0cgr}wkvEx%UB9HVAhlS3b2(EBGXTKe3d#Tg diff --git a/venv/Lib/site-packages/openai/types/__pycache__/container_create_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/container_create_params.cpython-312.pyc index 4f9831827e628b2a33367da665093777864bc1fd..df0b89ccde1297d6c7a9ef4d9068308baf6b80b8 100644 GIT binary patch delta 35 pcmaFI{*ImZG%qg~0}!M#d1RPuG%qg~0}!M#d1Or4$h(A*J*K3xAhkGV@(#ua0F~1UWdHyG delta 34 ocmbQiI)jz>G%qg~0}$x0cgv{V$h(A*UB9HVAhlS3@(#ua0GdJyX8-^I diff --git a/venv/Lib/site-packages/openai/types/__pycache__/embedding_create_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/embedding_create_params.cpython-312.pyc index e2644985e17dcf5d21cb8179b3d61588bd1c0f7d..751e0fd4b81e5d833284f00a6ae52c09056f7748 100644 GIT binary patch delta 36 qcmZqYXy@QN&CAQh00gN_9vQ408~Ii}?k144vNG*<;9LE>}0FBKE;Q#;t delta 34 ocmdnQyos6jG%qg~0}$x0cgv96$m_+(u3u7FkXo!iIgT*|0Fz7z^8f$< diff --git a/venv/Lib/site-packages/openai/types/__pycache__/eval_create_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/eval_create_params.cpython-312.pyc index 54d8ef5ddfafba33e76c9c6779e96d544d416df9..665a89ee4f172a3637ac1b61173edb57e445620f 100644 GIT binary patch delta 36 qcmZotZBpes&CAQh00gN_9vRXS8~Ga9*kej63sQ??Hcw-F!wmqP{t6ZV delta 36 qcmZotZBpes&CAQh00g@0-7?a}H}W;IvFn#q7Ni#IZ=S~Xh8qB?5(;_% diff --git a/venv/Lib/site-packages/openai/types/__pycache__/eval_create_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/eval_create_response.cpython-312.pyc index 99b013a2c8cbc524b3f9f40eca7ad829c3256d91..36c8c74b73a1d21c0448dd2794ab74d33541070b 100644 GIT binary patch delta 35 pcmcaBepj6DG%qg~0}!M#d1P4eZRC5+!X8snS&&*Bvx)UC8vw4q3V{Fs delta 35 pcmcaBepj6DG%qg~0}$x0cgr}&2_^sl delta 35 pcmbQwGM|O-G%qg~0}$x0cgy(7u#qp3kzK!}vLLlse{vb)N&uu03NZix diff --git a/venv/Lib/site-packages/openai/types/__pycache__/eval_list_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/eval_list_params.cpython-312.pyc index 098bc420e4020de7ed72113e29fd87ee48313228..62ab12f618f8c04eef854d1678a7deb28eed3b91 100644 GIT binary patch delta 35 pcmcb^dWV(oG%qg~0}!M#d1UZ1Z{)kh$R1NtS&&*BGxk5yOHlL3%hk144vNG*=pT)`B?2mqwC38w%6 delta 35 pcmX@beu|yN(5df%z37`M~ diff --git a/venv/Lib/site-packages/openai/types/__pycache__/eval_update_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/eval_update_params.cpython-312.pyc index edb7fdd71b6cec99a3d56845f23786a5a32d2b90..6fdd537ab6371739ab85de542e8df615c443bf94 100644 GIT binary patch delta 36 qcmX@jdYYB*G%qg~0}!M#d1UZ0Z{%Cg$R1NtS&&*Bv-t=kJ0k$7Ln+a delta 34 ocmbQuJe!&KG%qg~0}$x0cgx`1$ZO8Xu3u7FkXo!i*_$x{0E-6*ivR!s diff --git a/venv/Lib/site-packages/openai/types/__pycache__/image.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/image.cpython-312.pyc index ddddbfc819275d37b2a43f84d05b039ebfa73fe9..f82935ab73b4f6c06d2ee01d674dd7d1443754c5 100644 GIT binary patch delta 35 pcmeBU?PKLT&CAQh00gN_9vKqM8~K(ovd5HE7Ni!(Oy13S832yX3DN)n delta 35 pcmeBU?PKLT&CAQh00g@0-7@|$ZRA_V$gW>fS&&++KY2IfWdNm83eW%m diff --git a/venv/Lib/site-packages/openai/types/__pycache__/image_create_variation_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/image_create_variation_params.cpython-312.pyc index 845d0c6d1481b446bac45ba18b65b47ab448305d..553b2ca093abff986572731b1e49698bd15305ea 100644 GIT binary patch delta 35 pcmX@kah!wqG%qg~0}!M#d1M^g$a{l{J*K3xAhkGV^BbmUMgX)r3jF{8 delta 35 pcmX@kah!wqG%qg~0}$x0cgvWxk@p4@yM9S!L29x7<~K~yi~zRj3g!R+ diff --git a/venv/Lib/site-packages/openai/types/__pycache__/image_edit_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/image_edit_params.cpython-312.pyc index a3c1fd14808c4102e0616276b41d0ae1ded93d5a..97d3ff2b16b00b9a1d9a380291fbd0748d7a719f 100644 GIT binary patch delta 34 ocmeC<{9 diff --git a/venv/Lib/site-packages/openai/types/__pycache__/images_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/images_response.cpython-312.pyc index f1a31552d07e32cbe7db50aa383ccbe75fc8dc82..6c07d4a65aaa519bcf63b37beaecc1f33e6c4a64 100644 GIT binary patch delta 35 pcmbQlHHnM&G%qg~0}!M#d1O4^$oq(qJ*K3xAhkGV^EXBrW&o)z3XK2& delta 35 pcmbQlHHnM&G%qg~0}$x0cgxtdk@pcJyM9S!L29x7=5LHL%mA!f3Vi?o diff --git a/venv/Lib/site-packages/openai/types/__pycache__/model.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/model.cpython-312.pyc index e11f0d6e15a2f1fdbe5bb0fcca9c596495a9da77..7a62c87d13ab06c3ba403612329a67a74b5af837 100644 GIT binary patch delta 34 ocmeyy@{NV}G%qg~0}!M#d1PpA1E+P&CAQh00gN_9vL4u@`f|A$COkSq!!0a&SqQ$0F#di(f|Me delta 34 ocmeBW>1E+P&CAQh00g@0-7=nRncTSG)G%qg~0}!M#d1MqxZ{$16!X8snS&&*Bv-uHA4i^Bt77Gmk delta 36 qcmX>ncTSG)G%qg~0}$x0cgxrzwUO^E3%h;3IzZF diff --git a/venv/Lib/site-packages/openai/types/__pycache__/moderation_create_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/moderation_create_response.cpython-312.pyc index 3d5699cffe1a53161ba36e03f79bc25bb980101b..fefae7f30e1466609deed3343947f23c8a06857f 100644 GIT binary patch delta 34 ocmbQoI**n2G%qg~0}!M#d1QRw$h(4(J*K3xAhkGV@*c)V0G>Ds-T(jq delta 34 ocmbQoI**n2G%qg~0}$x0cguLPk#_|nyM9S!L29x7Z)WE`&CAQh00gN_9vMv=d6zS?$COkSq!!0)-pzP|5dfNw3OoP+ delta 35 pcmZo>Z)WE`&CAQh00g@0-7@kv@-Am&*Dt9oNG;aiyqoa^BLJT@3PAt> diff --git a/venv/Lib/site-packages/openai/types/__pycache__/moderation_model.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/moderation_model.cpython-312.pyc index 11a9f18042e722b6717470da1eb01e077b79ac9d..c51bbfa7de60377a79cc023f4af442384ede8379 100644 GIT binary patch delta 34 ocmcb@e1)0!G%qg~0}!M#d1QEO0Glfbi~s-t delta 34 ocmcb@e1)0!G%qg~0}$x0cgwKf$eYf{u3u7FkXo!ixtcK&0HBBooB#j- diff --git a/venv/Lib/site-packages/openai/types/__pycache__/moderation_multi_modal_input_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/moderation_multi_modal_input_param.cpython-312.pyc index f165544e1e25a1952a3e57cd44fed623c55e7a0c..732ada5e6c171dfc6fd7e3960350527cab7fe97d 100644 GIT binary patch delta 34 ocmZo-ZDQp;&CAQh00gN_9vL4t@_uJzk144vNG*<;%*|8|0GMA1(*OVf delta 34 ocmZo-ZDQp;&CAQh00g@0-7+3;a)E{SG%qg~0}!M#d1N?ka)E{SG%qg~0}$x0cgrx_$eYE;u3u7FkXo!ixsLG?0H4ze3;+NC diff --git a/venv/Lib/site-packages/openai/types/__pycache__/static_file_chunking_strategy.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/static_file_chunking_strategy.cpython-312.pyc index e9c6cd3992896d613e86fccf6b0f7b08adadd642..1aecfa3db70e672b27d255370781d25801887095 100644 GIT binary patch delta 34 ocmdnTvX6!LG%qg~0}!M!d1Rz-J*K3xAhkGV@jgaI0HMwb5&!@I delta 34 ocmdnTx{sCjG%qg~0}$x0cgt9@k#`j%yM9S!L29x7;(d&a0H&}C8vp>vLLlsf3qBuG9v)7%L#4( diff --git a/venv/Lib/site-packages/openai/types/__pycache__/static_file_chunking_strategy_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/static_file_chunking_strategy_param.cpython-312.pyc index 07c364a692d3c0d5a1a7c2d1bae055549dff79b3..7b9cdaffaaa2b5387d6ed9c6b42985a8a896e4d7 100644 GIT binary patch delta 34 ocmZ3_x}KHyG%qg~0}!M!d1Rd0$h(@6J*K3xAhkGV@_xn-0H5;;=l}o! delta 34 ocmZ3_x}KHyG%qg~0}$x0cgxtak#{vCyM9S!L29x7Hq)$ diff --git a/venv/Lib/site-packages/openai/types/__pycache__/upload.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/upload.cpython-312.pyc index 3b14bf60dd1c77e15ed5b5b5ca259b817e24ef79..87918d36c2ed40a0283ca5099b2069284fa67416 100644 GIT binary patch delta 35 pcmX@cevF;>G%qg~0}!M!d1O4?$lJuk9#c|TkXjtGc^Z=eBLJ^J3PJz? delta 35 pcmX@cevF;>G%qg~0}$x0cgxtmk++G7UB9HVAhlS3^E4&{MgX!!3NQcw diff --git a/venv/Lib/site-packages/openai/types/__pycache__/upload_complete_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/upload_complete_params.cpython-312.pyc index 2b4a98f902653f2e6870c07827b2d61d6c5bffba..0801350487fa85684eb5b8fba934e14197df87c8 100644 GIT binary patch delta 35 pcmZ3?x|o&kG%qg~0}!M!d1P=iZRA_P$R1NtS&&*BGkGiHI{=e13H|^8 delta 35 pcmZ3?x|o&kG%qg~0}$x0cgy&}xRGxGBfEY{WkG7O{^YHU?*OVE3jzQD diff --git a/venv/Lib/site-packages/openai/types/__pycache__/upload_create_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/upload_create_params.cpython-312.pyc index 5714552eba32ca435c6296e382011e14b09de6d0..3a02df91ec2abe30785023325d0064fa07c0d43e 100644 GIT binary patch delta 35 pcmbQpHj$0@G%qg~0}!M!d1TDk$oqwnJ*K3xAhkGVGY1nVBLJV`2}u9| delta 35 pcmbQpHj$0@G%qg~0}$x0cgv{U$oqwnUB9HVAhlS3GY1nVBLJhV2|@q> diff --git a/venv/Lib/site-packages/openai/types/__pycache__/vector_store.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/vector_store.cpython-312.pyc index 31e111924793fe5e03c10ae094232be9a79a27f0..2572ea8186102b7e496dcd8ea9735ea7ccdc860e 100644 GIT binary patch delta 35 pcmdnMyMdSYG%qg~0}!M!d1U<9$g9G{9#c|TkXjtG*@CHp1puZi3CI8d delta 35 pcmdnMyMdSYG%qg~0}$x0cgt9|kynL@UB9HVAhlS3vjtNH3jn5I361~& diff --git a/venv/Lib/site-packages/openai/types/__pycache__/vector_store_create_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/vector_store_create_params.cpython-312.pyc index c37f12994b02472429f21d9a3d766e5b923304ad..0f7d30700ddbed74c71d58ffbe3105c3a7791db3 100644 GIT binary patch delta 35 pcmeyy`HhqJG%qg~0}!M!d1QRr$UB9JJ*K3xAhkGV^9m+ECIG)l3i<#5 delta 35 pcmeyy`HhqJG%qg~0}$x0cgxtbk#`CcyM9S!L29x7<`qnSOaQ@l3fuqy diff --git a/venv/Lib/site-packages/openai/types/__pycache__/vector_store_deleted.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/vector_store_deleted.cpython-312.pyc index ee5310b964ec1f09bdfeed3e44306f93c76a13f8..8e473f4c01c4fc0b187f728515ffa5cf5a427984 100644 GIT binary patch delta 34 ocmey#@{@)4G%qg~0}!M!d1N?k#a{vGU delta 34 ocmX@jdYYB@G%qg~0}$x0cgr}nk#{#EyM9S!L29x7pF diff --git a/venv/Lib/site-packages/openai/types/__pycache__/vector_store_search_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/vector_store_search_params.cpython-312.pyc index 4c203b4f383cf9828ef61cd9a5832c8564604c9b..fb45e4c975dc349a4fdcf40deca6a78f94c94eda 100644 GIT binary patch delta 35 pcmaFN^_YwIG%qg~0}!M!d1Or3$a|5AJ*K3xAhkGV^HZieCIGmC3myOf delta 35 pcmaFN^_YwIG%qg~0}$x0cgx7w$a|5AUB9HVAhlS3^HZieCIGvu3l0DP diff --git a/venv/Lib/site-packages/openai/types/__pycache__/vector_store_search_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/vector_store_search_response.cpython-312.pyc index e3c478591213a12e879ce175190e0297e356016b..ef84d710f8758571ab06533f88dbbfd728619301 100644 GIT binary patch delta 35 pcmaFH@r;A_G%qg~0}!M!d1S2K$a{v7J*K3xAhkGV^8>~~`Gr3CaKf delta 35 pcmcb{agBrbG%qg~0}$x0cgwi3k=K%mUB9HVAhlS3vo8}T69BVe3A+FQ diff --git a/venv/Lib/site-packages/openai/types/__pycache__/websocket_connection_options.cpython-312.pyc b/venv/Lib/site-packages/openai/types/__pycache__/websocket_connection_options.cpython-312.pyc index 6b01d4693b6370ed0ad73ec633644dbda1a0ff81..941b122848d3093b5e4762d8166bc711dab40eba 100644 GIT binary patch delta 35 pcmbQjHHC}!G%qg~0}!M!d1QoaRYrAhkFqu{0$!KW6fImLve>^9bH>RYrAhkFqu{0$!KW6h*mcuLn4Gj(B delta 41 vcmew%^h1dEG%qg~0}$x0cgxV*$UB>bSHGmPAhlROu{0$!Uw`vfmcuLn1gs4@ diff --git a/venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_create_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_create_response.cpython-312.pyc index 5aabd19a12cdfe3da11fec92d2dbebe36d6980cc..96c0b8199dcf977b509cd149f0c4048fff11c8d9 100644 GIT binary patch delta 40 ucmbQwGM|O_G%qg~0}!M#d1SP1dV!VqG%qg~0}!M#d1R<< delta 40 ucmcb>dV!VqG%qg~0}$x0cgv92$ZN#Jt6x%CkXo#tSelZVuRqy`sRaPr1q*=y diff --git a/venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_text_delta_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_text_delta_event.cpython-312.pyc index ee9e4196a46ae4bcfcaeab98d471f2b5de504edc..0a3cb380fc4d4dab32cc19adeced07d2394bbd11 100644 GIT binary patch delta 41 vcmaFK@sfl0G%qg~0}!M#d1Qob=6s1 delta 41 vcmaFK@sfl0G%qg~0}$x0cgrx|$jisXt6x%CkXo#tSelZVufJJ?$&m>F?qCaR diff --git a/venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_text_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_text_done_event.cpython-312.pyc index 8d858689b9144424230db7f1e7887f07a5f4aa18..00aa30907fca628968cb8ded69887b93f4bdf3ba 100644 GIT binary patch delta 41 vcmaFL@sxx2G%qg~0}!M#d1Sxv7W delta 41 vcmaFL@sxx2G%qg~0}$x0cgwKZ$ji&bt6x%CkXo#tSelZVufJKH$&LvC?b!=w diff --git a/venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_verbose.cpython-312.pyc b/venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_verbose.cpython-312.pyc index 9c92091e00fd77087e03ec9b4cfb3b3ff7653c67..77b264c6e4230f742ca1345f1947f0e6e53e13c0 100644 GIT binary patch delta 42 wcmeBU?_=jX&CAQh00gN_9vMQ+8~GfVcwO0RR91 delta 42 wcmeBU?_=jX&CAQh00g@0-7&1B370PXk-(f|Me diff --git a/venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_word.cpython-312.pyc b/venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_word.cpython-312.pyc index acf738d1a48d6a264c67a59a2d0ab1316c2d0456..e55b3ee74a860d96cec63a8722a8cd7f5c528e75 100644 GIT binary patch delta 40 ucmZ3%vVw*8G%qg~0}!M#d1TaYtf?Q&CAQh00gN_9vQV8c|S7p#*|bRq!z~{mZoIp$4usC`VRot_6%qM delta 40 ucmeBT>tf?Q&CAQh00g@0-7?ZQ@_uCG)i0?mNG;Y+EKSMG*PqPI^dA7*rwl#- diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/__init__.cpython-312.pyc index 31d5a2e95778295f649486bfcd7f052f0cfc3b20..d72e7df701811b58a97bbdaa83f04043b8aaa0db 100644 GIT binary patch delta 39 tcmZ1?utb3OG%qg~0}!M#d1P2_yF!-lG%qg~0}!M#d1S1W-^l03#uHOgS&&*BlayML7_&Kp&4B{|=IRUB delta 41 vcmZ1>yF!-lG%qg~0}$x0cgwgbw~^0}jYq$vvLLlsKPj~&QGas=n*#>`@Z<~c diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_deleted.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_deleted.cpython-312.pyc index ad0224d911a29911e3be74a6b6f198b7982481be..bc522b4a617c334dc3bb172a23692b86a5b37a8a 100644 GIT binary patch delta 39 tcmeyy@{NV}G%qg~0}!M#d1TmZ{>N43hu= delta 39 tcmeyy@{NV}G%qg~0}$x0cgxV-$UBvhN57=9AhlRODYYa~fATuU69D8O3~&Gd diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_list_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_list_params.cpython-312.pyc index b01298ac7b7c598165e8c7894e009dd41a14d0d3..a611a17d9321c6fff9e58f60757d7579ac5bd5e4 100644 GIT binary patch delta 39 tcmX@jdYYB@G%qg~0}!M#d1SoZ$h(t~C#IybAhkFqDYYaqX7VM*p8)0E4QT)X delta 39 tcmX@jdYYB@G%qg~0}$x0cgr}ok#{E}kA6vIL29vnQff(}{^U!HKLO|!4K4rx diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_option.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_option.cpython-312.pyc index ace3d813f61013089dafbb558e2454a80e5a6f7d..831040359712d524a263b939a48a67ff19159996 100644 GIT binary patch delta 39 tcmX@ZdWMzvG%qg~0}!M#d1TmcPYz>T0|2)~3Y-7{ diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function_param.cpython-312.pyc index d9af1f927f2c2af58f9fef0073e0ac0f47f73c41..ccd8365f677aa05b4bb66a8f230127dc14f5094a 100644 GIT binary patch delta 39 tcmeyu@`Z)>G%qg~0}!M#d1T~oG%qg~0}$x0cgslL$Xm(CqhC^4kXo#tlvqMz4Eg{7 diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_param.cpython-312.pyc index ef9818985b3c986993d27a37d404f7677f562d51..3ea048d4c792f912b1363b49c9c79fb492b08253 100644 GIT binary patch delta 40 ucmZ3_ww{gmG%qg~0}!M#d1Ux(yi7BZpNG*;@N-ar@*(}8*$_N0;LJDC3 delta 40 ucmZ3_ww{gmG%qg~0}$x0cgwKZ$jivYqhC^4kXo#tlvtVC;-(V3)cVu diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/code_interpreter_tool_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/code_interpreter_tool_param.cpython-312.pyc index 19229c100132df95d7e3d195a2305f457b60c224..1eb19cde9b1a9f88aff21800f81a129c19c20474 100644 GIT binary patch delta 39 tcmbQhI)Rng3b diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/file_search_tool.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/file_search_tool.cpython-312.pyc index aa7712b386c5980e41cab91bc4dd6f102ac5e654..38f06eacc38bc0874a97769bab009efaab031523 100644 GIT binary patch delta 41 vcmZ3$wSbH7G%qg~0}!M#d1NTCZ{!nY;)yA#EJ!VmNlGnAjM=Qu^pObw%Ipg+ delta 41 vcmZ3$wSbH7G%qg~0}$x0cguLmwvkViiATSrvLLlsKPj~&QGc^O(?=!%;)yA#EJ!VmNlGnAjM;3#G?fVe*j5WS delta 41 vcmX@hd6tv!G%qg~0}$x0cguLnwvkVciATSrvLLlsKPj~&QGc@q(^Mt^@gNKA diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool.cpython-312.pyc index 115267184427d8a3b72df6e41c96c09bd22f3be2..6afb10c9a601c46c77bafdf1a354042a2f94c45d 100644 GIT binary patch delta 39 tcmeBY?PujZ&CAQh00gN_9vO2s@=jpni7BZpNG*;@N-ar@nY@zm834(C3_Ab- delta 39 tcmeBY?PujZ&CAQh00g@0-7W|a diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool_param.cpython-312.pyc index 2f8167804e955dfdc4253fe0699f8f2c053e7267..2465b737fde69e91aef2dd9bc7074ec84e35febe 100644 GIT binary patch delta 40 ucmZo>Yi8p;&CAQh00gN_9vRO!@;+eXi7BZpNG*;@N-ar@+5D4{ixB|dgA7#w delta 40 ucmZo>Yi8p;&CAQh00g@0-7>Ck=_Jm delta 41 vcmcbta9M%xG%qg~0}$x0cgskT+{jnX%A;RWS&&++pOjjXsK0q4>me=x_?rx+ diff --git a/venv/Lib/site-packages/openai/types/beta/__pycache__/thread_deleted.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/__pycache__/thread_deleted.cpython-312.pyc index 1a9455d7dda496664713169a440e290e37e0bd23..1f9c67f2c8c94c07ae2e5c85729dc2de5eff3d75 100644 GIT binary patch delta 39 tcmaFM@|K17G%qg~0}!M#d1M%Gw7Ni!(B&C)l#uTL{=9FaSrp9dMWnyFk E08iQuX8-^I delta 50 zcmeC<=;Po!&CAQh00g@0-7-EfZRC5!D5_slS&&++pOjjXs9%(tm{XFOo2tK=mx+-H E0C8>)3IG5A diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item.cpython-312.pyc index b9ee61e583fce4fb9d33bbf967e9fe7ec2459cf5..b3dd1c6367aee36a1aae8e21561911fcb524c284 100644 GIT binary patch delta 50 zcmey#^^=S5G%qg~0}!M#d1RPzZscoc7L6&XEJ!VmNlGnAj44V@%qhvtO^w;SiupVv E0C?^Yd;kCd delta 50 zcmey#^^=S5G%qg~0}$x0cgy(6v5~KxSyaEIvLLlsKPj~&QNJiPF{dOmH&uW0D(3Ty E0G1#S{Qv*} diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_content.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_content.cpython-312.pyc index 7eaa8532da08ee32fdc697d4337c45acbe02c63f..46146a3b8587ff4005209ff045bcf7ebfd2ccaeb 100644 GIT binary patch delta 50 zcmbQtKAD~GG%qg~0}!M#d1P?0Y~*uc5{)UTEJ!VmNlGnAj44V@%qhvtO^w-{&ZNT# E06=aIP5=M^ delta 50 zcmbQtKAD~GG%qg~0}$x0cguLoyphj^NmRe2vLLlsKPj~&QNJiPF{dOmH&uUgI+G3~ E0Aaum?*IS* diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_content_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_content_param.cpython-312.pyc index d84aa417eca2e1ce79bc1462730cab279a9c6c8d..cb199dbc0ea68056c08b431eef19b608ab703dd3 100644 GIT binary patch delta 49 zcmbQkHiwP(G%qg~0}!M#d1UO~$orj9G^V7oAhkFqDYYaqrYJQrrzA5sHDZVzsWSoq DLHZ7M delta 49 zcmZo=Z)N8_&CAQh00g@0-7X%d&q!#NZrIsY>7o{fVlw{_n>Tix?QfCAJ DLKY4f diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_created_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_created_event.cpython-312.pyc index 7c5fcc57c4778f0308c783c716fa6ce12fea00ea..4346aa054fe20d199de87877f6538d739c0124e4 100644 GIT binary patch delta 49 zcmbQmHj9n-G%qg~0}!M#d1Soa$oqj&G^V7oAhkFqDYYaqrYJQrrzA5sHDZz#`^$Z CmJr7P delta 48 zcmZ3(x`vhaG%qg~0}$x0cguLQk#{wtsD4RhL29vnQff(}eo<;-PDy5Ns{Z7&jQ0Uz CWe{`# diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_input_audio_transcription_completed_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_input_audio_transcription_completed_event.cpython-312.pyc index 3e8a02600d828295969051c3c31b9cce25f0e064..9a8bab80606fae9ba011386c4013a2173adca775 100644 GIT binary patch delta 49 zcmaFH`HYkIG%qg~0}!M#d1UO{$oq{^G^V7oAhkFqDYYaqrYJQrrzA5sHDW#p DhQko6 delta 49 zcmaFH`HYkIG%qg~0}$x0cgvW%k@p*;sD4RhL29vnQff(}eo<;-PDy5Ns{UpPrgKaH Dg1^o9ul DT$vBo delta 49 zcmZqRYT)8M&CAQh00g@0-7?BI@_u3z)i0?mNG;Y+N-as$FG@|!Dap)D)!!__^o9ul DTXhd_ diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_input_audio_transcription_failed_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_input_audio_transcription_failed_event.cpython-312.pyc index 4ba9f4cbcc14d5767e164d24bf52efd0624076bc..48fa09bcb532bcfa7cbee5e02ff8db315c2b0ca8 100644 GIT binary patch delta 49 zcmcc3d7G2>G%qg~0}!M#d1SG%qg~0}$x0cgrx{$g9L8s$WuBkXo#tlvtf?Q&CAQh00gN_9vPttf?Q&CAQh00g@0-7=gv^1fsg)i0?mNG;Y+N-as$FG@|!Dap)D)t}7G^dA65 Cat|f| diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_truncate_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_truncate_event.cpython-312.pyc index 64ff9e70d912c233df55328e17c43a2c17f9b8b3..1659d1c793bd6e32b6c4a7914275b56173b9b08a 100644 GIT binary patch delta 49 zcmX@bc8ZPnG%qg~0}!M#d1Rd5$Scew8dFkPkXjs*lvVRKKLMAhlRODYYa~zbG{^rzA5sRe!TTlO!Vm Db`1|Y diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_truncated_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_truncated_event.cpython-312.pyc index aee4c54c1b656195cdc42158bb3d820e0eaead35..6b1c9baf4a57109aea2037a8d204fd9c98988226 100644 GIT binary patch delta 48 zcmZo*YhdF&&CAQh00gN_9vL?_^1fsgjVY-tNG*;@N-ar@DN0SuDap)DjhW2N^c4V5 C$`9TE delta 48 zcmZo*YhdF&&CAQh00g@0-7*er$H C-w%ZV diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_with_reference.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/conversation_item_with_reference.cpython-312.pyc index 51df7a24d7581152554b6cfd95406e3bb436c537..404aa87d05a6a30ce71682a6dac7a37a151c0576 100644 GIT binary patch delta 49 zcmZ3=y_B2xG%qg~0}!M#d1Sb6&{ DLj4Z& delta 49 zcmeC;=;Gi#&CAQh00g@0-7<1F@-i}s>X%d&q!#NZrIsY>7o{fVlw{_n>TgzNdd>&{ DLOBkO diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_append_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_append_event.cpython-312.pyc index ea4e74da1e5516d8c1ff81c74bd1dd5eac7d422d..26bb4634450f7dc6b84f384b8b673f26cdce2d37 100644 GIT binary patch delta 48 zcmeyu`h}JEG%qg~0}!M#d1S2J$a{rRG^V7oAhkFqDYYaqrYJQrrzA5sHD>ZR#(w~I CO%Znh delta 48 zcmeyu`h}JEG%qg~0}$x0cgvWzk@pItsD4RhL29vnQff(}eo<;-PDy5Ns{Z6}jQ;?4 Cfe{}7 diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_append_event_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_append_event_param.cpython-312.pyc index 134cb85e61fb7ab9c0e89484490eb640acc45a54..8de541be467ce4333fb4d5b3bdd2ffce40cc1f97 100644 GIT binary patch delta 49 zcmeBR>tN$O&CAQh00gN_9vKHV@;+e{jVY-tNG*;@N-ar@DN0SuDap)DjoHk`#KZ^y DUcL_c delta 49 zcmeBR>tN$O&CAQh00g@0-7;2f@s$WuBkXo#tlvZd#*YAS CZ4pQS delta 48 zcmcb_dWn_yG%qg~0}$x0cguLWk#|3%sD4RhL29vnQff(}eo<;-PDy5Ns{Z7Mj2{7V CdJy*j diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_clear_event_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_clear_event_param.cpython-312.pyc index bc8f975c77f7d32583e7e45d2a4e7bee8cb483a4..7d32a5248c0d98d00b3a5195cacd903e59e11b73 100644 GIT binary patch delta 49 zcmcb{dX1IuG%qg~0}!M#d1Np#ZRFd}C>m2zS&&*BlayML7*mv*m{XFOn;J9u5#tvC DSXK~W delta 49 zcmcb{dX1IuG%qg~0}$x0cgy(9xRGx^qo{sKWkG7Oeo|^lqJB|oVophBZmRy|M~q(p DddCqE diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_cleared_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_cleared_event.cpython-312.pyc index 91498053a2e63990e88c88ff4d144c603063cf7b..36030f59d5ad5c833f89f29c037bd65c406b102d 100644 GIT binary patch delta 48 zcmbQtI+>OCG%qg~0}!M#d1UO_$UB`;G^V7oAhkFqDYYaqrYJQrrzA5sHD>Zo##;bP C`4A=m delta 48 zcmbQtI+>OCG%qg~0}$x0cgtA2k#{Z-#!mop CLJ?O0 delta 48 zcmcc0dX<&;G%qg~0}$x0cguLYk@p~@sD4RhL29vnQff(}eo<;-PDy5Ns{Z81jGq8> CPZ0(H diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_commit_event_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_commit_event_param.cpython-312.pyc index 1960d5e075ed6c859f6a99583fb7d536c6c50284..c7c35966c599c88b9e0d1dca59d4031bfa79c1de 100644 GIT binary patch delta 49 zcmcb~dXts!G%qg~0}!M#d1SCLZR9)1C>m2zS&&*BlayML7*mv*m{XFOn;J9u3FB7) DS~U=G delta 49 zcmcb~dXts!G%qg~0}$x0cgy(BxRLK5qo{sKWkG7Oeo|^lqJB|oVophBZmRy|CyZYK De5Mf} diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_committed_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/input_audio_buffer_committed_event.cpython-312.pyc index d7006a1f9e0d40a319ee2a13a973d0bcb31aada7..f852448b3426ec060a56b6b84ad3b13be3061306 100644 GIT binary patch delta 48 zcmcc1dY6^=G%qg~0}!M#d1Q2Mb*j!Z59 DgiR3g delta 49 zcmcbpc2SM@G%qg~0}$x0cgs-N$a{=KRKKLMAhlRODYYa~zbG{^rzA5sRe$pfj!Z59 DcWDqT diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/response_audio_delta_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/response_audio_delta_event.cpython-312.pyc index 8de5d17c3f618aa0312e90a26e240004133ac5ba..4462f4b8bbaae6cc0dd1d95b0ea13b0f00c12a10 100644 GIT binary patch delta 49 zcmZ3+wv3JMG%qg~0}!M#d1SCKZ{%ZR5{)UTEJ!VmNlGnAj44V@%qhvtO^unX$@CWh DFwzd6 delta 49 zcmZ3+wv3JMG%qg~0}$x0cguLjw2_aENmRe2vLLlsKPj~&QNJiPF{dOmH&uVKCevR4 DQDYB3 diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/response_audio_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/response_audio_done_event.cpython-312.pyc index 2ca6dcd1bd705e603fbf0185c28549d131072d77..d3fba8a61fc336ae846399cb67d6ea1f2c5e0a52 100644 GIT binary patch delta 48 zcmeBR>tN$O&CAQh00gN_9vO!=@_u3zjVY-tNG*;@N-ar@DN0SuDap)DjhQUM^aTJ? CCJ*TV delta 48 zcmeBR>tN$O&CAQh00g@0-7=PMZp#-9Lk C!x35l delta 48 zcmeyw`iYhIG%qg~0}$x0cgv{V$a|epRKKLMAhlRODYYa~zbG{^rzA5sRe$nN#-9Lm C77+sg diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/response_cancel_event_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/response_cancel_event_param.cpython-312.pyc index 2ddcda2c65a84ec9ee801870eb4065d3d823694c..a3e4e7163c7e53bf68a374b3b30cee01d15ca660 100644 GIT binary patch delta 48 zcmcc5dY_f|G%qg~0}!M#d1Q2NcwrkAV$ DcZCrR delta 49 zcmdldxKEJxG%qg~0}$x0cgyhJ$h(m2zS&&*BlayML7*mv*m{XFOn;J9uIpZe) DTW=70 delta 49 zcmcb~dXts!G%qg~0}$x0cgy(2xRLJ&qo{sKWkG7Oeo|^lqJB|oVophBZmRy|=Zv2K DeP9tK diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/response_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/response_done_event.cpython-312.pyc index 4bcf08cf254b962d3a738efaf645b8f5b460a30b..eb933c90d31e320f366b24e1bea5f3a2d993141b 100644 GIT binary patch delta 49 zcmX@ldY+ZC>m2zS&&*BlayML7*mv*m{XFOn;J9uA>%s$ DRdEnX delta 49 zcmX@ldY+Z+C DU%3v6 diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/response_output_item_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/response_output_item_done_event.cpython-312.pyc index e384cdf30e8a656dd1df4d447771db4933f1c4f2..184cd2056061d02cde30ad8015a1e54f57fffc9d 100644 GIT binary patch delta 49 zcmdnNwu6oLG%qg~0}!M#d1Tz%$jiwj8dFkPkXjs*lvk diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/session_create_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/session_create_response.cpython-312.pyc index ba2bbce4217a3e26d3707d18313dfb0e4195d880..0912082b8841287dbeb67184064fcc009563e3a5 100644 GIT binary patch delta 50 zcmca1eM6e>G%qg~0}!M#d1Nq1Z{%CRBpOpvS&&*BlayML7*mv*m{XFOn;NtEFq0@Z E0B@!bxBvhE delta 50 zcmca1eM6e>G%qg~0}$x0cgrx9+Q_$nNmRe2vLLlsKPj~&QNJiPF{dOmH&uW0VJ1;- E0D6iKs{jB1 diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/session_created_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/session_created_event.cpython-312.pyc index bfff311b4f040d05d14d2f49e5dc676c25ebad3d..1a63cdd1027c5d7ea62fac4ad1916e3089a12f8b 100644 GIT binary patch delta 48 zcmdnTx{sCjG%qg~0}!M#d1UZ{#>W6? Csu2kQ delta 48 zcmdnTx{sCjG%qg~0}$x0cguLWk#{GfsD4RhL29vnQff(}eo<;-PDy5Ns{Z8LjE@0o CS`f7W diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/session_update_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/session_update_event.cpython-312.pyc index 88a3103a7454daba518f5e7d8b3cf4267e649fdf..8339d788c85dc7932832a11c5b63aee6ec4b0875 100644 GIT binary patch delta 50 zcmZqBYS7|4&CAQh00gN_9vOzZ8~Iw8MPo`T3sQ??l2S_&V~SD}b4oIEQ)4zSXO0vE E09iN>eEywZ{%xX7S%7QEJ!WZPf9IG)Gta+%qhvtP1WDLoHQ~}B&CAQh00gN_9vO<-8~K(ni^h~x7Ni!(B&C)l#uTL{=9FaSrp9bO&g{Vp E09~LDqyPW_ delta 50 zcmeBI>Q~}B&CAQh00g@0-7;QlZsc3SEUI5pS&&++pOjjXs9%(tm{XFOo2tM0II{;Y E0DGAbD*ylh diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/session_updated_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/session_updated_event.cpython-312.pyc index 173fa8caaaba31185076a868bf4ad490d441d4db..4edb2d46cdcb52145eb394942fc3a6453c0fcf46 100644 GIT binary patch delta 48 zcmdnTx{sCjG%qg~0}!M#d1UZ{#>W6? Csu2kQ delta 48 zcmdnTx{sCjG%qg~0}$x0cguLWk#{GfsD4RhL29vnQff(}eo<;-PDy5Ns{Z8LjE@0o CS`f7W diff --git a/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/transcription_session.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/realtime/__pycache__/transcription_session.cpython-312.pyc index 1d8798d6a448c51d4736ab1092d238ba5f8b2cd9..27ad01884661a5c1a559a5d83580ddd7d489340c 100644 GIT binary patch delta 49 zcmbO)FkgW8G%qg~0}!M#d1PGK$jiqh8dFkPkXjs*lvtW+P&CAQh00gN_9vP7vc^@*0#*|bRq!z~{rIsYd6s0ESlw{_n#%yM0;$#E> DQwa{7 delta 49 zcmeBS>tW+P&CAQh00g@0-7*|E@;+n~)i0?mNG;Y+N-as$FG@|!Dap)D)!)p_#K{N% DQ^gKL diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/__init__.cpython-312.pyc index ea60fc6c05ee2f30bc59c927de27cc63a9cf7c7f..9cde883df4a4d4c5d34f6de741d21dbafd5e70cd 100644 GIT binary patch delta 48 zcmaDO`bL!RG%qg~0}!M#d1PqtY~+*T5{W6PEJ!VmNlGnAj48<|N=-~Dj+t!3wE+N0 CuMYPB delta 48 zcmaDO`bL!RG%qg~0}$x0cgy(2y^&9fOGLkrxHkXjs*lvM8Bl6AhlRODYYa~za*n5H8G`Ff3hZ19so1h B4h;YR diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/annotation_delta.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/annotation_delta.cpython-312.pyc index ccdc45d4fd11d580d35536073a6ac9b1fefa4688..4f44bbf7fe5bc7db3740748727d66aa2d94341c1 100644 GIT binary patch delta 48 zcmdnXx|fyjG%qg~0}!M#d1UY~ZRAs85{W6PEJ!VmNlGnAj48<|N=-~Dj+yMjR0#kr C_6{5X delta 48 zcmdnXx|fyjG%qg~0}$x0cgy(4xRFnZNkqS-vLLlsKPj~&QNJXkC^a#qSbwq$QzZaT Cst(Km diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_annotation.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_annotation.cpython-312.pyc index 80f697ae5181c227e309edf3e9f55c4a915b190a..edc638ddde103ac98df792e104a497c9c3cbf39b 100644 GIT binary patch delta 48 zcmeBV?_}pa&CAQh00gN_9vQhCd21O(VoE9tQj24fQcDtJN-~O46H|&~HqT>x%?JQK C2oGBT delta 48 zcmeBV?_}pa&CAQh00g@0-7mt+*BCZ-hYZ=T2anh^j# CvJU_N diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_delta_annotation.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_delta_annotation.cpython-312.pyc index 98c4e3131d745a7a9fd459a608d86749ac91d109..03ca34e51101d91d9d0a8d94bb09fa884403387e 100644 GIT binary patch delta 48 zcmeC>?B(P=&CAQh00gN_9vNL5c`q=E#FSJPq!z~{rIsYdlw=g8CZ-g}Z2rhNhY0{p Ceh=IL delta 48 zcmeC>?B(P=&CAQh00g@0-7+#a@?KyR(J!eiNG;Y+N-as$FUcrMO-w1)-~5qr4if-P CPY-$k diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_path_annotation.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_path_annotation.cpython-312.pyc index 10d0cb77162f9dd7b40588f295d2d1eda48975b0..3b36997b0d3b3a4ec46120856e5974751b2835f5 100644 GIT binary patch delta 48 zcmey#_LGhGG%qg~0}!M#d1N?k1%~ DQ^OB( delta 49 zcmX@baf*ZQG%qg~0}$x0cgy(9w2^NqqlkVN_@=jtD(J!eiNG;Y+N-as$FUcrMO-w1)pS+pz763IP B4-^0Z diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_content_block_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_content_block_param.cpython-312.pyc index 48e9af28a2579aacc9fce881e4d4d796c90beaec..ce66646603bf8f56ca25e35cc5458459da8a17db 100644 GIT binary patch delta 48 zcmeBT>tf?Q&CAQh00gN_9vNph@;+r0i7BZpNG*;@N-ar@Daj~GO-w0{+04eo!UzCR C-wve! delta 48 zcmeBT>tf?Q&CAQh00g@0-7@xWrxHkXjs*lvRz B52OG9 delta 47 zcmZ3?x|o&sG%qg~0}$x0cgqOa$h(+PM8Bl6AhlRODYYa~za*n5H8G`FfASH=`v5!S B4@>|6 diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_url_content_block.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_url_content_block.cpython-312.pyc index e365b5526e41713289e12fd59ce4aeea238e8531..50b1e5fd62c4f0fcf16bffa4a43acd4aa4bca14b 100644 GIT binary patch delta 47 zcmeBV?PTRW&CAQh00gN_9vL+odHWefVoE9tQj24fQcDtJN-~O46H|&~CU0Q82>>xg B4_5#H delta 47 zcmeBV?PTRW&CAQh00g@0-7<1F^7b=|=$BL$q!#NZrIsY>mt+*BCZ-hYPu{?I696-m B4+j7M diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_url_content_block_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_url_content_block_param.cpython-312.pyc index 83c29a51e1e86de354af311304637ce2edfc0b37..f10f491e295448ca13368632f04ee164cf716cf7 100644 GIT binary patch delta 48 zcmZo>Yi8p;&CAQh00gN_9vSC1@;+b`i7BZpNG*;@N-ar@Daj~GO-w0{+04kq#0UUQ C=MIek delta 48 zcmZo>Yi8p;&CAQh00g@0-7@xXqF+*3kXo#tlvrxHkXjs*lvrxHkXjs*lvkd`Ou0G%qg~0}!M#d1UO}$h(_KB&MXYAhkFqDYYaqrX-^%H8G_)X7e4UXKVmy C&k(Z! delta 48 zcmX>kd`Ou0G%qg~0}$x0cgqOd$h(_KM8Bl6AhlRODYYa~za*n5H8G`FfAbxtXKVmq CCJ+k% diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_content.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_content.cpython-312.pyc index e28cfa73c53d800df8b69b1a57364c513a447612..6c47a3b69538c4f189e30323c57a66c71d140e6e 100644 GIT binary patch delta 47 zcmdnWwv~<t B4>$k- delta 47 zcmZ3-wvLVWG%qg~0}$x0cgslM$lJ&yqF+*3kXo#tlvrxHkXjs*lvrxHkXjs*lvrxHkXjs*lvrxHkXjs*lv DiChpx diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/refusal_content_block.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/refusal_content_block.cpython-312.pyc index 575095a00797b8e4b74e67cf383ffa4370c18561..78570730f8459ca38b4af98bd6af099612b4faf5 100644 GIT binary patch delta 47 zcmcb~a+8JkG%qg~0}!M#d1Sb3lE diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/required_action_function_tool_call.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/required_action_function_tool_call.cpython-312.pyc index b5e49755d55f4e2b2cbe4a200c9f674d44816d31..88284775e8c1fe777054697efdefb4b1a3dcaf12 100644 GIT binary patch delta 48 zcmey(_M46OG%qg~0}!M#d1TDm$UBu$B&MXYAhkFqDYYaqrX-^%H8G_)X7e`2ql^G= CuMl(q delta 48 zcmey(_M46OG%qg~0}$x0cgv{Q$UBu$M8Bl6AhlRODYYa~za*n5H8G`FfAcoRql^G= CVGt1j diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run.cpython-312.pyc index 35f7d88f4f5cdda56987d417f7c01b04cbdc1367..e148513eb3d3dd4ebc86234ab15f3d24e031e801 100644 GIT binary patch delta 49 zcmbQGFiU~&G%qg~0}!M#d1SOHZse{jGE&CAQh00gN_9vOj}8~L`di^P;v7Ni!(B&C)l#*}0fr6#5n$85gFzLf(2 DROt`y delta 49 zcmeBH>{jGE&CAQh00g@0-7N=-~D*57=MeJck5 DSZxod diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_list_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_list_params.cpython-312.pyc index e846b31930029d753bf5eb31804a56768ac9964e..8dc9a7ebbc06ef165d04eb873b2894f86231b202 100644 GIT binary patch delta 47 zcmX@kdYqN_G%qg~0}!M#d1O4?$h(g6 Dgwzlr diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text.cpython-312.pyc index 0e7f368bc9697016abcec5d862104493956e5c90..71981cf03a7e4212008b0ef046223c1b0d434d5e 100644 GIT binary patch delta 47 zcmaFP@|=bDG%qg~0}!M#d1Ux)S B4`=`Y diff --git a/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_content_block.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_content_block.cpython-312.pyc index 66fd00a66ad2e7fc13c914eb1a67ed8582355d25..e98eafa991765c22935556d1d3fe92e5ab5eeedf 100644 GIT binary patch delta 47 zcmey$@|A`6G%qg~0}!M#d1Ux)+TpIA-z< G#y0@49}>*~ delta 52 zcmX@YdW4ntG%qg~0}$x0cguLRk#`fLq<%?dL29vnQff(}eo01AYGO*Ueo<*&vHs*6 GjBfz1aS}`b diff --git a/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_output_image.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_output_image.cpython-312.pyc index 0cb2ba78325918093b7ef877d0b8bc7652622ece..cb6a0edf90e5c79e0e4fe227d159e24dcd6f7710 100644 GIT binary patch delta 53 zcmdnQzKNapG%qg~0}!M#d1TaY delta 53 zcmdnQzKNapG%qg~0}$x0cgslK$h(YDQop3KAhlRODYYa~za*n5H8G`Fzo;~?Sby^w H#%GKGsD2T$ diff --git a/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call.cpython-312.pyc index 6a824c9eca662a5967a5da87dd04b5fbd5c69b9d..cee409bfc5fcfd854588e7e4477b4b2f0a2686fd 100644 GIT binary patch delta 53 zcmbQsKbN2PG%qg~0}!M#d1ORvxXcrpgi= delta 53 zcmbQsKbN2PG%qg~0}$x0cgqmk$a|AXQop3KAhlRODYYa~za*n5H8G`Fzo;~?Sby_> HrgTpIA-y0 GMn(X?pb}XC delta 52 zcmey(`kR&aG%qg~0}$x0cgyJC$a|GhQop3KAhlRODYYa~za*n5H8G`Fzo;~?SbyAQ934 diff --git a/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call.cpython-312.pyc index 47f5d06c6ac3a0ce5ae27b8c71378d008e241382..9bf757afe5210dc30c2207310d4eff07b7b110fc 100644 GIT binary patch delta 53 zcmX@eevqB_G%qg~0}!M#d1UO{$a|boGNz=mAhkFqDYYaqrX-^%H8G_)rl>TpIA-%( H#w&~fzCIGi delta 53 zcmX@eevqB_G%qg~0}$x0cgvWuk@q;Gq<%?dL29vnQff(}eo01AYGO*Ueo<*&vHs?_ Hj8_-|x?>VE diff --git a/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call_delta.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call_delta.cpython-312.pyc index dc7606199c4635896216863ce5d534fc34f22716..2dee8c9da4f5e804c4c5e292eecd6410a0e5cb74 100644 GIT binary patch delta 53 zcmcc2ahZenG%qg~0}!M#d1SQop3KAhlRODYYa~za*n5H8G`Fzo;~?Sbwts HlQRQop3KAhlRODYYa~za*n5H8G`Fzo;~?SbuX1 HQ#K<2y%P~t diff --git a/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_event.cpython-312.pyc index 5db5b50e3ebd3e1adc0322c7c03cdc64951c5423..df628f3cb5dc942fef9829c78f721b9d6557621c 100644 GIT binary patch delta 52 zcmcb}dXbg)G%qg~0}!M#d1S( G#`gfB6%phB diff --git a/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_message_delta.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_message_delta.cpython-312.pyc index dfa2aabe5ea576954370518711fd434d3404b0dd..7c7e979d25a8934d19b2fff2953803a1403cfde1 100644 GIT binary patch delta 53 zcmZ3@zM7r)G%qg~0}!M#d1QEO_0IMqyuK)l5 diff --git a/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/step_retrieve_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/step_retrieve_params.cpython-312.pyc index 5b8414b7f813c24cf5ba77aacc7029dc6ccf789f..f24d8e88b5408105a5ca911b4ea9d4d150e677a4 100644 GIT binary patch delta 53 zcmbQlHi?b*G%qg~0}!M#d1QER GsR00f>Ja1r delta 52 zcmbQpHj$0@G%qg~0}$x0cgu*_$eYb1sb5lAkXo#tlvty3S&CAQh00gN_9vL+od9O1{#*|bRq!z~{rIsYdlw=g8CZ-g}6qV)`$87$~ H$ioN#o{$l1 delta 53 zcmeBV>ty3S&CAQh00g@0-7?ZQ@?K|@)Gw(lNG;Y+N-as$FUcrMO-w1)FDlI|*5CY> Hk%tigof#15 diff --git a/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_calls_step_details.cpython-312.pyc b/venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_calls_step_details.cpython-312.pyc index 0c6437cc50e0586c495b439d9488a7118836690e..c170e085842206734613efb235987b02d0b38711 100644 GIT binary patch delta 52 zcmcb}dXbg)G%qg~0}!M#d1M4{3_1V+ delta 39 tcmZ3%zk;9lG%qg~0}$x0cgrZ<$org$N57=9AhlROIU}(|e-rZx7699k3*Z0% diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_audio.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_audio.cpython-312.pyc index 27b219791487d226bf7992326b01b1db58c5d191..5d2954ba79cffd1039608c4f4729e1932853d53a 100644 GIT binary patch delta 39 tcmcb{a*c)eG%qg~0}!M#d1S2E$Xmt86H`)IkXjs*oRL@(GkG%OVF2A%42S># delta 39 tcmcb{a*c)eG%qg~0}$x0cgyJC$Xmt8qhC^4kXo#toRL_fKY23aVF2L63|jyI diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_audio_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_audio_param.cpython-312.pyc index 6e2109398dd8df0522207ca81cfc87952ff8c2eb..ccfe1d64cd116a0b5e059ff1adba131a81d00b45 100644 GIT binary patch delta 40 ucmeyu_Jxi2G%qg~0}!M#d1NGSXqU<&CAQh00gN_9vMm!8~MI7@x+u=7Ni!(BxfX+#B3I1{=*3X-1Q6= delta 41 vcmeB`>XqU<&CAQh00g@0-7>1gH}ZXF;?XauEJ!WZPtHgz(cdh{{D%_&>kkZB diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_image_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_image_param.cpython-312.pyc index a3c67d225b4c4b866927a1a90fc551c44f0ad7e7..8f6bc356038b2ffb4d80753527c8c4b1b6c4cf33 100644 GIT binary patch delta 40 ucmX@lex9B8G%qg~0}!M#d1RPx`Y2aEvzBMi>~ diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_param.cpython-312.pyc index a0c79931c7d8563b22eb6f0f2b711edaeeb1e35b..f0096b54b24efa1d1ae686e80cdaed449140e55c 100644 GIT binary patch delta 45 zcmbQpJ&~L5G%qg~0}!M#d1Q#NZsgm|#1m6eS&&*Blbn%Q5;J)ti|po4O!Jul2bK+l delta 45 zcmbQpJ&~L5G%qg~0}$x0cguLqvXO5$6OVpLWkG7OesV@)iT>n`EV7$FG0kTJ03@Ie AMgRZ+ diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_refusal_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_refusal_param.cpython-312.pyc index 95564856cfbec1cae6f6d44ab5d5843565f4946b..df410a4319179eeadad2886e3d5636ef867547e7 100644 GIT binary patch delta 39 tcmcb>dV!VqG%qg~0}!M#d1O4=$h(h`C#IybAhkFqIU}(oX7Y8$p8)3L4R!zk delta 39 tcmcb>dV!VqG%qg~0}$x0cgwiEk#`>>kA6vIL29vnazj2X^46XnG delta 39 tcmbQjI)#<@G%qg~0}$x0cgwi8k#`9rkA6vIL29vnaz# diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_developer_message_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_developer_message_param.cpython-312.pyc index 4554f314ceab097671c68e1f3f0bf0e2baaf5a13..6f9f66b2e13a2d40bd1e4dec0995526293c91843 100644 GIT binary patch delta 40 ucmX@iewdy2G%qg~0}!M#d1Qod>kfDr)Q-wR^^ delta 40 ucmZ3%wt|iKG%qg~0}$x0cgyhK$orp>N57=9AhlROIU}(|f3pOW03!h5s0%y* diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message.cpython-312.pyc index dd842de7df7ded0ebc07df2b0385b42a4926f218..e41e14fcac62da5cb0b59b6b4ee61afac2227937 100644 GIT binary patch delta 41 vcmX@kf1IE1G%qg~0}!M#d1T0OZRBfb;)yA#EJ!VmNzOxsk7(iATSrvLLlsKRF|@M1S)_CN)+7_*e`> diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_param.cpython-312.pyc index 53530ae6befcc4c6aa312a1bdf1f00ad1324da1b..ad001b993d9ad77d7f5c22d70f0285b222cfa053 100644 GIT binary patch delta 40 ucmdnUv5|xCG%qg~0}!M#d1MH)Y~*Wa=7}k(EJ!VmNzO(~-^b4Z^ delta 40 ucmdnUv5|xCG%qg~0}$x0cgy(AypgY+nMc2*vLLlsKRF|@M1S%^<_Q4iy9{;! diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call.cpython-312.pyc index 33ea15495ce5ddd7f572c2d29509e61ca88c95d4..cbe6e323fff0e1c5b07bb2416e43f9823b6bd676 100644 GIT binary patch delta 40 ucmey!_K}VEG%qg~0}!M#d1Nf!$UB9RC#IybAhkFqIU}(oX7gIcBa8s`Q4JFS delta 40 ucmey!_K}VEG%qg~0}$x0cgtwm$UB9RN57=9AhlROIU}(|fAd<#Ba8s}1`OZ; diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call_param.cpython-312.pyc index 8235b220c689895636e0de54fac3633dd8564dc5..6ebca4c4d5159b6c1862e2e8dea2187cb79381aa 100644 GIT binary patch delta 41 vcmcb{evO^)G%qg~0}!M#d1MH%Y~(w_$P-giS&&*Blbn%Q60`Xp;}1pv>5dHN delta 41 vcmcb{evO^)G%qg~0}$x0cgy(5ypit+BaePbWkG7OesV@)iT>t$j6WCw1dk1~ diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_modality.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_modality.cpython-312.pyc index 8ca804068bf9e3a856c41fa2beeb11fc569a730f..30933fec7c0fbdab7167fa595112c83b3258044c 100644 GIT binary patch delta 39 tcmeBW?q%jZ&CAQh00gN_9vPoE@`^L^#FSJPq!z~{XC#)yOg3PQ1pvhB3ljhU delta 39 tcmeBW?q%jZ&CAQh00g@0-7?;6|Vi7BZpNG*;@&PXhY*__Jc%m@I~NefN@ delta 40 ucmZ3%zJi_iG%qg~0}$x0cgslG$m_$zqhC^4kXo#toRL_fzd4o3nGpcjhzlVA diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_reasoning_effort.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_reasoning_effort.cpython-312.pyc index d292f2ef803531730c18a9b748afc38bb4707ee4..06eb5ab7edc1f323a27381402e9d70bcfbdfabc7 100644 GIT binary patch delta 37 rcmcc4be)O!G%qg~0}!M#d1QQ=$oq^ZrlhhUwKyg@Be5iA;{ON$){hMt delta 37 rcmcc4be)O!G%qg~0}$x0cguJ^k@p#oeo19PYO#KDMq-Kn#QzZh+cpgT diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_role.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_role.cpython-312.pyc index 1d8c29dd6ff499e9aa7c1b71812d760b26568283..33f311fd6c830e6f3cc08fc39f7aafbe91619e05 100644 GIT binary patch delta 39 tcmZ3>yq1~wG%qg~0}!M#d1Od!yq1~wG%qg~0}$x0cgqmo$ZN&OqhC^4kXo#toRL_fKRK8&3IM~r3Zei2 diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_store_message.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_store_message.cpython-312.pyc index a9846ea02e16342c004634c6a5397c7891860c4c..fa8cfef012444287cf8796d1b3cdfa11d0c349ee 100644 GIT binary patch delta 39 tcmbQuGMk0>G%qg~0}!M#d1P2`G%qg~0}$x0cgrx`$m_<)qhC^4kXo#toRL_fKRKRp4*hRJ^rnGpcl@e4En diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_token_logprob.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_token_logprob.cpython-312.pyc index b5c78fc51b8628495dd7de88366cedc95a0dbbe3..7f80fbce4cb15bb966181487473085f49037b6eb 100644 GIT binary patch delta 41 vcmbQkF^7ZiG%qg~0}!M#d1NTDZ{)kh$P-giS&&*Blbn%Q60`XWqXrWI+9C_* delta 41 vcmbQkF^7ZiG%qg~0}$x0cguLmwvq1^BaePbWkG7OesV@)iT>sVYfe`@eR}41* delta 40 ucmX@gew3Z}G%qg~0}$x0cgwi7kvE5lN57=9AhlROIU}(|e{(C710w+K@(d0D diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_param.cpython-312.pyc index 1b2cc300f6a135b0b974431515afe4a09c6189c2..ce3b7cea1fc49ed512a9fb9fa66a2a4ece0cc5aa 100644 GIT binary patch delta 41 vcmbQlHi?bzG%qg~0}!M#d1SCNZRC5($P-giS&&*Blbn%Q60`X~qc9@?)JO}j delta 41 vcmbQlHi?bzG%qg~0}$x0cgy(BxRLKEBaePbWkG7OesV@)iT>vQjKYin@S+Tg diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_user_message_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_user_message_param.cpython-312.pyc index 5f899c9115fecb36bd7fda75eb25adcaeab410bd..f714bb26cc0a43e4b7336d1e6d9c3585e8f8b27d 100644 GIT binary patch delta 40 ucmZ3^zMP%+G%qg~0}!M#d1M%FFfS&&*Blbn%Q60><8*A6ZK2g41Q delta 41 vcmcbnbxn)!G%qg~0}$x0cgyg$+sN0##iL(RS&&++pPZ3cqQ7|_*A6ZK|27Qi diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/completion_list_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/completion_list_params.cpython-312.pyc index b6ac11a5082a2818f4d799015ebaa626d59a6eda..b1e7f49c59480f3a1e2598656da216fda456bbbc 100644 GIT binary patch delta 40 ucmcb^c887kG%qg~0}!M#d1M^f$Sc9b6H`)IkXjs*oRL@(v)PbIn-KuzCJTE2 delta 40 ucmcb^c887kG%qg~0}$x0cgtA3kynC=N57=9AhlROIU}(|f3qQzHX{J%tqVo~ diff --git a/venv/Lib/site-packages/openai/types/chat/__pycache__/completion_update_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/__pycache__/completion_update_params.cpython-312.pyc index 766397682a8dfe828bed873a91be71e03c35b535..445802f1a500408bc2e99416c0108efac993b9da 100644 GIT binary patch delta 40 ucmcb?dV`hsG%qg~0}!M#d1UIkA6vIL29vnazvPDTLs(+w;D delta 40 ucmaFD_Joc1G%qg~0}$x0cgvWuk@pZIkA6vIL29vnazPHIVJeqOQuWM)QF E0F7D@TmS$7 diff --git a/venv/Lib/site-packages/openai/types/chat/completions/__pycache__/message_list_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/chat/completions/__pycache__/message_list_params.cpython-312.pyc index b638f27d27ff4aa687b642fc143b4a31c7beefbb..08ad435f2791ab1879003bbbb7d7433f51c7c11a 100644 GIT binary patch delta 51 zcmZ3@x|)^uG%qg~0}!M#d1S(l4njNG;Y+&d)1J%*;zID%PL8g7Fam9)%9E diff --git a/venv/Lib/site-packages/openai/types/containers/__pycache__/file_create_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/containers/__pycache__/file_create_response.cpython-312.pyc index dcd710392bddedc4042d67c4b64a40a2d9674bf4..00bac2f85615afb4638c0f17324cdd9e1e24876b 100644 GIT binary patch delta 45 zcmZod+&CAQh00gN_9vL4t^1fvhiYciqNG*;@&d)1J%*;zIDvp`V!}JvZCeRM$ delta 45 zcmZod+&CAQh00g@0-7+q1cn3Cicn3RYrAhkFqwJb5GIA-!+<`@9@7Y&&J delta 40 ucmcb~ag&4hG%qg~0}$x0cgtA0k@qn(uYO5oL29vnYFT1VvHs-0%rOA_$PI4* diff --git a/venv/Lib/site-packages/openai/types/evals/__pycache__/create_eval_completions_run_data_source.cpython-312.pyc b/venv/Lib/site-packages/openai/types/evals/__pycache__/create_eval_completions_run_data_source.cpython-312.pyc index 05cadd2cb4d0f61909bc01752179cf2de398b180..9bd94695296507e34fc67fcebcc175737ffb6017 100644 GIT binary patch delta 41 vcmcbla!G~vG%qg~0}!M#d1URYrAhkFqwJb5GIA-&6CO#Gb5+Dt+ delta 41 vcmey$`<0jXG%qg~0}$x0cgr}uk@qYUuYO5oL29vnYFT1VvHs@gOnfW=6UPm6 diff --git a/venv/Lib/site-packages/openai/types/evals/__pycache__/create_eval_jsonl_run_data_source_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/evals/__pycache__/create_eval_jsonl_run_data_source_param.cpython-312.pyc index bdf68491b6dd97017a93f2ca53f7b58acbc04fe8..97bd7c085eeb7144fcfbd4782a3f64cd72a0f6a5 100644 GIT binary patch delta 41 vcmZ3@yPB8xG%qg~0}!M#d1RPuz0=$j0# diff --git a/venv/Lib/site-packages/openai/types/evals/__pycache__/eval_api_error.cpython-312.pyc b/venv/Lib/site-packages/openai/types/evals/__pycache__/eval_api_error.cpython-312.pyc index 6f3904d67aa63b12524e9b23b519a1ace3a4add6..d46e7f2c5b918b67717d60777b066919f6905651 100644 GIT binary patch delta 40 ucmZonVkB^s delta 40 ucmZoX%d&q!#O^mL=vC>raklTmk^YYYQF# diff --git a/venv/Lib/site-packages/openai/types/evals/__pycache__/run_cancel_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/evals/__pycache__/run_cancel_response.cpython-312.pyc index 3aa28f9fd4ce7a2025eaf48a564b2f1f57121c34..5e0b18347ed07a98d25387e91067fdd96838f363 100644 GIT binary patch delta 42 wcmca$eZiXVG%qg~0}!M#d1QoZZsfbl&KpxwS&&*BlUkOTQyjDT1N#F}01^!jRsaA1 delta 42 wcmca$eZiXVG%qg~0}$x0cgqmf*vNO4omao4vLLlsKea3|r&xdU2lfY|01=H1{{R30 diff --git a/venv/Lib/site-packages/openai/types/evals/__pycache__/run_create_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/evals/__pycache__/run_create_params.cpython-312.pyc index 903b954f8540b21dfab7352cad1f13befb97db56..3f51630e1fac966170866c419e3420ccd6ce3f32 100644 GIT binary patch delta 42 wcmX?RaLj=3G%qg~0}!M#d1N%GY~<_U;EgG%EJ!VmNi9pvDUR8^m}4?#vF~?$l01hGzYybcN diff --git a/venv/Lib/site-packages/openai/types/evals/__pycache__/run_create_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/evals/__pycache__/run_create_response.cpython-312.pyc index 7ab324da9f977ec08f32d2cb8e9df2a58da6ee39..8b51f6736c6631ad6541e998811a17b2190b89fa 100644 GIT binary patch delta 42 wcmca$eZiXVG%qg~0}!M#d1QoZZsfbl&KpxwS&&*BlUkOTQyjDT1N#F}01^!jRsaA1 delta 42 wcmca$eZiXVG%qg~0}$x0cgqmf*vNO4omao4vLLlsKea3|r&xdU2lfY|01=H1{{R30 diff --git a/venv/Lib/site-packages/openai/types/evals/__pycache__/run_delete_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/evals/__pycache__/run_delete_response.cpython-312.pyc index d19ffbf0b5dd9d66d767bf6f2a1bfe1b0af7922f..89c7aeb8eb08596a369b552a111431f2ff2e9b57 100644 GIT binary patch delta 40 ucmbQkI)|0_G%qg~0}!M#d1M4_)WO#SD}H diff --git a/venv/Lib/site-packages/openai/types/evals/__pycache__/run_list_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/evals/__pycache__/run_list_params.cpython-312.pyc index f984e3e0334fad80db8d7a270d792e8c178b2d7c..a49976bb546b2ac9503fce669990b263c9381ef2 100644 GIT binary patch delta 41 vcmey*`k$5WG%qg~0}!M#d1MGOZ{+*V$Qx5qS&&*BlUkOTQyeo{i0Lf=_X!N` delta 41 vcmey*`k$5WG%qg~0}$x0cgy(3w2|*SBd>l*WkG7Oerj1_PO<)EA*Qzg5|<6V diff --git a/venv/Lib/site-packages/openai/types/evals/__pycache__/run_list_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/evals/__pycache__/run_list_response.cpython-312.pyc index 48ed45db357ac09234b504582c954cab3f88fc81..be199d39cb7df94a79493baba3ea605d1d00640c 100644 GIT binary patch delta 42 wcmX?Oea4#aG%qg~0}!M#d1M4@Zsfbn&KpxwS&&*BlUkOTQyjDT9s4~|01ztmd`y_{G%qg~0}!M#d1NSaZ{+i05{fCQEJ!VmNi9pvDUK;B%`1-CoW&Hw4gfJ| B4jcdg delta 47 zcmX>md`y_{G%qg~0}$x0cgxt#wUN(@Nl3q>vLLlsKea3|r&zzJG_P2Ha~4w!I{-(s B4srkh diff --git a/venv/Lib/site-packages/openai/types/evals/runs/__pycache__/output_item_retrieve_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/evals/runs/__pycache__/output_item_retrieve_response.cpython-312.pyc index c4ea0729aa97ee5b110bb4d8f9936b7b91a7588e..b5f64760b731c4367b623bec149283cdb3f5ac4f 100644 GIT binary patch delta 47 zcmX>nd`_6}G%qg~0}!M#d1PpFZ{+i15{fCQEJ!VmNi9pvDUK;B%`1-CoX3>F4gfW{ B4nP0^ delta 47 zcmX>nd`_6}G%qg~0}$x0cgr};wUN({Nl3q>vLLlsKea3|r&zzJG_P2Ha~@LyI{-`r B4we7_ diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/__init__.cpython-312.pyc index a57b8c731204e082671fdc7e931668b1ef73404f..4b2ed18ead44f4c9958cf7c16322fe45d244dbb9 100644 GIT binary patch delta 46 zcmey%^OuMBG%qg~0}!M#d1N?k A@&Et; delta 46 zcmey*@}GtGG%qg~0}$x0cgv{U$lJ##tY1=DkXo#tmYJ6tUs9TvnU}6Vc^%_L08(KO A(EtDd diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/dpo_method_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/dpo_method_param.cpython-312.pyc index 984780bf9f402b5be1f5ccdfe9617397bbe3c751..c3bfe4071af353c889126bc2104e6f9d22e20008 100644 GIT binary patch delta 46 zcmbQjI)#<@G%qg~0}!M#d1S2F$lJy!98*$RkXjs*mYJ6tUs9TvnU@|jc^Tt704vrH AQ2+n{ delta 46 zcmbQjI)#<@G%qg~0}$x0cgvW!k++ReSihvQAhlROEi*4QzN9oSGcR3#@-oJE05E|M AF8}}l diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job.cpython-312.pyc index 583bbc49167bf109204ca69046b814a1b24f26f5..af6c84e341bb8407ad1e0e3d0161436271331263 100644 GIT binary patch delta 48 zcmX>qaa4luG%qg~0}!M#d1Q!-Zsa?~Bpg#xS&&*Bla`s68edYHmzkFyv-ves6ej>s Cd=Gm7 delta 48 zcmX>qaa4luG%qg~0}$x0cgrXf*~oW_Nm#$6vLLlsKP@vaHNK=YFEcM)fAedmC{6%k Ce-Fg~ diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_event.cpython-312.pyc index e7fd61f49c641810966bbb60a5af4e1f9444c36a..a1f2470e3409fb87b02296f72f88c53fd4e1494a 100644 GIT binary patch delta 47 zcmcb{evO^?G%qg~0}!M#d1RDr$ook+rlhhUwKyg%GcPs1q%RA12mmiE B4wC=? delta 47 zcmZo+YhmL(&CAQh00g@0-7=Uq^4?<<)-S0nNG;Y+%gjrSFDcE-%uCnb{Ev~15dblJ B4qgBN diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration_object.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration_object.cpython-312.pyc index ca73352918a46c7c859fa624977bfa8a27de544d..973cb6d073bb2261e2e4e4ae4a1249388b521dbc 100644 GIT binary patch delta 47 zcmcb|dXJU&G%qg~0}!M#d1P2_BpMgUL{ B4&ML( diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_create_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_create_params.cpython-312.pyc index b2dc4149b6dbca6fa21c5edf354f507a5a305989..4960b156f9414efb9bbeb7de67fa0bfa2970ef73 100644 GIT binary patch delta 48 zcmZ21x>%I&G%qg~0}!M#d1OqG*vJ>fA{i@gAD*g CFb%I&G%qg~0}$x0cguJzzL77AMOeS2vLLlsKP@vaHNK=YFEcM)e{(g91{(lW CzYf{} diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_events_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_events_params.cpython-312.pyc index 23e909d10a3556e4a1888f2fa427f61fb594a85f..5deeee1175a97b206a85461ca95eb226f3862fb4 100644 GIT binary patch delta 46 zcmaFN@|cD9G%qg~0}!M#d1TDr$eYV398*$RkXjs*mYJ6tUs9TvnU@|jxtH-807Bjm AmH+?% delta 46 zcmaFN@|cD9G%qg~0}$x0cgvWtkvEr7SihvQAhlROEi*4QzN9oSGcR3#axddG07q;O Aa{vGU diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_params.cpython-312.pyc index 4b4236cf4b7b63e8491a7e0acd0abaa3e634bde0..218846dd13b30f94047f76078f9b3faf48aa5cba 100644 GIT binary patch delta 46 zcmX@XdV-brG%qg~0}!M#d1SP0<??SihvQAhlROEi*4QzN9oSGcR3#vlJ5-BLGJ- B4mSV* diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/supervised_method.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/supervised_method.cpython-312.pyc index 9c47b06eb6e16b8efd32d49b7dbcaaeb780ac650..a20a209af5eb6021b91fa21da188e6a90dba8c74 100644 GIT binary patch delta 46 zcmbQmI*XO}G%qg~0}!M#d1Nfz$UBEoIHshsAhkFqEi*4QzN9oSGcP@6@*c)}056pf AasU7T delta 46 zcmbQmI*XO}G%qg~0}$x0cgvWuk#`QGuzpEpL29vnT4r8qd`W3uW?s7f AQ2+n{ diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/supervised_method_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/supervised_method_param.cpython-312.pyc index cf596fa549ed5b9e006e9291eea5854eaeca7ae8..4d1864eb890f22556f4bdc46ef61bff84847490b 100644 GIT binary patch delta 46 zcmZ3-x{j6iG%qg~0}!M#d1Rd4$UB8mIHshsAhkFqEi*4QzN9oSGcP@6@)pKl06HHJ A%m4rY delta 46 zcmZ3-x{j6iG%qg~0}$x0cgxtjk#`ECuzpEpL29vnT4r8qd`W3uW?s7fnauis=W~5 diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/alpha/__pycache__/grader_validate_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/alpha/__pycache__/grader_validate_params.cpython-312.pyc index eff05593cec7e6774797847b6c95b7b388e77903..dfc3c906051a11c6d41e99456b0dfdab045ace62 100644 GIT binary patch delta 53 zcmeCT~f HddCO=m%S04 delta 53 zcmeCN_@>VfP>X%d&q!#O^W#*;Emz3sZ=B4W=<`iTk>Th1a H^o|h#nFJ9; diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/alpha/__pycache__/grader_validate_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/alpha/__pycache__/grader_validate_response.cpython-312.pyc index 48588fa260f4750ac22b428fdf7c10cef1aa71ab..17150581b695cf1d223061b9e2326a2a0f4e5d2c 100644 GIT binary patch delta 53 zcmdnZv73YUG%qg~0}!M#d1Od#^ HX*VMPmxvI< diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/__init__.cpython-312.pyc index 63ad08e1393d3cec1ef290a06c63e4c274f16664..b70497d88d83695b94013a7fe69fa4caa358d8ca 100644 GIT binary patch delta 58 zcmey%@|T78G%qg~0}!M#d1QoctcG%qg~0}!M#d1Q2NtcG%qg~0}$x0cgv{T$UA{iUcaQWAhlROEi*4QzN9oSGcR2~IU_YWyC6R^ MucTOi@*c)#00d7I82|tP diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/permission_create_response.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/checkpoints/__pycache__/permission_create_response.cpython-312.pyc index caac068702c2e74751ac8a245bff3e54b091d598..4349e20751cab63a9337f298750fe22294582c6b 100644 GIT binary patch delta 58 zcmX@hdX|;x|WsqG%qg~0}!M#d1N?jx|WsqG%qg~0}$x0cgxV*$h(wLUcaQWAhlROEi*4QzN9oSGcR2~IU_YWyC6R^ MucTOi@oP?$0RZmy5|;n~ delta 59 zcmZqUY~$oT&CAQh00g@0-7*3;@-i~X>z7m(q!#O^W#*;Emz3sZ=B4W=XQU=)7vyK= Nl@#l5)@6!h0s!ri5;On+ diff --git a/venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/__init__.cpython-312.pyc index 354deb7ce7f287eaba3a0496fc2cf8d21269f098..9edfb8e65ef8f6c2905ca6fa4b8b4bffa3f9e1a9 100644 GIT binary patch delta 51 zcmeBV?qudY&CAQh00gN_9vQkDd36{iVoE9tQj25KGV@a7OG@)H^U`Co@{@{VCI>QF F003GE4`KiS delta 51 zcmeBV?qudY&CAQh00g@0-7?fS^6D^3=$BL$q!#O^W#*;Emz3sZ=B4Xr diff --git a/venv/Lib/site-packages/openai/types/graders/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/types/graders/__pycache__/__init__.cpython-312.pyc index 3996184a1a16d351b82a6914c11b6485b43fe85e..c8203f10fbdd48e881228d14b7249d8ce979939f 100644 GIT binary patch delta 43 xcmaFQ{+^xhG%qg~0}!M#d1P?2Y~-t9=8q|4ekH{ diff --git a/venv/Lib/site-packages/openai/types/graders/__pycache__/label_model_grader.cpython-312.pyc b/venv/Lib/site-packages/openai/types/graders/__pycache__/label_model_grader.cpython-312.pyc index 03237b655a70c65a293aa64812cf72b3075d08a2..51f28478ab83b71cc6ce0d5e97691cc2197bc05c 100644 GIT binary patch delta 44 ycmaFM^OlG2G%qg~0}!M#d1R=vZR87L;*Tk*EJ!VmNiRxFNi8al*__Yxj~M_GAPuSj delta 44 ycmaFM^OlG2G%qg~0}$x0cgy&|x{)u4iC@2@vLLlsKfNe1CAFwne{(+5KV|?es}5iQ diff --git a/venv/Lib/site-packages/openai/types/graders/__pycache__/label_model_grader_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/graders/__pycache__/label_model_grader_param.cpython-312.pyc index e999f8705943e813c71bd47f8338c54a31a93f3c..1d18d08dbb8330aae12fa60055e737796eda7e59 100644 GIT binary patch delta 43 xcmX@fdy<#;G%qg~0}!M#d1PGM$UB{hKc=LzAhkFqy(lpywWv5|^JXS7762Iu4X*$I delta 43 xcmX@fdy<#;G%qg~0}$x0cgt9?k#{;1zkW$&L29vndQoCZYEiNN=FLoEEC3l+4P^iT diff --git a/venv/Lib/site-packages/openai/types/graders/__pycache__/multi_grader.cpython-312.pyc b/venv/Lib/site-packages/openai/types/graders/__pycache__/multi_grader.cpython-312.pyc index 1f43d87690c1ecbf9e01a238bddbfeca6fa6288e..2da05ed14d7e1f7593cfe60a4a42589640915089 100644 GIT binary patch delta 44 ycmcb`af^fRG%qg~0}!M#d1OejY~-8C#2-^qS&&*BlU|gVl3G+8vw0iS5=HDU%#ZXAhlROy(lpywWwHs@*~E#00O!V<^TWy diff --git a/venv/Lib/site-packages/openai/types/graders/__pycache__/python_grader_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/graders/__pycache__/python_grader_param.cpython-312.pyc index 31ac86155a5e6fd0ff2b8f589ba79b512a106c52..1b4ffcb90e4ea813e676ddc6588f9a2c94a1ea17 100644 GIT binary patch delta 42 wcmaFL`jnOTG%qg~0}!M#d1QEP)LoX=#-0s#2*40-?n delta 43 xcmZ3(yM~wdG%qg~0}$x0cgtYg$Q#VWuU}GGkXo#tUX+-UT2!pRIiJav1pxU$3@`uy diff --git a/venv/Lib/site-packages/openai/types/graders/__pycache__/score_model_grader_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/graders/__pycache__/score_model_grader_param.cpython-312.pyc index f72d721ebce880608767ab811d79db6d784e42b7..78b685884a9305d417b8815cb4954f6e70083618 100644 GIT binary patch delta 43 xcmX@Wdw`esG%qg~0}!M#d1P$e$lJ@rA5&6UkXjs*UX+-UT2vgfc_ouL3jh(X4QT)X delta 43 xcmX@Wdw`esG%qg~0}$x0cgv{T$lJ@ruU}GGkXo#tUX+-UT2!pRc_ouL3jh(~4ITgh diff --git a/venv/Lib/site-packages/openai/types/graders/__pycache__/string_check_grader.cpython-312.pyc b/venv/Lib/site-packages/openai/types/graders/__pycache__/string_check_grader.cpython-312.pyc index 4a3ad019966fc4cc02961c10f1c1e39fac05e04d..c8f5141136f34957da24c944f223103b88ceeead 100644 GIT binary patch delta 42 wcmcc1dY6^=G%qg~0}!M#d1UO~$a{m4Kc=LzAhkFqy(lpywWv5|@)yRJ024G0+W-In delta 42 wcmcc1dY6^=G%qg~0}$x0cgtA3k@p58zkW$&L29vndQoCZYEiNN)LY{$gR2mth+3)TPt delta 43 xcmX@ec94ztG%qg~0}$x0cgtYj$g9M}uU}GGkXo#tUX+-UT2!pR*^Y^s5dio13#tGB diff --git a/venv/Lib/site-packages/openai/types/graders/__pycache__/text_similarity_grader.cpython-312.pyc b/venv/Lib/site-packages/openai/types/graders/__pycache__/text_similarity_grader.cpython-312.pyc index 0e07d1ee7d4a12c8e22a072d2a27dc62849a659d..f74a4b29cb15f2c883ea9dcb56ddd08edf47e385 100644 GIT binary patch delta 42 wcmdnVwv&zbG%qg~0}!M#d1M%D(g?85XF0O?H(xBvhE delta 42 wcmdnVwv&zbG%qg~0}$x0cgqmk$g9D`uU}GGkXo#tUX+-UT2!n**@fvV0PH*rh5!Hn diff --git a/venv/Lib/site-packages/openai/types/graders/__pycache__/text_similarity_grader_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/graders/__pycache__/text_similarity_grader_param.cpython-312.pyc index ccf68fe6c0430c1ddf6862d266c6284162e03bee..8826c5d5cd72fd0a51299d80ba77448e973e350f 100644 GIT binary patch delta 43 xcmZ3%zJi_iG%qg~0}!M#d1S2E$Xmz6A5&6UkXjs*UX+-UT2vgfc@`5NBLD>F4E6v3 delta 43 xcmZ3%zJi_iG%qg~0}$x0cgyJ5$Xmz6uU}GGkXo#tUX+-UT2!pRc@`5NBLD|*48i~a diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/__init__.cpython-312.pyc index 9e4f54406af2498b612ec99807aea45b4a95f0ed..436c077c6bac11174f3fc9e5aca9ec9ebe043d62 100644 GIT binary patch delta 46 zcmZ1(yfT>YG%qg~0}!M#d1S0G*~r(aE*Mi%S&&*BQYG%qg~0}$x0cgwhDypgX{T~NQIvLLlszbLi1AV04d$lAO@oskIuSh5c? diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/computer_tool.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/computer_tool.cpython-312.pyc index 112716bef82c00a0a03f9a258fd0588622fa939e..fc09234693ceb2556d4f126da9bb27e704e10484 100644 GIT binary patch delta 44 xcmaFP`ka;bG%qg~0}!M#d1RDqX%d&q!#NJr4|?D=M@84n}e9l8375<48Q;Y diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/easy_input_message_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/easy_input_message_param.cpython-312.pyc index 687e768b6866ef50792c9db33b9764755a8748ba..5aba9fa768d82518209484f5686b6dc57c5bd912 100644 GIT binary patch delta 45 ycmX@beu|yj47!sNG*;jN-ZwP&npJ9Hm_t-WCj2(h7L^t delta 45 ycmX@beTtj+G%qg~0}$x0cgu*}$lJ{%s9#c9kXo!?lv-SnpH~cIZC=Tw$P554kq!(1 diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/file_search_tool_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/file_search_tool_param.cpython-312.pyc index 61b2635182efbef6ecfae73f16767f199d09bfa5..8f23c39d6d2b8581cb04cf7e7448efaa83d6104a 100644 GIT binary patch delta 45 ycmZ3;y^x#tG%qg~0}!M!d1Or9$UBiqFs7ukAhkHAD7CmCKd%_b+Pt3W6B7U=MGoZv delta 45 ycmZ3;y^x#tG%qg~0}$x0cgslI$UBiqP`{+IAhlS(D7CmCKd%_b+Pt3W6B7U>G!CNx diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/function_tool.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/function_tool.cpython-312.pyc index a0fa30273806a0e3f85acdb08d8eebc9dd9b0b23..e2eebfbbdf0458e86804bbe477048fa7a5a301a5 100644 GIT binary patch delta 45 ycmcc1c9)I!G%qg~0}!M!d1P2@>VVvNkVd_TvTsJsA#| delta 46 zcmaDa`(BpsG%qg~0}$x0cgxUK-pJR)ET~^nS&&++UzA#0ke^o!WNlu^?8glNMdc2e diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_audio_delta_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_audio_delta_event.cpython-312.pyc index 248763bc3340ffd720210ba052a00c575f01de2e..a8b84a62ef0f93ef9bf70add35e1af04cf7914c3 100644 GIT binary patch delta 44 xcmZ3+x{Q_gG%qg~0}!M!d1Q!g=fW4od(4 diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_audio_transcript_delta_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_audio_transcript_delta_event.cpython-312.pyc index b15c5e8df978770b47d033e3c6f686849864ab69..fb5d31befdbc31f1f60eec6fe7bf5289493fda5c 100644 GIT binary patch delta 44 xcmX@cdW@C#G%qg~0}!M!d1R<> delta 44 xcmX@cdW@C#G%qg~0}$x0cgqmn$a{cMP`{+IAhlS(D7CmCKd%_bntYG(1ppk*4!{5a diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_audio_transcript_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_audio_transcript_done_event.cpython-312.pyc index 5995888c7df70f5fcefe664afa5d42214ea80e46..3d02ba4286adc21ecae5908efdb9c0b0d4c93413 100644 GIT binary patch delta 44 xcmZ3?x|o&sG%qg~0}!M!d1Tz!$h(YDFs7ukAhkHAD7CmCKd%_bntX)uJ^&o%4;26a delta 44 xcmZ3?x|o&sG%qg~0}$x0cgr}rk#`xRpngeZL29vnQEG8PeqJ$d+&CAQh00e1F9vS;L^1fsgj47!sNG*;jN-ZwP&npJ9CbKjB0ss?P4qN~L delta 44 xcmZod+&CAQh00g@0-7;2fqj47!sNG*;jN-ZwP&npJ9Hv2MZFaiK3Yz>0| delta 45 ycmey$_LYtIG%qg~0}$x0cgx_}$g9sJs9#c9kXo!?lv-SnpH~cIZT4l-U<3du-wjv* diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_code_interpreter_call_in_progress_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_code_interpreter_call_in_progress_event.cpython-312.pyc index 723986d1230e06bdce6539b8aacabf9df33367ef..b7176ac471aa10cc4f6ea703e6efa0bf87cc7723 100644 GIT binary patch delta 45 ycmeyx_KS`8G%qg~0}!M!d1Pp8kb delta 45 ycmeyx_KS`8G%qg~0}$x0cgqmk$ZNzTs9#c9kXo!?lv-SnpH~cIZ4O}4VgvvznhkIO diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_code_interpreter_call_interpreting_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_code_interpreter_call_interpreting_event.cpython-312.pyc index a01d6d070c3d6b46db35c22e031c06f0247eac96..63e33728d88a8d6ea56c95ec48e3eb0f6c85aa15 100644 GIT binary patch delta 45 ycmeyz_K%JCG%qg~0}!M!d1UBqj47!sNG*;jN-ZwP&npJ9Hm_vb&jJ87Ee`kq delta 45 ycmaFC_kxf2G%qg~0}$x0cgv92$lJ{%s9#c9kXo!?lv-SnpH~cIZC=T=p9KIl1P-hK diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_code_interpreter_tool_call_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_code_interpreter_tool_call_param.cpython-312.pyc index 0e252c1048c869eac4a1e97954544e62836b0e7e..8ee6673438a8b8873c5fa9912dda6e6b3d9615c3 100644 GIT binary patch delta 45 ycmdnWx0R3gG%qg~0}!M!d1Nfz$lJ~&7*kSNkXjs5lv-SnpH~cIZC=VWfdv38I}Wh` delta 45 ycmdnWx0R3gG%qg~0}$x0cgx7%$lJ~&s9#c9kXo!?lv-SnpH~cIZC=VWfdv38E)He@ diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_completed_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_completed_event.cpython-312.pyc index 88a66845dece61df24c9ccb67044421bb339fa9c..f56f8767fd41ef2d7d26d7e748984e27adcfdf59 100644 GIT binary patch delta 44 xcmX@hdX|;pe^Q?JG%qg~0}!M!d1U-p$jc%aQ&L%wS{zf9T3nEyR}5rrmSb7X4FD_B4psmF delta 44 xcmX>pe^Q?JG%qg~0}$x0cgs*&$jc(AUs73+TC87`T3nEyR}5rrmSb7X4FDS74Q&7b diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_computer_tool_call_output_item.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_computer_tool_call_output_item.cpython-312.pyc index 79c7e9a38ce2dfffee9c5eaa0242cd8e5e7875f0..6c49b883c6bd277878bddacaa038849197d7925f 100644 GIT binary patch delta 50 zcmcc2b(xFrG%qg~0}!M!d1SD#ZR8VS5{xOSEJ!VmDM~Fa$j>VVvL>%#QQjQJ^p^<$ DSKJR< delta 50 zcmcc2b(xFrG%qg~0}$x0cgwiSx{*(WNl?F}vLLlszbLi1AV04d$eO%{MR{`=(_bb4 Dc%~2* diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_computer_tool_call_output_screenshot.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_computer_tool_call_output_screenshot.cpython-312.pyc index 6084f81ea79b8a2eedc6656964ad3d432b6459f7..4d3d17e338471299f13c85cecd710fbaa77068cf 100644 GIT binary patch delta 45 ycmbQoHjj<>G%qg~0}!M!d1S2F$orO2Fs7ukAhkHAD7CmCKd%_b+RV))%m@G|;0?t9 delta 45 ycmbQoHjj<>G%qg~0}$x0cgvWzk@qd5pngeZL29vnQEG8PeqJ$tf?Q&CAQh00e1F9vMqF^4@0@j47!sNG*;jN-ZwP&npJ9HveVhWdr~tmkx6P delta 45 ycmeBT>tf?Q&CAQh00g@0-7+R@VVvNk8O?BxakCT$K* delta 46 zcmbQIFi(N+G%qg~0}$x0cgxr=yphj|MNq$_vLLlszbLi1AV04d$l9F9vX>hGG7b)C diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_content_part_added_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_content_part_added_event.cpython-312.pyc index 3933af10a5f31833747a8a14aa268564e970e0dc..3ecacf5c27b51de865a458106bb25db77147b2d0 100644 GIT binary patch delta 45 ycmZ3@xtf#rG%qg~0}!M!d1NGQ9hYT>xS&&*BQ>q=54!*W delta 44 xcmX@YdW4ntG%qg~0}$x0cguLQk@pazpngeZL29vnQEG8PeqJ$vG%qg~0}!M!d1P$f$lJsu7*kSNkXjs5lv-SnpH~cIZC=2{$qWD|0S*rU delta 45 ycmZ3vG%qg~0}$x0cgtwl$lJsus9#c9kXo!?lv-SnpH~cIZC=2{$qWD|NDapT diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_file_search_tool_call_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_file_search_tool_call_param.cpython-312.pyc index f52a8148a21a4151200705cc2e44fe32a1b2644b..61cd886287d6fb0c132e02f5e0958915f8a13b37 100644 GIT binary patch delta 45 ycmey*^`DFPG%qg~0}!M!d1PGL$eYh37*kSNkXjs5lv-SnpH~cIZSH0I!~_6GNe`L; delta 45 ycmey*^`DFPG%qg~0}$x0cgvW+kvE@7P`{+IAhlS(D7CmCKd%_b+T6?Zi3tElkPlJ- diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_format_text_config.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_format_text_config.cpython-312.pyc index 4c3a34029202065c83813600d22d85b190cb5e28..b268224988249dd0cde3b5bcb176c0f89279032e 100644 GIT binary patch delta 44 xcmdnZwwsOjG%qg~0}!M!d1OrA$UA{aFs7ukAhkHAD7CmCKd%_bn!Jvw7XTaN4vGK( delta 44 xcmdnZwwsOjG%qg~0}$x0cgtws$UA{aP`{+IAhlS(D7CmCKd%_bn!Jvw7XTn64rKrU diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_format_text_config_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_format_text_config_param.cpython-312.pyc index cba151fc9278c389cebf76979b7e70e8d5776bba..a71bb89b12fad0b9b5fbbdae4c8143a195c7492d 100644 GIT binary patch delta 44 wcmeBS>tW+P&CAQh00e1F9vO`rdGnYAV@fIuQj24XQi}`n^NNA2$vsRB00t!u#Q*>R delta 44 wcmeBS>tW+P&CAQh00g@0-7*R{^5!uK>X%d&q!#NJr4|?D=M@84lY5vN019Odpa1{> diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_format_text_json_schema_config.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_format_text_json_schema_config.cpython-312.pyc index 41b9bf9f89bff968a314737d1dc7b39739d6fcb7..d075f841b9e362c969ca265f8058992b88fa698d 100644 GIT binary patch delta 45 ycmaFK{*s;dG%qg~0}!M!d1P$d$XmuF7*kSNkXjs5lv-SnpH~cIZJxpu$_M~Ds}8pS delta 45 ycmaFK{*s;dG%qg~0}$x0cgtwo$XmuFs9#c9kXo!?lv-SnpH~cIZJxpu$_M~E(hhe3 diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_format_text_json_schema_config_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_format_text_json_schema_config_param.cpython-312.pyc index 2792a60c17b8a380faa4cba3e479a5a59da6e76c..823aab5aaea654cace8ac05b35f9bb128e6c6457 100644 GIT binary patch delta 45 ycmZ3-zK)&uG%qg~0}!M!d1TDp$Q#Ba7*kSNkXjs5lv-SnpH~cIZ7yN5VgvvnT@BIz delta 45 ycmZ3-zK)&uG%qg~0}$x0cgrZ*$Q#Bas9#c9kXo!?lv-SnpH~cIZ7yN5VgvvoybY89 diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_call_arguments_delta_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_call_arguments_delta_event.cpython-312.pyc index e6a86c87ceb82877e2d54ca21a5b300f01e4dc26..f6f153520455164eb81db3c944e18a6b23f98ffa 100644 GIT binary patch delta 45 ycmbQoHjj<>G%qg~0}!M!d1M%EG%qg~0}$x0cgv92$oq#;P`{+IAhlS(D7CmCKd%_b+APJy!UzB$APp-3 diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_call_arguments_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_call_arguments_done_event.cpython-312.pyc index af18a1f22aa917f900befcaa975d36d73ce1ecf6..fb60a2984b62b7f345e1593eaa55e32a2544d3e7 100644 GIT binary patch delta 44 xcmbQnHjRzWg3jh?o4j2Fc diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_tool_call.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_tool_call.cpython-312.pyc index bf1b62c11328ea867134e46ffe5e0b2b9448ab51..b6135a9869543903809f2944fe217826e1eed176 100644 GIT binary patch delta 45 ycmeyu_Jxi2G%qg~0}!M!d1P$e$ZN?Y7*kSNkXjs5lv-SnpH~cIZ4PIWWdr~>G!7jA delta 45 ycmeyu_Jxi2G%qg~0}$x0cgvW%k=K$*P`{+IAhlS(D7CmCKd%_b+8oX#%Lo8Dj}7Pm diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_tool_call_item.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_tool_call_item.cpython-312.pyc index 1ba710c7b2bb6d117ba38d757b09a591996faf5a..7670161b85b077fb3c6b11d3c7b26ec136b75531 100644 GIT binary patch delta 44 xcmZ3>vX+JSG%qg~0}!M!d1SvX+JSG%qg~0}$x0cgqOb$m`80s9#c9kXo!?lv-SnpH~cIP0nOI0ssy^4ZQ#W diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_tool_call_output_item.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_tool_call_output_item.cpython-312.pyc index 0fdfead8e169d10c3306a01ce2b1919de2ec9fc5..cc73e6190de371688246e138d2154343d23449f8 100644 GIT binary patch delta 45 ycmcc1c9)I!G%qg~0}!M!d1Or9$g9RA7*kSNkXjs5lv-SnpH~cIZFXUjWCQ>yWeuYM delta 45 ycmcc1c9)I!G%qg~0}$x0cgrZ-$g9RAs9#c9kXo!?lv-SnpH~cIZFXUjWCQ>#6b*3z diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_tool_call_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_tool_call_param.cpython-312.pyc index b525a7b7e3c452aa28833969f73df56e127e6f3e..b9994d6730475156d841e4c8c7000a3ec55e885b 100644 GIT binary patch delta 45 ycmeyu_Jxi2G%qg~0}!M!d1Rc~$m_@?7*kSNkXjs5lv-SnpH~cIZH{LWWdr~^kPbWm delta 45 ycmeyu_Jxi2G%qg~0}$x0cgtA2k=Kz)P`{+IAhlS(D7CmCKd%_b+8oa$$_M~G2M!1T diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_web_search.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_function_web_search.cpython-312.pyc index 5a01bd8d642029c8ea1b0164fad971b2a90a2da1..b0a7260cae17057fb208d7c2dffc39a9f4ae0bf5 100644 GIT binary patch delta 44 xcmX@hdX|;AA% diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_image_gen_call_in_progress_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_image_gen_call_in_progress_event.cpython-312.pyc index a379a96b33eb946ec9758fabc75161f855cf5537..85dcfbff999a5a242da793dd2b02842b2030793b 100644 GIT binary patch delta 44 xcmeyv`iGVGG%qg~0}!M!d1Tz&$orB}Fs7ukAhkHAD7CmCKd%_bn#|7h6#zdF4`l!V delta 44 xcmeyv`iGVGG%qg~0}$x0cgr}kk@qE|pngeZL29vnQEG8PeqJ$VP`{+IAhlS(D7CmCKd%_b+U(85%Lo88TMfPd diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_in_progress_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_in_progress_event.cpython-312.pyc index a33b9ef14ae640dd5bf6f6aa6839149ef5657381..a3afef1e1a2bc56effcbc30154c3ad951064c738 100644 GIT binary patch delta 44 xcmcb@dWDtuG%qg~0}!M!d1Od#-4oCn1 delta 44 xcmbQwGM|O_G%qg~0}$x0cgvWtk#`ZJpngeZL29vnQEG8PeqJ$dV!VqG%qg~0}!M!d1Q!hdV!VqG%qg~0}$x0cgtYe$a{)WP`{+IAhlS(D7CmCKd%_bn*4(C1ppsy4%Ywx diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_content.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_content.cpython-312.pyc index a3fe0f0bfa55041922a0230e42ed16efc1957fdd..b0b85300d4b2205a85f08f39a35f60f301180875 100644 GIT binary patch delta 44 xcmaFK`jVCRG%qg~0}!M!d1UBrdS diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_content_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_content_param.cpython-312.pyc index 68f84becc962e5c9630c2b864d6c5e4f12832ec2..2e5956a8277ad1531d2317720753fea8b330d9fa 100644 GIT binary patch delta 44 xcmX@WdVrPpG%qg~0}!M!d1R<>c7cueG%qg~0}!M!d1ORwc7cueG%qg~0}$x0cgwKb$g9XCs9#c9kXo!?lv-SnpH~cIZMJ6;WCQ>p+YJo> diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_item_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_item_param.cpython-312.pyc index 2fafb074dfd4b0a0b374e9172b84263ed000ea1a..15e4e028fc38ed17d3cc8b1552774b765cef7324 100644 GIT binary patch delta 46 ycmZoNZ!+gQ&CAQh00e1F9vLT8H}c7`3&xaG7Ni!(6r~myVVvNqeYyNUn+DhCar diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_message_content_list.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_message_content_list.cpython-312.pyc index e22697aeb75d9733c1760c48ed5edf65ade1f536..5fabbb381f164b197a87c8e0a4854f010de631ea 100644 GIT binary patch delta 44 xcmeys{DGPGG%qg~0}!M!d1M4{SY#0RSb$4io?Y diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_message_content_list_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_message_content_list_param.cpython-312.pyc index 0e650472ea0e1bd88f96e8dd8a19d9fd6fdf44d2..091095d91e5c0bc2193658c1121e870f732a65e1 100644 GIT binary patch delta 44 xcmdnUwvmnZG%qg~0}!M!d1S2G$Xm@M7*kSNkXjs5lv-SnpH~cIO`gd#0{|FZ4r%}Z delta 44 xcmdnUwvmnZG%qg~0}$x0cgvWyk++&jP`{+IAhlS(D7CmCKd%_bnmm(f1^^tL4n+U} diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_message_item.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_message_item.cpython-312.pyc index 3b62a9ced0b510e4e697d3d489ff9cfaa7ddab27..63d9ebdd440335686100f0ee880b8aa94c4a22d0 100644 GIT binary patch delta 45 ycmaFH{*0aXG%qg~0}!M!d1R<<VVvNor($BF;|F|Q6O delta 46 zcmX?Pe#o5fG%qg~0}$x0cgy&svXRe?T~NQIvLLlszbLi1AV04d$l9FB9xDO>Pd5(X diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_text.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_text.cpython-312.pyc index 509c9617d5dbaa4c11e08422ea853a9bf1229b7b..dfb18e6ac9eb61db901f7fe6ad9c84d4f5bb9d09 100644 GIT binary patch delta 44 xcmaFB@_>c+G%qg~0}!M!d1SP0c+G%qg~0}$x0cgrZ>$XmfEs9#c9kXo!?lv-SnpH~cIO`gVh3IHe84yFJA diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_text_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_input_text_param.cpython-312.pyc index 36b29e578da83e918208ade7870f1f4bd841d9bb..d28b613ac77e7b1be79e1708f47b08d3f87bc51d 100644 GIT binary patch delta 44 xcmdnWx|NmpG%qg~0}!M!d1Rc}$h)3VFs7ukAhkHAD7CmCKd%_bntYb=1pp#G4@3X} delta 44 xcmdnWx|NmpG%qg~0}$x0cgxthk#{|#pngeZL29vnQEG8PeqJ$?Fs7ukAhkHAD7CmCKd%_bnk>Qe8vr5J4&nd+ delta 44 xcmbQtHkpn0G%qg~0}$x0cguLTk@pv)pngeZL29vnQEG8PeqJ$ci8vr464&DF& delta 44 xcmbQrHkFO{G%qg~0}$x0cgwi7k@pXypngeZL29vnQEG8PeqJ$? delta 44 xcmbQmI*XO}G%qg~0}$x0cgxtjk#_;3pngeZL29vnQEG8PeqJ$ delta 44 xcmZ3@x|)^uG%qg~0}$x0cgwiEk#{wtpngeZL29vnQEG8PeqJ$tcG%qg~0}!M!d1PGM$h(wLFs7ukAhkHAD7CmCKd%_bntYh?J^&m)4-WtU delta 44 xcmZ3)x`>tcG%qg~0}$x0cgr}wk#{MhpngeZL29vnQEG8PeqJ$>I}4^#jE delta 44 xcmdnMx`CDVG%qg~0}$x0cgwiBk#`-VpngeZL29vnQEG8PeqJ$*iwidZNuv)x diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_output_item_added_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_output_item_added_event.cpython-312.pyc index 56b3ac04975c265deadca0fefc079a67692cd6a0..2ecec0fc92cdece8f36b06d220258ed646d12217 100644 GIT binary patch delta 45 ycmbQwHlL06G%qg~0}!M!d1TDm$oq{^Fs7ukAhkHAD7CmCKd%_b+APAv%?JP}H4VQ2 delta 45 ycmbQwHlL06G%qg~0}$x0cgtwm$oq{^P`{+IAhlS(D7CmCKd%_b+APAv%?JQ1s11|= diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_output_item_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_output_item_done_event.cpython-312.pyc index 721e1d6766ba2b9e82a5fb2d6bcfe08f98d02862..a473afd950d60704e4dc019a5c3e69779c182e1c 100644 GIT binary patch delta 45 ycmbQkHiwP(G%qg~0}!M!d1Nfw$oqv+Fs7ukAhkHAD7CmCKd%_b+APGx#Rvc=(G9!+ delta 45 ycmbQkHiwP(G%qg~0}$x0cgyJ6$oqv+P`{+IAhlS(D7CmCKd%_b+APGx#Rvc^L=BMu diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_output_message.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_output_message.cpython-312.pyc index eb91d0a6b0a37f58b2e94358832301fb40e18411..5de48874fcad627c9c102dab3f18e60d2f3d02f2 100644 GIT binary patch delta 45 ycmdnNxr3AUG%qg~0}!M!d1MrA<$qC diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_output_text_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_output_text_param.cpython-312.pyc index 299dc85b1ed606089c23e7e1c5a0281b412f25b8..d089e18511fe55bfa4150b51f7e965cc3c4f5454 100644 GIT binary patch delta 45 ycmX>gc0i2xG%qg~0}!M!d1Ugc0i2xG%qg~0}$x0cgvW#kvD`{P`{+IAhlS(D7CmCKd%_b+FZnZjvW9oF%F9W diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_queued_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_queued_event.cpython-312.pyc index 89b17faacfe6bcc56a89ca15b61d80db7d772f01..925f435add64b59506dae82124c4adff5059700e 100644 GIT binary patch delta 45 ycmX@YdW4nlG%qg~0}!M!d1UZ2ZR9)1C>T>xS&&*BQG%qg~0}!M!d1TmZG%qg~0}$x0cgs-R$jizks9#c9kXo!?lv-SnpH~cIO;%?54FLUG4IKag diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_reasoning_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_reasoning_done_event.cpython-312.pyc index 1e9fec9bdf4e5f07af8c9b62da11f81f103e96b3..a228a40567817ecfac4cbb7b721a01e07aa3580c 100644 GIT binary patch delta 44 xcmbQlHi?b*G%qg~0}!M!d1NSV#4gvrG delta 44 xcmbQlHi?b*G%qg~0}$x0cgtYg$oq>?P`{+IAhlS(D7CmCKd%_bnk>Qe3jhsA4blJr diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_reasoning_item.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_reasoning_item.cpython-312.pyc index 70f95f3caf3ce8212605a6512891158b50d943b7..9d8bb3b0fdeeabb1d3cf3395546ff05d7124994a 100644 GIT binary patch delta 45 ycmeyz@sES|G%qg~0}!M!d1M^k$a|1cFs7ukAhkHAD7CmCKd%_b+I*jJJ`(^T>xS&&*BQT>xS&&*BQ~Y~)+bC>T>xS&&*BQ~V>%N6KG6>8 diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_reasoning_summary_text_delta_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_reasoning_summary_text_delta_event.cpython-312.pyc index 20145e0c3aa1f436df5f9e2f22eb3d7ee0fe41b4..1f69ec0fff23ca2f93567a30e58300c67818d10b 100644 GIT binary patch delta 45 ycmdnZwwsOjG%qg~0}!M!d1Pd6FaiJ<4h;eT delta 45 ycmdnZwwsOjG%qg~0}$x0cgyhG$ScYus9#c9kXo!?lv-SnpH~cIZ8m1&U<3de^$gMg diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_reasoning_summary_text_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_reasoning_summary_text_done_event.cpython-312.pyc index f12a82fecc1a36994698e3827af11f3f26841677..016b6d1d6c44a46444fe5e1072cfec08534b35ac 100644 GIT binary patch delta 45 ycmdnaww;alG%qg~0}!M!d1S=NE4fg;5 delta 44 xcmbQhHi3=zG%qg~0}$x0cgtYf$orE~P`{+IAhlS(D7CmCKd%_bnk>%r695bo4aWcg diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_refusal_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_refusal_done_event.cpython-312.pyc index 6534bf5b5f98e78db07868e9180bfb4f7eba5d9f..7382fabfbb588ca3f8750a11156618fdd0136b39 100644 GIT binary patch delta 44 xcmeBY>u2LV&CAQh00e1F9vMm-d4Dnr#*|bRq!z~%r4|?D=M@84lf{{S000Rr4fy~7 delta 44 xcmeBY>u2LV&CAQh00g@0-7?rW^8REL)Gw(lNG;YcN-ZwP&npJ9CW|xu000a_4aooi diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_retrieve_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_retrieve_params.cpython-312.pyc index 3f58bbbd4146de79cc1992af2f00c3c46af6f0cb..bd979bd1a8034cd1abcad43bffe1cf69701007fc 100644 GIT binary patch delta 45 ycmdnYwV8|eG%qg~0}!M!d1ORw91hX-E%j diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_text_config.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_text_config.cpython-312.pyc index 32bbf9c2890fe928e03b9e50d5cc4abcdbf1fb2c..f3d1a47f4e3c3d266262c86cd09c380cc661dc63 100644 GIT binary patch delta 45 ycmbQnI*pa@G%qg~0}!M!d1NrMY~-8FC>T>xS&&*BQto|R&CAQh00e1F9vLzld4Dkq#*|bRq!z~%r4|?D=M@84lO>qG0RRY14eto|R&CAQh00g@0-7*+A^8R8J)Gw(lNG;YcN-ZwP&npJ9CQC4V0{{zT4Z#2a diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_text_done_event.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_text_done_event.cpython-312.pyc index 0cd6b847db0026c95077d3fa3d3f60d1d85476c7..505ff73007ab8f215836c6cd4e1e3ecea85e3964 100644 GIT binary patch delta 44 xcmeBT>tf?Q&CAQh00e1F9vMm-dA~CX#*|bRq!z~%r4|?D=M@84lSP@n0ssd^4d?&> delta 44 xcmeBT>tf?Q&CAQh00g@0-7?rW@_uI&)Gw(lNG;YcN-ZwP&npJ9CW|tC1po?M4Y&XR diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/response_usage.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/response_usage.cpython-312.pyc index 608df305acfafdfcf7b49ebfef1c6e2c5192e2cb..1aa456647314f9ac7f9576641538ec18a7bc92e0 100644 GIT binary patch delta 45 ycmdnPv4?~AG%qg~0}!M!d1PGK$UBiyFs7ukAhkHAD7CmCKd%_b+Pt2zmk9te!Vd2M delta 45 ycmdnPv4?~AG%qg~0}$x0cgxtgk#{1apngeZL29vnQEG8PeqJ$c+G%qg~0}!M!d1Ul&c+G%qg~0}$x0cgtwl$Xm`Rs9#c9kXo!?lv-SnpH~cIO`ghl8UQG-4z2(I diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/tool_choice_function_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/tool_choice_function_param.cpython-312.pyc index 9cf2bb80c39faffc7eb19183507dbabfa4257728..ef2e8dbab1fd316fa3beb33622396752ebb130a0 100644 GIT binary patch delta 44 xcmdnWx|NmpG%qg~0}!M!d1PGN$h(eFFs7ukAhkHAD7CmCKd%_bntX=wB>*EA4@>|6 delta 44 xcmdnWx|NmpG%qg~0}$x0cgr}mk#`-VpngeZL29vnQEG8PeqJ$=g(4O0LB diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/tool_choice_types.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/tool_choice_types.cpython-312.pyc index de4cf5f68ead5dfb834b254390cd4240d8018cfd..5ced58b91e55b56fbf852b3ced5cacf26d9f5e72 100644 GIT binary patch delta 45 ycmdnZx|@~nG%qg~0}!M!d1NRsZ{)koC>T>xS&&*BQtW+P&CAQh00e1F9vK}QdAXScV@fIuQj24XQi}`n^NNA2$(l@$0sO@cX#fBK delta 44 xcmeBS>tW+P&CAQh00g@0-7-=)@^Ui?>X%d&q!#NJr4|?D=M@84lQo$h0|5U74KV-! diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/tool_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/tool_param.cpython-312.pyc index a58f2f50e0491456200d1400297966bc4b00ce80..34281deff8cf704dbb4728441ac9ffa53fd57f73 100644 GIT binary patch delta 45 ycmX@0d_bA^G%qg~0}!M!d1SoY$Q#Ql7*kSNkXjs5lv-SnpH~cIZLVf@P`{+IAhlS(D7CmCKd%_b+8oHVh6w;b@(!K= diff --git a/venv/Lib/site-packages/openai/types/responses/__pycache__/web_search_tool_param.cpython-312.pyc b/venv/Lib/site-packages/openai/types/responses/__pycache__/web_search_tool_param.cpython-312.pyc index 4bd92e3e1a1e007430a8077e79f1f7787c997569..f88052f62d9b3d199a2a47f7f80a66ad72bebe73 100644 GIT binary patch delta 45 ycmX@gd6bj)G%qg~0}!M!d1UVP`{+IAhlS(D7CmCKd%_b+U(6##RLE^lnx63 diff --git a/venv/Lib/site-packages/openai/types/shared/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared/__pycache__/__init__.cpython-312.pyc index 7295cad9f3c20deec34c6e2c5161bdab7ab001aa..037d8baec5f5500477414ea0d83fca2a833588e8 100644 GIT binary patch delta 41 vcmcc4ex057G%qg~0}!M!d1Sob$eYZ}7gJJMkXjs5oRL_Rni4a)jyVzl{aOtl delta 41 vcmcc4ex057G%qg~0}$x0cgwiHkvEx{PrszHAhlS(I3uwrHAR1N9djfA0g(*) diff --git a/venv/Lib/site-packages/openai/types/shared/__pycache__/all_models.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared/__pycache__/all_models.cpython-312.pyc index 3a6dc88925d878d854e38fdaef23e8fcf817131a..b6f9e022be3554a621887c72ddc6b1cb352c9ed4 100644 GIT binary patch delta 41 vcmZ3-vW|uKG%qg~0}!M!d1N$f}3r3 delta 41 vcmZ3-vW|uKG%qg~0}$x0cgrZ*$h(n|PrszHAhlS(I3uwrHAR2&8O9_4@a+uP diff --git a/venv/Lib/site-packages/openai/types/shared/__pycache__/chat_model.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared/__pycache__/chat_model.cpython-312.pyc index 94c412b8a24d3b335c2454f86119d646e028922c..8ec6c9f1594facbcd6ca0adafa09c895f7290e85 100644 GIT binary patch delta 41 vcmZqWZsq1Z&CAQh00e1F9vNvHdBs@yVoE9tQj24XGZKqZQ(`6?vW5Tv(FqG* delta 41 vcmZqWZsq1Z&CAQh00g@0-7?fS@`|zY>6cU%q!#NJXCxM-rsz*LWDNlT(8&u6 diff --git a/venv/Lib/site-packages/openai/types/shared/__pycache__/comparison_filter.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared/__pycache__/comparison_filter.cpython-312.pyc index 8577c98e07f8c1c5eaaa1d0bf79b9e1fa2e86540..851338c36a8742c0eec14afffc4d4eec85d804dc 100644 GIT binary patch delta 42 wcmcc3dYhH+G%qg~0}!M!d1S~iZ{$18$QM&mS&&*BQ=E}ll$sJV`8nek0QlVvy#N3J delta 42 wcmcc3dYhH+G%qg~0}$x0cgy(4w2|*LBcFarWkG7OesM-(QEH0*ZD!>?&CAQh00e1F9vMy>c^5MB#gtSQq!z~%XCxM-ro>F%!+0D3*jNm# delta 41 vcmZo>ZD!>?&CAQh00g@0-7*X}@-AfL(=VwkNG;Yc&PXguP0^pchw(T7+-MAj diff --git a/venv/Lib/site-packages/openai/types/shared/__pycache__/function_definition.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared/__pycache__/function_definition.cpython-312.pyc index 020c1279078d36b102d19cced25f01295772ac52..4ddcd306c483305c09b0cfbcc7b3a5f3864b5037 100644 GIT binary patch delta 42 wcmZ3+wv3JUG%qg~0}!M!d1PGL$oq?tFQ%ljAhkHAI3uwrH6>=VD3c%~00Qd_q5uE@ delta 42 wcmZ3+wv3JUG%qg~0}$x0cgtA5k@puPpMFVYL29vnaYkZMYKs15Q6@n~00c`6VgLXD diff --git a/venv/Lib/site-packages/openai/types/shared/__pycache__/function_parameters.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared/__pycache__/function_parameters.cpython-312.pyc index 65fb310e36ce9af9956d0d791a26958e6472044e..0c92f64e0f99bb0a23146a5d59cdbbcc854a65e2 100644 GIT binary patch delta 41 vcmbQuJe!&KG%qg~0}!M!d1QRq$g9H07gJJMkXjs5oRL_Rni4bFo-qaha)E{SG%qg~0}!M!d1T~la)E{SG%qg~0}$x0cgslF$eYQ?r(aT8kXo!?oRL_Rnxa3sh4Bmk^H&Vw diff --git a/venv/Lib/site-packages/openai/types/shared/__pycache__/response_format_json_schema.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared/__pycache__/response_format_json_schema.cpython-312.pyc index cd689f8679b6938b2ef64158da2ae1c575815a7b..c9539c9c06c614f8fd2f32c1df4e341a94d5c212 100644 GIT binary patch delta 42 wcmZ3%xq_4TG%qg~0}!M!d1M4^X%d&q!#NJXCxM-rord8Y4h8@; C_YNZf diff --git a/venv/Lib/site-packages/openai/types/shared_params/__pycache__/chat_model.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared_params/__pycache__/chat_model.cpython-312.pyc index 2a1e4adc5614df51680f6e6f15f02148f229b410..19632f453415fef0b5bb80b1d33141b12f3555f3 100644 GIT binary patch delta 48 zcmdnXy_cK!G%qg~0}!M!d1Ul#^dA5_ Ce-9e~ delta 48 zcmZ3(wuX)OG%qg~0}$x0cgt|t$ji+ns$WuBkXo!?oRL_Rni5}-Sd^GstUp diff --git a/venv/Lib/site-packages/openai/types/shared_params/__pycache__/metadata.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared_params/__pycache__/metadata.cpython-312.pyc index 4722340cf4a923969e91298bf1d31016428342d3..c52ff181b667c3138e9a7543b94047bdc20b04e3 100644 GIT binary patch delta 49 zcmdnSyp5UfG%qg~0}!M!d1Np%Zsc=f6pbmVEJ!VmDb7eNN==C`NGwXsEsmL-$`}X$ DJmwCN delta 49 zcmdnSyp5UfG%qg~0}$x0cgy(6u#wM+QB=RAvLLlszc?eYC^aR%Ah9Shw^)C2Dq|o3 DVo48h diff --git a/venv/Lib/site-packages/openai/types/shared_params/__pycache__/reasoning.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared_params/__pycache__/reasoning.cpython-312.pyc index 1670fbf76588cbdfb4d6348829c80c815e89349d..bbf7e97ccc8bee8db17bf304d5ae55874454dc5b 100644 GIT binary patch delta 50 zcmX@cc8rbhG%qg~0}!M!d1Q#PZsg-<5{)UTEJ!VmDb7eNN==C`NGwXsEsoi2#3aH9 E08cv(OaK4? delta 50 zcmX@cc8rbhG%qg~0}$x0cgy(5vXPIUNmRe2vLLlszc?eYC^aR%Ah9Shw^)C(5t9fb E0CFS`5&!@I diff --git a/venv/Lib/site-packages/openai/types/shared_params/__pycache__/reasoning_effort.cpython-312.pyc b/venv/Lib/site-packages/openai/types/shared_params/__pycache__/reasoning_effort.cpython-312.pyc index 237da206fe3b82844dc6e9c097f953504b763313..c869582b862b0693044e57fe7c5958de2c2e4693 100644 GIT binary patch delta 48 zcmey!{E?aWG%qg~0}!M!d1P2^W6k CR1g;c delta 48 zcmbQnI*pb0G%qg~0}$x0cgyJ8$UBiyRKKLMAhlS(I3uwrH6^|vu_!UOSby?n#>W6p CFc0X%d&q!#NJXCxM-rorY=sD4RhL29vnaYkZMYD#=TVo_plvHoNMrfdLz C8xS1; diff --git a/venv/Lib/site-packages/openai/types/uploads/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/types/uploads/__pycache__/__init__.cpython-312.pyc index e5096c4575ab5e66fbb9b16fcdf8c8f96473dabe..81d5eca8b0819fb2c89b15647bfc2a40ae85e451 100644 GIT binary patch delta 42 wcmcb^bcc!eG%qg~0}!M!d1U<9$jiaVA5&6UkXjs5T9A{Um{J@wS%uL800ZO<&;S4c delta 42 wcmcb^bcc!eG%qg~0}$x0cgy&+k(Yy!U%#ZXAhlS(v>+!xF{N04vI?UG00|BZwEzGB diff --git a/venv/Lib/site-packages/openai/types/uploads/__pycache__/part_create_params.cpython-312.pyc b/venv/Lib/site-packages/openai/types/uploads/__pycache__/part_create_params.cpython-312.pyc index 98b5a1153715322fc58b9760ab0cf404b40bfc16..f97a976cb18664548860beec8e2ecd0583908be5 100644 GIT binary patch delta 42 wcmeBV?PTRW&CAQh00e1F9vKxId3zc8V@fIuQj23s3v%)kQ;K6IuVj1x0P9o@VgLXD delta 42 wcmeBV?PTRW&CAQh00g@0-7>N^^7bz7m(q!#O!7Ubk7rWET>Udi|X0PnU9KL7v# diff --git a/venv/Lib/site-packages/openai/types/uploads/__pycache__/upload_part.cpython-312.pyc b/venv/Lib/site-packages/openai/types/uploads/__pycache__/upload_part.cpython-312.pyc index cb9e26d2072b4c1ea198fd2746e28e73f68ab250..e52499a94047baa528d3c9d6e9853e4a467e4419 100644 GIT binary patch delta 42 wcmbQrI+d08G%qg~0}!M!d1NGS+!xF{N04@*&2{0P{8tU;qFB diff --git a/venv/Lib/site-packages/openai/types/vector_stores/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/openai/types/vector_stores/__pycache__/__init__.cpython-312.pyc index fe61fa4c7d999633dd897af7cdfc83654027d133..9e0f668049d1e3677548a8c9be8c03c6d31f5da6 100644 GIT binary patch delta 48 zcmX@cc8rbpG%qg~0}!M!d1Tmc&CAQh00e1F9vQbb^13mJ#*|bRq!!1Nr6!l;7sVF?2_SEC29pdU093sX AH2?qr delta 49 zcmZo+Z(-*>&CAQh00g@0-7;2h;y096?&CAQh00e1F9vL4t@)|OU#*|bRq!!1Nr6!l;7sVF?2_SECFq1wb08}my AFaQ7m delta 49 zcmZo-Z(`>?&CAQh00g@0-7?N@Ak$X>K~)ck delta 48 zcmZo;Yh&X*&CAQh00g@0-7LZsZeX5{)UTEJ!VmDN9W*$uEj81`$a{%VG^V7oAhkHAEH$|#zbL*KNC0`8zcAJ?0RWN7 B5t0A^ delta 49 zcmeys@qvT)G%qg~0}$x0cgxtYk@pg#sD4RhL29vnS!!}geo=fekO1;Fe_^a)0sxUj B5k~+3 diff --git a/venv/Lib/site-packages/openai/types/vector_stores/__pycache__/vector_store_file_deleted.cpython-312.pyc b/venv/Lib/site-packages/openai/types/vector_stores/__pycache__/vector_store_file_deleted.cpython-312.pyc index c6fdfac4a8480b177beff7e913745785419720f7..98df5bbd29e79c394a840ae426b4d9b01af18690 100644 GIT binary patch delta 48 zcmbQrI+d08G%qg~0}!M!d1M4^G%qg~0}!M!d1UG%qg~0}x28cguLUk#{{KqyFT*jBx;HUI*&{ diff --git a/venv/Lib/site-packages/packaging/__pycache__/_structures.cpython-312.pyc b/venv/Lib/site-packages/packaging/__pycache__/_structures.cpython-312.pyc index 674dbe7407c6f795b1ec082dffafd25b6dd6f674..9588c2aa43832dd441cb498c1da9b5966cbfa403 100644 GIT binary patch delta 29 jcmbOxIZcxHG%qg~0}!M!d1PGK$UB>nF=q2h#*M!wU$yj%=GkjCVZk>$LRFPDWeW^)Zosy6_kNC`Cn delta 32 mcmaDjpYh>*M!wU$yj%=GAhF&pL&b3;UoH!y{^lB%RBr&H7zrH! diff --git a/venv/Lib/site-packages/pandas/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/__pycache__/__init__.cpython-312.pyc index a8dabe00a9ba937d3f56408155770b8528bfe896..27f1294a607d1086d0bf65931aaeee8718d327b0 100644 GIT binary patch delta 30 kcmaFu@Y;dzG%qg~0}!M!d1SPxY~)+c#u&4C8{1Y%0F7M<8UO$Q delta 30 kcmaFu@Y;dzG%qg~0}$vjx@T}IZ{%Cf#;Ct}8{1Y%0D>(DHvj+t diff --git a/venv/Lib/site-packages/pandas/__pycache__/_typing.cpython-312.pyc b/venv/Lib/site-packages/pandas/__pycache__/_typing.cpython-312.pyc index 1430b63156806ec8f0b1c3f175aab2192d5f3bfe..e54db5738964726075185976cc89860ab56cfbc4 100644 GIT binary patch delta 30 kcmca!biIi0G%qg~0}!M!d1O4Y*vPk2fH7wC34wkM0GgHw=>Px# delta 30 kcmca!biIi0G%qg~0}$vjx@TN9+sL<5fKh+*34wkM0F>|va{vGU diff --git a/venv/Lib/site-packages/pandas/__pycache__/_version_meson.cpython-312.pyc b/venv/Lib/site-packages/pandas/__pycache__/_version_meson.cpython-312.pyc index afcac67dcb67154ed658f965ff7386616f962776..b59aa7696fb3f5536d72f05412141283b3c9a6d6 100644 GIT binary patch delta 26 gcmeBY>Sy9T&CAQh00e1F9vOiXd5Sy9T&CAQh00erB?iv0Qd5?fd-oZ delta 28 icmdnWyp@^vG%qg~0}$vjx@TB!-Xa*qw diff --git a/venv/Lib/site-packages/pandas/_config/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/_config/__pycache__/__init__.cpython-312.pyc index ee08b98bf8ed848d6c99e57e17e6daa473605f90..84703e2b45f831087a9afb075811b75d6337e2e6 100644 GIT binary patch delta 37 rcmaFG`-+$MG%qg~0}!M!d1Rd1$m`6^855tJpO==I9~wc_K3ayweIp diff --git a/venv/Lib/site-packages/pandas/_config/__pycache__/config.cpython-312.pyc b/venv/Lib/site-packages/pandas/_config/__pycache__/config.cpython-312.pyc index 3be9ab9223da64879489ab6d94338a4d42d93eb4..0a08428d969bdad53ec68565e3d9dd2473aabe1e 100644 GIT binary patch delta 40 ucmX@`m+`<~M!wU$yj%=GkjCVZp_IOn?FURq{)%;q;dR|)|WhYmpi delta 40 ucmX@`m+`<~M!wU$yj%=GV8G~}k(a!Y?6M*=cQ$)$828763GkzseKA6 delta 37 rcmZn?XcFK(&CAQh00ah%?ioBAc_*`Q>c=PN=cQ$)>u+Ak63Gkzo8$>v diff --git a/venv/Lib/site-packages/pandas/_config/__pycache__/localization.cpython-312.pyc b/venv/Lib/site-packages/pandas/_config/__pycache__/localization.cpython-312.pyc index 82cf4b26afaed235c59679a4228dde538089d01d..34e7d82ad7e4835594b2ab58900ddf7b4644ebeb 100644 GIT binary patch delta 37 rcmdn1zgM64G%qg~0}!M!d1QRr$orR-GbTPcKQApaJ!Z2o+bTf-)h7$Q delta 37 rcmdn1zgM64G%qg~0}vQ6x@Wj;V!Z diff --git a/venv/Lib/site-packages/pandas/_libs/tslibs/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/_libs/tslibs/__pycache__/__init__.cpython-312.pyc index 1ce01fa4190d76328ca268211ad8aab67cbf4948..f12df524a1edb7b0270a33bf2a52f4d3b9542f7c 100644 GIT binary patch delta 41 scmeC-@8Rb?&CAQh00e1F9vMqE^4?_Qi;2(4Oe&5kDF#!Mzp%{!0P6G&Z2$lO delta 41 scmeC-@8Rb?&CAQh00ah%?is!td2h1u>Br|}CKc{MR{#J2 diff --git a/venv/Lib/site-packages/pandas/_libs/window/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/_libs/window/__pycache__/__init__.cpython-312.pyc index 2d11dfb4c847e9532e8d0f886de20a589ee08123..050bd76108d3024e1a6bf6a320118cca9fa4b18e 100644 GIT binary patch delta 37 rcmdnNxPy`VG%qg~0}!M!c}(Ok;){vT$xJGaDbLJH$uEzY*sTiyx0nkz delta 37 rcmdnNxPy`VG%qg~0}vQ6x=-XT;?s}M$xJHNFVD6l_ delta 41 vcmdlvhjHf|M!wU$yj%=GV8G~}QR=dh&s>U2KfWZjxFj<#U4OH`)GK2E@v{t3 diff --git a/venv/Lib/site-packages/pandas/_testing/__pycache__/_io.cpython-312.pyc b/venv/Lib/site-packages/pandas/_testing/__pycache__/_io.cpython-312.pyc index 25a20da0fc19a49d49b3094bb386676452374f16..24c9552477875edbf68179413d37b4d7b0db5f45 100644 GIT binary patch delta 39 tcmaE(^+t>DG%qg~0}!M!d1P=2ZR9)6!W9!=l3HAnnU@~3`7ukU007~{3_bt= delta 39 tcmaE(^+t>DG%qg~0}vQ6x@RN^Zsa@7!lfTyl3HAnnU}7=`7ukU007^$3;_TD diff --git a/venv/Lib/site-packages/pandas/_testing/__pycache__/_warnings.cpython-312.pyc b/venv/Lib/site-packages/pandas/_testing/__pycache__/_warnings.cpython-312.pyc index 6331d19148122842d0b429af53542af6df1a47fb..59bf535a8bdab0ec4ab1e33f61fbc90223acdd91 100644 GIT binary patch delta 39 tcmaFm^va3vG%qg~0}!M!d1Uk|Zsfbk%M}w}l3HAnnU@~3`6F+oFaY*s4IKag delta 39 tcmaFm^va3vG%qg~0}vQ6x@Rm^*vNO2mrFmsB(=CCGcR3#^GDuFVF2#|459!4 diff --git a/venv/Lib/site-packages/pandas/_testing/__pycache__/asserters.cpython-312.pyc b/venv/Lib/site-packages/pandas/_testing/__pycache__/asserters.cpython-312.pyc index 0565e3d5f91c0377543edaf2ffb1333aa38acf4d..bc73ecd22a2f5751fc544431b45b697f43427174 100644 GIT binary patch delta 41 wcmcaPf%)bHX1>$Byj%=GkjCVZ;eKc%UmY)3OngadaY<%gdd%i&yoYxI01c}SGXMYp delta 41 wcmcaPf%)bHX1>$Byj%=GV8G~}F=fw2zB*nm{rHm9;*!j~bp6fKcn|La019ml=l}o! diff --git a/venv/Lib/site-packages/pandas/_testing/__pycache__/compat.cpython-312.pyc b/venv/Lib/site-packages/pandas/_testing/__pycache__/compat.cpython-312.pyc index b6ce6cdf5d0eb24485be1814e49c5a920e40c386..2db98e4007a5c298a49be14c7912e1ffa913a5ef 100644 GIT binary patch delta 38 scmcb|agT%dG%qg~0}!M!d1S2L$or6yD<-}qwYVfRFFj`S55_bm0Nn-*V*mgE delta 38 scmcb|agT%dG%qg~0}vQ6x@Sz<$or6yOFzCOwYVfRFI|8055_bm0MUO7v;Y7A diff --git a/venv/Lib/site-packages/pandas/_testing/__pycache__/contexts.cpython-312.pyc b/venv/Lib/site-packages/pandas/_testing/__pycache__/contexts.cpython-312.pyc index 3cbaba23cdf87d4a1c5df46616fbb61f168c002e..8b78e02a63b1376470d0e5374ab396662ef3ace0 100644 GIT binary patch delta 39 tcmZ4Ku+o9=G%qg~0}!M!d1Ty?+Q^s7!W9!=l3HAnnU@~3xs_#!GyvZn3@88q delta 39 tcmZ4Ku+o9=G%qg~0}vQ6x@X*y+{l;9!lfTyl3HAnnU}7=xs_#!Gyv6p3zGl< diff --git a/venv/Lib/site-packages/pandas/api/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/api/__pycache__/__init__.cpython-312.pyc index 1128371044ecb15ad4509132685589385b94acb7..ead760631c39d9d44a29acd32f7bea5f18408171 100644 GIT binary patch delta 32 mcmeBV?qudY&CAQh00e1F9vQDU@|rQS#v~SG#!U8LbOZoE delta 32 mcmeBV?qudY&CAQh00erB?isf?@|rQS>L(Ut>QDAybOZo%i3fcE diff --git a/venv/Lib/site-packages/pandas/api/extensions/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/api/extensions/__pycache__/__init__.cpython-312.pyc index 5afc5b445dfa1993c0a3864f021155af9d026013..451a185a24d8e0a7587b37404290bc76467a334c 100644 GIT binary patch delta 43 xcmZo+YhmL(&CAQh00e1F9vSC0@=jn9h)FESj7hC1NzE(H%+D*1nY@-M902|t4UPZ+ delta 43 xcmZo+YhmL(&CAQh00erB?ip)0@=jn9&`&JL)K9G_NzE(H%+D*t4O%3n> delta 44 ycmX@Ye1w_zG%qg~0}$vjx@SDw$eYM0sGnGnsh^owl3J9Uk(igBsz14&(G>s<;|(VO diff --git a/venv/Lib/site-packages/pandas/api/types/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/api/types/__pycache__/__init__.cpython-312.pyc index bcd1b7fc2add715151465837577dccfdb5b7ec04..ebfca3964900fbccacca86bbfe5592c772422153 100644 GIT binary patch delta 38 scmcb>a)E{SG%qg~0}!M!d1PGM$oqa)E{SG%qg~0}$vjx@YX)$oq_c delta 37 rcmX@Xb%KlUG%qg~0}$vjx@Vkb*~oW|nL|IZs3@_rSby^y<`_l*yuu3J diff --git a/venv/Lib/site-packages/pandas/compat/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/compat/__pycache__/__init__.cpython-312.pyc index 88be73ebca25cf721ec6f41b73e5298026f7c749..8f1fb9b9f33443c9d4bade51f8124fec7c7c7c5d 100644 GIT binary patch delta 37 rcmeyb`(KyuG%qg~0}!M!d1UwsZRAs7;fP7j&n-wSiP>z$a#RQa$YKh> delta 37 rcmeyb`(KyuG%qg~0}$vjx@Xi0Zsb#8;m}Xc&n-wS(cf&va#RQa!(R$q diff --git a/venv/Lib/site-packages/pandas/compat/__pycache__/_constants.cpython-312.pyc b/venv/Lib/site-packages/pandas/compat/__pycache__/_constants.cpython-312.pyc index 7ea948448b3b45a6c461fafd0cf3835a083a2fbe..27fde434f8d17a79b76123687b776b745251eeb7 100644 GIT binary patch delta 35 pcmcb}evzH`G%qg~0}!M!d1RPv3Sa;L delta 35 pcmcb}evzH`G%qg~0}$vjx@SminG%qg~0}!M!d1Q2oY~=G`-_J|Jvz1Rxh delta 37 rcmX@0bwG>nG%qg~0}$vjx@SBT-pJ>{#-X2_pIeYvqQ5zg?GYaUyWt9= diff --git a/venv/Lib/site-packages/pandas/compat/__pycache__/compressors.cpython-312.pyc b/venv/Lib/site-packages/pandas/compat/__pycache__/compressors.cpython-312.pyc index 9c1fea6f345c5dd08de3547858885da6c4ecf0cd..7fce25358a9b22834968b92ca479e2e8dc71a4ca 100644 GIT binary patch delta 37 rcmZn=Y7pW(&CAQh00e1F9vLhg8~F}1bHpU)=N2TE#B9FFtj-Dmq2~$8 delta 37 rcmZn=Y7pW(&CAQh00erB?it(JH}V~3=Fm^h&n-wS(cgTNS)COCrwj?` diff --git a/venv/Lib/site-packages/pandas/compat/__pycache__/pickle_compat.cpython-312.pyc b/venv/Lib/site-packages/pandas/compat/__pycache__/pickle_compat.cpython-312.pyc index 2e7c71c6450e7e67ca844abb5a150e37b731f0f4..325e4c6767892f1753de3be7795eefa8593f2add 100644 GIT binary patch delta 37 rcmZp0Y;fc|&CAQh00e1F9vO!68~Kj1al|C&=N2TE#B9FJwp0=TwP*_n delta 37 rcmZp0Y;fc|&CAQh00erB?it#08~Kj1ap))K=N2TE=x@Hwwp0=TtQiVz diff --git a/venv/Lib/site-packages/pandas/compat/__pycache__/pyarrow.cpython-312.pyc b/venv/Lib/site-packages/pandas/compat/__pycache__/pyarrow.cpython-312.pyc index 31ee405c4ddb3b2dca555c17e887141d37173042..886100bc524c9939ba99aa77eacbfe068fc9b13c 100644 GIT binary patch delta 36 qcmZqTY2x8M&CAQh00e1F9vO}sc~e+8Vv_T73ld9WHdnHAG6Dday$O~8 delta 36 qcmZqTY2x8M&CAQh00erB?in&0c~e+8^po>*3ldB8H&?QBG6DdPbO_x5 diff --git a/venv/Lib/site-packages/pandas/compat/numpy/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/compat/numpy/__pycache__/__init__.cpython-312.pyc index 55b55dc4ba1c8d5d0974cf8859991b1de7413005..008272522cf367b3905156861c27e6e27a650fac 100644 GIT binary patch delta 42 wcmX@lcb<>;G%qg~0}!M!d1Q2NnRO2%00X8Cd;kCd delta 42 wcmX@lcb<>;G%qg~0}$vjx@UxKsMOy)nRO2%0P$K3h5!Hn diff --git a/venv/Lib/site-packages/pandas/compat/numpy/__pycache__/function.cpython-312.pyc b/venv/Lib/site-packages/pandas/compat/numpy/__pycache__/function.cpython-312.pyc index aa588651cf04a4f1dd333dfb0f2c6dec495b2e7e..d36bf4b97036063b2d8927f897859d4b39596934 100644 GIT binary patch delta 43 xcmbQ0J}aH?G%qg~0}!M!d1UmOZsg6B|pIeYvqMuiqTTrRLS(_(c9RLbj46XnG diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/__init__.cpython-312.pyc index 26cf276ec06d68b04ba09a07fa18d6d79e15a387..04f8f658e884ef5a064c1d5477a846b3167614b4 100644 GIT binary patch delta 29 jcmdnMxPg)TG%qg~0}!M!c}(OkVv9-6FG`J>*sKcxXVM45 delta 29 jcmdnMxPg)TG%qg~0}$vjx=-XTV$)B~FG|&)*sKcxVeAJl diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/accessor.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/accessor.cpython-312.pyc index 9f9df5cb359563630a0dd29c1cc93ccd5ed2c1f6..86fcc555ed59296724f1fe0e8a699b3d52a6224a 100644 GIT binary patch delta 35 pcmZ3KwkVD7G%qg~0}!M$d1Oq`*vNOBnJp$czbG|k^KE8#eE_*43f2Gs delta 35 pcmZ3KwkVD7G%qg~0}$vjx@Xv^Z{$19%%-25UzDo9`8Kn=J^-s73G4s> diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/algorithms.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/algorithms.cpython-312.pyc index 12a3cea37cb4dc8944833f532665b50cf4e0dc8e..2cafff65e81ed7a08ad00ca67d19bd321a487e14 100644 GIT binary patch delta 37 rcmeC(#N4}yneQ|&FBbz4q%(PB#NXSk8#;OM!wU$yj%=Gkj~_hp_#jp?~E*4OmcovYRu*bvTlI@-DC_6 delta 37 rcmZ2>k8#;OM!wU$yj%=GpvUN*QIolm?~E*)esX?Ms{ZB&vTlI@+Ug6( diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/construction.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/construction.cpython-312.pyc index 6a4f2b36ec2a731618d83a79a7272e72ef88746a..4f0569f68a37f31aa3ddf134fffc24602594a4ad 100644 GIT binary patch delta 37 rcmbPom2t{dM!wU$yj%=Gkj~_h;hMFPZ-XvdOmcovYRu*%x)*E!*ToD? delta 37 rcmbPom2t{dM!wU$yj%=GpvUN*A&|b2Z-XwIesX?Ms{ZC9x)*E!%ghUa diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/flags.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/flags.cpython-312.pyc index c000bcde08ec098307b67ae12bf956b4e6d1949a..c0ace5566fa162504039dabe8b9f55ac61f74727 100644 GIT binary patch delta 35 pcmdm>zCoSuG%qg~0}!M$d1PqtZ{*8nXNyVBFG`KsT+eRE0|1>I2?_uJ delta 35 pcmdm>zCoSuG%qg~0}$vjx@T$>8 diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/frame.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/frame.cpython-312.pyc index 18879c43a9d33f88285962182b4e99d2710537d4..03e21424563645cc18a63152a6c3cde6b9877fdd 100644 GIT binary patch delta 62 zcmZ4VReI4^Y5vo^yj%=Gkj~_hv6Pj4BmbXLwwUDnqSTmX!LoM2GDaX~0%B$$W&vW> K?Sf@&6I%dtXA^w@ delta 62 zcmZ4VReI4^Y5vo^yj%=GpvUN*!Fq*lBmbXLHvQ!MqE!86!LoM2GDaX~0%B$$W&vW> K?Sf@&6I%de6%!T! diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/generic.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/generic.cpython-312.pyc index 99fbadefc6da34844c00cbf8cd49fafd6e1cabc3..0af231adab0e6a0d80450076d36e5d2e7dc8cc61 100644 GIT binary patch delta 61 zcmaFgBKy8YmhUt#FBbz4q%(PB^p|hst8rqBNzN}yjcK0X)IPz95r~<9m>Gy!fS7gr J1Shup{{eO^6|VpQ delta 61 zcmaFgBKy8YmhUt#FBbz4=rOuyd~w*wSL4K{pPXNms^2`pseOVIBM>tIF*6Xe05R+K K2~KSH{{sML>lH`< diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/indexing.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/indexing.cpython-312.pyc index 445a4a8fbb919e9d9fa2d5030c19bb1cf9b8653b..b6d607047b0de7ad168762e1cfa1acfd98d861c0 100644 GIT binary patch delta 41 vcmaE}hV9K7Honumyj%=Gkj~_hv9)a@Um6cvOmcovYD{w#&-N-F#!sC995M~) delta 41 vcmaE}hV9K7Honumyj%=GpvUN*aiw}AUm6daesX?Ms(y17&-N-F#!sC96O|2T diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/missing.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/missing.cpython-312.pyc index 1463cea202bfd49a64d10ddd76802feda07e9116..a02ef3ea37c974fdb678b0a82ecae4432fef9431 100644 GIT binary patch delta 37 rcmdl!hiUs9Cce|Wyj%=Gkj~_h;nTN~FMypbCON+-HD+@P`{gzO%yJ8l delta 37 rcmdl!hiUs9Cce|Wyj%=GpvUN*ajbJAUjRFsesX?Ms{ZB__RDPm%%ux& diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/nanops.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/nanops.cpython-312.pyc index 15645769acca6397e384ab8d6711abf723214f65..c316a9c6642595e3175d5afae12a2caf348b13dc 100644 GIT binary patch delta 37 rcmX?bocX|UX1>$Byj%=Gkj~_h@#pMDK4ng}nB@GT)R@iYoSnA-=nxE? delta 37 rcmX?bocX|UX1>$Byj%=GpvUN*p>cd8pE4(#esX?Ms{Uqk&dyr^(6$RL diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/resample.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/resample.cpython-312.pyc index 72ecaa491bbbd168df09301531937c10f56a6514..6dfcd8493fbadf10e501f5e6b4600499817b642e 100644 GIT binary patch delta 41 vcmeB}#nv&4jqfxsFBbz4q%(PB>}}Y{cV2`oCON+-HKzHo$o9t~jH(p?1PTpv delta 41 vcmeB}#nv&4jqfxsFBbz4=rOuygqCjPJ1@efpPXNms^9!rWcy=5KV&CAQh00ikw9vL$>@~&cJi%HHeN{!jPm+>?k0F>Ja@&Et; delta 34 ocmeAW>=5KV&CAQh00erB?io=Vc~>#A=_ltGrRs0q%Xpd%0Ep}f9{>OV diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/sample.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/sample.cpython-312.pyc index 5ccf22edde2dd3fe3f9ed550b18145bc6be087ef..7ab17e7153181d6fc176ef510e2baa0ec700a02a 100644 GIT binary patch delta 34 ocmdn4v0a1rG%qg~0}!M$d1S2F$a|HYEhag?C^csD3wD1V0IGosegFUf delta 34 ocmdn4v0a1rG%qg~0}$vjx@QP&%iDIBm+v$$FBbz4q%(PB9FN|}Cnm%elbm0a8q=&L)UGAO2*ga=wS<^sVgO_z B4P5{L delta 49 zcmZp>%iDIBm+v$$FBbz4=rOuyTy@;YCnm(EpPXNms^6?7)UGAO2*ga=wS<^sVgOUi B47>mU diff --git a/venv/Lib/site-packages/pandas/core/__pycache__/shared_docs.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/__pycache__/shared_docs.cpython-312.pyc index 3af54ea8d33cb6e5cc44461a3c2d0192d16b8ed8..afeabfbc2b3b2419e990e1e88438f7e760df68db 100644 GIT binary patch delta 37 rcmZ4bmT~D@M!wU$yj%=Gkj~_h;a|Ctuc?$RCON+-HD>d)Qhr7NKqG= delta 37 rcmaEViShjR delta 42 wcmZ4Jv(Sg{G%qg~0}$vlx@Tm`Zsd#M<<(ElFG|&q&nwMMO4Q$6&bvwi0PVsI6aWAK diff --git a/venv/Lib/site-packages/pandas/core/array_algos/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/array_algos/__pycache__/__init__.cpython-312.pyc index 6a444b8d62d501f89d22567f272472fd85320577..222d5193c6d63117eacc40913b5e0f77bfacd06d 100644 GIT binary patch delta 45 zcmaFJ@{oo1G%qg~0}!M$d1Nfy$Sc4k6qB4^lp2#*RFqg5pO}-LUmP=8pUDUSCCm+~ delta 45 zcmaFJ@{oo1G%qg~0}$vjx@XMT$Sc4kq@SE$l&YUtRFqg5pO}-LU#ve_pUDUS6}JrE diff --git a/venv/Lib/site-packages/pandas/core/array_algos/__pycache__/datetimelike_accumulations.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/array_algos/__pycache__/datetimelike_accumulations.cpython-312.pyc index 8186c8fccad481a11df98a659a04a64697e0a4ae..5da533bfb289052b615ffbaf02041caaff7180be 100644 GIT binary patch delta 46 zcmZ1|zEGU^G%qg~0}!M$d1Tz&$UC1+C?+|-C^aUrs3@^AJ~1afzc^;|KDNg!06h*5 Ag8%>k delta 46 zcmZ1|zEGU^G%qg~0}$vjx@Sz=$UC1+NIyBhC{;hPs3@^AJ~1afzgU0sKDNg!041Cb AegFUf diff --git a/venv/Lib/site-packages/pandas/core/array_algos/__pycache__/masked_accumulations.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/array_algos/__pycache__/masked_accumulations.cpython-312.pyc index 863f414caece1ea45b11370c82eca31f1468e6f8..4fda5f84c9e073ba9525e656da9a631b933f5bde 100644 GIT binary patch delta 46 zcmdllvtNeyG%qg~0}!M$d1Or4$ZNte+ delta 47 zcmcbmeM_6~G%qg~0}$vjx@WB7-^lleNk~6AzbI8dv8X7qGCnaUJ-=9gvkdb-AplR4 B4%z?! diff --git a/venv/Lib/site-packages/pandas/core/array_algos/__pycache__/take.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/array_algos/__pycache__/take.cpython-312.pyc index 4043faec3a9651484b1fe364955d69f11bacd1eb..cdf013328e08bfd4462d0eda422cf1a49cfcdf68 100644 GIT binary patch delta 49 zcmZ3wfpO^uM!wU$yj%=Gkj~_hu`qZeUzC7QOmcovYD{8LQDS9$VorK~am?l_fz|E+ Dc=-@= delta 49 zcmZ3wfpO^uM!wU$yj%=GpvUN*;UBn>FG@g2KRLfBRX?$)D6uj=F(*C0SbuYsz-o5@ DUkwjj diff --git a/venv/Lib/site-packages/pandas/core/array_algos/__pycache__/transforms.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/array_algos/__pycache__/transforms.cpython-312.pyc index 63136f8bd74a0d5b08e669a43424374582f1867a..fedfce4ac192866ba9d13e9591fe0c11bc7a0f87 100644 GIT binary patch delta 46 zcmeyv{fC?PG%qg~0}!M$d1N$g&gYn=DM!wU$yj%=Gkj~_hQDU@_Z#xTbOmcovYD{8LQDS9r%;rlh`R)KL?hb|k delta 44 ycmX>&gYn=DM!wU$yj%=GpvUN*Az-+XZ#xUGesX?Ms(xZoQDSAW{^m<8`R)J}@OmcovYD{8LQDS9rO!HFt?Mvku3#p?EnA( diff --git a/venv/Lib/site-packages/pandas/core/arrays/__pycache__/interval.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/arrays/__pycache__/interval.cpython-312.pyc index 1a7e441a4d4d6a26cdb9d7c7a6a5c1a3105cb1b4..03a224615a85eb3ad0af1a6fa43126d1250ce064 100644 GIT binary patch delta 45 zcmX@LoaNMV7XH(`yj%=Gkj~_h@qmGGBY&SbZ%lH2QEE(LQBh)Lam?mb;tGENKb#LV delta 45 zcmX@LoaNMV7XH(`yj%=GpvUN*5%!Z|BY&SbuYPiVQL27oQBh)LvHs>&;tGENJZTQ# diff --git a/venv/Lib/site-packages/pandas/core/arrays/__pycache__/masked.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/arrays/__pycache__/masked.cpython-312.pyc index bd1d0c958eaf93dc926e530ab1ed7a4a96371357..c2147dfaa62b27c0f92958636030ced7a5221aee 100644 GIT binary patch delta 44 ycmZo}V`*+<;XBRC%f$c$=}aCO?TRNzN}yjY%vjN~|o7*?f-A^a}tcqYp0t delta 44 ycmZo}V`*+<;XBRC%f$c$dW`NFOm{c(ZRX?EPtGq&)lV!cN~|o_-+YeG^a}tB=?&rl diff --git a/venv/Lib/site-packages/pandas/core/arrays/__pycache__/numeric.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/arrays/__pycache__/numeric.cpython-312.pyc index a05d2ee1a6d9cb29df3290eacabd9091f8dacaec..18f43752d8e9e99bbf6060a946f2bd78f2066f63 100644 GIT binary patch delta 42 wcmbOkGc$(oG%qg~0}!M$d1Sm+*~qtynKvdmzbG{(v8X7qvN&e*LFNc801-qD%>V!Z delta 42 wcmbOkGc$(oG%qg~0}$vjx@VkK-pIF%nO8qKzbI8dv8X7qvRHrfLFNc8009vU>;M1& diff --git a/venv/Lib/site-packages/pandas/core/arrays/__pycache__/numpy_.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/arrays/__pycache__/numpy_.cpython-312.pyc index 78c47afad99299ef6b7f3a0a964da2b9a63a71f5..51942f7ab1a036b5f151141dabb2b9ca45182664 100644 GIT binary patch delta 44 ycmX>*pYiN`M!wU$yj%=Gkj~_hA?>k|ua%oOCON+-H72pBD6z6QX7d7WT^9f+#tqH@ delta 44 ycmX>*pYiN`M!wU$yj%=GpvUN*ao2StUn@7SesX?Ms(xZoQDSAW{^kYTx-I}MLk-IS diff --git a/venv/Lib/site-packages/pandas/core/arrays/__pycache__/period.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/arrays/__pycache__/period.cpython-312.pyc index be70b90e35da27f3ce33680d9d77137d08f55bbf..125ad79e510ec70c945c10cfed7fce7c495eae08 100644 GIT binary patch delta 44 zcmaFxmg&J;Cce|Wyj%=Gkj~_haeVnkzB%l?G0FKwsWFK~MTwQgF`KuuYpw?XW2z7; delta 44 zcmaFxmg&J;Cce|Wyj%=GpvUN*F=f$4zB%l?`pNl4srrdUMTwQg`kS}2Ypw?XQ3?+* diff --git a/venv/Lib/site-packages/pandas/core/arrays/__pycache__/string_.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/arrays/__pycache__/string_.cpython-312.pyc index 2bc7a5992d8b27247020e9d3eee203b5053607ab..c7d9e18faa019bc3d93156e3284409a9dc13a474 100644 GIT binary patch delta 44 ycmbPth-uy-Cce|Wyj%=Gkj~_h(K2NtUn3`POmcovYD{8LQDS9r%;q_qP16B2p$`cF delta 44 ycmbPth-uy-Cce|Wyj%=GpvUN*;WJ?)Un3{4esX?Ms(xZoQDSAW{^mKHP16A)oDK^B diff --git a/venv/Lib/site-packages/pandas/core/arrays/__pycache__/string_arrow.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/arrays/__pycache__/string_arrow.cpython-312.pyc index 7a53dcfa5fb29114597fd07856e0638e55ed39b0..587081b3dffc5b0af5d06c477f7faaf24e75a47f 100644 GIT binary patch delta 44 ycmcbnOmcovYD{8LQDS9r%;r>1;l&YUtRFqg*45ISO^(RL$+5i9)-3>wj diff --git a/venv/Lib/site-packages/pandas/core/arrays/arrow/__pycache__/accessors.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/arrays/arrow/__pycache__/accessors.cpython-312.pyc index 4c797fc1f1f790c5b41a8ed067a95e3e4f539bd8..299037f1c77d24eedb3c17d525a544c846986945 100644 GIT binary patch delta 48 zcmaD>_pFZZG%qg~0}!M$d1OdfY~)jC7LG~IFG`I`EGkN@ECx~e_pFZZG%qg~0}$vjx@Xv%ZRAsD7S>PBFG|%eBNGvK&)!!_`{KOgn Db$Spa diff --git a/venv/Lib/site-packages/pandas/core/arrays/sparse/__pycache__/array.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/arrays/sparse/__pycache__/array.cpython-312.pyc index 13f5cefead613735a3cb8f9e97984544d0afaeee..99c42c06188d637f3f6f4281dc50620b7729b087 100644 GIT binary patch delta 56 zcmeC$#L~5ih5s}!FBbz4q%(PBJYr_t$Zx_f5|f-?lp2#*RFqg*98+A7SX7)E(;Uve KJ)E6!vmgM~^AUjn delta 56 zcmeC$#L~5ih5s}!FBbz4=rOuyc>ZD7$Zx_fqMw{!l&YUtRFqg*tY2J^SX7*<-yF`q KJ)E6!vmgM=HxTgv diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/__init__.cpython-312.pyc index 860b9c78e53bc01eeeb755669e8e011616a4293a..30332149df36665a598919c304b43bed4d1653c7 100644 GIT binary patch delta 41 tcmdnPxQCJZG%qg~0}!M$c}(Ok5{gOAFG>Xxxdo*qi6xo&c`+0Fbph)&4FdoG delta 41 tcmdnPxQCJZG%qg~0}$vlx=-XT64Fo3FG>Xxxdo*qi6xo&dHNIkbphS03_<_^ diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/align.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/align.cpython-312.pyc index 417690612ee442a1adae021d307458d8d4d691e0..b98608c8f4a5fa60d82269c424a34e75292758ca 100644 GIT binary patch delta 46 zcmZ4EwZ@D0G%qg~0}!M$d1O4>$eYL_6qB4^lnNwr3rb58OEUBGVm3FhtWf{}O`i{t delta 46 zcmZ4EwZ@D0G%qg~0}$vjx@QP(SN+P&CAQh00ikw9vRLPdG`v%B2BViFb?u{96t6 delta 43 vcmeBU>SN+P&CAQh00erB?ir2~dG`wGC+8QX0*Ty$(vrlI%=|q4iFb?u?h6eu diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/check.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/check.cpython-312.pyc index 50d786b8695129ada6bed5859d660cc491a5d234..83cb50a8c0ddefd0cbfd35d2b5459bbeea7d04eb 100644 GIT binary patch delta 45 ycmdnYyqTHzG%qg~0}!M$d1SoW$m_-^6qB4^lnNwr3rb58OEUBGVkW0D`T+nW?G8Es delta 45 ycmdnYyqTHzG%qg~0}$vjx@SDv$m_-^q@SE$lnNwr3rb58OEUBG^e3k>`T+nG^bK$T diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/common.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/common.cpython-312.pyc index 1373ecdd6d85032dfa03e579745488163493971d..67a770759a5d0a0491136a0212edfe559584bd02 100644 GIT binary patch delta 46 zcmdnPzlWdqG%qg~0}!M$d1PGL$oqg%C?+|-C>2QL7L=AGmSpDV#ccl1xR(_GOGpqD delta 46 zcmdnPzlWdqG%qg~0}$vjx@Rof$oqg%NIyBhC>2QL7L=AGmSpDV>2LnexR(_GHT@4F diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/engines.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/engines.cpython-312.pyc index 4a51174453935ba74cf874855732b6e727c6d261..d6e60e2ccf9b7d4fe51ac9b3016cb231174ee7a5 100644 GIT binary patch delta 47 zcmX@Dd0Lb2G%qg~0}!M$d1N&5ZshySEEJQRUz7?YatlgJ5=%1k^I|p&v+NK6096SO ARsaA1 delta 47 zcmX@Dd0Lb2G%qg~0}$vjx@Uai*~s^qSx7%QzbF+*ZsZeX6N*XBFG>Xxxdo*qi6xo&c`=(!*Xxxdo*qi6xo&dHS18*# AivR!s diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/expr.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/expr.cpython-312.pyc index fc4482cf3f4246f89fd9aeece5d52bc7cffcda26..49183f6fa668cca782ab3be2ea4fcc7e5bf25576 100644 GIT binary patch delta 49 zcmX>wnd!h}Cce|Wyj%=Gkj~_h@i%oNpCPAEOmcovDv-!6C@o1W$;{7-*&N83-v9uC CQ4pE{ delta 49 zcmX>wnd!h}Cce|Wyj%=GpvUN*u{CKUpCPA^esX?MDv-!6C@o1W$;{8w-yF!9-v9t; CbPtUH diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/expressions.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/expressions.cpython-312.pyc index 594c28c1118321b0b751f2f12a7112ab69d23384..be5bc206ca3ecadbce5a515ff94522c18013e98b 100644 GIT binary patch delta 47 zcmaFt^w^2-G%qg~0}!M$d1U0uZRC5zCKQvLUz7?YatlgJ5=%1k^I|qLu_sCa0Asoj AOaK4? delta 47 zcmaFt^w^2-G%qg~0}$vjx@Y*yZsdE!CZwO7Uz7?YatlgJ5=%1k^Yk|}u_sCa08j%C AYXATM diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/ops.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/ops.cpython-312.pyc index 303dae86b8b6fff5d923eb63fe454574f86cd01d..0658d78d84014f7b6f4dc66a1735e14ae17bbc18 100644 GIT binary patch delta 49 zcmeyggYnZ2M!wU$yj%=Gkj~_hp=q;`?=6Q=OmcovDv-!6C@o1W$;{7-+04tC8VmrH CCJ>1L delta 49 zcmeyggYnZ2M!wU$yj%=GpvUN*@z!!9-&+nL{p9?jR3MRCP+F2$l9`{UznPaaH5dS! Cu@Hy= diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/parsing.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/parsing.cpython-312.pyc index ff92db904f20186fd68ad3646289867eeadfb023..b2826db87ffd262fc3bac5027b8bae8333af4af3 100644 GIT binary patch delta 54 zcmext`q`B4G%qg~0}!M$d1M@w+{kyCmGRc*N30QyLNUqtMX5j{x1h8nu_QA;FJ`k3 H`*L9b?(-7t delta 54 zcmext`q`B4G%qg~0}$vlx@Y{C*vNO8mGRf+N30QyLi)-1MX5j{x1h8nu_QA;Pk*xy H`*L9b>1Psz diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/pytables.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/pytables.cpython-312.pyc index 683d84c56fbd7da6d5d9f0333224ab859e7fca10..1d68f6d124690419c535513e795dfacc95a01d84 100644 GIT binary patch delta 49 zcmZ4al5yorM!wU$yj%=Gkj~_hu{d}m-z-+4nB@GTR3MRCP+F2$l9`_uvw0Wm`#b=b C;Su5h delta 49 zcmZ4al5yorM!wU$yj%=GpwH-@!5O%bZx*YNesX?MDv-!6C@o1W$;{8w-@J?UeI5XH Crx1kz diff --git a/venv/Lib/site-packages/pandas/core/computation/__pycache__/scope.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/computation/__pycache__/scope.cpython-312.pyc index ab217f7964d75d420fb13244e6c10d7593b49b6c..47d765066835b618d8fc6da2b3e37bede7b3ff18 100644 GIT binary patch delta 47 zcmbOoKRcf9G%qg~0}!M$d1TmWZsgm+EEJQRUz7?YatlgJ5=%1k^I|sNU_Pu308d*F A>Hq)$ delta 47 zcmbOoKRcf9G%qg~0}$vlx@X*0-^jOvSx7%QzbF+*Um delta 40 ucmdnRwTp}QG%qg~0}$vlx@Smlf#%7WD5n9Un`SGoWILmCfN delta 44 zcmcb$gz?rAM!wU$yj%=GpwH-@G0ABo-!xuc{p9?jRQ;5a%7WBl{mmPBSGoWIF6$0U diff --git a/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/cast.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/cast.cpython-312.pyc index 1fa3a47a070446b02979134d82ff67e7cd9a2896..5b258cdc44863bbaa18f388b9db1b2eaafe6f2a1 100644 GIT binary patch delta 44 ycmeDG#oYgkneQ|&FBbz4q%(PBocgno?>rB0OmcovYD`K=WkG6j%;r}-sviJbo)EAA delta 44 ycmeDG#oYgkneQ|&FBbz4=rg)!uzlUgcb diff --git a/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/common.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/common.cpython-312.pyc index 2db8d8a4d1486f33eb1802fca945ed0813b38c5a..98c854bed624226dc76dc7b538b1a3872ad3fad1 100644 GIT binary patch delta 44 ycmX>$o%z^wX1>$Byj%=Gkj~_hk$z|+Uo1OsOmcovYD`K=WkG6j%;pMqzas!MJ`TzN delta 44 ycmX>$o%z^wX1>$Byj%=GpwH-@(YSjfUo1PXesX?Ms(wmIWkG7O{^kmHzas!B5Dpvw diff --git a/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/concat.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/concat.cpython-312.pyc index c2546cbde057d00685b60e5ecd5f40fd06533d2d..93bcca9a5b2497d61996b14a0ecab51c5a1a5c55 100644 GIT binary patch delta 42 wcmZ3Jz9yaTG%qg~0}!M$d1TZZZRE3J=8Z|tFG`I`DXA<-Esoh7${cP000(Uh-v9sr delta 42 wcmZ3Jz9yaTG%qg~0}$vlx@RaGZsfCK=G9NmFG|%0 diff --git a/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/generic.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/generic.cpython-312.pyc index 912fd2df2f626553f58ae6d48d65dbde64d76f68..cab15decc7a749add264f74d1076340ac2d1cc09 100644 GIT binary patch delta 41 vcmaE&@I-<4G%qg~0}!M$d1S2J$h(-8Hzqm1C^aUfq_QBjIA-%+*5zCP2-yv~ delta 41 vcmaE&@I-<4G%qg~0}$vlx@SmjvApt?ko&u diff --git a/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/inference.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/inference.cpython-312.pyc index 6730c8eb252fd474cea91d8fd191f71ade8d1e25..16fd8c20ae9f1bf02d582f4508adf3360343f262 100644 GIT binary patch delta 42 wcmdlQx;2#VG%qg~0}!M$d1Sm)*~qtvl{Y3izbG{(rKGYTwK!(;S=JXS02;Lpq5uE@ delta 42 wcmdlQx;2#VG%qg~0}$vlx@VXuZ{*v=%B!E8UzDn!Qc_uvTCBhMEb9vu0Q=DmD*ylh diff --git a/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/missing.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/dtypes/__pycache__/missing.cpython-312.pyc index 65f2791752e9b9422b3246ce02de05aa58526812..d5a7ea22fb483206f10ec1902e46ae5e680592ae 100644 GIT binary patch delta 44 ycmdn>ka5>TM!wU$yj%=Gkj~_hQ5Cka5>TM!wU$yj%=GpwH-@5fHPH?<6a)esX?Ms(wmIWkG7O{^lpF*RlXO(+>s! diff --git a/venv/Lib/site-packages/pandas/core/groupby/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/groupby/__pycache__/__init__.cpython-312.pyc index 358e2cad2aa128ff66394e9e418bbc769e4eeadd..5fd6c066f7e71fefc6f2375965cf5785f1b202ef 100644 GIT binary patch delta 41 vcmcb|e2?zT&CAQh00ikw9vOB#8~N68^2H?Q7p2Ce7v+~0Bvr<2KE=6>2>|er4H^Id delta 43 xcmZpWY>?zT&CAQh00jDs?itUyH}b9Hk>4ePFD5y^C^aU%D8IBIsWPTHF`_*&f^mCd I1e5qB0OQ0G3jhEB delta 54 zcmexyh3Cf=9{$t3yj%=GpwH-@vEvWZMt+wFKKe=VNxG%qg~0}!M$d1QpCZRG3Ve=VNxG%qg~0}$vlx@V}VZshCW@ diff --git a/venv/Lib/site-packages/pandas/core/groupby/__pycache__/numba_.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/groupby/__pycache__/numba_.cpython-312.pyc index 50492c43077afe745e819c9838cb30fbd386fc6d..48166e137a49f31e7a3d72031953b89795779eb8 100644 GIT binary patch delta 42 wcmeA+=r-Uz&CAQh00ikw9vPQ6@@{11i%HHeN{vY`$}cTQs*KruhSgpO00aIFdjJ3c delta 42 wcmeA+=r-Uz&CAQh00jDs?iq3$c{j51=_ltGrRt{_<(C#DRqAg(!)h-C0OZ&V1poj5 diff --git a/venv/Lib/site-packages/pandas/core/groupby/__pycache__/ops.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/groupby/__pycache__/ops.cpython-312.pyc index 6bfbd689484c5679314425f00ea09d23fb5800ae..0b88147cf19cb44d6d8f3aea3f25ced73ba6fde0 100644 GIT binary patch delta 45 zcmZ2+m1)IQCce|Wyj%=Gkj~_hAv9|v-vKthnB@GT)R^?5{L+G?%9zb}*v>2l07}&m A9RL6T delta 45 zcmZ2+m1)IQCce|Wyj%=GpwH-@5jAxq-vKs0{p9?jRQ>d#{L+G?O8w1u*v>2l07L{2 Ap8x;= diff --git a/venv/Lib/site-packages/pandas/core/indexers/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexers/__pycache__/__init__.cpython-312.pyc index a6fb98228c71390825e2bd332086be93546773cd..31a31cad2118d75ada711a931001a9fd9baf0e93 100644 GIT binary patch delta 42 wcmcc4dYzT`G%qg~0}!M$d1Ul&YVZmy%kMT2!n*xu3}c0Q;>Bx&QzG diff --git a/venv/Lib/site-packages/pandas/core/indexers/__pycache__/objects.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexers/__pycache__/objects.cpython-312.pyc index 90330122aa9e9131c26220a7be4f62cec874cd74..1d9c61bff7eadc20330f48838de0ea57d5bef374 100644 GIT binary patch delta 44 ycmZ2gzp9?^G%qg~0}!M$d1QoHZ{(}uRuo(a)Wet7+ diff --git a/venv/Lib/site-packages/pandas/core/indexers/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexers/__pycache__/utils.cpython-312.pyc index b3eab9bd4186641ed6d9cf958896d382d170e014..87214b46046f125464979cb0dc6769496869b5ad 100644 GIT binary patch delta 46 zcmZ47&bYXpk?%AwFBbz4q%(PBymQ#dH=Tt)CON+-H6}AJCAA{8s5oZx7MAyR07j1w Ay8r+H delta 46 zcmZ47&bYXpk?%AwFBbz4=rg)!9JSlXH=TuFKRLfBRX;N?CAA{8s91mV7MAyR05i}I A&j0`b diff --git a/venv/Lib/site-packages/pandas/core/indexes/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexes/__pycache__/__init__.cpython-312.pyc index 9f52d382e753e455fabe4eeb2395d62bad659fe7..82720d5e83407ddc3136cf553d4fa21f03447a26 100644 GIT binary patch delta 37 rcmdnNxPy`VG%qg~0}!M$c}(Ok;)_YnFG`Kc%u7kFNG*<;*sTiyx2g*; delta 37 rcmdnNxPy`VG%qg~0}$vlx=-XT;?qygFG|(V%u7kFNG;Z%*sTiytZ)i% diff --git a/venv/Lib/site-packages/pandas/core/indexes/__pycache__/accessors.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexes/__pycache__/accessors.cpython-312.pyc index 030afecc535149cbda54f2a6c08f17158e9660d9..23f79d4a05927b2d17b451d249b28271e73d212a 100644 GIT binary patch delta 45 zcmaF1neo|XM!wU$yj%=Gkj~_h5$wB>uauoHCON+-H6}AJCAA{8IA-%i_Rt^zNudtY delta 45 zcmaF1neo|XM!wU$yj%=GpwH-@alvaNUnx7EesX?Ms(xl(N@_)FvHs?X?4dybNMsI- diff --git a/venv/Lib/site-packages/pandas/core/indexes/__pycache__/api.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexes/__pycache__/api.cpython-312.pyc index 4ed4cd623813cb60cb81523a74fa5a43a336e2fd..bf342b0ecdcbebb6a2908011227c901fd12e61b5 100644 GIT binary patch delta 43 xcmaEq`Y4s}G%qg~0}!M$d1TmWZRA_Z!55R9Uz8e?nU|7Uky;$H`5=d)762&_4f_B9 delta 43 xcmaEq`Y4s}G%qg~0}$vlx@YXt*vPk(gHJy>zbI8dGcP5zBDGk5^FaNzN}yjmgYQNv%jNj@g{f=~oE=B;yU; delta 45 zcmdnm%CxnWiSINoFBbz4=rg)!+|1j^=grBdpPXNms-Kycl3I~ktiL&()2|W$DLoC% diff --git a/venv/Lib/site-packages/pandas/core/indexes/__pycache__/datetimes.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexes/__pycache__/datetimes.cpython-312.pyc index f35db19645a7db38c70b0e9ecf7055acef5b56ca..42087762c7d1e8fc7a238b919566460468b938c3 100644 GIT binary patch delta 45 zcmX?loayLsCce|Wyj%=Gkj~_hp*U+J-#-q%nB@GT)R@e?l+=pU;+V}+oU3O608+~j Ai2wiq delta 45 zcmX?loayLsCce|Wyj%=GpwH-@v1{r^zJDBi`pNl4srs3DDXA5y#rm72I9JaC08}&& ATmS$7 diff --git a/venv/Lib/site-packages/pandas/core/indexes/__pycache__/extension.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexes/__pycache__/extension.cpython-312.pyc index 343ca883a982d32aa7bbf1e1de5d99f160d33c6a..e2938ea579801ad37b9e89efffcf71ab261de51c 100644 GIT binary patch delta 43 xcmdmBzQLUDG%qg~0}!M$d1Oe4ZsaRrE+Y diff --git a/venv/Lib/site-packages/pandas/core/indexes/__pycache__/frozen.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexes/__pycache__/frozen.cpython-312.pyc index 2892b719bb4f30fee502524ee0d7d1fa30b05822..82034ed45b012891aaa4d8f6953d4a1d17c466ed 100644 GIT binary patch delta 43 xcmeBF?^NeI&CAQh00ikw9vMP>8~IdO`C^jui&A4U^HNePQj23YJFf@#?aCce|Wyj%=Gkj~_haed}Sz6)G@G0FKwsWF*(DXA5y#W9=Ta9Pa+09lw2 AHvj+t delta 45 zcmZ2>f@#?aCce|Wyj%=GpwH-@kv4TB-vur{{p9?jRQ=4nl+=pUV*Sl;xU6OZ06-QG A0RR91 diff --git a/venv/Lib/site-packages/pandas/core/indexes/__pycache__/multi.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexes/__pycache__/multi.cpython-312.pyc index 3d91243bf6c3b1b3612f97540c015768b782fd24..c3aeffca30a18a9d9eaf1e0516a2b9273dd30366 100644 GIT binary patch delta 53 zcmX@Vob&v0PQKH;yj%=Gkj~_hk?g#YPnm}=CON+-H6}AJCAA{8IHuX2r`?{1al1Va H(*$<_uiy{h delta 53 zcmX@Vob&v0PQKH;yj%=GpwH-@A#A*nPnm~LKRLfBRX;N?CAA{8Sijkxr`?{1al1Va H(*$<_kAx1t diff --git a/venv/Lib/site-packages/pandas/core/indexes/__pycache__/period.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexes/__pycache__/period.cpython-312.pyc index 8bc02ab941e04cbcbdebc06e4a967da69f7ac2e0..6d132d89172cd60d30dda5576831ed52298fed23 100644 GIT binary patch delta 45 zcmaE~mhsVAM!wU$yj%=Gkj~_h(c!a^?-eUwOmcovYD{KcN@_)Fam;2mwmSg;R8bFK delta 45 zcmaE~mhsVAM!wU$yj%=GpwH-@q2#rZ?-eVbesX?Ms(xl(N@_)FvHoT@wmSg;JRc4= diff --git a/venv/Lib/site-packages/pandas/core/indexes/__pycache__/range.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/indexes/__pycache__/range.cpython-312.pyc index c18a6bd740620f0db9113893e2880fbdd381b97c..75d7058c3adeb7269a66ef6cec6ec16e420a5789 100644 GIT binary patch delta 45 zcmeBq&(!mtiSINoFBbz4q%(PB{F=9s?*yTG%qg~0}!M$d1RRAY~(BC<%>zqFG`Kc%u7kFNG*=p+{-&l5daRo4S@gv delta 43 xcmZ1;w>*yTG%qg~0}$vlx@TO_+Q?VP%cq~5UzDn!nU|7Uky@<3xtDjAA^;G-4O##I diff --git a/venv/Lib/site-packages/pandas/core/interchange/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/interchange/__pycache__/__init__.cpython-312.pyc index ac2fd6526d033cedb0854572fbf68744d2715179..bae904362adc317034a46cc9783b7bbbd1616ce0 100644 GIT binary patch delta 41 vcmdnPxQCJZG%qg~0}!M$c}(Ok5{gOAFG`Kc%qvMPO3p~kOHYlN*slu!>G}-V delta 41 vcmdnPxQCJZG%qg~0}$vlx=-XT64Fo3FG|(V%qvMPO3p~kOHb9G*slu!+;9vR diff --git a/venv/Lib/site-packages/pandas/core/interchange/__pycache__/dataframe_protocol.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/interchange/__pycache__/dataframe_protocol.cpython-312.pyc index e766330af1a9b82aa2450703647d63f8971ea3b5..38a4360a05be90707b564fe05ac25ccd8d02a33f 100644 GIT binary patch delta 49 zcmX>&iSghhM!wU$yj%=Gkj~_h!Q{A+uZ>wKCON+-H6}B!B(*3xBQY;MHD>cN=Gm?Q DXH*Z} delta 49 zcmX>&iSghhM!wU$yj%=GpwH-@VQ9aRuZ>wqKRLfBRX;PYB(*3xBQY;MRe$p`=Gm?Q DT&NF8 diff --git a/venv/Lib/site-packages/pandas/core/interchange/__pycache__/from_dataframe.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/interchange/__pycache__/from_dataframe.cpython-312.pyc index 6b884afbec06d7e6aec1fc5765bc3871b4292b73..881e828793bf8a535b6659f1f856848a43922c84 100644 GIT binary patch delta 49 zcmex1gYnx8M!wU$yj%=Gkj~_hamr&O-%}o;nB@GT)R@e?lGLK)jKsY3)R@hzyoL4v Doi7l> delta 49 zcmex1gYnx8M!wU$yj%=GpwH-@G1qM)-%}nT{p9?jRQ=4nlGLK)jKsY3RQ=7YyoL4v Dhr18c diff --git a/venv/Lib/site-packages/pandas/core/interchange/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/interchange/__pycache__/utils.cpython-312.pyc index 779f5f095b5bf0e1a21c745b55d5c2dee31a51c6..27200a2789d6cdbb0bad573f7122b09a0b453533 100644 GIT binary patch delta 47 zcmbPgG}VajG%qg~0}!M$d1MrcY~;&e6N*XBFG`Kc%qvMPO3p~kOHYm2+`-l>1OPSm B4vzo; delta 47 zcmbPgG}VajG%qg~0}$vlx@YVb-pH51CZwO7UzDn!nOBlpl$?>6m!7J>xr41&2mmf~ B4i*3a diff --git a/venv/Lib/site-packages/pandas/core/internals/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/internals/__pycache__/__init__.cpython-312.pyc index 2243121f67d0100b88b49d8c6e2c735bd6fad858..93a675cdf1b377a80651350047c8d99232b92528 100644 GIT binary patch delta 44 ycmZ3$Byj%=Gkj~_hae2c=zGg0gnB@GT)R@e?lGLKS#GK-o%?r8Cp9BDf C#SyOn delta 47 zcmeycg89P=X1>$Byj%=GpwH-@F@5z$zGf}~{p9?jRQ=4nlGLKS#GGRN%?r8Cp9BDJ C;t;I> diff --git a/venv/Lib/site-packages/pandas/core/internals/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/internals/__pycache__/base.cpython-312.pyc index ad9f19d9d292d921956de1f66545d9bdd67af792..ec9fd9532fba26fa0fe0d5ddb32ea50d9cbc88c0 100644 GIT binary patch delta 45 zcmX?|e>$J$J{w^#ELd B5EuXe delta 47 zcmZ2BgK60eCce|Wyj%=GpwH-@F~4;qUks0cesX?Ms(xl(NorAEVotIC<|>{w^#Dif B4)R=(4`yj%=Gkj~_h@!owSpCz9_OmcovYD{KcNorAEVoq^Pb2#7ja6ZP1 FVF0M>5efhR delta 51 zcmZ2+igm>)R=(4`yj%=GpwH-@vBGX6pCzAwesX?Ms(xl(NorAEVotGsb2#7ja6ZP1 FVE~OJ5BUH9 diff --git a/venv/Lib/site-packages/pandas/core/internals/__pycache__/ops.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/internals/__pycache__/ops.cpython-312.pyc index c96397f5b5f8e0dc758f359814dce0411635300e..80bdfaebc5dd3744794e01527e86b9e4483eddaa 100644 GIT binary patch delta 44 ycmaE__Fj$mG%qg~0}!M$d1P$f$h)0MASOA#C^aTCuOzi7FEOV$X7d%M*#ZDOXb(F8 delta 44 ycmaE__Fj$mG%qg~0}$vlx@Smk*sTiyx8Dmi delta 37 rcmdnNxPy`VG%qg~0}$vlx=-XT;?qygFG|(VO)bgDPbt=)*sTiytfdNb diff --git a/venv/Lib/site-packages/pandas/core/methods/__pycache__/describe.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/methods/__pycache__/describe.cpython-312.pyc index b4e3b8dc976d7e1c5c86820899e8413c2edb33fc..aa26245b7dcd999938ec8fa303677a2717bf7d89 100644 GIT binary patch delta 43 xcmcaxdbgDCG%qg~0}!M$d1OQyY~)+U!55R9Uz8e?n_7~QpHdvN`4ES+5dbhV4mtn; delta 43 xcmcaxdbgDCG%qg~0}$vlx@YXv+sLzbI8dH?<@qKc!fI^C1ptBLFNN4c7nw diff --git a/venv/Lib/site-packages/pandas/core/methods/__pycache__/selectn.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/methods/__pycache__/selectn.cpython-312.pyc index f3ddf5abf6363b020194c70d1236a570f7f20d95..0dc170d919f3c72b8629d43226581ec31d223f6e 100644 GIT binary patch delta 43 xcmaFk{>Gi}G%qg~0}!M$d1T1SZ{)kp%omfKUz8e?n_7~QpHdvN`8)Ghc>pCX4%Pqw delta 43 xcmaFk{>Gi}G%qg~0}$vlx@QQ;ZRESn%%`86UzDn!n_7~QpHi&9`8)Ghc>oq34hH}L diff --git a/venv/Lib/site-packages/pandas/core/ops/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/ops/__pycache__/__init__.cpython-312.pyc index 86661c23deb54c0bb74b958bdb2223f211b62448..51f073bddb831491406dcb88c5a539d609ce5462 100644 GIT binary patch delta 37 rcmcb@eTAF%G%qg~0}!M$d1P$d$ZN*R6_cD_lp2#?P#iPam$e-L!5a$$ delta 37 rcmcb@eTAF%G%qg~0}$vlx@UxJ(f$`)7M!wU$yj%=Gkj~_h@z`f0-ye3anB@GT)R_E&;+V}M9HtHc5M>P+ delta 41 vcmX>(f$`)7M!wU$yj%=GpwH-@(eAa8?+-hdesX?Ms(yY!vHoTe4pRpJ{O}9< diff --git a/venv/Lib/site-packages/pandas/core/ops/__pycache__/common.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/ops/__pycache__/common.cpython-312.pyc index 773b2b9f14dd899278fa38b87b7c76b50ec859d9..7fffc7f8ab71220e766f6298146c3e88ff848c39 100644 GIT binary patch delta 39 tcmX@7cutY;G%qg~0}!M$d1Tn}ZRC5v#1)gAUz8e?Ur-#g`3KWAUI5%+42u8& delta 39 tcmX@7cutY;G%qg~0}$vlx@WB6-N^TViAz5@zbI8dzo1xu^ADzLya3v33^xD( diff --git a/venv/Lib/site-packages/pandas/core/ops/__pycache__/dispatch.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/ops/__pycache__/dispatch.cpython-312.pyc index 4b910adc7d55dd18d78e9cd717d1444221003d1d..053f1d807f02454ad5ea24b284596d78d46d4c31 100644 GIT binary patch delta 38 scmX@Zeuka*G%qg~0}!M$d1TDo$lJ)o6_cD_lp2#?P#m*)29pUR0Lqk?%AwFBbz4q%(PBhqk?%AwFBbz4=rg)!2zYGd+snbFpPXNms-Is_tiSmxhn+b9+rkTY diff --git a/venv/Lib/site-packages/pandas/core/ops/__pycache__/invalid.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/ops/__pycache__/invalid.cpython-312.pyc index 365026670c2f8421b5b49100be1fa6e96acfbd95..7b06fb0079b87fb9ea6a312f5be2c71af66292ec 100644 GIT binary patch delta 38 scmaDR_)L)ZG%qg~0}!M$d1PGQ$a|87D<(O=C^aU(pg3mp0~R(G0OC*#AOHXW delta 38 scmaDR_)L)ZG%qg~0}$vlx@XMX$a|87OFuckC{;hdpjdzN0~R(G0MZ}}ApigX diff --git a/venv/Lib/site-packages/pandas/core/ops/__pycache__/mask_ops.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/ops/__pycache__/mask_ops.cpython-312.pyc index 8b8467ac5ccd7bf5cce0ac70b98c97165bdc24af..bb0a9eb0036b40f131d10add9dafcb663dc4c5d7 100644 GIT binary patch delta 38 scmaE@`C60rG%qg~0}!M$d1Tz%$Sc6c6_cD_lp2#?P#m*ao$Ux80NmXRy8r+H delta 38 scmaE@`C60rG%qg~0}$vlx@RbE(ofDWO4ZLVDAwORi#?PN0L%djwEzGB diff --git a/venv/Lib/site-packages/pandas/core/reshape/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/reshape/__pycache__/__init__.cpython-312.pyc index 9f6099a1f2fb7f9fee6829e384db85cddd151cc7..91481a5c84bf477e0a4533494536efa797402594 100644 GIT binary patch delta 37 rcmdnNxPy`VG%qg~0}!M$c}(Ok;)_YnFG`ImN-fSvEJ%%+*sTiyx2+2( delta 37 rcmdnNxPy`VG%qg~0}$vlx=-XT;?qygFG|%fN-fSvEJ)R#*sTiytaA!y diff --git a/venv/Lib/site-packages/pandas/core/reshape/__pycache__/api.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/reshape/__pycache__/api.cpython-312.pyc index 20567de3476634ba6ac0c454b2988bc0064f9c55..41cd07ddd25960b4cfbc9db47112f14219b5c9e6 100644 GIT binary patch delta 41 vcmZ3*wu+7SG%qg~0}!M$d1PGN$h(z^FD5y^C^e=iwKyZOAT?(41*Rwf@%s%f delta 41 vcmZ3*wu+7SG%qg~0}$vlx@WA|$h(z^Pd_=oC{@2GwKyZOAXR_z1*Rwf;d%^2 diff --git a/venv/Lib/site-packages/pandas/core/reshape/__pycache__/concat.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/reshape/__pycache__/concat.cpython-312.pyc index 9ef1af2301cfcecee6cc094d4ef4cc7ec60d8c0e..467610ab7623ce94a3f1f8236284a208b0f8e02b 100644 GIT binary patch delta 45 zcmeBw&)EN-k?%AwFBbz4q%(PB+%DY6XTru8lbm0a8dH>7oRL_N8nZco&At!-N`wx^ delta 45 zcmeBw&)EN-k?%AwFBbz4=rg)!#O7_}GhyS?PtGq&)h|jd&PXgs)!!VzW?u*ZFUbvr diff --git a/venv/Lib/site-packages/pandas/core/reshape/__pycache__/encoding.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/reshape/__pycache__/encoding.cpython-312.pyc index f5654d854944ab519698bfb67c05d8ed1a76d480..62d30740382a980aba7da267fa91fc8185107885 100644 GIT binary patch delta 45 zcmex4lkw+FM!wU$yj%=Gkj~_h(d@I4&s>ZzCON+-HKr)FI3uwjHD+_L*fKK!N6-$# delta 45 zcmex4lkw+FM!wU$yj%=GpwH-@;o-HB&s>a8KRLfBRlg{;I3uwjRey7^*fKK!GyDz3 diff --git a/venv/Lib/site-packages/pandas/core/reshape/__pycache__/melt.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/reshape/__pycache__/melt.cpython-312.pyc index 9e5f43288364ffb2bf8c0914a26c0458a0c9f226..814aafd471f7019fe30b292ced3bdd5d56738e78 100644 GIT binary patch delta 45 zcmdnKh;jQOM!wU$yj%=Gkj~_h@xyf^-$rJ>nB@GT)R>~w;*7+C)R@g@nX`NWNzD&v delta 45 zcmdnKh;jQOM!wU$yj%=GpwH-@@xyr|-$rIW{p9?jRQ;mV;*7+CRQ=6onX`NWJNFKy diff --git a/venv/Lib/site-packages/pandas/core/reshape/__pycache__/merge.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/reshape/__pycache__/merge.cpython-312.pyc index a6989aad1e271efa8316c84230b2fedc3fdad97e..1a85ba407df35a3a0fa7a11ca5b00e215be85310 100644 GIT binary patch delta 49 zcmey{&GxsOjqfxsFBbz4q%(PBtnS~)cZH8HCON+-HKr)FI3uwjHKzFk-}VoDjJ)Ll Dq)rih delta 49 zcmey{&GxsOjqfxsFBbz4=rg)!JZjmlUnM!wU$yj%=Gkj~_hQBksyuatu?CON+-HKr)FI3uwjHD>cfj@g9(Q^yaC delta 45 zcmZ4Ug>lUnM!wU$yj%=GpwH-@@wH$hUnvKlesX?Ms(w*waYkZ6s{ZDQ9J31nQgIJN diff --git a/venv/Lib/site-packages/pandas/core/reshape/__pycache__/tile.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/reshape/__pycache__/tile.cpython-312.pyc index 669c8848a8084a4b0a359324907624be72cefe02..5474277016cbacb3cbbe3982e80915dab8c83d78 100644 GIT binary patch delta 45 zcmcbxi}AuPM!wU$yj%=Gkj~_hVHvTJZ-WwFOmcovYD`gTaYkZ6YRu*{N-b6ZOQ;WF delta 45 zcmcbxi}AuPM!wU$yj%=GpwH-@u{(4l-v%W<{p9?jRQ;mV;*7+CRQ=6olv=C+O6?CH diff --git a/venv/Lib/site-packages/pandas/core/reshape/__pycache__/util.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/reshape/__pycache__/util.cpython-312.pyc index 4e306d6c1bba66622959b861bee205ef4bef1ef6..5609ae0ea9d1200999282c382b05c44f0b6e973b 100644 GIT binary patch delta 43 xcmZpcXqMnR&CAQh00ikw9vQ|Q8~Ie(_+pati&A5XQj0SZ3sPe?JF*>O1pwfi3+4a- delta 43 xcmZpcXqMnR&CAQh00jDs?iu&kH}a{n@#!b$7p3YKr50x-7NqKLc4Rxm3IOCh3(o)m diff --git a/venv/Lib/site-packages/pandas/core/strings/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/strings/__pycache__/__init__.cpython-312.pyc index 37b50a6e7f29a655b0c3c758ce9f1a0283062520..e900aded23fef76549589578fbddf39960499660 100644 GIT binary patch delta 41 vcmey%{+FHiG%qg~0}!M$d1ORy&MnB@GT)R^LuqRhPX;+W>^yxXtyGRmI^ E0I|Ii5dZ)H delta 49 zcmeyill|LHcD~cRyj%=GpwH-@(XwYF-)>$${p9?jRQ=+TqRhPXV*TdpyxXtyGRmI^ E0HFmDPXGV_ diff --git a/venv/Lib/site-packages/pandas/core/strings/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/strings/__pycache__/base.cpython-312.pyc index 0eaf0bf741f7dc7336c2f611bebc0045095eb9b8..4ba5d0569bb9f5cffd1768dd2d8377b521d9938f 100644 GIT binary patch delta 43 xcmaEu_%M<0G%qg~0}!M$d1U+*+sHSQhc6~MzbG}PxTGjEFTFTs^Hv@m6#zM44yynF delta 43 xcmaEu_%M<0G%qg~0}$vlx@UYA-N-kShfhB_zbI9|xTGjEFTGfQ^Hv@m6#y!q4c`C& diff --git a/venv/Lib/site-packages/pandas/core/strings/__pycache__/object_array.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/strings/__pycache__/object_array.cpython-312.pyc index 9e7e79d14d4c96628c86b1179a2e7e173aba1a1a..2cf7f0497ef13a1df318bcc63f3b613ab4568f6d 100644 GIT binary patch delta 45 zcmbRHmvQc2M!wU$yj%=Gkj~_h@xXZ_Uoa|{G8&L%?CJ3R{#JvW)CX> delta 43 ycmdn`glX#&Cce|Wyj%=GpwH-@5w>b0-!e`f{p9?jRQ;0t{G4L_%?CJ3R{#JmHx7*e diff --git a/venv/Lib/site-packages/pandas/core/tools/__pycache__/numeric.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/tools/__pycache__/numeric.cpython-312.pyc index df323f6f2ca1622de283166163b7948ddbe89e1e..1c5308d3175748f7fb6844e93f8369b2805e5eec 100644 GIT binary patch delta 41 vcmdlJwkM45G%qg~0}!M$d1RF9Y~+hm=7~wpFG`Im$Z{&+p=Fv~iFG|%f$#+2-XcK delta 41 vcmX@_dft`qG%qg~0}$vlx@XK%+Q_$&nMXf4zbI9|BtJi=Sby_rW)^t>`K$~} diff --git a/venv/Lib/site-packages/pandas/core/tools/__pycache__/times.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/tools/__pycache__/times.cpython-312.pyc index 043c9d1d8c3d2eca51f99f2b57eb290a036a9542..f1d390805068941509325d8f9247695e5490840d 100644 GIT binary patch delta 41 vcmeyN^FxR4G%qg~0}!M$d1NdV-N>iT#}kvBUz8eClAoVb9JASx&zu7Q|A-7o delta 41 vcmeyN^FxR4G%qg~0}$vlx@Y_q*~q8P$D^N|UzDm}lAoVbtiRcj&zu7Q`!x&R diff --git a/venv/Lib/site-packages/pandas/core/util/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/util/__pycache__/__init__.cpython-312.pyc index 4299835060463202ed3a28a14d8affc1fcef4813..6c93b3a1a7437fac2ba20d5b8c216a9d5bebd8f2 100644 GIT binary patch delta 34 ocmdnWxRsInG%qg~0}!M$c}(Ok;*LqqFG`ImEy>J@nb@HV0G8$n@&Et; delta 34 ocmdnWxRsInG%qg~0}$vlx=-XT;?_^jFG|%fEy>K$pV*-b0F7t~F#rGn diff --git a/venv/Lib/site-packages/pandas/core/util/__pycache__/hashing.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/util/__pycache__/hashing.cpython-312.pyc index fec3827fc9c192fe42a486f5fe219c361d298cab..248baf7a6f8cb2433e9263e39f526c9262d8999d 100644 GIT binary patch delta 40 ucmZ1!yC|0LG%qg~0}!M$d1UaYZ{%CS#vPNKUz8eCT9TO)v-u#~Lv;Y=qzt_P delta 40 ucmZ1!yC|0LG%qg~0}$vlx@YWE-N?6sjaxrCzbI9|v?Mb}fAc}Mhw1?88w{ra diff --git a/venv/Lib/site-packages/pandas/core/util/__pycache__/numba_.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/util/__pycache__/numba_.cpython-312.pyc index 7cdb54541db923c43d51c3023471e9226fb57f5f..abf1f82c319a9f48116b69e95d9b558e34ea28c3 100644 GIT binary patch delta 39 tcmca4aY=&rG%qg~0}!M$d1O><Mh^h#gbfM+ delta 40 ucmdnMvVn#7G%qg~0}$vlx@R2P$a{{FS3fzwC{@2aGcP5-Tz~QlMh^hnUJNn- diff --git a/venv/Lib/site-packages/pandas/core/window/__pycache__/common.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/window/__pycache__/common.cpython-312.pyc index 4ef6327eb0190195055403ad2bf3343ae1c571ec..15d4623fb20df9e73ec7616fd3f92c750185ed5a 100644 GIT binary patch delta 41 vcmbPaHOY$iG%qg~0}!M$d1O4^$lJlk8nU|7Z9rvx9&CAQh00ikw9vPc9^3G%8jY-ZgN{uPc%uC5HkJ-F~DMSDO?lBC# delta 41 vcmeBC>rvx9&CAQh00jDs?iqF)dFL_l>L=$HrRtYw=B4D9>u=t{6e0is)_V(x diff --git a/venv/Lib/site-packages/pandas/core/window/__pycache__/ewm.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/window/__pycache__/ewm.cpython-312.pyc index 508cc8fb2dd54a1c0756061d2cb5455da85b7459..1ea52add485a0200b391305503062f7813505d98 100644 GIT binary patch delta 44 ycmZ3ulxg8oCce|Wyj%=Gkj~_hvA1_4UjYYiOmcovYD{@%UP^v>%;s(mu`U2F;SO*B delta 44 ycmZ3ulxg8oCce|Wyj%=GpwH-@QP#PUuYiMBKRLfBRlhtlFD1WRe{(m7SQh{rf(>K< diff --git a/venv/Lib/site-packages/pandas/core/window/__pycache__/expanding.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/window/__pycache__/expanding.cpython-312.pyc index f2c55a1aa1979074f6bcca18aed924090126beb8..58f99f5da27107e167731f623c2418afa2eef28d 100644 GIT binary patch delta 44 ycmaEGknzDmM!wU$yj%=Gkj~_h(OIyO?}Zp|OmcovYD{@%UP^v>%w}fsyPg104G(4j delta 44 ycmaEGknzDmM!wU$yj%=GpwH-@aWrQm-wQEb{p9?jRQ>YIyp;TM{msnccRc|}c@EtG diff --git a/venv/Lib/site-packages/pandas/core/window/__pycache__/numba_.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/window/__pycache__/numba_.cpython-312.pyc index 692313f18f08be56e6710ae7fef796f5daf9c21c..1d5b52f0ec67136f54b4667b4393c8c86e785934 100644 GIT binary patch delta 42 wcmZ1*yEc~ZG%qg~0}!M$d1Rc`+Q@f{oi`>qzbG}PJTosPzdUC1SN0uh030q3u>b%7 delta 42 wcmZ1*yEc~ZG%qg~0}$vlx@Y8RZsfbg&a0oCUzDm}o|%`DU#`FTEBg*L00qAdkN^Mx diff --git a/venv/Lib/site-packages/pandas/core/window/__pycache__/online.cpython-312.pyc b/venv/Lib/site-packages/pandas/core/window/__pycache__/online.cpython-312.pyc index ee8eec5efde5be5af4ce9b6753c4e0c6ffbd11d2..5e001fa79c981dc46a7282decee6041cd1bf0744 100644 GIT binary patch delta 42 wcmeyS`c0MZG%qg~0}!M$d1UbNZ{$12!5fpDUz8eCo|%`DUmmmhB?m7T018138vpX&EcrR10EH*@eW=ip~71^_HD B4Cep< diff --git a/venv/Lib/site-packages/pandas/errors/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/errors/__pycache__/__init__.cpython-312.pyc index 638e9fbdef04e23465e02c4f195ff3f60714625d..af8a30e8253ec3d5ca47153d426f09443b1226be 100644 GIT binary patch delta 39 tcmccfk@3z)M!wU$yj%=Gkj~_hk(axXPnC@$Cbg(2zoenTydA0CRH(V*mgE diff --git a/venv/Lib/site-packages/pandas/io/__pycache__/_util.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/__pycache__/_util.cpython-312.pyc index 0dd42a53bceba780000276152dfb308d75820d49..f14906c0cbac6e49969c51e839780c542c8f78fa 100644 GIT binary patch delta 32 mcmaE(@J506G%qg~0}!M$d1PGL$oqwjB_=aJW-}{$Iwt_2=m~oO delta 32 mcmaE(@J506G%qg~0}$vlx@VMZCQgzTI3bF`4->o6mAxnG68N3=ACr delta 35 qcmZ3umucZ%Cce|Wyj%=GpwH-@v3%Y}zTI3b`kDFqo6mAxnG68GX$z46 diff --git a/venv/Lib/site-packages/pandas/io/__pycache__/feather_format.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/__pycache__/feather_format.cpython-312.pyc index 6ec7044a8db486d9e1b7e959fc75f8a37483a723..c923149011c7c05c6f8da2c24322f6f9d6c59563 100644 GIT binary patch delta 33 ncmdm@xpmU;lS~P= delta 33 ncmdm@xUs A0ssI2 delta 47 zcmaERndj|g9=_AOyj%=GpwH-@@n_FQJ_lYF{mgv*<{;koAYMiwX4)Ra%RE~K0B{Kn A^Z)<= diff --git a/venv/Lib/site-packages/pandas/io/__pycache__/spss.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/__pycache__/spss.cpython-312.pyc index b7069001fee127d1cad4c4351a1765e22b926e91..6cc69756d4cac5504dfdce353e62d08da7b6e10c 100644 GIT binary patch delta 32 mcmaDW@>YcRG%qg~0}!M$d1Rd1$h(f6B_=aJX7hgbbxZ)BObQkN delta 32 mcmaDW@>YcRG%qg~0}$vlx@WX)n;C@`Oa%bRRSSIp delta 35 qcmZ2@o@wEECce|Wyj%=GpwH-@!7zOz-+Mt8{mgv*&5S||rUC%CVG2wD diff --git a/venv/Lib/site-packages/pandas/io/excel/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/excel/__pycache__/__init__.cpython-312.pyc index 738c37a739392e7ffeb7866c02c446102e089aeb..5c4a016a17b4783e5a59058aa52c393a2b1893f1 100644 GIT binary patch delta 37 rcmdnRx{H%ZshyJ!WEO5ACp>?ub*0xoSLJ*S%h_&G62|w3oQTu diff --git a/venv/Lib/site-packages/pandas/io/excel/__pycache__/_odswriter.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/excel/__pycache__/_odswriter.cpython-312.pyc index 4a30de80a1c71f0ef386884d5bf168b296845194..dba2bb5165a29de72d5fc9a870ca5f0e6abb04ef 100644 GIT binary patch delta 39 tcmeyB{wtmDG%qg~0}!M$d1UD8Zsg--<%-G7k4ddaPR)tgtjc;-4*=|y3+(^^ delta 39 tcmeyB{wtmDG%qg~0}$vlx@Vly-pI$x%B7!~ub*0xoSLJ*S(Wvw9suqS3&j8c diff --git a/venv/Lib/site-packages/pandas/io/excel/__pycache__/_openpyxl.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/excel/__pycache__/_openpyxl.cpython-312.pyc index da9cb5addfe5e3f59d437ac60c4df54f8d035c90..d973fb10a756789bbdd24da60b6c3499cf289a25 100644 GIT binary patch delta 41 vcmZqO$=JG+k?%AwFBbz4q%(PBhy-lp`_0Z3lbIirT9KTZ6SG;EqbLLb_8<&Z delta 41 vcmZqO$=JG+k?%AwFBbz4=rg)!O!eK!_nVzdKQmuHwIVq+M}M<0M^Oj>^+^m8 diff --git a/venv/Lib/site-packages/pandas/io/excel/__pycache__/_pyxlsb.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/excel/__pycache__/_pyxlsb.cpython-312.pyc index 8aeb36554570d6c75e7cd6c58598fb474a33c9c0..a981901b3d4d856fbbb36f600f085a4acdc25026 100644 GIT binary patch delta 38 scmZqDYSQ98&CAQh00ikw9vQ70dHYznVlwk%QY(^Eb7D3xWr-C40Km-)6951J delta 38 scmZqDYSQ98&CAQh00jDs?ip+wdHYzn^fUAIQ!A2FbM!YaWr-C40IKc@(*OVf diff --git a/venv/Lib/site-packages/pandas/io/excel/__pycache__/_util.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/excel/__pycache__/_util.cpython-312.pyc index 99d376e4107722783cf0e95979d3040a70e54398..fbface06220087ce6f6ae11f402fe2fec3839f2d 100644 GIT binary patch delta 39 tcmdn$x7CmDG%qg~0}!M$d1QQ7*vQwz!WEO5ACp>?L{4441_ delta 39 tcmdn$x7CmDG%qg~0}$vlx@WAE-^ka)!lj>?ub*0xoSLJ*c?ruzB>>pT3y1&! diff --git a/venv/Lib/site-packages/pandas/io/excel/__pycache__/_xlrd.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/excel/__pycache__/_xlrd.cpython-312.pyc index fab443ad60efb774cf0e4735c25699305b4ddb7f..0531334dfa23ba0a96d56c98087eac53a9392d08 100644 GIT binary patch delta 39 tcmX@6eN3D0G%qg~0}!M$d1OQjZRFd|!WEO5ACp>;a0RY?#40Heh delta 39 tcmX@6eN3D0G%qg~0}$vlx@Vjb+{m|`g-bs(Uq7`XIW!(&Er{?Hyp3eJ27y!^v3%CFP diff --git a/venv/Lib/site-packages/pandas/io/formats/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/formats/__pycache__/__init__.cpython-312.pyc index d8a50d8d54ba8733d469e50c66bf03d2106bbad4..e999c8fb286155ed7ae1eebad75a86a55a31d46e 100644 GIT binary patch delta 37 rcmX@WbbyKXG%qg~0}!M$d1QQ_$orTlCNn=KEx#x?v7|U=;vW|P&xZ`x delta 37 rcmX@WbbyKXG%qg~0}$vlx@Wwb$orT_KQmuHEx#x?v7}gk;vW|P!}AOc diff --git a/venv/Lib/site-packages/pandas/io/formats/__pycache__/console.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/formats/__pycache__/console.cpython-312.pyc index 8dfd8a8fcefd99c834cf3fdec1c59a9bca75e627..09bacd1f522519c9a5e232c8e4b74c836f1455a4 100644 GIT binary patch delta 41 vcmeAZ?i1!a&CAQh00ikw9vM>H8~H4md15m2W76`AauZ96V>SmfTeATG$yExs delta 41 vcmeAZ?i1!a&CAQh00jDs?iqWyHu70A^XO;h>!;-xu(Nbwq^qW%a{t6 diff --git a/venv/Lib/site-packages/pandas/io/formats/__pycache__/csvs.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/formats/__pycache__/csvs.cpython-312.pyc index d4749c35c372879e56e30aea18cc8a420cfc4568..b6cfd6f6638d8cb40eb061755f559b9c37382daf 100644 GIT binary patch delta 41 vcmZ2hv8;mcG%qg~0}!M$d1Pd0ZRGpH!4s32ACs0}l$%&m9J85^Q^FVk2crzB delta 41 vcmZ2hv8;mcG%qg~0}$vlx@X8~ZshyI!K0scSW+C*EF!*LM4WNC4ggH7 B4le)z delta 47 zcmdnp&bqsumG3k!FBbz4=rg)!_%m(f`z6MspP8?pmS2>cSW>LtEF!*LM4WNC4gfmh B4O{>K diff --git a/venv/Lib/site-packages/pandas/io/formats/__pycache__/info.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/formats/__pycache__/info.cpython-312.pyc index 8015f3428cbc52984ec7f6d91a36078b6b3651fd..ce5c1e5f2b64debd85454c5ed6da7fe5b0e1b10d 100644 GIT binary patch delta 43 xcmdn~glYQ|Cce|Wyj%=Gkj~_hv8#C_U!XEiOlE#eT7FS(Vo7n#=4|CNeE>Vf4^RLA delta 43 xcmdn~glYQ|Cce|Wyj%=GpwH-@kz2o!FHo6BKQmuHEx#x?v7}gkbGGuCJ^&|M4n6cSW+Cbc@=xO9{>zR4QK!W delta 43 xcmZo%!`Qfnk?%AwFBbz4=rg)!$hmFgo50SapP8?pmS2>cSW>LNc@=xO9{~B13~2xW diff --git a/venv/Lib/site-packages/pandas/io/json/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/json/__pycache__/__init__.cpython-312.pyc index 759ac9ff360f7e521cf131d57c85a162887b049e..6b3f37114b8d8cc088f67843463ffb25f73e9499 100644 GIT binary patch delta 36 qcmZ3-ypEaoG%qg~0}!M$d1T0L$Byj%=Gkj~_hVS8vJ-wbZfn9Tf`tm6E$Byj%=GpwH-@k-ldm-wbX}{mgv*tm6DU{mtvS9ZmrN296Co diff --git a/venv/Lib/site-packages/pandas/io/json/__pycache__/_normalize.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/json/__pycache__/_normalize.cpython-312.pyc index 393fe07e8b635bef13de75103594b69b400702e8..3967631e3fcf0d7a770936d6a76c928c1a6c792f 100644 GIT binary patch delta 40 ucmey^&G@mKk?%AwFBbz4q%(PB#JFzcd&a~WlbIirRh*v}v-vO67bgG&xDD_C delta 40 ucmey^&G@mKk?%AwFBbz4=rg)!*f?+Gd&b16pP8?pRh*xvzxglI7bgJr#|;et diff --git a/venv/Lib/site-packages/pandas/io/json/__pycache__/_table_schema.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/json/__pycache__/_table_schema.cpython-312.pyc index b69dac40374af142e5852a5d5ed0b341158444b9..b450c45984026e12e88a0df0ff1cd7d253d38488 100644 GIT binary patch delta 38 scmdm#y(ydTG%qg~0}!M$d1Rc|+sLIGg*t#9st}u3x)sy delta 39 tcmaFK^pc79G%qg~0}$vlx@Vl($ScUmqo0|tUyxW-oLW?@KUs^>9stjr3cLUS diff --git a/venv/Lib/site-packages/pandas/io/parsers/__pycache__/arrow_parser_wrapper.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/parsers/__pycache__/arrow_parser_wrapper.cpython-312.pyc index bc73a46b353829065a9b3c456a9a15182caf3354..f36034a836919f2c75883cd3d0266766077421a6 100644 GIT binary patch delta 41 vcmdm-yg8ZgG%qg~0}!M$d1U14Y~-t8=84J7k10qjDo!mbj@dkkSy2xF{yGe& delta 41 vcmdm-yg8ZgG%qg~0}$vlx@UN3Z{(|B=F!j0*DpvcDo!mb*55pdSy2xF?WGI8 diff --git a/venv/Lib/site-packages/pandas/io/parsers/__pycache__/base_parser.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/parsers/__pycache__/base_parser.cpython-312.pyc index 2ce296b18518d9a85f72429f9c3784ef3b311d04..f4c4d1d60a1df79b6d9e1c395a75a8da7ff58760 100644 GIT binary patch delta 43 ycmX@Qi23LuX1>$Byj%=Gkj~_h@#(}yzCdoCn9Tf`g2bZY)S}{;&Dq?yjsgHRoDYBi delta 43 xcmX@Qi23LuX1>$Byj%=GpwH-@VRLvRUm!P+erCRYL1IyHYEiNN=4|d;M*$Z@4g>%I diff --git a/venv/Lib/site-packages/pandas/io/parsers/__pycache__/c_parser_wrapper.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/parsers/__pycache__/c_parser_wrapper.cpython-312.pyc index 9328e5f2181a1f44137a93c6a3823f36d525b923..8b4a153cba3e3b8f175c0b8b1023bea7d643fe80 100644 GIT binary patch delta 41 vcmdl}yr-D&G%qg~0}!M$d1MG$ZsfD)=ZVS8k10qjDo!mbj@cZ^pR5G{`gII! delta 41 vcmdl}yr-D&G%qg~0}$vlx@VM|Z{)M*=h4s1*DpvcDo!mb*54e-pR5G{_W=wK diff --git a/venv/Lib/site-packages/pandas/io/parsers/__pycache__/python_parser.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/parsers/__pycache__/python_parser.cpython-312.pyc index a7862d6c99a9ffb68e3460c81573536945fd0062..dd24f6320fd5a43db75e2adcf09173431d5871fc 100644 GIT binary patch delta 43 xcmbQ+#yq!;neQ|&FBbz4q%(PBY(BJ+?<6-*OlE#eL1IyHYEf~_=EvMt+W{j;4)p*4 delta 43 xcmbQ+#yq!;neQ|&FBbz4=rg)!c#AhD=8wWv5|^OXeV#{e}h51ar1 delta 43 xcmccK&U(F_mG3k!FBbz4=rg)!l!k2N+m*nhpP8>;kXTflT2!pR`AP!wV*nr_4ub#y diff --git a/venv/Lib/site-packages/pandas/io/sas/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/sas/__pycache__/__init__.cpython-312.pyc index e899a0cc9ab35df7f13a5da7af693fa0fcfd2c71..e562bb3af9ec89e933953dbd4a51886b56f36c9a 100644 GIT binary patch delta 33 ncmeBR>R{qM&CAQh00ikw9vL1JdG~O{Wah^dCl<#{yl4&pg*yqL delta 33 ncmeBR>R{qM&CAQh00jDs?isEVdG~PWXXfh{Cl>2Zyl4&pe0vDo diff --git a/venv/Lib/site-packages/pandas/io/sas/__pycache__/sasreader.cpython-312.pyc b/venv/Lib/site-packages/pandas/io/sas/__pycache__/sasreader.cpython-312.pyc index 975bc1a1407c11b35a1821032446bd03be830f54..a957637bfeba7b25d6518c8c36e424a72acd8880 100644 GIT binary patch delta 36 qcmX@4dq|h}G%qg~0}!M$d1M^l$a|idBPKIHrZ}-UX7dx~dqM!m!3+=p delta 36 qcmX@4dq|h}G%qg~0}$vlx@U-PenC!tNl9j2y8dQYcG+M63RetR diff --git a/venv/Lib/site-packages/pandas/tseries/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/tseries/__pycache__/__init__.cpython-312.pyc index 12f89ff26d59f67f53251a7f02bd35c433130f1f..bad0800c603fbf43074f5793b4a4d1d97b726452 100644 GIT binary patch delta 35 pcmcb|bdQPmG%qg~0}x~~d1M$)8Bsb5l@T9lbutUtM&(G~!zX9@!V diff --git a/venv/Lib/site-packages/pandas/tseries/__pycache__/frequencies.cpython-312.pyc b/venv/Lib/site-packages/pandas/tseries/__pycache__/frequencies.cpython-312.pyc index de803f43ac8d2f3f558e3298f2c32497d3c505c6..dcf149d3c0cb799e9bbdd73635c3ace2668971df 100644 GIT binary patch delta 40 ucmcb delta 37 rcmdlngK@_UM!wU$yj%=GV8G~}ami^T-x>}!{nC=m9R1A)I4Yb0&N~ZV diff --git a/venv/Lib/site-packages/pandas/util/__pycache__/_exceptions.cpython-312.pyc b/venv/Lib/site-packages/pandas/util/__pycache__/_exceptions.cpython-312.pyc index 6ca00f99fcb466bb11d808bc850d093a7cef74d7..47e22be99ebe03d2038139668f8fed269719c6d1 100644 GIT binary patch delta 34 ocmew)`$?AfG%qg~0}x~~d1Nf!$g9fC7E@Z1nG>_wf_WD=0IP=y?f?J) delta 34 ocmew)`$?AfG%qg~0}vQ6x@XvI`&O6tG%qg~0}x~~d1UO`$a|HEEvB?2Gbd*A3no?(0J^gZ%>V!Z delta 34 ocmaE>`&O6tG%qg~0}vQ6x@X926eyd=IC!WWV^!%0Ee3hm;e9( diff --git a/venv/Lib/site-packages/pandas/util/__pycache__/_validators.cpython-312.pyc b/venv/Lib/site-packages/pandas/util/__pycache__/_validators.cpython-312.pyc index 4cd998b254476d3a2ea183c745229e8f5cb5caf1..4c316bb42a9366d9dc81a863d3595787f9a36cc7 100644 GIT binary patch delta 34 ocmeAy?JVUx&CAQh00fy#9vMq47xJ;P#gvw0=EQ6kVJ$TU0HwYOm;e9( delta 34 ocmeAy?JVUx&CAQh00ah%?iqK?7xJ;P>6eyd=IC!0VJ$TU0HK8mIRF3v diff --git a/venv/Lib/site-packages/pandas/util/version/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pandas/util/version/__pycache__/__init__.cpython-312.pyc index 66b99c2c88460193f3877ae2aebf92706d7c5d6f..43bb7889874781b306a81495cd3317a8d0070961 100644 GIT binary patch delta 45 zcmeBK!`QQik?%AwFBbz4WHNbV_&ROm3uobrDJ{v&i787hD$dN$i`iVvGBXeWCi4z1 delta 45 zcmeBK!`QQik?%AwFBbz47%;kLa5-$`3uoceFD=Q;(JxCaD$dN$)8AaoGBXeW5-|-Y diff --git a/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-312.pyc index c623f8d3316628d88ae31d9e9713ef51bcfe0dc6..fe8fe004ccf23f08faac69294b1aba1f6f86e011 100644 GIT binary patch delta 28 icmZ3=x|EgoG%qg~0}x~~d1Mr9t^FU&CAQh00fy#9vPw=c?FobW8yRON>YpR5_4iEYcM?q0H&}CJ^%m! delta 38 scmeBX>t^FU&CAQh00f8Dxn(eKEQ)c^nh diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc index d2e5bc6e4c9a5a32d54a88f174f1f156a6b7b6f2..2618cf639a1ce7d7d59726b7c9b65597a8788804 100644 GIT binary patch delta 40 ucmX??e=eWzG%qg~0}x~~d1P2=ZsdE)%pDV-nOBlpl$V$jv-uzM1!DjL+zrzJ delta 40 ucmX??e=eWzG%qg~0}vcq=a#{&v61g7Gq-+xW?o5ZQC?z>{^ozo7mNWEpbkU; diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc index ee375d3b1d28ef32c844f7fd6e2a2860a23362f6..1a078920e70b72c52a49ba7f421a4f9abbd2f946 100644 GIT binary patch delta 40 ucmeyE^f8I=G%qg~0}x~~d1Nfn+{h=&!W|QznOBlpl$V$jvssVDSr-8RW(+t0 delta 40 ucmeyE^f8I=G%qg~0}vcq=a$i=v5`-dg$@r_2k?%AwFBbz4WHNbVm|AS)Tf)j66Q7w^l3J9Pm=m*kFRQIR02bs8W&i*H delta 42 wcmey>$@r_2k?%AwFBbz499rj=vCV8F-x5}C{rJqhlGLKS#2o$2ds%Jm0XZ5DjsO4v diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc index de0bdba1193335a4cf31ab09082c33e6ea76c360..998a22aedb6f38b7cb034214ffef7d91bde4a97f 100644 GIT binary patch delta 42 wcmey<%=D+3iSINoFBbz4WHNbVXvJ^jd&|Zh6Q7w^l3J9Pm=m*^js05{0350g1poj5 delta 42 wcmey<%=D+3iSINoFBbz499rj=5frnL?=2g*etc$LNorAEVvhc1Hui5-05;1G(*OVf diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc index 988daa529a3e270991613a2ab0170e8e882651aa..3848e33ccdbb06c656d18f5d82278639a578c9de 100644 GIT binary patch delta 40 ucmaE?_E?SYG%qg~0}x~~d1Ne>*~qtxi904fGp{7IC@(Q5X7gpH2?7B3Lk$c7 delta 40 vcmaE?_E?SYG%qg~0}vcq=a%t7dL!R1CT{)s%)FA+qP)Z${mqw|CI|ok6!H!M diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc index 873b03fe0d18125efd8be6e0bbf810a3fa12cb9e..5e681f5ad693b67b8a8e9bdc8278ef61c74c7c6e 100644 GIT binary patch delta 40 ucmdlGv>}M^G%qg~0}x~~d1P!-+{mZE${iD*nOBlpl$V$jv)PjMyD|Xj+6-O* delta 40 ucmdlGv>}M^G%qg~0}vcq=a#WcVI!XcE4O}pW?o5ZQC?z>{$@+o@5%rHRt*jS diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc index bdafee07b442316b1292c55ad2c3c31560f4f958..16054d15b6712c8b0f4a9dab56c61e8504094630 100644 GIT binary patch delta 40 ucmX?^bux?ZG%qg~0}x~~d1O@UZ{+i0! delta 40 ucmX?^bux?ZG%qg~0}vcq=awOSN+P&CAQh00fy#9vK}Ic@OZ%#AoJ}q!#5R=ENlDWX4RqV*~)&ObpZj delta 40 ucmeBU>SN+P&CAQh00f8Dxn;CWZ2 diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc index 08bb3507f179defa7097468cb8e0ba010b2d1af2..4ecc7fb2118e7385d3ccf1a3e88aaf974996600d 100644 GIT binary patch delta 43 xcmeBl>U82g&CAQh00fy#9vSC0^4{jU82g&CAQh00f8Dxn(GAfcs`KtG%qg~0}x~~d1P=ZZ{$0}!5fcs`KtG%qg~0}vcq=awO>w2|)&2fu!NW?o5ZQC?z>esWHx{^pk)&*T9_o)2dL diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc index f11cac483cab21b7331a0faefc0e782d7007e59f..02ba05324677547ebdcabceb3f9d39dbdc36c0fa 100644 GIT binary patch delta 46 zcmbRDmT}%&M!wU$yj%=Gkjdncv8Zw*pOFxMOnhcuNorAEVopqQPG-zzehD77l;_ diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc index a8ff6488add8186e0f4b2c56c9cbaa62088b06cb..06be0eb0731510253f90f7e7d34b4775ca050893 100644 GIT binary patch delta 44 ycmZ2hx~!D%G%qg~0}x~~d1N?iZ{%CX!XFc#nOBlpl$V$jlbn+ov-vQ~V^aVs-44$H delta 44 ycmZ2hx~!D%G%qg~0}vcq=awO>wUKWb3%`DRW?o5ZQC?z>esWHx{^r9hk4*tTA`c`0 diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc index 650966c033da3e1eeb600bf7e3ad752dd09e0ee3..356d0fff62bf1811a84ad1d1954db00cdd648ce0 100644 GIT binary patch delta 43 xcmdlYvPFdVG%qg~0}x~~d1QRq$UB#nKPEmiuOzi7FEJ-3IVUq_^G?=k762Dd4g&xH delta 43 xcmdlYvPFdVG%qg~0}vcq=a#WyBkx>Re*O5&ypq(Syu=*+=!kBQIBD@iTNOU#K$&dH3KEXx=K0Qy)AP5=M^ delta 42 wcmaFQ^qz_LG%qg~0}vcq=ax~jk(ZH?Uq3!GuOzi7FEK|yIVV$pvMgf|01&eb!~g&Q diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc index 91d203d4907d1f7dae3177de442a70c983caa8a7..2f4f4b00c3e272f37fb8d64d194a0e67d441534b 100644 GIT binary patch delta 48 zcmbOwKTDqXG%qg~0}x~~d1S2H$lJ{&5)+@9SCU$kmzWcioS&PUn3qxK!D~{Qm I%zBs=0Faar`2YX_ delta 54 zcmZ1`woHugG%qg~0}vcq=azAvZ6luztE7H>W?o5ZQC?z>eoAI>Nl|7}X-Q^&Ua|h> IWY)v10L=^%K>z>% diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc index e4949acce9f584f74bd69dc54ba694417a14e1fa..71ee4cd859ce85bdf299cdd4eeec609cd059f4ba 100644 GIT binary patch delta 53 zcmbQkJBOF|G%qg~0}x~~d1Rz-gctDWvG%qg~0}x~~d1R=vZsaRql8lMZ%qvMP%1g|NNy#iODauSLEy>K!D~{Pb Iok^1o0HgmA4FCWD delta 54 zcmX>gctDWvG%qg~0}vcq=a%u8Wg}k!lcaupW?o5ZQC?z>eoAI>Nl|7}X-Q^&Ua|h> I=}ekz0OAf3U;qFB diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc index f6575a7e3fc2bb7dd1edbd0ce8a49e1dbf1f2e32..63868825ff33e176bffe95545bb6bdd51d30765d 100644 GIT binary patch delta 42 wcmaFB_<)i3G%qg~0}x~~d1NR|nE1@RlGLKS#GIJSyp+_6n9aA@X8QpE Dknj;* delta 48 zcmeyiit*bjM!wU$yj%=GaA=)d#yN+Le0$gg_2V=1N>YpR5_9x3^HNeP^f%vTo9zbx Ds{9e$ diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc index eac6e0633296e6745ef546f801bed20d76023820..d7a866fe1debbaddb6316ee104f7510d59afc63a 100644 GIT binary patch delta 48 zcmbQfk7@coCce|Wyj%=Gkjdncac%lWJ_#YpR5_9x3^HNeP^f#MxJ(vOj Dh&vGL diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc index 7b678ee226dd75f41f15e090b0a4aa7af07fca0f..8412079dcf8ed4182822b6f6d0a5e82810bd934f 100644 GIT binary patch delta 46 zcmdmzv?Yn}G%qg~0}x~~d1UY^Z{$;85sZn?%qvMP%1g|N$;?Yht%%ud&+=6V05QQ1 AXaE2J delta 46 zcmdmzv?Yn}G%qg~0}vcq=a%t7aU-7si=cjdW?o5ZQC?z>er8@uYK8u0dzP;{0A%wI A#Q*>R diff --git a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc index 2807f4ea337a583429206fae43dd922b784843cc..fa49a4443c267d72f29314c7191579a90f035823 100644 GIT binary patch delta 52 zcmZo@W^8C?eolUJVo7FxUa|h>Q05G7 E0FvntaR2}S diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc index cbec41af013e70ce4ed77c78761634ae15167f56..29fb874d735c93f9e390ad6aae3625b0836a2c99 100644 GIT binary patch delta 49 zcmeyQ`$?DYG%qg~0}x~~d1Mp|Zsdz#7m10_%qvMP%1g|N$xSUuOi3(BjM-epUcnCl DbJ!2r delta 49 zcmeyQ`$?DYG%qg~0}vcq=a%tVU?X1yyNG^#W?o5ZQC?z>er{?>VoG93qW~h delta 48 zcmdliwpon#G%qg~0}vcq=a%8Tk=K`5L_a<=uOzi7FEK|yH?<@&C9xz?e{&x5QFZ`e C;SY=e diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc index 86950b7b06902c15bb1f542164c28bc3ec6853ee..2fa19c4503de4b406a662a09b7a87cf48e70d0f3 100644 GIT binary patch delta 51 zcmew{jp@fUCce|Wyj%=Gkjdnc@iBcPUm~kWOnhcuNorAEVopqMYDr>BVo74m=4RHf FtpL7`5|97@ delta 51 zcmew{jp@fUCce|Wyj%=GaA=)dhH>gfzC>0L{rJqhlGLKS#2o$H)RM%M#F9k)&CRS| FTLHp85=;O9 diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc index 852734f586bff81843287a8f5be125396c4e2ebe..6ee9629c35e1f374db5d8cd92699d84c7d8cd1e1 100644 GIT binary patch delta 49 zcmZ2hy{ww=G%qg~0}x~~d1QEMY~(X!5s8V<%qvMP%1g|N$xSUuOi3(BjM*H_5^MBVo9QYW^O@#QAti_ KlKx~xMq2`B#$nG%qg~0}x~~d1Or7$m_r)7ZabESCU$kmzWcin_7~Xl30=$lbKtPUsRHl MnG~}*n`sgk03(AF?f?J) delta 58 zcmew>`B#$nG%qg~0}vcq=avz*k=KDqPCq^~uOzi7FEK|yH?<@&C9xz?KQp%=zo;Z9 MGf97QHq#_7068fX1^@s6 diff --git a/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc index e7b3c5435436f367f495e4ebaf0aa07922506203..385e0532c12fbc2a166ab2a131c8dce1ddb819fa 100644 GIT binary patch delta 59 zcmaEv@iK$&G%qg~0}x~~d1Uw~ZsZeZlZ%PZ%qvMP%1g|N$xSUuOi3(BjLFO`$S*3% N$xMpb?98U72LLt!6R`jQ delta 59 zcmaEv@iK$&G%qg~0}vcq=a!MFu#r!kO-?^PGp{7IC@(QbKR2}`F(t7iQ9m=cAit<2 NCo@TZvoo8T9spVr6dV8m diff --git a/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc index 84afb51e52f88ecb63175a461bbfc48b6f8fd85f..c82125153ce36c9c524f04c3c9b9995ef9439347 100644 GIT binary patch delta 58 zcmZ1yz9gLYG%qg~0}x~~d1Tz($Xmc77ZabESCU$kmzWcin_7~Xl30=$lbKtPUsRHl MnG~~mHVdaZ04it``~Uy| delta 58 zcmZ1yz9gLYG%qg~0}vcq=a!+ck+*0{~QR B4+{VQ delta 47 zcmdlUzCE1pG%qg~0}vcq=a%tOY9pT(vygs#W?o5ZQC?z>er|qBYEH5KW-sPk4FGW? B51Rl0 diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc index 7c96a2e952844c819136ef359874abb2b0c73b7d..99ed746c547a7cca2be76504d44ea3f0c3667d6b 100644 GIT binary patch delta 47 zcmeyZ@LPfJG%qg~0}x~~d1SC~ZRFd}Boq^$nOBlpl$V$jlbfHCno}IJ`99MeUI0+o B4}bsw delta 47 zcmeyZ@LPfJG%qg~0}vcq=a#XJb0gn=CL#U!%)FA+qP)Z${oMSN)SP1d&G(t+@B#pT C^AN27 diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc index b483a1d996952f7bad41dc6a4de6d7379ce0d019..0a06f4cb3e64ca86897ad5becab8bc296d39fb16 100644 GIT binary patch delta 46 zcmbQnJB^q3G%qg~0}x~~d1NSUdiiyw6D@iTNOU#MM%}+_qDUR8k%xugI02NFP AIsgCw delta 46 zcmbQnJB^q3G%qg~0}vcq=a#{?k=KP;NIyO^uOzi7FEK|yH$Npcr&xb;GP5x=04sS7 Ang9R* diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc index a7f682cb3808d81c36e5c774d2a83c7f06b548ae..754a1d065177c72fef96b21e3cad7dcc47f24358 100644 GIT binary patch delta 46 zcmca1cteo)G%qg~0}x~~d1P2^i3e0b)!L AR{#J2 diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc index 667312652f76f7b3a95b6cdfd5330c842ec959c8..71f75120211e549909613e835d2b45dda888bebb 100644 GIT binary patch delta 46 zcmdnYx0#RkG%qg~0}x~~d1Nfx$ZNYpR5_4j5^HWlDieolgvIp}603iAe AkN^Mx delta 46 zcmeCt?a}2u&CAQh00f8Dxn&4!GbGG%qg~0}x~~d1RPOGbGG%qg~0}vcq=aykKk#~u(etc$LNorAEVvc@ZYDsy1QMUfXBSru~_77?R diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc index c3661311ce57075b7e94f2ad7eece28dc0e8db0a..17bf668bccfb66e3d26589e33161ae83b0ef983b 100644 GIT binary patch delta 50 zcmaE|n(@hMM!wU$yj%=Gkjdnckr%X)uZ2Z8CO$K-B(*3nF()Q3wWK`1C_85JQWpC_ E0G>z@82|tP delta 50 zcmaE|n(@hMM!wU$yj%=GaA=)dhHbz`z7`f?{rJqhlGLKS#2o#+)ROZ2qHO)mOIhp# E0ka|zVgLXD diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc index 91cc5729cd370d38847ec40902ad2a5c68fc471e..be4f38ba885d7a683f70512e368aa1954f070677 100644 GIT binary patch delta 47 zcmaE7^v;O)G%qg~0}x~~d1Rd2$eYL{921|JSCU$kmzWcims(PuUz8oQxsmCu7yxP# B5NH4Z delta 47 zcmaE7^v;O)G%qg~0}vcq=avz_kvEY^SU)~9uOzi7FEK|yFSVpRzbIROb0gDRF#va{ B5PARr diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc index 0a47edf46a3b4a8a1941cd0f42fc4d0b679b2788..fa8e45fbbc9cc4e71bc84319e2afcbe830eff343 100644 GIT binary patch delta 48 zcmaFp^w5d#G%qg~0}x~~d1N$5Y~=gJEF2S`nOBlpl$V$jlb2djo?nz5vss$OO%?!m C(ht=D delta 48 zcmaFp^w5d#G%qg~0}vcq=az9yd?Vj4W?}vK%)FA+qP)Z${k+tY^8BJ~{ms%WZn6NI CGZ2;l diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc index e350bf67551fb821757bdc618c7dd49f8a69741f..49164d2fc7697519c8c63187026f9cce8bcc0729 100644 GIT binary patch delta 48 zcmZpVZja_W&CAQh00fy#9vLg-Hu4!T3&+G~=9Q!t%iSgVdM!wU$yj%=GkjdncA>_T0FO6L|CO$K-B(*3nF()Q3wWK`1C_83zJNt1* E0Dfu^ng9R* delta 50 zcmX>%iSgVdM!wU$yj%=GaA=)d2AAhXzBG1W{rJqhlGLKS#2o#+)ROZ2qHO)m?d-=L E0hl`x3;+NC diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc index a0f78baf1ca6d50e1f52092b1603d67f8d2af14d..c672d8e91a3ab03d7fabf681323d9a77053e6242 100644 GIT binary patch delta 48 zcmX>qcvO(@G%qg~0}x~~d1QDBY~<5s5srz^%qvMP%1g|N$xAIM&o9c3+3dqo$pQdB Cs}6Yp delta 48 zcmX>qcvO(@G%qg~0}vcq=a%u3eeqL%xd45s0{$?MRN)`ZZ C@(+{% diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc index 0f81fc2d93dce8b944bb5e0f4ffcf600144b0611..57e758f473274c2fe4b3fe1ddc19b615a0e5cabd 100644 GIT binary patch delta 45 zcmdnXxR;UpG%qg~0}x~~c}(Qa7mJC{%qvMP%1g|N$uCGPN-W9D&nu3ZI6)TxBa9BM delta 45 zcmdnXxR;UpG%qg~0}vcq=Qfc$UrawfGp{7IC@(QbKffTgD6u3nKd)GS;sjj)JBSY{ diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc index b68d8cc0254067ad7590715218a9b1d9977ce461..249d6ed2e91a27f6384dd2cc58667962935651e0 100644 GIT binary patch delta 51 zcmbPiJ=vP?G%qg~0}x~~d1M4iZ{+h~5sQh>%qvMP%1g|N$uCGPN-W9D&nu4ET)?6% F2>@~|54`{Y delta 51 zcmbPiJ=vP?G%qg~0}vcq=aw-|Y9pTyiettn}QDRAEeqOQu<^mRF FNdTBN5Pbju diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc index cc707f8049216420b44fbd87306d288b06f42d01..07efaba639193fd03f57e69fa01ed6791ebfb2ce 100644 GIT binary patch delta 53 zcmeA^$=H38k?%AwFBbz4WHNbV>?+vEr_3Q16Q7w^l3J9Pm=lvjl9``Z9JAS- H!zBg)zC#hC delta 53 zcmeA^$=H38k?%AwFBbz499rj=@gR32pE8G-etc$LNorAEVvc@(L26NANoIatvHoUv H4wo1J-|P}X diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc index 4c911b01d430d7e78eb40ed2798adcf771a62185..e2dddc630ea67a90f23f3482e3c2b2dc0efdfc18 100644 GIT binary patch delta 51 zcmX@ic$kszl}5r6;y diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc index c1e9b2cbeee10564cc37feb28df97d21e9b8e3c3..ed4f98e1eb318270a72bfe5c0695fec086f64c2a 100644 GIT binary patch delta 57 zcmZp-ZMWq+&CAQh00fy#9vRuf8~HL>WMbko^GZ^S@)C1m@(WUn5=%1k^NM4VN;7j( LVm41^`63Ab;)fGH delta 57 zcmZp-ZMWq+&CAQh00f8Dxn(>M+Q^s5BBLLlnOBlpl$V&JpI?w#lvt9PpI5A(RGOKS LqQ7}E%NI!i6Oj}F diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc index 1eb5ae37c0d08d3284334752aab814576b82c64b..871443d9b6bdbbb9103460ba0ca05484fc660c4f 100644 GIT binary patch delta 56 zcmcb>cY%-hG%qg~0}x~~d1P$e$a{=MCMG^JuOzi7FEJ-3zaX_Ju_QA;uQ(>DG&3h9 KX7hWNL?!_LR1>xU delta 56 zcmcb>cY%-hG%qg~0}vcq=a$j8k@pyjjDCD(UP)?EUSf`ZenDzcVo7FxUa@{sX=YA} K{^s{AiA(?&NfX`x diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc index 191ca44ac3182915ef72ad84a40248098c51a230..edc7896ebb917109d80f48ff010c64284efab04b 100644 GIT binary patch delta 56 zcmeyw_lb}9G%qg~0}x~~d1Soa$a{%JCMG^JuOzi7FEJ-3zaX_Ju_QA;uQ(>DG&3h9 KX7g{BawY&6MHF5D delta 56 zcmeyw_lb}9G%qg~0}vcq=azA3Bkv^^8U6Uoypq(Syu=*+{DRb?#FEVXykh;N(#)I` K{ms8w%9#K!-4uiX diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc index 49449e8681c0637493faed222bdd821686109792..acb3bead033c3831a0f1dc78098222d3bb51d80f 100644 GIT binary patch delta 56 zcmew;{!yIwG%qg~0}x~~d1O4;$Q#Te6BD1ASCU$kmzWciUyxdqSdy8aR~(a6nwgUl Kv$=+)lpO#D9}{Q* delta 56 zcmew;{!yIwG%qg~0}vcq=aw;TBX2N^jDCD(UP)?EUSf`ZenDzcVo7FxUa@{sX=YA} K{^lB%Qg#3suoGYpR5_4km3sQ>`OEUBGier*WGjmd6 KHW#x~a(T~r}D@iTNOU%*FFGwv)EXmBzE7ngc&CE&B K-(1Wh$piq`$q~5# diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc index 820a1871224cf93a3f14ca91f268af630bb211c8..fbffa562d777c462e00e76931786ceee0d8506b3 100644 GIT binary patch delta 56 zcmaFJ|B#>eG%qg~0}x~~d1P$g$g9aJ6BD1ASCU$kmzWciUyxdqSdy8aR~(a6nwgUl KvpI;hp9ui(Rua+x delta 56 zcmaFJ|B#>eG%qg~0}vcq=a$jAkyn#dMn66?uOzi7FEK|yzaX_Ju_QA;uUJ2+G&3hf Ke{&FPKNA23Iui2$ diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc index b030e3b968a81e1c9c3657d1e2989cd13b71a7b6..cc1f31d6f58947e4fc9c5bfb2871b64667ea6860 100644 GIT binary patch delta 57 zcmca8cTtY-G%qg~0}x~~d1S=#Y~(w^EE5x-nOBlpl$V$jlV6Zplvt9PpI01{RGOKS L60`Xeb38Wy00k47 delta 57 zcmca8cTtY-G%qg~0}vcq=a%tjl9``Zte=@zT#}fR Jqd)P25dhQB68!)G diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc index 0ee9811c99504e5ea23866e527c2ac10b556b0e6..ee82a7e5a61a5e9ee9d184b778832128eb22e55d 100644 GIT binary patch delta 58 zcmbQpH<6F`G%qg~0}x~~d1M%D*J7%iO*g` PE=kPEiP^l1qp=zQV$Buk delta 61 zcmdnp!L+-BiSINoFBbz499rj=u|8`fUmu5@etc$LNorAEVvc@(L26NANoIatv3_P= PaY;M1& delta 46 zcmX@Mg7Mf2M!wU$yj%=GaA=)dhL_hyz9$^~`tg~0C8BhiSINoFBbz4WHNbV$oFmJvk>NwiOBhiSINoFBbz499rj=(bBb%&qA1AKRz?BB(*3nF-N~BwNQU^sPM)n09Bd~ AiU0rr diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc index 60fa5d5b66b8ff512680075c2a62800791e19bc9..8e023fbcbb1bbebef8de505ec8a485d4afbef220 100644 GIT binary patch delta 43 xcmZ2wvC4w?G%qg~0}x~~d1PGQ$ZNvP9}}OMSCU$kmzWb%lv)_GIe__=1OO7T4aWcg delta 43 xcmZ2wvC4w?G%qg~0}vcq=a!MMk=KNoUq3!GuOzi7FEK~ID78?3a{%)#2>>1W4a@)l diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc index bf06e8b2c740a15c674365178a4f5d8531593987..863f7ea34d801b1ffe9aa880634298b537b115c9 100644 GIT binary patch delta 46 zcmX@v$aJ!iiSINoFBbz4WHNbV6eMlrTg%EH6Q7w^l3J9Pm=jZ!S{SqW6zl&g082;^ A761SM delta 46 zcmX@v$aJ!iiSINoFBbz499rj=@jQMb-&$6F{rJqhlGLKS#2o#i)I$Bur&#}20RV64 B5e5JN diff --git a/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc index 9340045c25c469b4ec0e10e164946763e4c5baf6..d62708a9fe1adefb8d2b72628f7128cde3735177 100644 GIT binary patch delta 45 zcmdnXxR;UpG%qg~0}x~~c}(Qa7mJC{%qvMP%1g|NDM~HQ&nYd*%+HINI6)TxBtQ$ G)&&6QJQI8X delta 56 zcmX@Xc!H7pG%qg~0}vcq=Qfc$Ur|3kGp{7IC@(QbzbLghKc}=LGd~Z)EKAMFOwyk? GTNeNX=M&2S diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc index 921811fa4d2fe1a01293f33241dede3284128905..9af71ff23cae8a46b4ae3242bc022404cec6434c 100644 GIT binary patch delta 61 zcmeBl>~!Qk&CAQh00fy#9vO!=@?K<8jET?8D@iTNOU#KWN-fUMDJ{v&&x0__Qgbqs LVmAM0>XHQjX1EqI delta 61 zcmeBl>~!Qk&CAQh00f8Dxn-Dc2Lne)Flf5Zod`u diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc index 36bf898d35a848d5057343a72b65f1a0445226c2..395c70cf007dec415038cfb9338d3632c2f2614f 100644 GIT binary patch delta 64 zcmdn?mT}u#M!wU$yj%=GkjdncF)?H#Ul^-mOnhcuNorAEVopp^YH@x}X-Q^&9)wwz OnvVkun+*pTNf7q delta 64 zcmdn?mT}u#M!wU$yj%=GaA=)dhE32$zA#or{rJqhlGLKS#2o#i)Z+Y{(vr;lJP5Na OH77Gke{(CVVIct7SQiff diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc index 11f3ad0ad4d6293aea5292a43fc3b0a2ab274bce..7e4d173594617256a12e598bc5c8ab35c86c5394 100644 GIT binary patch delta 64 zcmaF$i}BSjM!wU$yj%=Gkjdnc5zx4iuZ>+XCO$K-B(*3nF(;-dwKzYgv?Mb>55g=< O&B;uP*}Ro~YbgNj9~f}} delta 64 zcmaF$i}BSjM!wU$yj%=GaA=)dhDzN=zBYD6{rJqhlGLKS#2o#i)Z+Y{(vr;lJP5Na OH77GkfAd!Mt)&14G#HTp diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc index c06c45d495a4c6bf4f3668613c45007e84cf39b4..d67ba5619dd08d3660595d8eabcd0ec46cb9c97f 100644 GIT binary patch delta 61 zcmdmCu)~1&G%qg~0}x~~d1O4<$g9n&7!#kFSCU$kmzWb%lvina2kJRJRph delta 61 zcmdn5wqK3+G%qg~0}vcq=awO}k++ydQ9nL2uOzi7FEK~ID7830r?ez9KM%qzOU=nl L(%-z0WgZ^@XF3&L diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc index 2a99cbc1618b00242767b0c841d937822fb7cb43..7eedc6ca4d1dcb3c0456a6bc38540fb63c71b99c 100644 GIT binary patch delta 61 zcmbOmIX9B`G%qg~0}x~~d1O4>$a|AXF(y7UuOzi7FEJ;kD7830r?ez9KM%qzOU=nl LirLK0JWUe-e&-d} delta 61 zcmbOmIX9B`G%qg~0}vcq=a%8Hk@qH(qJDg4UP)?EUSf`ZQEG91PH9PIejbEbmYS29 Lq`#S+d735wf}$0G diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc index b5ff8973e22e9fdef78a9cd75f983cc6473bdf35..b3dc88025a635cf70f5e17b371b8b893635f5a80 100644 GIT binary patch delta 62 zcmdmR diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc index 16a8d73df7a590b36fd7c57b3df28c34e53adbba..bb12f0f25503a974c9c9891c6b442a14bf8ddbdb 100644 GIT binary patch delta 40 ucmdnNxPy`VG%qg~0}x~~c}(Qa7mSI|%qvMP%1g|NDJ{v&DUO-gtqTC$#teo4 delta 40 ucmdnNxPy`VG%qg~0}vcq=Qfc$Ur;|jGp{7IC@(QbzqBMXr&xbtw=MwjbqxXl diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc index cb188e11bd006866ebd3ad643e3deaba6efc7bec..865a4a4af00f43613c64a7635102be16f0e979d9 100644 GIT binary patch delta 45 zcmZ3hyjGd_G%qg~0}x~~d1SO~I&j@hil-pvI78}|)} delta 45 zcmZ3hyjGd_G%qg~0}vcq=awP9k(Y&CP(MC1uOzi7FEK~Iv?Md9Sbwt;dp8#VD7y`p diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc index 854e0457b39b06cdd3a8a1fa68cd0fe744b96875..d51795844d83eb5ebfb7e4b4b320253b2ad32122 100644 GIT binary patch delta 46 zcmdnbx1W#iG%qg~0}x~~d1T14Y~;JlBp4H)nOBlpl$V$jQ(BUlQyjDT6O%6s04l}~ AasU7T delta 46 zcmdnbx1W#iG%qg~0}vcq=a%uEc_ZItCPDr9%)FA+qP)Z${nC=moMQdWpO}1E09_9c A#{d8T diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc index bbddfb3d38b1d1cf04f256afa4e9d69cb506ece2..28ecebbec95bf74937be0891f5d7281210a9bcf8 100644 GIT binary patch delta 45 zcmcaFbYF<~G%qg~0}x~~d1P$e$lJpt7!#kFSCU$kmzWb%T9TPl9J6^9(^fVBJN^$R delta 45 zcmcaFbYF<~G%qg~0}vcq=a$j9k++9QP(MC1uOzi7FEK~Iv?Md9Sby^>rmbuMPW}&X diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc index 158d3bcbeeffa7fe3baef768d6592f363219e629..9003310e85ec2cb0e1c03722b70e9154baa139d1 100644 GIT binary patch delta 45 zcmbOwI7^WCG%qg~0}x~~d1TDq$Xm-K7!#kFSCU$kmzWb%T9TPl9J6^g(|=X~ANUTe delta 45 zcmbOwI7^WCG%qg~0}vcq=avz(k++sfP(MC1uOzi7FEK~Iv?Md9Sby_urvIz}F~kn( diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc index 64b6bbd81ccf4b741370121f2da3f115906380bd..8862f4a2f207d9db1140a9a9d0d59632c93579c4 100644 GIT binary patch delta 45 zcmZ3dy-u6=G%qg~0}x~~d1Nfx$Q!{d7!#kFSCU$kmzWb%T9TPl9J9HM*+K{aD=`ic delta 45 zcmZ3dy-u6=G%qg~0}vcq=a#{^kvD=_P(MC1uOzi7FEK~Iv?Md9SbuXFvxN`lO|GMDq@l diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc index 355573d7569d271c5e5829374547ae47bdf822f1..afda5be30aa1638eb854e0f9919019d5605217a8 100644 GIT binary patch delta 45 zcmeB|?3d&{&CAQh00fy#9vSa9^6q99jET?8D@iTNOU#KWEy>I&j@f*Zc^d}+E}{=I delta 45 zcmeB|?3d&{&CAQh00f8Dxn<1X$h(_aP(MC1uOzi7FEK~Iv?Md9Sby_P=4~7RK9Ub! diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc index 2304fbfdc787ebbd965eab4fa29bf40de0431977..1133df0f3da4768287347d27b32751e10ab867ee 100644 GIT binary patch delta 45 zcmaDX@K}KNG%qg~0}x~~d1P$e$UBKuFeW}TuOzi7FEJ;kv?Md9IA-$(*3C=+J*f{j delta 45 zcmaDX@K}KNG%qg~0}vcq=aw;XBkv?uLH+p5ypq(Syu=*+(vr-aV*Sk*g08us$ A`Tzg` diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc index d406f35a48ec9a76c6cd807e354a82a13291637a..7ae6b46992c7af5fe9413cedb2772970a3b5eca6 100644 GIT binary patch delta 45 zcmbPkHQkE$G%qg~0}x~~d1TDq$m_`}7!#kFSCU$kmzWb%T9TPl9J4u{b%QtnCYKIb delta 45 zcmbPkHQkE$G%qg~0}vcq=a#{=k=K(|P(MC1uOzi7FEK~Iv?Md9SbuXm>jrTEE{hI4 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc index cc0a56a0efe6f5d345ee878cee29ab74b99ef60a..def56fbc32eae8192e1d4eefdac5ffe7b3df343f 100644 GIT binary patch delta 45 zcmZqVY~I&j@kU0X&NH{B{~l2 delta 45 zcmZqVY~OjPC3JG0F~f diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc index 33d7e9078db02555a89ddd8a63f408f2ebf9e4fd..89c3a26966471a2526d75f637c8ba1a4ab001de5 100644 GIT binary patch delta 46 zcmexv_1%i^G%qg~0}x~~d1Oo#*~nMTA{Y~&nOBlpl$V$jQ(BUlQyjB-7Ry};090TP Ax&QzG delta 46 zcmexv_1%i^G%qg~0}vcq=a%tLcq3mmi=cjdW?o5ZQC?z>erZW&PO<*xSuA%Y0D0UH Ao&W#< diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc index 9817053dbd61c7916947be3f1aa0fd76905e5107..5737a69696d49e0d37b740230769f10fd53f0e34 100644 GIT binary patch delta 46 zcmaEr`6`p|G%qg~0}x~~d1S2D+sMboDi{-=nOBlpl$V$jQ(BUlQyjBdll7oJ09fr0 AO#lD@ delta 46 zcmaEr`6`p|G%qg~0}vcq=avzyyOEEJRZu@ZGp{7IC@(QbzqBMXr&xcpChI|c0B9Hw AYybcN diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc index 7d5fd2b3d67a1f86a190e6b55a816f515d9403aa..a02072f8ff59f321e4cf854755ab65350fece186 100644 GIT binary patch delta 48 zcmdnj#k8-BiSINoFBbz4WHNbVgvD>8jlm82HsCFaDGmSpA>$8283^q3t0Bq0vd delta 45 zcmeAb?G@!c&CAQh00f8Dxn-=}$lJpts2`u1SCU$kmzbkpT9TPltiO2`(_?l3IE@b| diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc index 5b88cc714b4ec4b02d2155a67e52bb49be56a40a..58c3ae139e967f8b3beab6ab258b555e78dfba1f 100644 GIT binary patch delta 45 zcmeAX=@H>Q&CAQh00fy#9vP(@d6%*X#>8jlm82HsCFaDGmSpA>$80{#;>ijC8&nPs delta 45 zcmeAX=@H>Q&CAQh00f8Dxn+5G@uRv diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc index daa00a5efd75bb8c2511009c93328e437598509c..fd9e18577d8ce39d6f3bb8b031f93a7a9be22b14 100644 GIT binary patch delta 46 zcmZp6X?Ec|&CAQh00fy#9vQz?Hu7<^2*$)`=9Q!t?#Pi{+*)07%9T A^Z)<= diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc index 8d40b61bc605008243b4f09bb4f2d90bfc096145..b01cd06360d751a62c518fc094710afbb93edc10 100644 GIT binary patch delta 46 zcmbOnH#v^)G%qg~0}x~~d1Q2`Zsa@5EEp4?nOBlpl$V$jQ(BUlQyjDT4YRs707cOc AJpcdz delta 46 zcmbOnH#v^)G%qg~0}vcq=a!M6vXSpBv!H%_W?o5ZQC?z>erZW&PO<*xH_YnV09xP= AkN^Mx diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc index 0020fae3417608672ee20396c0b715cb42ea2ee4..147eb2be379d6c5c23df401bdfef5d9d82696f2e 100644 GIT binary patch delta 46 zcmcZ^b~B9cG%qg~0}x~~d1RC+Z{#y%5sZn?%qvMP%1g|NDJ{v&DUR73z{05x07se* AO#lD@ delta 46 zcmcZ^b~B9cG%qg~0}vcq=ax~bw2{w{MNmIJGp{7IC@(QbzqBMXr&xb;01Kx&0AUmk A#{d8T diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc index c0613f7ddf6421e46fc6ed7c66749a0fa05c4233..930b4e027bb526523c651f626f5122fe919f65a3 100644 GIT binary patch delta 46 zcmca5bW4cuG%qg~0}x~~d1T14Z{(ZGC>Rr;nOBlpl$V$jQ(BUlQyjB-3*$0&056OV AkpKVy delta 46 zcmca5bW4cuG%qg~0}vcq=azAwZ6n`QMnV1f%)FA+qP)Z${nC=moMQdWTNszI0{~wg B56%Dp diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc index ac20d867f95bb0339422888850fbcc641f8ff233..dd45520381f042f4a4ae5ab72c75071f7a7d94fd 100644 GIT binary patch delta 45 zcmeyW^i_%XG%qg~0}x~~d1SoU$h(C}FeW}TuOzi7FEJ;kv?Md9IA-%Drp0^!Qtl7z delta 45 zcmeyW^i_%XG%qg~0}vcq=a$j1k#`G|pniO2UP)?EUSf`ZX-Q^IvHs>uOpEydU_KB4 diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc index c08fc4c7b9b52c2113ef6480584a81b16050cc41..7c6e432bb9e412b409aacfc9aaa0f6a0b8c209a6 100644 GIT binary patch delta 46 zcmbQOH(QVIG%qg~0}x~~d1OcmZR87Q5sZn?%qvMP%1g|NDJ{v&DUR7(#erZW&PO<*xGM1%607Qch A+W-In diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc index 188cf46750edddbc8262a07f1b7169dbb8577c49..b824b25b99cc0eb1840772dcd8b626d4297fc27d 100644 GIT binary patch delta 42 wcmeBX>1N?Q&CAQh00fy#9vR6Sc~>#=$HZsmm82HsCFaDGB^Sp`KE~(@0O`66%m4rY delta 42 wcmeBX>1N?Q&CAQh00f8Dxn+cGl6cM!wU$yj%=GkjdncaouAhpE)akOnhcuNorAEVopq1a&gS&5Y{U$06|O+ A`~Uy| delta 46 zcmZ26g>l6cM!wU$yj%=GaA=)d#!0u0eCDkD`tg~0C8mk&sb7&0Cpk} Awg3PC delta 46 zcmX^0i1E}TM!wU$yj%=GaA=)d26N;_zLPBc`tg~0C8853WYnwOGa6tlUN;{+!F(J~9@ delta 37 rcmX@Ba#n@+G%qg~0}vcq=a$j9kvE@%Q$M~eH7_N?B)5%T~5 diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc index 0636572d55afd3092668d6a513839c6306c8fdc6..4ce4b18d4c6782a93868c75ebf61ba0dead58c8a 100644 GIT binary patch delta 51 zcmeyO_(hTLG%qg~0}x~~d1P1%ZshA=6^n^4OU+BkFN#S{OwLG6&d)0;%Fl_}yoS|- F8vu|u5S{=4 delta 51 zcmeyO_(hTLG%qg~0}vcq=az9qU?X1#tC)U#S!!NNevy81Vsb`ma(-S(QGSm8<~6Jy F+yK7r5uyM9 diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc index eb351adb466002465cbab0906c625b5b0278d95a..79149042d17789e9c38269e429cfcbe16ed3108f 100644 GIT binary patch delta 50 zcmexo_|K5{G%qg~0}x~~d1PGP$orm6EGE7zH7_N2(^b delta 58 zcmbPkGu?*oG%qg~0}vcq=a%t8WFwymi>!WpS!!NNevy81Vsb`ma(-S(QGO1DQ>?!^ Io@Iw503%crz5oCK diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc index 90abd28ecc0c687c673ade337e66e1be06d231bd..9a10179258df242cbab4b110011157a33472b975 100644 GIT binary patch delta 57 zcmZ22x>}U?G%qg~0}x~~d1TDm$a{uSHYUC-H7_N}U?G%qg~0}vcq=a!MRk@pOvtbTl1YF;r6JM5^my%x;lbl*ql9`qnGx3K#009FIBme*a delta 42 wcmdnaw4I6fG%qg~0}vcq=avySk@uFMetcPKUP^wEesXG2NoHE6{=^^l02cZVoB#j- diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc index e8d465ab1d5d473c94b2781ff322b89017aebca0..2f3b47f25dc1ed59536cd059fb119d36b6961001 100644 GIT binary patch delta 46 zcmbOwHcO1}G%qg~0}x~~d1NRHZsc=e7L186OU+BkFN#S{Eh@=O%Z%Ba%)Ff)01{sf Af&c&j delta 46 zcmbOwHcO1}G%qg~0}vcq=a#WuU?ZOkv!H%_S!!NNevy81YEemMTBiQyWajPc06bt0 AkpKVy diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc index 995265b01ca44eb8ec99274936aae8b03bbab2f1..2281cd2e76208f340e527371d9138912093db25f 100644 GIT binary patch delta 46 zcmcbpd{LS2G%qg~0}x~~d1M#}Z{)kpA{Y~2mYSE6Ulfy^kywlCfM!wU$yj%=Gkjdncv8H+>-{nlfnE0~Pyp;T+nBlCfM!wU$yj%=GaA=)dhE~-^zRQ_{`tfC{c`5lt`pFrIMJcHz`jbCpx&Z)? CL=kTQ diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc index 09a1088cab999786ae42353ec06655dfc62323e0..6f7bf5229c121653298aeb8820054358996f537d 100644 GIT binary patch delta 46 zcmaFD^@NM>G%qg~0}x~~d1MH&Z{+J`5{!v2OU+BkFN#UdNGwW8Es5E@hG_>A04&lD AWB>pF delta 46 zcmaFD^@NM>G%qg~0}vcq=a%u9Z6jYVlc0WlS!!NNevy81Mq*J)YKi{lHB3900A0Kf AumAu6 diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc index 07037225e83a44ffb15a5b63872d7b535c01c908..09a20a7b85be8ffd9a0661116112cc0d11678ce1 100644 GIT binary patch delta 46 zcmbR5J>Q$}G%qg~0}x~~d1RPsY~+hz6^w~5OU+BkFN#UdNGwW8Es5D&&Z?mR04vE2 A$^ZZW delta 46 zcmbR5J>Q$}G%qg~0}vcq=aylhzL772RZu^^EHy7BzeqnhBe5tYwM2h&Ije>O07P{T AKmY&$ diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc index b8d98e4c23bab3e46dd5665dd32971bfd5c6a1fc..8a582062e8ec2a48fa2901ee28a29687faecfff5 100644 GIT binary patch delta 45 zcmbQNFj;~3G%qg~0}x~~d1P$e$a{cEFebh%H7_Nt$Os2d5HmVMX diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc index 5b8bb8735510bc74ca26d5c472506a1c554aa9f1..947b1ec389d084f5e7f46d9256753b2136f24785 100644 GIT binary patch delta 45 zcmbQNK3SdjG%qg~0}x~~d1UP0$UC1|Febh%H7_Nuj%-8q<4dnY>pES(OD delta 45 zcmbO)H(!qTG%qg~0}vcq=aw;LBX0$}pniN=YFtk?49fYI~xwH diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc index 2dc13c4f1e5fce11909db26a3849478935771ebc..ddc518ddd5e22568efc7e873efb8f8d4be7a3b49 100644 GIT binary patch delta 44 ycmeBU>to|R&CAQh00fy#9vOxkdH*sB#>AJU=B4Bp#Uy7W7Nw+?#7vfE`V0UD>kYjC delta 44 ycmeBU>to|R&CAQh00f8Dxn;<0^8uHY^U^ delta 45 zcmaFM^_GkGG%qg~0}vcq=a%8Jk#{1KpniN=YFvGO#7GsNhS{{ diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc index a37e14780012f68cb5a8cd74ac840e2899a077a9..fdabf5bd0bf344cc150a4e0a8c88a256c4067a4c 100644 GIT binary patch delta 45 zcmZ20zE+&~G%qg~0}x~~d1SoU$XmfA7!zNXnwOGa6qB5hSd@}l60><4lQ<^;EdmZ0 delta 45 zcmZ20zE+&~G%qg~0}vcq=aw;fBX0$hpniN=YFtkOyZmXJPZy$ diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc index 75cf25a59d4ea9a3725f70cf3f09de1a0534ef61..db679a614b8e3740b1ca32cbc151052e27329bb7 100644 GIT binary patch delta 46 zcmX@Fd|sLFG%qg~0}x~~d1UYiY~;JmCKwZ6mYSE6Ulfy^kywpmRG%qg~0}x~~d1M?i-N<)LPcSCFEHy7BzbGa-Be5tYwIpWpQ$05TNQDos delta 45 zcmZ1-w>pmRG%qg~0}vcq=a%u$WFy}(Jwg5Wvedkk{38A2jKrdp)Dr#4PxagYXV(yA diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc index d16e79b6554bf14f901a75f36d8e98ecfa66f2c9..b39f0dc4ced45fbd6a16562e7f56725f4498e8f2 100644 GIT binary patch delta 46 zcmaFP^_+|EG%qg~0}x~~d1P>~Z{(Z6Bp4H4mYSE6Ulfy^kyw*04)^` AW&i*H delta 46 zcmaFP^_+|EG%qg~0}vcq=azAkZ6n_VCPDr9vedkk{38A2jKrdp)Dr#8>zQ^i0RUb9 B53&FN diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc index 86704d872f9fa76472ef8030d72d1b3db65ee802..3bbc18b73a4e272f7ec96aed29830313bc7abe4d 100644 GIT binary patch delta 47 zcmdmcg>ml{M!wU$yj%=Gkjdncv324`zH6C+G4W-oc`5ltG07Q;MJcHzF_XV$dH?{6 CA`zzm delta 47 zcmdmcg>ml{M!wU$yj%=GaA=)dhT(*beAhAs_2bJ@^HTDQ^pi6Zi&9cc^e2DK^Z)>r CbP=8a diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc index b53f6f7219c2d527b7910d2b40638a21d2592781..879bf75338edc2338cbe0538fdbcfcc636f36e75 100644 GIT binary patch delta 46 zcmaFP^_+|EG%qg~0}x~~d1P>~Z{(Z6Bp4H4mYSE6Ulfy^kyw*04)^` AW&i*H delta 46 zcmaFP^_+|EG%qg~0}vcq=azAkZ6n_VCPDr9vedkk{38A2jKrdp)Dr#8>zQ^i0RUb9 B53&FN diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc index 046524a7998e3bbf1810e7c8249504b46417dd01..cd08ea419966097ef0d722725ca1d3fa5cef72de 100644 GIT binary patch delta 47 zcmZ2Km2v%4M!wU$yj%=GkjdncAsw`l&(ljVCcZ2+FD1VyCOIRqC?&NdW^#s?I{-%A B4%+|# delta 47 zcmZ2Km2v%4M!wU$yj%=GaA=)d#{Ynge4bu{`tfC{c`5lt`pFrIMJcHz`ja!f+yQuW B5IFz< diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc index 91cae7b5c05e5798e29bb68349cdef518b1d4783..5c9e3c79f21a965ef2c39e165ebcdf74d1e3a9d6 100644 GIT binary patch delta 46 zcmeyu^@WS?G%qg~0}x~~d1UahZ{(ZIBp4H4mYSE6Ulfy^kywG%qg~0}x~~d1SC!ZRF!)5sZm1OU+BkFN#UdNGwW8Es5Ez%hDwT03NCh AUH||9 delta 46 zcmdn4yIq&>G%qg~0}vcq=azBOVj~|Pi=cjdS!!NNevy81Mq*J)YKi`4U6w8(08Rf6 AoB#j- diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc index 17881b6dd75fcc0795550decbf8d54613024539c..e8616838bf0e14aef8f3cbebb4d05ce39cd95745 100644 GIT binary patch delta 47 zcmZo!%hk(uC delta 48 zcmdne!Mde`mG3k!FBbz499rj=!L)26pUnzVd20RUf8 B54`{Y diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc index 4a8198806502649817e159479f8861332ec77174..2b85dd937d6ed59f993820299de52864db1164e0 100644 GIT binary patch delta 48 zcmeyih3VTCCce|Wyj%=GkjdncF*j=?pM8g5Ong~tUP^vZOmaqIQA%n_%;vZb2_XQH C_YkfC delta 48 zcmeyih3VTCCce|Wyj%=GaA=)d#`?^SeD)oJ`tfC{c`5lt`pFrIMJcHz`kUiAB!mF1 CJ`pwI delta 53 zcmbQUjcv|0HvZGRyj%=GaA=)dhVmE2jr`%Qg8K1gsd*{+Mf%AZiA5=?CHl?ft=r36 I8JCIz0OBSR)Bpeg diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc index 9da30a28c2f44f989745cd5631e207422a333357..54c133abd6c2e17a33dd0e95c216ef7fc1722a90 100644 GIT binary patch delta 47 zcmaEMkLB4t7QWNGyj%=GkjdncF=^38KKB&CnE0~Pyp;T+nBvzCYVG%qg~0}x~~d1Ul#vzCYVG%qg~0}vcq=avz?k#{GvpniN=YFv6%wbFbIY|zs diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc index 78f98717931b0e63fa7b7dc9bfcade2536f42d29..28d7c53c51638afd92cf96a164092b9c2aab8664 100644 GIT binary patch delta 48 zcmaF2mg(JECce|Wyj%=Gkjdnc;ZwPh?^U*7Ong~tUP^vZOmaqIQA%n_%x2DuROyXhyQH&1h diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc index 13fe38541ee910f6394a4244649c09ba4fb05cd6..084cbe3401fccbc98480ea13a9b7e30d835746d1 100644 GIT binary patch delta 45 zcmZ1{v`&ckG%qg~0}x~~d1N$h8$EJ{f&iP>z&_JIii7>5nh delta 45 zcmZ1{v`&ckG%qg~0}vcq=a!+lkyn9DP(QvbH7_N~<&01s&l A=>Px# delta 46 zcmeBB?oj4C&CAQh00f8Dxn(Tp-^drwET|t}mYSE6U!wUO@wr=Wg(S!!NNevy81Mq*J)YKi`4ey;1P0B`vZ A#sB~S diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc index 3b375047a56527bc30c0259546edd8146c5d39a6..96e81d8300fce4424ae2a6de6a58190917e9595f 100644 GIT binary patch delta 46 zcmez3`^A^ A`2YX_ delta 46 zcmaDL@j!y_G%qg~0}vcq=a%t@Ya`!jCPDr9vedkk{38A2jKrdp)Dr#8ub9d>0c!FP AA^-pY diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc index 57ee74b65a03b9f417eed5073afb8d2570af6a4f..0eac46229b1d7f11454b8a813f001cf820b6c066 100644 GIT binary patch delta 44 ycmaFJ{E(UVG%qg~0}x~~d1Uo7j2-|&*$(Ug diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc index 2bbc644021b562dc00907a6bc5c57f1eceb61e5b..0428877e2c6fa661659eda3dc9895c5a1fd27d91 100644 GIT binary patch delta 45 zcmaFI`HqwKG%qg~0}x~~d1Or5$UBu$Febh%H7_Nl`8;) CP7xIV delta 48 zcmbRDglXOrCce|Wyj%=GaA=)d2LGasd~KY9`tfC{c`5lt`YD;kB{`W%`kR+>R;~a5 Dk4+I9 diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc index fb11a47fe4db2fdfe9310438d1c9f4e50acd39c2..b341d82925d969124a5e075d54e75d0f14cd5528 100644 GIT binary patch delta 48 zcmZ41&bX|dk?%AwFBbz4WHNbVtkT}d=g%S-6JM5^my%x;lag6nl9QPfvpJ8&!X5xr CQV#V1 delta 48 zcmZ41&bX|dk?%AwFBbz499rj=;i9#X&!0t5KfWwAFD1W7KP9ucBquXTe{&v-g*^ab C0S^iQ diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc index f48d929893b7e1e1e979d623c2de971e92933e47..12f86120955d0d23bc8da44e65e85ceb28473010 100644 GIT binary patch delta 48 zcmex5gYoMOM!wU$yj%=Gkjdnc;qSST&y7tmCcZ2+FD1VyCMC1DBquW|W^*c=fExgA C@efG= delta 48 zcmex5gYoMOM!wU$yj%=GaA=)dMz{M$J~uW&{rIxfyp;SR{glk&lAO#W{mrRt0&W0~ C-Vgr( diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc index cd3bf9df2c5e6714c67f8271b2e36adbcb9bbcea..8fbfbdc26874a9f0f0d468cea4942ed0f99ab00a 100644 GIT binary patch delta 52 zcmdnFk#*-rR=(4`yj%=Gkjdncv6+7(-xof?nE0~Pyp;T+n3T-olAO$>m}X)A?ZW(w G%RB+PkPzhn delta 52 zcmdnFk#*-rR=(4`yj%=GaA=)d#wqrVd|&tk_2bJ@^HTDQ^iwj6OL8)k^qYnGw+r(# HF7pHc*U%Ag diff --git a/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc index fac1f9e7f8ca047bb062bc5850c5d8d0252d7a44..ed35ca810b66787e6d4a649adbe9e70b8912212c 100644 GIT binary patch delta 41 vcmaFG_KJ=7G%qg~0}x~~d1TaXl9w2>`5p68YXBQ74q5;J delta 43 ycmbPSKe?XoG%qg~0}vcq=awua$JP>G%qg~0}x~~d1Ul&ua$JP>G%qg~0}vcq=avz>Gs02&Al0{{R3 diff --git a/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc index 5983873e0ca33143815c0fbc2e60f1f5874c39c6..a2383dadf525a62322342895fc91440a17902e8a 100644 GIT binary patch delta 39 tcmcb}c#)C!G%qg~0}x~~d1Q!BZ!y&y3;J7zO8vn&e$CtVGY delta 45 zcmZ3$w}6lLG%qg~0}vcq=a!MPk@qQ+pniN=YF1xw*F>jW?2>hId=`y diff --git a/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc index 7c663142daa8c3b83920f42c6cb2e0a1e4f426a2..13ce9deb7fdc0e47add5202f0a5b34de4541d3b6 100644 GIT binary patch delta 45 zcmaFF|A?RWG%qg~0}x~~d1Pd6Z diff --git a/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc index 59e0c476c434471cd95703058f4f2e4d24e62fbe..c06f839242a2a36eef13b3bfa1fd347364f43bd0 100644 GIT binary patch delta 46 zcmccWeASunG%qg~0}x~~d1N$5Y~G%qg~0}x~~d1P=gZRAU56po26OU+BkFN!HhOwLYB&&*4YncTtX3;-!x B4gdfE delta 47 zcmX@je43f>G%qg~0}vcq=a%u2aU)+kqp*H_S!!NNevy7bVsdt3dS+g_{^SluX8>M* B4`KiS diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc index 4a28938ae4d7795bccd768e5461873d454e5e5fe..a5a190e0a4c7a0095af76a00c3252cf89fd19edd 100644 GIT binary patch delta 48 zcmZ1)w=|CLG%qg~0}x~~d1UbFZRFd;EF2SGmYSE6Uldc2n4F!Mo|%^(v-vV}kTw8W C*bj{W delta 48 zcmZ1)w=|CLG%qg~0}vcq=a%t6XCvPxW?}vKvedkk{388=#N_P6^vt|;{mqw|gR}vS C)DYSL diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc index 2b1754a14912b1ddc9bb24621bd978568ff2abe0..6047529d8dcc3f43dae983f3a4336b15ce632356 100644 GIT binary patch delta 47 zcmexv`rVZGG%qg~0}x~~d1Nfw$Q!^S91~xbnwOGa6jP9xoSm4SnU@~3xqziz3;<;n B51{}6 delta 47 zcmexv`rVZGG%qg~0}vcq=awP0kvD)vSUUTmVZ^ B56=Jq delta 47 zcmZ1^xk!@tG%qg~0}vcq=aw;jBkxp3Vg2~B)V!4ZBK?BIKpS!!NNevy7bVsdt3dS+g_{$>`=`?>&? C>JY2| diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc index bf56f14d857af1fd7afb38dd42facab4454e0b79..c83e7680ebd6b4e8bf0c88bbeb3a93f0df9d45c3 100644 GIT binary patch delta 47 zcmbPjHrtH%G%qg~0}x~~d1PGM$g9pS91~xbnwOGa6jP9xoSm4SnU@~3*`580FaSnw B4;=si delta 47 zcmbPjHrtH%G%qg~0}vcq=a%8Jkyo8vSUoFFj^6BMW;O E0I84=+W-In delta 50 zcmeD9!r1YJk?%AwFBbz499rj=F|TwZ-vef0{rIxfyp;SR{er~g?8NlUymbA|j4bSB E0KdZ#G5`Po diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc index 15082962e006ee386e468ea07f429aba8d50e87c..28e01c973daca5742f3f92309f2fd29617d14d2c 100644 GIT binary patch delta 50 zcmZpj!q_^6k?%AwFBbz4WHNbVSlMsnThA^W6JM5^my%x;Q;?XPotU1PmmahE0=uab E0BnyB^#A|> delta 50 zcmZpj!q_^6k?%AwFBbz499rj=5p27WZ#}!PetcPKUP^wEenDb#c4B&FUb_C~3+$#& E0Ez_=hyVZp diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc index e37283f50a863198ec62e900bc60e717f5ec70e4..5a231d5aa597de0f69d46f5e3fc292169fc57089 100644 GIT binary patch delta 47 zcmaE=`&5_rG%qg~0}x~~d1QRp$orm2I3~Ut!T^3w B5H{S RTEX_Uf{feO3Nn>x0RW>X74`rC delta 62 zcmZ4dgJbaz4!+a8yj%=GaA=)dhRN!Ud>w+~`tfC{c`5lt`UTnP@kOb{`K3k4sm1!u RYX#fa3NmhAE67x)1pvIM7DNC5 diff --git a/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc index 41385f5395a4c6c2e91cfe77e8548e9a45e1faf0..346a13a02491d1a1573d75dba9eb2d48c98b10d1 100644 GIT binary patch delta 53 zcmaFX!}zR+k?%AwFBbz4WHNbVd<@vgXU-uO6JM5^my%x;Q;?Hbl9peTo03^n9J4u^ HgWC=O&}I?K delta 53 zcmaFX!}zR+k?%AwFBbz499rj=vDK;JW;OQN FasaV15ib%o0xulS!!NNevy7bPGU(~eo<~pW>K;JW*+t} F+5pDv5$ON` diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc index 8198fd784eebf83fb5f3af77dc132dab74bbbbe5..c290dc1746beeb691e284e335315268f1cc5cc3c 100644 GIT binary patch delta 46 zcmbOwJxiMRG%qg~0}x~~d1Urq AWB>pF diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc index 5ed50f7f355558126f0b1796275535587fa09d4e..0e86ae853edca9c52fdb854e08bbdc09fd7717b7 100644 GIT binary patch delta 46 zcmbOwIZKlFG%qg~0}x~~d1Tz&$orm2C?>uvH7_NPx# delta 46 zcmbOwIZKlFG%qg~0}vcq=aw;PBky}AA^rHW)V!4ZBK?BO^xV|El4AYMe9S$Z08+IN A9smFU diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc index 00a362f88a50b20acdab92dbce3068ee0ae73d11..256a28e9f04117bfde7fd11649f0733130bc64f0 100644 GIT binary patch delta 49 zcmdnInrZWDCce|Wyj%=Gkj3PY@v>_pUm&YcOng~tUP^vZOhILOZfagham?mIR;LL7 Dis%sM delta 49 zcmdnInrZWDCce|Wyj%=GaA=)dhE@AUzCczX{rIxfyp;SR{esH$+|<01V*Sm9tWFaE DkM9t$ diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc index 0053fdd18066a095156a1909705e1f4773ec40ef..3498b31bd3656e4407ff49bb57a21dba6ad544b1 100644 GIT binary patch delta 47 zcmbQmGmD4sG%qg~0}x~}d1SD%Y~L AssI20 diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc index 55fc9240280599122717004782766d57566b9e1c..18e60564ba51a4004352470aa54261288d079269 100644 GIT binary patch delta 47 zcmeA%=`rCu&CAQh00db~9vNnm8~J#-gks{$Qu9*si((2Y({oevN{VAP>vG-a2LL6) B4j}*l delta 47 zcmeA%=`rCu&CAQh00f8Dxn&eeY~5`EHy7BzevBJGCemnucTN%C$%EAs91mV IY}VPv0QEi-A^-pY diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc index b4dee3e320e5bf4b2645e783ec1dedd7b6cc568f..3726a00a82f585a9b725ba519d15e48951f282ac 100644 GIT binary patch delta 56 zcmeDC&fNE%neQ|&FBbz4WHEVUbjWPvdv#4RCcZ2+FD1Vyrl2xCH#M)MI3_2xBDJVE KX0zb+S``2=jTH$1 delta 56 zcmeDC&fNE%neQ|&FBbz499rj=5h=Bi@6|O){rIxfyp;SR{esH$+|<01V*Q-diqxWF K{mp{cYgGV6sTC#w diff --git a/venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc index eac17df1a1b39e776ee952c6e014fc6c2ee307dc..edf55396cd31b4370b4e6e1de15dfc602956fa57 100644 GIT binary patch delta 53 zcmcbmbW4f%G%qg~0}x~}d1Tz)$Schw853WYnwOGa6jM-{o|~FiQXErUQkj!l9JASx HN0Jo)z|;|d delta 53 zcmcbmbW4f%G%qg~0}vcq=ax~jkyn~WQa`>dH7_N^5s{mq~F-tz+h DmxvM2 diff --git a/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc index 83289e8a8a3c4162cc692b8cd8aba7e4702626ca..c449925b904e4b99fd34b7ddb3b5f5ca9a543ccf 100644 GIT binary patch delta 48 zcmX@=c+`>aG%qg~0}x~}d1N$5ZR9)1Bpef8mYSE6UldbNS&&#%oSBy%v-uIzV_5)f CU=Ydx delta 48 zcmX@=c+`>aG%qg~0}vcq=a#WtawFeCCSm>fvedkk{388=%7VnA;>^5s{mqY<9?Jp% Di-Qqs diff --git a/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc index 8eb643128070ca9e77d356c618d1540ab8336f9a..ded4108f5014dd8e70e5f20da27358ac08e594aa 100644 GIT binary patch delta 48 zcmaEm@gRfmG%qg~0}x~}d1U-H-N<)bR5&KSEHy7BzbK}lvLLajI5RIjX7dZt3ON9n CX%Vad delta 48 zcmaEm@gRfmG%qg~0}vcq=a%7ZvXSq&sIY!~S!!NNevy7bWkF(5ab{k+{^l2=6>NNy!4pO_XH-c F0RYWl6DR-x delta 50 zcmaF=i|PF@Cce|Wyj%=GaA=)d#&KU+=B4Bp=@(QMBo-BC=B4Xzz9%qo F4FLTf6jA^H diff --git a/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc index 4cfb4694059753a01aefabc61ac7d53cea104611..fc851c00df79a00cae3de942ea5745f20d762118 100644 GIT binary patch delta 50 zcmdnd#k8Y~iSINoFBbz4WHEVUBxG;olVlQ(i7!jdOUW;aDX1(+EGo{-OOM%X#q_TU E0C+hNrvLx| delta 50 zcmdnd#k8Y~iSINoFBbz499rj=;gYeDPm)PkKfWwAFD1W7zo4=pv8XsRFI|7L71O^a E0FMI^0{{R3 diff --git a/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc index ff64f9a8504bc0c33100528d87292231c17d964b..d7b81f59e774061df86b4bc0bb7e4294593fc52c 100644 GIT binary patch delta 50 zcmbQ&#yGEyk?%AwFBbz4WHEVU{5IXlx0y{iCcZ2+FD1Vyrl7JQv8XsRFFj`S6*ey$ E0E%M~5C8xG delta 50 zcmbQ&#yGEyk?%AwFBbz499rj=vB6{`-)1&p{rIxfyp;SR{esGZ#G>NNymbA|SJ=F4 E0GqfGKL7v# diff --git a/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc index 904b2ab11c7fd403df6c4d070ab2038e15cc4379..e00d401fc9865697d1bd58aff3c2abd742113193 100644 GIT binary patch delta 48 zcmeyB_A8C=G%qg~0}x~}d1U<8+Q|2ZQ8*^PEHy7BzbK}lvLLajI5RIjX0t3)tRVoP Cb`cN& delta 48 zcmeyB_A8C=G%qg~0}vcq=aw-|b0gm$Mq&N^5s{mrsWv4#My CDG?z6 diff --git a/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc index 5ac93d9612b116cd9e51d4b6c3542af341b48980..7590e796eb5a14d850850d888034cc9b6d84313e 100644 GIT binary patch delta 48 zcmdl~vZ;jcG%qg~0}x~}d1U-j+Q_$qRX8TTEHy7BzbK}lvLLajI5RIjX7f$fND}~s Cvk?sd delta 48 zcmdl~vZ;jcG%qg~0}vcq=az9#aU^5s{mnO7BTWFD Cxe;ps diff --git a/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc index 4d3d95c6f86b40c8e021f4c8a6bee24cd000dc24..f327d1b83a310fa8db5eae565453214f7e1d93ff 100644 GIT binary patch delta 53 zcmcc5a-W6oG%qg~0}x~}d1Np#ZRC5&C>ax9mYSE6UldbNSx}Upm6}`KqfZe2 delta 53 zcmcc5a-W6oG%qg~0}vcq=a%uBaUBDg>|*`N H0!;n@;q4M( diff --git a/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc index 11576a1ae83d03ff438dea515cbaf28e12788855..8474a4b39be1b44d3cbcc63c6c75966c62dfc36e 100644 GIT binary patch delta 54 zcmexg^uLJjG%qg~0}x~}d1Tzu-^e$YNirtBEHy7BzbK}lvY;qGD>bBDg>|*`R JN0@e-0RSRQ6nX#v diff --git a/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc index e0368b6a3f49df3b068c800272bffe7fffa483d9..c2c509ea08856972183fbd00453001f0e7ae0101 100644 GIT binary patch delta 65 zcmdnQv5ABCG%qg~0}x~}d1RPu`vjfpQy%}dEIiYcfpD9X=DO)iPg$j{F%j)~9A SiwBA%rxq8-Y_4P4!UzC|Sr#q; delta 65 zcmdnQv5ABCG%qg~0}vcq=a!+gk=KVwRX@HgH7_NuvH7_NEEE%8mYSE6Uldc6T3DJ|Tv8mf`5rS13jjii B4z>UQ delta 47 zcmaFF|A?ROG%qg~0}vcq=azAubtB(CW+DCfvedkk{389L)WXu#;*w(h&G(pDSO9cz B5B>lE diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc index 764b19950d735fb215a40b81ddd83c7336ddf822..6f0c6773f43e530daf95a0331b9feebd0944916f 100644 GIT binary patch delta 49 zcmbQWjB(a7M!wU$yj%=Gkj3PY!R^11Z!N1(Ong~tUP^vZOi^lKX=-svam?nktiHYg DX>t%1 delta 49 zcmbQWjB(a7M!wU$yj%=GaA=)d#z&uxd}~>S^yAA?^HTDQ^ovppOH+$WiuE_2W%cz1 E0G;m}W^#PaV B5q1Co diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc index 074369471194239f695465fa56e7816c7facacd4..6a3ac934e6acbf068350c61b83bcd9918f450f7a 100644 GIT binary patch delta 45 zcmbQjK82n4G%qg~0}x~}d1QodHu4Vi delta 45 zcmcc1eV3c}G%qg~0}vcq=a#{?k@pXakbZnwYF Di;xh+ delta 49 zcmbPnlySyUM!wU$yj%=GaA=)dMuW#jzR#>e`tfC{c`5lt`bDXQrK!aw#rm6t*;-=& DpLh`r diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc index 39b439c6fbed991be8350b5bbd23cee173733e13..66c78bf114d41c4c3952112518ad3c77edd5baef 100644 GIT binary patch delta 47 zcmZoPZ#3sS&CAQh00db~9vLuvH7_NS!!NNevy7rYGG+=aY?cM=Fj|o>;P~s B5J&(3 diff --git a/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc index 0d59b21bab8901edfc3d0a1859d43904dc1ee2ab..0f6dfd3f6996256f0fa0ed90eaec5839fb543aa4 100644 GIT binary patch delta 46 zcmaE@{aTy%G%qg~0}x~}d1M^k$g9UD6cb;TnwOGa6jPL1SejZ~QXI3{mu((D08ktc AJOBUy delta 46 zcmaE@{aTy%G%qg~0}vcq=a!MMkynpRNI$+TH7_NG%qg~0}x~}d1M%Gu%}dEIiYZDh&d(`J&B;uPnXJSV1OPri B4pIOB delta 47 zcmeyu@`Z)>G%qg~0}vcq=awP4k(ZH4L_fYPH7_NH77Gkf3gx&5CBx> B4zmCN diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc index 330b8c9855591764fd60e165ae841ae7541da53c..d004d8f3f10bf7d50dbb5ddb3269bd6f3e1c3f46 100644 GIT binary patch delta 49 zcmdmMy4RHNG%qg~0}x~}d1RD`Z{!PN5{Zc~OU+BkFN!HjEzZv=OU=nlirHMku%}dEIiYZDh&d(`J&B;uP*}RBx8wUVj CLJ$1_ delta 48 zcmca1azljoG%qg~0}vcq=a%8Pk++diL_fYPH7_NH77GkfAb>7Z5#k~ CI}l9( diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc index 4da81279021de49993016d1cd3cef7218cc3b032..1cdc0cda0d134201ede6983f717d4d872c97ec63 100644 GIT binary patch delta 51 zcmZ2{igEENM!wU$yj%=Gkj3PY;S{uyZw|9aOng~tUP^vZOi^laeok3xPG(Zf=6%em Fi2$IA5pDng delta 51 zcmZ2{igEENM!wU$yj%=GaA=)dhJ3(AzB$Yy`tfC{c`5lt`bDY5`8j2&IhjfNoA)uN GCISGr91+9- diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc index 39dbd44671abc752d91cebad74fb01adf6d407a5..d923fec2f4ce62b9128e8de11da2e3fdca339767 100644 GIT binary patch delta 49 zcmZn(Y6;>y&CAQh00db~9vQqM8~GfVL}KF0Qu9*si(-mWi}Q2JQgbqsVm2o+Em8vj DO0f?U delta 49 zcmZn(Y6;>y&CAQh00f8Dxn(2^Z{%}e648$@OU+BkFVZhcEzZv=OU=nl(%+oKv`7sA DaDorx diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc index 1ce74bd5b71e0747bcb4f98630a0151b0170ce46..ef6efb84021127720fa137b6b336b2aad369ee86 100644 GIT binary patch delta 50 zcmX@ac!-hvG%qg~0}x~}c}(QamyU@qOU+BkFN!HjEzZv=OU=nlib>ATEl4bhnK)G! E0CkTL#sB~S delta 50 zcmX@ac!-hvG%qg~0}vcq=Qfc$Us^xDEHy7Bzev9*wKzYgEHx)HNk2J1w;-`Zf8tbK E0FG)A6aWAK diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc index 59f4fdb88f0818ae5039cd1c8271f3fc1fe70a62..ea5e99f287b7ebe7070fe8a585008f4c499bd589 100644 GIT binary patch delta 54 zcmbQoJdc_8G%qg~0}x~}d1Nfw$jieh9TQ)cnwOGa6jPL1oS##cnveY~)+Y!WR=?mYSE6Uldc6nVb=``5?;zF#sPN4kiEq delta 43 ycmaE8_Rx&)G%qg~0}vcq=az9wd?Vjd7C!y>vedkk{389L%;XIH%?DW)hyegTNe=G- diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc index ea3a28132a0e4cba5ef6a63b270221bc88753448..7ddaebba74111c93a67dd76bf5092dd750b12718 100644 GIT binary patch delta 42 wcmZp-ZMWq+&CAQh00h}g9vQ}(8~Kdn_+sMAQu9*si(-m0lQUu_`^i}X0Ox%R`v3p{ delta 42 wcmZp-ZMWq+&CAQh00f8Dxn&fnZ{#zQ?dal00a39umAu6 diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc index f28a12664a2dcd511bebd03a4d262c6875fe57e3..a8a716ecfa49e50713ef8aeacbdb8b44f91c4580 100644 GIT binary patch delta 52 zcmbPql4sIM9=_AOyj%=Gkj>K5WX&CAQh00h}g9vKZAdFOHP#l)AT=B4Bp#S~>GXT(h2$q@tq<3tRT delta 41 vcmeAc>K5WX&CAQh00f8Dxn-Da@$hZgq&^`;y delta 41 vcmbQtGMR<$$dD%Jc^SkJHvj+t diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc index b65ed52b6bdb83d29b59d75a4eae9ea6ba5c37f7..3bfa08ec26c3c943f11dc52be931834f440c8ea8 100644 GIT binary patch delta 42 wcmcc4cb$*-G%qg~0}y00d1Uz>% delta 42 wcmbOyGf#&1G%qg~0}vcq=a!MZk#_?VpMHE@-E>F006iRga7~l delta 42 wcmZ3au}FjOG%qg~0}vcq=aw;DdL!RFVLtu%vedkk{389L%;XIH$-9Iz01_Jw$N&HU diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc index ccf0be6f8bd2063103e25904c7a54db832501c2a..7749f0dfbf968f124f0b279bfbbc9dd9a40922d0 100644 GIT binary patch delta 41 vcmcb>dV!VqG%qg~0}y00d1UO^$orL%FDAY$H7_NdV!VqG%qg~0}vcq=a#X2Bkxy6KK=Nz)V!4ZBK@Mw8Mf76;T=)pMHE^I0x`RRA9V4j=#k delta 43 xcmbP}FeicUG%qg~0}vcq=a$i+v5{{h7oUE7S!!NNevy7rW^#u9=CfS>ssJ!^4q^ZR diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc index 47daac777014b0b25869fe1d20a0d07d4a04dce1..29c7fd59ee9536668b4c7879dbb33e8a195b8744 100644 GIT binary patch delta 43 xcmeBi?{Vil&CAQh00h}g9vQEsH}V~1<%@|gOU+BkFN!J3OwNeee3x~-EC3g74q*TQ delta 43 xcmeBi?{Vil&CAQh00f8Dxn=y4+Q@g1l}|suEHy7Bzev9*GdV+l^Ig{UvH&m_4(b2^ diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc index 71a93ed4a3f6e354fd582d92bd6921bd825059a9..27e8ba872ff8bd35f66f3f0d7c019102697d2844 100644 GIT binary patch delta 43 xcmX>Tb0&uGG%qg~0}y00d1RDpY~-85!xs}@mYSE6Uldc6nVb=`c>~WJMF1qT4oUz3 delta 43 xcmX>Tb0&uGG%qg~0}vcq=ax~VwvlfN51)Q~S!!NNevy7rW^#u9<_$b^6ahOS4!r;X diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc index 875a71a71807483dff6073eb75ccdcb89a3ec397..6ac56aaeb12f348a878af1868a187ef9ba17fcc8 100644 GIT binary patch delta 43 xcmaE({YIPbG%qg~0}y00d1ROiZRA_P!WR=?mYSE6Uldc6nVb=`c@K+$AOIF?4PF2M delta 43 xcmaE({YIPbG%qg~0}vcq=aw;7a3kLW7C!y>vedkk{389L%;XIH&3jl31OYeD4m|(> diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc index 8f5c63b54a25af93f303208efbeb2063416aa7b8..9a911b1538667c861eafa07040c0e917fd5c297c 100644 GIT binary patch delta 45 zcmX?dp7F?eM!wU$yj%=Gkj>LG%qg~0}y00d1Sb3LG%qg~0}vcq=awP2kynd}Pd~maH7_Njct()-G%qg~0}y00d1UBrjct()-G%qg~0}vcq=a#{-kynYCPd~maH7_NG%qg~0}y00d1M4AY~-6P%@-42mYSE6Uldc6nVb=`dA;-n9sn+S4x|78 delta 43 ycmew#@IQd>G%qg~0}vcq=aw-^ek0#xX+Hh delta 42 wcmZ3_x1NvpG%qg~0}vcq=a$j5k#{>IpMHE&mGR(IM!wU$yj%=Gkj>&mGR(IM!wU$yj%=GaA=)d#zFIqe5o9K`tfC{c`5lt`bC+^8Ty+WIUJk-QV diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc index 4685ec6d9f21827176d2688ca49628aa29b4bbb1..3409a6564f0201c3df3c74faa247aae54e219515 100644 GIT binary patch delta 42 wcmbQCHbaf~G%qg~0}y00d1M^f$g9Z07ZYEWnwOGa6jPL$oDs9xhUE?)0QHp&&j0`b delta 42 wcmbQCHbaf~G%qg~0}vcq=avz?kynw0Pd~maH7_NEHy7BzbK|CGdUw>^9C^+IRH3g4ut>! delta 43 xcmaEp`6iR^G%qg~0}vcq=ax~gw~=p(7@vN8S!!NNevy7rW^#u9<_%&tasW&c4&49% diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc index e9c413bbc3791eae876991c074f12be88efe6092..0cf6cc6152be550060b0ee1e4cbc65949829034f 100644 GIT binary patch delta 42 wcmX@(amIu9G%qg~0}y00d1U%{0RQ9+<^TWy diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc index 8a0d86b8a79f2d614f31a8db9995e4daee5dbf6a..f103c895cc89ad6f92b6a6f24d5284199f4bcca9 100644 GIT binary patch delta 42 wcmdm^xkr=tG%qg~0}y00d1S2E$a|KFFDAY$H7_NysSG%qg~0}y00d1N$cZRFd{%@-42mYSE6Uldc6nVb=``8s!sG5{ol4o?68 delta 43 xcmdlTw>ysSG%qg~0}vcq=a%88xsh)-H=lldS!!NNevy7rW^#u9=Ih)k$^bS*4wL`@ diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc index 0d4d75a6718aeda2ef0312a8033fb54113ecd9a5..fee83623421e3918c98c5c69ff001eedda5dc82d 100644 GIT binary patch delta 45 zcmeyggXz-_Cce|Wyj%=Gkj>uI9nzG0C2Mq A{{R30 delta 45 zcmeyggXz-_Cce|Wyj%=GaA=)d22amMzDt~Z`tfC{c`5lt`bC+^8Ty;wakfkX0C1KN AlmGw# diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc index c6048ac3eaf0c305675ef526ca8ea5c1b16c5162..c5de105416fab235bd5c2c0b601a068d8d2e9e74 100644 GIT binary patch delta 49 zcmX?bisis57QWNGyj%=Gkj><{ES&CAQh00h}g9vMd!HuC-F<{ES&CAQh00f8Dxn(?+-^ll$lTSasEHy7Bzev9*GdV+lvou$U8~`-j4nF_@ diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc index ad0d4f18e4db281831c6b39d096ab2823f183997..9ef168ddb9f9b8c65657235053e979468d230eea 100644 GIT binary patch delta 42 wcmeyx`-_+NG%qg~0}y00d1TDo$g9D`7ZYEWnwOGa6jPL$oDs9xnQ1!<00}n@5dZ)H delta 42 wcmeyx`-_+NG%qg~0}vcq=a!MbkynF>Pd~maH7_N}U+{ delta 41 vcmdnUvXO=NG%qg~0}vcq=a#W-BX1KUpMHEH4*>f23|9aE delta 43 xcmZ3bze=C)G%qg~0}vcq=a%tVU?U$d2cLd?S!!NNevy7rW^#u9W=)PpegGaN4MzX~ diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc index 984ee64f81f4ae9d632cf236ccd8630642276c31..c6af8c36f6b3ea0a5fad78ed5d7c973f2bbbab24 100644 GIT binary patch delta 45 zcmaFT%Jig_iSINoFBbz4WHWhW+|Aj@=f}(!6JM5^my%x;QtbRsbKl4Cnv= diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc index 3f26c47de2a56d9b086b538cf79f125dc3f571bc..f60eb79f5f823fa27c8c50c8b203a4cedb621efc 100644 GIT binary patch delta 45 zcmdnCm1)~nCce|Wyj%=Gkj>XYI<&CAQh00h}g9vO!>^6q2di-|8w%}dEIiYdxW&WPE3lf{$+0R1KnF8}}l delta 42 wcmeB^>XYI<&CAQh00f8Dxn*c=$Byj%=Gkj>`yG4W-oc`5ltF-4il88MqTvCqB-0BKAR A?*IS* delta 45 zcmX?mhWYFnX1>$Byj%=GaA=)d#?_4*`KGb+>BpC)=B4Bp=@(@tXXtO<#6J5T0DUtN ANdN!< diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc index a63465a368541b654b5276c29bf8715da255cbd4..2f096c61c2ad52b647498c771dac576b40d95ce7 100644 GIT binary patch delta 43 xcmdmIxX+O9G%qg~0}y00d1RRIZ{$;E<%@|gOU+BkFN!J3OwNeeY|mOR3;_I{3}FBO delta 43 xcmdmIxX+O9G%qg~0}vcq=azAhZzG>FE1!ORS!!NNevy7rW^#u9W_#9pVE`fr4QBuV diff --git a/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc index fec19f32425a2fc38a5a647ffd64edaf09d73e80..f0e8c18448bea9ba9f12ee8bd220b4b20a6216b1 100644 GIT binary patch delta 39 tcmdnOw1tWHG%qg~0}y00d1Pcy%d~?H05jPR AX8-^I diff --git a/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc index bec05142045fed8d557ea5997d510e600971c552..61daca726fb77617b896ffd7497c8db7178da690 100644 GIT binary patch delta 46 zcmcb_bBTxdG%qg~0}y00d1M^j$Xm=P6cb;TnwOGa6jPF#mzbPcQW>*(65|0D07IY; AO8@`> delta 46 zcmcb_bBTxdG%qg~0}vcq=aw;PBX2RIkbZnwYFPUSe`)Nu~bgNsI?r09KX{ Ak^lez diff --git a/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc index e5e77fa8f73381cf659cb072f76567584b6e10c9..93ba5eacefecbf413b329023fbdccada7c9ba49f 100644 GIT binary patch delta 46 zcmdnQy@{LmG%qg~0}y00d1QEO09-#0 AL;wH) diff --git a/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc index d2c0264aa432bce32cf38334fd60b7f8760c06b3..2d7aef240f261f693c8f518f624447649874b895 100644 GIT binary patch delta 46 zcmeyz^^c49G%qg~0}y00d1Or5$a{uSC?>uvH7_NPUSe`)Nu~bg*Nl^y0cw&E AKL7v# diff --git a/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc index 4ce517caea81b7499fcbdd1206e8f5f5f08a375f..84d8b2263d94d03ef544cfeba8bb238f8ee10630 100644 GIT binary patch delta 47 zcmX?{e>k7-G%qg~0}y00d1P2AZ{+i47K({4OU+BkFN!Hi%}Y$qEUApyoXs3z0svHm B4+;PP delta 47 zcmX?{e>k7-G%qg~0}vcq=a!+Rw2{x7Sx7&=EHy7Bzev9%H7_wav!qggb2f8?2>@(G B4|4zj diff --git a/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc index 1ad48ecbd20e73fd0ac881ebc1f1dd39b5a5b693..cbc2d44b0550705701a1976315b9336ff0f0223f 100644 GIT binary patch delta 46 zcmdm`y-S<-G%qg~0}y00d1RDs-PI@4nz07Xs@ A#sB~S delta 46 zcmdm`y-S<-G%qg~0}vcq=a#{@k#`4^kbZnwYFPUSe`)Nu~bg>r9V@08(HN A*#H0l diff --git a/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc index af6105441ef3c3cfe0493c346c16753b59dbb7ee..d78f402df6b603b9beabfe286cee2ba31482df46 100644 GIT binary patch delta 47 zcmeyK@I8U=G%qg~0}y00d1TlqY~<5s7K({4OU+BkFN!Hi%}Y$qEUApy?9HsB3jkfT B4&VR) delta 47 zcmeyK@I8U=G%qg~0}vcq=avy6zmZRySx7&=EHy7Bzev9%H7_wav!qggvp2JjE&zI+ B4|MjZce8DW)==Bb^tA`4XpqG diff --git a/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc index 3062570935f0fee2e970a566ef1a279093926b62..9d28e419a51473ab2070b253c559683e633975c6 100644 GIT binary patch delta 42 wcmaFC^n!`+G%qg~0}y00d1P=fPUQQ-9}{1enwOGa6jPF)o0AzcS&%Ut0RE&5yZ`_I delta 42 wcmaFC^n!`+G%qg~0}vcq=a%u0VItobe*O5e)V!4ZBK?y5+?-7P$%2gG04(ngD*ylh diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc index 93af891e2537fd2895753e666911fb3398078808..8f41d195251e72c57ab9370139e860757733d25c 100644 GIT binary patch delta 45 zcmX>ubzF+~G%qg~0}y00d1Pd7ubzF+~G%qg~0}vcq=a#{`kvEbSbuXl#|0JuH17^i diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc index bcdae9cdfc32691785ea47a1e008f91db686dabb..3ec63465cd6a3d5e50afe2d9f818f61bbf976ffa 100644 GIT binary patch delta 46 zcmdm5v$clrG%qg~0}y00d1UlxZ{+*VC>Rr8mYSE6UldbXl#`R0WE`_uj7i=G09;=V A-~a#s delta 46 zcmdm5v$clrG%qg~0}vcq=ayluwUO^Tqo96#S!!NNevy7@QBF=~lCl0~F(!E%0BkJ} A2mk;8 diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc index f3365a51be2879df4d21077a760391d1a1f49cd5..f685d27939b38bfdc2985bcbee393249f20df80d 100644 GIT binary patch delta 42 wcmcb@c!iPoG%qg~0}y00d1N?EnE0~Pyp;T+n9`!0oXjNSn9Y+p diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc index e247d4a315dd0d1470faf85c5985929ffdbbc003..329138f5b9d5de460c88709e5b71142a199ff171 100644 GIT binary patch delta 46 zcmZ3VxjvKcG%qg~0}y00d1S;WZseI+%091nx Ap8x;= diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc index a7cfce79c94fbb26ca0c052db5b3b36e2ef4c061..76c410bd3fc76316f2eb8cd4890d094ea3ed9968 100644 GIT binary patch delta 46 zcmZ1;xIB>WG%qg~0}y00d1Opg+Q=usEEp4CmYSE6UldbXl#`R0WE`_upSeO605ew& AWG%qg~0}vcq=a$i|xRFnQSx`T|EHy7BzevBdC?_W~$yk50K68aC07^&> AOaK4? diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc index 6d8ea60122105fd2a9d93acded7ec153e939e780..70d20dbfbe14c09bb21e480cc2de864cc3e88266 100644 GIT binary patch delta 45 zcmZ1@zeb+-G%qg~0}y00d1SoW$UC1&Febh%H7_NIA-%+ruRGmHQf(2 delta 45 zcmZ1@zeb+-G%qg~0}vcq=a$j2k#|0mpniN=YFxkMYDjM!wU$yj%=Gkj>xkMYDjM!wU$yj%=GaA=)dhKBD(zAkP-{rIxfyp;SR{nDbGoXjL+{mm=6=Q{%c Detr-{ diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc index 5b6eb6ed452622c1da8027343d9ca3c201fd597e..2e5944108f9d0f4eea8eb5bf633c6decbcf3fafe 100644 GIT binary patch delta 45 zcmexi@xy}mG%qg~0}y00d1O4=$ZN+Y7!zNXnwOGa6jNH1larZb9J4uwO-2j=OI8ka delta 45 zcmexi@xy}mG%qg~0}vcq=a!+ok=Kq*P(QvbH7_NSbuX2n~WF$PKXXK diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc index 9dda6be7627b3ea2256ccbe645b82c0417268c33..d14274e14698dd65a2c37d6a94428dd724a95b85 100644 GIT binary patch delta 48 zcmZ40$+W7IiSINoFBbz4WHWhWC{%Ccb7T>Wi7!jdOUW;aDJ{y$$xJei*_^=Q)c^oa C6b{q? delta 48 zcmZ40$+W7IiSINoFBbz499rj=v9Ww3pCgN)etcPKUP^wEerZuoPG*v^{^kT0uLb~j CC=c5J diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc index 0bc67ff153ae44e6451734ff11de60cc3b7103c2..942626491ae4f125f0801e97f36883fc6adf92e7 100644 GIT binary patch delta 48 zcmX@Wcz}`nG%qg~0}y00c}(QamyC%oOU+BkFN!HG%E`%0GLA{k&nqd)Op2K}Sr-6M CxDT=b delta 48 zcmX@Wcz}`nG%qg~0}vcq=Qfc$Us6B5EHy7BzevBdC?_W~$yh%*Kd+=HGf98qWL*Gf C^AG<3 diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc index 8fdc60f87cfdba57a0795588939084f27ae32e31..ab8db992bbbb2c4a683b0caf4a6b8bb5d14bd5da 100644 GIT binary patch delta 53 zcmdnQw~3GUG%qg~0}y00d1O4?$m`E2853WYnwOGa6jNH1larZb9Fv@%S5lOj6tlUM HaW5+Xs~QoQ delta 53 zcmdnQw~3GUG%qg~0}vcq=a#W|BdIHt5DGbd&;KT9eA Dhnf&< delta 49 zcmeyu@r8r;G%qg~0}vcq=a$jDk@pR=n0|a&YF delta 50 zcmeBE?NjAF&CAQh00f8Dxn-zsEhu%&CAQh00h}g9vO8TdEYRJ#l)AT=B4Bp#grE1Ehu%&CAQh00f8Dxn;O+9f6mYSE6UldbXl#`R0WE@jkl9>~;`8s1Z FGXQX&5ElRd delta 51 zcmX@ab%=}aG%qg~0}vcq=a%t_aUPvedkk{389*qMV$}BxC*3lFS_a&DR;T FnE|Q%5lsL9 diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc index 32eae8430d21ae5b3289a2ce5f6afa809d6956f1..64ce982e603e24bd886b0b2b458bbe23cfa40134 100644 GIT binary patch delta 51 zcmcbpa8ZHpG%qg~0}y00d1R;wY~)kt5Q~W~OU+BkFN!HG%E`%0GL9)N$;^q_?9IW( F0RVC{459R;> diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc index a165ebe404d30fe9ccf15d4e04ddf7d9e9bc267e..c68462aa42f7936371552bbf7f6e1405d51b7734 100644 GIT binary patch delta 51 zcmZ23zFeH|G%qg~0}y00d1NT^ZRGpJBo-52mYSE6UldbXl#`R0WE@jkl9>~;S&Vri F2LN=u56l1n delta 51 zcmZ23zFeH|G%qg~0}vcq=a#XJcO%~?CNcf^vedkk{389*qMV$}BxC*3lFS_a&0@?G FIRK*25Ul_J diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc index 6d4bc4bc4bc778046704803d2d80d3c73ad95f07..2ffc7d170b2f0267954c32ff2597aa19ec93de4f 100644 GIT binary patch delta 53 zcmdnJl5zJ+M!wU$yj%=Gkj>bpG%qg~0}y00d1P?7Zsa@3Di#x8mYSE6UldbXl#`R0WE@jkl9>~;`7JAt FDFC{Y5v2eC delta 51 zcmexa`m>bpG%qg~0}vcq=awPqypiuDtC)U#S!!NNevy7@QBF=~lCgeiNoJ1z=C`ao FrU2Id5&-}J diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc index f4793e59fae0b4efb9cc7ca5fbef4b91e78e6860..27d7fd28e77f4cabff91190505113d67798ffa7b 100644 GIT binary patch delta 51 zcmX@9eo~$9G%qg~0}y00d1T0nZ{+J^6pM*3OU+BkFN!HG%E`%0GL9)N$;^q_yopg< F2mpR?5BdNA delta 51 zcmX@9eo~$9G%qg~0}vcq=ax|?wvn%oQA|I+EHy7BzevBdC?_W~$ymR%Br`{U^Cm`d FApoVE5T^hD diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc index a3d5897c263dd3a7141f50049259943fec1f525b..55bd3a6c64b7531dc05a3f14262d502bbb985252 100644 GIT binary patch delta 51 zcmeAR=?mdI&CAQh00h}g9vNq(H}VCsip9j2rRJsN7sZqo<>X{08OM~CWah+dE@Pdc F0sx8p5VQaQ delta 51 zcmeAR=?mdI&CAQh00f8Dxn;bU+Q=8gDyAP_mYSE6U!-4Jl#`R0WUOCWl9{8wxr}v& F3IM3=5hDNq diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc index bd87c6a0b4e63461a28eef41754b629e07f54312..194ce71ac55320e2d1505b3b4f291152ce1a73bf 100644 GIT binary patch delta 51 zcmewx_BV|0G%qg~0}y00d1M^d*vJ>dFBTJDmYSE6UldbXl#`R0WE@jkl9>~;xq<($ FGyuAE5+VQq delta 51 zcmewx_BV|0G%qg~0}vcq=a#WUeIs8CznFe}S!!NNevy7@QBF=~lCgeiNoJ1z<_7-1 F(g4!H5?=rS diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc index 243804b43de928b021f669ebde0a796243ab6cd3..38928a41fd0619320113b05406af3640ef30c641 100644 GIT binary patch delta 51 zcmZ2my|$X~G%qg~0}y00d1Q23ZshyRB^DE3mYSE6UldbXl#`R0WE@jkl9>~;S&_TP F2mrH@5r6;y delta 51 zcmZ2my|$X~G%qg~0}vcq=azB9d?VjqE;0T1vedkk{389*qMV$}BxC*3lFS_a&5GPT FMgZ6J5*Ppg diff --git a/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc index 0b8a5a0c65aa734333911899aba93be8ecbdc497..f6f0698d3b64259029fba2cfad976d871cd982b5 100644 GIT binary patch delta 50 zcmZ3hv{s4tG%qg~0}y00d1P$f$orO2EGE7zH7_NIHt5DGbd)V0Fx{~ E0ET!E_5c6? delta 50 zcmZ3hv{s4tG%qg~0}vcq=awP8k@qd5n0|a&YFa|U_< delta 28 icmX@hbe4(tG%qg~0}zO<=k(*JBF{YVUY&)+QV~P_1rxyrQ delta 33 ncmeykf%W4CR_@chyj%=GAhOlWsJ}T*;9L;^cY6pM diff --git a/venv/Lib/site-packages/psutil/__pycache__/_pswindows.cpython-312.pyc b/venv/Lib/site-packages/psutil/__pycache__/_pswindows.cpython-312.pyc index 058555a245ce08905dad2c60cbfd8c594f022221..4285edc03039470fa6a7e8cefea5edab07f229ca 100644 GIT binary patch delta 29 jcmX?if$7`@ChpU`yj%=Gkj><=kvo}(F=lf<&;8i|j5Y}% delta 29 jcmX?if$7`@ChpU`yj%=GAhO@~ diff --git a/venv/Lib/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc index 856fba430bd9b3cbe806f54366a23896ef9e276a..e2cc458401607e1977560c2cb8525f8c8b42c736 100644 GIT binary patch delta 30 kcmaDH@;HR=G%qg~0}y00d1P$Y-^lk^jWK5PC$&Om0GBHX(*OVf delta 30 kcmaDH@;HR=G%qg~0}yDgcgtwj+sOA=jZuH|C$&Om0GYiB+5i9m diff --git a/venv/Lib/site-packages/pydantic/__pycache__/aliases.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/aliases.cpython-312.pyc index 243c313557451f684cf6df7006e9b0ef52608154..9ffaf82a94917eadebf569123d37dd2ebe451191 100644 GIT binary patch delta 29 jcmZ2ryug_EG%qg~0}y00d1PGJ$m`F-7_&K+#aR>paoPuJ delta 29 jcmZ2ryug_EG%qg~0}yDgcgyhH$m`F-sJ}Uu#aR>pa9;-> diff --git a/venv/Lib/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc index 41e77389baf6e4076f6cdc358eff4fb5c91210ad..003e9051875e68b9020ea25290725854319146a5 100644 GIT binary patch delta 29 jcmaE(^+t>LG%qg~0}y00d1P$d$a{&EF=q1v)*gNUhF%FA delta 29 jcmaE(^+t>LG%qg~0}yDgcgrx}$a{&EQGfFT)*gNUg?|X% diff --git a/venv/Lib/site-packages/pydantic/__pycache__/color.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/color.cpython-312.pyc index 218c346a21935663ac8f5b975c9fd326e831130f..785e111907d676e127f25d5a93188d81f95a2370 100644 GIT binary patch delta 32 mcmdn{nsM)IM!wU$yj%=Gkj>* delta 32 mcmdn{nsM)IM!wU$yj%=Gpt;^H<7MzhzD^!S{mnCYR5Jm%WD0u# diff --git a/venv/Lib/site-packages/pydantic/__pycache__/config.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/config.cpython-312.pyc index ae3ef31f0b6596968ad04d37defcef1bd727b226..784c17f43a164d73dce0646fc174ea36f032c11c 100644 GIT binary patch delta 30 kcmZoQZ#CyT&CAQh00h}g9vOdEY~+jQVT{?F$0N=U0DMOX5&!@I delta 30 kcmZoQZ#CyT&CAQh00f%r-7*}OY~+jQVbtH8$0N=U0C&I#jQ{`u diff --git a/venv/Lib/site-packages/pydantic/__pycache__/errors.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/errors.cpython-312.pyc index 897ef888b2f5dcfd6a50384218a05817bb06b90b..53ecf96cf28e20a8bae2f4c164eda411adbae98c 100644 GIT binary patch delta 30 kcmX?Xeb}1sG%qg~0}y00d1UBIY~=IiWQ^Gy#hEDr0C|B2VE_OC delta 30 kcmX?Xeb}1sG%qg~0}yDgcgrXe-^l09$*8|MiZfFL0D>L|-v9sr diff --git a/venv/Lib/site-packages/pydantic/__pycache__/fields.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/fields.cpython-312.pyc index e06466cf6ea7795fd7c9c14710d0cb0e5b9e1660..fe6cce4fc3df9f834dfd34d03f8fc4e4be91df33 100644 GIT binary patch delta 33 ncmbRHnR)JKX8zN>yj%=Gkj>u<|nir0WSz delta 33 ncmbRHnR)JKX8zN>yj%=Gpt;^HL*zHZM*b{eM*YoI!phG8wlWHE diff --git a/venv/Lib/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc index 271ead412c312fd28b2c1bfc243783477a46457f..492c28eaba4e69f74343c559371b01a7e6a2eb3b 100644 GIT binary patch delta 32 mcmbRDn{nQ6M!wU$yj%=Gkj>0AJ0AJ>e+lFO diff --git a/venv/Lib/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc index 0d9dc2a0bd7671d428183cced515eb48e0037a7b..b5c8ef9d90ba02d789f300cebe28089518857d5e 100644 GIT binary patch delta 36 qcmX@}lkLn;Honumyj%=Gkj>vOmiX6_Cg-U=nVkm#tXFo delta 36 rcmX@}lkLn;Honumyj%=Gpt;^H-|7p$ diff --git a/venv/Lib/site-packages/pydantic/__pycache__/networks.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/networks.cpython-312.pyc index 301248de4b3089e133ef1fc7acd292ed8730889f..76e8cd53832c6ed4955fb11146fb5777ec225b66 100644 GIT binary patch delta 46 zcmbQx%sio)neQ|&FBbz4WHWhWur1%nXUoGFv)PA-Ya-*V&Ea$Bivg+cn`iO@04U=R A6aWAK delta 46 zcmbQx%sio)neQ|&FBbz4Xs&n5c(!mOpDhog{$?K@u8EAlHiyrhF9xK(Z=T5u07}si AY5)KL diff --git a/venv/Lib/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc index 182f0a63aa8b5932edc763c290359f123e08f409..dffcdda208157bc3ae230a1dda271bbf69405fd9 100644 GIT binary patch delta 32 mcmeDE$=Lgok?%AwFBbz4WHWhW%&OVQcb}CpX7fAN`DFmD=L-4& delta 32 mcmeDE$=Lgok?%AwFBbz4Xs&n5I9$1r?>;M|{^obA^UDCW8Vg(i diff --git a/venv/Lib/site-packages/pydantic/__pycache__/types.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/types.cpython-312.pyc index 19e09cdc0f522a9fb442e07ad349c04ab45f42ce..731e8d905e2ce7a69f7a22a2650b6bde8cb8d46a 100644 GIT binary patch delta 36 rcmccmk@f0FR=(4`yj%=Gkj># diff --git a/venv/Lib/site-packages/pydantic/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/version.cpython-312.pyc index 8b2a087ebaef87a4423ea08fa7a02df25602019a..04d50b485b2f82445b7bdd9be09d12ecabd3ad1a 100644 GIT binary patch delta 29 jcmdllw_lF;G%qg~0}y00d1SoW$ZNpF7_-@qiIEoob2kSJ delta 29 jcmdllw_lF;G%qg~0}yDgcgvWzk=KBUQGc@?6C*DGbRY)w diff --git a/venv/Lib/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc b/venv/Lib/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc index bf868df5cc5218273ed751dfc907f12eea3a3964..1621d24050df21ecf684f84919bdb5a37314b7ab 100644 GIT binary patch delta 49 zcmaE)^GJv9G%qg~0}y00d1T1&Z{$;EWZ` DS$_^O delta 49 zcmaE)^GJv9G%qg~0}yDgcgxtrw~wRGp{7IC@(QbfAezQEL{Nn#SHTR diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc index 5b29545f861d8632d8d776b0d9846354e4c85652..bfdd2ed16dcf92fde43752e8bce160ef8b13bf80 100644 GIT binary patch delta 39 tcmeyZ{9Bp#G%qg~0}y00d1Q2N diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc index 9046da8a96c20a55eb0dc7d1f7916e801fd27b69..13513e0206fd41b307d4ce8387d80598e72018b6 100644 GIT binary patch delta 42 wcmcaMmFe14Cce|Wyj%=Gkj>Z{!PP;*N>W%qvMP%1g|N*__4nL=XVt2Mitn delta 40 ucmX@7aZZEpG%qg~0}yDgcgy(Bw~;T9iCaHDGp{7IC@(Qbe{&Yo6F~s=$qc{% diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc index 57dfeb3f5c852439ab6ecbac074017b6402afa88..15e13e30c7f44f8345c235b4eda22b36e21349d9 100644 GIT binary patch delta 42 wcmX@t$9S%fk?%AwFBbz4WHWhW)CF(kyUxlT6Q7w^l3J9Pm=m-418bZk02p%)2LJ#7 delta 42 wcmX@t$9S%fk?%AwFBbz4Xs&n5SRc5N?>Z~Detc$LNorAEVvhdi53F&H03$jMMF0Q* diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc index a761535506edf0e21c23855a07821c76853f5d84..2d8d901716253c44deda6c61bca7a07f928fbf90 100644 GIT binary patch delta 39 tcmeC->fz!&&CAQh00h}g9vM{|dG(pNW8yRON>YpR5_4iUyE7eS0sy{q3h@8{ delta 39 tcmeC->fz!&&CAQh00f%r-7=Cl^6E2j>&Iv2m82HsCFbaFc4s=u1OURE3h4j< diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc index c44e8bdc71cebefb40c387c1cbf2f840ace733c9..6eaf2904b3ab8bffa831d2370f05c1fd0b657b8a 100644 GIT binary patch delta 46 zcmccA$8o8TgYPsiFBbz4WHWhW7zuCWTQANX6Q7w^l3J9Pm=n`{LVWuPamKFq07zdC ArT_o{ delta 46 zcmccA$8o8TgYPsiFBbz4Xs&n5c*DMtZ@oCTetc$LNorAEVvc_E3GwYG#2LHZ0{~%- B5MuxU diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc index 1b80872bc393332f36ccce75af66f9aa8296e71d..5ad18f538ba669539ecfa21b362a8de24d7f1e6b 100644 GIT binary patch delta 42 wcmZqP$Jo4&k?%AwFBbz4WHWhW_{4AIlVanJiO3#R}8 diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc index 2f56fc20b58ca6a91f91d448911cb0aa48ee4818..8161e75e1f5df5f53fcf1387c44ccc3cd532781f 100644 GIT binary patch delta 36 qcmX@ZbcTudG%qg~0}y00d1OqV$a|YRCO$K-B(*3nF(+o?=STp*77QW) delta 36 qcmX@ZbcTudG%qg~0}yDgcgvVCk@q&Yetc$LNorAEVvhdA&yfJcEet9E diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc index 192ade22cf3188f8408704edd9cd19535cf1d513..6819e94ab84c00e8be356c3a275094927d2802f1 100644 GIT binary patch delta 40 ucmeCk?a1Xj&CAQh00h}g9vSx>HuAk@=Z=Zb%qvMP%1g|N+04Sxq6Yx_5e&ot delta 40 ucmeCk?a1Xj&CAQh00f%r-7-S$H}bt^=hlzU%qvMP%1g}A-^{|%q6Yx{^lzzjcNc2YYm0~ diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc index 63152d85868dff6097404c2d5a649c9a60b687f5..a37475c082f2bf93a19cc410cac7bf95b5094317 100644 GIT binary patch delta 42 wcmeC`Wa{c<;ycaD%f$c$*-Rc8TY5I~S#xp6#AoJ}q!#5R=EQ6c;WDcN0R6BG$p8QV delta 42 wcmeC`Wa{c<;ycaD%f$c$n(N&%=5%i4v*zN~kI&32NiE7t%+cQ*!ev$k00H3)y#N3J diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-312.pyc index 68649c4d20bf27143bfc71bb05f1cfc01215f03d..c641be8c42188c78db48d53fbc447c7b7f569459 100644 GIT binary patch delta 40 ucmZomXiMNb&CAQh00h}g9vQ{P8~G|(xMSio^GZ^S@)C1mHcw(H(FOqII}9)Y delta 40 ucmZomXiMNb&CAQh00f%r-7@@)Hu6=naO=ls=9Q!tl7iLka-cuM3L+ diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc index 9aad74a819090da9767329b1eb235684fabdf1e3..6124353bd27e359b9e23e8a7b760c9d5f0af3413 100644 GIT binary patch delta 40 ucmX?TaL|D7G%qg~0}y00d1RyuZ{&N%!W|QznOBlpl$V$jv-v-ZlQ017a15#d delta 40 ucmX?TaL|D7G%qg~0}yDgcguJsw2|)_3%7oJW?o5ZQC?z>{^tKIPQn2Hs|`B< diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_serializers.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_serializers.cpython-312.pyc index 9454fdd9b5ed43071063873ca859d27746590b37..25b8ec1aed6b4212dded0ef576357658f7fe23d6 100644 GIT binary patch delta 39 tcmdlXutR|NG%qg~0}y00d1QRw$Q#ST9TT6KSCU$kmzWc?xs>HFGXUI13^4!z delta 39 tcmdlXutR|NG%qg~0}yDgcgr}mkvEowTR%QCuOzi7FEK}db1BPVW&qvW3=04N diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_signature.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_signature.cpython-312.pyc index 6bcbdd5cf4ee27b36c1cfc801504c404b1d6aa9c..41ca88ab2c46d69021166c705a8e795e3d1eb99a 100644 GIT binary patch delta 40 ucmaE0^1y`eG%qg~0}y00d1RPNZ{#as;*N>W%qvMP%1g|N+1$%?SsVcCFbs77 delta 40 ucmaE0^1y`eG%qg~0}yDgcgv`j+Q?VJ#H}BnnOBlpl$V&Jzqyy`vN!CO$K-B(*3nF(+p8QVyRa04iP$`~Uy| delta 42 wcmex(mGR?MM!wU$yj%=Gpt;^H!y<1ZUk?Yjetc$LNorAEVvhdir5rv<05yURJ^%m! diff --git a/venv/Lib/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc b/venv/Lib/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc index d61cb418a10cf30f7dc9a9e3a222ef5d7fc225f6..b817891c76c688f06416376eefd56c1fe81fd45b 100644 GIT binary patch delta 42 xcmbO^lX2!uM!wU$yj%=Gkj>vtj0{{*V4jupi delta 42 xcmbO^lX2!uM!wU$yj%=Gpt;^HpyG(9sfX7e?cco_i9B@5F4 delta 36 qcmdn$wAG3CG%qg~0}yDgcgrx{$a|25L%$%WG(9s$eYf_poem!&CAQh00h}g9vSkY8~NN=IbsTOO4Bp*Vm8OHZW09mt56CH delta 37 rcmeA(>oem!&CAQh00f%r-7+SNY~*ue<-lkxOSM!wU$yj%=Gkj>-lkxOSM!wU$yj%=Gpt;^HBfxSapDr7Vewm^EW_z|CHvqQE37h}` diff --git a/venv/Lib/site-packages/pydantic/v1/__pycache__/color.cpython-312.pyc b/venv/Lib/site-packages/pydantic/v1/__pycache__/color.cpython-312.pyc index 8afa2579bcc4079c7de04cbd471657b4dbdcfc4f..455290a2f6fce50299ecda847dd3750d9dd771c2 100644 GIT binary patch delta 35 pcmcb1lJVL}M!wU$yj%=Gkj>$ delta 35 pcmcb1lJVL}M!wU$yj%=Gpt;^Hnd&D;6)JOR+|3r7F| delta 35 qcmaF5k@4w9M!wU$yj%=Gpt;^H(~|cne?v diff --git a/venv/Lib/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-312.pyc b/venv/Lib/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-312.pyc index fbeb377d526cfabff3d956c976cfaaff3a0e8fec..118b15fb64d6f88ed1862b4867415331553a3247 100644 GIT binary patch delta 33 ncmcZ`a5sSOG%qg~0}y00d1R=_Z{(ZJ!4gwu7_)gT#|C)-qaF#g delta 33 ncmcZ`a5sSOG%qg~0}yDgcgxU`+sHSYgGIm0P=E7Ujt%kvsCNm< diff --git a/venv/Lib/site-packages/pydantic/v1/__pycache__/decorator.cpython-312.pyc b/venv/Lib/site-packages/pydantic/v1/__pycache__/decorator.cpython-312.pyc index 965ee3e389d2b041efa733f08c49b21ae43f38fd..0c411edf9b1b403e577d908cb9fb0ba92fa8b979 100644 GIT binary patch delta 33 ncmcbUb0>%IG%qg~0}y00d1Pd3ZsfCIW{D{?jM?nPEMyD-rw$0= delta 33 ncmcbUb0>%IG%qg~0}yDgcgslD*vMzW%%WdrsK42ZS;!awt7i!3 diff --git a/venv/Lib/site-packages/pydantic/v1/__pycache__/env_settings.cpython-312.pyc b/venv/Lib/site-packages/pydantic/v1/__pycache__/env_settings.cpython-312.pyc index 8a0b8044fc3d960ca5cbb83b26ea279e890071cc..2c909ca070e6b58fc8eae659b59adec9d02b6108 100644 GIT binary patch delta 35 pcmdnp#kjkRk?%AwFBbz4WHWhWlv`}%Tg%K6Q)U>mc|UWFBLK7Y3R(aF delta 35 pcmdnp#kjkRk?%AwFBbz4Xs&n5kTl=Ox0abjzsyj7^M2+UM*ykcunD{X delta 32 mcmccOdc~FZG%qg~0}yDgcgyhE$h(c1MZe5YfAeu>UU>kXzzHe< diff --git a/venv/Lib/site-packages/pydantic/v1/__pycache__/errors.cpython-312.pyc b/venv/Lib/site-packages/pydantic/v1/__pycache__/errors.cpython-312.pyc index 480b857a60a96767e7ccabc8f7a50f5348076b35..bb8f876f730055238888046ef14dc23d30d5b512 100644 GIT binary patch delta 35 pcmbREoN?lFM!wU$yj%=Gkj>$Byj%=Gkj>nd%|)D7t^okf(F_;> delta 35 qcmX?hfce+~X1>$Byj%=Gpt;^HJG%qg~0}y00d1S2H$lK4t5>sXvvv~o_L4E+6PYJaE delta 32 mcmaE;@lb>JG%qg~0}yDgcgwKb$lK4tqF-jHzj*=6L4E+4J_%F+ diff --git a/venv/Lib/site-packages/pydantic/v1/__pycache__/main.cpython-312.pyc b/venv/Lib/site-packages/pydantic/v1/__pycache__/main.cpython-312.pyc index fe06031cd7f23affb66306da9bf777a59b0ee194..2c0f78919a66c2953f6b1f234fcf40ed64d51737 100644 GIT binary patch delta 35 pcmZqt$<+9hiSINoFBbz4WHWhW6mH(gm&wf%Q)U>mxtg18BLKs`3cUaT delta 35 pcmZqt$<+9hiSINoFBbz4Xs&n5kXXNwFO!=^zsyj7b2T^HMgYRv3U2@a diff --git a/venv/Lib/site-packages/pydantic/v1/__pycache__/networks.cpython-312.pyc b/venv/Lib/site-packages/pydantic/v1/__pycache__/networks.cpython-312.pyc index ad01acc38064ab200e061495a3e3f69299e545f6..9a07f1054bba27843ca8e4fb0d359485adbb35ef 100644 GIT binary patch delta 42 wcmaF$jPcboM!wU$yj%=Gkj>nd&3E{_)&csXvvssnp8y5h7xd=W0 delta 32 mcmbO&H(QSPG%qg~0}yDgcgt|x$ScCaqF-jHzgd;#8y5h6)CchZ diff --git a/venv/Lib/site-packages/pydantic/v1/__pycache__/types.cpython-312.pyc b/venv/Lib/site-packages/pydantic/v1/__pycache__/types.cpython-312.pyc index 88b48a63febdbedceddb7e29b39d244be8d398e7..5931425964215e46035027dd4bc33dff5dc7b711 100644 GIT binary patch delta 35 pcmaF)i|OSrCce|Wyj%=Gkj>;nd$gsCce|Wyj%=Gkj>nd%`bTGR|5dU%?s@S delta 35 qcmX>;nd$gsCce|Wyj%=Gpt;^HqcwFS-!)zq{W3%S%`bTGR|5dXC=1g7 diff --git a/venv/Lib/site-packages/pydantic/v1/__pycache__/validators.cpython-312.pyc b/venv/Lib/site-packages/pydantic/v1/__pycache__/validators.cpython-312.pyc index dcc372006e6dbbc1f78c8d915889b70d0d4a0299..f3cf3cc9f58596f14b1d530e15c1e8f33257048e 100644 GIT binary patch delta 35 qcmZ4bk#XrqM!wU$yj%=Gkj>nd%{zJCWCH-su?z74 delta 35 qcmZ4bk#XrqM!wU$yj%=Gpt;^HV|Ca@zU4eD`elatn|JcO$p!$^YzzGW diff --git a/venv/Lib/site-packages/pydantic/v1/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/pydantic/v1/__pycache__/version.cpython-312.pyc index 6baf351de70d8d6dc285651014938932d3d563b6..0fa53f04523facb7135054bd406de449f0282cbd 100644 GIT binary patch delta 32 mcmbQmKZ~FDG%qg~0}y00d1RPw&<=kvm40F{U{~w>?9baeIa?(, Marcelo Trylesinski +License-Expression: Apache-2.0 +License-File: LICENSE.txt +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.8 +Description-Content-Type: text/markdown + +# [Python-Multipart](https://kludex.github.io/python-multipart/) + +[![Package version](https://badge.fury.io/py/python-multipart.svg)](https://pypi.python.org/pypi/python-multipart) +[![Supported Python Version](https://img.shields.io/pypi/pyversions/python-multipart.svg?color=%2334D058)](https://pypi.org/project/python-multipart) + +--- + +`python-multipart` is an Apache2-licensed streaming multipart parser for Python. +Test coverage is currently 100%. + +## Why? + +Because streaming uploads are awesome for large files. diff --git a/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/RECORD b/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/RECORD new file mode 100644 index 00000000..f80836d0 --- /dev/null +++ b/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/RECORD @@ -0,0 +1,23 @@ +multipart/__init__.py,sha256=_ttxOAFnTN4jeac-_8NeXpaXYYo0PPEIp8Ogo4YFNHE,935 +multipart/__pycache__/__init__.cpython-312.pyc,, +multipart/__pycache__/decoders.cpython-312.pyc,, +multipart/__pycache__/exceptions.cpython-312.pyc,, +multipart/__pycache__/multipart.cpython-312.pyc,, +multipart/decoders.py,sha256=XvkAwTU9UFPiXkc0hkvovHf0W6H3vK-2ieWlhav02hQ,40 +multipart/exceptions.py,sha256=6D_X-seiOmMAlIeiGlPGUs8-vpcvIGJeQycFMDb1f7A,42 +multipart/multipart.py,sha256=8fDH14j_VMbrch_58wlzi63XNARGv80kOZAyN72aG7A,41 +python_multipart-0.0.20.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +python_multipart-0.0.20.dist-info/METADATA,sha256=h2GtPOVShbVkpBUrjp5KE3t6eiJJhd0_WCaCXrb5TgU,1817 +python_multipart-0.0.20.dist-info/RECORD,, +python_multipart-0.0.20.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +python_multipart-0.0.20.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +python_multipart-0.0.20.dist-info/licenses/LICENSE.txt,sha256=qOgzF2zWF9rwC51tOfoVyo7evG0WQwec0vSJPAwom-I,556 +python_multipart/__init__.py,sha256=Nlw6Yrc__qXnCZLo17OzbJR2w2mwiSFk69IG4Wl35EU,512 +python_multipart/__pycache__/__init__.cpython-312.pyc,, +python_multipart/__pycache__/decoders.cpython-312.pyc,, +python_multipart/__pycache__/exceptions.cpython-312.pyc,, +python_multipart/__pycache__/multipart.cpython-312.pyc,, +python_multipart/decoders.py,sha256=JM43FMNn_EKP0MI2ZkuZHhNa0MOASoIR0U5TvdG585k,6669 +python_multipart/exceptions.py,sha256=a9buSOv_eiHZoukEJhdWX9LJYSJ6t7XOK3ZEaWoQZlk,992 +python_multipart/multipart.py,sha256=pk3o3eB3KXbNxzOBxbEjCdz-1ESEZIMXVIfl12grG-o,76427 +python_multipart/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/REQUESTED b/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/WHEEL b/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/WHEEL new file mode 100644 index 00000000..12228d41 --- /dev/null +++ b/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/licenses/LICENSE.txt b/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/licenses/LICENSE.txt new file mode 100644 index 00000000..303a1bf5 --- /dev/null +++ b/venv/Lib/site-packages/python_multipart-0.0.20.dist-info/licenses/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright 2012, Andrew Dunham + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + diff --git a/venv/Lib/site-packages/python_multipart/__init__.py b/venv/Lib/site-packages/python_multipart/__init__.py new file mode 100644 index 00000000..e4265264 --- /dev/null +++ b/venv/Lib/site-packages/python_multipart/__init__.py @@ -0,0 +1,25 @@ +# This is the canonical package information. +__author__ = "Andrew Dunham" +__license__ = "Apache" +__copyright__ = "Copyright (c) 2012-2013, Andrew Dunham" +__version__ = "0.0.20" + +from .multipart import ( + BaseParser, + FormParser, + MultipartParser, + OctetStreamParser, + QuerystringParser, + create_form_parser, + parse_form, +) + +__all__ = ( + "BaseParser", + "FormParser", + "MultipartParser", + "OctetStreamParser", + "QuerystringParser", + "create_form_parser", + "parse_form", +) diff --git a/venv/Lib/site-packages/python_multipart/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/python_multipart/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4d5591149d975ffac0a6817be46249c4ad9578b GIT binary patch literal 573 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 Ok~DyypA+_AV*4imFx))= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/python_multipart/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/python_multipart/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6a4f75b462099b0cef08b53ab4010bf295f453d GIT binary patch literal 1742 zcmb7E&rcIU6rSC-v=j=cpe7z14<^^|6)w!6+ufqK%U zCr{k)=#}t)c=12z$;6X4wDrP8-<#c*(twdk_RZUGW_I59y|?dcE|+CEzBFHZ-x7>{ zr^lQ($(`ghu-iO?RP5jb;$- z??O`=%_2Gg2K4PGQApIxe4;Tt8;J6vEhLB; zAp-I4`XgHc2lBa7vZdr}=mk|lbD4*F>%{zCvXQZ@id_cFYGf^|9JtjI`Gc1AwrZE+ zm9%BKfn!;FtVw|!t~|b1e1&((;EBR4HbmN&A@ly;W|`QaT6+=#pnKNQThtT zL)+P~*FhG;n(~5*Rj!tlk1?o8*mfXPeo&DUVNH~03o0#Ln9w%qph^-Wb&s}#Dy1ajk^@^wE{$m%McuY&39sI%Cpr80`TKs5!?j@ zj*^<~ab4P)L`uvHD&}6U=LjP+j8BuKsk2|iH6lqXXCgVaR0UC!N?-=MXl|UDX76`| zCK!|LDS-bWN);){jFEGmjLtYgXJR-o4Nl-fRKV|h3i#B5#Wdk5D$u9{jO)K2w(W8l z7x0#^JgRU`ed6w&=oV}cf-hAA1@0nBs_fMg#4G>G>P4bQ<_bASWC=PG+5TDlzapx) zXWEUSt9^wcz=+C{ccP~Q(T0hWEABFdMCKYkosM!p$_C-{`Aj3bVwbAX#Ze2=|D-Nf zok$|mNH4t9q3N&n6!u|eD(ajM1ZkkV*8(~R3Bxd2reWOLdDCJzwK8dAWany&;nW&U g7@1EuTMVbxAo)*^{GB##7*jjLpD+E!(^ER?zpzE8-T(jq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/python_multipart/__pycache__/multipart.cpython-312.pyc b/venv/Lib/site-packages/python_multipart/__pycache__/multipart.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d53857a5e45f14052c8fe59fe5f3e59dec6dfa4f GIT binary patch literal 67803 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

}E@6sER<=cjly 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∓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 object: ... + + # No way to specify optional methods. See + # https://github.com/python/typing/issues/601 + # close() [Optional] + # finalize() [Optional] + + +class Base64Decoder: + """This object provides an interface to decode a stream of Base64 data. It + is instantiated with an "underlying object", and whenever a write() + operation is performed, it will decode the incoming data as Base64, and + call write() on the underlying object. This is primarily used for decoding + form data encoded as Base64, but can be used for other purposes:: + + from python_multipart.decoders import Base64Decoder + fd = open("notb64.txt", "wb") + decoder = Base64Decoder(fd) + try: + decoder.write("Zm9vYmFy") # "foobar" in Base64 + decoder.finalize() + finally: + decoder.close() + + # The contents of "notb64.txt" should be "foobar". + + This object will also pass all finalize() and close() calls to the + underlying object, if the underlying object supports them. + + Note that this class maintains a cache of base64 chunks, so that a write of + arbitrary size can be performed. You must call :meth:`finalize` on this + object after all writes are completed to ensure that all data is flushed + to the underlying object. + + :param underlying: the underlying object to pass writes to + """ + + def __init__(self, underlying: "SupportsWrite[bytes]") -> None: + self.cache = bytearray() + self.underlying = underlying + + def write(self, data: bytes) -> int: + """Takes any input data provided, decodes it as base64, and passes it + on to the underlying object. If the data provided is invalid base64 + data, then this method will raise + a :class:`python_multipart.exceptions.DecodeError` + + :param data: base64 data to decode + """ + + # Prepend any cache info to our data. + if len(self.cache) > 0: + data = self.cache + data + + # Slice off a string that's a multiple of 4. + decode_len = (len(data) // 4) * 4 + val = data[:decode_len] + + # Decode and write, if we have any. + if len(val) > 0: + try: + decoded = base64.b64decode(val) + except binascii.Error: + raise DecodeError("There was an error raised while decoding base64-encoded data.") + + self.underlying.write(decoded) + + # Get the remaining bytes and save in our cache. + remaining_len = len(data) % 4 + if remaining_len > 0: + self.cache[:] = data[-remaining_len:] + else: + self.cache[:] = b"" + + # Return the length of the data to indicate no error. + return len(data) + + def close(self) -> None: + """Close this decoder. If the underlying object has a `close()` + method, this function will call it. + """ + if hasattr(self.underlying, "close"): + self.underlying.close() + + def finalize(self) -> None: + """Finalize this object. This should be called when no more data + should be written to the stream. This function can raise a + :class:`python_multipart.exceptions.DecodeError` if there is some remaining + data in the cache. + + If the underlying object has a `finalize()` method, this function will + call it. + """ + if len(self.cache) > 0: + raise DecodeError( + "There are %d bytes remaining in the Base64Decoder cache when finalize() is called" % len(self.cache) + ) + + if hasattr(self.underlying, "finalize"): + self.underlying.finalize() + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(underlying={self.underlying!r})" + + +class QuotedPrintableDecoder: + """This object provides an interface to decode a stream of quoted-printable + data. It is instantiated with an "underlying object", in the same manner + as the :class:`python_multipart.decoders.Base64Decoder` class. This class behaves + in exactly the same way, including maintaining a cache of quoted-printable + chunks. + + :param underlying: the underlying object to pass writes to + """ + + def __init__(self, underlying: "SupportsWrite[bytes]") -> None: + self.cache = b"" + self.underlying = underlying + + def write(self, data: bytes) -> int: + """Takes any input data provided, decodes it as quoted-printable, and + passes it on to the underlying object. + + :param data: quoted-printable data to decode + """ + # Prepend any cache info to our data. + if len(self.cache) > 0: + data = self.cache + data + + # If the last 2 characters have an '=' sign in it, then we won't be + # able to decode the encoded value and we'll need to save it for the + # next decoding step. + if data[-2:].find(b"=") != -1: + enc, rest = data[:-2], data[-2:] + else: + enc = data + rest = b"" + + # Encode and write, if we have data. + if len(enc) > 0: + self.underlying.write(binascii.a2b_qp(enc)) + + # Save remaining in cache. + self.cache = rest + return len(data) + + def close(self) -> None: + """Close this decoder. If the underlying object has a `close()` + method, this function will call it. + """ + if hasattr(self.underlying, "close"): + self.underlying.close() + + def finalize(self) -> None: + """Finalize this object. This should be called when no more data + should be written to the stream. This function will not raise any + exceptions, but it may write more data to the underlying object if + there is data remaining in the cache. + + If the underlying object has a `finalize()` method, this function will + call it. + """ + # If we have a cache, write and then remove it. + if len(self.cache) > 0: # pragma: no cover + self.underlying.write(binascii.a2b_qp(self.cache)) + self.cache = b"" + + # Finalize our underlying stream. + if hasattr(self.underlying, "finalize"): + self.underlying.finalize() + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(underlying={self.underlying!r})" diff --git a/venv/Lib/site-packages/python_multipart/exceptions.py b/venv/Lib/site-packages/python_multipart/exceptions.py new file mode 100644 index 00000000..cc3671f5 --- /dev/null +++ b/venv/Lib/site-packages/python_multipart/exceptions.py @@ -0,0 +1,34 @@ +class FormParserError(ValueError): + """Base error class for our form parser.""" + + +class ParseError(FormParserError): + """This exception (or a subclass) is raised when there is an error while + parsing something. + """ + + #: This is the offset in the input data chunk (*NOT* the overall stream) in + #: which the parse error occurred. It will be -1 if not specified. + offset = -1 + + +class MultipartParseError(ParseError): + """This is a specific error that is raised when the MultipartParser detects + an error while parsing. + """ + + +class QuerystringParseError(ParseError): + """This is a specific error that is raised when the QuerystringParser + detects an error while parsing. + """ + + +class DecodeError(ParseError): + """This exception is raised when there is a decoding error - for example + with the Base64Decoder or QuotedPrintableDecoder. + """ + + +class FileError(FormParserError, OSError): + """Exception class for problems with the File class.""" diff --git a/venv/Lib/site-packages/python_multipart/multipart.py b/venv/Lib/site-packages/python_multipart/multipart.py new file mode 100644 index 00000000..f26a815a --- /dev/null +++ b/venv/Lib/site-packages/python_multipart/multipart.py @@ -0,0 +1,1873 @@ +from __future__ import annotations + +import logging +import os +import shutil +import sys +import tempfile +from email.message import Message +from enum import IntEnum +from io import BufferedRandom, BytesIO +from numbers import Number +from typing import TYPE_CHECKING, cast + +from .decoders import Base64Decoder, QuotedPrintableDecoder +from .exceptions import FileError, FormParserError, MultipartParseError, QuerystringParseError + +if TYPE_CHECKING: # pragma: no cover + from typing import Any, Callable, Literal, Protocol, TypedDict + + from typing_extensions import TypeAlias + + class SupportsRead(Protocol): + def read(self, __n: int) -> bytes: ... + + class QuerystringCallbacks(TypedDict, total=False): + on_field_start: Callable[[], None] + on_field_name: Callable[[bytes, int, int], None] + on_field_data: Callable[[bytes, int, int], None] + on_field_end: Callable[[], None] + on_end: Callable[[], None] + + class OctetStreamCallbacks(TypedDict, total=False): + on_start: Callable[[], None] + on_data: Callable[[bytes, int, int], None] + on_end: Callable[[], None] + + class MultipartCallbacks(TypedDict, total=False): + on_part_begin: Callable[[], None] + on_part_data: Callable[[bytes, int, int], None] + on_part_end: Callable[[], None] + on_header_begin: Callable[[], None] + on_header_field: Callable[[bytes, int, int], None] + on_header_value: Callable[[bytes, int, int], None] + on_header_end: Callable[[], None] + on_headers_finished: Callable[[], None] + on_end: Callable[[], None] + + class FormParserConfig(TypedDict): + UPLOAD_DIR: str | None + UPLOAD_KEEP_FILENAME: bool + UPLOAD_KEEP_EXTENSIONS: bool + UPLOAD_ERROR_ON_BAD_CTE: bool + MAX_MEMORY_FILE_SIZE: int + MAX_BODY_SIZE: float + + class FileConfig(TypedDict, total=False): + UPLOAD_DIR: str | bytes | None + UPLOAD_DELETE_TMP: bool + UPLOAD_KEEP_FILENAME: bool + UPLOAD_KEEP_EXTENSIONS: bool + MAX_MEMORY_FILE_SIZE: int + + class _FormProtocol(Protocol): + def write(self, data: bytes) -> int: ... + + def finalize(self) -> None: ... + + def close(self) -> None: ... + + class FieldProtocol(_FormProtocol, Protocol): + def __init__(self, name: bytes | None) -> None: ... + + def set_none(self) -> None: ... + + class FileProtocol(_FormProtocol, Protocol): + def __init__(self, file_name: bytes | None, field_name: bytes | None, config: FileConfig) -> None: ... + + OnFieldCallback = Callable[[FieldProtocol], None] + OnFileCallback = Callable[[FileProtocol], None] + + CallbackName: TypeAlias = Literal[ + "start", + "data", + "end", + "field_start", + "field_name", + "field_data", + "field_end", + "part_begin", + "part_data", + "part_end", + "header_begin", + "header_field", + "header_value", + "header_end", + "headers_finished", + ] + +# Unique missing object. +_missing = object() + + +class QuerystringState(IntEnum): + """Querystring parser states. + + These are used to keep track of the state of the parser, and are used to determine + what to do when new data is encountered. + """ + + BEFORE_FIELD = 0 + FIELD_NAME = 1 + FIELD_DATA = 2 + + +class MultipartState(IntEnum): + """Multipart parser states. + + These are used to keep track of the state of the parser, and are used to determine + what to do when new data is encountered. + """ + + START = 0 + START_BOUNDARY = 1 + HEADER_FIELD_START = 2 + HEADER_FIELD = 3 + HEADER_VALUE_START = 4 + HEADER_VALUE = 5 + HEADER_VALUE_ALMOST_DONE = 6 + HEADERS_ALMOST_DONE = 7 + PART_DATA_START = 8 + PART_DATA = 9 + PART_DATA_END = 10 + END_BOUNDARY = 11 + END = 12 + + +# Flags for the multipart parser. +FLAG_PART_BOUNDARY = 1 +FLAG_LAST_BOUNDARY = 2 + +# Get constants. Since iterating over a str on Python 2 gives you a 1-length +# string, but iterating over a bytes object on Python 3 gives you an integer, +# we need to save these constants. +CR = b"\r"[0] +LF = b"\n"[0] +COLON = b":"[0] +SPACE = b" "[0] +HYPHEN = b"-"[0] +AMPERSAND = b"&"[0] +SEMICOLON = b";"[0] +LOWER_A = b"a"[0] +LOWER_Z = b"z"[0] +NULL = b"\x00"[0] + +# fmt: off +# Mask for ASCII characters that can be http tokens. +# Per RFC7230 - 3.2.6, this is all alpha-numeric characters +# and these: !#$%&'*+-.^_`|~ +TOKEN_CHARS_SET = frozenset( + b"ABCDEFGHIJKLMNOPQRSTUVWXYZ" + b"abcdefghijklmnopqrstuvwxyz" + b"0123456789" + b"!#$%&'*+-.^_`|~") +# fmt: on + + +def parse_options_header(value: str | bytes | None) -> tuple[bytes, dict[bytes, bytes]]: + """Parses a Content-Type header into a value in the following format: (content_type, {parameters}).""" + # Uses email.message.Message to parse the header as described in PEP 594. + # Ref: https://peps.python.org/pep-0594/#cgi + if not value: + return (b"", {}) + + # If we are passed bytes, we assume that it conforms to WSGI, encoding in latin-1. + if isinstance(value, bytes): # pragma: no cover + value = value.decode("latin-1") + + # For types + assert isinstance(value, str), "Value should be a string by now" + + # If we have no options, return the string as-is. + if ";" not in value: + return (value.lower().strip().encode("latin-1"), {}) + + # Split at the first semicolon, to get our value and then options. + # ctype, rest = value.split(b';', 1) + message = Message() + message["content-type"] = value + params = message.get_params() + # If there were no parameters, this would have already returned above + assert params, "At least the content type value should be present" + ctype = params.pop(0)[0].encode("latin-1") + options: dict[bytes, bytes] = {} + for param in params: + key, value = param + # If the value returned from get_params() is a 3-tuple, the last + # element corresponds to the value. + # See: https://docs.python.org/3/library/email.compat32-message.html + if isinstance(value, tuple): + value = value[-1] + # If the value is a filename, we need to fix a bug on IE6 that sends + # the full file path instead of the filename. + if key == "filename": + if value[1:3] == ":\\" or value[:2] == "\\\\": + value = value.split("\\")[-1] + options[key.encode("latin-1")] = value.encode("latin-1") + return ctype, options + + +class Field: + """A Field object represents a (parsed) form field. It represents a single + field with a corresponding name and value. + + The name that a :class:`Field` will be instantiated with is the same name + that would be found in the following HTML:: + + + + This class defines two methods, :meth:`on_data` and :meth:`on_end`, that + will be called when data is written to the Field, and when the Field is + finalized, respectively. + + Args: + name: The name of the form field. + """ + + def __init__(self, name: bytes | None) -> None: + self._name = name + self._value: list[bytes] = [] + + # We cache the joined version of _value for speed. + self._cache = _missing + + @classmethod + def from_value(cls, name: bytes, value: bytes | None) -> Field: + """Create an instance of a :class:`Field`, and set the corresponding + value - either None or an actual value. This method will also + finalize the Field itself. + + Args: + name: the name of the form field. + value: the value of the form field - either a bytestring or None. + + Returns: + A new instance of a [`Field`][python_multipart.Field]. + """ + + f = cls(name) + if value is None: + f.set_none() + else: + f.write(value) + f.finalize() + return f + + def write(self, data: bytes) -> int: + """Write some data into the form field. + + Args: + data: The data to write to the field. + + Returns: + The number of bytes written. + """ + return self.on_data(data) + + def on_data(self, data: bytes) -> int: + """This method is a callback that will be called whenever data is + written to the Field. + + Args: + data: The data to write to the field. + + Returns: + The number of bytes written. + """ + self._value.append(data) + self._cache = _missing + return len(data) + + def on_end(self) -> None: + """This method is called whenever the Field is finalized.""" + if self._cache is _missing: + self._cache = b"".join(self._value) + + def finalize(self) -> None: + """Finalize the form field.""" + self.on_end() + + def close(self) -> None: + """Close the Field object. This will free any underlying cache.""" + # Free our value array. + if self._cache is _missing: + self._cache = b"".join(self._value) + + del self._value + + def set_none(self) -> None: + """Some fields in a querystring can possibly have a value of None - for + example, the string "foo&bar=&baz=asdf" will have a field with the + name "foo" and value None, one with name "bar" and value "", and one + with name "baz" and value "asdf". Since the write() interface doesn't + support writing None, this function will set the field value to None. + """ + self._cache = None + + @property + def field_name(self) -> bytes | None: + """This property returns the name of the field.""" + return self._name + + @property + def value(self) -> bytes | None: + """This property returns the value of the form field.""" + if self._cache is _missing: + self._cache = b"".join(self._value) + + assert isinstance(self._cache, bytes) or self._cache is None + return self._cache + + def __eq__(self, other: object) -> bool: + if isinstance(other, Field): + return self.field_name == other.field_name and self.value == other.value + else: + return NotImplemented + + def __repr__(self) -> str: + if self.value is not None and len(self.value) > 97: + # We get the repr, and then insert three dots before the final + # quote. + v = repr(self.value[:97])[:-1] + "...'" + else: + v = repr(self.value) + + return "{}(field_name={!r}, value={})".format(self.__class__.__name__, self.field_name, v) + + +class File: + """This class represents an uploaded file. It handles writing file data to + either an in-memory file or a temporary file on-disk, if the optional + threshold is passed. + + There are some options that can be passed to the File to change behavior + of the class. Valid options are as follows: + + | Name | Type | Default | Description | + |-----------------------|-------|---------|-------------| + | UPLOAD_DIR | `str` | None | The directory to store uploaded files in. If this is None, a temporary file will be created in the system's standard location. | + | UPLOAD_DELETE_TMP | `bool`| True | Delete automatically created TMP file | + | UPLOAD_KEEP_FILENAME | `bool`| False | Whether or not to keep the filename of the uploaded file. If True, then the filename will be converted to a safe representation (e.g. by removing any invalid path segments), and then saved with the same name). Otherwise, a temporary name will be used. | + | UPLOAD_KEEP_EXTENSIONS| `bool`| False | Whether or not to keep the uploaded file's extension. If False, the file will be saved with the default temporary extension (usually ".tmp"). Otherwise, the file's extension will be maintained. Note that this will properly combine with the UPLOAD_KEEP_FILENAME setting. | + | MAX_MEMORY_FILE_SIZE | `int` | 1 MiB | The maximum number of bytes of a File to keep in memory. By default, the contents of a File are kept into memory until a certain limit is reached, after which the contents of the File are written to a temporary file. This behavior can be disabled by setting this value to an appropriately large value (or, for example, infinity, such as `float('inf')`. | + + Args: + file_name: The name of the file that this [`File`][python_multipart.File] represents. + field_name: The name of the form field that this file was uploaded with. This can be None, if, for example, + the file was uploaded with Content-Type application/octet-stream. + config: The configuration for this File. See above for valid configuration keys and their corresponding values. + """ # noqa: E501 + + def __init__(self, file_name: bytes | None, field_name: bytes | None = None, config: FileConfig = {}) -> None: + # Save configuration, set other variables default. + self.logger = logging.getLogger(__name__) + self._config = config + self._in_memory = True + self._bytes_written = 0 + self._fileobj: BytesIO | BufferedRandom = BytesIO() + + # Save the provided field/file name. + self._field_name = field_name + self._file_name = file_name + + # Our actual file name is None by default, since, depending on our + # config, we may not actually use the provided name. + self._actual_file_name: bytes | None = None + + # Split the extension from the filename. + if file_name is not None: + base, ext = os.path.splitext(file_name) + self._file_base = base + self._ext = ext + + @property + def field_name(self) -> bytes | None: + """The form field associated with this file. May be None if there isn't + one, for example when we have an application/octet-stream upload. + """ + return self._field_name + + @property + def file_name(self) -> bytes | None: + """The file name given in the upload request.""" + return self._file_name + + @property + def actual_file_name(self) -> bytes | None: + """The file name that this file is saved as. Will be None if it's not + currently saved on disk. + """ + return self._actual_file_name + + @property + def file_object(self) -> BytesIO | BufferedRandom: + """The file object that we're currently writing to. Note that this + will either be an instance of a :class:`io.BytesIO`, or a regular file + object. + """ + return self._fileobj + + @property + def size(self) -> int: + """The total size of this file, counted as the number of bytes that + currently have been written to the file. + """ + return self._bytes_written + + @property + def in_memory(self) -> bool: + """A boolean representing whether or not this file object is currently + stored in-memory or on-disk. + """ + return self._in_memory + + def flush_to_disk(self) -> None: + """If the file is already on-disk, do nothing. Otherwise, copy from + the in-memory buffer to a disk file, and then reassign our internal + file object to this new disk file. + + Note that if you attempt to flush a file that is already on-disk, a + warning will be logged to this module's logger. + """ + if not self._in_memory: + self.logger.warning("Trying to flush to disk when we're not in memory") + return + + # Go back to the start of our file. + self._fileobj.seek(0) + + # Open a new file. + new_file = self._get_disk_file() + + # Copy the file objects. + shutil.copyfileobj(self._fileobj, new_file) + + # Seek to the new position in our new file. + new_file.seek(self._bytes_written) + + # Reassign the fileobject. + old_fileobj = self._fileobj + self._fileobj = new_file + + # We're no longer in memory. + self._in_memory = False + + # Close the old file object. + old_fileobj.close() + + def _get_disk_file(self) -> BufferedRandom: + """This function is responsible for getting a file object on-disk for us.""" + self.logger.info("Opening a file on disk") + + file_dir = self._config.get("UPLOAD_DIR") + keep_filename = self._config.get("UPLOAD_KEEP_FILENAME", False) + keep_extensions = self._config.get("UPLOAD_KEEP_EXTENSIONS", False) + delete_tmp = self._config.get("UPLOAD_DELETE_TMP", True) + tmp_file: None | BufferedRandom = None + + # If we have a directory and are to keep the filename... + if file_dir is not None and keep_filename: + self.logger.info("Saving with filename in: %r", file_dir) + + # Build our filename. + # TODO: what happens if we don't have a filename? + fname = self._file_base + self._ext if keep_extensions else self._file_base + + path = os.path.join(file_dir, fname) # type: ignore[arg-type] + try: + self.logger.info("Opening file: %r", path) + tmp_file = open(path, "w+b") + except OSError: + tmp_file = None + + self.logger.exception("Error opening temporary file") + raise FileError("Error opening temporary file: %r" % path) + else: + # Build options array. + # Note that on Python 3, tempfile doesn't support byte names. We + # encode our paths using the default filesystem encoding. + suffix = self._ext.decode(sys.getfilesystemencoding()) if keep_extensions else None + + if file_dir is None: + dir = None + elif isinstance(file_dir, bytes): + dir = file_dir.decode(sys.getfilesystemencoding()) + else: + dir = file_dir # pragma: no cover + + # Create a temporary (named) file with the appropriate settings. + self.logger.info( + "Creating a temporary file with options: %r", {"suffix": suffix, "delete": delete_tmp, "dir": dir} + ) + try: + tmp_file = cast(BufferedRandom, tempfile.NamedTemporaryFile(suffix=suffix, delete=delete_tmp, dir=dir)) + except OSError: + self.logger.exception("Error creating named temporary file") + raise FileError("Error creating named temporary file") + + assert tmp_file is not None + # Encode filename as bytes. + if isinstance(tmp_file.name, str): + fname = tmp_file.name.encode(sys.getfilesystemencoding()) + else: + fname = cast(bytes, tmp_file.name) # pragma: no cover + + self._actual_file_name = fname + return tmp_file + + def write(self, data: bytes) -> int: + """Write some data to the File. + + :param data: a bytestring + """ + return self.on_data(data) + + def on_data(self, data: bytes) -> int: + """This method is a callback that will be called whenever data is + written to the File. + + Args: + data: The data to write to the file. + + Returns: + The number of bytes written. + """ + bwritten = self._fileobj.write(data) + + # If the bytes written isn't the same as the length, just return. + if bwritten != len(data): + self.logger.warning("bwritten != len(data) (%d != %d)", bwritten, len(data)) + return bwritten + + # Keep track of how many bytes we've written. + self._bytes_written += bwritten + + # If we're in-memory and are over our limit, we create a file. + max_memory_file_size = self._config.get("MAX_MEMORY_FILE_SIZE") + if self._in_memory and max_memory_file_size is not None and (self._bytes_written > max_memory_file_size): + self.logger.info("Flushing to disk") + self.flush_to_disk() + + # Return the number of bytes written. + return bwritten + + def on_end(self) -> None: + """This method is called whenever the Field is finalized.""" + # Flush the underlying file object + self._fileobj.flush() + + def finalize(self) -> None: + """Finalize the form file. This will not close the underlying file, + but simply signal that we are finished writing to the File. + """ + self.on_end() + + def close(self) -> None: + """Close the File object. This will actually close the underlying + file object (whether it's a :class:`io.BytesIO` or an actual file + object). + """ + self._fileobj.close() + + def __repr__(self) -> str: + return "{}(file_name={!r}, field_name={!r})".format(self.__class__.__name__, self.file_name, self.field_name) + + +class BaseParser: + """This class is the base class for all parsers. It contains the logic for + calling and adding callbacks. + + A callback can be one of two different forms. "Notification callbacks" are + callbacks that are called when something happens - for example, when a new + part of a multipart message is encountered by the parser. "Data callbacks" + are called when we get some sort of data - for example, part of the body of + a multipart chunk. Notification callbacks are called with no parameters, + whereas data callbacks are called with three, as follows:: + + data_callback(data, start, end) + + The "data" parameter is a bytestring (i.e. "foo" on Python 2, or b"foo" on + Python 3). "start" and "end" are integer indexes into the "data" string + that represent the data of interest. Thus, in a data callback, the slice + `data[start:end]` represents the data that the callback is "interested in". + The callback is not passed a copy of the data, since copying severely hurts + performance. + """ + + def __init__(self) -> None: + self.logger = logging.getLogger(__name__) + self.callbacks: QuerystringCallbacks | OctetStreamCallbacks | MultipartCallbacks = {} + + def callback( + self, name: CallbackName, data: bytes | None = None, start: int | None = None, end: int | None = None + ) -> None: + """This function calls a provided callback with some data. If the + callback is not set, will do nothing. + + Args: + name: The name of the callback to call (as a string). + data: Data to pass to the callback. If None, then it is assumed that the callback is a notification + callback, and no parameters are given. + end: An integer that is passed to the data callback. + start: An integer that is passed to the data callback. + """ + on_name = "on_" + name + func = self.callbacks.get(on_name) + if func is None: + return + func = cast("Callable[..., Any]", func) + # Depending on whether we're given a buffer... + if data is not None: + # Don't do anything if we have start == end. + if start is not None and start == end: + return + + self.logger.debug("Calling %s with data[%d:%d]", on_name, start, end) + func(data, start, end) + else: + self.logger.debug("Calling %s with no data", on_name) + func() + + def set_callback(self, name: CallbackName, new_func: Callable[..., Any] | None) -> None: + """Update the function for a callback. Removes from the callbacks dict + if new_func is None. + + :param name: The name of the callback to call (as a string). + + :param new_func: The new function for the callback. If None, then the + callback will be removed (with no error if it does not + exist). + """ + if new_func is None: + self.callbacks.pop("on_" + name, None) # type: ignore[misc] + else: + self.callbacks["on_" + name] = new_func # type: ignore[literal-required] + + def close(self) -> None: + pass # pragma: no cover + + def finalize(self) -> None: + pass # pragma: no cover + + def __repr__(self) -> str: + return "%s()" % self.__class__.__name__ + + +class OctetStreamParser(BaseParser): + """This parser parses an octet-stream request body and calls callbacks when + incoming data is received. Callbacks are as follows: + + | Callback Name | Parameters | Description | + |----------------|-----------------|-----------------------------------------------------| + | on_start | None | Called when the first data is parsed. | + | on_data | data, start, end| Called for each data chunk that is parsed. | + | on_end | None | Called when the parser is finished parsing all data.| + + Args: + callbacks: A dictionary of callbacks. See the documentation for [`BaseParser`][python_multipart.BaseParser]. + max_size: The maximum size of body to parse. Defaults to infinity - i.e. unbounded. + """ + + def __init__(self, callbacks: OctetStreamCallbacks = {}, max_size: float = float("inf")): + super().__init__() + self.callbacks = callbacks + self._started = False + + if not isinstance(max_size, Number) or max_size < 1: + raise ValueError("max_size must be a positive number, not %r" % max_size) + self.max_size: int | float = max_size + self._current_size = 0 + + def write(self, data: bytes) -> int: + """Write some data to the parser, which will perform size verification, + and then pass the data to the underlying callback. + + Args: + data: The data to write to the parser. + + Returns: + The number of bytes written. + """ + if not self._started: + self.callback("start") + self._started = True + + # Truncate data length. + data_len = len(data) + if (self._current_size + data_len) > self.max_size: + # We truncate the length of data that we are to process. + new_size = int(self.max_size - self._current_size) + self.logger.warning( + "Current size is %d (max %d), so truncating data length from %d to %d", + self._current_size, + self.max_size, + data_len, + new_size, + ) + data_len = new_size + + # Increment size, then callback, in case there's an exception. + self._current_size += data_len + self.callback("data", data, 0, data_len) + return data_len + + def finalize(self) -> None: + """Finalize this parser, which signals to that we are finished parsing, + and sends the on_end callback. + """ + self.callback("end") + + def __repr__(self) -> str: + return "%s()" % self.__class__.__name__ + + +class QuerystringParser(BaseParser): + """This is a streaming querystring parser. It will consume data, and call + the callbacks given when it has data. + + | Callback Name | Parameters | Description | + |----------------|-----------------|-----------------------------------------------------| + | on_field_start | None | Called when a new field is encountered. | + | on_field_name | data, start, end| Called when a portion of a field's name is encountered. | + | on_field_data | data, start, end| Called when a portion of a field's data is encountered. | + | on_field_end | None | Called when the end of a field is encountered. | + | on_end | None | Called when the parser is finished parsing all data.| + + Args: + callbacks: A dictionary of callbacks. See the documentation for [`BaseParser`][python_multipart.BaseParser]. + strict_parsing: Whether or not to parse the body strictly. Defaults to False. If this is set to True, then the + behavior of the parser changes as the following: if a field has a value with an equal sign + (e.g. "foo=bar", or "foo="), it is always included. If a field has no equals sign (e.g. "...&name&..."), + it will be treated as an error if 'strict_parsing' is True, otherwise included. If an error is encountered, + then a [`QuerystringParseError`][python_multipart.exceptions.QuerystringParseError] will be raised. + max_size: The maximum size of body to parse. Defaults to infinity - i.e. unbounded. + """ # noqa: E501 + + state: QuerystringState + + def __init__( + self, callbacks: QuerystringCallbacks = {}, strict_parsing: bool = False, max_size: float = float("inf") + ) -> None: + super().__init__() + self.state = QuerystringState.BEFORE_FIELD + self._found_sep = False + + self.callbacks = callbacks + + # Max-size stuff + if not isinstance(max_size, Number) or max_size < 1: + raise ValueError("max_size must be a positive number, not %r" % max_size) + self.max_size: int | float = max_size + self._current_size = 0 + + # Should parsing be strict? + self.strict_parsing = strict_parsing + + def write(self, data: bytes) -> int: + """Write some data to the parser, which will perform size verification, + parse into either a field name or value, and then pass the + corresponding data to the underlying callback. If an error is + encountered while parsing, a QuerystringParseError will be raised. The + "offset" attribute of the raised exception will be set to the offset in + the input data chunk (NOT the overall stream) that caused the error. + + Args: + data: The data to write to the parser. + + Returns: + The number of bytes written. + """ + # Handle sizing. + data_len = len(data) + if (self._current_size + data_len) > self.max_size: + # We truncate the length of data that we are to process. + new_size = int(self.max_size - self._current_size) + self.logger.warning( + "Current size is %d (max %d), so truncating data length from %d to %d", + self._current_size, + self.max_size, + data_len, + new_size, + ) + data_len = new_size + + l = 0 + try: + l = self._internal_write(data, data_len) + finally: + self._current_size += l + + return l + + def _internal_write(self, data: bytes, length: int) -> int: + state = self.state + strict_parsing = self.strict_parsing + found_sep = self._found_sep + + i = 0 + while i < length: + ch = data[i] + + # Depending on our state... + if state == QuerystringState.BEFORE_FIELD: + # If the 'found_sep' flag is set, we've already encountered + # and skipped a single separator. If so, we check our strict + # parsing flag and decide what to do. Otherwise, we haven't + # yet reached a separator, and thus, if we do, we need to skip + # it as it will be the boundary between fields that's supposed + # to be there. + if ch == AMPERSAND or ch == SEMICOLON: + if found_sep: + # If we're parsing strictly, we disallow blank chunks. + if strict_parsing: + e = QuerystringParseError("Skipping duplicate ampersand/semicolon at %d" % i) + e.offset = i + raise e + else: + self.logger.debug("Skipping duplicate ampersand/semicolon at %d", i) + else: + # This case is when we're skipping the (first) + # separator between fields, so we just set our flag + # and continue on. + found_sep = True + else: + # Emit a field-start event, and go to that state. Also, + # reset the "found_sep" flag, for the next time we get to + # this state. + self.callback("field_start") + i -= 1 + state = QuerystringState.FIELD_NAME + found_sep = False + + elif state == QuerystringState.FIELD_NAME: + # Try and find a separator - we ensure that, if we do, we only + # look for the equal sign before it. + sep_pos = data.find(b"&", i) + if sep_pos == -1: + sep_pos = data.find(b";", i) + + # See if we can find an equals sign in the remaining data. If + # so, we can immediately emit the field name and jump to the + # data state. + if sep_pos != -1: + equals_pos = data.find(b"=", i, sep_pos) + else: + equals_pos = data.find(b"=", i) + + if equals_pos != -1: + # Emit this name. + self.callback("field_name", data, i, equals_pos) + + # Jump i to this position. Note that it will then have 1 + # added to it below, which means the next iteration of this + # loop will inspect the character after the equals sign. + i = equals_pos + state = QuerystringState.FIELD_DATA + else: + # No equals sign found. + if not strict_parsing: + # See also comments in the QuerystringState.FIELD_DATA case below. + # If we found the separator, we emit the name and just + # end - there's no data callback at all (not even with + # a blank value). + if sep_pos != -1: + self.callback("field_name", data, i, sep_pos) + self.callback("field_end") + + i = sep_pos - 1 + state = QuerystringState.BEFORE_FIELD + else: + # Otherwise, no separator in this block, so the + # rest of this chunk must be a name. + self.callback("field_name", data, i, length) + i = length + + else: + # We're parsing strictly. If we find a separator, + # this is an error - we require an equals sign. + if sep_pos != -1: + e = QuerystringParseError( + "When strict_parsing is True, we require an " + "equals sign in all field chunks. Did not " + "find one in the chunk that starts at %d" % (i,) + ) + e.offset = i + raise e + + # No separator in the rest of this chunk, so it's just + # a field name. + self.callback("field_name", data, i, length) + i = length + + elif state == QuerystringState.FIELD_DATA: + # Try finding either an ampersand or a semicolon after this + # position. + sep_pos = data.find(b"&", i) + if sep_pos == -1: + sep_pos = data.find(b";", i) + + # If we found it, callback this bit as data and then go back + # to expecting to find a field. + if sep_pos != -1: + self.callback("field_data", data, i, sep_pos) + self.callback("field_end") + + # Note that we go to the separator, which brings us to the + # "before field" state. This allows us to properly emit + # "field_start" events only when we actually have data for + # a field of some sort. + i = sep_pos - 1 + state = QuerystringState.BEFORE_FIELD + + # Otherwise, emit the rest as data and finish. + else: + self.callback("field_data", data, i, length) + i = length + + else: # pragma: no cover (error case) + msg = "Reached an unknown state %d at %d" % (state, i) + self.logger.warning(msg) + e = QuerystringParseError(msg) + e.offset = i + raise e + + i += 1 + + self.state = state + self._found_sep = found_sep + return len(data) + + def finalize(self) -> None: + """Finalize this parser, which signals to that we are finished parsing, + if we're still in the middle of a field, an on_field_end callback, and + then the on_end callback. + """ + # If we're currently in the middle of a field, we finish it. + if self.state == QuerystringState.FIELD_DATA: + self.callback("field_end") + self.callback("end") + + def __repr__(self) -> str: + return "{}(strict_parsing={!r}, max_size={!r})".format( + self.__class__.__name__, self.strict_parsing, self.max_size + ) + + +class MultipartParser(BaseParser): + """This class is a streaming multipart/form-data parser. + + | Callback Name | Parameters | Description | + |--------------------|-----------------|-------------| + | on_part_begin | None | Called when a new part of the multipart message is encountered. | + | on_part_data | data, start, end| Called when a portion of a part's data is encountered. | + | on_part_end | None | Called when the end of a part is reached. | + | on_header_begin | None | Called when we've found a new header in a part of a multipart message | + | on_header_field | data, start, end| Called each time an additional portion of a header is read (i.e. the part of the header that is before the colon; the "Foo" in "Foo: Bar"). | + | on_header_value | data, start, end| Called when we get data for a header. | + | on_header_end | None | Called when the current header is finished - i.e. we've reached the newline at the end of the header. | + | on_headers_finished| None | Called when all headers are finished, and before the part data starts. | + | on_end | None | Called when the parser is finished parsing all data. | + + Args: + boundary: The multipart boundary. This is required, and must match what is given in the HTTP request - usually in the Content-Type header. + callbacks: A dictionary of callbacks. See the documentation for [`BaseParser`][python_multipart.BaseParser]. + max_size: The maximum size of body to parse. Defaults to infinity - i.e. unbounded. + """ # noqa: E501 + + def __init__( + self, boundary: bytes | str, callbacks: MultipartCallbacks = {}, max_size: float = float("inf") + ) -> None: + # Initialize parser state. + super().__init__() + self.state = MultipartState.START + self.index = self.flags = 0 + + self.callbacks = callbacks + + if not isinstance(max_size, Number) or max_size < 1: + raise ValueError("max_size must be a positive number, not %r" % max_size) + self.max_size = max_size + self._current_size = 0 + + # Setup marks. These are used to track the state of data received. + self.marks: dict[str, int] = {} + + # Save our boundary. + if isinstance(boundary, str): # pragma: no cover + boundary = boundary.encode("latin-1") + self.boundary = b"\r\n--" + boundary + + def write(self, data: bytes) -> int: + """Write some data to the parser, which will perform size verification, + and then parse the data into the appropriate location (e.g. header, + data, etc.), and pass this on to the underlying callback. If an error + is encountered, a MultipartParseError will be raised. The "offset" + attribute on the raised exception will be set to the offset of the byte + in the input chunk that caused the error. + + Args: + data: The data to write to the parser. + + Returns: + The number of bytes written. + """ + # Handle sizing. + data_len = len(data) + if (self._current_size + data_len) > self.max_size: + # We truncate the length of data that we are to process. + new_size = int(self.max_size - self._current_size) + self.logger.warning( + "Current size is %d (max %d), so truncating data length from %d to %d", + self._current_size, + self.max_size, + data_len, + new_size, + ) + data_len = new_size + + l = 0 + try: + l = self._internal_write(data, data_len) + finally: + self._current_size += l + + return l + + def _internal_write(self, data: bytes, length: int) -> int: + # Get values from locals. + boundary = self.boundary + + # Get our state, flags and index. These are persisted between calls to + # this function. + state = self.state + index = self.index + flags = self.flags + + # Our index defaults to 0. + i = 0 + + # Set a mark. + def set_mark(name: str) -> None: + self.marks[name] = i + + # Remove a mark. + def delete_mark(name: str, reset: bool = False) -> None: + self.marks.pop(name, None) + + # Helper function that makes calling a callback with data easier. The + # 'remaining' parameter will callback from the marked value until the + # end of the buffer, and reset the mark, instead of deleting it. This + # is used at the end of the function to call our callbacks with any + # remaining data in this chunk. + def data_callback(name: CallbackName, end_i: int, remaining: bool = False) -> None: + marked_index = self.marks.get(name) + if marked_index is None: + return + + # Otherwise, we call it from the mark to the current byte we're + # processing. + if end_i <= marked_index: + # There is no additional data to send. + pass + elif marked_index >= 0: + # We are emitting data from the local buffer. + self.callback(name, data, marked_index, end_i) + else: + # Some of the data comes from a partial boundary match. + # and requires look-behind. + # We need to use self.flags (and not flags) because we care about + # the state when we entered the loop. + lookbehind_len = -marked_index + if lookbehind_len <= len(boundary): + self.callback(name, boundary, 0, lookbehind_len) + elif self.flags & FLAG_PART_BOUNDARY: + lookback = boundary + b"\r\n" + self.callback(name, lookback, 0, lookbehind_len) + elif self.flags & FLAG_LAST_BOUNDARY: + lookback = boundary + b"--\r\n" + self.callback(name, lookback, 0, lookbehind_len) + else: # pragma: no cover (error case) + self.logger.warning("Look-back buffer error") + + if end_i > 0: + self.callback(name, data, 0, end_i) + # If we're getting remaining data, we have got all the data we + # can be certain is not a boundary, leaving only a partial boundary match. + if remaining: + self.marks[name] = end_i - length + else: + self.marks.pop(name, None) + + # For each byte... + while i < length: + c = data[i] + + if state == MultipartState.START: + # Skip leading newlines + if c == CR or c == LF: + i += 1 + continue + + # index is used as in index into our boundary. Set to 0. + index = 0 + + # Move to the next state, but decrement i so that we re-process + # this character. + state = MultipartState.START_BOUNDARY + i -= 1 + + elif state == MultipartState.START_BOUNDARY: + # Check to ensure that the last 2 characters in our boundary + # are CRLF. + if index == len(boundary) - 2: + if c == HYPHEN: + # Potential empty message. + state = MultipartState.END_BOUNDARY + elif c != CR: + # Error! + msg = "Did not find CR at end of boundary (%d)" % (i,) + self.logger.warning(msg) + e = MultipartParseError(msg) + e.offset = i + raise e + + index += 1 + + elif index == len(boundary) - 2 + 1: + if c != LF: + msg = "Did not find LF at end of boundary (%d)" % (i,) + self.logger.warning(msg) + e = MultipartParseError(msg) + e.offset = i + raise e + + # The index is now used for indexing into our boundary. + index = 0 + + # Callback for the start of a part. + self.callback("part_begin") + + # Move to the next character and state. + state = MultipartState.HEADER_FIELD_START + + else: + # Check to ensure our boundary matches + if c != boundary[index + 2]: + msg = "Expected boundary character %r, got %r at index %d" % (boundary[index + 2], c, index + 2) + self.logger.warning(msg) + e = MultipartParseError(msg) + e.offset = i + raise e + + # Increment index into boundary and continue. + index += 1 + + elif state == MultipartState.HEADER_FIELD_START: + # Mark the start of a header field here, reset the index, and + # continue parsing our header field. + index = 0 + + # Set a mark of our header field. + set_mark("header_field") + + # Notify that we're starting a header if the next character is + # not a CR; a CR at the beginning of the header will cause us + # to stop parsing headers in the MultipartState.HEADER_FIELD state, + # below. + if c != CR: + self.callback("header_begin") + + # Move to parsing header fields. + state = MultipartState.HEADER_FIELD + i -= 1 + + elif state == MultipartState.HEADER_FIELD: + # If we've reached a CR at the beginning of a header, it means + # that we've reached the second of 2 newlines, and so there are + # no more headers to parse. + if c == CR and index == 0: + delete_mark("header_field") + state = MultipartState.HEADERS_ALMOST_DONE + i += 1 + continue + + # Increment our index in the header. + index += 1 + + # If we've reached a colon, we're done with this header. + if c == COLON: + # A 0-length header is an error. + if index == 1: + msg = "Found 0-length header at %d" % (i,) + self.logger.warning(msg) + e = MultipartParseError(msg) + e.offset = i + raise e + + # Call our callback with the header field. + data_callback("header_field", i) + + # Move to parsing the header value. + state = MultipartState.HEADER_VALUE_START + + elif c not in TOKEN_CHARS_SET: + msg = "Found invalid character %r in header at %d" % (c, i) + self.logger.warning(msg) + e = MultipartParseError(msg) + e.offset = i + raise e + + elif state == MultipartState.HEADER_VALUE_START: + # Skip leading spaces. + if c == SPACE: + i += 1 + continue + + # Mark the start of the header value. + set_mark("header_value") + + # Move to the header-value state, reprocessing this character. + state = MultipartState.HEADER_VALUE + i -= 1 + + elif state == MultipartState.HEADER_VALUE: + # If we've got a CR, we're nearly done our headers. Otherwise, + # we do nothing and just move past this character. + if c == CR: + data_callback("header_value", i) + self.callback("header_end") + state = MultipartState.HEADER_VALUE_ALMOST_DONE + + elif state == MultipartState.HEADER_VALUE_ALMOST_DONE: + # The last character should be a LF. If not, it's an error. + if c != LF: + msg = "Did not find LF character at end of header " "(found %r)" % (c,) + self.logger.warning(msg) + e = MultipartParseError(msg) + e.offset = i + raise e + + # Move back to the start of another header. Note that if that + # state detects ANOTHER newline, it'll trigger the end of our + # headers. + state = MultipartState.HEADER_FIELD_START + + elif state == MultipartState.HEADERS_ALMOST_DONE: + # We're almost done our headers. This is reached when we parse + # a CR at the beginning of a header, so our next character + # should be a LF, or it's an error. + if c != LF: + msg = f"Did not find LF at end of headers (found {c!r})" + self.logger.warning(msg) + e = MultipartParseError(msg) + e.offset = i + raise e + + self.callback("headers_finished") + state = MultipartState.PART_DATA_START + + elif state == MultipartState.PART_DATA_START: + # Mark the start of our part data. + set_mark("part_data") + + # Start processing part data, including this character. + state = MultipartState.PART_DATA + i -= 1 + + elif state == MultipartState.PART_DATA: + # We're processing our part data right now. During this, we + # need to efficiently search for our boundary, since any data + # on any number of lines can be a part of the current data. + + # Save the current value of our index. We use this in case we + # find part of a boundary, but it doesn't match fully. + prev_index = index + + # Set up variables. + boundary_length = len(boundary) + data_length = length + + # If our index is 0, we're starting a new part, so start our + # search. + if index == 0: + # The most common case is likely to be that the whole + # boundary is present in the buffer. + # Calling `find` is much faster than iterating here. + i0 = data.find(boundary, i, data_length) + if i0 >= 0: + # We matched the whole boundary string. + index = boundary_length - 1 + i = i0 + boundary_length - 1 + else: + # No match found for whole string. + # There may be a partial boundary at the end of the + # data, which the find will not match. + # Since the length should to be searched is limited to + # the boundary length, just perform a naive search. + i = max(i, data_length - boundary_length) + + # Search forward until we either hit the end of our buffer, + # or reach a potential start of the boundary. + while i < data_length - 1 and data[i] != boundary[0]: + i += 1 + + c = data[i] + + # Now, we have a couple of cases here. If our index is before + # the end of the boundary... + if index < boundary_length: + # If the character matches... + if boundary[index] == c: + # The current character matches, so continue! + index += 1 + else: + index = 0 + + # Our index is equal to the length of our boundary! + elif index == boundary_length: + # First we increment it. + index += 1 + + # Now, if we've reached a newline, we need to set this as + # the potential end of our boundary. + if c == CR: + flags |= FLAG_PART_BOUNDARY + + # Otherwise, if this is a hyphen, we might be at the last + # of all boundaries. + elif c == HYPHEN: + flags |= FLAG_LAST_BOUNDARY + + # Otherwise, we reset our index, since this isn't either a + # newline or a hyphen. + else: + index = 0 + + # Our index is right after the part boundary, which should be + # a LF. + elif index == boundary_length + 1: + # If we're at a part boundary (i.e. we've seen a CR + # character already)... + if flags & FLAG_PART_BOUNDARY: + # We need a LF character next. + if c == LF: + # Unset the part boundary flag. + flags &= ~FLAG_PART_BOUNDARY + + # We have identified a boundary, callback for any data before it. + data_callback("part_data", i - index) + # Callback indicating that we've reached the end of + # a part, and are starting a new one. + self.callback("part_end") + self.callback("part_begin") + + # Move to parsing new headers. + index = 0 + state = MultipartState.HEADER_FIELD_START + i += 1 + continue + + # We didn't find an LF character, so no match. Reset + # our index and clear our flag. + index = 0 + flags &= ~FLAG_PART_BOUNDARY + + # Otherwise, if we're at the last boundary (i.e. we've + # seen a hyphen already)... + elif flags & FLAG_LAST_BOUNDARY: + # We need a second hyphen here. + if c == HYPHEN: + # We have identified a boundary, callback for any data before it. + data_callback("part_data", i - index) + # Callback to end the current part, and then the + # message. + self.callback("part_end") + self.callback("end") + state = MultipartState.END + else: + # No match, so reset index. + index = 0 + + # Otherwise, our index is 0. If the previous index is not, it + # means we reset something, and we need to take the data we + # thought was part of our boundary and send it along as actual + # data. + if index == 0 and prev_index > 0: + # Overwrite our previous index. + prev_index = 0 + + # Re-consider the current character, since this could be + # the start of the boundary itself. + i -= 1 + + elif state == MultipartState.END_BOUNDARY: + if index == len(boundary) - 2 + 1: + if c != HYPHEN: + msg = "Did not find - at end of boundary (%d)" % (i,) + self.logger.warning(msg) + e = MultipartParseError(msg) + e.offset = i + raise e + index += 1 + self.callback("end") + state = MultipartState.END + + elif state == MultipartState.END: + # Don't do anything if chunk ends with CRLF. + if c == CR and i + 1 < length and data[i + 1] == LF: + i += 2 + continue + # Skip data after the last boundary. + self.logger.warning("Skipping data after last boundary") + i = length + break + + else: # pragma: no cover (error case) + # We got into a strange state somehow! Just stop processing. + msg = "Reached an unknown state %d at %d" % (state, i) + self.logger.warning(msg) + e = MultipartParseError(msg) + e.offset = i + raise e + + # Move to the next byte. + i += 1 + + # We call our callbacks with any remaining data. Note that we pass + # the 'remaining' flag, which sets the mark back to 0 instead of + # deleting it, if it's found. This is because, if the mark is found + # at this point, we assume that there's data for one of these things + # that has been parsed, but not yet emitted. And, as such, it implies + # that we haven't yet reached the end of this 'thing'. So, by setting + # the mark to 0, we cause any data callbacks that take place in future + # calls to this function to start from the beginning of that buffer. + data_callback("header_field", length, True) + data_callback("header_value", length, True) + data_callback("part_data", length - index, True) + + # Save values to locals. + self.state = state + self.index = index + self.flags = flags + + # Return our data length to indicate no errors, and that we processed + # all of it. + return length + + def finalize(self) -> None: + """Finalize this parser, which signals to that we are finished parsing. + + Note: It does not currently, but in the future, it will verify that we + are in the final state of the parser (i.e. the end of the multipart + message is well-formed), and, if not, throw an error. + """ + # TODO: verify that we're in the state MultipartState.END, otherwise throw an + # error or otherwise state that we're not finished parsing. + pass + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(boundary={self.boundary!r})" + + +class FormParser: + """This class is the all-in-one form parser. Given all the information + necessary to parse a form, it will instantiate the correct parser, create + the proper :class:`Field` and :class:`File` classes to store the data that + is parsed, and call the two given callbacks with each field and file as + they become available. + + Args: + content_type: The Content-Type of the incoming request. This is used to select the appropriate parser. + on_field: The callback to call when a field has been parsed and is ready for usage. See above for parameters. + on_file: The callback to call when a file has been parsed and is ready for usage. See above for parameters. + on_end: An optional callback to call when all fields and files in a request has been parsed. Can be None. + boundary: If the request is a multipart/form-data request, this should be the boundary of the request, as given + in the Content-Type header, as a bytestring. + file_name: If the request is of type application/octet-stream, then the body of the request will not contain any + information about the uploaded file. In such cases, you can provide the file name of the uploaded file + manually. + FileClass: The class to use for uploaded files. Defaults to :class:`File`, but you can provide your own class + if you wish to customize behaviour. The class will be instantiated as FileClass(file_name, field_name), and + it must provide the following functions:: + - file_instance.write(data) + - file_instance.finalize() + - file_instance.close() + FieldClass: The class to use for uploaded fields. Defaults to :class:`Field`, but you can provide your own + class if you wish to customize behaviour. The class will be instantiated as FieldClass(field_name), and it + must provide the following functions:: + - field_instance.write(data) + - field_instance.finalize() + - field_instance.close() + - field_instance.set_none() + config: Configuration to use for this FormParser. The default values are taken from the DEFAULT_CONFIG value, + and then any keys present in this dictionary will overwrite the default values. + """ + + #: This is the default configuration for our form parser. + #: Note: all file sizes should be in bytes. + DEFAULT_CONFIG: FormParserConfig = { + "MAX_BODY_SIZE": float("inf"), + "MAX_MEMORY_FILE_SIZE": 1 * 1024 * 1024, + "UPLOAD_DIR": None, + "UPLOAD_KEEP_FILENAME": False, + "UPLOAD_KEEP_EXTENSIONS": False, + # Error on invalid Content-Transfer-Encoding? + "UPLOAD_ERROR_ON_BAD_CTE": False, + } + + def __init__( + self, + content_type: str, + on_field: OnFieldCallback | None, + on_file: OnFileCallback | None, + on_end: Callable[[], None] | None = None, + boundary: bytes | str | None = None, + file_name: bytes | None = None, + FileClass: type[FileProtocol] = File, + FieldClass: type[FieldProtocol] = Field, + config: dict[Any, Any] = {}, + ) -> None: + self.logger = logging.getLogger(__name__) + + # Save variables. + self.content_type = content_type + self.boundary = boundary + self.bytes_received = 0 + self.parser = None + + # Save callbacks. + self.on_field = on_field + self.on_file = on_file + self.on_end = on_end + + # Save classes. + self.FileClass = File + self.FieldClass = Field + + # Set configuration options. + self.config: FormParserConfig = self.DEFAULT_CONFIG.copy() + self.config.update(config) # type: ignore[typeddict-item] + + parser: OctetStreamParser | MultipartParser | QuerystringParser | None = None + + # Depending on the Content-Type, we instantiate the correct parser. + if content_type == "application/octet-stream": + file: FileProtocol = None # type: ignore + + def on_start() -> None: + nonlocal file + file = FileClass(file_name, None, config=cast("FileConfig", self.config)) + + def on_data(data: bytes, start: int, end: int) -> None: + nonlocal file + file.write(data[start:end]) + + def _on_end() -> None: + nonlocal file + # Finalize the file itself. + file.finalize() + + # Call our callback. + if on_file: + on_file(file) + + # Call the on-end callback. + if self.on_end is not None: + self.on_end() + + # Instantiate an octet-stream parser + parser = OctetStreamParser( + callbacks={"on_start": on_start, "on_data": on_data, "on_end": _on_end}, + max_size=self.config["MAX_BODY_SIZE"], + ) + + elif content_type == "application/x-www-form-urlencoded" or content_type == "application/x-url-encoded": + name_buffer: list[bytes] = [] + + f: FieldProtocol | None = None + + def on_field_start() -> None: + pass + + def on_field_name(data: bytes, start: int, end: int) -> None: + name_buffer.append(data[start:end]) + + def on_field_data(data: bytes, start: int, end: int) -> None: + nonlocal f + if f is None: + f = FieldClass(b"".join(name_buffer)) + del name_buffer[:] + f.write(data[start:end]) + + def on_field_end() -> None: + nonlocal f + # Finalize and call callback. + if f is None: + # If we get here, it's because there was no field data. + # We create a field, set it to None, and then continue. + f = FieldClass(b"".join(name_buffer)) + del name_buffer[:] + f.set_none() + + f.finalize() + if on_field: + on_field(f) + f = None + + def _on_end() -> None: + if self.on_end is not None: + self.on_end() + + # Instantiate parser. + parser = QuerystringParser( + callbacks={ + "on_field_start": on_field_start, + "on_field_name": on_field_name, + "on_field_data": on_field_data, + "on_field_end": on_field_end, + "on_end": _on_end, + }, + max_size=self.config["MAX_BODY_SIZE"], + ) + + elif content_type == "multipart/form-data": + if boundary is None: + self.logger.error("No boundary given") + raise FormParserError("No boundary given") + + header_name: list[bytes] = [] + header_value: list[bytes] = [] + headers: dict[bytes, bytes] = {} + + f_multi: FileProtocol | FieldProtocol | None = None + writer = None + is_file = False + + def on_part_begin() -> None: + # Reset headers in case this isn't the first part. + nonlocal headers + headers = {} + + def on_part_data(data: bytes, start: int, end: int) -> None: + nonlocal writer + assert writer is not None + writer.write(data[start:end]) + # TODO: check for error here. + + def on_part_end() -> None: + nonlocal f_multi, is_file + assert f_multi is not None + f_multi.finalize() + if is_file: + if on_file: + on_file(f_multi) + else: + if on_field: + on_field(cast("FieldProtocol", f_multi)) + + def on_header_field(data: bytes, start: int, end: int) -> None: + header_name.append(data[start:end]) + + def on_header_value(data: bytes, start: int, end: int) -> None: + header_value.append(data[start:end]) + + def on_header_end() -> None: + headers[b"".join(header_name)] = b"".join(header_value) + del header_name[:] + del header_value[:] + + def on_headers_finished() -> None: + nonlocal is_file, f_multi, writer + # Reset the 'is file' flag. + is_file = False + + # Parse the content-disposition header. + # TODO: handle mixed case + content_disp = headers.get(b"Content-Disposition") + disp, options = parse_options_header(content_disp) + + # Get the field and filename. + field_name = options.get(b"name") + file_name = options.get(b"filename") + # TODO: check for errors + + # Create the proper class. + if file_name is None: + f_multi = FieldClass(field_name) + else: + f_multi = FileClass(file_name, field_name, config=cast("FileConfig", self.config)) + is_file = True + + # Parse the given Content-Transfer-Encoding to determine what + # we need to do with the incoming data. + # TODO: check that we properly handle 8bit / 7bit encoding. + transfer_encoding = headers.get(b"Content-Transfer-Encoding", b"7bit") + + if transfer_encoding in (b"binary", b"8bit", b"7bit"): + writer = f_multi + + elif transfer_encoding == b"base64": + writer = Base64Decoder(f_multi) + + elif transfer_encoding == b"quoted-printable": + writer = QuotedPrintableDecoder(f_multi) + + else: + self.logger.warning("Unknown Content-Transfer-Encoding: %r", transfer_encoding) + if self.config["UPLOAD_ERROR_ON_BAD_CTE"]: + raise FormParserError('Unknown Content-Transfer-Encoding "{!r}"'.format(transfer_encoding)) + else: + # If we aren't erroring, then we just treat this as an + # unencoded Content-Transfer-Encoding. + writer = f_multi + + def _on_end() -> None: + nonlocal writer + if writer is not None: + writer.finalize() + if self.on_end is not None: + self.on_end() + + # Instantiate a multipart parser. + parser = MultipartParser( + boundary, + callbacks={ + "on_part_begin": on_part_begin, + "on_part_data": on_part_data, + "on_part_end": on_part_end, + "on_header_field": on_header_field, + "on_header_value": on_header_value, + "on_header_end": on_header_end, + "on_headers_finished": on_headers_finished, + "on_end": _on_end, + }, + max_size=self.config["MAX_BODY_SIZE"], + ) + + else: + self.logger.warning("Unknown Content-Type: %r", content_type) + raise FormParserError("Unknown Content-Type: {}".format(content_type)) + + self.parser = parser + + def write(self, data: bytes) -> int: + """Write some data. The parser will forward this to the appropriate + underlying parser. + + Args: + data: The data to write. + + Returns: + The number of bytes processed. + """ + self.bytes_received += len(data) + # TODO: check the parser's return value for errors? + assert self.parser is not None + return self.parser.write(data) + + def finalize(self) -> None: + """Finalize the parser.""" + if self.parser is not None and hasattr(self.parser, "finalize"): + self.parser.finalize() + + def close(self) -> None: + """Close the parser.""" + if self.parser is not None and hasattr(self.parser, "close"): + self.parser.close() + + def __repr__(self) -> str: + return "{}(content_type={!r}, parser={!r})".format(self.__class__.__name__, self.content_type, self.parser) + + +def create_form_parser( + headers: dict[str, bytes], + on_field: OnFieldCallback | None, + on_file: OnFileCallback | None, + trust_x_headers: bool = False, + config: dict[Any, Any] = {}, +) -> FormParser: + """This function is a helper function to aid in creating a FormParser + instances. Given a dictionary-like headers object, it will determine + the correct information needed, instantiate a FormParser with the + appropriate values and given callbacks, and then return the corresponding + parser. + + Args: + headers: A dictionary-like object of HTTP headers. The only required header is Content-Type. + on_field: Callback to call with each parsed field. + on_file: Callback to call with each parsed file. + trust_x_headers: Whether or not to trust information received from certain X-Headers - for example, the file + name from X-File-Name. + config: Configuration variables to pass to the FormParser. + """ + content_type: str | bytes | None = headers.get("Content-Type") + if content_type is None: + logging.getLogger(__name__).warning("No Content-Type header given") + raise ValueError("No Content-Type header given!") + + # Boundaries are optional (the FormParser will raise if one is needed + # but not given). + content_type, params = parse_options_header(content_type) + boundary = params.get(b"boundary") + + # We need content_type to be a string, not a bytes object. + content_type = content_type.decode("latin-1") + + # File names are optional. + file_name = headers.get("X-File-Name") + + # Instantiate a form parser. + form_parser = FormParser(content_type, on_field, on_file, boundary=boundary, file_name=file_name, config=config) + + # Return our parser. + return form_parser + + +def parse_form( + headers: dict[str, bytes], + input_stream: SupportsRead, + on_field: OnFieldCallback | None, + on_file: OnFileCallback | None, + chunk_size: int = 1048576, +) -> None: + """This function is useful if you just want to parse a request body, + without too much work. Pass it a dictionary-like object of the request's + headers, and a file-like object for the input stream, along with two + callbacks that will get called whenever a field or file is parsed. + + Args: + headers: A dictionary-like object of HTTP headers. The only required header is Content-Type. + input_stream: A file-like object that represents the request body. The read() method must return bytestrings. + on_field: Callback to call with each parsed field. + on_file: Callback to call with each parsed file. + chunk_size: The maximum size to read from the input stream and write to the parser at one time. + Defaults to 1 MiB. + """ + # Create our form parser. + parser = create_form_parser(headers, on_field, on_file) + + # Read chunks of 1MiB and write to the parser, but never read more than + # the given Content-Length, if any. + content_length: int | float | bytes | None = headers.get("Content-Length") + if content_length is not None: + content_length = int(content_length) + else: + content_length = float("inf") + bytes_read = 0 + + while True: + # Read only up to the Content-Length given. + max_readable = int(min(content_length - bytes_read, chunk_size)) + buff = input_stream.read(max_readable) + + # Write to the parser and update our length. + parser.write(buff) + bytes_read += len(buff) + + # If we get a buffer that's smaller than the size requested, or if we + # have read up to our content length, we're done. + if len(buff) != max_readable or bytes_read == content_length: + break + + # Tell our parser that we're done writing data. + parser.finalize() diff --git a/venv/Lib/site-packages/python_multipart/py.typed b/venv/Lib/site-packages/python_multipart/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/pytz/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/pytz/__pycache__/__init__.cpython-312.pyc index 9719bb9bd91097e25bd5ea289bccfeddff38c146..1b14e32a243f5cbca3f2cc8c09e717f83300d258 100644 GIT binary patch delta 32 mcmdn~j&b`tM!wU$yj%=Gkj>TmwYEG7j2XTb*~ diff --git a/venv/Lib/site-packages/pytz/__pycache__/tzfile.cpython-312.pyc b/venv/Lib/site-packages/pytz/__pycache__/tzfile.cpython-312.pyc index cce75675e430a09dafdf04e7b443e61339456ade..216932055a67417783c41b84c8dd852c03ce012b 100644 GIT binary patch delta 29 jcmbQBIYE>6G%qg~0}y00d1U<9$eYE?7_+&8Swav1Zx{z- delta 29 jcmbQBIYE>6G%qg~0}yC2x@Qz`M%w}O`8xH`RF$i=3 delta 32 mcmX>=3.8 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: charset_normalizer<4,>=2 +Requires-Dist: idna<4,>=2.5 +Requires-Dist: urllib3<3,>=1.21.1 +Requires-Dist: certifi>=2017.4.17 +Provides-Extra: security +Provides-Extra: socks +Requires-Dist: PySocks!=1.5.7,>=1.5.6; extra == "socks" +Provides-Extra: use-chardet-on-py3 +Requires-Dist: chardet<6,>=3.0.2; extra == "use-chardet-on-py3" +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: description-content-type +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: project-url +Dynamic: provides-extra +Dynamic: requires-dist +Dynamic: requires-python +Dynamic: summary + +# Requests + +**Requests** is a simple, yet elegant, HTTP library. + +```python +>>> import requests +>>> r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass')) +>>> r.status_code +200 +>>> r.headers['content-type'] +'application/json; charset=utf8' +>>> r.encoding +'utf-8' +>>> r.text +'{"authenticated": true, ...' +>>> r.json() +{'authenticated': True, ...} +``` + +Requests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method! + +Requests is one of the most downloaded Python packages today, pulling in around `30M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `1,000,000+` repositories. You may certainly put your trust in this code. + +[![Downloads](https://static.pepy.tech/badge/requests/month)](https://pepy.tech/project/requests) +[![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests) +[![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors) + +## Installing Requests and Supported Versions + +Requests is available on PyPI: + +```console +$ python -m pip install requests +``` + +Requests officially supports Python 3.8+. + +## Supported Features & Best–Practices + +Requests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today. + +- Keep-Alive & Connection Pooling +- International Domains and URLs +- Sessions with Cookie Persistence +- Browser-style TLS/SSL Verification +- Basic & Digest Authentication +- Familiar `dict`–like Cookies +- Automatic Content Decompression and Decoding +- Multi-part File Uploads +- SOCKS Proxy Support +- Connection Timeouts +- Streaming Downloads +- Automatic honoring of `.netrc` +- Chunked HTTP Requests + +## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io) + +[![Read the Docs](https://raw.githubusercontent.com/psf/requests/main/ext/ss.png)](https://requests.readthedocs.io) + +## Cloning the repository + +When cloning the Requests repository, you may need to add the `-c +fetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit (see +[this issue](https://github.com/psf/requests/issues/2690) for more background): + +```shell +git clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git +``` + +You can also apply this setting to your global Git config: + +```shell +git config --global fetch.fsck.badTimezone ignore +``` + +--- + +[![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/main/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/main/ext/psf.png)](https://www.python.org/psf) diff --git a/venv/Lib/site-packages/requests-2.32.4.dist-info/RECORD b/venv/Lib/site-packages/requests-2.32.4.dist-info/RECORD new file mode 100644 index 00000000..fdad7f40 --- /dev/null +++ b/venv/Lib/site-packages/requests-2.32.4.dist-info/RECORD @@ -0,0 +1,42 @@ +requests-2.32.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +requests-2.32.4.dist-info/METADATA,sha256=3S42LvNNoL2EP2IjC1VCXoElnGrTTVWwPgImVB4FYF4,4934 +requests-2.32.4.dist-info/RECORD,, +requests-2.32.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 +requests-2.32.4.dist-info/licenses/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142 +requests-2.32.4.dist-info/top_level.txt,sha256=fMSVmHfb5rbGOo6xv-O_tUX6j-WyixssE-SnwcDRxNQ,9 +requests/__init__.py,sha256=4xaAERmPDIBPsa2PsjpU9r06yooK-2mZKHTZAhWRWts,5072 +requests/__pycache__/__init__.cpython-312.pyc,, +requests/__pycache__/__version__.cpython-312.pyc,, +requests/__pycache__/_internal_utils.cpython-312.pyc,, +requests/__pycache__/adapters.cpython-312.pyc,, +requests/__pycache__/api.cpython-312.pyc,, +requests/__pycache__/auth.cpython-312.pyc,, +requests/__pycache__/certs.cpython-312.pyc,, +requests/__pycache__/compat.cpython-312.pyc,, +requests/__pycache__/cookies.cpython-312.pyc,, +requests/__pycache__/exceptions.cpython-312.pyc,, +requests/__pycache__/help.cpython-312.pyc,, +requests/__pycache__/hooks.cpython-312.pyc,, +requests/__pycache__/models.cpython-312.pyc,, +requests/__pycache__/packages.cpython-312.pyc,, +requests/__pycache__/sessions.cpython-312.pyc,, +requests/__pycache__/status_codes.cpython-312.pyc,, +requests/__pycache__/structures.cpython-312.pyc,, +requests/__pycache__/utils.cpython-312.pyc,, +requests/__version__.py,sha256=FDq681Y3EvBjdDp5UqplMZ28uTTYlM_Jib0sAV-NpXc,435 +requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 +requests/adapters.py,sha256=KIcecscqam6reOCXRl4DwP4jX8Jcl8sd57ft17KR2cQ,27451 +requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449 +requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186 +requests/certs.py,sha256=Z9Sb410Anv6jUFTyss0jFFhU6xst8ctELqfy8Ev23gw,429 +requests/compat.py,sha256=J7sIjR6XoDGp5JTVzOxkK5fSoUVUa_Pjc7iRZhAWGmI,2142 +requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590 +requests/exceptions.py,sha256=jJPS1UWATs86ShVUaLorTiJb1SaGuoNEWgICJep-VkY,4260 +requests/help.py,sha256=gPX5d_H7Xd88aDABejhqGgl9B1VFRTt5BmiYvL3PzIQ,3875 +requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 +requests/models.py,sha256=MjZdZ4k7tnw-1nz5PKShjmPmqyk0L6DciwnFngb_Vk4,35510 +requests/packages.py,sha256=_g0gZ681UyAlKHRjH6kanbaoxx2eAb6qzcXiODyTIoc,904 +requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495 +requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322 +requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 +requests/utils.py,sha256=WqU86rZ3wvhC-tQjWcjtH_HEKZwWB3iWCZV6SW5DEdQ,33213 diff --git a/venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/WHEEL b/venv/Lib/site-packages/requests-2.32.4.dist-info/WHEEL similarity index 100% rename from venv/Lib/site-packages/deepgram_sdk-4.2.0.dist-info/WHEEL rename to venv/Lib/site-packages/requests-2.32.4.dist-info/WHEEL diff --git a/venv/Lib/site-packages/requests-2.32.4.dist-info/licenses/LICENSE b/venv/Lib/site-packages/requests-2.32.4.dist-info/licenses/LICENSE new file mode 100644 index 00000000..67db8588 --- /dev/null +++ b/venv/Lib/site-packages/requests-2.32.4.dist-info/licenses/LICENSE @@ -0,0 +1,175 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. diff --git a/venv/Lib/site-packages/requests-2.32.4.dist-info/top_level.txt b/venv/Lib/site-packages/requests-2.32.4.dist-info/top_level.txt new file mode 100644 index 00000000..f2293605 --- /dev/null +++ b/venv/Lib/site-packages/requests-2.32.4.dist-info/top_level.txt @@ -0,0 +1 @@ +requests diff --git a/venv/Lib/site-packages/requests/__init__.py b/venv/Lib/site-packages/requests/__init__.py new file mode 100644 index 00000000..051cda13 --- /dev/null +++ b/venv/Lib/site-packages/requests/__init__.py @@ -0,0 +1,184 @@ +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. +Basic GET usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> b'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('https://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key1": "value1", + "key2": "value2" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +import warnings + +import urllib3 + +from .exceptions import RequestsDependencyWarning + +try: + from charset_normalizer import __version__ as charset_normalizer_version +except ImportError: + charset_normalizer_version = None + +try: + from chardet import __version__ as chardet_version +except ImportError: + chardet_version = None + + +def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version): + urllib3_version = urllib3_version.split(".") + assert urllib3_version != ["dev"] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append("0") + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1 + assert major >= 1 + if major == 1: + assert minor >= 21 + + # Check charset_normalizer for compatibility. + if chardet_version: + major, minor, patch = chardet_version.split(".")[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet_version >= 3.0.2, < 6.0.0 + assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0) + elif charset_normalizer_version: + major, minor, patch = charset_normalizer_version.split(".")[:3] + major, minor, patch = int(major), int(minor), int(patch) + # charset_normalizer >= 2.0.0 < 4.0.0 + assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) + else: + warnings.warn( + "Unable to find acceptable character detection dependency " + "(chardet or charset_normalizer).", + RequestsDependencyWarning, + ) + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split("."))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = "Old version of cryptography ({}) may cause slowdown.".format( + cryptography_version + ) + warnings.warn(warning, RequestsDependencyWarning) + + +# Check imported dependencies for compatibility. +try: + check_compatibility( + urllib3.__version__, chardet_version, charset_normalizer_version + ) +except (AssertionError, ValueError): + warnings.warn( + "urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported " + "version!".format( + urllib3.__version__, chardet_version, charset_normalizer_version + ), + RequestsDependencyWarning, + ) + +# Attempt to enable urllib3's fallback for SNI support +# if the standard library doesn't support SNI or the +# 'ssl' library isn't available. +try: + try: + import ssl + except ImportError: + ssl = None + + if not getattr(ssl, "HAS_SNI", False): + from urllib3.contrib import pyopenssl + + pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + + _check_cryptography(cryptography_version) +except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from urllib3.exceptions import DependencyWarning + +warnings.simplefilter("ignore", DependencyWarning) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +from . import packages, utils +from .__version__ import ( + __author__, + __author_email__, + __build__, + __cake__, + __copyright__, + __description__, + __license__, + __title__, + __url__, + __version__, +) +from .api import delete, get, head, options, patch, post, put, request +from .exceptions import ( + ConnectionError, + ConnectTimeout, + FileModeWarning, + HTTPError, + JSONDecodeError, + ReadTimeout, + RequestException, + Timeout, + TooManyRedirects, + URLRequired, +) +from .models import PreparedRequest, Request, Response +from .sessions import Session, session +from .status_codes import codes + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter("default", FileModeWarning, append=True) diff --git a/venv/Lib/site-packages/requests/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cb4ab360bd042daed624a6e4c9b3a48dd96c6ba GIT binary patch literal 5402 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/__version__.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/__version__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..585128cb502ea8718a714934fe8b01142421d5cd GIT binary patch literal 566 zcmY*WL2DC16rN4eWV7j}p%nunxEH}tyOGpW5V6!lOGS&s%d#+TGq2epo1JxLHjq87 zXYuSs@Txb#pW#J3Ejj8R2=vyIZ>a}7QuM){bl&YAmnFB)`9$Y zT-?R&9bv>H%>Q0or_Q;M&QUrGV&!JHLah@u?DyAKT?qlxAuuskE*DvS;O-CH`@A-&kjy@TI0hX$ z&w=YK+nK?m>6Ic&!4-0nSqDil4q>zmB zvzARtHP;bPy4<3aff`GmXf9$D8kD9oLeQdg4pLpI=r~Jx#89^=4N`1TBJTXfFbnt} zSH#B3CfhQWI$~#e+}eqMY>Qv%{hPLg6F+$?@^Xe++7>MdHr|W;mEYto=E} zbN>lH^A*>yhwV;-2`GO(!u~%sy2;|wd@vI%jo_i|VE*z$)ex6e)i8{eMeJ_gEVg&^ qt-{*P8%6ti-YPb)p=RIAtzzfSH_|EEH&E>Ka=U2Ver?J&+J6D45W3?4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20ceec267177c8674b1df22db777339a7cd90961 GIT binary patch literal 2006 zcmah}-D?zA6u&dGUzts^i8V^1(Th!^+m8qqDXbq5&9)}>BWz;9bjE2$VkfmNtDTKK0z$k6>!(g}F25+}}Cp z-t+t2dDhdT6C7XubhGqJl#t)0(H@c3$JWpI@rc+YPi)0j%Sv9cH9JyPD_UMth)O_N zOtgcx-*)t=(zNo?T`{o^Cblak-oeCo#UwhI1jHaQujacT3UPevkOUpNq03S8J$BOW zx~t@SZT&9Er|N3Dd*yqb!KXFgf{z)FD}cFX*{BJp%=OP-8M;2ryd}p5PUW&A>U6&5 zTEg*MPDRNS)MP*{v}zTwX**ZBPK$M#Yt_(~OO92dHdMj2spnF-Ef`b)QS-1Yt#AXh z1m!9)PLJ^#!cC5OD^*jZ^%t_GmtV-vrj;OBtT|=jxCR%D_oHv_`dp^KZ^)Sy+#7F? ztn~lK#ZwYkn7KaJ!mQ4XtfY20EEPfRA(f!vvo(#=BO+S760%A}2luq~#UiWZGj&y+ z!PQ07)XuT0w7F`c(#p!SkDMiNsY&q|j=Mm;;v!h$UCLm=WOf-ir`|jj^(si8s4?ug ziCl87bPvcq943`}c*?r_KD!gMWQvUNc$EC9F^Ywj#a zwCe|&R})+|7x(^h=6t4bl_T+mk0&Q*3lqR^39njM@*E4s7x1VB?9)==qEjqzN5Fek z)4F9Y057yPe0+z7$Ex+9Pk2VN1yUw>X4Z}62Jzv?ak@kP)=6T|!_lwbc^)5a^zOZ< zZ6-)}>dw?=l%xh8RPI;SF0A*ybx+$!_THJ=!VqG06o5uY9gArEpE|fYMZQqFcF~62 z(S}0m>YGHwWHmWP2*ZEPHB#4>$!+Z#Sys}Kl^-Vn?@PsTfjaX@ii0$Ec=lYpRCpbQ ziDa~Rvq~m2EsWt~ddOC$ijInu2CcQali8U_c+@I^b!&`Xs&PS!&<2DVq~@fCTu;#H zx+tL%Ptco~@McpF872jnp+(OthXFy<D0~^8{_A-uUOY(^#x zbHRaEmoUfG?YJE|JBu=KU%OIRc6|0qZpM)Q{jc$dn}`*UE5~9YLRDfj`6v8>T3Ksxc+9)k_rp4{~^8_~=^hN&a!(KXzt) z_^eNc8V5($&OMoWJmnufwSMrlPX-%@j;$4+EIwZJ)2G)Do$<+m#&%R@efShcZ4ABd zpS}} BC29Zw literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/adapters.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/adapters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0064b68b318a5245cbd4c618cec137dbc3cf769b GIT binary patch literal 28346 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/api.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..197220d7c1ce9d4a07ea5285d23ece0e742c15a8 GIT binary patch literal 7186 zcmeHM&u<&Y72YLRzeqc7o!E(+)ScEqDB2WhTXvihj%-DeVz}eZE*_k)*eeb<*R)5&LH=*GA`5*Pli9?F=H+tw?v8b{&hst%uQm!bLYQ-G2 z8oLrx6)XOMawTre_D; zKL25zi$G+Jnw|J@&y`3NE4E-&&#F6|+0~lEtK1C)3o4ww8NJ0O7iP1GMBemjP2XOw z1bH@UrrF8kCr+|blfA)Rmj@LLw}WfhMBcGY?h2k~lQqMv@RJ!PIA?RSQ#1308CLdu zEa!7(@xZVhkxhK6V#{f@JuJ8ow&x17qYTo?5PnJgw%$i^T?uHgysq|+irPMk?x&S^ z<1u9|epQPadTv&HO<7Yd^*6D#*zeR|sAkNPe;-BjsY*dPqMT5K+JNHUR#f~oWADV@ zRvKzrGyXlIC{qwJ@arb@WVjZ#=US+-yy+N15z>}*t-(4jqsD_=8wqspq#mS^Ro zyVMA&+vSa&Q|QbqUF9YeuIsPO6m>m=%B6+k?4|ia_;7J%ayqOnTq;BZ7A|)xlf|iv z)C-;K`t;1)OmRksFg>!=eJ9T@zd83XQuMtjw<3T9uNJ^)hLdK~wkfNAGs7HP1k5Y5 zpbkh05}?!!PzgM#E-3Y1nX10@wrhVS3(*&38{urkj#|uN(f(9X#CBr1RYq6KG&_ zNUiHB*QoMTo^`D=7FtEodWM;G5qQ<5$ktMVMuj6@LQ8!sVH=3tM&vZzMJ-;oT~YyAJbHnVXdN^!+pFA_ zJCwmo*ZWt*v<9=_$`9F7n=i1d+^bVM+73b&y#}iqE`kY%(1^>JxMA2q zS1LH>D)+nIL2;zJff7f0;tVPZL6l(zskjU<1u}df$ossU*GDn8i@?kx5i-n&*LCNK zTGQ-oR1*_=xX(y_X^^h?a(;3&2}U_flqw9z@fu4$w`?D)^*hn4p677G&9WJ(x141Q zsXru&T$CenloWEv2e}1G1-UQ<rW+S2u+U+3LCAw}IKM+uAf z3R?5MckUNHA}_BRwHm1u!vfFr98y04lrj%x2~=r@W}kUsCcE71v+fLH8H{HzS|6Lw zP`qwbY_kHN7GN-e#Jul00?o*?7~J42oT+ObiU_o12!)hj#km4AxgXeN+cW|mnL12I z_gSI}P=@iNW(1Y~Y2gBFYLb=et_3V(n{~k-sNawiU@dM``}S&6WV~QF0=CFVd3`Qw zpdQ9`*Uw`>m;Lhjlg zik3}l{s21sLFye`X&C;pXb*K5F40l~;l0}+vynv0ddt1Yg2;LwxH zFvKE)_3GlBU0M`&z{kL-SD+HH*x7#$j6Mrm4pyqj;weZ3?f4-$EiT$@n4sDJc z`qRkscNBGCQeAI+vhVOu8^3(-XYaN4o!=vBY-nUMnj4Xj1`Wf4`Bca<#G88P1lYC)a}8Lp5Ig@CV*1H zp}&s`I)e%VEe890sD&USiwWv_9tE&-P}%eJho{$%Y$nfalv~L&w+2ybX=k?3t(e_Y z7#_MvcmWT)kznJrMdvJ_Aa?E32m&sPGSp+n!4qVMp^%dZ|7%do%~)swseC$Uc69$V z>OK{8?iUA9K==De_upMNHP zMG2IR8lpRqSF3q~TOAGp#!TFYZDy%g5}(|Az20kNG2xSMK0)3cAG}MqsqD1lyYNuiuKk-cz2xiYwFaru($#WaU zTiRyw+{Z{I=UUpi5RB1hHw^AcB@7R{!MKZ5-0p?q<*$(Vg+DPpK}d|(>VYreCKG5x zVPwN@3Ue5E@u^tFuR~!Z@+5^B-YSW7!5m7P}S z)3N#abh16Pv}Aea(o$QI2lbFo$pepM-jYbkv?U{mG^<>R{_P~El1HR_!)L>Pkxlq7 zq66Nqh&+lraaC3S5gS&ue?6n9&)yvzQzz9eT}`Sl-+f_39lQJ79`)$f;XUekmC938 NytH+AL=E};e*kndSAzfm literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/auth.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/auth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30b3af4f4546357a50bd1e6e17a26cfe4b6a663a GIT binary patch literal 13905 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/compat.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32f99174246ea7770a2c57c66f6a4c08146c344c GIT binary patch literal 2362 zcmZWq&2JmW6`xstFFz!ak}1hwYf1i~Ez_1|yRF-#Fyy3AV#@`r9x`CNU2;d_O8ddg z3}w@>Tc+*7Mtx9v$sZ6DXpoDKy#_wEhp0YSnbe7aq6gn-yG8=_(l@)LqM!@xZ{BZZvHBb(7%*2coKc#)!#8fA0ZnNWMf-%F~Q-e5e>$e8}s5M zfl&r&h$i7ptQ7_+z8mfMr;tTGHl6_7)e`F`5F%+i^#??<5S{%r^a5LsYHO2yWzRqg zv=HU6(_!q;uAT|?VOu97nP{y=QnHg|gpRNjtTpQvy)iO|k)I5;Qlx>LbN6{=QpPGO z?~Z#DWWt*yliq%^KeQFx1KvS$D3piX!=6EmP#$)VcvEC5lt762{yje2qohGM4|Ds#<&X6!X4Aob(8N`5l*kk%V^x)&0=vM4KbQ8nuD9oh7 z?`Up`lwkJvgV{>y_Gdby@3$!zyxIu7mL>GxeE-q)<)*_8FRZ!{Ho~>UAn^QtBH&?}%pL8|Ms&87T8rV^J84dY0pJVdaye<<+H% zCR547zuSgVxR25oXC zs!g@kk!6!n9=IFSREsos_rlb%KLjs-7odxt6^h-TZ4aG&i4uvid$H|o@%~SHS}Z^I z&&la0lXF{>a}TEgp?7XvU%EmYflZ_RLr+`>78$j#I1K^3r57yMwdyXFscTlN z<@l?zaIGzrrLRMpOd|-^9lB;QP?FaIpx*^4eM2w^SiD}*W#avIAgI*C!ECv0E>mqk zGUob1WX`miYtt2Gtx6?QU#$+DnY$J^zD$GAQUwkr-h#s;b+EPl&{|1IeU*w93vNMY z$bH|*CRE8`f$u@do%ni<{ zrJ#t)GSQeJXM%4PUjlgxIGsIajT=5=D z)v7mGNjZ-y7*q3c#S`17#D1yOIm#(3+<~g}oR!tA<^*h93At#G)sSYU{#s1^j~Lt= zh#gRHP=RWBc36R-;D~}L09okA_sjSjw(2&;5Y#AFPO~M+m0(7-&9JX-VsoF zy>4;1q*VjT#EKhOLgxLpN14+w1+dQH9`FTSr7TiEL9ZYmVtIg_^iQJ8;Z3#(s=D4d z{J;>LDU4reDI9-QM0n&&q`%e?p6?~&c>IgfzR%0Eo4QQFiLFKHW|A3Mid@k}7Yd%H4P`iS)uf>wbCj^8Ewd-ZDn%65KU-_-TAd@iM%_RgwO5Xd#V0n@BE{(W7)`VKnxr PgcX)E3)8VjQyB1nq5-cV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/cookies.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/cookies.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb60dc0e81b93ad4e18e3bf312a960844e8977de GIT binary patch literal 25258 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 Ohun|btlzhaDE|+JB$)mH literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a6dddfbb5dbb68c94bb75fedbf7e52f27e28e62 GIT binary patch literal 7567 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/help.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/help.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b9c3a05b9ea78e65128b139083a4a08de6488af GIT binary patch literal 4309 zcmbUkZEO?Cb=JGK*Nzh>aU3V);;a+EY(fkre54f7rkB74LP7~}Ju8yyc$Z`od)J*^ z2h2H=i&}}cCskEXI;8Rgs*|7ssr>BEBHh3Ku>+OO0xHtcAM}?GsD!90_08-$m>l$u zj=l5o=Dm4u-n@D5&0m|Fy$H&$*M71%;7907GN>2M?mT+|ozIYj;z(j7N1BNK^}|R8~55hU))D~&UAC8CEmhV^ZvM>Qn$ui zCD+eUyiIaL-7fJ^2jmXPv%C!<%sY@AxM2&(pu8jR7(jBX@uB4b_A)IfeFJL1{jh*d=!ZlHE1Xx`gMvML_1JcnQ!3MZs9f761Th$Y-L_@E(IImR=@CnthnH~VV}?{qwWQb zy58{=-UAxlBy)w))@181t`a{wxUR~Ft6E!YBD2JJhF<7D`;olz9?NLmBSdg zr1JvKspM+JghLt@%zRO8;#7!hL7iu=l2VWDrA$`P*S;c5^pE$ zvsjx?&ZqN~x1`Cs8U>kP8Q~0we#BBB^d_;UTC&5Yav-e?i>&}7Wx>*_zNqEW67Uuz zO_k|#hGwm#bXh{0-d7@;?o;Zrs-0CuhshCjnr>TzVw1_&S(w2r-Cp8#`!HK< zuuWpRh&)NdWc9pmwq^6#{JJw!)H9mt%p{jI42_~%O$uwK56fvesYA6Qr%i52Q;0Av z8(4L|KCZ8;6MrWNFF$yH|J*4Z9OvB8$;p#*J$a z>53r_XOpSr@V}-swZ@5@0ur4jSN*HyULMW4}AWLFH-hJD!yph z7yaMEXKt?FTjImdy$HyfgmRNmX&Np!4c`i_HH}ucM6Z2#^}}jg^k$$U9xRIoE8@|z zc(l|y^^A3FZ7KWuYcAyNx-`1x8F+(S2i82%4d6$SL16c&qrbFcqTF<-#2tDDyG5@B zon`>gpz~uIbUfcO?0maWBQcj9tH|&WuB5yQK@w}M2bMR56NOoIkc0tR)^0gtJ&53T zpkE)og`PFmLkPuRAH4;ilQ_vKxjlt=o)4_tUWf?OP!4)t1r2K&skhx z58d^7V^h5+@shJ1=wSDdHZ@?q_ZBR-K@6IfH}PEMCAPr-j4SYjyUIvTSlL6uNWo(W zHX)L@9P>(NFhT`q!BOA}Y{6A9rP1K(1x_b26k<_Hg*WHlVZb=j&Vi6^p?wQ#M zj3FM7W5Xh;i0F8TRD)0fhRvTPLUhg?pO}VD;`GFc*~yvd#Pq3SKb$yWx))@K>ITN! z3E?myWMQkAq>^T9oqt_JqStJ$d;bLW-GL1bm;!zFjxChX*LQ18_-uVxBZwOH^Pr2g zH7dkH@er-hF5W`q^S?S93f0N!l6=G}xR)St)Lgy~-3j<~39_9cs&O8t_i<k1#P>aPw^X|#pYN*->@5%MErs@7 z^nnZR=&JVg0-H`(ar$38;{A_9;Yw(*92$JkFJ2qEI#lT&FZYlC^@C!h1EJy>ZQDz^<4k5og# zt@EXQ$F9V0F;}Ncv!_a(r;9TnN3g%TX}H?C*J-Koewq-T{o`GRD%Q6Kp**s z_f)&YYHRl+U+``y3Tp?wUv>L^t{Ud}Ba@outppLfGf zs^KBWiO%!laYzo0{BRa4s+C5O_ZBq@NJ?lvs|!bFXQpE(pFjiy?_hd#c#9>LWk^?C ziYh^#FfDSXldb@%h_0!oQ_5wsIwofIM}+&Jv8^owk2?GTjEnH;#61_$W6tx*=HCqd za`4lWzdL=!xHWdyyZ3M0K1ycti3Fj6cU{nQClZpDN+d8bRqM*{COr}v=;gF-Ix%zW zy6+)9a_7ya$qacxT26sF0Ka_;W8|rcm3exnt$V(ckWtS;HbBKCa*#|9m>(vv^)0>R z4`k?*^&p;x38Gy6Pf*oZhGFiZ;V)6sedNE7yzr;}mVcn(8pkr>`&@60XPLl#uD!}3sjBdKdhS2Rc_gD{mdlN(IuzPG9dppXIdZ=mayX@^z2I~I;u)-da literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/hooks.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/hooks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..406cc7b93f7e73ddededd5b072b020a23a9ad6af GIT binary patch literal 1034 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

FRbJ(wl+PHn;+99z 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/packages.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/packages.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe9081285e940fd6a4705a83fc3829dfff9523d7 GIT binary patch literal 1121 zcmb7BOH9*n82|d%R`&qH%jujklBi@ljU=eN5*>nMNMg`vmP#$_2b6UW`Y(`qf^eC* zL^uH<1dcUa@Z{CI7X~4YdNdxm4Y+Z#bz4G&i2e`l_y6_#J-)ABJsu~R=l#~3kqiUy z!@87@y;K|)D1Zf!K%x|gfJ94-LdEF_O@YLA!s|hR2txz1$gG>4)-i9k^AeVq6SKW)$33(rHE1d2!~euqux*p|AL@O z_;63pbG{QvOiQNtiKHCGhr^iA_z6r*@V)XNPh<^mmGkrEiEfvXU@CpYwH1SPs9sat z+6<{Tp9O}ZsPEwX3BH08su~W!PIXgL-MikaYxlOjf$6T9Cz+Qywr<}JRkd@Wh46fM zyYk8b(6(+W!{l8RbJu4(7W-ERmIm}mUEUbepYHfu^34xE$3DfrG~}AQGNBLQcj3*8 zH}!t~@uv6gmb+=+X3-1hEU!Wpu&zy}KJTgh=JDq|{;96r%9>+NHe0CVbZxeMF|^vZ z)Ta;WuQs0PZ9A9l=Y5w~TbEkbNX{3?^yZr%{b`qTH|4AA76S8u#i2EMyZTNhbV`>M Q%4InfY`~sZ>&^ZA0{4gud;kCd literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/sessions.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/sessions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d718b171700632fe177280900a186e0b184edd5e GIT binary patch literal 27864 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 LR=Q0!48Z<3{{VGf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/status_codes.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/status_codes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c1d79952eb9dd1db6716ec12b62a3be33cf197b GIT binary patch literal 6013 zcmZ`+YjhOHmF}LGG^5d50)#DS^AaK;iHBncyu{c7ivR)}`31tQ)>MsDXr_DI-6Juw zNJ!#rgxTG0r)T?X`0@|C2v?{K#&ST@yPeK7ITn$NOjXuK{P*Vb4Cks@pRX z2G2S3b$|EXx>a>=)vfB^H8y56{J#CivB{5GH0|Fdss0kt%k__RO}nTu&C;08Vg)D12I{MkjHi7l9&A?u^1^79(6}XM{0sGkia68)p+{tzU?`EF| z-ox$%eu3=@GI;b@T=@=z^}7sf!|<%5Bw&Z z2R_HXC3`v%k7+!{zWvVmw~8u5^1_t`A+Y5t)`f!Wkx2sF*cTS z8284;3}^f_&-n)9d0}(Uu#BQrDhYeS$h%I_$T`KLV;imK@hNT>f;Kd%jnbR|S2l&yzjy07E!4UCxAy zY4w~^#ybb@`HV(=KDSDaue7_i-}@O>CwoSn{>aykfq_isxKrdbQ)AMa=0>qx@C8Oq zfx_%C*OG7{D29NQOmnJ;n@w0kqc&rM=+m?hWoot#tf7V}aU3o?+XjN22l4cu}Im2EKe zy~T;he{PcJrb-TEi?h@uTXu!%JC0d!?1`Ww%BHzoy7*gZS{KBesURU|7o;#b6Re(| zkf^r_$6>Q^WT_lSi;rHpu=vl^Z(Yvime1MZzYwpN3$r8zzmtMku)=n1(<=Lujw`UN z#WXjCop*xn+soY|Y#e*>_v9{PJEja1$F%-H4jU17?pLKjQqjeKC1rETa(!VHYU;X3 zu=sD%AQ5EMQZi|W1MA}&y~H0tHJV2s=11!|L)p-@qqjc-FBUnFr`kz@HWQ);6E z5Hu_!;w5s}q-1LSS}3gIq7=u2ZWTwhhA|!#VYxt;h9!6AnTk>e9ZT;^recAH(Olhu zz9@31><4wxi?~Gn%Yu+E$ddg75+o)Zn~Rr;G#9u%;ZN2&7O#-o_7W;F>X1;w%3Gp< zSY?+B#Sh7HRdoPzY<`7mgXK=}pf%cKOCs?jYSUS5Q!5*?f!l}`FJ6@<@nA*S_E3k_ zRxpdmpk?}%5}e*54>C(?ahY1LjXJ=7a4ma+t1Nklv6mMz3qdt(RfC}Owszt*=}!;Z z_?Z$;CQ1@TL;RS!YQX-)*wl#>q@rh|Fs&uAc%8ho7llVhoa~m?toRAJ=_uPsvno7={?MRA^iej(M2Jw&NxTRd0a4p7bizcXxB;p;i=v=-~YG&?HnctsAqmyn? zsAR#T8$wWD6^VZ$o0XHOh}<<%g9^-BT1G+3rzPSS)B+n2{^SYj@gRZ2fQw&}CgXA+ zcMP0`ld`(wUHpnP8^$Sa=D1Yb%$e~_)OTbcs`xHW%%Jrak@z*W??$1S#s*P&L-jBV zd;%>|%{>ewXuOGv>#~s^bmj^IJ(#(IgW6t=f%sTz6G0~qT<+TN;&B)E4wJjC;|AH~ zY&PESj7A6NMe$d1+boL>Ze9g0s~pzCf0A5P$q5{(Ggd|Xmz2eVcIgcVh`DV1LBld4 zK8c)04b5t0`5QS{J?Z-;GrAVh4y*3iAiG>AZjhsu)0QhN%-Sk=j%o7=2d66TmEyli z-yyK)^Ldd|q49iN3n#evAL?z@I4(^yf}vOyL{a!AKa=Ae7x*Au(}@2iN9y$AXK=tn zFaA#o>O5h?N^64d7-)fC3O7F z_(jdHsZLAzr+(Gj{-AbhSkp#v**~kD)#r5ZLA=NOWVL~xs=m#|=CrpXU%ECIJDsj- zmYz(18~w|ltDoO=doQOO$YMEG$FsbL^9K^z`C|!<#h%r^75B4M`>*a;dS`KYMP%{Q z%~kEvb3UHeS>oAxzqKk`ib-{pgIcxcszmy;QWg1)3+zn}_r`AMqc`;aTr@G|Oopc& z|LcgJ{2l+Ak z+mnMaj2p)u+&%gzcA__W=-|PT(LwG_`A%tcT3+q;O<)s`PIG&D^spEo_3*W|tz_k< zuq(XLYT4{xz8?EZl^f~%&6PlyAK5pTW)V3b8<_hW>&^Xyj6hz&^|e* z{jqD$o2?5EEIhrCyWIB5mMdL*{^rR!f32lWpRM0wY-GEQjUMKaIF0XuAQf!{aJeIb zr26WNX6Jq%4TCtkoo%~yC~^sSy?}Gt2Q3{J)89*@vv=}88+ohne%GG&TK3E*KWOe+ z7`c4+!jUV@z31Zv@vtJLcRd_wVCH}tcP*LGg^-}u6nbwd=p zueWvTy=nJF7zIi7%^cL>b3=Yv2T4^(f(+8=`tmxB^GSVx26d*1$eE`5f^3)a)Lp1I zp+D<&8yi<*_WHHX^G^n=d$yO z`TPf+cU;rr>0R^tKg_njuz%t1%NyR$_I%L3>d)=#ue7hfeCSW@10S}md?mS1e)XA4 z&%Av0P4=gjomcD7B#gt$wQMZ8<>MwT+x~9DnvdgJy5;!|&owP{yxMiC>%DbDzgY2` z)X&$vzi#NguAwXSLs#QkG8?9}rnakfcyljdV8gvB_cc6a9NcowFXI$$fUx% z6~A9s>b2oMUGWEquMQt1K1h6XxS#j|$&(XQ}OqK}bvclbE*Cx{P(PZB>te0O+~_$cum;VI%z z5kC-`#K$D3Xjmk{c_YVfgj2)|#CL{8;x_TSLWg*X_@VG=;;!WLcZ42MpVV8!GVy8R zd%_vwXNYeOE5v7s?+BkEK1Y1ZwX?*(O#I&PE5z@QMZ?_}qwH1rgTx1k9|-poKR|p> z_z>|S;_JhM#19kS7ak!#OuRchO8gk{uJB>vj}Y$HYeibIEI|7Cm)!lcuM> JQK#z4{{v;_EeHSr literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/structures.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/structures.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e79495e3c08273822c71511da994c10ba1023d70 GIT binary patch literal 5599 zcmb_gO>7&-6`omgsTC=Cok%tuCu!D^ZA!LG8;RojM{%u6PVLB1eypSgBV)PZj-<6n zE;GB7B1JBQLO?AftsNw-WVl6Cpg?Un1=3Tm?Wu=e#L%rB!k3}}+T0Q;LDQW2-t3Pk ziFSju1MqQo=grLf`QDp1^XKN~IDz)&hncZVf{?%COVDKhVf6)gSRf`z6O)=!j^?Gb zM2Q(Oqq#^vnvUk>v`mRazDG=Xj+ikf-;8);(=qY20lq4%A^fULHFm_OpO16)T8TNX zlX6^M%DN@aocIqnw|KnIa1CvZNpr^xS1a0+jB76ibHqQvH9KfE@jN#fXJ((3bw8o_ zO{z9LXB3N8VYIsCxsq!P=a~PV_2l%Z}=SW&c zHPbOO2DHHh<Jmarm zs2(i~JqN6{E-jNWp*NE`kh8{_W)ELrSvM7rYtYW*i#e8O1=rDxTu#d~cg!~7xnOE` zk#WPd?1H1&BZ4`TS+8y;qZy7i$zUM-;~Gf^7R%bjsZ1uN_2e8|j4N_`!ZI25<|%%Ih$*xh4<0+_SqeRt zwM^}4t&aEGJH#|T&#TFvY?c+>$DtLB zJkurttTwkstpY%P3Ls`fcn9&|Aqa%@@`DX71E7|Qrr|Qg2Ws_N$;esm6nH#eG`I!! z6dKnA3?g|HqO#xtTO^nG|R%5y_PBrG~-w~-s9hMuZM!_0JH8wtJ@KMJ>RuJ*4f!I>sG;Xb$$Ag zI&e<~z3s5PgJhQ6-M;Ic{H5qyi8~4PQum#fZI}A)C@q(wmlN}eD}809ZSk3k(zXh` zB#Tl94XuLjtKS8(KxXKSG$Mhug8rKS8G501q~8VpkahFIjDDMR!g#r4p|v*aVS z{{!>) zych*gE_G_dB^S1CcTCidBF`aCypm@f0MUa2fQR5A1mKoh0M1Az!Mrje`B2;nP^1V& za6674;2Ka!q`Tm+s)*$fkue|uh;`|d?*^XfC+b;KjPokcI!Nq+an84Z_(&Wq@9VyP z{vX!wCn28TU+;()j=PUt=mIL%EBg_9Gj?Ft$tRoVfYTN?V<8->fj%ue@gr@ zar@+p<&!T~PM*7^4lXN$n^PZ_0wSls4-e~5N!<{YH~lBxX(hkqP4>mVv()wtyZ1vy9IxB{fQWx#gBvk5by;(*fy zNAv(1#7-*PQ0nt_TTM*Y*=rC*JL~z~>+6LX93&7#iEUTdFTQ^(vFC1U^157UP0gSB zxMkOJ)2@%zmMeX?TX&aRcUM~XR@CJCT_4D|5A~D}^;8b^R`&Om)xKq=Z*$loOocN} z!^1jf)J+i=LT3QG-!>XIFjPd?#Y-Q1fOiwrqIm3@-ce6=>^Tc#d~n@WA7ASF&GBCy zzuop!x$UV++qWy~k!9t`W_=J8LZ4^gp;jLkzlsJB`5IaTPzklEMxfT?T`&bdh-70% zghb9+5q67vC33I#c^K>L03veYyIqUX_u^OM*P1FVdn)SQWo56>N$h2CW`;@e0HEvD zxUT1Ivy{WfVck03dYL_>l_mneKZ ze<7F=t`27JIr5pbLsnM1qVn#QrigrKB~Io2D={kXL2{NN)mCDX{4!lpV)7}v@*tIu zuEN)(H!)6^g)K4H39Hki~@qTs6Rz15GzvBCpf5 z0_8$OHGbB%$4f=LMVNjFDV+NaKBeWv=ittuel>}<_!$*tGtooI*0Rq$l+r(eoDx7A z4;h|I;5>n5ugXpdE*pf&{X&`d!bH_ZUC+W{-htW}71gv^&$Q^9>6SH-!?VCE&>;#5 zC?oE)?tr5}<6WhBzM-t__=~c0Gr)0H{H;C?1S_xlrQT`nspP!Ys(t}r8zaa1@ruz>c&kJ(^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__pycache__/utils.cpython-312.pyc b/venv/Lib/site-packages/requests/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fba5b618fbab7217e2d71e5009c734f59eefb53 GIT binary patch literal 36160 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 L(#iMn3`_q%GXL6L literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/requests/__version__.py b/venv/Lib/site-packages/requests/__version__.py new file mode 100644 index 00000000..3128a464 --- /dev/null +++ b/venv/Lib/site-packages/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = "requests" +__description__ = "Python HTTP for Humans." +__url__ = "https://requests.readthedocs.io" +__version__ = "2.32.4" +__build__ = 0x023204 +__author__ = "Kenneth Reitz" +__author_email__ = "me@kennethreitz.org" +__license__ = "Apache-2.0" +__copyright__ = "Copyright Kenneth Reitz" +__cake__ = "\u2728 \U0001f370 \u2728" diff --git a/venv/Lib/site-packages/requests/_internal_utils.py b/venv/Lib/site-packages/requests/_internal_utils.py new file mode 100644 index 00000000..f2cf635e --- /dev/null +++ b/venv/Lib/site-packages/requests/_internal_utils.py @@ -0,0 +1,50 @@ +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" +import re + +from .compat import builtin_str + +_VALID_HEADER_NAME_RE_BYTE = re.compile(rb"^[^:\s][^:\r\n]*$") +_VALID_HEADER_NAME_RE_STR = re.compile(r"^[^:\s][^:\r\n]*$") +_VALID_HEADER_VALUE_RE_BYTE = re.compile(rb"^\S[^\r\n]*$|^$") +_VALID_HEADER_VALUE_RE_STR = re.compile(r"^\S[^\r\n]*$|^$") + +_HEADER_VALIDATORS_STR = (_VALID_HEADER_NAME_RE_STR, _VALID_HEADER_VALUE_RE_STR) +_HEADER_VALIDATORS_BYTE = (_VALID_HEADER_NAME_RE_BYTE, _VALID_HEADER_VALUE_RE_BYTE) +HEADER_VALIDATORS = { + bytes: _HEADER_VALIDATORS_BYTE, + str: _HEADER_VALIDATORS_STR, +} + + +def to_native_string(string, encoding="ascii"): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode("ascii") + return True + except UnicodeEncodeError: + return False diff --git a/venv/Lib/site-packages/requests/adapters.py b/venv/Lib/site-packages/requests/adapters.py new file mode 100644 index 00000000..9a58b160 --- /dev/null +++ b/venv/Lib/site-packages/requests/adapters.py @@ -0,0 +1,719 @@ +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket # noqa: F401 +import typing +import warnings + +from urllib3.exceptions import ClosedPoolError, ConnectTimeoutError +from urllib3.exceptions import HTTPError as _HTTPError +from urllib3.exceptions import InvalidHeader as _InvalidHeader +from urllib3.exceptions import ( + LocationValueError, + MaxRetryError, + NewConnectionError, + ProtocolError, +) +from urllib3.exceptions import ProxyError as _ProxyError +from urllib3.exceptions import ReadTimeoutError, ResponseError +from urllib3.exceptions import SSLError as _SSLError +from urllib3.poolmanager import PoolManager, proxy_from_url +from urllib3.util import Timeout as TimeoutSauce +from urllib3.util import parse_url +from urllib3.util.retry import Retry +from urllib3.util.ssl_ import create_urllib3_context + +from .auth import _basic_auth_str +from .compat import basestring, urlparse +from .cookies import extract_cookies_to_jar +from .exceptions import ( + ConnectionError, + ConnectTimeout, + InvalidHeader, + InvalidProxyURL, + InvalidSchema, + InvalidURL, + ProxyError, + ReadTimeout, + RetryError, + SSLError, +) +from .models import Response +from .structures import CaseInsensitiveDict +from .utils import ( + DEFAULT_CA_BUNDLE_PATH, + extract_zipped_paths, + get_auth_from_url, + get_encoding_from_headers, + prepend_scheme_if_needed, + select_proxy, + urldefragauth, +) + +try: + from urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + + +if typing.TYPE_CHECKING: + from .models import PreparedRequest + + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +try: + import ssl # noqa: F401 + + _preloaded_ssl_context = create_urllib3_context() + _preloaded_ssl_context.load_verify_locations( + extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + ) +except ImportError: + # Bypass default SSLContext creation when Python + # interpreter isn't built with the ssl module. + _preloaded_ssl_context = None + + +def _urllib3_request_context( + request: "PreparedRequest", + verify: "bool | str | None", + client_cert: "typing.Tuple[str, str] | str | None", + poolmanager: "PoolManager", +) -> "(typing.Dict[str, typing.Any], typing.Dict[str, typing.Any])": + host_params = {} + pool_kwargs = {} + parsed_request_url = urlparse(request.url) + scheme = parsed_request_url.scheme.lower() + port = parsed_request_url.port + + # Determine if we have and should use our default SSLContext + # to optimize performance on standard requests. + poolmanager_kwargs = getattr(poolmanager, "connection_pool_kw", {}) + has_poolmanager_ssl_context = poolmanager_kwargs.get("ssl_context") + should_use_default_ssl_context = ( + _preloaded_ssl_context is not None and not has_poolmanager_ssl_context + ) + + cert_reqs = "CERT_REQUIRED" + if verify is False: + cert_reqs = "CERT_NONE" + elif verify is True and should_use_default_ssl_context: + pool_kwargs["ssl_context"] = _preloaded_ssl_context + elif isinstance(verify, str): + if not os.path.isdir(verify): + pool_kwargs["ca_certs"] = verify + else: + pool_kwargs["ca_cert_dir"] = verify + pool_kwargs["cert_reqs"] = cert_reqs + if client_cert is not None: + if isinstance(client_cert, tuple) and len(client_cert) == 2: + pool_kwargs["cert_file"] = client_cert[0] + pool_kwargs["key_file"] = client_cert[1] + else: + # According to our docs, we allow users to specify just the client + # cert path + pool_kwargs["cert_file"] = client_cert + host_params = { + "scheme": scheme, + "host": parsed_request_url.hostname, + "port": port, + } + return host_params, pool_kwargs + + +class BaseAdapter: + """The Base Transport Adapter""" + + def __init__(self): + super().__init__() + + def send( + self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None + ): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session ` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + + __attrs__ = [ + "max_retries", + "config", + "_pool_connections", + "_pool_maxsize", + "_pool_block", + ] + + def __init__( + self, + pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, + max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK, + ): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super().__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager( + self._pool_connections, self._pool_maxsize, block=self._pool_block + ) + + def init_poolmanager( + self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs + ): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + **pool_kwargs, + ) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith("socks"): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs, + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs, + ) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith("https") and verify: + conn.cert_reqs = "CERT_REQUIRED" + + # Only load the CA certificates if 'verify' is a string indicating the CA bundle to use. + # Otherwise, if verify is a boolean, we don't load anything since + # the connection will be using a context with the default certificates already loaded, + # and this avoids a call to the slow load_verify_locations() + if verify is not True: + # `verify` must be a str with a path then + cert_loc = verify + + if not os.path.exists(cert_loc): + raise OSError( + f"Could not find a suitable TLS CA certificate bundle, " + f"invalid path: {cert_loc}" + ) + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = "CERT_NONE" + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise OSError( + f"Could not find the TLS certificate file, " + f"invalid path: {conn.cert_file}" + ) + if conn.key_file and not os.path.exists(conn.key_file): + raise OSError( + f"Could not find the TLS key file, invalid path: {conn.key_file}" + ) + + def build_response(self, req, resp): + """Builds a :class:`Response ` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter ` + + :param req: The :class:`PreparedRequest ` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, "status", None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, "headers", {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode("utf-8") + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def build_connection_pool_key_attributes(self, request, verify, cert=None): + """Build the PoolKey attributes used by urllib3 to return a connection. + + This looks at the PreparedRequest, the user-specified verify value, + and the value of the cert parameter to determine what PoolKey values + to use to select a connection from a given urllib3 Connection Pool. + + The SSL related pool key arguments are not consistently set. As of + this writing, use the following to determine what keys may be in that + dictionary: + + * If ``verify`` is ``True``, ``"ssl_context"`` will be set and will be the + default Requests SSL Context + * If ``verify`` is ``False``, ``"ssl_context"`` will not be set but + ``"cert_reqs"`` will be set + * If ``verify`` is a string, (i.e., it is a user-specified trust bundle) + ``"ca_certs"`` will be set if the string is not a directory recognized + by :py:func:`os.path.isdir`, otherwise ``"ca_certs_dir"`` will be + set. + * If ``"cert"`` is specified, ``"cert_file"`` will always be set. If + ``"cert"`` is a tuple with a second item, ``"key_file"`` will also + be present + + To override these settings, one may subclass this class, call this + method and use the above logic to change parameters as desired. For + example, if one wishes to use a custom :py:class:`ssl.SSLContext` one + must both set ``"ssl_context"`` and based on what else they require, + alter the other keys to ensure the desired behaviour. + + :param request: + The PreparedReqest being sent over the connection. + :type request: + :class:`~requests.models.PreparedRequest` + :param verify: + Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use. + :param cert: + (optional) Any user-provided SSL certificate for client + authentication (a.k.a., mTLS). This may be a string (i.e., just + the path to a file which holds both certificate and key) or a + tuple of length 2 with the certificate file path and key file + path. + :returns: + A tuple of two dictionaries. The first is the "host parameters" + portion of the Pool Key including scheme, hostname, and port. The + second is a dictionary of SSLContext related parameters. + """ + return _urllib3_request_context(request, verify, cert, self.poolmanager) + + def get_connection_with_tls_context(self, request, verify, proxies=None, cert=None): + """Returns a urllib3 connection for the given request and TLS settings. + This should not be called from user code, and is only exposed for use + when subclassing the :class:`HTTPAdapter `. + + :param request: + The :class:`PreparedRequest ` object to be sent + over the connection. + :param verify: + Either a boolean, in which case it controls whether we verify the + server's TLS certificate, or a string, in which case it must be a + path to a CA bundle to use. + :param proxies: + (optional) The proxies dictionary to apply to the request. + :param cert: + (optional) Any user-provided SSL certificate to be used for client + authentication (a.k.a., mTLS). + :rtype: + urllib3.ConnectionPool + """ + proxy = select_proxy(request.url, proxies) + try: + host_params, pool_kwargs = self.build_connection_pool_key_attributes( + request, + verify, + cert, + ) + except ValueError as e: + raise InvalidURL(e, request=request) + if proxy: + proxy = prepend_scheme_if_needed(proxy, "http") + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL( + "Please check proxy URL. It is malformed " + "and could be missing the host." + ) + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_host( + **host_params, pool_kwargs=pool_kwargs + ) + else: + # Only scheme should be lower case + conn = self.poolmanager.connection_from_host( + **host_params, pool_kwargs=pool_kwargs + ) + + return conn + + def get_connection(self, url, proxies=None): + """DEPRECATED: Users should move to `get_connection_with_tls_context` + for all subclasses of HTTPAdapter using Requests>=2.32.2. + + Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + warnings.warn( + ( + "`get_connection` has been deprecated in favor of " + "`get_connection_with_tls_context`. Custom HTTPAdapter subclasses " + "will need to migrate for Requests>=2.32.2. Please see " + "https://github.com/psf/requests/pull/6710 for more details." + ), + DeprecationWarning, + ) + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, "http") + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL( + "Please check proxy URL. It is malformed " + "and could be missing the host." + ) + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = proxy and scheme != "https" + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith("socks") + + url = request.path_url + if url.startswith("//"): # Don't confuse urllib3 + url = f"/{url.lstrip('/')}" + + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter `. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers["Proxy-Authorization"] = _basic_auth_str(username, password) + + return headers + + def send( + self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None + ): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + try: + conn = self.get_connection_with_tls_context( + request, verify, proxies=proxies, cert=cert + ) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers( + request, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + ) + + chunked = not (request.body is None or "Content-Length" in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError: + raise ValueError( + f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " + f"or a single float to set both timeouts to the same value." + ) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout, + chunked=chunked, + ) + + except (ProtocolError, OSError) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + elif isinstance(e, _InvalidHeader): + raise InvalidHeader(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/venv/Lib/site-packages/requests/api.py b/venv/Lib/site-packages/requests/api.py new file mode 100644 index 00000000..59607445 --- /dev/null +++ b/venv/Lib/site-packages/requests/api.py @@ -0,0 +1,157 @@ +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request `. + + :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the query string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content_type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response ` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'https://httpbin.org/get') + >>> req + + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the query string for the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("get", url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("options", url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. If + `allow_redirects` is not provided, it will be set to `False` (as + opposed to the default :meth:`request` behavior). + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", False) + return request("head", url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("post", url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("put", url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("patch", url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("delete", url, **kwargs) diff --git a/venv/Lib/site-packages/requests/auth.py b/venv/Lib/site-packages/requests/auth.py new file mode 100644 index 00000000..4a7ce6dc --- /dev/null +++ b/venv/Lib/site-packages/requests/auth.py @@ -0,0 +1,314 @@ +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import hashlib +import os +import re +import threading +import time +import warnings +from base64 import b64encode + +from ._internal_utils import to_native_string +from .compat import basestring, str, urlparse +from .cookies import extract_cookies_to_jar +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded" +CONTENT_TYPE_MULTI_PART = "multipart/form-data" + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(type(password)), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode("latin1") + + if isinstance(password, str): + password = password.encode("latin1") + + authstr = "Basic " + to_native_string( + b64encode(b":".join((username, password))).strip() + ) + + return authstr + + +class AuthBase: + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError("Auth hooks must be callable.") + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all( + [ + self.username == getattr(other, "username", None), + self.password == getattr(other, "password", None), + ] + ) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers["Authorization"] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers["Proxy-Authorization"] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, "init"): + self._thread_local.init = True + self._thread_local.last_nonce = "" + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal["realm"] + nonce = self._thread_local.chal["nonce"] + qop = self._thread_local.chal.get("qop") + algorithm = self._thread_local.chal.get("algorithm") + opaque = self._thread_local.chal.get("opaque") + hash_utf8 = None + + if algorithm is None: + _algorithm = "MD5" + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == "MD5" or _algorithm == "MD5-SESS": + + def md5_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.md5(x).hexdigest() + + hash_utf8 = md5_utf8 + elif _algorithm == "SHA": + + def sha_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha1(x).hexdigest() + + hash_utf8 = sha_utf8 + elif _algorithm == "SHA-256": + + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha256(x).hexdigest() + + hash_utf8 = sha256_utf8 + elif _algorithm == "SHA-512": + + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha512(x).hexdigest() + + hash_utf8 = sha512_utf8 + + KD = lambda s, d: hash_utf8(f"{s}:{d}") # noqa:E731 + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += f"?{p_parsed.query}" + + A1 = f"{self.username}:{realm}:{self.password}" + A2 = f"{method}:{path}" + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = f"{self._thread_local.nonce_count:08x}" + s = str(self._thread_local.nonce_count).encode("utf-8") + s += nonce.encode("utf-8") + s += time.ctime().encode("utf-8") + s += os.urandom(8) + + cnonce = hashlib.sha1(s).hexdigest()[:16] + if _algorithm == "MD5-SESS": + HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}") + + if not qop: + respdig = KD(HA1, f"{nonce}:{HA2}") + elif qop == "auth" or "auth" in qop.split(","): + noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}" + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = ( + f'username="{self.username}", realm="{realm}", nonce="{nonce}", ' + f'uri="{path}", response="{respdig}"' + ) + if opaque: + base += f', opaque="{opaque}"' + if algorithm: + base += f', algorithm="{algorithm}"' + if entdig: + base += f', digest="{entdig}"' + if qop: + base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"' + + return f"Digest {base}" + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/psf/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get("www-authenticate", "") + + if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: + self._thread_local.num_401_calls += 1 + pat = re.compile(r"digest ", flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers["Authorization"] = self.build_digest_header( + prep.method, prep.url + ) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers["Authorization"] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook("response", self.handle_401) + r.register_hook("response", self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all( + [ + self.username == getattr(other, "username", None), + self.password == getattr(other, "password", None), + ] + ) + + def __ne__(self, other): + return not self == other diff --git a/venv/Lib/site-packages/requests/certs.py b/venv/Lib/site-packages/requests/certs.py new file mode 100644 index 00000000..be422c3e --- /dev/null +++ b/venv/Lib/site-packages/requests/certs.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from certifi import where + +if __name__ == "__main__": + print(where()) diff --git a/venv/Lib/site-packages/requests/compat.py b/venv/Lib/site-packages/requests/compat.py new file mode 100644 index 00000000..7f9d7543 --- /dev/null +++ b/venv/Lib/site-packages/requests/compat.py @@ -0,0 +1,106 @@ +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module previously handled import compatibility issues +between Python 2 and Python 3. It remains for backwards +compatibility until the next major version. +""" + +import importlib +import sys + +# ------- +# urllib3 +# ------- +from urllib3 import __version__ as urllib3_version + +# Detect which major version of urllib3 is being used. +try: + is_urllib3_1 = int(urllib3_version.split(".")[0]) == 1 +except (TypeError, AttributeError): + # If we can't discern a version, prefer old functionality. + is_urllib3_1 = True + +# ------------------- +# Character Detection +# ------------------- + + +def _resolve_char_detection(): + """Find supported character detection libraries.""" + chardet = None + for lib in ("chardet", "charset_normalizer"): + if chardet is None: + try: + chardet = importlib.import_module(lib) + except ImportError: + pass + return chardet + + +chardet = _resolve_char_detection() + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = _ver[0] == 2 + +#: Python 3.x? +is_py3 = _ver[0] == 3 + +# json/simplejson module import resolution +has_simplejson = False +try: + import simplejson as json + + has_simplejson = True +except ImportError: + import json + +if has_simplejson: + from simplejson import JSONDecodeError +else: + from json import JSONDecodeError + +# Keep OrderedDict for backwards compatibility. +from collections import OrderedDict +from collections.abc import Callable, Mapping, MutableMapping +from http import cookiejar as cookielib +from http.cookies import Morsel +from io import StringIO + +# -------------- +# Legacy Imports +# -------------- +from urllib.parse import ( + quote, + quote_plus, + unquote, + unquote_plus, + urldefrag, + urlencode, + urljoin, + urlparse, + urlsplit, + urlunparse, +) +from urllib.request import ( + getproxies, + getproxies_environment, + parse_http_list, + proxy_bypass, + proxy_bypass_environment, +) + +builtin_str = str +str = str +bytes = bytes +basestring = (str, bytes) +numeric_types = (int, float) +integer_types = (int,) diff --git a/venv/Lib/site-packages/requests/cookies.py b/venv/Lib/site-packages/requests/cookies.py new file mode 100644 index 00000000..f69d0cda --- /dev/null +++ b/venv/Lib/site-packages/requests/cookies.py @@ -0,0 +1,561 @@ +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `http.cookiejar.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import calendar +import copy +import time + +from ._internal_utils import to_native_string +from .compat import Morsel, MutableMapping, cookielib, urlparse, urlunparse + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest: + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `http.cookiejar.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get("Host"): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers["Host"], encoding="utf-8") + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse( + [ + parsed.scheme, + host, + parsed.path, + parsed.params, + parsed.query, + parsed.fragment, + ] + ) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookiejar has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError( + "Cookie headers should be added with add_unredirected_header()" + ) + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse: + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `http.cookiejar` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookiejar` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: http.cookiejar.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, "_original_response") and response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get("Cookie") + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): + """Compatibility class; is a http.cookiejar.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name( + self, name, domain=kwargs.get("domain"), path=kwargs.get("path") + ) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if (domain is None or cookie.domain == domain) and ( + path is None or cookie.path == path + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super().__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``http.cookiejar.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if ( + hasattr(cookie.value, "startswith") + and cookie.value.startswith('"') + and cookie.value.endswith('"') + ): + cookie.value = cookie.value.replace('\\"', "") + return super().set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super().update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: + # if there are multiple cookies that meet passed in criteria + raise CookieConflictError( + f"There are multiple cookies with name, {name!r}" + ) + # we will eventually return this as long as no cookie conflict + toReturn = cookie.value + + if toReturn: + return toReturn + raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop("_cookies_lock") + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if "_cookies_lock" not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, "copy"): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = { + "version": 0, + "name": name, + "value": value, + "port": None, + "domain": "", + "path": "/", + "secure": False, + "expires": None, + "discard": True, + "comment": None, + "comment_url": None, + "rest": {"HttpOnly": None}, + "rfc2109": False, + } + + badargs = set(kwargs) - set(result) + if badargs: + raise TypeError( + f"create_cookie() got unexpected keyword arguments: {list(badargs)}" + ) + + result.update(kwargs) + result["port_specified"] = bool(result["port"]) + result["domain_specified"] = bool(result["domain"]) + result["domain_initial_dot"] = result["domain"].startswith(".") + result["path_specified"] = bool(result["path"]) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel["max-age"]: + try: + expires = int(time.time() + int(morsel["max-age"])) + except ValueError: + raise TypeError(f"max-age: {morsel['max-age']} must be integer") + elif morsel["expires"]: + time_template = "%a, %d-%b-%Y %H:%M:%S GMT" + expires = calendar.timegm(time.strptime(morsel["expires"], time_template)) + return create_cookie( + comment=morsel["comment"], + comment_url=bool(morsel["comment"]), + discard=False, + domain=morsel["domain"], + expires=expires, + name=morsel.key, + path=morsel["path"], + port=None, + rest={"HttpOnly": morsel["httponly"]}, + rfc2109=False, + secure=bool(morsel["secure"]), + value=morsel.value, + version=morsel["version"] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + :rtype: CookieJar + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError("You can only merge into CookieJar") + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict(cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/venv/Lib/site-packages/requests/exceptions.py b/venv/Lib/site-packages/requests/exceptions.py new file mode 100644 index 00000000..83986b48 --- /dev/null +++ b/venv/Lib/site-packages/requests/exceptions.py @@ -0,0 +1,151 @@ +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from urllib3.exceptions import HTTPError as BaseHTTPError + +from .compat import JSONDecodeError as CompatJSONDecodeError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop("response", None) + self.response = response + self.request = kwargs.pop("request", None) + if response is not None and not self.request and hasattr(response, "request"): + self.request = self.response.request + super().__init__(*args, **kwargs) + + +class InvalidJSONError(RequestException): + """A JSON error occurred.""" + + +class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError): + """Couldn't decode the text into json""" + + def __init__(self, *args, **kwargs): + """ + Construct the JSONDecodeError instance first with all + args. Then use it's args to construct the IOError so that + the json specific args aren't used as IOError specific args + and the error message from JSONDecodeError is preserved. + """ + CompatJSONDecodeError.__init__(self, *args) + InvalidJSONError.__init__(self, *self.args, **kwargs) + + def __reduce__(self): + """ + The __reduce__ method called when pickling the object must + be the one from the JSONDecodeError (be it json/simplejson) + as it expects all the arguments for instantiation, not just + one like the IOError, and the MRO would by default call the + __reduce__ method from the IOError due to the inheritance order. + """ + return CompatJSONDecodeError.__reduce__(self) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL scheme (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """The URL scheme provided is either invalid or unsupported.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content.""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed.""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body.""" + + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" diff --git a/venv/Lib/site-packages/requests/help.py b/venv/Lib/site-packages/requests/help.py new file mode 100644 index 00000000..8fbcd656 --- /dev/null +++ b/venv/Lib/site-packages/requests/help.py @@ -0,0 +1,134 @@ +"""Module containing bug report helper(s).""" + +import json +import platform +import ssl +import sys + +import idna +import urllib3 + +from . import __version__ as requests_version + +try: + import charset_normalizer +except ImportError: + charset_normalizer = None + +try: + import chardet +except ImportError: + chardet = None + +try: + from urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import cryptography + import OpenSSL + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 3.10.3 it will return + {'name': 'CPython', 'version': '3.10.3'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == "CPython": + implementation_version = platform.python_version() + elif implementation == "PyPy": + implementation_version = "{}.{}.{}".format( + sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro, + ) + if sys.pypy_version_info.releaselevel != "final": + implementation_version = "".join( + [implementation_version, sys.pypy_version_info.releaselevel] + ) + elif implementation == "Jython": + implementation_version = platform.python_version() # Complete Guess + elif implementation == "IronPython": + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = "Unknown" + + return {"name": implementation, "version": implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + "system": platform.system(), + "release": platform.release(), + } + except OSError: + platform_info = { + "system": "Unknown", + "release": "Unknown", + } + + implementation_info = _implementation() + urllib3_info = {"version": urllib3.__version__} + charset_normalizer_info = {"version": None} + chardet_info = {"version": None} + if charset_normalizer: + charset_normalizer_info = {"version": charset_normalizer.__version__} + if chardet: + chardet_info = {"version": chardet.__version__} + + pyopenssl_info = { + "version": None, + "openssl_version": "", + } + if OpenSSL: + pyopenssl_info = { + "version": OpenSSL.__version__, + "openssl_version": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}", + } + cryptography_info = { + "version": getattr(cryptography, "__version__", ""), + } + idna_info = { + "version": getattr(idna, "__version__", ""), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = {"version": f"{system_ssl:x}" if system_ssl is not None else ""} + + return { + "platform": platform_info, + "implementation": implementation_info, + "system_ssl": system_ssl_info, + "using_pyopenssl": pyopenssl is not None, + "using_charset_normalizer": chardet is None, + "pyOpenSSL": pyopenssl_info, + "urllib3": urllib3_info, + "chardet": chardet_info, + "charset_normalizer": charset_normalizer_info, + "cryptography": cryptography_info, + "idna": idna_info, + "requests": { + "version": requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/venv/Lib/site-packages/requests/hooks.py b/venv/Lib/site-packages/requests/hooks.py new file mode 100644 index 00000000..d181ba2e --- /dev/null +++ b/venv/Lib/site-packages/requests/hooks.py @@ -0,0 +1,33 @@ +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ["response"] + + +def default_hooks(): + return {event: [] for event in HOOKS} + + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or {} + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, "__call__"): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/venv/Lib/site-packages/requests/models.py b/venv/Lib/site-packages/requests/models.py new file mode 100644 index 00000000..c4b25fa0 --- /dev/null +++ b/venv/Lib/site-packages/requests/models.py @@ -0,0 +1,1039 @@ +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import datetime + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/psf/requests/issues/3578. +import encodings.idna # noqa: F401 +from io import UnsupportedOperation + +from urllib3.exceptions import ( + DecodeError, + LocationParseError, + ProtocolError, + ReadTimeoutError, + SSLError, +) +from urllib3.fields import RequestField +from urllib3.filepost import encode_multipart_formdata +from urllib3.util import parse_url + +from ._internal_utils import to_native_string, unicode_is_ascii +from .auth import HTTPBasicAuth +from .compat import ( + Callable, + JSONDecodeError, + Mapping, + basestring, + builtin_str, + chardet, + cookielib, +) +from .compat import json as complexjson +from .compat import urlencode, urlsplit, urlunparse +from .cookies import _copy_cookie_jar, cookiejar_from_dict, get_cookie_header +from .exceptions import ( + ChunkedEncodingError, + ConnectionError, + ContentDecodingError, + HTTPError, + InvalidJSONError, + InvalidURL, +) +from .exceptions import JSONDecodeError as RequestsJSONDecodeError +from .exceptions import MissingSchema +from .exceptions import SSLError as RequestsSSLError +from .exceptions import StreamConsumedError +from .hooks import default_hooks +from .status_codes import codes +from .structures import CaseInsensitiveDict +from .utils import ( + check_header_validity, + get_auth_from_url, + guess_filename, + guess_json_utf, + iter_slices, + parse_header_links, + requote_uri, + stream_decode_response_unicode, + super_len, + to_key_val_list, +) + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin: + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = "/" + + url.append(path) + + query = p.query + if query: + url.append("?") + url.append(query) + + return "".join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, "read"): + return data + elif hasattr(data, "__iter__"): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, "__iter__"): + vs = [vs] + for v in vs: + if v is not None: + result.append( + ( + k.encode("utf-8") if isinstance(k, str) else k, + v.encode("utf-8") if isinstance(v, str) else v, + ) + ) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if not files: + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, "__iter__"): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + ( + field.decode("utf-8") + if isinstance(field, bytes) + else field, + v.encode("utf-8") if isinstance(v, str) else v, + ) + ) + + for k, v in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + elif hasattr(fp, "read"): + fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin: + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError(f'Unsupported event specified, with event name "{event}"') + + if isinstance(hook, Callable): + self.hooks[event].append(hook) + elif hasattr(hook, "__iter__"): + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request ` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> req.prepare() + + """ + + def __init__( + self, + method=None, + url=None, + headers=None, + files=None, + data=None, + params=None, + auth=None, + cookies=None, + hooks=None, + json=None, + ): + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for k, v in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return f"" + + def prepare(self): + """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + Instances are generated from a :class:`Request ` object, and + should not be instantiated manually; doing so may produce undesirable + effects. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> r = req.prepare() + >>> r + + + >>> s = requests.Session() + >>> s.send(r) + + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare( + self, + method=None, + url=None, + headers=None, + files=None, + data=None, + params=None, + auth=None, + cookies=None, + hooks=None, + json=None, + ): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return f"" + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + import idna + + try: + host = idna.encode(host, uts46=True).decode("utf-8") + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/psf/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode("utf8") + else: + url = str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ":" in url and not url.lower().startswith("http"): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + raise MissingSchema( + f"Invalid URL {url!r}: No scheme supplied. " + f"Perhaps you meant https://{url}?" + ) + + if not host: + raise InvalidURL(f"Invalid URL {url!r}: No host supplied") + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL("URL has an invalid label.") + elif host.startswith(("*", ".")): + raise InvalidURL("URL has an invalid label.") + + # Carefully reconstruct the network location + netloc = auth or "" + if netloc: + netloc += "@" + netloc += host + if port: + netloc += f":{port}" + + # Bare domains aren't valid URLs. + if not path: + path = "/" + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = f"{query}&{enc_params}" + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = "application/json" + + try: + body = complexjson.dumps(json, allow_nan=False) + except ValueError as ve: + raise InvalidJSONError(ve, request=self) + + if not isinstance(body, bytes): + body = body.encode("utf-8") + + is_stream = all( + [ + hasattr(data, "__iter__"), + not isinstance(data, (basestring, list, tuple, Mapping)), + ] + ) + + if is_stream: + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + body = data + + if getattr(body, "tell", None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except OSError: + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError( + "Streamed bodies and files are mutually exclusive." + ) + + if length: + self.headers["Content-Length"] = builtin_str(length) + else: + self.headers["Transfer-Encoding"] = "chunked" + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, "read"): + content_type = None + else: + content_type = "application/x-www-form-urlencoded" + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ("content-type" not in self.headers): + self.headers["Content-Type"] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers["Content-Length"] = builtin_str(length) + elif ( + self.method not in ("GET", "HEAD") + and self.headers.get("Content-Length") is None + ): + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers["Content-Length"] = "0" + + def prepare_auth(self, auth, url=""): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest ` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers["Cookie"] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response: + """The :class:`Response ` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + "_content", + "status_code", + "headers", + "url", + "history", + "encoding", + "reason", + "cookies", + "elapsed", + "request", + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + #: This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest ` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, "_content_consumed", True) + setattr(self, "raw", None) + + def __repr__(self): + return f"" + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return "location" in self.headers and self.status_code in REDIRECT_STATI + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return "location" in self.headers and self.status_code in ( + codes.moved_permanently, + codes.permanent_redirect, + ) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" + if chardet is not None: + return chardet.detect(self.content)["encoding"] + else: + # If no character detection library is available, we'll fall back + # to a standard Python utf-8 str. + return "utf-8" + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, "stream"): + try: + yield from self.raw.stream(chunk_size, decode_content=True) + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + except SSLError as e: + raise RequestsSSLError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError( + f"chunk_size must be an int, it is instead a {type(chunk_size)}." + ) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines( + self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None + ): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content( + chunk_size=chunk_size, decode_unicode=decode_unicode + ): + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + yield from lines + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError("The content for this response was already consumed") + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b"" + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``charset_normalizer`` or ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return "" + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors="replace") + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors="replace") + + return content + + def json(self, **kwargs): + r"""Decodes the JSON response body (if any) as a Python object. + + This may return a dictionary, list, etc. depending on what is in the response. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises requests.exceptions.JSONDecodeError: If the response body does not + contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using charset_normalizer to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads(self.content.decode(encoding), **kwargs) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + except JSONDecodeError as e: + raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) + + try: + return complexjson.loads(self.text, **kwargs) + except JSONDecodeError as e: + # Catch JSON-related errors and raise as requests.JSONDecodeError + # This aliases json.JSONDecodeError and simplejson.JSONDecodeError + raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get("link") + + resolved_links = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get("rel") or link.get("url") + resolved_links[key] = link + + return resolved_links + + def raise_for_status(self): + """Raises :class:`HTTPError`, if one occurred.""" + + http_error_msg = "" + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode("utf-8") + except UnicodeDecodeError: + reason = self.reason.decode("iso-8859-1") + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = ( + f"{self.status_code} Client Error: {reason} for url: {self.url}" + ) + + elif 500 <= self.status_code < 600: + http_error_msg = ( + f"{self.status_code} Server Error: {reason} for url: {self.url}" + ) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, "release_conn", None) + if release_conn is not None: + release_conn() diff --git a/venv/Lib/site-packages/requests/packages.py b/venv/Lib/site-packages/requests/packages.py new file mode 100644 index 00000000..5ab3d8e2 --- /dev/null +++ b/venv/Lib/site-packages/requests/packages.py @@ -0,0 +1,23 @@ +import sys + +from .compat import chardet + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ("urllib3", "idna"): + locals()[package] = __import__(package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == package or mod.startswith(f"{package}."): + sys.modules[f"requests.packages.{mod}"] = sys.modules[mod] + +if chardet is not None: + target = chardet.__name__ + for mod in list(sys.modules): + if mod == target or mod.startswith(f"{target}."): + imported_mod = sys.modules[mod] + sys.modules[f"requests.packages.{mod}"] = imported_mod + mod = mod.replace(target, "chardet") + sys.modules[f"requests.packages.{mod}"] = imported_mod diff --git a/venv/Lib/site-packages/requests/sessions.py b/venv/Lib/site-packages/requests/sessions.py new file mode 100644 index 00000000..b387bc36 --- /dev/null +++ b/venv/Lib/site-packages/requests/sessions.py @@ -0,0 +1,831 @@ +""" +requests.sessions +~~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from collections import OrderedDict +from datetime import timedelta + +from ._internal_utils import to_native_string +from .adapters import HTTPAdapter +from .auth import _basic_auth_str +from .compat import Mapping, cookielib, urljoin, urlparse +from .cookies import ( + RequestsCookieJar, + cookiejar_from_dict, + extract_cookies_to_jar, + merge_cookies, +) +from .exceptions import ( + ChunkedEncodingError, + ContentDecodingError, + InvalidSchema, + TooManyRedirects, +) +from .hooks import default_hooks, dispatch_hook + +# formerly defined here, reexposed here for backward compatibility +from .models import ( # noqa: F401 + DEFAULT_REDIRECT_LIMIT, + REDIRECT_STATI, + PreparedRequest, + Request, +) +from .status_codes import codes +from .structures import CaseInsensitiveDict +from .utils import ( # noqa: F401 + DEFAULT_PORTS, + default_headers, + get_auth_from_url, + get_environ_proxies, + get_netrc_auth, + requote_uri, + resolve_proxies, + rewind_body, + should_bypass_proxies, + to_key_val_list, +) + +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == "win32": + preferred_clock = time.perf_counter +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get("response") == []: + return request_hooks + + if request_hooks is None or request_hooks.get("response") == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin: + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers["location"] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + location = location.encode("latin1") + return to_native_string(location, "utf8") + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if ( + old_parsed.scheme == "http" + and old_parsed.port in (80, None) + and new_parsed.scheme == "https" + and new_parsed.port in (443, None) + ): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if ( + not changed_scheme + and old_parsed.port in default_port + and new_parsed.port in default_port + ): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + def resolve_redirects( + self, + resp, + req, + stream=False, + timeout=None, + verify=True, + cert=None, + proxies=None, + yield_requests=False, + **adapter_kwargs, + ): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects( + f"Exceeded {self.max_redirects} redirects.", response=resp + ) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith("//"): + parsed_rurl = urlparse(resp.url) + url = ":".join([to_native_string(parsed_rurl.scheme), url]) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == "" and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/psf/requests/issues/1084 + if resp.status_code not in ( + codes.temporary_redirect, + codes.permanent_redirect, + ): + # https://github.com/psf/requests/issues/3490 + purged_headers = ("Content-Length", "Content-Type", "Transfer-Encoding") + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + headers.pop("Cookie", None) + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = prepared_request._body_position is not None and ( + "Content-Length" in headers or "Transfer-Encoding" in headers + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs, + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if "Authorization" in headers and self.should_strip_auth( + response.request.url, url + ): + # If we get redirected to a new host, we should strip out any + # authentication headers. + del headers["Authorization"] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + headers = prepared_request.headers + scheme = urlparse(prepared_request.url).scheme + new_proxies = resolve_proxies(prepared_request, proxies, self.trust_env) + + if "Proxy-Authorization" in headers: + del headers["Proxy-Authorization"] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + # urllib3 handles proxy authorization for us in the standard adapter. + # Avoid appending this to TLS tunneled requests where it may be leaked. + if not scheme.startswith("https") and username and password: + headers["Proxy-Authorization"] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != "HEAD": + method = "GET" + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != "HEAD": + method = "GET" + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == "POST": + method = "GET" + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('https://httpbin.org/get') + + + Or as a context manager:: + + >>> with requests.Session() as s: + ... s.get('https://httpbin.org/get') + + """ + + __attrs__ = [ + "headers", + "cookies", + "auth", + "proxies", + "hooks", + "params", + "verify", + "cert", + "adapters", + "stream", + "trust_env", + "max_redirects", + ] + + def __init__(self): + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request `. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + #: Defaults to `True`, requiring requests to verify the TLS certificate at the + #: remote end. + #: If verify is set to `False`, requests will accept any TLS certificate + #: presented by the server, and will ignore hostname mismatches and/or + #: expired certificates, which will make your application vulnerable to + #: man-in-the-middle (MitM) attacks. + #: Only set this to `False` for testing. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar `, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount("https://", HTTPAdapter()) + self.mount("http://", HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request ` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies + ) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting( + request.headers, self.headers, dict_class=CaseInsensitiveDict + ), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request( + self, + method, + url, + params=None, + data=None, + headers=None, + cookies=None, + files=None, + auth=None, + timeout=None, + allow_redirects=True, + proxies=None, + hooks=None, + stream=None, + verify=None, + cert=None, + json=None, + ): + """Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param hooks: (optional) Dictionary mapping hook name to one event or + list of events, event must be callable. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. When set to + ``False``, requests will accept any TLS certificate presented by + the server, and will ignore hostname mismatches and/or expired + certificates, which will make your application vulnerable to + man-in-the-middle (MitM) attacks. Setting verify to ``False`` + may be useful during local development or testing. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + "timeout": timeout, + "allow_redirects": allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", True) + return self.request("GET", url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", True) + return self.request("OPTIONS", url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", False) + return self.request("HEAD", url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("POST", url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("PUT", url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("PATCH", url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("DELETE", url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault("stream", self.stream) + kwargs.setdefault("verify", self.verify) + kwargs.setdefault("cert", self.cert) + if "proxies" not in kwargs: + kwargs["proxies"] = resolve_proxies(request, self.proxies, self.trust_env) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError("You can only send PreparedRequests.") + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop("allow_redirects", True) + stream = kwargs.get("stream") + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook("response", hooks, r, **kwargs) + + # Persist cookies + if r.history: + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Resolve redirects if allowed. + if allow_redirects: + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + history = [resp for resp in gen] + else: + history = [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next( + self.resolve_redirects(r, request, yield_requests=True, **kwargs) + ) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get("no_proxy") if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for k, v in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration + # and be compatible with cURL. + if verify is True or verify is None: + verify = ( + os.environ.get("REQUESTS_CA_BUNDLE") + or os.environ.get("CURL_CA_BUNDLE") + or verify + ) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {"proxies": proxies, "stream": stream, "verify": verify, "cert": cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for prefix, adapter in self.adapters.items(): + if url.lower().startswith(prefix.lower()): + return adapter + + # Nothing matches :-/ + raise InvalidSchema(f"No connection adapters were found for {url!r}") + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/venv/Lib/site-packages/requests/status_codes.py b/venv/Lib/site-packages/requests/status_codes.py new file mode 100644 index 00000000..c7945a2f --- /dev/null +++ b/venv/Lib/site-packages/requests/status_codes.py @@ -0,0 +1,128 @@ +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +Example:: + + >>> import requests + >>> requests.codes['temporary_redirect'] + 307 + >>> requests.codes.teapot + 418 + >>> requests.codes['\o/'] + 200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +from .structures import LookupDict + +_codes = { + # Informational. + 100: ("continue",), + 101: ("switching_protocols",), + 102: ("processing", "early-hints"), + 103: ("checkpoint",), + 122: ("uri_too_long", "request_uri_too_long"), + 200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"), + 201: ("created",), + 202: ("accepted",), + 203: ("non_authoritative_info", "non_authoritative_information"), + 204: ("no_content",), + 205: ("reset_content", "reset"), + 206: ("partial_content", "partial"), + 207: ("multi_status", "multiple_status", "multi_stati", "multiple_stati"), + 208: ("already_reported",), + 226: ("im_used",), + # Redirection. + 300: ("multiple_choices",), + 301: ("moved_permanently", "moved", "\\o-"), + 302: ("found",), + 303: ("see_other", "other"), + 304: ("not_modified",), + 305: ("use_proxy",), + 306: ("switch_proxy",), + 307: ("temporary_redirect", "temporary_moved", "temporary"), + 308: ( + "permanent_redirect", + "resume_incomplete", + "resume", + ), # "resume" and "resume_incomplete" to be removed in 3.0 + # Client Error. + 400: ("bad_request", "bad"), + 401: ("unauthorized",), + 402: ("payment_required", "payment"), + 403: ("forbidden",), + 404: ("not_found", "-o-"), + 405: ("method_not_allowed", "not_allowed"), + 406: ("not_acceptable",), + 407: ("proxy_authentication_required", "proxy_auth", "proxy_authentication"), + 408: ("request_timeout", "timeout"), + 409: ("conflict",), + 410: ("gone",), + 411: ("length_required",), + 412: ("precondition_failed", "precondition"), + 413: ("request_entity_too_large", "content_too_large"), + 414: ("request_uri_too_large", "uri_too_long"), + 415: ("unsupported_media_type", "unsupported_media", "media_type"), + 416: ( + "requested_range_not_satisfiable", + "requested_range", + "range_not_satisfiable", + ), + 417: ("expectation_failed",), + 418: ("im_a_teapot", "teapot", "i_am_a_teapot"), + 421: ("misdirected_request",), + 422: ("unprocessable_entity", "unprocessable", "unprocessable_content"), + 423: ("locked",), + 424: ("failed_dependency", "dependency"), + 425: ("unordered_collection", "unordered", "too_early"), + 426: ("upgrade_required", "upgrade"), + 428: ("precondition_required", "precondition"), + 429: ("too_many_requests", "too_many"), + 431: ("header_fields_too_large", "fields_too_large"), + 444: ("no_response", "none"), + 449: ("retry_with", "retry"), + 450: ("blocked_by_windows_parental_controls", "parental_controls"), + 451: ("unavailable_for_legal_reasons", "legal_reasons"), + 499: ("client_closed_request",), + # Server Error. + 500: ("internal_server_error", "server_error", "/o\\", "✗"), + 501: ("not_implemented",), + 502: ("bad_gateway",), + 503: ("service_unavailable", "unavailable"), + 504: ("gateway_timeout",), + 505: ("http_version_not_supported", "http_version"), + 506: ("variant_also_negotiates",), + 507: ("insufficient_storage",), + 509: ("bandwidth_limit_exceeded", "bandwidth"), + 510: ("not_extended",), + 511: ("network_authentication_required", "network_auth", "network_authentication"), +} + +codes = LookupDict(name="status_codes") + + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(("\\", "/")): + setattr(codes, title.upper(), code) + + def doc(code): + names = ", ".join(f"``{n}``" for n in _codes[code]) + return "* %d: %s" % (code, names) + + global __doc__ + __doc__ = ( + __doc__ + "\n" + "\n".join(doc(code) for code in sorted(_codes)) + if __doc__ is not None + else None + ) + + +_init() diff --git a/venv/Lib/site-packages/requests/structures.py b/venv/Lib/site-packages/requests/structures.py new file mode 100644 index 00000000..188e13e4 --- /dev/null +++ b/venv/Lib/site-packages/requests/structures.py @@ -0,0 +1,99 @@ +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +from collections import OrderedDict + +from .compat import Mapping, MutableMapping + + +class CaseInsensitiveDict(MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ((lowerkey, keyval[1]) for (lowerkey, keyval) in self._store.items()) + + def __eq__(self, other): + if isinstance(other, Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super().__init__() + + def __repr__(self): + return f"" + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/venv/Lib/site-packages/requests/utils.py b/venv/Lib/site-packages/requests/utils.py new file mode 100644 index 00000000..8ab55852 --- /dev/null +++ b/venv/Lib/site-packages/requests/utils.py @@ -0,0 +1,1086 @@ +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile +from collections import OrderedDict + +from urllib3.util import make_headers, parse_url + +from . import certs +from .__version__ import __version__ + +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import ( # noqa: F401 + _HEADER_VALIDATORS_BYTE, + _HEADER_VALIDATORS_STR, + HEADER_VALIDATORS, + to_native_string, +) +from .compat import ( + Mapping, + basestring, + bytes, + getproxies, + getproxies_environment, + integer_types, + is_urllib3_1, +) +from .compat import parse_http_list as _parse_list_header +from .compat import ( + proxy_bypass, + proxy_bypass_environment, + quote, + str, + unquote, + urlparse, + urlunparse, +) +from .cookies import cookiejar_from_dict +from .exceptions import ( + FileModeWarning, + InvalidHeader, + InvalidURL, + UnrewindableBodyError, +) +from .structures import CaseInsensitiveDict + +NETRC_FILES = (".netrc", "_netrc") + +DEFAULT_CA_BUNDLE_PATH = certs.where() + +DEFAULT_PORTS = {"http": 80, "https": 443} + +# Ensure that ', ' is used to preserve previous delimiter behavior. +DEFAULT_ACCEPT_ENCODING = ", ".join( + re.split(r",\s*", make_headers(accept_encoding=True)["accept-encoding"]) +) + + +if sys.platform == "win32": + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + import winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey( + winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", + ) + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, "ProxyEnable")[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, "ProxyOverride")[0] + except (OSError, ValueError): + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(";") + # filter out empty strings to avoid re.match return true in the following code. + proxyOverride = filter(None, proxyOverride) + # now check if we match one of the registry values. + for test in proxyOverride: + if test == "": + if "." not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, "items"): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if not is_urllib3_1 and isinstance(o, str): + # urllib3 2.x+ treats all strings as utf-8 instead + # of latin-1 (iso-8859-1) like http.client. + o = o.encode("utf-8") + + if hasattr(o, "__len__"): + total_length = len(o) + + elif hasattr(o, "len"): + total_length = o.len + + elif hasattr(o, "fileno"): + try: + fileno = o.fileno() + except (io.UnsupportedOperation, AttributeError): + # AttributeError is a surprising exception, seeing as how we've just checked + # that `hasattr(o, 'fileno')`. It happens for objects obtained via + # `Tarfile.extractfile()`, per issue 5229. + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if "b" not in o.mode: + warnings.warn( + ( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode." + ), + FileModeWarning, + ) + + if hasattr(o, "tell"): + try: + current_position = o.tell() + except OSError: + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, "seek") and total_length is None: + # StringIO and BytesIO have seek but no usable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except OSError: + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + netrc_file = os.environ.get("NETRC") + if netrc_file is not None: + netrc_locations = (netrc_file,) + else: + netrc_locations = (f"~/{f}" for f in NETRC_FILES) + + try: + from netrc import NetrcParseError, netrc + + netrc_path = None + + for f in netrc_locations: + loc = os.path.expanduser(f) + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + host = ri.hostname + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = 0 if _netrc[0] else 1 + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, OSError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # App Engine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, "name", None) + if name and isinstance(name, basestring) and name[0] != "<" and name[-1] != ">": + return os.path.basename(name) + + +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + if not prefix: + # If we don't check for an empty prefix after the split (in other words, archive remains unchanged after the split), + # we _can_ end up in an infinite loop on a rare corner case affecting a small number of users + break + member = "/".join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, member.split("/")[-1]) + if not os.path.exists(extracted_path): + # use read + write to avoid the creating nested folders, we only want the file, avoids mkdir racing condition + with atomic_open(extracted_path) as file_handler: + file_handler.write(zip_file.read(member)) + return extracted_path + + +@contextlib.contextmanager +def atomic_open(filename): + """Write a file to the disk in an atomic fashion""" + tmp_descriptor, tmp_name = tempfile.mkstemp(dir=os.path.dirname(filename)) + try: + with os.fdopen(tmp_descriptor, "wb") as tmp_handler: + yield tmp_handler + os.replace(tmp_name, filename) + except BaseException: + os.remove(tmp_name) + raise + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + Traceback (most recent call last): + ... + ValueError: cannot encode objects that are not 2-tuples + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError("cannot encode objects that are not 2-tuples") + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + Traceback (most recent call last): + ... + ValueError: cannot encode objects that are not 2-tuples + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError("cannot encode objects that are not 2-tuples") + + if isinstance(value, Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if "=" not in item: + result[item] = None + continue + name, value = item.split("=", 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != "\\\\": + return value.replace("\\\\", "\\").replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {cookie.name: cookie.value for cookie in cj} + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn( + ( + "In requests 3.0, get_encodings_from_content will be removed. For " + "more information, please see the discussion on issue #2266. (This" + " warning should only appear once.)" + ), + DeprecationWarning, + ) + + charset_re = re.compile(r']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return ( + charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content) + ) + + +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(";") + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1 :].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get("content-type") + + if not content_type: + return None + + content_type, params = _parse_content_type_header(content_type) + + if "charset" in params: + return params["charset"].strip("'\"") + + if "text" in content_type: + return "ISO-8859-1" + + if "application/json" in content_type: + # Assume UTF-8 based on RFC 4627: https://www.ietf.org/rfc/rfc4627.txt since the charset was unset + return "utf-8" + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes an iterator.""" + + if r.encoding is None: + yield from iterator + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors="replace") + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b"", final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos : pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn( + ( + "In requests 3.0, get_unicode_from_response will be removed. For " + "more information, please see the discussion on issue #2266. (This" + " warning should only appear once.)" + ), + DeprecationWarning, + ) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors="replace") + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~" +) + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split("%") + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL(f"Invalid percent-escape sequence: '{h}'") + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = f"%{parts[i]}" + else: + parts[i] = f"%{parts[i]}" + return "".join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack("=L", socket.inet_aton(ip))[0] + netaddr, bits = net.split("/") + netmask = struct.unpack("=L", socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack("=L", socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xFFFFFFFF ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack(">I", bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except OSError: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count("/") == 1: + try: + mask = int(string_network.split("/")[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split("/")[0]) + except OSError: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + def get_proxy(key): + return os.environ.get(key) or os.environ.get(key.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy("no_proxy") + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = (host for host in no_proxy.replace(" ", "").split(",") if host) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += f":{parsed.port}" + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ("no_proxy", no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get("all")) + + proxy_keys = [ + urlparts.scheme + "://" + urlparts.hostname, + urlparts.scheme, + "all://" + urlparts.hostname, + "all", + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def resolve_proxies(request, proxies, trust_env=True): + """This method takes proxy information from a request and configuration + input to resolve a mapping of target proxies. This will consider settings + such as NO_PROXY to strip proxy configurations. + + :param request: Request or PreparedRequest + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + :param trust_env: Boolean declaring whether to trust environment configs + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + url = request.url + scheme = urlparse(url).scheme + no_proxy = proxies.get("no_proxy") + new_proxies = proxies.copy() + + if trust_env and not should_bypass_proxies(url, no_proxy=no_proxy): + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get("all")) + + if proxy: + new_proxies.setdefault(scheme, proxy) + return new_proxies + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return f"{name}/{__version__}" + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict( + { + "User-Agent": default_user_agent(), + "Accept-Encoding": DEFAULT_ACCEPT_ENCODING, + "Accept": "*/*", + "Connection": "keep-alive", + } + ) + + +def parse_header_links(value): + """Return a list of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = " '\"" + + value = value.strip(replace_chars) + if not value: + return links + + for val in re.split(", *<", value): + try: + url, params = val.split(";", 1) + except ValueError: + url, params = val, "" + + link = {"url": url.strip("<> '\"")} + + for param in params.split(";"): + try: + key, value = param.split("=") + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = "\x00".encode("ascii") # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return "utf-32" # BOM included + if sample[:3] == codecs.BOM_UTF8: + return "utf-8-sig" # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return "utf-16" # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return "utf-8" + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return "utf-16-be" + if sample[1::2] == _null2: # 2nd and 4th are null + return "utf-16-le" + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return "utf-32-be" + if sample[1:] == _null3: + return "utf-32-le" + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + parsed = parse_url(url) + scheme, auth, host, port, path, query, fragment = parsed + + # A defect in urlparse determines that there isn't a netloc present in some + # urls. We previously assumed parsing was overly cautious, and swapped the + # netloc and path. Due to a lack of tests on the original defect, this is + # maintained with parse_url for backwards compatibility. + netloc = parsed.netloc + if not netloc: + netloc, path = path, netloc + + if auth: + # parse_url doesn't provide the netloc with auth + # so we'll add it ourselves. + netloc = "@".join([auth, netloc]) + if scheme is None: + scheme = new_scheme + if path is None: + path = "" + + return urlunparse((scheme, netloc, path, "", query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ("", "") + + return auth + + +def check_header_validity(header): + """Verifies that header parts don't contain leading whitespace + reserved characters, or return characters. + + :param header: tuple, in the format (name, value). + """ + name, value = header + _validate_header_part(header, name, 0) + _validate_header_part(header, value, 1) + + +def _validate_header_part(header, header_part, header_validator_index): + if isinstance(header_part, str): + validator = _HEADER_VALIDATORS_STR[header_validator_index] + elif isinstance(header_part, bytes): + validator = _HEADER_VALIDATORS_BYTE[header_validator_index] + else: + raise InvalidHeader( + f"Header part ({header_part!r}) from {header} " + f"must be of type str or bytes, not {type(header_part)}" + ) + + if not validator.match(header_part): + header_kind = "name" if header_validator_index == 0 else "value" + raise InvalidHeader( + f"Invalid leading whitespace, reserved character(s), or return " + f"character(s) in header {header_kind}: {header_part!r}" + ) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit("@", 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, "")) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, "seek", None) + if body_seek is not None and isinstance( + prepared_request._body_position, integer_types + ): + try: + body_seek(prepared_request._body_position) + except OSError: + raise UnrewindableBodyError( + "An error occurred when rewinding request body for redirect." + ) + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/venv/Lib/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc index 5dd648f6aefc391faa939f4ca291fdc5661c3fe0..a430e2abab16c1c59e1db7cbcb26bab80765a102 100644 GIT binary patch delta 28 icmX@We1MtvG%qg~0}$jed1NGP= +License-Expression: BSD-3-Clause +License-File: LICENSE.md +Classifier: Development Status :: 3 - Alpha +Classifier: Environment :: Web Environment +Classifier: Framework :: AnyIO +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=3.9 +Requires-Dist: anyio<5,>=3.6.2 +Requires-Dist: typing-extensions>=3.10.0; python_version < '3.10' +Provides-Extra: full +Requires-Dist: httpx<0.29.0,>=0.27.0; extra == 'full' +Requires-Dist: itsdangerous; extra == 'full' +Requires-Dist: jinja2; extra == 'full' +Requires-Dist: python-multipart>=0.0.18; extra == 'full' +Requires-Dist: pyyaml; extra == 'full' +Description-Content-Type: text/markdown + +

+ + + + starlette-logo + +

+ +

+ ✨ The little ASGI framework that shines. ✨ +

+ +--- + +[![Build Status](https://github.com/encode/starlette/workflows/Test%20Suite/badge.svg)](https://github.com/encode/starlette/actions) +[![Package version](https://badge.fury.io/py/starlette.svg)](https://pypi.python.org/pypi/starlette) +[![Supported Python Version](https://img.shields.io/pypi/pyversions/starlette.svg?color=%2334D058)](https://pypi.org/project/starlette) + +--- + +**Documentation**:
https://www.starlette.io + +**Source Code**: https://github.com/encode/starlette + +--- + +# Starlette + +Starlette is a lightweight [ASGI][asgi] framework/toolkit, +which is ideal for building async web services in Python. + +It is production-ready, and gives you the following: + +* A lightweight, low-complexity HTTP web framework. +* WebSocket support. +* In-process background tasks. +* Startup and shutdown events. +* Test client built on `httpx`. +* CORS, GZip, Static Files, Streaming responses. +* Session and Cookie support. +* 100% test coverage. +* 100% type annotated codebase. +* Few hard dependencies. +* Compatible with `asyncio` and `trio` backends. +* Great overall performance [against independent benchmarks][techempower]. + +## Installation + +```shell +$ pip install starlette +``` + +You'll also want to install an ASGI server, such as [uvicorn](https://www.uvicorn.org/), [daphne](https://github.com/django/daphne/), or [hypercorn](https://hypercorn.readthedocs.io/en/latest/). + +```shell +$ pip install uvicorn +``` + +## Example + +```python title="main.py" +from starlette.applications import Starlette +from starlette.responses import JSONResponse +from starlette.routing import Route + + +async def homepage(request): + return JSONResponse({'hello': 'world'}) + +routes = [ + Route("/", endpoint=homepage) +] + +app = Starlette(debug=True, routes=routes) +``` + +Then run the application using Uvicorn: + +```shell +$ uvicorn main:app +``` + +## Dependencies + +Starlette only requires `anyio`, and the following are optional: + +* [`httpx`][httpx] - Required if you want to use the `TestClient`. +* [`jinja2`][jinja2] - Required if you want to use `Jinja2Templates`. +* [`python-multipart`][python-multipart] - Required if you want to support form parsing, with `request.form()`. +* [`itsdangerous`][itsdangerous] - Required for `SessionMiddleware` support. +* [`pyyaml`][pyyaml] - Required for `SchemaGenerator` support. + +You can install all of these with `pip install starlette[full]`. + +## Framework or Toolkit + +Starlette is designed to be used either as a complete framework, or as +an ASGI toolkit. You can use any of its components independently. + +```python +from starlette.responses import PlainTextResponse + + +async def app(scope, receive, send): + assert scope['type'] == 'http' + response = PlainTextResponse('Hello, world!') + await response(scope, receive, send) +``` + +Run the `app` application in `example.py`: + +```shell +$ uvicorn example:app +INFO: Started server process [11509] +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +Run uvicorn with `--reload` to enable auto-reloading on code changes. + +## Modularity + +The modularity that Starlette is designed on promotes building re-usable +components that can be shared between any ASGI framework. This should enable +an ecosystem of shared middleware and mountable applications. + +The clean API separation also means it's easier to understand each component +in isolation. + +--- + +

Starlette is BSD licensed code.
Designed & crafted with care.

— ⭐️ —

+ +[asgi]: https://asgi.readthedocs.io/en/latest/ +[httpx]: https://www.python-httpx.org/ +[jinja2]: https://jinja.palletsprojects.com/ +[python-multipart]: https://multipart.fastapiexpert.com/ +[itsdangerous]: https://itsdangerous.palletsprojects.com/ +[sqlalchemy]: https://www.sqlalchemy.org +[pyyaml]: https://pyyaml.org/wiki/PyYAMLDocumentation +[techempower]: https://www.techempower.com/benchmarks/#hw=ph&test=fortune&l=zijzen-sf diff --git a/venv/Lib/site-packages/starlette-0.46.2.dist-info/RECORD b/venv/Lib/site-packages/starlette-0.46.2.dist-info/RECORD new file mode 100644 index 00000000..f3f64a1c --- /dev/null +++ b/venv/Lib/site-packages/starlette-0.46.2.dist-info/RECORD @@ -0,0 +1,74 @@ +starlette-0.46.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +starlette-0.46.2.dist-info/METADATA,sha256=ZQ65swcGWuW1-L0UrDKo2SaF90Jux18XK9OmZBmtEyg,6167 +starlette-0.46.2.dist-info/RECORD,, +starlette-0.46.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +starlette-0.46.2.dist-info/licenses/LICENSE.md,sha256=3LlWd6AiQCQxh-lk-UGEfRmxeCHPmeWvrmhPqzKMGb8,1518 +starlette/__init__.py,sha256=lWEdbG8IshPF1zUeQxPyfsi3uFhuXQmN7phOE5OaeI8,23 +starlette/__pycache__/__init__.cpython-312.pyc,, +starlette/__pycache__/_exception_handler.cpython-312.pyc,, +starlette/__pycache__/_utils.cpython-312.pyc,, +starlette/__pycache__/applications.cpython-312.pyc,, +starlette/__pycache__/authentication.cpython-312.pyc,, +starlette/__pycache__/background.cpython-312.pyc,, +starlette/__pycache__/concurrency.cpython-312.pyc,, +starlette/__pycache__/config.cpython-312.pyc,, +starlette/__pycache__/convertors.cpython-312.pyc,, +starlette/__pycache__/datastructures.cpython-312.pyc,, +starlette/__pycache__/endpoints.cpython-312.pyc,, +starlette/__pycache__/exceptions.cpython-312.pyc,, +starlette/__pycache__/formparsers.cpython-312.pyc,, +starlette/__pycache__/requests.cpython-312.pyc,, +starlette/__pycache__/responses.cpython-312.pyc,, +starlette/__pycache__/routing.cpython-312.pyc,, +starlette/__pycache__/schemas.cpython-312.pyc,, +starlette/__pycache__/staticfiles.cpython-312.pyc,, +starlette/__pycache__/status.cpython-312.pyc,, +starlette/__pycache__/templating.cpython-312.pyc,, +starlette/__pycache__/testclient.cpython-312.pyc,, +starlette/__pycache__/types.cpython-312.pyc,, +starlette/__pycache__/websockets.cpython-312.pyc,, +starlette/_exception_handler.py,sha256=OM4H48d5iyv8_ofxBDYy1PflsJGlr40jFZPI3DYZTQg,2219 +starlette/_utils.py,sha256=Lg65uXpJ3Tq0lqik0t-A6nQDNhxMl9NttI7fjxY0hxM,2764 +starlette/applications.py,sha256=hNiaF39WBGRPt8Ht6Zw67XJ5B1CzCUj2cC-8KIZGddk,10678 +starlette/authentication.py,sha256=9dlyeykDMhoxgmI9hFVZ38uu8Nl6k2NZiaoa607Z8hc,4948 +starlette/background.py,sha256=50zBQ_50lV9YGRGevBUFQ4DOwisU47pUV_PfiBG9Cg4,1257 +starlette/concurrency.py,sha256=zjBYz9UPaXpUKx1qVzocVQHlxDDi90wOOUKubXjXWTI,1746 +starlette/config.py,sha256=xCXgQTgMaeuyXaHRFor7EJiAVMUdjnu6Hgwz4rr6sUU,4445 +starlette/convertors.py,sha256=RBd7q6UynlJl4xP_MXDrRmtH8N55re8d_SQaztmwPQw,2302 +starlette/datastructures.py,sha256=7IkoXZ5b0EaieymYa46Sncwd7GVAnyJ5RI-LQvKLFx0,22262 +starlette/endpoints.py,sha256=RgFXHAw8_Ktgqea5T5e4jEWY73LbB822odx6LXI-_6I,5098 +starlette/exceptions.py,sha256=tIphlZa8EsQfKw3-xw5J3ZN1GjaR4UcxfJK69Ad2hG8,1066 +starlette/formparsers.py,sha256=GxhueF4HrJeLJDFGpPFm5WZn7C90VBGS2Faz90JP1gY,11045 +starlette/middleware/__init__.py,sha256=3WljcfADnSltJrVUuFgpvJiZKcjsjC1Ih9aqYUvSknk,1224 +starlette/middleware/__pycache__/__init__.cpython-312.pyc,, +starlette/middleware/__pycache__/authentication.cpython-312.pyc,, +starlette/middleware/__pycache__/base.cpython-312.pyc,, +starlette/middleware/__pycache__/cors.cpython-312.pyc,, +starlette/middleware/__pycache__/errors.cpython-312.pyc,, +starlette/middleware/__pycache__/exceptions.cpython-312.pyc,, +starlette/middleware/__pycache__/gzip.cpython-312.pyc,, +starlette/middleware/__pycache__/httpsredirect.cpython-312.pyc,, +starlette/middleware/__pycache__/sessions.cpython-312.pyc,, +starlette/middleware/__pycache__/trustedhost.cpython-312.pyc,, +starlette/middleware/__pycache__/wsgi.cpython-312.pyc,, +starlette/middleware/authentication.py,sha256=ftWVVbETxrr0gOwtxwULww362Wkt1s9iOVu4s1LJ53I,1791 +starlette/middleware/base.py,sha256=O8u_zoxndbFGaykG5peYd42koxjp_mYDk76OKVuCYO8,8971 +starlette/middleware/cors.py,sha256=-ih4JxmeRaKhmv076DcJE-wd0K2FJbo23gzZdLrJb00,7051 +starlette/middleware/errors.py,sha256=bomTUfQIo7CIwnZQ8fFz4BCDY5idQnrsrhGSpZNiH-s,8066 +starlette/middleware/exceptions.py,sha256=Q96acXz9bRIUZORAKjlsbcaFuI0-m61cSXmfFq_ND60,2791 +starlette/middleware/gzip.py,sha256=VaNOHZleGS_YWueBFVFZ-RboWQmcQI8hjgZDKLVklOM,5697 +starlette/middleware/httpsredirect.py,sha256=SNTleaYALGoITV7xwbic4gB6VYdM8Ylea_ykciUz31g,848 +starlette/middleware/sessions.py,sha256=Cpbql_BTanVqDbhPGdoUrNvHIKf9D3Yuc48cJZerFTU,3566 +starlette/middleware/trustedhost.py,sha256=dXbW22C3RYNp3TsdfCuE0MNS-VZFcN8B_S3wYrzETm8,2203 +starlette/middleware/wsgi.py,sha256=0vLstcalV-kq2YyqQR9NCLiPNgokW7nDvyRqQpj_5iQ,5386 +starlette/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +starlette/requests.py,sha256=X_rmfl_pgnndvqk0Kxd_bCjxIe_PUO0N64DJMpeOUBE,11693 +starlette/responses.py,sha256=_9PWDCpoqZzT9iVTwLNuQ47RuMTzp6NbSknaW4lpJwM,20226 +starlette/routing.py,sha256=mKt5XcuSBg_08__XdXp5WVh3qCJMPLMaYfe1bXFzI8w,34550 +starlette/schemas.py,sha256=kKVRFG_kicD8geEnlfHoEsBCE-8MsdXyPE0VM4f2Q24,5181 +starlette/staticfiles.py,sha256=pmxmrueM67-X16sYAVHEIu61BJr221XNfq5d1UbFls4,8474 +starlette/status.py,sha256=e70xV6wYFR5bdmkYkgYCSwZk1L2FdKDwA6u4zCjmypQ,2820 +starlette/templating.py,sha256=HzG3S0THU-r7q-1AqRZyaxLJOwVyYAcxwvzIwU7tQZ0,8408 +starlette/testclient.py,sha256=G0Db7thEEaE6unArj34D_qG3NT_OI_1Io-3P4z_psFM,27987 +starlette/types.py,sha256=I2yIP5R1qyVD1GBiJZQ_I9dprcYUOVVK8fHa6UQVsqg,1048 +starlette/websockets.py,sha256=M_8gmQmthBHvqdVfLIzs4yuQpup7B853tPSaNQB_UMo,8332 diff --git a/venv/Lib/site-packages/starlette-0.46.2.dist-info/WHEEL b/venv/Lib/site-packages/starlette-0.46.2.dist-info/WHEEL new file mode 100644 index 00000000..12228d41 --- /dev/null +++ b/venv/Lib/site-packages/starlette-0.46.2.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/venv/Lib/site-packages/starlette-0.46.2.dist-info/licenses/LICENSE.md b/venv/Lib/site-packages/starlette-0.46.2.dist-info/licenses/LICENSE.md new file mode 100644 index 00000000..d16a60ec --- /dev/null +++ b/venv/Lib/site-packages/starlette-0.46.2.dist-info/licenses/LICENSE.md @@ -0,0 +1,27 @@ +Copyright © 2018, [Encode OSS Ltd](https://www.encode.io/). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/Lib/site-packages/starlette/__init__.py b/venv/Lib/site-packages/starlette/__init__.py new file mode 100644 index 00000000..8583baf6 --- /dev/null +++ b/venv/Lib/site-packages/starlette/__init__.py @@ -0,0 +1 @@ +__version__ = "0.46.2" diff --git a/venv/Lib/site-packages/starlette/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac753e71dc4eb6638508e5215b15596a3e82fe3e GIT binary patch literal 201 zcmX@j%ge<81YMUBGQ@%OV-N=h7@>^M96-i&h7^Vc_`t=4F<|$LkeT{^GF7%}*)KNwq6t a1DXzUQ!&WNAD9^#8E^23HF6iR0J#AE2{#@9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/_exception_handler.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/_exception_handler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0fef323f123c8284139add291b07b6fb68c22f0 GIT binary patch literal 3078 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 Tjx3752z<>ec6=sK$AGkNY+e>>q^`4i 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/background.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/background.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f38c13ccab78ef34c135c29a817192ee7dfc784d GIT binary patch literal 2599 zcmb7GZ)_A*5Pxs~_3nB{>6Je%Ae>UF8}#a*T8N5CrHQ#hY7?rF>ydT2-Ik-*z2og( z@#>K@v@wOCKrpr@8qt{8+7R`V@X7GmFSN$AtY9!mV!we`Bk3n+c5km-+nD&0n>TM} z-t2ob^P6`+g+c)W3a#oVN0$xm44fx_d$ETF`4+P=?N;sm6TGcdleZ{Le z@;cFcqeSyhb0t~Okp)0jtp}(1k~Ea(WNKHdhLN#UE0rLPtc_XPL)pS}tn$}Usa)y#J6zdq%RV|yzq;1-jMAzOZ9fcORfn=QM zBu+H~K@l`MD#UqB)Hs-hJTFW3y4TcXe;>=_46R!=`;(=;jw?J@4I#AH>G&zo0#O_V zk^%>-QXpW(!>YX3s`AVV)C(5qA(8ILlPTIMi?-04Gm^HTvOd$6`cLA_aI5X}E-nkU zVCv~!whqJ$4nx>_ASSwsz*u@?|4WHCO`VyE1F=|lqFp!ptxPsCm`Nq|wm#jk5`(%i zm^hd^nlMwA{!A9GtM=(;!n9PD)-6kKK3a}IG@G}53IsQ0Daz31%FskTMHmmT6UZ=` z-%vj$ob!9rrfsmQzEv+zHvU}SJSKb)DuNkFmcs-Ktlkj}>LM@)2!#X{$Z_CT4%W<} zrX18|JxI%;T$ZNLT3TLv+*kBNIs(Xe57PNDH_pE=ityDuvHYIJ+F$8|bg%WDFXPk>VRb+;CkTKwbK)xM!OZLd@+Wx+ zX{oL`zwhk6`S8{YjpOn~d7}IC!=D_!5pJDq{C4-$?wN4wT(ET}*!o9!=jHaVV_(E> zgk#?cKls1*&xT`HyMOGt)-w~1%>`pK!PtF~g!VkV6O1jHkAwfyt!;bhRod1fTze6? z>rvX)DqL@tkZ+|xJEwfkt%kN+`E1JQi|#K$x2NmrNJ-RY&ZDvif} zqWLrdW-(7?zg<%a9Cw5)x0r&&6a=qZB0$~y@ow7iLbjx4v$~-Hcn~2g zz+($e1kf#ZMh`lwrYWdceR)r_6Ly$S0U0K@Y95==Zq&3~?w+k_nS5)ere#c+_XW=f z&IIOs4Ku!miN;@iJKT7bGXpyX_>EvbyMXzxrq)i5K=GZT(AwxU*y32-oX*t=aR17N zL7kj>`F#@hRpb|oef1T+zTuef0u#4AY^WdaxY+R*q5g)k_M72NmzvHWJag~?59|40 z{gN33%hOw$=%=(%`pnl{?f)=DE!PAko!EP^fr0oE(!cfLU(v+j<1{H z>n@y}<+uMPMD7W@?~&+j^1|;zXe>F>IZXeNs%Zy(K#(qO3($rO#@_@cCj$Qh-6b$i literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/concurrency.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/concurrency.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af3f08281290a0ebab9e8b5d25c63874fd5b6741 GIT binary patch literal 3263 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 Sy#szE9pk=(9|)mg-25L99QW7& literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/convertors.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/convertors.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..014506149d51f318945afffed2e5af183109abe7 GIT binary patch literal 4771 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

QPuBEn#+?X9Xawx|x?r;^y9YU?g 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 NmGe~}q3ZHP`@iR3>`4Fs literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/endpoints.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/endpoints.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..476672580e601f85348a88ad6702636a9c7ebc58 GIT binary patch literal 7826 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..041fd1cd68295842c2b39b2ab15d39a76837b24e GIT binary patch literal 2385 zcmc&$O>7%Q6rNeH*N)xP)T+~@35`js(ruie{s=`ai3F6Nv|uWw^v89&Y<8!KlZ|a= zH&x@hqK6zJ1X9Z-K~aT!DpoHX%L$G}9B=?B(TbjW;)axP$%*%7H;(gnKpYrp-@KW5 z^XC11&;Gf&IYMB3{_7`W$7MoZ;9`9QJ%+Aa1ZIwy#H1FPq!~()mn?*JuYS;};OKSK}6j7-g)${p+qdU1m-cG|h^r2oX=JKP4 zr^2JYKDu%g)^miB3^fV7A2bzHnh9nCX2=Z8fE_T)FbAip8g`rCzjW#1JGTv1MD1w< zJgg7Y2p?T30y9U-(!EZHuAh!e>)gg%rceCy@kTwqz+I_K%S7|-B%lvgb-8i?R(?DQ znI=`5RuxwsbDW|ZK_iDC08_TB6vw!3GdF6BwPqAd<|-z0^ql2}#+Yt0ZmY5@+swMj z_rTk{8OdHCHolgGvG&p1XR;sLAep@|ICv?0j@c7Vp_si@$QkU-QI>bIw^;sG_JiC= z*3LPsr>Gkf`Y5xr@G7^MvBuSto%iE`M{xB`O7^kaETc8z{8@R zm_ArQV#qj(Y#9qsjBv6;nij~zz!0fQ>5_CNsY)9`s!|>UEjGTD9qP~ndS$%LvJN9|h%oCF>!LqwI+rRHM|#nWGEN+rGe>0hHNlunbT8J2F_ znucl3>yu2=8iFK=Ah{7w29IqFa?+0&T;Z&UA=_37-af{{ejNzJ42s~!gBweU)M6qv z8(EHb-0zql{`T}z_u0knv$f*`Pjk=YU!p%nfBdX=`ARKzwHCfAVyQ~$v>Fyhxq)2X z5jDORft)1E$#fylM7@_<{YG&e4pK=V!~U_WaOO<$yep${RpLpo#|?l)RpAGbk7(Lt z!JM+dcXyAbeLAIEekAt6F>gWgGLR|}28n9n7M3|Wj0Z3 z5M3AW;mTff;Y_y+c{L#N&U@fG?*(GxJJ3u#*D)%k_U-1>8$c^w*$)KLzP}al-2^cI z%Bo0!@#uDdpmJgOf5AA%_jn3P0!Ra}MFL9)ceEF(K+`%i-qi$}!BBz_XXKevUy`W!?spDC>>varCVbxT2bO$)E?^PP}mv z$S%OWTsil6@X=tU|GTEAM}Fx3zWZtCGg^zCuZ7QhMUTG$s^ZyzO;eN+N3{Zf{1xQ7 zkQ_nsDiQ>dS79o0NDjbP2bUB)yb`9t9t76~A6zH|zwH3wn^S;tY+qPTya|XKGYXc) z4Dn~8S06FBjJr*B{CFT1k8L(!E&PVp5eE2axPo}Gj|2HDKq-Arx?Ygzb8>i9X{Oic W{lQg&^J+3eFVOk6zX{I5nSTJQ{rJBC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/formparsers.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/formparsers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b811219b9b6d97ec00f0b9b9a40ed5330dad77d GIT binary patch literal 14254 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/responses.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/responses.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..496ab92fee6c3ca802eef5fe65796e5cd075a1d4 GIT binary patch literal 29331 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/schemas.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/schemas.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbe360a5c22e29e5f37ef2d221546a8588996743 GIT binary patch literal 7047 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/staticfiles.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/staticfiles.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7773e66979e328bf0aee2375b28f87b31b97bea7 GIT binary patch literal 11583 zcmb_ieQ*=!nSWQ`vSdrPY|CHRi@_LSBMdmP`3S^dFb-f-?2sZ%grZ&BGWu|K*MJrI zj?i3ddh~$1YcbRGaArCaXF{*eT&Iv}X97v5N$37qA@`(g+zB^HXWIYNI5$mbXYQV7 zSG$s3x4C|-$FJUf-p_sC=lwlj?|&8-7ZG^A{@~1L&00b}!WZ>1Dj8}i3z-{)Aq*8J z5z0qVnAe4MKArrl_Zj40qt7V+ntUet*X%RHuRd&vSbf%9n<8J4TxOGh4Pkqv*jFr< z8N($JhtCml`keB+DO?&U^OebYbJ!Ir_mxK~d=-&OU!_d5gx!%UUsa^qR~@PG)lh^r zk3FtVJ^#zrG1g&SH4uDjbfkwcMK2M?##X+rSL*ocWvU&h#jopfw1!EYr{vf8;-Ms4 zAR3Jc0U;EN@_q1b9S?9k%LD`#UP?w-!Oz7e1lB(u5Jo*ZN&ocmBa-(DhZ@C) z1_zHFxDaH=u?LS{vL6hE+2brf4*ju`^Ek_dI5sF~6pNaJy5{3-kPV$MjPG~FAfHRqwMBjEGlrZaNLO*HY#im$Aa>DNCsR6 z$-oMM5y{M67>6(6CBwM@HyO;Wr93Aqq%bXN>06NbCUt`dG8vQ0h6MQra2i7;sIeT! zX@!t^J@?X0uIjGpgZdB&>Q1`}8G`<&bW{3-E8EtJb?P2dWDi;2nYtiQ)m4|o)l3SHsM*9zqka%?Rmvd&IdQ7-zxCF3hMSg!I#!Q4UZ}xT+b$#5(jj-B`OlaX*J zdNzp5hY#``{>umQA!Kfl1eG9u$SDsVDZg5q!0}q;SV9Z!C_(KU<`9z5!<#|v2@W;! zYpoMTc+-w*!oY1yP%mx~O4Qn8xT`CkG1m$Lye6pEbFhfaVAQ z8x|0_O<1i2&~P|3;+I#PWw=%(>SBO@Co;K#G+t7Hn=>U0GWZ*&j8TwjQ$|7K zsWF_zif7EWf&i}xgUTaQriAID?I}=a5{7TX*$3{)Rlh_fOk?&xZ2QM*|M`6U1uZnr z&d*`>88L>0QB`NO?=pWu?x)=-AW%WJPT2ti8FAabM zpjnvX-zie~nWlR{kBQP})N?d>h7Lp-`iu%-@XC!$L_pHwQeM{ zQpm?G#}t7|$II!U+!cZYbT=HEh%(-|&g1 zqAM=Rl&zULJL8`_dbjy*t=Ro#(Rp%74|EaAO{BO=`9QIu?dSHb*=qQ-Y#njdik2D$ z{xoQUB|;(h71VHl51GS+l7%WmA$~KuvjEn-?kNJ0LdJly^5GkRu7O^@R6TNE0kQT1 zlz&TiL;qEy5qgIsUnsEuh=^8?^Ayw`Lq%-GlP~}f=k)ZIV@w%!1OzsS`Gj5tmz8xu zht_wHE4}bv4gc2f>CaOhW4u{AUW217-8InDOT(!K!8;CIEfgF+gD{CU&8Q%Z_YHas z+*X*MWLGp8MYu{9WJmc-*kwyAXEx;oDX8SKS!4zSN;Z=~<&HAB(*&l7Y+|hxs;G+w zQKI|fD)4SI4yF z{gTRS6Eh>TLaL-SZD~zfTC+A%yx}t#vApxMjHUGvkFaoQQ`c_lHr4gG;d@&lcfX$M z>NMPMD8+mm)wR=bf2#@eofM`!F692%~2J=Q)IXAtoa~ z2!ioejT6s@gi*SGfJS5lD>n!L4g{VBTRtGfI1o7~i~>>64!z#yR!Eyc3;=pZQ6Pal zip0*bOrCciQColq@zm!5oZE}9PeKBGIUWuP9=!tIN03yM_Y&}U)&YkV2!0A)mUE)Y z^DLC`yCAtpJ}n}Z>t_$7DmG0QEjmiCp1*uP?Py3k8osMT41Cr8ihXV@?cI~~?zzjS zy!%DEJLNbaS`Pf7rlvvFzr$ANpbGRT1**Z^fgs5a)uC@sn0OV4oPka>;@10BC~T z{}zl>v!Xh@e!(~oVI0)yS3KN;P_L54Xf>Dr9b1>rtGNWlSX4NkGX2fg+NAag@U5(M zPK@N&`o*b&HTd(_`q_kzvEpKnHL2f{|7D8QJ>ffqW|f}M-L|RpDRaU+hL+cg2dMN4 z61*}+aY%35^R0yzwN}D>yI7^e-v0kMVDibKSQ>L|a#1+1Uo!f{J`Tf1CQ z^)UKj!V_UZ?$hJu5GExfNT5(mvI;T3Fv@}FQL=CoQE=fzgOV*Ai=CYqSF|C=F_w#j zcphBJvS&du_YWu;Bg=8om}EcD*LC#3V1NIS{=Ob?MS>4WG7tEB2aX@;L8}LyaI92} zMiEX#aYoA(x_gf+ZVAmYQDmA0R4X3kD2Mj81UlDvI1pqx)Hu@DTzp9|wORrU3-aES`Y1_J3 z)-bn!p{z}`w`C1hYvp1~+xPdrwm03fKiRVXUU#~CFxfpQp75nwPNkbpCGCyVz1Lp& zO*yf+-X-+($zE@nyTcG}GIK{#)jOu2`Xl3?NwoyhO@Z9_ z8AlChmABi!zx%b_cWvp;!^zIW3oS=7?z)*1*Qe6%%}Mv>x!{6(+s8F)W)CdXY`V5T zQ?uq)%gvU#?ceWwt#dy3+Mbz~RL#z7`xk3l=JgA;?P7U*#$B6sdy;O?oM-;jy{44= zkmx-0(B`t=iJ?h*%|S#X2B z^yS5p+By9~NvjCjYZpZ}3{j639rd3O%38P;i;l`qh|ya4&{1}E^77=%2hw%kWS#ec z!@F3y4(40gE;`#EmQ_sm{w`~SdXKX8WW#gR=h;g9dBh|0Tq^Iapl)nFM96&u)$@em zzR`?%`#vww-`Pp^It}ma+P4>8ehM!x!%ug0>EPwvCn%`)9$C{{tbcD!ORq)$Gm8=O zKPxss>Capgq|5YWRF7nRd7JFW0wDr~l@GY8KEe3IUmzsFO{oe5aFMO59&vlWpkLd{ z`Jm%f6@1`8`_tO|YOQrzYh85D7ql<_t43d~b;0OgFt%fru|c65(RvU{)f%AY0Y>0+ zwgUi(x*}OYnJchc%9PT=H18N3)?svLfEdUm1wv9&iUdvR9M*v#G*ILu3Q~(Iuspgx z0C>{pv2$(EbAfg6B)+ynBAElv@d%0l?rb0|=ZZj1MPgAouLnbhW3XZ=I{hJna}a${ z3cQ!WE65{^7=kZbrg@BtnIYruMr>z8{}Ib57<(2dTA(RsbD*<7?k)t_0^xE48+-uC zMIsxno0HX>KOrU7>gnD^fVk$H&9_=_w$4t@uTRx|=TIWus>ULa$Ocq+-KD z^A6Fq6ELZ`T7qVJ_~n$-&K z=bSNtfeAD&AjX)ZfOC0u&x~och$T32bLW<;5Kx}V54e0a_qIxdsA!I}LCH0NwXE;s zPC_BX+>kqESqn^omcJ~RB}a(&gF6#tz8vCJLUR~y@t76fK_-#g$%0$%MsnnIB!5mv z;`*TykG--Diu~Q4K zp=nFT=1AKblD39fi{j6l-?Cuax9Hk1dm-K2k!dQ3Kn@BNX9gES*5_fuR4~xn_zZPg(mJ4C1?n|TF49H;Hw~$ zy5szgg4P-;70l&Nx2_g61Vta>YO)Q2XvSqhG*~lGz)u4T7McKXU}(^o!36{qFc~9XYhHOp>G+M<_CpPW9iCJqc>hw_yvggP^|)@3Q9b(V9s7OEI9-V z%ALmKSxmNJf&zjQFnJ7hnbhjVdLKjBPsamcLd1X1&;XNIY~> zZ1APZPKowYfa_4<_dG^4E|u&rqpt7T*9!U}wQrN*ez5`brCrrPe|r-JFK@T5+wai7 z`k*u9oMRZ!WaOJf=$=|Vu*qmz7~EGe26ZENTg3&MBAUz4 z>&l1G+-ui$S1RC^if+ny4s?}C`TBu?bCDmIg9#lhDhhymC|^b~=4EB(gy}^~!u%qH zHWTKvz&qIAq(#2%0{x#SaFPwVjtS^6demXAbgE}_wbIGFeq)V)LpvQxNDmEd)tpvL zYsH*YZEMX}duEWEV9(GY2|^UB9pZ=Q`a)rpRC(GeKg}*H+v95Y7k9xxaNmMq^Qw&x+((m+qhK1s5p(uYazBf-XKstQ^JsEYUyAO>Xjxs8xZ&~n zzfW%HN!1;K?j5w~Xq{gpZhcDZKO-{FKj?oRyTH)M=bzM)sy^zoj~#A2qNVTKop=&U zfA^^q6fl{Tu{$3+%ClymKH?F(F4cFnklCuP4W_#W$i3CnwUgZ6V1(@b7He0B{{G_> zraP_sO!~Kt6r`X{qhkBWaSY%Ruf5R;x(^m!zOeDA5u?O-5e}$w;1%-#_;54sv|4c! zG?xs|#bROQy2aPvUDn1q%tC8%P}CnKJ%s6$Nz23Q3O>NZU4$Bn zYKccc$;qFB>j?X_7O9PxtiuG6i9<~0j$!f?CWkRW6GYY>Ih02na{p^YR_!<%3C(JP z8U8~^;D(olY}l0P*p;cM$<)+m8rJ{D;WR!)L9n)bUDhmTEyVR$)+%RIZq3S))x?fA7G8gI!BPrw}rxFyG-+~A&rL@Lql6L|4D0k;cFG;KgKK|B?- z6v@U$0->;6g_mKBLj?k^F`;wOoA)g`fpL_(gI+)O$IAgNsVYx~>zx3W+yv-YfPk{& zPu_86NaIJu{sF1@fLK2uwhu`0 zFUVS%Qu#~L@*&y!3*!Bd97>WyACk5tX?tiZy}JAI?iszfW{X$_?!>l>mQPJ3RME`F TPYL||wsAs7ReVA)m8bB3m{2jK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/status.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/status.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c01b35109e09dafac8c83356ec6691fc2515ee60 GIT binary patch literal 3628 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 VQ(rH++3V~(V88h^{E347e*ryu%qai> literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/testclient.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/testclient.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da0cf2642b2b2d6e034f8edd575659e15dd7318f GIT binary patch literal 33374 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 UWMFzrrP{HY`|fJXPKEOS0YJMW%K!iX literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/__pycache__/types.cpython-312.pyc b/venv/Lib/site-packages/starlette/__pycache__/types.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ff7fb16bf496d6a7a607c2c4c0ac5bbefd39af0 GIT binary patch literal 1775 zcmbVMO-vg{6rT0ktZii1V5hbTIF>`9uIL(BZUTrF5&rBX#wZX-jZwSUR2*TBhfbAsiX^m$MUJ^{&{uj$mSiV+G zUU%tljYGR$t5LDzVlK4v)Wz%!b%xz}3EKucU?)%i3kByT3YJ>^cU#@RQUA(+WfS~B ztL8u7%9(!Mgg@L#=yLdx}X`rrNf->tUlJmFLdt(OOmw37g zyBigH3RKYYyDl>uq%`Ip{A>d%D%qOvK}E`o3M6~W5?r0nr`MpWG2@c7P>`TZ6UyiB zoPzvc_|<}x6M1%gi_59pssNWyb1SlmV1qubtq##_3m?x-eKHZ9nz$32ozXfKm6HXi zs*siI<&~Pc<~*CIn^9!)2?NdbcV-K&Dm80Lt&GO#?iM*&*1v7d9^a^$iF1gQV`P< zc~OOr)i@^-0a@#qS2-05MDK1cONPgZM7>ehQOjjFgl5WgU(Dr2&D;!FrXHuEr0PLe zbYWqxd5m&mMj-m$<}I|O9Oon7gIA<|@cQ<|Nb0@or^)hL*g8n?R>y8=CsYcQvQ;08eQae5`);DHo7g&3 zWR4iySKD81mzZx0<-Telj053=2o4M(_Yh`=i^fy-2j%`s1a%D_^i{*RaQN0?1c#%j zD~hc#Qo_}>pV&*3m&&oqW;GPUq1f|Y97>?x1a{3K&~fDS?vL$_m1oMsm28!bVmA8x z?Vo)weCWY4T1i(|c)Y@+2Rx2F#B2^-&tc~y1RO{09lN7DqsSAi^kYvLMJ5lIa3qdA zaoj#zG@rP8_P6)8E0%*{)c+wG%cA})cJm0hj=BTiC7vWI%RdIuz~o`JI=zUe7tzu( jo=%~G6z*O@z^j`Y-5W*z2)dC#{seZ;Vc?JhSXN#GP30Ct^o_@ zhB)-jWReM7=MK``O~^EJfhKoJ<~mKTGra=IrD^*|C5sy=Ti-M@ckNvIN9&2{9Ot<| z`aJJySCTD4(q!7sbit3_eZSx5ecs>mvF|^)-3|tx=O({-{CS>XevL2s!)XaJa}yGm z7=aN;oEakhgkahfH}#w7uesk$f7yN(e$8=i$kK12b=bId$kuP8X)bOba`Zcfoc+!r zSHEk>-R~xhiP^~rmUE0?6-|SFec^gAZvCd>7Ax1F|a%}rWc^FE?0IOQ} ziLx9yCaTu`VpNQs6jiP_nj98YwpUCDQEdQ?lETjnF69ysv{g8N(v)!OuNG2 zr$!=iy`=Neo}TW`1G{^6s`f&E^0+KY z@{v8ecON*?CCVq1PUw{q7bN65Am^BTweRdB`Ks!(yYn@*XZPm4RnP2_>h+3c%qwg) znZcGN%rgtDU^>V3n@352Q)>*ib;abUwr4%jLR)CafJ`wAypx#+AaRKqBV$Y$^XW5Y zI!$B~2qfkfwu@m#nQNvV6^P14lY*#PBrzf<6W7ctD~s`?QWLb5cpx$k#Pht=0Kd35 zu|!M>hg1FvvkK~^wNQ5k$yp{}+c3dCZ_n5HzZ<_|nqXgWQf6E;#eNGt_gu5kp;U7$ zq0sSW9Wo@w_?~2f&Po}P5-N*t0ao%tmr@myY9y^lkarq?afZ?&ozy@=wgNfF{HMvp zwQ6;+I0}EpgUf@5%=`rCcS?7mdV)Dh1ai&=qU?kHz{6f6nBkYRGj>L(MXLQ176>ft zmj%i>D7OlAaKzbun@}%U;nyxS2nz)p)Nlxk1Uuw7h5G~t{JI3c;Dleduvl=xuSaMU z-0M6Q~u>Se_O`iHo@MqEu3mzoojB-G`CN%zqB<{8I2l;6ne*9eHM4}I^^zQ z2p(@{5HjaJim_LNrIJvnhWje*gq8-si|yYiB%cL{I0Jk9ebXiLw>ge^nt)uGP%fS} zjhO`ViA~UlN3rWI1$NBzvgwB=U5>^{$s8)nh29h-uJ_*SsL%&p$DXgW4(=o=TZLur zDqyWvI?jTU^&r5{c|gvM99&NcXKY2DY+|1O5&U)i*nElv?5P6|lr4M;s+AA*?%d5A z0?!X=s#jjgiwSu|iY1QmCnNEgz*E8I6)BPc-Gq8PXmr&h1z{$sYNMB6K~1FAcb^^x z6)y_fFon+fmU%T>R`LTQ3V$rA@LN%mW=lFN9F^JHVk^PWM5%rE9HP*^g-=SQBNzK9 z8C-e@SF*j6+ADlC5|8sO#rBD)$Vd2ML!Ddv@rcY1h+={-)D?mOtF#`vDk6lm7G71? z{*i<9gKYUu3N6f`I7qNd4YK7#@ zdeZ4vO!QP6=q8veoNAVy>bjCsZRjzW zTj41^)rmEL1>C$=6>zDn)tA8yW)N+fIZshH114KaF_|!l}{R z?#i*!_1uGFc0~0rwj#5pWxmjgDsY^xsIP2A&Vq(2N`Y(Mn#kaSIn0Jv!7X@nze)ZQ ztNp@jEof9+t5Teuw@gd?2WW|jRz^YdmOe`usf93KTv`=GGx`YjHyy>kPcf&>eatBW z{copQs4DdhLv^4-_jRZss)4q`sb*%qMKuwPCuMQAs+bXpM#W)ec5yN1xS|XLglfKL z5FITgb^M+xMe7IjMyV#l!R9KN3f-4#n-EM`>IBlGX+2MIV${CG@>KUdr-OCpj!f5H zGFI&0fja?0-JO)bI8ONt2a>{QYU@1*oZqNqB-K8Yl*BN0wIj8$OqCWUs_9WW!}%%{ z>L|g0Q`&&Mp&l+8*wVvDP*+NLf;82+4pOT1(OylPqDicpkBN%31ybco6KqE&RSWt|rsmTJuAjI;T*KguoLnpwJa(z&%vN4B2Gcu#;Hn>LXJP5Gu3>Biu+nJic{ zV>Y8MGlMR(QC+rX(z|9VuqhYl$^^PDu)nOjKVQ8#-MnqGdK=B&mI-X5*}uU`p-doz z3h(~BukOBnXBEmYSxu3zv9ZMUWbJqO1lnCuVUQy-xpAMRQZa z;{)wlFufZIGQRADsTK_rQ&mqGmZ_E##j1yZXvfUK)GYe$s>}N)te-f&^DNX);0Ua| zxbjbeITxRH@p+H$#n|~+x_SNeJ?SISOoNd1h&h{>v5C`W#@&1;Zxd(bX6Sr;Q-~)& zBOyQgSAIy{s3W09_C~!0(~SgZnIVXq3vftg9)ko%tV#nAQlkQ(pgmAxMi+F93_|_6 zkHG58*VXqpfj|PMIYiW#C`PgZCM`I$6MDI3(s;QQ(lT18dVs4oEJb3n7)~a_MK>eW zSmbG?@+9_xE*ONnoW2Vi&v&F7H%vM=O!<~xId=8vtI4-dy?f@JGuJm~H|@>(_N86> zfO)RA`QARp9-c+E{2L^`f_;phy0gU6Fk(Fr*QqGYcawgI0WgE81LizM3l%IBw_Z5t z(No3WqCEp!Nuvq+R`ufPSXVe1vzrYT^D&u+U^QRxVMQUx_lV%ZD#?OBSWy1_(U>GF zL5LZNrAzf!}$t>M6>D)4fE>mCD*PnLv=NtU5xL$I-?8*7=pRnd_uAHqo zV{5*$?3Qi$ly||4XU?Db!TKxKtCm;2S?`*(ZOt^t)GV8wK^uDf;m~^Wa}rw1{>^$w zmBoer|4NF4kfCw|qlzfsYuBayP*>_jf&e&w$KCpl)9zCB^S4|pfX4EZK)$v;Z@aSW z>atABx~zA7+O}TXbm<_BPzI9-c@z&e0w5Of0H6{)H)jzdg^~yyoYqo*8=B*zpx;fO zK_fD&=P(TQno9dKG}@O&3)IS$(88D@L8#aKaEQAJER8Oj6Se4PV|viQlH&XXiw^Qn zn-#;i95no-V$CsQ<`i3YQ*5znroHqHsHa*6Vu^?}I=lA3aglFXZ z#gh?1h7TF2$W<1{mrw=Ker4Pxj0|d@S`0A4mX*K=^Phnx@&zEeV5aK>8E1eZ(EhBi zH|^^EDhLG@!i9~`Z3WBn^2UoD=es_E#HLJ5Yp!N_re^uoP1&0D6J1l@nio^&QOh!J8hn(9Nk{fQay`H_{2|3`U48(B3W)rBpTK0&(D60(`MTA= zpYpbR#t?h;$F3@HSM1e)nBk%II9W%|)wVL1Ni+MBy_NYh`)c!>rgh{eWVQJ%^Sb{7 zoRS2XCh)2cel*ibgj6Y~9F!>g*t;trcDe!8|d|pW? z8~^)Kqw`|muDsBsh91_rQiGX4#D>R^&;=Pn3OR-@-vuv*)mPyNpw9swhk>Sd@i;i$ z+vtM+z|uv_lp+ksIyw>s<5y*ch!QC?fb8g&&y##3^EGHJHv-YnM)wWYzPBOMur2Ee zdbLE@z(17IR<67L``n zm1ziNJ==4(?UT0cvl1GDl|9x!KuKXA;U>i0wY6fnG?l*Dq3a{CZ*uxAkEbD~Em&yW zb1^_<1s_(hj+q79=gY_4TUPXP?Yiz29G~AWfbUwv({+~UTXG!~x zfJud27>-C0B`L|Oi+<@6!x1?ei)ktrC09xyL90s|!PcCnYVo6+$_XPw!!ng-)gmTP z#TK-x^b|ITAVG~kN2zK8KKGE)y~oTy#}=o6++Cd-+U{!m_3m5VM=Io!M;%GXBT2zJoc}!Hnx57=P{^2)O3&fZvW!E`$TT3PPU+PxQk7}r7Ii|##R7aEeV zJyHmImKFnn4`mcijQb%HJ!Q>MR347tXml~ zrlBwE>Cf5vCvE++GDVWb%g8HaDSO4T>@G-h6Z+HEjh9>o;cf0yF?e8#F}g2$l9AS$ zz&5Si8gkjWJwix=sbo#-r?nC`mwX{MEY)$0%U4mvW_wcgr}XHvcjjtPGE zO?9I23fGuUiV`m*MLDqyY}b+D;iRPS3KRj$wL40Dmzan};_#_i3$OD=CqXz(ZLlN> zgCX>bCOu2^gn`Cyfn3$5N9D`lvz8tffp!eHF|>|L10(cLbbt0h<2w;b0T zZ+WhH-X6QYKl{M0jC0q=zD1Weywd(s`xWK&u~*05KJaeeJK#lksA)hX~D9X-=0pDf&AD(y>4 zAHdNHBcq;zZvu!^Fae5MSWGLJpLonk>y~ceNYiM)Q z>+lup=$VPpCt)rWMvb{>>?-6^* zQ5OoW6=@F=jNxcTJGDj!@bxGXJnd2(iG<`Nl5Zh-2FV`-QQd{hJy9_p4~K!>n<1B) zvD>seJ}a>*l7(1+bG(C>#w^@JGgWn*NM_b7f;B{dc<4_Zs^Tz2B;v9ICY zpyY>fB^+Fuhx$@0WS2xy=$OWpsh?vT)NoqhvlLSC)IE!V&u>CPgK~gl^WESapchTL zInNge#v7(_2--?#k>E;n+krx&A$fCb2e|u)_fg>PV=+vmFHkE$Jw#PFg}IMCzO;YU z+seD6?~H!b^^bf0ZcnD>P}b9zv-M5d`U<*jNs#=AtYlxe1WECrNZ-aeaTU+S3pnRG zB=txdkUXc8zlMa2A(V5>ZM^e%+eWzlf*@g~KrP;>JvsuHD&bD8grcOfVq#=SLaT~K z%T%9n*%iW`PmPGOB1^bcYE5Z@hWj!-%c{3n0w5yF5^kqNQI~=+qOQtz<2V={QtjQR z@iQ ExceptionHandler | None: + for cls in type(exc).__mro__: + if cls in exc_handlers: + return exc_handlers[cls] + return None + + +def wrap_app_handling_exceptions(app: ASGIApp, conn: Request | WebSocket) -> ASGIApp: + exception_handlers: ExceptionHandlers + status_handlers: StatusHandlers + try: + exception_handlers, status_handlers = conn.scope["starlette.exception_handlers"] + except KeyError: + exception_handlers, status_handlers = {}, {} + + async def wrapped_app(scope: Scope, receive: Receive, send: Send) -> None: + response_started = False + + async def sender(message: Message) -> None: + nonlocal response_started + + if message["type"] == "http.response.start": + response_started = True + await send(message) + + try: + await app(scope, receive, sender) + except Exception as exc: + handler = None + + if isinstance(exc, HTTPException): + handler = status_handlers.get(exc.status_code) + + if handler is None: + handler = _lookup_exception_handler(exception_handlers, exc) + + if handler is None: + raise exc + + if response_started: + raise RuntimeError("Caught handled exception, but response already started.") from exc + + if is_async_callable(handler): + response = await handler(conn, exc) + else: + response = await run_in_threadpool(handler, conn, exc) # type: ignore + if response is not None: + await response(scope, receive, sender) + + return wrapped_app diff --git a/venv/Lib/site-packages/starlette/_utils.py b/venv/Lib/site-packages/starlette/_utils.py new file mode 100644 index 00000000..8001c472 --- /dev/null +++ b/venv/Lib/site-packages/starlette/_utils.py @@ -0,0 +1,100 @@ +from __future__ import annotations + +import functools +import inspect +import sys +import typing +from contextlib import contextmanager + +from starlette.types import Scope + +if sys.version_info >= (3, 10): # pragma: no cover + from typing import TypeGuard +else: # pragma: no cover + from typing_extensions import TypeGuard + +has_exceptiongroups = True +if sys.version_info < (3, 11): # pragma: no cover + try: + from exceptiongroup import BaseExceptionGroup # type: ignore[unused-ignore,import-not-found] + except ImportError: + has_exceptiongroups = False + +T = typing.TypeVar("T") +AwaitableCallable = typing.Callable[..., typing.Awaitable[T]] + + +@typing.overload +def is_async_callable(obj: AwaitableCallable[T]) -> TypeGuard[AwaitableCallable[T]]: ... + + +@typing.overload +def is_async_callable(obj: typing.Any) -> TypeGuard[AwaitableCallable[typing.Any]]: ... + + +def is_async_callable(obj: typing.Any) -> typing.Any: + while isinstance(obj, functools.partial): + obj = obj.func + + return inspect.iscoroutinefunction(obj) or (callable(obj) and inspect.iscoroutinefunction(obj.__call__)) + + +T_co = typing.TypeVar("T_co", covariant=True) + + +class AwaitableOrContextManager(typing.Awaitable[T_co], typing.AsyncContextManager[T_co], typing.Protocol[T_co]): ... + + +class SupportsAsyncClose(typing.Protocol): + async def close(self) -> None: ... # pragma: no cover + + +SupportsAsyncCloseType = typing.TypeVar("SupportsAsyncCloseType", bound=SupportsAsyncClose, covariant=False) + + +class AwaitableOrContextManagerWrapper(typing.Generic[SupportsAsyncCloseType]): + __slots__ = ("aw", "entered") + + def __init__(self, aw: typing.Awaitable[SupportsAsyncCloseType]) -> None: + self.aw = aw + + def __await__(self) -> typing.Generator[typing.Any, None, SupportsAsyncCloseType]: + return self.aw.__await__() + + async def __aenter__(self) -> SupportsAsyncCloseType: + self.entered = await self.aw + return self.entered + + async def __aexit__(self, *args: typing.Any) -> None | bool: + await self.entered.close() + return None + + +@contextmanager +def collapse_excgroups() -> typing.Generator[None, None, None]: + try: + yield + except BaseException as exc: + if has_exceptiongroups: # pragma: no cover + while isinstance(exc, BaseExceptionGroup) and len(exc.exceptions) == 1: + exc = exc.exceptions[0] + + raise exc + + +def get_route_path(scope: Scope) -> str: + path: str = scope["path"] + root_path = scope.get("root_path", "") + if not root_path: + return path + + if not path.startswith(root_path): + return path + + if path == root_path: + return "" + + if path[len(root_path)] == "/": + return path[len(root_path) :] + + return path diff --git a/venv/Lib/site-packages/starlette/applications.py b/venv/Lib/site-packages/starlette/applications.py new file mode 100644 index 00000000..6df5a707 --- /dev/null +++ b/venv/Lib/site-packages/starlette/applications.py @@ -0,0 +1,249 @@ +from __future__ import annotations + +import sys +import typing +import warnings + +if sys.version_info >= (3, 10): # pragma: no cover + from typing import ParamSpec +else: # pragma: no cover + from typing_extensions import ParamSpec + +from starlette.datastructures import State, URLPath +from starlette.middleware import Middleware, _MiddlewareFactory +from starlette.middleware.base import BaseHTTPMiddleware +from starlette.middleware.errors import ServerErrorMiddleware +from starlette.middleware.exceptions import ExceptionMiddleware +from starlette.requests import Request +from starlette.responses import Response +from starlette.routing import BaseRoute, Router +from starlette.types import ASGIApp, ExceptionHandler, Lifespan, Receive, Scope, Send +from starlette.websockets import WebSocket + +AppType = typing.TypeVar("AppType", bound="Starlette") +P = ParamSpec("P") + + +class Starlette: + """Creates an Starlette application.""" + + def __init__( + self: AppType, + debug: bool = False, + routes: typing.Sequence[BaseRoute] | None = None, + middleware: typing.Sequence[Middleware] | None = None, + exception_handlers: typing.Mapping[typing.Any, ExceptionHandler] | None = None, + on_startup: typing.Sequence[typing.Callable[[], typing.Any]] | None = None, + on_shutdown: typing.Sequence[typing.Callable[[], typing.Any]] | None = None, + lifespan: Lifespan[AppType] | None = None, + ) -> None: + """Initializes the application. + + Parameters: + debug: Boolean indicating if debug tracebacks should be returned on errors. + routes: A list of routes to serve incoming HTTP and WebSocket requests. + middleware: A list of middleware to run for every request. A starlette + application will always automatically include two middleware classes. + `ServerErrorMiddleware` is added as the very outermost middleware, to handle + any uncaught errors occurring anywhere in the entire stack. + `ExceptionMiddleware` is added as the very innermost middleware, to deal + with handled exception cases occurring in the routing or endpoints. + exception_handlers: A mapping of either integer status codes, + or exception class types onto callables which handle the exceptions. + Exception handler callables should be of the form + `handler(request, exc) -> response` and may be either standard functions, or + async functions. + on_startup: A list of callables to run on application startup. + Startup handler callables do not take any arguments, and may be either + standard functions, or async functions. + on_shutdown: A list of callables to run on application shutdown. + Shutdown handler callables do not take any arguments, and may be either + standard functions, or async functions. + lifespan: A lifespan context function, which can be used to perform + startup and shutdown tasks. This is a newer style that replaces the + `on_startup` and `on_shutdown` handlers. Use one or the other, not both. + """ + # The lifespan context function is a newer style that replaces + # on_startup / on_shutdown handlers. Use one or the other, not both. + assert lifespan is None or (on_startup is None and on_shutdown is None), ( + "Use either 'lifespan' or 'on_startup'/'on_shutdown', not both." + ) + + self.debug = debug + self.state = State() + self.router = Router(routes, on_startup=on_startup, on_shutdown=on_shutdown, lifespan=lifespan) + self.exception_handlers = {} if exception_handlers is None else dict(exception_handlers) + self.user_middleware = [] if middleware is None else list(middleware) + self.middleware_stack: ASGIApp | None = None + + def build_middleware_stack(self) -> ASGIApp: + debug = self.debug + error_handler = None + exception_handlers: dict[typing.Any, typing.Callable[[Request, Exception], Response]] = {} + + for key, value in self.exception_handlers.items(): + if key in (500, Exception): + error_handler = value + else: + exception_handlers[key] = value + + middleware = ( + [Middleware(ServerErrorMiddleware, handler=error_handler, debug=debug)] + + self.user_middleware + + [Middleware(ExceptionMiddleware, handlers=exception_handlers, debug=debug)] + ) + + app = self.router + for cls, args, kwargs in reversed(middleware): + app = cls(app, *args, **kwargs) + return app + + @property + def routes(self) -> list[BaseRoute]: + return self.router.routes + + def url_path_for(self, name: str, /, **path_params: typing.Any) -> URLPath: + return self.router.url_path_for(name, **path_params) + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + scope["app"] = self + if self.middleware_stack is None: + self.middleware_stack = self.build_middleware_stack() + await self.middleware_stack(scope, receive, send) + + def on_event(self, event_type: str) -> typing.Callable: # type: ignore[type-arg] + return self.router.on_event(event_type) # pragma: no cover + + def mount(self, path: str, app: ASGIApp, name: str | None = None) -> None: + self.router.mount(path, app=app, name=name) # pragma: no cover + + def host(self, host: str, app: ASGIApp, name: str | None = None) -> None: + self.router.host(host, app=app, name=name) # pragma: no cover + + def add_middleware( + self, + middleware_class: _MiddlewareFactory[P], + *args: P.args, + **kwargs: P.kwargs, + ) -> None: + if self.middleware_stack is not None: # pragma: no cover + raise RuntimeError("Cannot add middleware after an application has started") + self.user_middleware.insert(0, Middleware(middleware_class, *args, **kwargs)) + + def add_exception_handler( + self, + exc_class_or_status_code: int | type[Exception], + handler: ExceptionHandler, + ) -> None: # pragma: no cover + self.exception_handlers[exc_class_or_status_code] = handler + + def add_event_handler( + self, + event_type: str, + func: typing.Callable, # type: ignore[type-arg] + ) -> None: # pragma: no cover + self.router.add_event_handler(event_type, func) + + def add_route( + self, + path: str, + route: typing.Callable[[Request], typing.Awaitable[Response] | Response], + methods: list[str] | None = None, + name: str | None = None, + include_in_schema: bool = True, + ) -> None: # pragma: no cover + self.router.add_route(path, route, methods=methods, name=name, include_in_schema=include_in_schema) + + def add_websocket_route( + self, + path: str, + route: typing.Callable[[WebSocket], typing.Awaitable[None]], + name: str | None = None, + ) -> None: # pragma: no cover + self.router.add_websocket_route(path, route, name=name) + + def exception_handler(self, exc_class_or_status_code: int | type[Exception]) -> typing.Callable: # type: ignore[type-arg] + warnings.warn( + "The `exception_handler` decorator is deprecated, and will be removed in version 1.0.0. " + "Refer to https://www.starlette.io/exceptions/ for the recommended approach.", + DeprecationWarning, + ) + + def decorator(func: typing.Callable) -> typing.Callable: # type: ignore[type-arg] + self.add_exception_handler(exc_class_or_status_code, func) + return func + + return decorator + + def route( + self, + path: str, + methods: list[str] | None = None, + name: str | None = None, + include_in_schema: bool = True, + ) -> typing.Callable: # type: ignore[type-arg] + """ + We no longer document this decorator style API, and its usage is discouraged. + Instead you should use the following approach: + + >>> routes = [Route(path, endpoint=...), ...] + >>> app = Starlette(routes=routes) + """ + warnings.warn( + "The `route` decorator is deprecated, and will be removed in version 1.0.0. " + "Refer to https://www.starlette.io/routing/ for the recommended approach.", + DeprecationWarning, + ) + + def decorator(func: typing.Callable) -> typing.Callable: # type: ignore[type-arg] + self.router.add_route( + path, + func, + methods=methods, + name=name, + include_in_schema=include_in_schema, + ) + return func + + return decorator + + def websocket_route(self, path: str, name: str | None = None) -> typing.Callable: # type: ignore[type-arg] + """ + We no longer document this decorator style API, and its usage is discouraged. + Instead you should use the following approach: + + >>> routes = [WebSocketRoute(path, endpoint=...), ...] + >>> app = Starlette(routes=routes) + """ + warnings.warn( + "The `websocket_route` decorator is deprecated, and will be removed in version 1.0.0. " + "Refer to https://www.starlette.io/routing/#websocket-routing for the recommended approach.", + DeprecationWarning, + ) + + def decorator(func: typing.Callable) -> typing.Callable: # type: ignore[type-arg] + self.router.add_websocket_route(path, func, name=name) + return func + + return decorator + + def middleware(self, middleware_type: str) -> typing.Callable: # type: ignore[type-arg] + """ + We no longer document this decorator style API, and its usage is discouraged. + Instead you should use the following approach: + + >>> middleware = [Middleware(...), ...] + >>> app = Starlette(middleware=middleware) + """ + warnings.warn( + "The `middleware` decorator is deprecated, and will be removed in version 1.0.0. " + "Refer to https://www.starlette.io/middleware/#using-middleware for recommended approach.", + DeprecationWarning, + ) + assert middleware_type == "http", 'Currently only middleware("http") is supported.' + + def decorator(func: typing.Callable) -> typing.Callable: # type: ignore[type-arg] + self.add_middleware(BaseHTTPMiddleware, dispatch=func) + return func + + return decorator diff --git a/venv/Lib/site-packages/starlette/authentication.py b/venv/Lib/site-packages/starlette/authentication.py new file mode 100644 index 00000000..4fd86641 --- /dev/null +++ b/venv/Lib/site-packages/starlette/authentication.py @@ -0,0 +1,147 @@ +from __future__ import annotations + +import functools +import inspect +import sys +import typing +from urllib.parse import urlencode + +if sys.version_info >= (3, 10): # pragma: no cover + from typing import ParamSpec +else: # pragma: no cover + from typing_extensions import ParamSpec + +from starlette._utils import is_async_callable +from starlette.exceptions import HTTPException +from starlette.requests import HTTPConnection, Request +from starlette.responses import RedirectResponse +from starlette.websockets import WebSocket + +_P = ParamSpec("_P") + + +def has_required_scope(conn: HTTPConnection, scopes: typing.Sequence[str]) -> bool: + for scope in scopes: + if scope not in conn.auth.scopes: + return False + return True + + +def requires( + scopes: str | typing.Sequence[str], + status_code: int = 403, + redirect: str | None = None, +) -> typing.Callable[[typing.Callable[_P, typing.Any]], typing.Callable[_P, typing.Any]]: + scopes_list = [scopes] if isinstance(scopes, str) else list(scopes) + + def decorator( + func: typing.Callable[_P, typing.Any], + ) -> typing.Callable[_P, typing.Any]: + sig = inspect.signature(func) + for idx, parameter in enumerate(sig.parameters.values()): + if parameter.name == "request" or parameter.name == "websocket": + type_ = parameter.name + break + else: + raise Exception(f'No "request" or "websocket" argument on function "{func}"') + + if type_ == "websocket": + # Handle websocket functions. (Always async) + @functools.wraps(func) + async def websocket_wrapper(*args: _P.args, **kwargs: _P.kwargs) -> None: + websocket = kwargs.get("websocket", args[idx] if idx < len(args) else None) + assert isinstance(websocket, WebSocket) + + if not has_required_scope(websocket, scopes_list): + await websocket.close() + else: + await func(*args, **kwargs) + + return websocket_wrapper + + elif is_async_callable(func): + # Handle async request/response functions. + @functools.wraps(func) + async def async_wrapper(*args: _P.args, **kwargs: _P.kwargs) -> typing.Any: + request = kwargs.get("request", args[idx] if idx < len(args) else None) + assert isinstance(request, Request) + + if not has_required_scope(request, scopes_list): + if redirect is not None: + orig_request_qparam = urlencode({"next": str(request.url)}) + next_url = f"{request.url_for(redirect)}?{orig_request_qparam}" + return RedirectResponse(url=next_url, status_code=303) + raise HTTPException(status_code=status_code) + return await func(*args, **kwargs) + + return async_wrapper + + else: + # Handle sync request/response functions. + @functools.wraps(func) + def sync_wrapper(*args: _P.args, **kwargs: _P.kwargs) -> typing.Any: + request = kwargs.get("request", args[idx] if idx < len(args) else None) + assert isinstance(request, Request) + + if not has_required_scope(request, scopes_list): + if redirect is not None: + orig_request_qparam = urlencode({"next": str(request.url)}) + next_url = f"{request.url_for(redirect)}?{orig_request_qparam}" + return RedirectResponse(url=next_url, status_code=303) + raise HTTPException(status_code=status_code) + return func(*args, **kwargs) + + return sync_wrapper + + return decorator + + +class AuthenticationError(Exception): + pass + + +class AuthenticationBackend: + async def authenticate(self, conn: HTTPConnection) -> tuple[AuthCredentials, BaseUser] | None: + raise NotImplementedError() # pragma: no cover + + +class AuthCredentials: + def __init__(self, scopes: typing.Sequence[str] | None = None): + self.scopes = [] if scopes is None else list(scopes) + + +class BaseUser: + @property + def is_authenticated(self) -> bool: + raise NotImplementedError() # pragma: no cover + + @property + def display_name(self) -> str: + raise NotImplementedError() # pragma: no cover + + @property + def identity(self) -> str: + raise NotImplementedError() # pragma: no cover + + +class SimpleUser(BaseUser): + def __init__(self, username: str) -> None: + self.username = username + + @property + def is_authenticated(self) -> bool: + return True + + @property + def display_name(self) -> str: + return self.username + + +class UnauthenticatedUser(BaseUser): + @property + def is_authenticated(self) -> bool: + return False + + @property + def display_name(self) -> str: + return "" diff --git a/venv/Lib/site-packages/starlette/background.py b/venv/Lib/site-packages/starlette/background.py new file mode 100644 index 00000000..0430fc08 --- /dev/null +++ b/venv/Lib/site-packages/starlette/background.py @@ -0,0 +1,41 @@ +from __future__ import annotations + +import sys +import typing + +if sys.version_info >= (3, 10): # pragma: no cover + from typing import ParamSpec +else: # pragma: no cover + from typing_extensions import ParamSpec + +from starlette._utils import is_async_callable +from starlette.concurrency import run_in_threadpool + +P = ParamSpec("P") + + +class BackgroundTask: + def __init__(self, func: typing.Callable[P, typing.Any], *args: P.args, **kwargs: P.kwargs) -> None: + self.func = func + self.args = args + self.kwargs = kwargs + self.is_async = is_async_callable(func) + + async def __call__(self) -> None: + if self.is_async: + await self.func(*self.args, **self.kwargs) + else: + await run_in_threadpool(self.func, *self.args, **self.kwargs) + + +class BackgroundTasks(BackgroundTask): + def __init__(self, tasks: typing.Sequence[BackgroundTask] | None = None): + self.tasks = list(tasks) if tasks else [] + + def add_task(self, func: typing.Callable[P, typing.Any], *args: P.args, **kwargs: P.kwargs) -> None: + task = BackgroundTask(func, *args, **kwargs) + self.tasks.append(task) + + async def __call__(self) -> None: + for task in self.tasks: + await task() diff --git a/venv/Lib/site-packages/starlette/concurrency.py b/venv/Lib/site-packages/starlette/concurrency.py new file mode 100644 index 00000000..494f3420 --- /dev/null +++ b/venv/Lib/site-packages/starlette/concurrency.py @@ -0,0 +1,62 @@ +from __future__ import annotations + +import functools +import sys +import typing +import warnings + +import anyio.to_thread + +if sys.version_info >= (3, 10): # pragma: no cover + from typing import ParamSpec +else: # pragma: no cover + from typing_extensions import ParamSpec + +P = ParamSpec("P") +T = typing.TypeVar("T") + + +async def run_until_first_complete(*args: tuple[typing.Callable, dict]) -> None: # type: ignore[type-arg] + warnings.warn( + "run_until_first_complete is deprecated and will be removed in a future version.", + DeprecationWarning, + ) + + async with anyio.create_task_group() as task_group: + + async def run(func: typing.Callable[[], typing.Coroutine]) -> None: # type: ignore[type-arg] + await func() + task_group.cancel_scope.cancel() + + for func, kwargs in args: + task_group.start_soon(run, functools.partial(func, **kwargs)) + + +async def run_in_threadpool(func: typing.Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T: + func = functools.partial(func, *args, **kwargs) + return await anyio.to_thread.run_sync(func) + + +class _StopIteration(Exception): + pass + + +def _next(iterator: typing.Iterator[T]) -> T: + # We can't raise `StopIteration` from within the threadpool iterator + # and catch it outside that context, so we coerce them into a different + # exception type. + try: + return next(iterator) + except StopIteration: + raise _StopIteration + + +async def iterate_in_threadpool( + iterator: typing.Iterable[T], +) -> typing.AsyncIterator[T]: + as_iterator = iter(iterator) + while True: + try: + yield await anyio.to_thread.run_sync(_next, as_iterator) + except _StopIteration: + break diff --git a/venv/Lib/site-packages/starlette/config.py b/venv/Lib/site-packages/starlette/config.py new file mode 100644 index 00000000..ca15c564 --- /dev/null +++ b/venv/Lib/site-packages/starlette/config.py @@ -0,0 +1,138 @@ +from __future__ import annotations + +import os +import typing +import warnings +from pathlib import Path + + +class undefined: + pass + + +class EnvironError(Exception): + pass + + +class Environ(typing.MutableMapping[str, str]): + def __init__(self, environ: typing.MutableMapping[str, str] = os.environ): + self._environ = environ + self._has_been_read: set[str] = set() + + def __getitem__(self, key: str) -> str: + self._has_been_read.add(key) + return self._environ.__getitem__(key) + + def __setitem__(self, key: str, value: str) -> None: + if key in self._has_been_read: + raise EnvironError(f"Attempting to set environ['{key}'], but the value has already been read.") + self._environ.__setitem__(key, value) + + def __delitem__(self, key: str) -> None: + if key in self._has_been_read: + raise EnvironError(f"Attempting to delete environ['{key}'], but the value has already been read.") + self._environ.__delitem__(key) + + def __iter__(self) -> typing.Iterator[str]: + return iter(self._environ) + + def __len__(self) -> int: + return len(self._environ) + + +environ = Environ() + +T = typing.TypeVar("T") + + +class Config: + def __init__( + self, + env_file: str | Path | None = None, + environ: typing.Mapping[str, str] = environ, + env_prefix: str = "", + ) -> None: + self.environ = environ + self.env_prefix = env_prefix + self.file_values: dict[str, str] = {} + if env_file is not None: + if not os.path.isfile(env_file): + warnings.warn(f"Config file '{env_file}' not found.") + else: + self.file_values = self._read_file(env_file) + + @typing.overload + def __call__(self, key: str, *, default: None) -> str | None: ... + + @typing.overload + def __call__(self, key: str, cast: type[T], default: T = ...) -> T: ... + + @typing.overload + def __call__(self, key: str, cast: type[str] = ..., default: str = ...) -> str: ... + + @typing.overload + def __call__( + self, + key: str, + cast: typing.Callable[[typing.Any], T] = ..., + default: typing.Any = ..., + ) -> T: ... + + @typing.overload + def __call__(self, key: str, cast: type[str] = ..., default: T = ...) -> T | str: ... + + def __call__( + self, + key: str, + cast: typing.Callable[[typing.Any], typing.Any] | None = None, + default: typing.Any = undefined, + ) -> typing.Any: + return self.get(key, cast, default) + + def get( + self, + key: str, + cast: typing.Callable[[typing.Any], typing.Any] | None = None, + default: typing.Any = undefined, + ) -> typing.Any: + key = self.env_prefix + key + if key in self.environ: + value = self.environ[key] + return self._perform_cast(key, value, cast) + if key in self.file_values: + value = self.file_values[key] + return self._perform_cast(key, value, cast) + if default is not undefined: + return self._perform_cast(key, default, cast) + raise KeyError(f"Config '{key}' is missing, and has no default.") + + def _read_file(self, file_name: str | Path) -> dict[str, str]: + file_values: dict[str, str] = {} + with open(file_name) as input_file: + for line in input_file.readlines(): + line = line.strip() + if "=" in line and not line.startswith("#"): + key, value = line.split("=", 1) + key = key.strip() + value = value.strip().strip("\"'") + file_values[key] = value + return file_values + + def _perform_cast( + self, + key: str, + value: typing.Any, + cast: typing.Callable[[typing.Any], typing.Any] | None = None, + ) -> typing.Any: + if cast is None or value is None: + return value + elif cast is bool and isinstance(value, str): + mapping = {"true": True, "1": True, "false": False, "0": False} + value = value.lower() + if value not in mapping: + raise ValueError(f"Config '{key}' has value '{value}'. Not a valid bool.") + return mapping[value] + try: + return cast(value) + except (TypeError, ValueError): + raise ValueError(f"Config '{key}' has value '{value}'. Not a valid {cast.__name__}.") diff --git a/venv/Lib/site-packages/starlette/convertors.py b/venv/Lib/site-packages/starlette/convertors.py new file mode 100644 index 00000000..84df87a5 --- /dev/null +++ b/venv/Lib/site-packages/starlette/convertors.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +import math +import typing +import uuid + +T = typing.TypeVar("T") + + +class Convertor(typing.Generic[T]): + regex: typing.ClassVar[str] = "" + + def convert(self, value: str) -> T: + raise NotImplementedError() # pragma: no cover + + def to_string(self, value: T) -> str: + raise NotImplementedError() # pragma: no cover + + +class StringConvertor(Convertor[str]): + regex = "[^/]+" + + def convert(self, value: str) -> str: + return value + + def to_string(self, value: str) -> str: + value = str(value) + assert "/" not in value, "May not contain path separators" + assert value, "Must not be empty" + return value + + +class PathConvertor(Convertor[str]): + regex = ".*" + + def convert(self, value: str) -> str: + return str(value) + + def to_string(self, value: str) -> str: + return str(value) + + +class IntegerConvertor(Convertor[int]): + regex = "[0-9]+" + + def convert(self, value: str) -> int: + return int(value) + + def to_string(self, value: int) -> str: + value = int(value) + assert value >= 0, "Negative integers are not supported" + return str(value) + + +class FloatConvertor(Convertor[float]): + regex = r"[0-9]+(\.[0-9]+)?" + + def convert(self, value: str) -> float: + return float(value) + + def to_string(self, value: float) -> str: + value = float(value) + assert value >= 0.0, "Negative floats are not supported" + assert not math.isnan(value), "NaN values are not supported" + assert not math.isinf(value), "Infinite values are not supported" + return ("%0.20f" % value).rstrip("0").rstrip(".") + + +class UUIDConvertor(Convertor[uuid.UUID]): + regex = "[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}" + + def convert(self, value: str) -> uuid.UUID: + return uuid.UUID(value) + + def to_string(self, value: uuid.UUID) -> str: + return str(value) + + +CONVERTOR_TYPES: dict[str, Convertor[typing.Any]] = { + "str": StringConvertor(), + "path": PathConvertor(), + "int": IntegerConvertor(), + "float": FloatConvertor(), + "uuid": UUIDConvertor(), +} + + +def register_url_convertor(key: str, convertor: Convertor[typing.Any]) -> None: + CONVERTOR_TYPES[key] = convertor diff --git a/venv/Lib/site-packages/starlette/datastructures.py b/venv/Lib/site-packages/starlette/datastructures.py new file mode 100644 index 00000000..f5d74d25 --- /dev/null +++ b/venv/Lib/site-packages/starlette/datastructures.py @@ -0,0 +1,674 @@ +from __future__ import annotations + +import typing +from shlex import shlex +from urllib.parse import SplitResult, parse_qsl, urlencode, urlsplit + +from starlette.concurrency import run_in_threadpool +from starlette.types import Scope + + +class Address(typing.NamedTuple): + host: str + port: int + + +_KeyType = typing.TypeVar("_KeyType") +# Mapping keys are invariant but their values are covariant since +# you can only read them +# that is, you can't do `Mapping[str, Animal]()["fido"] = Dog()` +_CovariantValueType = typing.TypeVar("_CovariantValueType", covariant=True) + + +class URL: + def __init__( + self, + url: str = "", + scope: Scope | None = None, + **components: typing.Any, + ) -> None: + if scope is not None: + assert not url, 'Cannot set both "url" and "scope".' + assert not components, 'Cannot set both "scope" and "**components".' + scheme = scope.get("scheme", "http") + server = scope.get("server", None) + path = scope["path"] + query_string = scope.get("query_string", b"") + + host_header = None + for key, value in scope["headers"]: + if key == b"host": + host_header = value.decode("latin-1") + break + + if host_header is not None: + url = f"{scheme}://{host_header}{path}" + elif server is None: + url = path + else: + host, port = server + default_port = {"http": 80, "https": 443, "ws": 80, "wss": 443}[scheme] + if port == default_port: + url = f"{scheme}://{host}{path}" + else: + url = f"{scheme}://{host}:{port}{path}" + + if query_string: + url += "?" + query_string.decode() + elif components: + assert not url, 'Cannot set both "url" and "**components".' + url = URL("").replace(**components).components.geturl() + + self._url = url + + @property + def components(self) -> SplitResult: + if not hasattr(self, "_components"): + self._components = urlsplit(self._url) + return self._components + + @property + def scheme(self) -> str: + return self.components.scheme + + @property + def netloc(self) -> str: + return self.components.netloc + + @property + def path(self) -> str: + return self.components.path + + @property + def query(self) -> str: + return self.components.query + + @property + def fragment(self) -> str: + return self.components.fragment + + @property + def username(self) -> None | str: + return self.components.username + + @property + def password(self) -> None | str: + return self.components.password + + @property + def hostname(self) -> None | str: + return self.components.hostname + + @property + def port(self) -> int | None: + return self.components.port + + @property + def is_secure(self) -> bool: + return self.scheme in ("https", "wss") + + def replace(self, **kwargs: typing.Any) -> URL: + if "username" in kwargs or "password" in kwargs or "hostname" in kwargs or "port" in kwargs: + hostname = kwargs.pop("hostname", None) + port = kwargs.pop("port", self.port) + username = kwargs.pop("username", self.username) + password = kwargs.pop("password", self.password) + + if hostname is None: + netloc = self.netloc + _, _, hostname = netloc.rpartition("@") + + if hostname[-1] != "]": + hostname = hostname.rsplit(":", 1)[0] + + netloc = hostname + if port is not None: + netloc += f":{port}" + if username is not None: + userpass = username + if password is not None: + userpass += f":{password}" + netloc = f"{userpass}@{netloc}" + + kwargs["netloc"] = netloc + + components = self.components._replace(**kwargs) + return self.__class__(components.geturl()) + + def include_query_params(self, **kwargs: typing.Any) -> URL: + params = MultiDict(parse_qsl(self.query, keep_blank_values=True)) + params.update({str(key): str(value) for key, value in kwargs.items()}) + query = urlencode(params.multi_items()) + return self.replace(query=query) + + def replace_query_params(self, **kwargs: typing.Any) -> URL: + query = urlencode([(str(key), str(value)) for key, value in kwargs.items()]) + return self.replace(query=query) + + def remove_query_params(self, keys: str | typing.Sequence[str]) -> URL: + if isinstance(keys, str): + keys = [keys] + params = MultiDict(parse_qsl(self.query, keep_blank_values=True)) + for key in keys: + params.pop(key, None) + query = urlencode(params.multi_items()) + return self.replace(query=query) + + def __eq__(self, other: typing.Any) -> bool: + return str(self) == str(other) + + def __str__(self) -> str: + return self._url + + def __repr__(self) -> str: + url = str(self) + if self.password: + url = str(self.replace(password="********")) + return f"{self.__class__.__name__}({repr(url)})" + + +class URLPath(str): + """ + A URL path string that may also hold an associated protocol and/or host. + Used by the routing to return `url_path_for` matches. + """ + + def __new__(cls, path: str, protocol: str = "", host: str = "") -> URLPath: + assert protocol in ("http", "websocket", "") + return str.__new__(cls, path) + + def __init__(self, path: str, protocol: str = "", host: str = "") -> None: + self.protocol = protocol + self.host = host + + def make_absolute_url(self, base_url: str | URL) -> URL: + if isinstance(base_url, str): + base_url = URL(base_url) + if self.protocol: + scheme = { + "http": {True: "https", False: "http"}, + "websocket": {True: "wss", False: "ws"}, + }[self.protocol][base_url.is_secure] + else: + scheme = base_url.scheme + + netloc = self.host or base_url.netloc + path = base_url.path.rstrip("/") + str(self) + return URL(scheme=scheme, netloc=netloc, path=path) + + +class Secret: + """ + Holds a string value that should not be revealed in tracebacks etc. + You should cast the value to `str` at the point it is required. + """ + + def __init__(self, value: str): + self._value = value + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + return f"{class_name}('**********')" + + def __str__(self) -> str: + return self._value + + def __bool__(self) -> bool: + return bool(self._value) + + +class CommaSeparatedStrings(typing.Sequence[str]): + def __init__(self, value: str | typing.Sequence[str]): + if isinstance(value, str): + splitter = shlex(value, posix=True) + splitter.whitespace = "," + splitter.whitespace_split = True + self._items = [item.strip() for item in splitter] + else: + self._items = list(value) + + def __len__(self) -> int: + return len(self._items) + + def __getitem__(self, index: int | slice) -> typing.Any: + return self._items[index] + + def __iter__(self) -> typing.Iterator[str]: + return iter(self._items) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + items = [item for item in self] + return f"{class_name}({items!r})" + + def __str__(self) -> str: + return ", ".join(repr(item) for item in self) + + +class ImmutableMultiDict(typing.Mapping[_KeyType, _CovariantValueType]): + _dict: dict[_KeyType, _CovariantValueType] + + def __init__( + self, + *args: ImmutableMultiDict[_KeyType, _CovariantValueType] + | typing.Mapping[_KeyType, _CovariantValueType] + | typing.Iterable[tuple[_KeyType, _CovariantValueType]], + **kwargs: typing.Any, + ) -> None: + assert len(args) < 2, "Too many arguments." + + value: typing.Any = args[0] if args else [] + if kwargs: + value = ImmutableMultiDict(value).multi_items() + ImmutableMultiDict(kwargs).multi_items() + + if not value: + _items: list[tuple[typing.Any, typing.Any]] = [] + elif hasattr(value, "multi_items"): + value = typing.cast(ImmutableMultiDict[_KeyType, _CovariantValueType], value) + _items = list(value.multi_items()) + elif hasattr(value, "items"): + value = typing.cast(typing.Mapping[_KeyType, _CovariantValueType], value) + _items = list(value.items()) + else: + value = typing.cast("list[tuple[typing.Any, typing.Any]]", value) + _items = list(value) + + self._dict = {k: v for k, v in _items} + self._list = _items + + def getlist(self, key: typing.Any) -> list[_CovariantValueType]: + return [item_value for item_key, item_value in self._list if item_key == key] + + def keys(self) -> typing.KeysView[_KeyType]: + return self._dict.keys() + + def values(self) -> typing.ValuesView[_CovariantValueType]: + return self._dict.values() + + def items(self) -> typing.ItemsView[_KeyType, _CovariantValueType]: + return self._dict.items() + + def multi_items(self) -> list[tuple[_KeyType, _CovariantValueType]]: + return list(self._list) + + def __getitem__(self, key: _KeyType) -> _CovariantValueType: + return self._dict[key] + + def __contains__(self, key: typing.Any) -> bool: + return key in self._dict + + def __iter__(self) -> typing.Iterator[_KeyType]: + return iter(self.keys()) + + def __len__(self) -> int: + return len(self._dict) + + def __eq__(self, other: typing.Any) -> bool: + if not isinstance(other, self.__class__): + return False + return sorted(self._list) == sorted(other._list) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + items = self.multi_items() + return f"{class_name}({items!r})" + + +class MultiDict(ImmutableMultiDict[typing.Any, typing.Any]): + def __setitem__(self, key: typing.Any, value: typing.Any) -> None: + self.setlist(key, [value]) + + def __delitem__(self, key: typing.Any) -> None: + self._list = [(k, v) for k, v in self._list if k != key] + del self._dict[key] + + def pop(self, key: typing.Any, default: typing.Any = None) -> typing.Any: + self._list = [(k, v) for k, v in self._list if k != key] + return self._dict.pop(key, default) + + def popitem(self) -> tuple[typing.Any, typing.Any]: + key, value = self._dict.popitem() + self._list = [(k, v) for k, v in self._list if k != key] + return key, value + + def poplist(self, key: typing.Any) -> list[typing.Any]: + values = [v for k, v in self._list if k == key] + self.pop(key) + return values + + def clear(self) -> None: + self._dict.clear() + self._list.clear() + + def setdefault(self, key: typing.Any, default: typing.Any = None) -> typing.Any: + if key not in self: + self._dict[key] = default + self._list.append((key, default)) + + return self[key] + + def setlist(self, key: typing.Any, values: list[typing.Any]) -> None: + if not values: + self.pop(key, None) + else: + existing_items = [(k, v) for (k, v) in self._list if k != key] + self._list = existing_items + [(key, value) for value in values] + self._dict[key] = values[-1] + + def append(self, key: typing.Any, value: typing.Any) -> None: + self._list.append((key, value)) + self._dict[key] = value + + def update( + self, + *args: MultiDict | typing.Mapping[typing.Any, typing.Any] | list[tuple[typing.Any, typing.Any]], + **kwargs: typing.Any, + ) -> None: + value = MultiDict(*args, **kwargs) + existing_items = [(k, v) for (k, v) in self._list if k not in value.keys()] + self._list = existing_items + value.multi_items() + self._dict.update(value) + + +class QueryParams(ImmutableMultiDict[str, str]): + """ + An immutable multidict. + """ + + def __init__( + self, + *args: ImmutableMultiDict[typing.Any, typing.Any] + | typing.Mapping[typing.Any, typing.Any] + | list[tuple[typing.Any, typing.Any]] + | str + | bytes, + **kwargs: typing.Any, + ) -> None: + assert len(args) < 2, "Too many arguments." + + value = args[0] if args else [] + + if isinstance(value, str): + super().__init__(parse_qsl(value, keep_blank_values=True), **kwargs) + elif isinstance(value, bytes): + super().__init__(parse_qsl(value.decode("latin-1"), keep_blank_values=True), **kwargs) + else: + super().__init__(*args, **kwargs) # type: ignore[arg-type] + self._list = [(str(k), str(v)) for k, v in self._list] + self._dict = {str(k): str(v) for k, v in self._dict.items()} + + def __str__(self) -> str: + return urlencode(self._list) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + query_string = str(self) + return f"{class_name}({query_string!r})" + + +class UploadFile: + """ + An uploaded file included as part of the request data. + """ + + def __init__( + self, + file: typing.BinaryIO, + *, + size: int | None = None, + filename: str | None = None, + headers: Headers | None = None, + ) -> None: + self.filename = filename + self.file = file + self.size = size + self.headers = headers or Headers() + + @property + def content_type(self) -> str | None: + return self.headers.get("content-type", None) + + @property + def _in_memory(self) -> bool: + # check for SpooledTemporaryFile._rolled + rolled_to_disk = getattr(self.file, "_rolled", True) + return not rolled_to_disk + + async def write(self, data: bytes) -> None: + if self.size is not None: + self.size += len(data) + + if self._in_memory: + self.file.write(data) + else: + await run_in_threadpool(self.file.write, data) + + async def read(self, size: int = -1) -> bytes: + if self._in_memory: + return self.file.read(size) + return await run_in_threadpool(self.file.read, size) + + async def seek(self, offset: int) -> None: + if self._in_memory: + self.file.seek(offset) + else: + await run_in_threadpool(self.file.seek, offset) + + async def close(self) -> None: + if self._in_memory: + self.file.close() + else: + await run_in_threadpool(self.file.close) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(filename={self.filename!r}, size={self.size!r}, headers={self.headers!r})" + + +class FormData(ImmutableMultiDict[str, typing.Union[UploadFile, str]]): + """ + An immutable multidict, containing both file uploads and text input. + """ + + def __init__( + self, + *args: FormData | typing.Mapping[str, str | UploadFile] | list[tuple[str, str | UploadFile]], + **kwargs: str | UploadFile, + ) -> None: + super().__init__(*args, **kwargs) + + async def close(self) -> None: + for key, value in self.multi_items(): + if isinstance(value, UploadFile): + await value.close() + + +class Headers(typing.Mapping[str, str]): + """ + An immutable, case-insensitive multidict. + """ + + def __init__( + self, + headers: typing.Mapping[str, str] | None = None, + raw: list[tuple[bytes, bytes]] | None = None, + scope: typing.MutableMapping[str, typing.Any] | None = None, + ) -> None: + self._list: list[tuple[bytes, bytes]] = [] + if headers is not None: + assert raw is None, 'Cannot set both "headers" and "raw".' + assert scope is None, 'Cannot set both "headers" and "scope".' + self._list = [(key.lower().encode("latin-1"), value.encode("latin-1")) for key, value in headers.items()] + elif raw is not None: + assert scope is None, 'Cannot set both "raw" and "scope".' + self._list = raw + elif scope is not None: + # scope["headers"] isn't necessarily a list + # it might be a tuple or other iterable + self._list = scope["headers"] = list(scope["headers"]) + + @property + def raw(self) -> list[tuple[bytes, bytes]]: + return list(self._list) + + def keys(self) -> list[str]: # type: ignore[override] + return [key.decode("latin-1") for key, value in self._list] + + def values(self) -> list[str]: # type: ignore[override] + return [value.decode("latin-1") for key, value in self._list] + + def items(self) -> list[tuple[str, str]]: # type: ignore[override] + return [(key.decode("latin-1"), value.decode("latin-1")) for key, value in self._list] + + def getlist(self, key: str) -> list[str]: + get_header_key = key.lower().encode("latin-1") + return [item_value.decode("latin-1") for item_key, item_value in self._list if item_key == get_header_key] + + def mutablecopy(self) -> MutableHeaders: + return MutableHeaders(raw=self._list[:]) + + def __getitem__(self, key: str) -> str: + get_header_key = key.lower().encode("latin-1") + for header_key, header_value in self._list: + if header_key == get_header_key: + return header_value.decode("latin-1") + raise KeyError(key) + + def __contains__(self, key: typing.Any) -> bool: + get_header_key = key.lower().encode("latin-1") + for header_key, header_value in self._list: + if header_key == get_header_key: + return True + return False + + def __iter__(self) -> typing.Iterator[typing.Any]: + return iter(self.keys()) + + def __len__(self) -> int: + return len(self._list) + + def __eq__(self, other: typing.Any) -> bool: + if not isinstance(other, Headers): + return False + return sorted(self._list) == sorted(other._list) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + as_dict = dict(self.items()) + if len(as_dict) == len(self): + return f"{class_name}({as_dict!r})" + return f"{class_name}(raw={self.raw!r})" + + +class MutableHeaders(Headers): + def __setitem__(self, key: str, value: str) -> None: + """ + Set the header `key` to `value`, removing any duplicate entries. + Retains insertion order. + """ + set_key = key.lower().encode("latin-1") + set_value = value.encode("latin-1") + + found_indexes: list[int] = [] + for idx, (item_key, item_value) in enumerate(self._list): + if item_key == set_key: + found_indexes.append(idx) + + for idx in reversed(found_indexes[1:]): + del self._list[idx] + + if found_indexes: + idx = found_indexes[0] + self._list[idx] = (set_key, set_value) + else: + self._list.append((set_key, set_value)) + + def __delitem__(self, key: str) -> None: + """ + Remove the header `key`. + """ + del_key = key.lower().encode("latin-1") + + pop_indexes: list[int] = [] + for idx, (item_key, item_value) in enumerate(self._list): + if item_key == del_key: + pop_indexes.append(idx) + + for idx in reversed(pop_indexes): + del self._list[idx] + + def __ior__(self, other: typing.Mapping[str, str]) -> MutableHeaders: + if not isinstance(other, typing.Mapping): + raise TypeError(f"Expected a mapping but got {other.__class__.__name__}") + self.update(other) + return self + + def __or__(self, other: typing.Mapping[str, str]) -> MutableHeaders: + if not isinstance(other, typing.Mapping): + raise TypeError(f"Expected a mapping but got {other.__class__.__name__}") + new = self.mutablecopy() + new.update(other) + return new + + @property + def raw(self) -> list[tuple[bytes, bytes]]: + return self._list + + def setdefault(self, key: str, value: str) -> str: + """ + If the header `key` does not exist, then set it to `value`. + Returns the header value. + """ + set_key = key.lower().encode("latin-1") + set_value = value.encode("latin-1") + + for idx, (item_key, item_value) in enumerate(self._list): + if item_key == set_key: + return item_value.decode("latin-1") + self._list.append((set_key, set_value)) + return value + + def update(self, other: typing.Mapping[str, str]) -> None: + for key, val in other.items(): + self[key] = val + + def append(self, key: str, value: str) -> None: + """ + Append a header, preserving any duplicate entries. + """ + append_key = key.lower().encode("latin-1") + append_value = value.encode("latin-1") + self._list.append((append_key, append_value)) + + def add_vary_header(self, vary: str) -> None: + existing = self.get("vary") + if existing is not None: + vary = ", ".join([existing, vary]) + self["vary"] = vary + + +class State: + """ + An object that can be used to store arbitrary state. + + Used for `request.state` and `app.state`. + """ + + _state: dict[str, typing.Any] + + def __init__(self, state: dict[str, typing.Any] | None = None): + if state is None: + state = {} + super().__setattr__("_state", state) + + def __setattr__(self, key: typing.Any, value: typing.Any) -> None: + self._state[key] = value + + def __getattr__(self, key: typing.Any) -> typing.Any: + try: + return self._state[key] + except KeyError: + message = "'{}' object has no attribute '{}'" + raise AttributeError(message.format(self.__class__.__name__, key)) + + def __delattr__(self, key: typing.Any) -> None: + del self._state[key] diff --git a/venv/Lib/site-packages/starlette/endpoints.py b/venv/Lib/site-packages/starlette/endpoints.py new file mode 100644 index 00000000..10769026 --- /dev/null +++ b/venv/Lib/site-packages/starlette/endpoints.py @@ -0,0 +1,122 @@ +from __future__ import annotations + +import json +import typing + +from starlette import status +from starlette._utils import is_async_callable +from starlette.concurrency import run_in_threadpool +from starlette.exceptions import HTTPException +from starlette.requests import Request +from starlette.responses import PlainTextResponse, Response +from starlette.types import Message, Receive, Scope, Send +from starlette.websockets import WebSocket + + +class HTTPEndpoint: + def __init__(self, scope: Scope, receive: Receive, send: Send) -> None: + assert scope["type"] == "http" + self.scope = scope + self.receive = receive + self.send = send + self._allowed_methods = [ + method + for method in ("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS") + if getattr(self, method.lower(), None) is not None + ] + + def __await__(self) -> typing.Generator[typing.Any, None, None]: + return self.dispatch().__await__() + + async def dispatch(self) -> None: + request = Request(self.scope, receive=self.receive) + handler_name = "get" if request.method == "HEAD" and not hasattr(self, "head") else request.method.lower() + + handler: typing.Callable[[Request], typing.Any] = getattr(self, handler_name, self.method_not_allowed) + is_async = is_async_callable(handler) + if is_async: + response = await handler(request) + else: + response = await run_in_threadpool(handler, request) + await response(self.scope, self.receive, self.send) + + async def method_not_allowed(self, request: Request) -> Response: + # If we're running inside a starlette application then raise an + # exception, so that the configurable exception handler can deal with + # returning the response. For plain ASGI apps, just return the response. + headers = {"Allow": ", ".join(self._allowed_methods)} + if "app" in self.scope: + raise HTTPException(status_code=405, headers=headers) + return PlainTextResponse("Method Not Allowed", status_code=405, headers=headers) + + +class WebSocketEndpoint: + encoding: str | None = None # May be "text", "bytes", or "json". + + def __init__(self, scope: Scope, receive: Receive, send: Send) -> None: + assert scope["type"] == "websocket" + self.scope = scope + self.receive = receive + self.send = send + + def __await__(self) -> typing.Generator[typing.Any, None, None]: + return self.dispatch().__await__() + + async def dispatch(self) -> None: + websocket = WebSocket(self.scope, receive=self.receive, send=self.send) + await self.on_connect(websocket) + + close_code = status.WS_1000_NORMAL_CLOSURE + + try: + while True: + message = await websocket.receive() + if message["type"] == "websocket.receive": + data = await self.decode(websocket, message) + await self.on_receive(websocket, data) + elif message["type"] == "websocket.disconnect": # pragma: no branch + close_code = int(message.get("code") or status.WS_1000_NORMAL_CLOSURE) + break + except Exception as exc: + close_code = status.WS_1011_INTERNAL_ERROR + raise exc + finally: + await self.on_disconnect(websocket, close_code) + + async def decode(self, websocket: WebSocket, message: Message) -> typing.Any: + if self.encoding == "text": + if "text" not in message: + await websocket.close(code=status.WS_1003_UNSUPPORTED_DATA) + raise RuntimeError("Expected text websocket messages, but got bytes") + return message["text"] + + elif self.encoding == "bytes": + if "bytes" not in message: + await websocket.close(code=status.WS_1003_UNSUPPORTED_DATA) + raise RuntimeError("Expected bytes websocket messages, but got text") + return message["bytes"] + + elif self.encoding == "json": + if message.get("text") is not None: + text = message["text"] + else: + text = message["bytes"].decode("utf-8") + + try: + return json.loads(text) + except json.decoder.JSONDecodeError: + await websocket.close(code=status.WS_1003_UNSUPPORTED_DATA) + raise RuntimeError("Malformed JSON data received.") + + assert self.encoding is None, f"Unsupported 'encoding' attribute {self.encoding}" + return message["text"] if message.get("text") else message["bytes"] + + async def on_connect(self, websocket: WebSocket) -> None: + """Override to handle an incoming websocket connection""" + await websocket.accept() + + async def on_receive(self, websocket: WebSocket, data: typing.Any) -> None: + """Override to handle an incoming websocket message""" + + async def on_disconnect(self, websocket: WebSocket, close_code: int) -> None: + """Override to handle a disconnecting websocket""" diff --git a/venv/Lib/site-packages/starlette/exceptions.py b/venv/Lib/site-packages/starlette/exceptions.py new file mode 100644 index 00000000..9ad3527b --- /dev/null +++ b/venv/Lib/site-packages/starlette/exceptions.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +import http +from collections.abc import Mapping + + +class HTTPException(Exception): + def __init__(self, status_code: int, detail: str | None = None, headers: Mapping[str, str] | None = None) -> None: + if detail is None: + detail = http.HTTPStatus(status_code).phrase + self.status_code = status_code + self.detail = detail + self.headers = headers + + def __str__(self) -> str: + return f"{self.status_code}: {self.detail}" + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + return f"{class_name}(status_code={self.status_code!r}, detail={self.detail!r})" + + +class WebSocketException(Exception): + def __init__(self, code: int, reason: str | None = None) -> None: + self.code = code + self.reason = reason or "" + + def __str__(self) -> str: + return f"{self.code}: {self.reason}" + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + return f"{class_name}(code={self.code!r}, reason={self.reason!r})" diff --git a/venv/Lib/site-packages/starlette/formparsers.py b/venv/Lib/site-packages/starlette/formparsers.py new file mode 100644 index 00000000..4551d688 --- /dev/null +++ b/venv/Lib/site-packages/starlette/formparsers.py @@ -0,0 +1,275 @@ +from __future__ import annotations + +import typing +from dataclasses import dataclass, field +from enum import Enum +from tempfile import SpooledTemporaryFile +from urllib.parse import unquote_plus + +from starlette.datastructures import FormData, Headers, UploadFile + +if typing.TYPE_CHECKING: + import python_multipart as multipart + from python_multipart.multipart import MultipartCallbacks, QuerystringCallbacks, parse_options_header +else: + try: + try: + import python_multipart as multipart + from python_multipart.multipart import parse_options_header + except ModuleNotFoundError: # pragma: no cover + import multipart + from multipart.multipart import parse_options_header + except ModuleNotFoundError: # pragma: no cover + multipart = None + parse_options_header = None + + +class FormMessage(Enum): + FIELD_START = 1 + FIELD_NAME = 2 + FIELD_DATA = 3 + FIELD_END = 4 + END = 5 + + +@dataclass +class MultipartPart: + content_disposition: bytes | None = None + field_name: str = "" + data: bytearray = field(default_factory=bytearray) + file: UploadFile | None = None + item_headers: list[tuple[bytes, bytes]] = field(default_factory=list) + + +def _user_safe_decode(src: bytes | bytearray, codec: str) -> str: + try: + return src.decode(codec) + except (UnicodeDecodeError, LookupError): + return src.decode("latin-1") + + +class MultiPartException(Exception): + def __init__(self, message: str) -> None: + self.message = message + + +class FormParser: + def __init__(self, headers: Headers, stream: typing.AsyncGenerator[bytes, None]) -> None: + assert multipart is not None, "The `python-multipart` library must be installed to use form parsing." + self.headers = headers + self.stream = stream + self.messages: list[tuple[FormMessage, bytes]] = [] + + def on_field_start(self) -> None: + message = (FormMessage.FIELD_START, b"") + self.messages.append(message) + + def on_field_name(self, data: bytes, start: int, end: int) -> None: + message = (FormMessage.FIELD_NAME, data[start:end]) + self.messages.append(message) + + def on_field_data(self, data: bytes, start: int, end: int) -> None: + message = (FormMessage.FIELD_DATA, data[start:end]) + self.messages.append(message) + + def on_field_end(self) -> None: + message = (FormMessage.FIELD_END, b"") + self.messages.append(message) + + def on_end(self) -> None: + message = (FormMessage.END, b"") + self.messages.append(message) + + async def parse(self) -> FormData: + # Callbacks dictionary. + callbacks: QuerystringCallbacks = { + "on_field_start": self.on_field_start, + "on_field_name": self.on_field_name, + "on_field_data": self.on_field_data, + "on_field_end": self.on_field_end, + "on_end": self.on_end, + } + + # Create the parser. + parser = multipart.QuerystringParser(callbacks) + field_name = b"" + field_value = b"" + + items: list[tuple[str, str | UploadFile]] = [] + + # Feed the parser with data from the request. + async for chunk in self.stream: + if chunk: + parser.write(chunk) + else: + parser.finalize() + messages = list(self.messages) + self.messages.clear() + for message_type, message_bytes in messages: + if message_type == FormMessage.FIELD_START: + field_name = b"" + field_value = b"" + elif message_type == FormMessage.FIELD_NAME: + field_name += message_bytes + elif message_type == FormMessage.FIELD_DATA: + field_value += message_bytes + elif message_type == FormMessage.FIELD_END: + name = unquote_plus(field_name.decode("latin-1")) + value = unquote_plus(field_value.decode("latin-1")) + items.append((name, value)) + + return FormData(items) + + +class MultiPartParser: + spool_max_size = 1024 * 1024 # 1MB + """The maximum size of the spooled temporary file used to store file data.""" + max_part_size = 1024 * 1024 # 1MB + """The maximum size of a part in the multipart request.""" + + def __init__( + self, + headers: Headers, + stream: typing.AsyncGenerator[bytes, None], + *, + max_files: int | float = 1000, + max_fields: int | float = 1000, + max_part_size: int = 1024 * 1024, # 1MB + ) -> None: + assert multipart is not None, "The `python-multipart` library must be installed to use form parsing." + self.headers = headers + self.stream = stream + self.max_files = max_files + self.max_fields = max_fields + self.items: list[tuple[str, str | UploadFile]] = [] + self._current_files = 0 + self._current_fields = 0 + self._current_partial_header_name: bytes = b"" + self._current_partial_header_value: bytes = b"" + self._current_part = MultipartPart() + self._charset = "" + self._file_parts_to_write: list[tuple[MultipartPart, bytes]] = [] + self._file_parts_to_finish: list[MultipartPart] = [] + self._files_to_close_on_error: list[SpooledTemporaryFile[bytes]] = [] + self.max_part_size = max_part_size + + def on_part_begin(self) -> None: + self._current_part = MultipartPart() + + def on_part_data(self, data: bytes, start: int, end: int) -> None: + message_bytes = data[start:end] + if self._current_part.file is None: + if len(self._current_part.data) + len(message_bytes) > self.max_part_size: + raise MultiPartException(f"Part exceeded maximum size of {int(self.max_part_size / 1024)}KB.") + self._current_part.data.extend(message_bytes) + else: + self._file_parts_to_write.append((self._current_part, message_bytes)) + + def on_part_end(self) -> None: + if self._current_part.file is None: + self.items.append( + ( + self._current_part.field_name, + _user_safe_decode(self._current_part.data, self._charset), + ) + ) + else: + self._file_parts_to_finish.append(self._current_part) + # The file can be added to the items right now even though it's not + # finished yet, because it will be finished in the `parse()` method, before + # self.items is used in the return value. + self.items.append((self._current_part.field_name, self._current_part.file)) + + def on_header_field(self, data: bytes, start: int, end: int) -> None: + self._current_partial_header_name += data[start:end] + + def on_header_value(self, data: bytes, start: int, end: int) -> None: + self._current_partial_header_value += data[start:end] + + def on_header_end(self) -> None: + field = self._current_partial_header_name.lower() + if field == b"content-disposition": + self._current_part.content_disposition = self._current_partial_header_value + self._current_part.item_headers.append((field, self._current_partial_header_value)) + self._current_partial_header_name = b"" + self._current_partial_header_value = b"" + + def on_headers_finished(self) -> None: + disposition, options = parse_options_header(self._current_part.content_disposition) + try: + self._current_part.field_name = _user_safe_decode(options[b"name"], self._charset) + except KeyError: + raise MultiPartException('The Content-Disposition header field "name" must be provided.') + if b"filename" in options: + self._current_files += 1 + if self._current_files > self.max_files: + raise MultiPartException(f"Too many files. Maximum number of files is {self.max_files}.") + filename = _user_safe_decode(options[b"filename"], self._charset) + tempfile = SpooledTemporaryFile(max_size=self.spool_max_size) + self._files_to_close_on_error.append(tempfile) + self._current_part.file = UploadFile( + file=tempfile, # type: ignore[arg-type] + size=0, + filename=filename, + headers=Headers(raw=self._current_part.item_headers), + ) + else: + self._current_fields += 1 + if self._current_fields > self.max_fields: + raise MultiPartException(f"Too many fields. Maximum number of fields is {self.max_fields}.") + self._current_part.file = None + + def on_end(self) -> None: + pass + + async def parse(self) -> FormData: + # Parse the Content-Type header to get the multipart boundary. + _, params = parse_options_header(self.headers["Content-Type"]) + charset = params.get(b"charset", "utf-8") + if isinstance(charset, bytes): + charset = charset.decode("latin-1") + self._charset = charset + try: + boundary = params[b"boundary"] + except KeyError: + raise MultiPartException("Missing boundary in multipart.") + + # Callbacks dictionary. + callbacks: MultipartCallbacks = { + "on_part_begin": self.on_part_begin, + "on_part_data": self.on_part_data, + "on_part_end": self.on_part_end, + "on_header_field": self.on_header_field, + "on_header_value": self.on_header_value, + "on_header_end": self.on_header_end, + "on_headers_finished": self.on_headers_finished, + "on_end": self.on_end, + } + + # Create the parser. + parser = multipart.MultipartParser(boundary, callbacks) + try: + # Feed the parser with data from the request. + async for chunk in self.stream: + parser.write(chunk) + # Write file data, it needs to use await with the UploadFile methods + # that call the corresponding file methods *in a threadpool*, + # otherwise, if they were called directly in the callback methods above + # (regular, non-async functions), that would block the event loop in + # the main thread. + for part, data in self._file_parts_to_write: + assert part.file # for type checkers + await part.file.write(data) + for part in self._file_parts_to_finish: + assert part.file # for type checkers + await part.file.seek(0) + self._file_parts_to_write.clear() + self._file_parts_to_finish.clear() + except MultiPartException as exc: + # Close all the files if there was an error. + for file in self._files_to_close_on_error: + file.close() + raise exc + + parser.finalize() + return FormData(self.items) diff --git a/venv/Lib/site-packages/starlette/middleware/__init__.py b/venv/Lib/site-packages/starlette/middleware/__init__.py new file mode 100644 index 00000000..b99538a2 --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/__init__.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +import sys +from collections.abc import Iterator +from typing import Any, Protocol + +if sys.version_info >= (3, 10): # pragma: no cover + from typing import ParamSpec +else: # pragma: no cover + from typing_extensions import ParamSpec + +from starlette.types import ASGIApp + +P = ParamSpec("P") + + +class _MiddlewareFactory(Protocol[P]): + def __call__(self, app: ASGIApp, /, *args: P.args, **kwargs: P.kwargs) -> ASGIApp: ... # pragma: no cover + + +class Middleware: + def __init__( + self, + cls: _MiddlewareFactory[P], + *args: P.args, + **kwargs: P.kwargs, + ) -> None: + self.cls = cls + self.args = args + self.kwargs = kwargs + + def __iter__(self) -> Iterator[Any]: + as_tuple = (self.cls, self.args, self.kwargs) + return iter(as_tuple) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + args_strings = [f"{value!r}" for value in self.args] + option_strings = [f"{key}={value!r}" for key, value in self.kwargs.items()] + name = getattr(self.cls, "__name__", "") + args_repr = ", ".join([name] + args_strings + option_strings) + return f"{class_name}({args_repr})" diff --git a/venv/Lib/site-packages/starlette/middleware/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/starlette/middleware/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cac1348b04d30bb8f7dd68383e144a947dcaca4c GIT binary patch literal 2530 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

|{ zmLbB=of;Q(=<;`B#w8!B5G_PsxcIIq|j9M^8N@ IKwNeI2I%m@;{X5v literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/middleware/__pycache__/base.cpython-312.pyc b/venv/Lib/site-packages/starlette/middleware/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c13f12d24f113e40b246c6afbc68bc62604d5d5e GIT binary patch literal 11318 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/middleware/__pycache__/gzip.cpython-312.pyc b/venv/Lib/site-packages/starlette/middleware/__pycache__/gzip.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec594bf65c66beb73c3484deda7cf38e2118d4c1 GIT binary patch literal 8553 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 Ko?ww2-hTt2G9(cI literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/middleware/__pycache__/httpsredirect.cpython-312.pyc b/venv/Lib/site-packages/starlette/middleware/__pycache__/httpsredirect.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79031b0f37ffdee9cdda7298b4852eea505e4364 GIT binary patch literal 1760 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 JL`p;8e*tj5Jp}*& literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/middleware/__pycache__/trustedhost.cpython-312.pyc b/venv/Lib/site-packages/starlette/middleware/__pycache__/trustedhost.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9addc6be2cac93f96f611d6cc4ed8b692b3139e5 GIT binary patch literal 3115 zcmbVOU2GKB6~6PgJNxJL4|p-guoz-94lH&EIB^pq8yoBfJCSXQx)^PTy%)3g?Cj>w z*c;okDoRk~B1CQ6jOcj&M1L*| z0po>?hSMs=@w{r9gz82-J7bvfOC+vkrb)cLBSGF(vw4jq(z$GVBJJkxO2K__k2^uR zi3mz^7$x}t3Lq>px&6Zu=C4Uf0sF9U4T?C&DSmtBIEA?g9?Ti$a0X+I6jVw^(wp1i zM3+FqJlx~IIdfS2RRMF8T#>i$JA!F zTSibYcbjwj2Dj7>QMl=Dgg`&?AN&Q+pK?oYJbxw;S)7GZo12V~>Gx)|c<*hnZ>ip2z{!_i9 z{dUkWRcacAjCsWtRM>n`%NV8|Q8g`BAUJgeDs9*Sr<+psIXhe^6jF2(M~Y;N2GK6l z9WWJbWMUTx+wWn6r5I=J$%Rur6Xy(o=ER#rL*ot)+8OT$guOn)Z|;<)$NGsHyBZv?$(_n;t`6=wGnR_Vj&*wymIHX5#*plWQ4`&8$sRu0n zrPtvU`u_jAS$;YUYpVVCOlYs!;Eh^O*EC=SrgnOk?I+|Hm|`dCnZ|Oy6YXTzjX^+p}VbM^@;6qoNxvb4zvIXsH1I;KxFNQ|d=- z(VWW@xOl`XrkS?`1#-#ArKgDrcavne7Y93^HhRMKP{wYjDXR~y12H}?0*@rX)u$6v z%cVgRW~esbFr?3_S_a42tMMz&ZI)RECSx}qP=PsPq|!M|lqij{U=Hyx(AvTzF=67o zmN8u>Vr92wxVjv6bBKvD61Dx5baBT~QNhv#RN|>_3(pEMKj_ySWB&TEB z@1|qW1I!r77%3-Jha>I!%efgHr=DgC6XU<`dF;lQeTc(>gvJnQO!;hPSvb|(< zmIlWCZ*=C`_kp)D0@e8o`r#_7grXmwynb@!Tmpeo{Vn{>uyNZ~U|pKe!zEx^`!!F1B*;MoX!Etxl=Dpsd!mRzncyVGYo6rM~gm zL|4O|4}GY%wS+g?y1#1czTe1FZfsi?D*IZ0v+&Wv-L_ATeb)17&+1D9D+_D;PA`Y= zH^2Bh;qKYB&ffLrz8ms)&4;e!312zS@N%UH_==1^Gj@9^?}P zSO~q>F(7hxxc=A0k9$vo`uoFsKz=TB14#Tl(3^nH7v0_b~tCAbyJ| zqXh?Xw1#O+u$V>tr|qZn#Um+ z`|H6Lsml$^f+=+@k;^l%97u$+d&l;quV}=j|}P*+$oY%Gp9)P;OVaMHKuK?`-%LTTc(q=4-D*s$>;!46*!Lj o6KeeyMgEMszCpvQX!slS>Kc0W!S2yAiv8W!$#p$KAe>nL1O+1XsQ>@~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/middleware/__pycache__/wsgi.cpython-312.pyc b/venv/Lib/site-packages/starlette/middleware/__pycache__/wsgi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc01280d0c178161a323c4a31730a3b0896f4bd8 GIT binary patch literal 8567 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 s@wx*56(3^mb9G;tIL5H->|(qR#~2f{@~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/starlette/middleware/authentication.py b/venv/Lib/site-packages/starlette/middleware/authentication.py new file mode 100644 index 00000000..8555ee07 --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/authentication.py @@ -0,0 +1,52 @@ +from __future__ import annotations + +import typing + +from starlette.authentication import ( + AuthCredentials, + AuthenticationBackend, + AuthenticationError, + UnauthenticatedUser, +) +from starlette.requests import HTTPConnection +from starlette.responses import PlainTextResponse, Response +from starlette.types import ASGIApp, Receive, Scope, Send + + +class AuthenticationMiddleware: + def __init__( + self, + app: ASGIApp, + backend: AuthenticationBackend, + on_error: typing.Callable[[HTTPConnection, AuthenticationError], Response] | None = None, + ) -> None: + self.app = app + self.backend = backend + self.on_error: typing.Callable[[HTTPConnection, AuthenticationError], Response] = ( + on_error if on_error is not None else self.default_on_error + ) + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if scope["type"] not in ["http", "websocket"]: + await self.app(scope, receive, send) + return + + conn = HTTPConnection(scope) + try: + auth_result = await self.backend.authenticate(conn) + except AuthenticationError as exc: + response = self.on_error(conn, exc) + if scope["type"] == "websocket": + await send({"type": "websocket.close", "code": 1000}) + else: + await response(scope, receive, send) + return + + if auth_result is None: + auth_result = AuthCredentials(), UnauthenticatedUser() + scope["auth"], scope["user"] = auth_result + await self.app(scope, receive, send) + + @staticmethod + def default_on_error(conn: HTTPConnection, exc: Exception) -> Response: + return PlainTextResponse(str(exc), status_code=400) diff --git a/venv/Lib/site-packages/starlette/middleware/base.py b/venv/Lib/site-packages/starlette/middleware/base.py new file mode 100644 index 00000000..b49ab611 --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/base.py @@ -0,0 +1,222 @@ +from __future__ import annotations + +import typing + +import anyio + +from starlette._utils import collapse_excgroups +from starlette.requests import ClientDisconnect, Request +from starlette.responses import AsyncContentStream, Response +from starlette.types import ASGIApp, Message, Receive, Scope, Send + +RequestResponseEndpoint = typing.Callable[[Request], typing.Awaitable[Response]] +DispatchFunction = typing.Callable[[Request, RequestResponseEndpoint], typing.Awaitable[Response]] +T = typing.TypeVar("T") + + +class _CachedRequest(Request): + """ + If the user calls Request.body() from their dispatch function + we cache the entire request body in memory and pass that to downstream middlewares, + but if they call Request.stream() then all we do is send an + empty body so that downstream things don't hang forever. + """ + + def __init__(self, scope: Scope, receive: Receive): + super().__init__(scope, receive) + self._wrapped_rcv_disconnected = False + self._wrapped_rcv_consumed = False + self._wrapped_rc_stream = self.stream() + + async def wrapped_receive(self) -> Message: + # wrapped_rcv state 1: disconnected + if self._wrapped_rcv_disconnected: + # we've already sent a disconnect to the downstream app + # we don't need to wait to get another one + # (although most ASGI servers will just keep sending it) + return {"type": "http.disconnect"} + # wrapped_rcv state 1: consumed but not yet disconnected + if self._wrapped_rcv_consumed: + # since the downstream app has consumed us all that is left + # is to send it a disconnect + if self._is_disconnected: + # the middleware has already seen the disconnect + # since we know the client is disconnected no need to wait + # for the message + self._wrapped_rcv_disconnected = True + return {"type": "http.disconnect"} + # we don't know yet if the client is disconnected or not + # so we'll wait until we get that message + msg = await self.receive() + if msg["type"] != "http.disconnect": # pragma: no cover + # at this point a disconnect is all that we should be receiving + # if we get something else, things went wrong somewhere + raise RuntimeError(f"Unexpected message received: {msg['type']}") + self._wrapped_rcv_disconnected = True + return msg + + # wrapped_rcv state 3: not yet consumed + if getattr(self, "_body", None) is not None: + # body() was called, we return it even if the client disconnected + self._wrapped_rcv_consumed = True + return { + "type": "http.request", + "body": self._body, + "more_body": False, + } + elif self._stream_consumed: + # stream() was called to completion + # return an empty body so that downstream apps don't hang + # waiting for a disconnect + self._wrapped_rcv_consumed = True + return { + "type": "http.request", + "body": b"", + "more_body": False, + } + else: + # body() was never called and stream() wasn't consumed + try: + stream = self.stream() + chunk = await stream.__anext__() + self._wrapped_rcv_consumed = self._stream_consumed + return { + "type": "http.request", + "body": chunk, + "more_body": not self._stream_consumed, + } + except ClientDisconnect: + self._wrapped_rcv_disconnected = True + return {"type": "http.disconnect"} + + +class BaseHTTPMiddleware: + def __init__(self, app: ASGIApp, dispatch: DispatchFunction | None = None) -> None: + self.app = app + self.dispatch_func = self.dispatch if dispatch is None else dispatch + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if scope["type"] != "http": + await self.app(scope, receive, send) + return + + request = _CachedRequest(scope, receive) + wrapped_receive = request.wrapped_receive + response_sent = anyio.Event() + app_exc: Exception | None = None + exception_already_raised = False + + async def call_next(request: Request) -> Response: + async def receive_or_disconnect() -> Message: + if response_sent.is_set(): + return {"type": "http.disconnect"} + + async with anyio.create_task_group() as task_group: + + async def wrap(func: typing.Callable[[], typing.Awaitable[T]]) -> T: + result = await func() + task_group.cancel_scope.cancel() + return result + + task_group.start_soon(wrap, response_sent.wait) + message = await wrap(wrapped_receive) + + if response_sent.is_set(): + return {"type": "http.disconnect"} + + return message + + async def send_no_error(message: Message) -> None: + try: + await send_stream.send(message) + except anyio.BrokenResourceError: + # recv_stream has been closed, i.e. response_sent has been set. + return + + async def coro() -> None: + nonlocal app_exc + + with send_stream: + try: + await self.app(scope, receive_or_disconnect, send_no_error) + except Exception as exc: + app_exc = exc + + task_group.start_soon(coro) + + try: + message = await recv_stream.receive() + info = message.get("info", None) + if message["type"] == "http.response.debug" and info is not None: + message = await recv_stream.receive() + except anyio.EndOfStream: + if app_exc is not None: + nonlocal exception_already_raised + exception_already_raised = True + raise app_exc + raise RuntimeError("No response returned.") + + assert message["type"] == "http.response.start" + + async def body_stream() -> typing.AsyncGenerator[bytes, None]: + async for message in recv_stream: + assert message["type"] == "http.response.body" + body = message.get("body", b"") + if body: + yield body + if not message.get("more_body", False): + break + + response = _StreamingResponse(status_code=message["status"], content=body_stream(), info=info) + response.raw_headers = message["headers"] + return response + + streams: anyio.create_memory_object_stream[Message] = anyio.create_memory_object_stream() + send_stream, recv_stream = streams + with recv_stream, send_stream, collapse_excgroups(): + async with anyio.create_task_group() as task_group: + response = await self.dispatch_func(request, call_next) + await response(scope, wrapped_receive, send) + response_sent.set() + recv_stream.close() + if app_exc is not None and not exception_already_raised: + raise app_exc + + async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response: + raise NotImplementedError() # pragma: no cover + + +class _StreamingResponse(Response): + def __init__( + self, + content: AsyncContentStream, + status_code: int = 200, + headers: typing.Mapping[str, str] | None = None, + media_type: str | None = None, + info: typing.Mapping[str, typing.Any] | None = None, + ) -> None: + self.info = info + self.body_iterator = content + self.status_code = status_code + self.media_type = media_type + self.init_headers(headers) + self.background = None + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if self.info is not None: + await send({"type": "http.response.debug", "info": self.info}) + await send( + { + "type": "http.response.start", + "status": self.status_code, + "headers": self.raw_headers, + } + ) + + async for chunk in self.body_iterator: + await send({"type": "http.response.body", "body": chunk, "more_body": True}) + + await send({"type": "http.response.body", "body": b"", "more_body": False}) + + if self.background: + await self.background() diff --git a/venv/Lib/site-packages/starlette/middleware/cors.py b/venv/Lib/site-packages/starlette/middleware/cors.py new file mode 100644 index 00000000..61502691 --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/cors.py @@ -0,0 +1,172 @@ +from __future__ import annotations + +import functools +import re +import typing + +from starlette.datastructures import Headers, MutableHeaders +from starlette.responses import PlainTextResponse, Response +from starlette.types import ASGIApp, Message, Receive, Scope, Send + +ALL_METHODS = ("DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT") +SAFELISTED_HEADERS = {"Accept", "Accept-Language", "Content-Language", "Content-Type"} + + +class CORSMiddleware: + def __init__( + self, + app: ASGIApp, + allow_origins: typing.Sequence[str] = (), + allow_methods: typing.Sequence[str] = ("GET",), + allow_headers: typing.Sequence[str] = (), + allow_credentials: bool = False, + allow_origin_regex: str | None = None, + expose_headers: typing.Sequence[str] = (), + max_age: int = 600, + ) -> None: + if "*" in allow_methods: + allow_methods = ALL_METHODS + + compiled_allow_origin_regex = None + if allow_origin_regex is not None: + compiled_allow_origin_regex = re.compile(allow_origin_regex) + + allow_all_origins = "*" in allow_origins + allow_all_headers = "*" in allow_headers + preflight_explicit_allow_origin = not allow_all_origins or allow_credentials + + simple_headers = {} + if allow_all_origins: + simple_headers["Access-Control-Allow-Origin"] = "*" + if allow_credentials: + simple_headers["Access-Control-Allow-Credentials"] = "true" + if expose_headers: + simple_headers["Access-Control-Expose-Headers"] = ", ".join(expose_headers) + + preflight_headers = {} + if preflight_explicit_allow_origin: + # The origin value will be set in preflight_response() if it is allowed. + preflight_headers["Vary"] = "Origin" + else: + preflight_headers["Access-Control-Allow-Origin"] = "*" + preflight_headers.update( + { + "Access-Control-Allow-Methods": ", ".join(allow_methods), + "Access-Control-Max-Age": str(max_age), + } + ) + allow_headers = sorted(SAFELISTED_HEADERS | set(allow_headers)) + if allow_headers and not allow_all_headers: + preflight_headers["Access-Control-Allow-Headers"] = ", ".join(allow_headers) + if allow_credentials: + preflight_headers["Access-Control-Allow-Credentials"] = "true" + + self.app = app + self.allow_origins = allow_origins + self.allow_methods = allow_methods + self.allow_headers = [h.lower() for h in allow_headers] + self.allow_all_origins = allow_all_origins + self.allow_all_headers = allow_all_headers + self.preflight_explicit_allow_origin = preflight_explicit_allow_origin + self.allow_origin_regex = compiled_allow_origin_regex + self.simple_headers = simple_headers + self.preflight_headers = preflight_headers + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if scope["type"] != "http": # pragma: no cover + await self.app(scope, receive, send) + return + + method = scope["method"] + headers = Headers(scope=scope) + origin = headers.get("origin") + + if origin is None: + await self.app(scope, receive, send) + return + + if method == "OPTIONS" and "access-control-request-method" in headers: + response = self.preflight_response(request_headers=headers) + await response(scope, receive, send) + return + + await self.simple_response(scope, receive, send, request_headers=headers) + + def is_allowed_origin(self, origin: str) -> bool: + if self.allow_all_origins: + return True + + if self.allow_origin_regex is not None and self.allow_origin_regex.fullmatch(origin): + return True + + return origin in self.allow_origins + + def preflight_response(self, request_headers: Headers) -> Response: + requested_origin = request_headers["origin"] + requested_method = request_headers["access-control-request-method"] + requested_headers = request_headers.get("access-control-request-headers") + + headers = dict(self.preflight_headers) + failures = [] + + if self.is_allowed_origin(origin=requested_origin): + if self.preflight_explicit_allow_origin: + # The "else" case is already accounted for in self.preflight_headers + # and the value would be "*". + headers["Access-Control-Allow-Origin"] = requested_origin + else: + failures.append("origin") + + if requested_method not in self.allow_methods: + failures.append("method") + + # If we allow all headers, then we have to mirror back any requested + # headers in the response. + if self.allow_all_headers and requested_headers is not None: + headers["Access-Control-Allow-Headers"] = requested_headers + elif requested_headers is not None: + for header in [h.lower() for h in requested_headers.split(",")]: + if header.strip() not in self.allow_headers: + failures.append("headers") + break + + # We don't strictly need to use 400 responses here, since its up to + # the browser to enforce the CORS policy, but its more informative + # if we do. + if failures: + failure_text = "Disallowed CORS " + ", ".join(failures) + return PlainTextResponse(failure_text, status_code=400, headers=headers) + + return PlainTextResponse("OK", status_code=200, headers=headers) + + async def simple_response(self, scope: Scope, receive: Receive, send: Send, request_headers: Headers) -> None: + send = functools.partial(self.send, send=send, request_headers=request_headers) + await self.app(scope, receive, send) + + async def send(self, message: Message, send: Send, request_headers: Headers) -> None: + if message["type"] != "http.response.start": + await send(message) + return + + message.setdefault("headers", []) + headers = MutableHeaders(scope=message) + headers.update(self.simple_headers) + origin = request_headers["Origin"] + has_cookie = "cookie" in request_headers + + # If request includes any cookie headers, then we must respond + # with the specific origin instead of '*'. + if self.allow_all_origins and has_cookie: + self.allow_explicit_origin(headers, origin) + + # If we only allow specific origins, then we have to mirror back + # the Origin header in the response. + elif not self.allow_all_origins and self.is_allowed_origin(origin=origin): + self.allow_explicit_origin(headers, origin) + + await send(message) + + @staticmethod + def allow_explicit_origin(headers: MutableHeaders, origin: str) -> None: + headers["Access-Control-Allow-Origin"] = origin + headers.add_vary_header("Origin") diff --git a/venv/Lib/site-packages/starlette/middleware/errors.py b/venv/Lib/site-packages/starlette/middleware/errors.py new file mode 100644 index 00000000..76ad776b --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/errors.py @@ -0,0 +1,260 @@ +from __future__ import annotations + +import html +import inspect +import sys +import traceback +import typing + +from starlette._utils import is_async_callable +from starlette.concurrency import run_in_threadpool +from starlette.requests import Request +from starlette.responses import HTMLResponse, PlainTextResponse, Response +from starlette.types import ASGIApp, Message, Receive, Scope, Send + +STYLES = """ +p { + color: #211c1c; +} +.traceback-container { + border: 1px solid #038BB8; +} +.traceback-title { + background-color: #038BB8; + color: lemonchiffon; + padding: 12px; + font-size: 20px; + margin-top: 0px; +} +.frame-line { + padding-left: 10px; + font-family: monospace; +} +.frame-filename { + font-family: monospace; +} +.center-line { + background-color: #038BB8; + color: #f9f6e1; + padding: 5px 0px 5px 5px; +} +.lineno { + margin-right: 5px; +} +.frame-title { + font-weight: unset; + padding: 10px 10px 10px 10px; + background-color: #E4F4FD; + margin-right: 10px; + color: #191f21; + font-size: 17px; + border: 1px solid #c7dce8; +} +.collapse-btn { + float: right; + padding: 0px 5px 1px 5px; + border: solid 1px #96aebb; + cursor: pointer; +} +.collapsed { + display: none; +} +.source-code { + font-family: courier; + font-size: small; + padding-bottom: 10px; +} +""" + +JS = """ + +""" + +TEMPLATE = """ + + + + Starlette Debugger + + +

500 Server Error

+

{error}

+
+

Traceback

+
{exc_html}
+
+ {js} + + +""" + +FRAME_TEMPLATE = """ +
+

File {frame_filename}, + line {frame_lineno}, + in {frame_name} + {collapse_button} +

+
{code_context}
+
+""" # noqa: E501 + +LINE = """ +

+{lineno}. {line}

+""" + +CENTER_LINE = """ +

+{lineno}. {line}

+""" + + +class ServerErrorMiddleware: + """ + Handles returning 500 responses when a server error occurs. + + If 'debug' is set, then traceback responses will be returned, + otherwise the designated 'handler' will be called. + + This middleware class should generally be used to wrap *everything* + else up, so that unhandled exceptions anywhere in the stack + always result in an appropriate 500 response. + """ + + def __init__( + self, + app: ASGIApp, + handler: typing.Callable[[Request, Exception], typing.Any] | None = None, + debug: bool = False, + ) -> None: + self.app = app + self.handler = handler + self.debug = debug + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if scope["type"] != "http": + await self.app(scope, receive, send) + return + + response_started = False + + async def _send(message: Message) -> None: + nonlocal response_started, send + + if message["type"] == "http.response.start": + response_started = True + await send(message) + + try: + await self.app(scope, receive, _send) + except Exception as exc: + request = Request(scope) + if self.debug: + # In debug mode, return traceback responses. + response = self.debug_response(request, exc) + elif self.handler is None: + # Use our default 500 error handler. + response = self.error_response(request, exc) + else: + # Use an installed 500 error handler. + if is_async_callable(self.handler): + response = await self.handler(request, exc) + else: + response = await run_in_threadpool(self.handler, request, exc) + + if not response_started: + await response(scope, receive, send) + + # We always continue to raise the exception. + # This allows servers to log the error, or allows test clients + # to optionally raise the error within the test case. + raise exc + + def format_line(self, index: int, line: str, frame_lineno: int, frame_index: int) -> str: + values = { + # HTML escape - line could contain < or > + "line": html.escape(line).replace(" ", " "), + "lineno": (frame_lineno - frame_index) + index, + } + + if index != frame_index: + return LINE.format(**values) + return CENTER_LINE.format(**values) + + def generate_frame_html(self, frame: inspect.FrameInfo, is_collapsed: bool) -> str: + code_context = "".join( + self.format_line( + index, + line, + frame.lineno, + frame.index, # type: ignore[arg-type] + ) + for index, line in enumerate(frame.code_context or []) + ) + + values = { + # HTML escape - filename could contain < or >, especially if it's a virtual + # file e.g. in the REPL + "frame_filename": html.escape(frame.filename), + "frame_lineno": frame.lineno, + # HTML escape - if you try very hard it's possible to name a function with < + # or > + "frame_name": html.escape(frame.function), + "code_context": code_context, + "collapsed": "collapsed" if is_collapsed else "", + "collapse_button": "+" if is_collapsed else "‒", + } + return FRAME_TEMPLATE.format(**values) + + def generate_html(self, exc: Exception, limit: int = 7) -> str: + traceback_obj = traceback.TracebackException.from_exception(exc, capture_locals=True) + + exc_html = "" + is_collapsed = False + exc_traceback = exc.__traceback__ + if exc_traceback is not None: + frames = inspect.getinnerframes(exc_traceback, limit) + for frame in reversed(frames): + exc_html += self.generate_frame_html(frame, is_collapsed) + is_collapsed = True + + if sys.version_info >= (3, 13): # pragma: no cover + exc_type_str = traceback_obj.exc_type_str + else: # pragma: no cover + exc_type_str = traceback_obj.exc_type.__name__ + + # escape error class and text + error = f"{html.escape(exc_type_str)}: {html.escape(str(traceback_obj))}" + + return TEMPLATE.format(styles=STYLES, js=JS, error=error, exc_html=exc_html) + + def generate_plain_text(self, exc: Exception) -> str: + return "".join(traceback.format_exception(type(exc), exc, exc.__traceback__)) + + def debug_response(self, request: Request, exc: Exception) -> Response: + accept = request.headers.get("accept", "") + + if "text/html" in accept: + content = self.generate_html(exc) + return HTMLResponse(content, status_code=500) + content = self.generate_plain_text(exc) + return PlainTextResponse(content, status_code=500) + + def error_response(self, request: Request, exc: Exception) -> Response: + return PlainTextResponse("Internal Server Error", status_code=500) diff --git a/venv/Lib/site-packages/starlette/middleware/exceptions.py b/venv/Lib/site-packages/starlette/middleware/exceptions.py new file mode 100644 index 00000000..981d2fca --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/exceptions.py @@ -0,0 +1,72 @@ +from __future__ import annotations + +import typing + +from starlette._exception_handler import ( + ExceptionHandlers, + StatusHandlers, + wrap_app_handling_exceptions, +) +from starlette.exceptions import HTTPException, WebSocketException +from starlette.requests import Request +from starlette.responses import PlainTextResponse, Response +from starlette.types import ASGIApp, Receive, Scope, Send +from starlette.websockets import WebSocket + + +class ExceptionMiddleware: + def __init__( + self, + app: ASGIApp, + handlers: typing.Mapping[typing.Any, typing.Callable[[Request, Exception], Response]] | None = None, + debug: bool = False, + ) -> None: + self.app = app + self.debug = debug # TODO: We ought to handle 404 cases if debug is set. + self._status_handlers: StatusHandlers = {} + self._exception_handlers: ExceptionHandlers = { + HTTPException: self.http_exception, + WebSocketException: self.websocket_exception, + } + if handlers is not None: # pragma: no branch + for key, value in handlers.items(): + self.add_exception_handler(key, value) + + def add_exception_handler( + self, + exc_class_or_status_code: int | type[Exception], + handler: typing.Callable[[Request, Exception], Response], + ) -> None: + if isinstance(exc_class_or_status_code, int): + self._status_handlers[exc_class_or_status_code] = handler + else: + assert issubclass(exc_class_or_status_code, Exception) + self._exception_handlers[exc_class_or_status_code] = handler + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if scope["type"] not in ("http", "websocket"): + await self.app(scope, receive, send) + return + + scope["starlette.exception_handlers"] = ( + self._exception_handlers, + self._status_handlers, + ) + + conn: Request | WebSocket + if scope["type"] == "http": + conn = Request(scope, receive, send) + else: + conn = WebSocket(scope, receive, send) + + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + + def http_exception(self, request: Request, exc: Exception) -> Response: + assert isinstance(exc, HTTPException) + if exc.status_code in {204, 304}: + return Response(status_code=exc.status_code, headers=exc.headers) + return PlainTextResponse(exc.detail, status_code=exc.status_code, headers=exc.headers) + + async def websocket_exception(self, websocket: WebSocket, exc: Exception) -> None: + assert isinstance(exc, WebSocketException) + await websocket.close(code=exc.code, reason=exc.reason) # pragma: no cover diff --git a/venv/Lib/site-packages/starlette/middleware/gzip.py b/venv/Lib/site-packages/starlette/middleware/gzip.py new file mode 100644 index 00000000..c7fd5b77 --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/gzip.py @@ -0,0 +1,141 @@ +import gzip +import io +import typing + +from starlette.datastructures import Headers, MutableHeaders +from starlette.types import ASGIApp, Message, Receive, Scope, Send + +DEFAULT_EXCLUDED_CONTENT_TYPES = ("text/event-stream",) + + +class GZipMiddleware: + def __init__(self, app: ASGIApp, minimum_size: int = 500, compresslevel: int = 9) -> None: + self.app = app + self.minimum_size = minimum_size + self.compresslevel = compresslevel + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if scope["type"] != "http": # pragma: no cover + await self.app(scope, receive, send) + return + + headers = Headers(scope=scope) + responder: ASGIApp + if "gzip" in headers.get("Accept-Encoding", ""): + responder = GZipResponder(self.app, self.minimum_size, compresslevel=self.compresslevel) + else: + responder = IdentityResponder(self.app, self.minimum_size) + + await responder(scope, receive, send) + + +class IdentityResponder: + content_encoding: str + + def __init__(self, app: ASGIApp, minimum_size: int) -> None: + self.app = app + self.minimum_size = minimum_size + self.send: Send = unattached_send + self.initial_message: Message = {} + self.started = False + self.content_encoding_set = False + self.content_type_is_excluded = False + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + self.send = send + await self.app(scope, receive, self.send_with_compression) + + async def send_with_compression(self, message: Message) -> None: + message_type = message["type"] + if message_type == "http.response.start": + # Don't send the initial message until we've determined how to + # modify the outgoing headers correctly. + self.initial_message = message + headers = Headers(raw=self.initial_message["headers"]) + self.content_encoding_set = "content-encoding" in headers + self.content_type_is_excluded = headers.get("content-type", "").startswith(DEFAULT_EXCLUDED_CONTENT_TYPES) + elif message_type == "http.response.body" and (self.content_encoding_set or self.content_type_is_excluded): + if not self.started: + self.started = True + await self.send(self.initial_message) + await self.send(message) + elif message_type == "http.response.body" and not self.started: + self.started = True + body = message.get("body", b"") + more_body = message.get("more_body", False) + if len(body) < self.minimum_size and not more_body: + # Don't apply compression to small outgoing responses. + await self.send(self.initial_message) + await self.send(message) + elif not more_body: + # Standard response. + body = self.apply_compression(body, more_body=False) + + headers = MutableHeaders(raw=self.initial_message["headers"]) + headers.add_vary_header("Accept-Encoding") + if body != message["body"]: + headers["Content-Encoding"] = self.content_encoding + headers["Content-Length"] = str(len(body)) + message["body"] = body + + await self.send(self.initial_message) + await self.send(message) + else: + # Initial body in streaming response. + body = self.apply_compression(body, more_body=True) + + headers = MutableHeaders(raw=self.initial_message["headers"]) + headers.add_vary_header("Accept-Encoding") + if body != message["body"]: + headers["Content-Encoding"] = self.content_encoding + del headers["Content-Length"] + message["body"] = body + + await self.send(self.initial_message) + await self.send(message) + elif message_type == "http.response.body": # pragma: no branch + # Remaining body in streaming response. + body = message.get("body", b"") + more_body = message.get("more_body", False) + + message["body"] = self.apply_compression(body, more_body=more_body) + + await self.send(message) + + def apply_compression(self, body: bytes, *, more_body: bool) -> bytes: + """Apply compression on the response body. + + If more_body is False, any compression file should be closed. If it + isn't, it won't be closed automatically until all background tasks + complete. + """ + return body + + +class GZipResponder(IdentityResponder): + content_encoding = "gzip" + + def __init__(self, app: ASGIApp, minimum_size: int, compresslevel: int = 9) -> None: + super().__init__(app, minimum_size) + + self.gzip_buffer = io.BytesIO() + self.gzip_file = gzip.GzipFile(mode="wb", fileobj=self.gzip_buffer, compresslevel=compresslevel) + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + with self.gzip_buffer, self.gzip_file: + await super().__call__(scope, receive, send) + + def apply_compression(self, body: bytes, *, more_body: bool) -> bytes: + self.gzip_file.write(body) + if not more_body: + self.gzip_file.close() + + body = self.gzip_buffer.getvalue() + self.gzip_buffer.seek(0) + self.gzip_buffer.truncate() + + return body + + +async def unattached_send(message: Message) -> typing.NoReturn: + raise RuntimeError("send awaitable not set") # pragma: no cover diff --git a/venv/Lib/site-packages/starlette/middleware/httpsredirect.py b/venv/Lib/site-packages/starlette/middleware/httpsredirect.py new file mode 100644 index 00000000..a8359067 --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/httpsredirect.py @@ -0,0 +1,19 @@ +from starlette.datastructures import URL +from starlette.responses import RedirectResponse +from starlette.types import ASGIApp, Receive, Scope, Send + + +class HTTPSRedirectMiddleware: + def __init__(self, app: ASGIApp) -> None: + self.app = app + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if scope["type"] in ("http", "websocket") and scope["scheme"] in ("http", "ws"): + url = URL(scope=scope) + redirect_scheme = {"http": "https", "ws": "wss"}[url.scheme] + netloc = url.hostname if url.port in (80, 443) else url.netloc + url = url.replace(scheme=redirect_scheme, netloc=netloc) + response = RedirectResponse(url, status_code=307) + await response(scope, receive, send) + else: + await self.app(scope, receive, send) diff --git a/venv/Lib/site-packages/starlette/middleware/sessions.py b/venv/Lib/site-packages/starlette/middleware/sessions.py new file mode 100644 index 00000000..5f9fcd88 --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/sessions.py @@ -0,0 +1,85 @@ +from __future__ import annotations + +import json +import typing +from base64 import b64decode, b64encode + +import itsdangerous +from itsdangerous.exc import BadSignature + +from starlette.datastructures import MutableHeaders, Secret +from starlette.requests import HTTPConnection +from starlette.types import ASGIApp, Message, Receive, Scope, Send + + +class SessionMiddleware: + def __init__( + self, + app: ASGIApp, + secret_key: str | Secret, + session_cookie: str = "session", + max_age: int | None = 14 * 24 * 60 * 60, # 14 days, in seconds + path: str = "/", + same_site: typing.Literal["lax", "strict", "none"] = "lax", + https_only: bool = False, + domain: str | None = None, + ) -> None: + self.app = app + self.signer = itsdangerous.TimestampSigner(str(secret_key)) + self.session_cookie = session_cookie + self.max_age = max_age + self.path = path + self.security_flags = "httponly; samesite=" + same_site + if https_only: # Secure flag can be used with HTTPS only + self.security_flags += "; secure" + if domain is not None: + self.security_flags += f"; domain={domain}" + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if scope["type"] not in ("http", "websocket"): # pragma: no cover + await self.app(scope, receive, send) + return + + connection = HTTPConnection(scope) + initial_session_was_empty = True + + if self.session_cookie in connection.cookies: + data = connection.cookies[self.session_cookie].encode("utf-8") + try: + data = self.signer.unsign(data, max_age=self.max_age) + scope["session"] = json.loads(b64decode(data)) + initial_session_was_empty = False + except BadSignature: + scope["session"] = {} + else: + scope["session"] = {} + + async def send_wrapper(message: Message) -> None: + if message["type"] == "http.response.start": + if scope["session"]: + # We have session data to persist. + data = b64encode(json.dumps(scope["session"]).encode("utf-8")) + data = self.signer.sign(data) + headers = MutableHeaders(scope=message) + header_value = "{session_cookie}={data}; path={path}; {max_age}{security_flags}".format( + session_cookie=self.session_cookie, + data=data.decode("utf-8"), + path=self.path, + max_age=f"Max-Age={self.max_age}; " if self.max_age else "", + security_flags=self.security_flags, + ) + headers.append("Set-Cookie", header_value) + elif not initial_session_was_empty: + # The session has been cleared. + headers = MutableHeaders(scope=message) + header_value = "{session_cookie}={data}; path={path}; {expires}{security_flags}".format( + session_cookie=self.session_cookie, + data="null", + path=self.path, + expires="expires=Thu, 01 Jan 1970 00:00:00 GMT; ", + security_flags=self.security_flags, + ) + headers.append("Set-Cookie", header_value) + await send(message) + + await self.app(scope, receive, send_wrapper) diff --git a/venv/Lib/site-packages/starlette/middleware/trustedhost.py b/venv/Lib/site-packages/starlette/middleware/trustedhost.py new file mode 100644 index 00000000..2d1c999e --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/trustedhost.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +import typing + +from starlette.datastructures import URL, Headers +from starlette.responses import PlainTextResponse, RedirectResponse, Response +from starlette.types import ASGIApp, Receive, Scope, Send + +ENFORCE_DOMAIN_WILDCARD = "Domain wildcard patterns must be like '*.example.com'." + + +class TrustedHostMiddleware: + def __init__( + self, + app: ASGIApp, + allowed_hosts: typing.Sequence[str] | None = None, + www_redirect: bool = True, + ) -> None: + if allowed_hosts is None: + allowed_hosts = ["*"] + + for pattern in allowed_hosts: + assert "*" not in pattern[1:], ENFORCE_DOMAIN_WILDCARD + if pattern.startswith("*") and pattern != "*": + assert pattern.startswith("*."), ENFORCE_DOMAIN_WILDCARD + self.app = app + self.allowed_hosts = list(allowed_hosts) + self.allow_any = "*" in allowed_hosts + self.www_redirect = www_redirect + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + if self.allow_any or scope["type"] not in ( + "http", + "websocket", + ): # pragma: no cover + await self.app(scope, receive, send) + return + + headers = Headers(scope=scope) + host = headers.get("host", "").split(":")[0] + is_valid_host = False + found_www_redirect = False + for pattern in self.allowed_hosts: + if host == pattern or (pattern.startswith("*") and host.endswith(pattern[1:])): + is_valid_host = True + break + elif "www." + host == pattern: + found_www_redirect = True + + if is_valid_host: + await self.app(scope, receive, send) + else: + response: Response + if found_www_redirect and self.www_redirect: + url = URL(scope=scope) + redirect_url = url.replace(netloc="www." + url.netloc) + response = RedirectResponse(url=str(redirect_url)) + else: + response = PlainTextResponse("Invalid host header", status_code=400) + await response(scope, receive, send) diff --git a/venv/Lib/site-packages/starlette/middleware/wsgi.py b/venv/Lib/site-packages/starlette/middleware/wsgi.py new file mode 100644 index 00000000..6e0a3fae --- /dev/null +++ b/venv/Lib/site-packages/starlette/middleware/wsgi.py @@ -0,0 +1,152 @@ +from __future__ import annotations + +import io +import math +import sys +import typing +import warnings + +import anyio +from anyio.abc import ObjectReceiveStream, ObjectSendStream + +from starlette.types import Receive, Scope, Send + +warnings.warn( + "starlette.middleware.wsgi is deprecated and will be removed in a future release. " + "Please refer to https://github.com/abersheeran/a2wsgi as a replacement.", + DeprecationWarning, +) + + +def build_environ(scope: Scope, body: bytes) -> dict[str, typing.Any]: + """ + Builds a scope and request body into a WSGI environ object. + """ + + script_name = scope.get("root_path", "").encode("utf8").decode("latin1") + path_info = scope["path"].encode("utf8").decode("latin1") + if path_info.startswith(script_name): + path_info = path_info[len(script_name) :] + + environ = { + "REQUEST_METHOD": scope["method"], + "SCRIPT_NAME": script_name, + "PATH_INFO": path_info, + "QUERY_STRING": scope["query_string"].decode("ascii"), + "SERVER_PROTOCOL": f"HTTP/{scope['http_version']}", + "wsgi.version": (1, 0), + "wsgi.url_scheme": scope.get("scheme", "http"), + "wsgi.input": io.BytesIO(body), + "wsgi.errors": sys.stdout, + "wsgi.multithread": True, + "wsgi.multiprocess": True, + "wsgi.run_once": False, + } + + # Get server name and port - required in WSGI, not in ASGI + server = scope.get("server") or ("localhost", 80) + environ["SERVER_NAME"] = server[0] + environ["SERVER_PORT"] = server[1] + + # Get client IP address + if scope.get("client"): + environ["REMOTE_ADDR"] = scope["client"][0] + + # Go through headers and make them into environ entries + for name, value in scope.get("headers", []): + name = name.decode("latin1") + if name == "content-length": + corrected_name = "CONTENT_LENGTH" + elif name == "content-type": + corrected_name = "CONTENT_TYPE" + else: + corrected_name = f"HTTP_{name}".upper().replace("-", "_") + # HTTPbis say only ASCII chars are allowed in headers, but we latin1 just in + # case + value = value.decode("latin1") + if corrected_name in environ: + value = environ[corrected_name] + "," + value + environ[corrected_name] = value + return environ + + +class WSGIMiddleware: + def __init__(self, app: typing.Callable[..., typing.Any]) -> None: + self.app = app + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + assert scope["type"] == "http" + responder = WSGIResponder(self.app, scope) + await responder(receive, send) + + +class WSGIResponder: + stream_send: ObjectSendStream[typing.MutableMapping[str, typing.Any]] + stream_receive: ObjectReceiveStream[typing.MutableMapping[str, typing.Any]] + + def __init__(self, app: typing.Callable[..., typing.Any], scope: Scope) -> None: + self.app = app + self.scope = scope + self.status = None + self.response_headers = None + self.stream_send, self.stream_receive = anyio.create_memory_object_stream(math.inf) + self.response_started = False + self.exc_info: typing.Any = None + + async def __call__(self, receive: Receive, send: Send) -> None: + body = b"" + more_body = True + while more_body: + message = await receive() + body += message.get("body", b"") + more_body = message.get("more_body", False) + environ = build_environ(self.scope, body) + + async with anyio.create_task_group() as task_group: + task_group.start_soon(self.sender, send) + async with self.stream_send: + await anyio.to_thread.run_sync(self.wsgi, environ, self.start_response) + if self.exc_info is not None: + raise self.exc_info[0].with_traceback(self.exc_info[1], self.exc_info[2]) + + async def sender(self, send: Send) -> None: + async with self.stream_receive: + async for message in self.stream_receive: + await send(message) + + def start_response( + self, + status: str, + response_headers: list[tuple[str, str]], + exc_info: typing.Any = None, + ) -> None: + self.exc_info = exc_info + if not self.response_started: # pragma: no branch + self.response_started = True + status_code_string, _ = status.split(" ", 1) + status_code = int(status_code_string) + headers = [ + (name.strip().encode("ascii").lower(), value.strip().encode("ascii")) + for name, value in response_headers + ] + anyio.from_thread.run( + self.stream_send.send, + { + "type": "http.response.start", + "status": status_code, + "headers": headers, + }, + ) + + def wsgi( + self, + environ: dict[str, typing.Any], + start_response: typing.Callable[..., typing.Any], + ) -> None: + for chunk in self.app(environ, start_response): + anyio.from_thread.run( + self.stream_send.send, + {"type": "http.response.body", "body": chunk, "more_body": True}, + ) + + anyio.from_thread.run(self.stream_send.send, {"type": "http.response.body", "body": b""}) diff --git a/venv/Lib/site-packages/starlette/py.typed b/venv/Lib/site-packages/starlette/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/starlette/requests.py b/venv/Lib/site-packages/starlette/requests.py new file mode 100644 index 00000000..7dc04a74 --- /dev/null +++ b/venv/Lib/site-packages/starlette/requests.py @@ -0,0 +1,322 @@ +from __future__ import annotations + +import json +import typing +from http import cookies as http_cookies + +import anyio + +from starlette._utils import AwaitableOrContextManager, AwaitableOrContextManagerWrapper +from starlette.datastructures import URL, Address, FormData, Headers, QueryParams, State +from starlette.exceptions import HTTPException +from starlette.formparsers import FormParser, MultiPartException, MultiPartParser +from starlette.types import Message, Receive, Scope, Send + +if typing.TYPE_CHECKING: + from python_multipart.multipart import parse_options_header + + from starlette.applications import Starlette + from starlette.routing import Router +else: + try: + try: + from python_multipart.multipart import parse_options_header + except ModuleNotFoundError: # pragma: no cover + from multipart.multipart import parse_options_header + except ModuleNotFoundError: # pragma: no cover + parse_options_header = None + + +SERVER_PUSH_HEADERS_TO_COPY = { + "accept", + "accept-encoding", + "accept-language", + "cache-control", + "user-agent", +} + + +def cookie_parser(cookie_string: str) -> dict[str, str]: + """ + This function parses a ``Cookie`` HTTP header into a dict of key/value pairs. + + It attempts to mimic browser cookie parsing behavior: browsers and web servers + frequently disregard the spec (RFC 6265) when setting and reading cookies, + so we attempt to suit the common scenarios here. + + This function has been adapted from Django 3.1.0. + Note: we are explicitly _NOT_ using `SimpleCookie.load` because it is based + on an outdated spec and will fail on lots of input we want to support + """ + cookie_dict: dict[str, str] = {} + for chunk in cookie_string.split(";"): + if "=" in chunk: + key, val = chunk.split("=", 1) + else: + # Assume an empty name per + # https://bugzilla.mozilla.org/show_bug.cgi?id=169091 + key, val = "", chunk + key, val = key.strip(), val.strip() + if key or val: + # unquote using Python's algorithm. + cookie_dict[key] = http_cookies._unquote(val) + return cookie_dict + + +class ClientDisconnect(Exception): + pass + + +class HTTPConnection(typing.Mapping[str, typing.Any]): + """ + A base class for incoming HTTP connections, that is used to provide + any functionality that is common to both `Request` and `WebSocket`. + """ + + def __init__(self, scope: Scope, receive: Receive | None = None) -> None: + assert scope["type"] in ("http", "websocket") + self.scope = scope + + def __getitem__(self, key: str) -> typing.Any: + return self.scope[key] + + def __iter__(self) -> typing.Iterator[str]: + return iter(self.scope) + + def __len__(self) -> int: + return len(self.scope) + + # Don't use the `abc.Mapping.__eq__` implementation. + # Connection instances should never be considered equal + # unless `self is other`. + __eq__ = object.__eq__ + __hash__ = object.__hash__ + + @property + def app(self) -> typing.Any: + return self.scope["app"] + + @property + def url(self) -> URL: + if not hasattr(self, "_url"): # pragma: no branch + self._url = URL(scope=self.scope) + return self._url + + @property + def base_url(self) -> URL: + if not hasattr(self, "_base_url"): + base_url_scope = dict(self.scope) + # This is used by request.url_for, it might be used inside a Mount which + # would have its own child scope with its own root_path, but the base URL + # for url_for should still be the top level app root path. + app_root_path = base_url_scope.get("app_root_path", base_url_scope.get("root_path", "")) + path = app_root_path + if not path.endswith("/"): + path += "/" + base_url_scope["path"] = path + base_url_scope["query_string"] = b"" + base_url_scope["root_path"] = app_root_path + self._base_url = URL(scope=base_url_scope) + return self._base_url + + @property + def headers(self) -> Headers: + if not hasattr(self, "_headers"): + self._headers = Headers(scope=self.scope) + return self._headers + + @property + def query_params(self) -> QueryParams: + if not hasattr(self, "_query_params"): # pragma: no branch + self._query_params = QueryParams(self.scope["query_string"]) + return self._query_params + + @property + def path_params(self) -> dict[str, typing.Any]: + return self.scope.get("path_params", {}) + + @property + def cookies(self) -> dict[str, str]: + if not hasattr(self, "_cookies"): + cookies: dict[str, str] = {} + cookie_header = self.headers.get("cookie") + + if cookie_header: + cookies = cookie_parser(cookie_header) + self._cookies = cookies + return self._cookies + + @property + def client(self) -> Address | None: + # client is a 2 item tuple of (host, port), None if missing + host_port = self.scope.get("client") + if host_port is not None: + return Address(*host_port) + return None + + @property + def session(self) -> dict[str, typing.Any]: + assert "session" in self.scope, "SessionMiddleware must be installed to access request.session" + return self.scope["session"] # type: ignore[no-any-return] + + @property + def auth(self) -> typing.Any: + assert "auth" in self.scope, "AuthenticationMiddleware must be installed to access request.auth" + return self.scope["auth"] + + @property + def user(self) -> typing.Any: + assert "user" in self.scope, "AuthenticationMiddleware must be installed to access request.user" + return self.scope["user"] + + @property + def state(self) -> State: + if not hasattr(self, "_state"): + # Ensure 'state' has an empty dict if it's not already populated. + self.scope.setdefault("state", {}) + # Create a state instance with a reference to the dict in which it should + # store info + self._state = State(self.scope["state"]) + return self._state + + def url_for(self, name: str, /, **path_params: typing.Any) -> URL: + url_path_provider: Router | Starlette | None = self.scope.get("router") or self.scope.get("app") + if url_path_provider is None: + raise RuntimeError("The `url_for` method can only be used inside a Starlette application or with a router.") + url_path = url_path_provider.url_path_for(name, **path_params) + return url_path.make_absolute_url(base_url=self.base_url) + + +async def empty_receive() -> typing.NoReturn: + raise RuntimeError("Receive channel has not been made available") + + +async def empty_send(message: Message) -> typing.NoReturn: + raise RuntimeError("Send channel has not been made available") + + +class Request(HTTPConnection): + _form: FormData | None + + def __init__(self, scope: Scope, receive: Receive = empty_receive, send: Send = empty_send): + super().__init__(scope) + assert scope["type"] == "http" + self._receive = receive + self._send = send + self._stream_consumed = False + self._is_disconnected = False + self._form = None + + @property + def method(self) -> str: + return typing.cast(str, self.scope["method"]) + + @property + def receive(self) -> Receive: + return self._receive + + async def stream(self) -> typing.AsyncGenerator[bytes, None]: + if hasattr(self, "_body"): + yield self._body + yield b"" + return + if self._stream_consumed: + raise RuntimeError("Stream consumed") + while not self._stream_consumed: + message = await self._receive() + if message["type"] == "http.request": + body = message.get("body", b"") + if not message.get("more_body", False): + self._stream_consumed = True + if body: + yield body + elif message["type"] == "http.disconnect": # pragma: no branch + self._is_disconnected = True + raise ClientDisconnect() + yield b"" + + async def body(self) -> bytes: + if not hasattr(self, "_body"): + chunks: list[bytes] = [] + async for chunk in self.stream(): + chunks.append(chunk) + self._body = b"".join(chunks) + return self._body + + async def json(self) -> typing.Any: + if not hasattr(self, "_json"): # pragma: no branch + body = await self.body() + self._json = json.loads(body) + return self._json + + async def _get_form( + self, + *, + max_files: int | float = 1000, + max_fields: int | float = 1000, + max_part_size: int = 1024 * 1024, + ) -> FormData: + if self._form is None: # pragma: no branch + assert parse_options_header is not None, ( + "The `python-multipart` library must be installed to use form parsing." + ) + content_type_header = self.headers.get("Content-Type") + content_type: bytes + content_type, _ = parse_options_header(content_type_header) + if content_type == b"multipart/form-data": + try: + multipart_parser = MultiPartParser( + self.headers, + self.stream(), + max_files=max_files, + max_fields=max_fields, + max_part_size=max_part_size, + ) + self._form = await multipart_parser.parse() + except MultiPartException as exc: + if "app" in self.scope: + raise HTTPException(status_code=400, detail=exc.message) + raise exc + elif content_type == b"application/x-www-form-urlencoded": + form_parser = FormParser(self.headers, self.stream()) + self._form = await form_parser.parse() + else: + self._form = FormData() + return self._form + + def form( + self, + *, + max_files: int | float = 1000, + max_fields: int | float = 1000, + max_part_size: int = 1024 * 1024, + ) -> AwaitableOrContextManager[FormData]: + return AwaitableOrContextManagerWrapper( + self._get_form(max_files=max_files, max_fields=max_fields, max_part_size=max_part_size) + ) + + async def close(self) -> None: + if self._form is not None: # pragma: no branch + await self._form.close() + + async def is_disconnected(self) -> bool: + if not self._is_disconnected: + message: Message = {} + + # If message isn't immediately available, move on + with anyio.CancelScope() as cs: + cs.cancel() + message = await self._receive() + + if message.get("type") == "http.disconnect": + self._is_disconnected = True + + return self._is_disconnected + + async def send_push_promise(self, path: str) -> None: + if "http.response.push" in self.scope.get("extensions", {}): + raw_headers: list[tuple[bytes, bytes]] = [] + for name in SERVER_PUSH_HEADERS_TO_COPY: + for value in self.headers.getlist(name): + raw_headers.append((name.encode("latin-1"), value.encode("latin-1"))) + await self._send({"type": "http.response.push", "path": path, "headers": raw_headers}) diff --git a/venv/Lib/site-packages/starlette/responses.py b/venv/Lib/site-packages/starlette/responses.py new file mode 100644 index 00000000..81e89fae --- /dev/null +++ b/venv/Lib/site-packages/starlette/responses.py @@ -0,0 +1,536 @@ +from __future__ import annotations + +import hashlib +import http.cookies +import json +import os +import re +import stat +import typing +import warnings +from datetime import datetime +from email.utils import format_datetime, formatdate +from functools import partial +from mimetypes import guess_type +from secrets import token_hex +from urllib.parse import quote + +import anyio +import anyio.to_thread + +from starlette._utils import collapse_excgroups +from starlette.background import BackgroundTask +from starlette.concurrency import iterate_in_threadpool +from starlette.datastructures import URL, Headers, MutableHeaders +from starlette.requests import ClientDisconnect +from starlette.types import Receive, Scope, Send + + +class Response: + media_type = None + charset = "utf-8" + + def __init__( + self, + content: typing.Any = None, + status_code: int = 200, + headers: typing.Mapping[str, str] | None = None, + media_type: str | None = None, + background: BackgroundTask | None = None, + ) -> None: + self.status_code = status_code + if media_type is not None: + self.media_type = media_type + self.background = background + self.body = self.render(content) + self.init_headers(headers) + + def render(self, content: typing.Any) -> bytes | memoryview: + if content is None: + return b"" + if isinstance(content, (bytes, memoryview)): + return content + return content.encode(self.charset) # type: ignore + + def init_headers(self, headers: typing.Mapping[str, str] | None = None) -> None: + if headers is None: + raw_headers: list[tuple[bytes, bytes]] = [] + populate_content_length = True + populate_content_type = True + else: + raw_headers = [(k.lower().encode("latin-1"), v.encode("latin-1")) for k, v in headers.items()] + keys = [h[0] for h in raw_headers] + populate_content_length = b"content-length" not in keys + populate_content_type = b"content-type" not in keys + + body = getattr(self, "body", None) + if ( + body is not None + and populate_content_length + and not (self.status_code < 200 or self.status_code in (204, 304)) + ): + content_length = str(len(body)) + raw_headers.append((b"content-length", content_length.encode("latin-1"))) + + content_type = self.media_type + if content_type is not None and populate_content_type: + if content_type.startswith("text/") and "charset=" not in content_type.lower(): + content_type += "; charset=" + self.charset + raw_headers.append((b"content-type", content_type.encode("latin-1"))) + + self.raw_headers = raw_headers + + @property + def headers(self) -> MutableHeaders: + if not hasattr(self, "_headers"): + self._headers = MutableHeaders(raw=self.raw_headers) + return self._headers + + def set_cookie( + self, + key: str, + value: str = "", + max_age: int | None = None, + expires: datetime | str | int | None = None, + path: str | None = "/", + domain: str | None = None, + secure: bool = False, + httponly: bool = False, + samesite: typing.Literal["lax", "strict", "none"] | None = "lax", + ) -> None: + cookie: http.cookies.BaseCookie[str] = http.cookies.SimpleCookie() + cookie[key] = value + if max_age is not None: + cookie[key]["max-age"] = max_age + if expires is not None: + if isinstance(expires, datetime): + cookie[key]["expires"] = format_datetime(expires, usegmt=True) + else: + cookie[key]["expires"] = expires + if path is not None: + cookie[key]["path"] = path + if domain is not None: + cookie[key]["domain"] = domain + if secure: + cookie[key]["secure"] = True + if httponly: + cookie[key]["httponly"] = True + if samesite is not None: + assert samesite.lower() in [ + "strict", + "lax", + "none", + ], "samesite must be either 'strict', 'lax' or 'none'" + cookie[key]["samesite"] = samesite + cookie_val = cookie.output(header="").strip() + self.raw_headers.append((b"set-cookie", cookie_val.encode("latin-1"))) + + def delete_cookie( + self, + key: str, + path: str = "/", + domain: str | None = None, + secure: bool = False, + httponly: bool = False, + samesite: typing.Literal["lax", "strict", "none"] | None = "lax", + ) -> None: + self.set_cookie( + key, + max_age=0, + expires=0, + path=path, + domain=domain, + secure=secure, + httponly=httponly, + samesite=samesite, + ) + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + prefix = "websocket." if scope["type"] == "websocket" else "" + await send( + { + "type": prefix + "http.response.start", + "status": self.status_code, + "headers": self.raw_headers, + } + ) + await send({"type": prefix + "http.response.body", "body": self.body}) + + if self.background is not None: + await self.background() + + +class HTMLResponse(Response): + media_type = "text/html" + + +class PlainTextResponse(Response): + media_type = "text/plain" + + +class JSONResponse(Response): + media_type = "application/json" + + def __init__( + self, + content: typing.Any, + status_code: int = 200, + headers: typing.Mapping[str, str] | None = None, + media_type: str | None = None, + background: BackgroundTask | None = None, + ) -> None: + super().__init__(content, status_code, headers, media_type, background) + + def render(self, content: typing.Any) -> bytes: + return json.dumps( + content, + ensure_ascii=False, + allow_nan=False, + indent=None, + separators=(",", ":"), + ).encode("utf-8") + + +class RedirectResponse(Response): + def __init__( + self, + url: str | URL, + status_code: int = 307, + headers: typing.Mapping[str, str] | None = None, + background: BackgroundTask | None = None, + ) -> None: + super().__init__(content=b"", status_code=status_code, headers=headers, background=background) + self.headers["location"] = quote(str(url), safe=":/%#?=@[]!$&'()*+,;") + + +Content = typing.Union[str, bytes, memoryview] +SyncContentStream = typing.Iterable[Content] +AsyncContentStream = typing.AsyncIterable[Content] +ContentStream = typing.Union[AsyncContentStream, SyncContentStream] + + +class StreamingResponse(Response): + body_iterator: AsyncContentStream + + def __init__( + self, + content: ContentStream, + status_code: int = 200, + headers: typing.Mapping[str, str] | None = None, + media_type: str | None = None, + background: BackgroundTask | None = None, + ) -> None: + if isinstance(content, typing.AsyncIterable): + self.body_iterator = content + else: + self.body_iterator = iterate_in_threadpool(content) + self.status_code = status_code + self.media_type = self.media_type if media_type is None else media_type + self.background = background + self.init_headers(headers) + + async def listen_for_disconnect(self, receive: Receive) -> None: + while True: + message = await receive() + if message["type"] == "http.disconnect": + break + + async def stream_response(self, send: Send) -> None: + await send( + { + "type": "http.response.start", + "status": self.status_code, + "headers": self.raw_headers, + } + ) + async for chunk in self.body_iterator: + if not isinstance(chunk, (bytes, memoryview)): + chunk = chunk.encode(self.charset) + await send({"type": "http.response.body", "body": chunk, "more_body": True}) + + await send({"type": "http.response.body", "body": b"", "more_body": False}) + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + spec_version = tuple(map(int, scope.get("asgi", {}).get("spec_version", "2.0").split("."))) + + if spec_version >= (2, 4): + try: + await self.stream_response(send) + except OSError: + raise ClientDisconnect() + else: + with collapse_excgroups(): + async with anyio.create_task_group() as task_group: + + async def wrap(func: typing.Callable[[], typing.Awaitable[None]]) -> None: + await func() + task_group.cancel_scope.cancel() + + task_group.start_soon(wrap, partial(self.stream_response, send)) + await wrap(partial(self.listen_for_disconnect, receive)) + + if self.background is not None: + await self.background() + + +class MalformedRangeHeader(Exception): + def __init__(self, content: str = "Malformed range header.") -> None: + self.content = content + + +class RangeNotSatisfiable(Exception): + def __init__(self, max_size: int) -> None: + self.max_size = max_size + + +_RANGE_PATTERN = re.compile(r"(\d*)-(\d*)") + + +class FileResponse(Response): + chunk_size = 64 * 1024 + + def __init__( + self, + path: str | os.PathLike[str], + status_code: int = 200, + headers: typing.Mapping[str, str] | None = None, + media_type: str | None = None, + background: BackgroundTask | None = None, + filename: str | None = None, + stat_result: os.stat_result | None = None, + method: str | None = None, + content_disposition_type: str = "attachment", + ) -> None: + self.path = path + self.status_code = status_code + self.filename = filename + if method is not None: + warnings.warn( + "The 'method' parameter is not used, and it will be removed.", + DeprecationWarning, + ) + if media_type is None: + media_type = guess_type(filename or path)[0] or "text/plain" + self.media_type = media_type + self.background = background + self.init_headers(headers) + self.headers.setdefault("accept-ranges", "bytes") + if self.filename is not None: + content_disposition_filename = quote(self.filename) + if content_disposition_filename != self.filename: + content_disposition = f"{content_disposition_type}; filename*=utf-8''{content_disposition_filename}" + else: + content_disposition = f'{content_disposition_type}; filename="{self.filename}"' + self.headers.setdefault("content-disposition", content_disposition) + self.stat_result = stat_result + if stat_result is not None: + self.set_stat_headers(stat_result) + + def set_stat_headers(self, stat_result: os.stat_result) -> None: + content_length = str(stat_result.st_size) + last_modified = formatdate(stat_result.st_mtime, usegmt=True) + etag_base = str(stat_result.st_mtime) + "-" + str(stat_result.st_size) + etag = f'"{hashlib.md5(etag_base.encode(), usedforsecurity=False).hexdigest()}"' + + self.headers.setdefault("content-length", content_length) + self.headers.setdefault("last-modified", last_modified) + self.headers.setdefault("etag", etag) + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + send_header_only: bool = scope["method"].upper() == "HEAD" + if self.stat_result is None: + try: + stat_result = await anyio.to_thread.run_sync(os.stat, self.path) + self.set_stat_headers(stat_result) + except FileNotFoundError: + raise RuntimeError(f"File at path {self.path} does not exist.") + else: + mode = stat_result.st_mode + if not stat.S_ISREG(mode): + raise RuntimeError(f"File at path {self.path} is not a file.") + else: + stat_result = self.stat_result + + headers = Headers(scope=scope) + http_range = headers.get("range") + http_if_range = headers.get("if-range") + + if http_range is None or (http_if_range is not None and not self._should_use_range(http_if_range)): + await self._handle_simple(send, send_header_only) + else: + try: + ranges = self._parse_range_header(http_range, stat_result.st_size) + except MalformedRangeHeader as exc: + return await PlainTextResponse(exc.content, status_code=400)(scope, receive, send) + except RangeNotSatisfiable as exc: + response = PlainTextResponse(status_code=416, headers={"Content-Range": f"*/{exc.max_size}"}) + return await response(scope, receive, send) + + if len(ranges) == 1: + start, end = ranges[0] + await self._handle_single_range(send, start, end, stat_result.st_size, send_header_only) + else: + await self._handle_multiple_ranges(send, ranges, stat_result.st_size, send_header_only) + + if self.background is not None: + await self.background() + + async def _handle_simple(self, send: Send, send_header_only: bool) -> None: + await send({"type": "http.response.start", "status": self.status_code, "headers": self.raw_headers}) + if send_header_only: + await send({"type": "http.response.body", "body": b"", "more_body": False}) + else: + async with await anyio.open_file(self.path, mode="rb") as file: + more_body = True + while more_body: + chunk = await file.read(self.chunk_size) + more_body = len(chunk) == self.chunk_size + await send({"type": "http.response.body", "body": chunk, "more_body": more_body}) + + async def _handle_single_range( + self, send: Send, start: int, end: int, file_size: int, send_header_only: bool + ) -> None: + self.headers["content-range"] = f"bytes {start}-{end - 1}/{file_size}" + self.headers["content-length"] = str(end - start) + await send({"type": "http.response.start", "status": 206, "headers": self.raw_headers}) + if send_header_only: + await send({"type": "http.response.body", "body": b"", "more_body": False}) + else: + async with await anyio.open_file(self.path, mode="rb") as file: + await file.seek(start) + more_body = True + while more_body: + chunk = await file.read(min(self.chunk_size, end - start)) + start += len(chunk) + more_body = len(chunk) == self.chunk_size and start < end + await send({"type": "http.response.body", "body": chunk, "more_body": more_body}) + + async def _handle_multiple_ranges( + self, + send: Send, + ranges: list[tuple[int, int]], + file_size: int, + send_header_only: bool, + ) -> None: + # In firefox and chrome, they use boundary with 95-96 bits entropy (that's roughly 13 bytes). + boundary = token_hex(13) + content_length, header_generator = self.generate_multipart( + ranges, boundary, file_size, self.headers["content-type"] + ) + self.headers["content-range"] = f"multipart/byteranges; boundary={boundary}" + self.headers["content-length"] = str(content_length) + await send({"type": "http.response.start", "status": 206, "headers": self.raw_headers}) + if send_header_only: + await send({"type": "http.response.body", "body": b"", "more_body": False}) + else: + async with await anyio.open_file(self.path, mode="rb") as file: + for start, end in ranges: + await send({"type": "http.response.body", "body": header_generator(start, end), "more_body": True}) + await file.seek(start) + while start < end: + chunk = await file.read(min(self.chunk_size, end - start)) + start += len(chunk) + await send({"type": "http.response.body", "body": chunk, "more_body": True}) + await send({"type": "http.response.body", "body": b"\n", "more_body": True}) + await send( + { + "type": "http.response.body", + "body": f"\n--{boundary}--\n".encode("latin-1"), + "more_body": False, + } + ) + + def _should_use_range(self, http_if_range: str) -> bool: + return http_if_range == self.headers["last-modified"] or http_if_range == self.headers["etag"] + + @staticmethod + def _parse_range_header(http_range: str, file_size: int) -> list[tuple[int, int]]: + ranges: list[tuple[int, int]] = [] + try: + units, range_ = http_range.split("=", 1) + except ValueError: + raise MalformedRangeHeader() + + units = units.strip().lower() + + if units != "bytes": + raise MalformedRangeHeader("Only support bytes range") + + ranges = [ + ( + int(_[0]) if _[0] else file_size - int(_[1]), + int(_[1]) + 1 if _[0] and _[1] and int(_[1]) < file_size else file_size, + ) + for _ in _RANGE_PATTERN.findall(range_) + if _ != ("", "") + ] + + if len(ranges) == 0: + raise MalformedRangeHeader("Range header: range must be requested") + + if any(not (0 <= start < file_size) for start, _ in ranges): + raise RangeNotSatisfiable(file_size) + + if any(start > end for start, end in ranges): + raise MalformedRangeHeader("Range header: start must be less than end") + + if len(ranges) == 1: + return ranges + + # Merge ranges + result: list[tuple[int, int]] = [] + for start, end in ranges: + for p in range(len(result)): + p_start, p_end = result[p] + if start > p_end: + continue + elif end < p_start: + result.insert(p, (start, end)) # THIS IS NOT REACHED! + break + else: + result[p] = (min(start, p_start), max(end, p_end)) + break + else: + result.append((start, end)) + + return result + + def generate_multipart( + self, + ranges: typing.Sequence[tuple[int, int]], + boundary: str, + max_size: int, + content_type: str, + ) -> tuple[int, typing.Callable[[int, int], bytes]]: + r""" + Multipart response headers generator. + + ``` + --{boundary}\n + Content-Type: {content_type}\n + Content-Range: bytes {start}-{end-1}/{max_size}\n + \n + ..........content...........\n + --{boundary}\n + Content-Type: {content_type}\n + Content-Range: bytes {start}-{end-1}/{max_size}\n + \n + ..........content...........\n + --{boundary}--\n + ``` + """ + boundary_len = len(boundary) + static_header_part_len = 44 + boundary_len + len(content_type) + len(str(max_size)) + content_length = sum( + (len(str(start)) + len(str(end - 1)) + static_header_part_len) # Headers + + (end - start) # Content + for start, end in ranges + ) + ( + 5 + boundary_len # --boundary--\n + ) + return ( + content_length, + lambda start, end: ( + f"--{boundary}\nContent-Type: {content_type}\nContent-Range: bytes {start}-{end - 1}/{max_size}\n\n" + ).encode("latin-1"), + ) diff --git a/venv/Lib/site-packages/starlette/routing.py b/venv/Lib/site-packages/starlette/routing.py new file mode 100644 index 00000000..add7df0c --- /dev/null +++ b/venv/Lib/site-packages/starlette/routing.py @@ -0,0 +1,874 @@ +from __future__ import annotations + +import contextlib +import functools +import inspect +import re +import traceback +import types +import typing +import warnings +from contextlib import asynccontextmanager +from enum import Enum + +from starlette._exception_handler import wrap_app_handling_exceptions +from starlette._utils import get_route_path, is_async_callable +from starlette.concurrency import run_in_threadpool +from starlette.convertors import CONVERTOR_TYPES, Convertor +from starlette.datastructures import URL, Headers, URLPath +from starlette.exceptions import HTTPException +from starlette.middleware import Middleware +from starlette.requests import Request +from starlette.responses import PlainTextResponse, RedirectResponse, Response +from starlette.types import ASGIApp, Lifespan, Receive, Scope, Send +from starlette.websockets import WebSocket, WebSocketClose + + +class NoMatchFound(Exception): + """ + Raised by `.url_for(name, **path_params)` and `.url_path_for(name, **path_params)` + if no matching route exists. + """ + + def __init__(self, name: str, path_params: dict[str, typing.Any]) -> None: + params = ", ".join(list(path_params.keys())) + super().__init__(f'No route exists for name "{name}" and params "{params}".') + + +class Match(Enum): + NONE = 0 + PARTIAL = 1 + FULL = 2 + + +def iscoroutinefunction_or_partial(obj: typing.Any) -> bool: # pragma: no cover + """ + Correctly determines if an object is a coroutine function, + including those wrapped in functools.partial objects. + """ + warnings.warn( + "iscoroutinefunction_or_partial is deprecated, and will be removed in a future release.", + DeprecationWarning, + ) + while isinstance(obj, functools.partial): + obj = obj.func + return inspect.iscoroutinefunction(obj) + + +def request_response( + func: typing.Callable[[Request], typing.Awaitable[Response] | Response], +) -> ASGIApp: + """ + Takes a function or coroutine `func(request) -> response`, + and returns an ASGI application. + """ + f: typing.Callable[[Request], typing.Awaitable[Response]] = ( + func if is_async_callable(func) else functools.partial(run_in_threadpool, func) # type:ignore + ) + + async def app(scope: Scope, receive: Receive, send: Send) -> None: + request = Request(scope, receive, send) + + async def app(scope: Scope, receive: Receive, send: Send) -> None: + response = await f(request) + await response(scope, receive, send) + + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + + return app + + +def websocket_session( + func: typing.Callable[[WebSocket], typing.Awaitable[None]], +) -> ASGIApp: + """ + Takes a coroutine `func(session)`, and returns an ASGI application. + """ + # assert asyncio.iscoroutinefunction(func), "WebSocket endpoints must be async" + + async def app(scope: Scope, receive: Receive, send: Send) -> None: + session = WebSocket(scope, receive=receive, send=send) + + async def app(scope: Scope, receive: Receive, send: Send) -> None: + await func(session) + + await wrap_app_handling_exceptions(app, session)(scope, receive, send) + + return app + + +def get_name(endpoint: typing.Callable[..., typing.Any]) -> str: + return getattr(endpoint, "__name__", endpoint.__class__.__name__) + + +def replace_params( + path: str, + param_convertors: dict[str, Convertor[typing.Any]], + path_params: dict[str, str], +) -> tuple[str, dict[str, str]]: + for key, value in list(path_params.items()): + if "{" + key + "}" in path: + convertor = param_convertors[key] + value = convertor.to_string(value) + path = path.replace("{" + key + "}", value) + path_params.pop(key) + return path, path_params + + +# Match parameters in URL paths, eg. '{param}', and '{param:int}' +PARAM_REGEX = re.compile("{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}") + + +def compile_path( + path: str, +) -> tuple[typing.Pattern[str], str, dict[str, Convertor[typing.Any]]]: + """ + Given a path string, like: "/{username:str}", + or a host string, like: "{subdomain}.mydomain.org", return a three-tuple + of (regex, format, {param_name:convertor}). + + regex: "/(?P[^/]+)" + format: "/{username}" + convertors: {"username": StringConvertor()} + """ + is_host = not path.startswith("/") + + path_regex = "^" + path_format = "" + duplicated_params = set() + + idx = 0 + param_convertors = {} + for match in PARAM_REGEX.finditer(path): + param_name, convertor_type = match.groups("str") + convertor_type = convertor_type.lstrip(":") + assert convertor_type in CONVERTOR_TYPES, f"Unknown path convertor '{convertor_type}'" + convertor = CONVERTOR_TYPES[convertor_type] + + path_regex += re.escape(path[idx : match.start()]) + path_regex += f"(?P<{param_name}>{convertor.regex})" + + path_format += path[idx : match.start()] + path_format += "{%s}" % param_name + + if param_name in param_convertors: + duplicated_params.add(param_name) + + param_convertors[param_name] = convertor + + idx = match.end() + + if duplicated_params: + names = ", ".join(sorted(duplicated_params)) + ending = "s" if len(duplicated_params) > 1 else "" + raise ValueError(f"Duplicated param name{ending} {names} at path {path}") + + if is_host: + # Align with `Host.matches()` behavior, which ignores port. + hostname = path[idx:].split(":")[0] + path_regex += re.escape(hostname) + "$" + else: + path_regex += re.escape(path[idx:]) + "$" + + path_format += path[idx:] + + return re.compile(path_regex), path_format, param_convertors + + +class BaseRoute: + def matches(self, scope: Scope) -> tuple[Match, Scope]: + raise NotImplementedError() # pragma: no cover + + def url_path_for(self, name: str, /, **path_params: typing.Any) -> URLPath: + raise NotImplementedError() # pragma: no cover + + async def handle(self, scope: Scope, receive: Receive, send: Send) -> None: + raise NotImplementedError() # pragma: no cover + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + """ + A route may be used in isolation as a stand-alone ASGI app. + This is a somewhat contrived case, as they'll almost always be used + within a Router, but could be useful for some tooling and minimal apps. + """ + match, child_scope = self.matches(scope) + if match == Match.NONE: + if scope["type"] == "http": + response = PlainTextResponse("Not Found", status_code=404) + await response(scope, receive, send) + elif scope["type"] == "websocket": # pragma: no branch + websocket_close = WebSocketClose() + await websocket_close(scope, receive, send) + return + + scope.update(child_scope) + await self.handle(scope, receive, send) + + +class Route(BaseRoute): + def __init__( + self, + path: str, + endpoint: typing.Callable[..., typing.Any], + *, + methods: list[str] | None = None, + name: str | None = None, + include_in_schema: bool = True, + middleware: typing.Sequence[Middleware] | None = None, + ) -> None: + assert path.startswith("/"), "Routed paths must start with '/'" + self.path = path + self.endpoint = endpoint + self.name = get_name(endpoint) if name is None else name + self.include_in_schema = include_in_schema + + endpoint_handler = endpoint + while isinstance(endpoint_handler, functools.partial): + endpoint_handler = endpoint_handler.func + if inspect.isfunction(endpoint_handler) or inspect.ismethod(endpoint_handler): + # Endpoint is function or method. Treat it as `func(request) -> response`. + self.app = request_response(endpoint) + if methods is None: + methods = ["GET"] + else: + # Endpoint is a class. Treat it as ASGI. + self.app = endpoint + + if middleware is not None: + for cls, args, kwargs in reversed(middleware): + self.app = cls(self.app, *args, **kwargs) + + if methods is None: + self.methods = None + else: + self.methods = {method.upper() for method in methods} + if "GET" in self.methods: + self.methods.add("HEAD") + + self.path_regex, self.path_format, self.param_convertors = compile_path(path) + + def matches(self, scope: Scope) -> tuple[Match, Scope]: + path_params: dict[str, typing.Any] + if scope["type"] == "http": + route_path = get_route_path(scope) + match = self.path_regex.match(route_path) + if match: + matched_params = match.groupdict() + for key, value in matched_params.items(): + matched_params[key] = self.param_convertors[key].convert(value) + path_params = dict(scope.get("path_params", {})) + path_params.update(matched_params) + child_scope = {"endpoint": self.endpoint, "path_params": path_params} + if self.methods and scope["method"] not in self.methods: + return Match.PARTIAL, child_scope + else: + return Match.FULL, child_scope + return Match.NONE, {} + + def url_path_for(self, name: str, /, **path_params: typing.Any) -> URLPath: + seen_params = set(path_params.keys()) + expected_params = set(self.param_convertors.keys()) + + if name != self.name or seen_params != expected_params: + raise NoMatchFound(name, path_params) + + path, remaining_params = replace_params(self.path_format, self.param_convertors, path_params) + assert not remaining_params + return URLPath(path=path, protocol="http") + + async def handle(self, scope: Scope, receive: Receive, send: Send) -> None: + if self.methods and scope["method"] not in self.methods: + headers = {"Allow": ", ".join(self.methods)} + if "app" in scope: + raise HTTPException(status_code=405, headers=headers) + else: + response = PlainTextResponse("Method Not Allowed", status_code=405, headers=headers) + await response(scope, receive, send) + else: + await self.app(scope, receive, send) + + def __eq__(self, other: typing.Any) -> bool: + return ( + isinstance(other, Route) + and self.path == other.path + and self.endpoint == other.endpoint + and self.methods == other.methods + ) + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + methods = sorted(self.methods or []) + path, name = self.path, self.name + return f"{class_name}(path={path!r}, name={name!r}, methods={methods!r})" + + +class WebSocketRoute(BaseRoute): + def __init__( + self, + path: str, + endpoint: typing.Callable[..., typing.Any], + *, + name: str | None = None, + middleware: typing.Sequence[Middleware] | None = None, + ) -> None: + assert path.startswith("/"), "Routed paths must start with '/'" + self.path = path + self.endpoint = endpoint + self.name = get_name(endpoint) if name is None else name + + endpoint_handler = endpoint + while isinstance(endpoint_handler, functools.partial): + endpoint_handler = endpoint_handler.func + if inspect.isfunction(endpoint_handler) or inspect.ismethod(endpoint_handler): + # Endpoint is function or method. Treat it as `func(websocket)`. + self.app = websocket_session(endpoint) + else: + # Endpoint is a class. Treat it as ASGI. + self.app = endpoint + + if middleware is not None: + for cls, args, kwargs in reversed(middleware): + self.app = cls(self.app, *args, **kwargs) + + self.path_regex, self.path_format, self.param_convertors = compile_path(path) + + def matches(self, scope: Scope) -> tuple[Match, Scope]: + path_params: dict[str, typing.Any] + if scope["type"] == "websocket": + route_path = get_route_path(scope) + match = self.path_regex.match(route_path) + if match: + matched_params = match.groupdict() + for key, value in matched_params.items(): + matched_params[key] = self.param_convertors[key].convert(value) + path_params = dict(scope.get("path_params", {})) + path_params.update(matched_params) + child_scope = {"endpoint": self.endpoint, "path_params": path_params} + return Match.FULL, child_scope + return Match.NONE, {} + + def url_path_for(self, name: str, /, **path_params: typing.Any) -> URLPath: + seen_params = set(path_params.keys()) + expected_params = set(self.param_convertors.keys()) + + if name != self.name or seen_params != expected_params: + raise NoMatchFound(name, path_params) + + path, remaining_params = replace_params(self.path_format, self.param_convertors, path_params) + assert not remaining_params + return URLPath(path=path, protocol="websocket") + + async def handle(self, scope: Scope, receive: Receive, send: Send) -> None: + await self.app(scope, receive, send) + + def __eq__(self, other: typing.Any) -> bool: + return isinstance(other, WebSocketRoute) and self.path == other.path and self.endpoint == other.endpoint + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(path={self.path!r}, name={self.name!r})" + + +class Mount(BaseRoute): + def __init__( + self, + path: str, + app: ASGIApp | None = None, + routes: typing.Sequence[BaseRoute] | None = None, + name: str | None = None, + *, + middleware: typing.Sequence[Middleware] | None = None, + ) -> None: + assert path == "" or path.startswith("/"), "Routed paths must start with '/'" + assert app is not None or routes is not None, "Either 'app=...', or 'routes=' must be specified" + self.path = path.rstrip("/") + if app is not None: + self._base_app: ASGIApp = app + else: + self._base_app = Router(routes=routes) + self.app = self._base_app + if middleware is not None: + for cls, args, kwargs in reversed(middleware): + self.app = cls(self.app, *args, **kwargs) + self.name = name + self.path_regex, self.path_format, self.param_convertors = compile_path(self.path + "/{path:path}") + + @property + def routes(self) -> list[BaseRoute]: + return getattr(self._base_app, "routes", []) + + def matches(self, scope: Scope) -> tuple[Match, Scope]: + path_params: dict[str, typing.Any] + if scope["type"] in ("http", "websocket"): # pragma: no branch + root_path = scope.get("root_path", "") + route_path = get_route_path(scope) + match = self.path_regex.match(route_path) + if match: + matched_params = match.groupdict() + for key, value in matched_params.items(): + matched_params[key] = self.param_convertors[key].convert(value) + remaining_path = "/" + matched_params.pop("path") + matched_path = route_path[: -len(remaining_path)] + path_params = dict(scope.get("path_params", {})) + path_params.update(matched_params) + child_scope = { + "path_params": path_params, + # app_root_path will only be set at the top level scope, + # initialized with the (optional) value of a root_path + # set above/before Starlette. And even though any + # mount will have its own child scope with its own respective + # root_path, the app_root_path will always be available in all + # the child scopes with the same top level value because it's + # set only once here with a default, any other child scope will + # just inherit that app_root_path default value stored in the + # scope. All this is needed to support Request.url_for(), as it + # uses the app_root_path to build the URL path. + "app_root_path": scope.get("app_root_path", root_path), + "root_path": root_path + matched_path, + "endpoint": self.app, + } + return Match.FULL, child_scope + return Match.NONE, {} + + def url_path_for(self, name: str, /, **path_params: typing.Any) -> URLPath: + if self.name is not None and name == self.name and "path" in path_params: + # 'name' matches "". + path_params["path"] = path_params["path"].lstrip("/") + path, remaining_params = replace_params(self.path_format, self.param_convertors, path_params) + if not remaining_params: + return URLPath(path=path) + elif self.name is None or name.startswith(self.name + ":"): + if self.name is None: + # No mount name. + remaining_name = name + else: + # 'name' matches ":". + remaining_name = name[len(self.name) + 1 :] + path_kwarg = path_params.get("path") + path_params["path"] = "" + path_prefix, remaining_params = replace_params(self.path_format, self.param_convertors, path_params) + if path_kwarg is not None: + remaining_params["path"] = path_kwarg + for route in self.routes or []: + try: + url = route.url_path_for(remaining_name, **remaining_params) + return URLPath(path=path_prefix.rstrip("/") + str(url), protocol=url.protocol) + except NoMatchFound: + pass + raise NoMatchFound(name, path_params) + + async def handle(self, scope: Scope, receive: Receive, send: Send) -> None: + await self.app(scope, receive, send) + + def __eq__(self, other: typing.Any) -> bool: + return isinstance(other, Mount) and self.path == other.path and self.app == other.app + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + name = self.name or "" + return f"{class_name}(path={self.path!r}, name={name!r}, app={self.app!r})" + + +class Host(BaseRoute): + def __init__(self, host: str, app: ASGIApp, name: str | None = None) -> None: + assert not host.startswith("/"), "Host must not start with '/'" + self.host = host + self.app = app + self.name = name + self.host_regex, self.host_format, self.param_convertors = compile_path(host) + + @property + def routes(self) -> list[BaseRoute]: + return getattr(self.app, "routes", []) + + def matches(self, scope: Scope) -> tuple[Match, Scope]: + if scope["type"] in ("http", "websocket"): # pragma:no branch + headers = Headers(scope=scope) + host = headers.get("host", "").split(":")[0] + match = self.host_regex.match(host) + if match: + matched_params = match.groupdict() + for key, value in matched_params.items(): + matched_params[key] = self.param_convertors[key].convert(value) + path_params = dict(scope.get("path_params", {})) + path_params.update(matched_params) + child_scope = {"path_params": path_params, "endpoint": self.app} + return Match.FULL, child_scope + return Match.NONE, {} + + def url_path_for(self, name: str, /, **path_params: typing.Any) -> URLPath: + if self.name is not None and name == self.name and "path" in path_params: + # 'name' matches "". + path = path_params.pop("path") + host, remaining_params = replace_params(self.host_format, self.param_convertors, path_params) + if not remaining_params: + return URLPath(path=path, host=host) + elif self.name is None or name.startswith(self.name + ":"): + if self.name is None: + # No mount name. + remaining_name = name + else: + # 'name' matches ":". + remaining_name = name[len(self.name) + 1 :] + host, remaining_params = replace_params(self.host_format, self.param_convertors, path_params) + for route in self.routes or []: + try: + url = route.url_path_for(remaining_name, **remaining_params) + return URLPath(path=str(url), protocol=url.protocol, host=host) + except NoMatchFound: + pass + raise NoMatchFound(name, path_params) + + async def handle(self, scope: Scope, receive: Receive, send: Send) -> None: + await self.app(scope, receive, send) + + def __eq__(self, other: typing.Any) -> bool: + return isinstance(other, Host) and self.host == other.host and self.app == other.app + + def __repr__(self) -> str: + class_name = self.__class__.__name__ + name = self.name or "" + return f"{class_name}(host={self.host!r}, name={name!r}, app={self.app!r})" + + +_T = typing.TypeVar("_T") + + +class _AsyncLiftContextManager(typing.AsyncContextManager[_T]): + def __init__(self, cm: typing.ContextManager[_T]): + self._cm = cm + + async def __aenter__(self) -> _T: + return self._cm.__enter__() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + traceback: types.TracebackType | None, + ) -> bool | None: + return self._cm.__exit__(exc_type, exc_value, traceback) + + +def _wrap_gen_lifespan_context( + lifespan_context: typing.Callable[[typing.Any], typing.Generator[typing.Any, typing.Any, typing.Any]], +) -> typing.Callable[[typing.Any], typing.AsyncContextManager[typing.Any]]: + cmgr = contextlib.contextmanager(lifespan_context) + + @functools.wraps(cmgr) + def wrapper(app: typing.Any) -> _AsyncLiftContextManager[typing.Any]: + return _AsyncLiftContextManager(cmgr(app)) + + return wrapper + + +class _DefaultLifespan: + def __init__(self, router: Router): + self._router = router + + async def __aenter__(self) -> None: + await self._router.startup() + + async def __aexit__(self, *exc_info: object) -> None: + await self._router.shutdown() + + def __call__(self: _T, app: object) -> _T: + return self + + +class Router: + def __init__( + self, + routes: typing.Sequence[BaseRoute] | None = None, + redirect_slashes: bool = True, + default: ASGIApp | None = None, + on_startup: typing.Sequence[typing.Callable[[], typing.Any]] | None = None, + on_shutdown: typing.Sequence[typing.Callable[[], typing.Any]] | None = None, + # the generic to Lifespan[AppType] is the type of the top level application + # which the router cannot know statically, so we use typing.Any + lifespan: Lifespan[typing.Any] | None = None, + *, + middleware: typing.Sequence[Middleware] | None = None, + ) -> None: + self.routes = [] if routes is None else list(routes) + self.redirect_slashes = redirect_slashes + self.default = self.not_found if default is None else default + self.on_startup = [] if on_startup is None else list(on_startup) + self.on_shutdown = [] if on_shutdown is None else list(on_shutdown) + + if on_startup or on_shutdown: + warnings.warn( + "The on_startup and on_shutdown parameters are deprecated, and they " + "will be removed on version 1.0. Use the lifespan parameter instead. " + "See more about it on https://www.starlette.io/lifespan/.", + DeprecationWarning, + ) + if lifespan: + warnings.warn( + "The `lifespan` parameter cannot be used with `on_startup` or " + "`on_shutdown`. Both `on_startup` and `on_shutdown` will be " + "ignored." + ) + + if lifespan is None: + self.lifespan_context: Lifespan[typing.Any] = _DefaultLifespan(self) + + elif inspect.isasyncgenfunction(lifespan): + warnings.warn( + "async generator function lifespans are deprecated, " + "use an @contextlib.asynccontextmanager function instead", + DeprecationWarning, + ) + self.lifespan_context = asynccontextmanager( + lifespan, + ) + elif inspect.isgeneratorfunction(lifespan): + warnings.warn( + "generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function instead", + DeprecationWarning, + ) + self.lifespan_context = _wrap_gen_lifespan_context( + lifespan, + ) + else: + self.lifespan_context = lifespan + + self.middleware_stack = self.app + if middleware: + for cls, args, kwargs in reversed(middleware): + self.middleware_stack = cls(self.middleware_stack, *args, **kwargs) + + async def not_found(self, scope: Scope, receive: Receive, send: Send) -> None: + if scope["type"] == "websocket": + websocket_close = WebSocketClose() + await websocket_close(scope, receive, send) + return + + # If we're running inside a starlette application then raise an + # exception, so that the configurable exception handler can deal with + # returning the response. For plain ASGI apps, just return the response. + if "app" in scope: + raise HTTPException(status_code=404) + else: + response = PlainTextResponse("Not Found", status_code=404) + await response(scope, receive, send) + + def url_path_for(self, name: str, /, **path_params: typing.Any) -> URLPath: + for route in self.routes: + try: + return route.url_path_for(name, **path_params) + except NoMatchFound: + pass + raise NoMatchFound(name, path_params) + + async def startup(self) -> None: + """ + Run any `.on_startup` event handlers. + """ + for handler in self.on_startup: + if is_async_callable(handler): + await handler() + else: + handler() + + async def shutdown(self) -> None: + """ + Run any `.on_shutdown` event handlers. + """ + for handler in self.on_shutdown: + if is_async_callable(handler): + await handler() + else: + handler() + + async def lifespan(self, scope: Scope, receive: Receive, send: Send) -> None: + """ + Handle ASGI lifespan messages, which allows us to manage application + startup and shutdown events. + """ + started = False + app: typing.Any = scope.get("app") + await receive() + try: + async with self.lifespan_context(app) as maybe_state: + if maybe_state is not None: + if "state" not in scope: + raise RuntimeError('The server does not support "state" in the lifespan scope.') + scope["state"].update(maybe_state) + await send({"type": "lifespan.startup.complete"}) + started = True + await receive() + except BaseException: + exc_text = traceback.format_exc() + if started: + await send({"type": "lifespan.shutdown.failed", "message": exc_text}) + else: + await send({"type": "lifespan.startup.failed", "message": exc_text}) + raise + else: + await send({"type": "lifespan.shutdown.complete"}) + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + """ + The main entry point to the Router class. + """ + await self.middleware_stack(scope, receive, send) + + async def app(self, scope: Scope, receive: Receive, send: Send) -> None: + assert scope["type"] in ("http", "websocket", "lifespan") + + if "router" not in scope: + scope["router"] = self + + if scope["type"] == "lifespan": + await self.lifespan(scope, receive, send) + return + + partial = None + + for route in self.routes: + # Determine if any route matches the incoming scope, + # and hand over to the matching route if found. + match, child_scope = route.matches(scope) + if match == Match.FULL: + scope.update(child_scope) + await route.handle(scope, receive, send) + return + elif match == Match.PARTIAL and partial is None: + partial = route + partial_scope = child_scope + + if partial is not None: + #  Handle partial matches. These are cases where an endpoint is + # able to handle the request, but is not a preferred option. + # We use this in particular to deal with "405 Method Not Allowed". + scope.update(partial_scope) + await partial.handle(scope, receive, send) + return + + route_path = get_route_path(scope) + if scope["type"] == "http" and self.redirect_slashes and route_path != "/": + redirect_scope = dict(scope) + if route_path.endswith("/"): + redirect_scope["path"] = redirect_scope["path"].rstrip("/") + else: + redirect_scope["path"] = redirect_scope["path"] + "/" + + for route in self.routes: + match, child_scope = route.matches(redirect_scope) + if match != Match.NONE: + redirect_url = URL(scope=redirect_scope) + response = RedirectResponse(url=str(redirect_url)) + await response(scope, receive, send) + return + + await self.default(scope, receive, send) + + def __eq__(self, other: typing.Any) -> bool: + return isinstance(other, Router) and self.routes == other.routes + + def mount(self, path: str, app: ASGIApp, name: str | None = None) -> None: # pragma: no cover + route = Mount(path, app=app, name=name) + self.routes.append(route) + + def host(self, host: str, app: ASGIApp, name: str | None = None) -> None: # pragma: no cover + route = Host(host, app=app, name=name) + self.routes.append(route) + + def add_route( + self, + path: str, + endpoint: typing.Callable[[Request], typing.Awaitable[Response] | Response], + methods: list[str] | None = None, + name: str | None = None, + include_in_schema: bool = True, + ) -> None: # pragma: no cover + route = Route( + path, + endpoint=endpoint, + methods=methods, + name=name, + include_in_schema=include_in_schema, + ) + self.routes.append(route) + + def add_websocket_route( + self, + path: str, + endpoint: typing.Callable[[WebSocket], typing.Awaitable[None]], + name: str | None = None, + ) -> None: # pragma: no cover + route = WebSocketRoute(path, endpoint=endpoint, name=name) + self.routes.append(route) + + def route( + self, + path: str, + methods: list[str] | None = None, + name: str | None = None, + include_in_schema: bool = True, + ) -> typing.Callable: # type: ignore[type-arg] + """ + We no longer document this decorator style API, and its usage is discouraged. + Instead you should use the following approach: + + >>> routes = [Route(path, endpoint=...), ...] + >>> app = Starlette(routes=routes) + """ + warnings.warn( + "The `route` decorator is deprecated, and will be removed in version 1.0.0." + "Refer to https://www.starlette.io/routing/#http-routing for the recommended approach.", + DeprecationWarning, + ) + + def decorator(func: typing.Callable) -> typing.Callable: # type: ignore[type-arg] + self.add_route( + path, + func, + methods=methods, + name=name, + include_in_schema=include_in_schema, + ) + return func + + return decorator + + def websocket_route(self, path: str, name: str | None = None) -> typing.Callable: # type: ignore[type-arg] + """ + We no longer document this decorator style API, and its usage is discouraged. + Instead you should use the following approach: + + >>> routes = [WebSocketRoute(path, endpoint=...), ...] + >>> app = Starlette(routes=routes) + """ + warnings.warn( + "The `websocket_route` decorator is deprecated, and will be removed in version 1.0.0. Refer to " + "https://www.starlette.io/routing/#websocket-routing for the recommended approach.", + DeprecationWarning, + ) + + def decorator(func: typing.Callable) -> typing.Callable: # type: ignore[type-arg] + self.add_websocket_route(path, func, name=name) + return func + + return decorator + + def add_event_handler(self, event_type: str, func: typing.Callable[[], typing.Any]) -> None: # pragma: no cover + assert event_type in ("startup", "shutdown") + + if event_type == "startup": + self.on_startup.append(func) + else: + self.on_shutdown.append(func) + + def on_event(self, event_type: str) -> typing.Callable: # type: ignore[type-arg] + warnings.warn( + "The `on_event` decorator is deprecated, and will be removed in version 1.0.0. " + "Refer to https://www.starlette.io/lifespan/ for recommended approach.", + DeprecationWarning, + ) + + def decorator(func: typing.Callable) -> typing.Callable: # type: ignore[type-arg] + self.add_event_handler(event_type, func) + return func + + return decorator diff --git a/venv/Lib/site-packages/starlette/schemas.py b/venv/Lib/site-packages/starlette/schemas.py new file mode 100644 index 00000000..bfc40e2a --- /dev/null +++ b/venv/Lib/site-packages/starlette/schemas.py @@ -0,0 +1,147 @@ +from __future__ import annotations + +import inspect +import re +import typing + +from starlette.requests import Request +from starlette.responses import Response +from starlette.routing import BaseRoute, Host, Mount, Route + +try: + import yaml +except ModuleNotFoundError: # pragma: no cover + yaml = None # type: ignore[assignment] + + +class OpenAPIResponse(Response): + media_type = "application/vnd.oai.openapi" + + def render(self, content: typing.Any) -> bytes: + assert yaml is not None, "`pyyaml` must be installed to use OpenAPIResponse." + assert isinstance(content, dict), "The schema passed to OpenAPIResponse should be a dictionary." + return yaml.dump(content, default_flow_style=False).encode("utf-8") + + +class EndpointInfo(typing.NamedTuple): + path: str + http_method: str + func: typing.Callable[..., typing.Any] + + +_remove_converter_pattern = re.compile(r":\w+}") + + +class BaseSchemaGenerator: + def get_schema(self, routes: list[BaseRoute]) -> dict[str, typing.Any]: + raise NotImplementedError() # pragma: no cover + + def get_endpoints(self, routes: list[BaseRoute]) -> list[EndpointInfo]: + """ + Given the routes, yields the following information: + + - path + eg: /users/ + - http_method + one of 'get', 'post', 'put', 'patch', 'delete', 'options' + - func + method ready to extract the docstring + """ + endpoints_info: list[EndpointInfo] = [] + + for route in routes: + if isinstance(route, (Mount, Host)): + routes = route.routes or [] + if isinstance(route, Mount): + path = self._remove_converter(route.path) + else: + path = "" + sub_endpoints = [ + EndpointInfo( + path="".join((path, sub_endpoint.path)), + http_method=sub_endpoint.http_method, + func=sub_endpoint.func, + ) + for sub_endpoint in self.get_endpoints(routes) + ] + endpoints_info.extend(sub_endpoints) + + elif not isinstance(route, Route) or not route.include_in_schema: + continue + + elif inspect.isfunction(route.endpoint) or inspect.ismethod(route.endpoint): + path = self._remove_converter(route.path) + for method in route.methods or ["GET"]: + if method == "HEAD": + continue + endpoints_info.append(EndpointInfo(path, method.lower(), route.endpoint)) + else: + path = self._remove_converter(route.path) + for method in ["get", "post", "put", "patch", "delete", "options"]: + if not hasattr(route.endpoint, method): + continue + func = getattr(route.endpoint, method) + endpoints_info.append(EndpointInfo(path, method.lower(), func)) + + return endpoints_info + + def _remove_converter(self, path: str) -> str: + """ + Remove the converter from the path. + For example, a route like this: + Route("/users/{id:int}", endpoint=get_user, methods=["GET"]) + Should be represented as `/users/{id}` in the OpenAPI schema. + """ + return _remove_converter_pattern.sub("}", path) + + def parse_docstring(self, func_or_method: typing.Callable[..., typing.Any]) -> dict[str, typing.Any]: + """ + Given a function, parse the docstring as YAML and return a dictionary of info. + """ + docstring = func_or_method.__doc__ + if not docstring: + return {} + + assert yaml is not None, "`pyyaml` must be installed to use parse_docstring." + + # We support having regular docstrings before the schema + # definition. Here we return just the schema part from + # the docstring. + docstring = docstring.split("---")[-1] + + parsed = yaml.safe_load(docstring) + + if not isinstance(parsed, dict): + # A regular docstring (not yaml formatted) can return + # a simple string here, which wouldn't follow the schema. + return {} + + return parsed + + def OpenAPIResponse(self, request: Request) -> Response: + routes = request.app.routes + schema = self.get_schema(routes=routes) + return OpenAPIResponse(schema) + + +class SchemaGenerator(BaseSchemaGenerator): + def __init__(self, base_schema: dict[str, typing.Any]) -> None: + self.base_schema = base_schema + + def get_schema(self, routes: list[BaseRoute]) -> dict[str, typing.Any]: + schema = dict(self.base_schema) + schema.setdefault("paths", {}) + endpoints_info = self.get_endpoints(routes) + + for endpoint in endpoints_info: + parsed = self.parse_docstring(endpoint.func) + + if not parsed: + continue + + if endpoint.path not in schema["paths"]: + schema["paths"][endpoint.path] = {} + + schema["paths"][endpoint.path][endpoint.http_method] = parsed + + return schema diff --git a/venv/Lib/site-packages/starlette/staticfiles.py b/venv/Lib/site-packages/starlette/staticfiles.py new file mode 100644 index 00000000..637da648 --- /dev/null +++ b/venv/Lib/site-packages/starlette/staticfiles.py @@ -0,0 +1,220 @@ +from __future__ import annotations + +import errno +import importlib.util +import os +import stat +import typing +from email.utils import parsedate + +import anyio +import anyio.to_thread + +from starlette._utils import get_route_path +from starlette.datastructures import URL, Headers +from starlette.exceptions import HTTPException +from starlette.responses import FileResponse, RedirectResponse, Response +from starlette.types import Receive, Scope, Send + +PathLike = typing.Union[str, "os.PathLike[str]"] + + +class NotModifiedResponse(Response): + NOT_MODIFIED_HEADERS = ( + "cache-control", + "content-location", + "date", + "etag", + "expires", + "vary", + ) + + def __init__(self, headers: Headers): + super().__init__( + status_code=304, + headers={name: value for name, value in headers.items() if name in self.NOT_MODIFIED_HEADERS}, + ) + + +class StaticFiles: + def __init__( + self, + *, + directory: PathLike | None = None, + packages: list[str | tuple[str, str]] | None = None, + html: bool = False, + check_dir: bool = True, + follow_symlink: bool = False, + ) -> None: + self.directory = directory + self.packages = packages + self.all_directories = self.get_directories(directory, packages) + self.html = html + self.config_checked = False + self.follow_symlink = follow_symlink + if check_dir and directory is not None and not os.path.isdir(directory): + raise RuntimeError(f"Directory '{directory}' does not exist") + + def get_directories( + self, + directory: PathLike | None = None, + packages: list[str | tuple[str, str]] | None = None, + ) -> list[PathLike]: + """ + Given `directory` and `packages` arguments, return a list of all the + directories that should be used for serving static files from. + """ + directories = [] + if directory is not None: + directories.append(directory) + + for package in packages or []: + if isinstance(package, tuple): + package, statics_dir = package + else: + statics_dir = "statics" + spec = importlib.util.find_spec(package) + assert spec is not None, f"Package {package!r} could not be found." + assert spec.origin is not None, f"Package {package!r} could not be found." + package_directory = os.path.normpath(os.path.join(spec.origin, "..", statics_dir)) + assert os.path.isdir(package_directory), ( + f"Directory '{statics_dir!r}' in package {package!r} could not be found." + ) + directories.append(package_directory) + + return directories + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + """ + The ASGI entry point. + """ + assert scope["type"] == "http" + + if not self.config_checked: + await self.check_config() + self.config_checked = True + + path = self.get_path(scope) + response = await self.get_response(path, scope) + await response(scope, receive, send) + + def get_path(self, scope: Scope) -> str: + """ + Given the ASGI scope, return the `path` string to serve up, + with OS specific path separators, and any '..', '.' components removed. + """ + route_path = get_route_path(scope) + return os.path.normpath(os.path.join(*route_path.split("/"))) + + async def get_response(self, path: str, scope: Scope) -> Response: + """ + Returns an HTTP response, given the incoming path, method and request headers. + """ + if scope["method"] not in ("GET", "HEAD"): + raise HTTPException(status_code=405) + + try: + full_path, stat_result = await anyio.to_thread.run_sync(self.lookup_path, path) + except PermissionError: + raise HTTPException(status_code=401) + except OSError as exc: + # Filename is too long, so it can't be a valid static file. + if exc.errno == errno.ENAMETOOLONG: + raise HTTPException(status_code=404) + + raise exc + + if stat_result and stat.S_ISREG(stat_result.st_mode): + # We have a static file to serve. + return self.file_response(full_path, stat_result, scope) + + elif stat_result and stat.S_ISDIR(stat_result.st_mode) and self.html: + # We're in HTML mode, and have got a directory URL. + # Check if we have 'index.html' file to serve. + index_path = os.path.join(path, "index.html") + full_path, stat_result = await anyio.to_thread.run_sync(self.lookup_path, index_path) + if stat_result is not None and stat.S_ISREG(stat_result.st_mode): + if not scope["path"].endswith("/"): + # Directory URLs should redirect to always end in "/". + url = URL(scope=scope) + url = url.replace(path=url.path + "/") + return RedirectResponse(url=url) + return self.file_response(full_path, stat_result, scope) + + if self.html: + # Check for '404.html' if we're in HTML mode. + full_path, stat_result = await anyio.to_thread.run_sync(self.lookup_path, "404.html") + if stat_result and stat.S_ISREG(stat_result.st_mode): + return FileResponse(full_path, stat_result=stat_result, status_code=404) + raise HTTPException(status_code=404) + + def lookup_path(self, path: str) -> tuple[str, os.stat_result | None]: + for directory in self.all_directories: + joined_path = os.path.join(directory, path) + if self.follow_symlink: + full_path = os.path.abspath(joined_path) + directory = os.path.abspath(directory) + else: + full_path = os.path.realpath(joined_path) + directory = os.path.realpath(directory) + if os.path.commonpath([full_path, directory]) != str(directory): + # Don't allow misbehaving clients to break out of the static files directory. + continue + try: + return full_path, os.stat(full_path) + except (FileNotFoundError, NotADirectoryError): + continue + return "", None + + def file_response( + self, + full_path: PathLike, + stat_result: os.stat_result, + scope: Scope, + status_code: int = 200, + ) -> Response: + request_headers = Headers(scope=scope) + + response = FileResponse(full_path, status_code=status_code, stat_result=stat_result) + if self.is_not_modified(response.headers, request_headers): + return NotModifiedResponse(response.headers) + return response + + async def check_config(self) -> None: + """ + Perform a one-off configuration check that StaticFiles is actually + pointed at a directory, so that we can raise loud errors rather than + just returning 404 responses. + """ + if self.directory is None: + return + + try: + stat_result = await anyio.to_thread.run_sync(os.stat, self.directory) + except FileNotFoundError: + raise RuntimeError(f"StaticFiles directory '{self.directory}' does not exist.") + if not (stat.S_ISDIR(stat_result.st_mode) or stat.S_ISLNK(stat_result.st_mode)): + raise RuntimeError(f"StaticFiles path '{self.directory}' is not a directory.") + + def is_not_modified(self, response_headers: Headers, request_headers: Headers) -> bool: + """ + Given the request and response headers, return `True` if an HTTP + "Not Modified" response could be returned instead. + """ + try: + if_none_match = request_headers["if-none-match"] + etag = response_headers["etag"] + if etag in [tag.strip(" W/") for tag in if_none_match.split(",")]: + return True + except KeyError: + pass + + try: + if_modified_since = parsedate(request_headers["if-modified-since"]) + last_modified = parsedate(response_headers["last-modified"]) + if if_modified_since is not None and last_modified is not None and if_modified_since >= last_modified: + return True + except KeyError: + pass + + return False diff --git a/venv/Lib/site-packages/starlette/status.py b/venv/Lib/site-packages/starlette/status.py new file mode 100644 index 00000000..54c1fb7d --- /dev/null +++ b/venv/Lib/site-packages/starlette/status.py @@ -0,0 +1,95 @@ +""" +HTTP codes +See HTTP Status Code Registry: +https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml + +And RFC 2324 - https://tools.ietf.org/html/rfc2324 +""" + +from __future__ import annotations + +HTTP_100_CONTINUE = 100 +HTTP_101_SWITCHING_PROTOCOLS = 101 +HTTP_102_PROCESSING = 102 +HTTP_103_EARLY_HINTS = 103 +HTTP_200_OK = 200 +HTTP_201_CREATED = 201 +HTTP_202_ACCEPTED = 202 +HTTP_203_NON_AUTHORITATIVE_INFORMATION = 203 +HTTP_204_NO_CONTENT = 204 +HTTP_205_RESET_CONTENT = 205 +HTTP_206_PARTIAL_CONTENT = 206 +HTTP_207_MULTI_STATUS = 207 +HTTP_208_ALREADY_REPORTED = 208 +HTTP_226_IM_USED = 226 +HTTP_300_MULTIPLE_CHOICES = 300 +HTTP_301_MOVED_PERMANENTLY = 301 +HTTP_302_FOUND = 302 +HTTP_303_SEE_OTHER = 303 +HTTP_304_NOT_MODIFIED = 304 +HTTP_305_USE_PROXY = 305 +HTTP_306_RESERVED = 306 +HTTP_307_TEMPORARY_REDIRECT = 307 +HTTP_308_PERMANENT_REDIRECT = 308 +HTTP_400_BAD_REQUEST = 400 +HTTP_401_UNAUTHORIZED = 401 +HTTP_402_PAYMENT_REQUIRED = 402 +HTTP_403_FORBIDDEN = 403 +HTTP_404_NOT_FOUND = 404 +HTTP_405_METHOD_NOT_ALLOWED = 405 +HTTP_406_NOT_ACCEPTABLE = 406 +HTTP_407_PROXY_AUTHENTICATION_REQUIRED = 407 +HTTP_408_REQUEST_TIMEOUT = 408 +HTTP_409_CONFLICT = 409 +HTTP_410_GONE = 410 +HTTP_411_LENGTH_REQUIRED = 411 +HTTP_412_PRECONDITION_FAILED = 412 +HTTP_413_REQUEST_ENTITY_TOO_LARGE = 413 +HTTP_414_REQUEST_URI_TOO_LONG = 414 +HTTP_415_UNSUPPORTED_MEDIA_TYPE = 415 +HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE = 416 +HTTP_417_EXPECTATION_FAILED = 417 +HTTP_418_IM_A_TEAPOT = 418 +HTTP_421_MISDIRECTED_REQUEST = 421 +HTTP_422_UNPROCESSABLE_ENTITY = 422 +HTTP_423_LOCKED = 423 +HTTP_424_FAILED_DEPENDENCY = 424 +HTTP_425_TOO_EARLY = 425 +HTTP_426_UPGRADE_REQUIRED = 426 +HTTP_428_PRECONDITION_REQUIRED = 428 +HTTP_429_TOO_MANY_REQUESTS = 429 +HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE = 431 +HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS = 451 +HTTP_500_INTERNAL_SERVER_ERROR = 500 +HTTP_501_NOT_IMPLEMENTED = 501 +HTTP_502_BAD_GATEWAY = 502 +HTTP_503_SERVICE_UNAVAILABLE = 503 +HTTP_504_GATEWAY_TIMEOUT = 504 +HTTP_505_HTTP_VERSION_NOT_SUPPORTED = 505 +HTTP_506_VARIANT_ALSO_NEGOTIATES = 506 +HTTP_507_INSUFFICIENT_STORAGE = 507 +HTTP_508_LOOP_DETECTED = 508 +HTTP_510_NOT_EXTENDED = 510 +HTTP_511_NETWORK_AUTHENTICATION_REQUIRED = 511 + + +""" +WebSocket codes +https://www.iana.org/assignments/websocket/websocket.xml#close-code-number +https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent +""" +WS_1000_NORMAL_CLOSURE = 1000 +WS_1001_GOING_AWAY = 1001 +WS_1002_PROTOCOL_ERROR = 1002 +WS_1003_UNSUPPORTED_DATA = 1003 +WS_1005_NO_STATUS_RCVD = 1005 +WS_1006_ABNORMAL_CLOSURE = 1006 +WS_1007_INVALID_FRAME_PAYLOAD_DATA = 1007 +WS_1008_POLICY_VIOLATION = 1008 +WS_1009_MESSAGE_TOO_BIG = 1009 +WS_1010_MANDATORY_EXT = 1010 +WS_1011_INTERNAL_ERROR = 1011 +WS_1012_SERVICE_RESTART = 1012 +WS_1013_TRY_AGAIN_LATER = 1013 +WS_1014_BAD_GATEWAY = 1014 +WS_1015_TLS_HANDSHAKE = 1015 diff --git a/venv/Lib/site-packages/starlette/templating.py b/venv/Lib/site-packages/starlette/templating.py new file mode 100644 index 00000000..f764858b --- /dev/null +++ b/venv/Lib/site-packages/starlette/templating.py @@ -0,0 +1,216 @@ +from __future__ import annotations + +import typing +import warnings +from os import PathLike + +from starlette.background import BackgroundTask +from starlette.datastructures import URL +from starlette.requests import Request +from starlette.responses import HTMLResponse +from starlette.types import Receive, Scope, Send + +try: + import jinja2 + + # @contextfunction was renamed to @pass_context in Jinja 3.0, and was removed in 3.1 + # hence we try to get pass_context (most installs will be >=3.1) + # and fall back to contextfunction, + # adding a type ignore for mypy to let us access an attribute that may not exist + if hasattr(jinja2, "pass_context"): + pass_context = jinja2.pass_context + else: # pragma: no cover + pass_context = jinja2.contextfunction # type: ignore[attr-defined] +except ModuleNotFoundError: # pragma: no cover + jinja2 = None # type: ignore[assignment] + + +class _TemplateResponse(HTMLResponse): + def __init__( + self, + template: typing.Any, + context: dict[str, typing.Any], + status_code: int = 200, + headers: typing.Mapping[str, str] | None = None, + media_type: str | None = None, + background: BackgroundTask | None = None, + ): + self.template = template + self.context = context + content = template.render(context) + super().__init__(content, status_code, headers, media_type, background) + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + request = self.context.get("request", {}) + extensions = request.get("extensions", {}) + if "http.response.debug" in extensions: # pragma: no branch + await send( + { + "type": "http.response.debug", + "info": { + "template": self.template, + "context": self.context, + }, + } + ) + await super().__call__(scope, receive, send) + + +class Jinja2Templates: + """ + templates = Jinja2Templates("templates") + + return templates.TemplateResponse("index.html", {"request": request}) + """ + + @typing.overload + def __init__( + self, + directory: str | PathLike[str] | typing.Sequence[str | PathLike[str]], + *, + context_processors: list[typing.Callable[[Request], dict[str, typing.Any]]] | None = None, + **env_options: typing.Any, + ) -> None: ... + + @typing.overload + def __init__( + self, + *, + env: jinja2.Environment, + context_processors: list[typing.Callable[[Request], dict[str, typing.Any]]] | None = None, + ) -> None: ... + + def __init__( + self, + directory: str | PathLike[str] | typing.Sequence[str | PathLike[str]] | None = None, + *, + context_processors: list[typing.Callable[[Request], dict[str, typing.Any]]] | None = None, + env: jinja2.Environment | None = None, + **env_options: typing.Any, + ) -> None: + if env_options: + warnings.warn( + "Extra environment options are deprecated. Use a preconfigured jinja2.Environment instead.", + DeprecationWarning, + ) + assert jinja2 is not None, "jinja2 must be installed to use Jinja2Templates" + assert bool(directory) ^ bool(env), "either 'directory' or 'env' arguments must be passed" + self.context_processors = context_processors or [] + if directory is not None: + self.env = self._create_env(directory, **env_options) + elif env is not None: # pragma: no branch + self.env = env + + self._setup_env_defaults(self.env) + + def _create_env( + self, + directory: str | PathLike[str] | typing.Sequence[str | PathLike[str]], + **env_options: typing.Any, + ) -> jinja2.Environment: + loader = jinja2.FileSystemLoader(directory) + env_options.setdefault("loader", loader) + env_options.setdefault("autoescape", True) + + return jinja2.Environment(**env_options) + + def _setup_env_defaults(self, env: jinja2.Environment) -> None: + @pass_context + def url_for( + context: dict[str, typing.Any], + name: str, + /, + **path_params: typing.Any, + ) -> URL: + request: Request = context["request"] + return request.url_for(name, **path_params) + + env.globals.setdefault("url_for", url_for) + + def get_template(self, name: str) -> jinja2.Template: + return self.env.get_template(name) + + @typing.overload + def TemplateResponse( + self, + request: Request, + name: str, + context: dict[str, typing.Any] | None = None, + status_code: int = 200, + headers: typing.Mapping[str, str] | None = None, + media_type: str | None = None, + background: BackgroundTask | None = None, + ) -> _TemplateResponse: ... + + @typing.overload + def TemplateResponse( + self, + name: str, + context: dict[str, typing.Any] | None = None, + status_code: int = 200, + headers: typing.Mapping[str, str] | None = None, + media_type: str | None = None, + background: BackgroundTask | None = None, + ) -> _TemplateResponse: + # Deprecated usage + ... + + def TemplateResponse(self, *args: typing.Any, **kwargs: typing.Any) -> _TemplateResponse: + if args: + if isinstance(args[0], str): # the first argument is template name (old style) + warnings.warn( + "The `name` is not the first parameter anymore. " + "The first parameter should be the `Request` instance.\n" + 'Replace `TemplateResponse(name, {"request": request})` by `TemplateResponse(request, name)`.', + DeprecationWarning, + ) + + name = args[0] + context = args[1] if len(args) > 1 else kwargs.get("context", {}) + status_code = args[2] if len(args) > 2 else kwargs.get("status_code", 200) + headers = args[3] if len(args) > 3 else kwargs.get("headers") + media_type = args[4] if len(args) > 4 else kwargs.get("media_type") + background = args[5] if len(args) > 5 else kwargs.get("background") + + if "request" not in context: + raise ValueError('context must include a "request" key') + request = context["request"] + else: # the first argument is a request instance (new style) + request = args[0] + name = args[1] if len(args) > 1 else kwargs["name"] + context = args[2] if len(args) > 2 else kwargs.get("context", {}) + status_code = args[3] if len(args) > 3 else kwargs.get("status_code", 200) + headers = args[4] if len(args) > 4 else kwargs.get("headers") + media_type = args[5] if len(args) > 5 else kwargs.get("media_type") + background = args[6] if len(args) > 6 else kwargs.get("background") + else: # all arguments are kwargs + if "request" not in kwargs: + warnings.warn( + "The `TemplateResponse` now requires the `request` argument.\n" + 'Replace `TemplateResponse(name, {"context": context})` by `TemplateResponse(request, name)`.', + DeprecationWarning, + ) + if "request" not in kwargs.get("context", {}): + raise ValueError('context must include a "request" key') + + context = kwargs.get("context", {}) + request = kwargs.get("request", context.get("request")) + name = typing.cast(str, kwargs["name"]) + status_code = kwargs.get("status_code", 200) + headers = kwargs.get("headers") + media_type = kwargs.get("media_type") + background = kwargs.get("background") + + context.setdefault("request", request) + for context_processor in self.context_processors: + context.update(context_processor(request)) + + template = self.get_template(name) + return _TemplateResponse( + template, + context, + status_code=status_code, + headers=headers, + media_type=media_type, + background=background, + ) diff --git a/venv/Lib/site-packages/starlette/testclient.py b/venv/Lib/site-packages/starlette/testclient.py new file mode 100644 index 00000000..d54025e5 --- /dev/null +++ b/venv/Lib/site-packages/starlette/testclient.py @@ -0,0 +1,731 @@ +from __future__ import annotations + +import contextlib +import inspect +import io +import json +import math +import sys +import typing +import warnings +from concurrent.futures import Future +from types import GeneratorType +from urllib.parse import unquote, urljoin + +import anyio +import anyio.abc +import anyio.from_thread +from anyio.streams.stapled import StapledObjectStream + +from starlette._utils import is_async_callable +from starlette.types import ASGIApp, Message, Receive, Scope, Send +from starlette.websockets import WebSocketDisconnect + +if sys.version_info >= (3, 10): # pragma: no cover + from typing import TypeGuard +else: # pragma: no cover + from typing_extensions import TypeGuard + +try: + import httpx +except ModuleNotFoundError: # pragma: no cover + raise RuntimeError( + "The starlette.testclient module requires the httpx package to be installed.\n" + "You can install this with:\n" + " $ pip install httpx\n" + ) +_PortalFactoryType = typing.Callable[[], typing.ContextManager[anyio.abc.BlockingPortal]] + +ASGIInstance = typing.Callable[[Receive, Send], typing.Awaitable[None]] +ASGI2App = typing.Callable[[Scope], ASGIInstance] +ASGI3App = typing.Callable[[Scope, Receive, Send], typing.Awaitable[None]] + + +_RequestData = typing.Mapping[str, typing.Union[str, typing.Iterable[str], bytes]] + + +def _is_asgi3(app: ASGI2App | ASGI3App) -> TypeGuard[ASGI3App]: + if inspect.isclass(app): + return hasattr(app, "__await__") + return is_async_callable(app) + + +class _WrapASGI2: + """ + Provide an ASGI3 interface onto an ASGI2 app. + """ + + def __init__(self, app: ASGI2App) -> None: + self.app = app + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + instance = self.app(scope) + await instance(receive, send) + + +class _AsyncBackend(typing.TypedDict): + backend: str + backend_options: dict[str, typing.Any] + + +class _Upgrade(Exception): + def __init__(self, session: WebSocketTestSession) -> None: + self.session = session + + +class WebSocketDenialResponse( # type: ignore[misc] + httpx.Response, + WebSocketDisconnect, +): + """ + A special case of `WebSocketDisconnect`, raised in the `TestClient` if the + `WebSocket` is closed before being accepted with a `send_denial_response()`. + """ + + +class WebSocketTestSession: + def __init__( + self, + app: ASGI3App, + scope: Scope, + portal_factory: _PortalFactoryType, + ) -> None: + self.app = app + self.scope = scope + self.accepted_subprotocol = None + self.portal_factory = portal_factory + self.extra_headers = None + + def __enter__(self) -> WebSocketTestSession: + with contextlib.ExitStack() as stack: + self.portal = portal = stack.enter_context(self.portal_factory()) + fut, cs = portal.start_task(self._run) + stack.callback(fut.result) + stack.callback(portal.call, cs.cancel) + self.send({"type": "websocket.connect"}) + message = self.receive() + self._raise_on_close(message) + self.accepted_subprotocol = message.get("subprotocol", None) + self.extra_headers = message.get("headers", None) + stack.callback(self.close, 1000) + self.exit_stack = stack.pop_all() + return self + + def __exit__(self, *args: typing.Any) -> bool | None: + return self.exit_stack.__exit__(*args) + + async def _run(self, *, task_status: anyio.abc.TaskStatus[anyio.CancelScope]) -> None: + """ + The sub-thread in which the websocket session runs. + """ + send: anyio.create_memory_object_stream[Message] = anyio.create_memory_object_stream(math.inf) + send_tx, send_rx = send + receive: anyio.create_memory_object_stream[Message] = anyio.create_memory_object_stream(math.inf) + receive_tx, receive_rx = receive + with send_tx, send_rx, receive_tx, receive_rx, anyio.CancelScope() as cs: + self._receive_tx = receive_tx + self._send_rx = send_rx + task_status.started(cs) + await self.app(self.scope, receive_rx.receive, send_tx.send) + + # wait for cs.cancel to be called before closing streams + await anyio.sleep_forever() + + def _raise_on_close(self, message: Message) -> None: + if message["type"] == "websocket.close": + raise WebSocketDisconnect(code=message.get("code", 1000), reason=message.get("reason", "")) + elif message["type"] == "websocket.http.response.start": + status_code: int = message["status"] + headers: list[tuple[bytes, bytes]] = message["headers"] + body: list[bytes] = [] + while True: + message = self.receive() + assert message["type"] == "websocket.http.response.body" + body.append(message["body"]) + if not message.get("more_body", False): + break + raise WebSocketDenialResponse(status_code=status_code, headers=headers, content=b"".join(body)) + + def send(self, message: Message) -> None: + self.portal.call(self._receive_tx.send, message) + + def send_text(self, data: str) -> None: + self.send({"type": "websocket.receive", "text": data}) + + def send_bytes(self, data: bytes) -> None: + self.send({"type": "websocket.receive", "bytes": data}) + + def send_json(self, data: typing.Any, mode: typing.Literal["text", "binary"] = "text") -> None: + text = json.dumps(data, separators=(",", ":"), ensure_ascii=False) + if mode == "text": + self.send({"type": "websocket.receive", "text": text}) + else: + self.send({"type": "websocket.receive", "bytes": text.encode("utf-8")}) + + def close(self, code: int = 1000, reason: str | None = None) -> None: + self.send({"type": "websocket.disconnect", "code": code, "reason": reason}) + + def receive(self) -> Message: + return self.portal.call(self._send_rx.receive) + + def receive_text(self) -> str: + message = self.receive() + self._raise_on_close(message) + return typing.cast(str, message["text"]) + + def receive_bytes(self) -> bytes: + message = self.receive() + self._raise_on_close(message) + return typing.cast(bytes, message["bytes"]) + + def receive_json(self, mode: typing.Literal["text", "binary"] = "text") -> typing.Any: + message = self.receive() + self._raise_on_close(message) + if mode == "text": + text = message["text"] + else: + text = message["bytes"].decode("utf-8") + return json.loads(text) + + +class _TestClientTransport(httpx.BaseTransport): + def __init__( + self, + app: ASGI3App, + portal_factory: _PortalFactoryType, + raise_server_exceptions: bool = True, + root_path: str = "", + *, + client: tuple[str, int], + app_state: dict[str, typing.Any], + ) -> None: + self.app = app + self.raise_server_exceptions = raise_server_exceptions + self.root_path = root_path + self.portal_factory = portal_factory + self.app_state = app_state + self.client = client + + def handle_request(self, request: httpx.Request) -> httpx.Response: + scheme = request.url.scheme + netloc = request.url.netloc.decode(encoding="ascii") + path = request.url.path + raw_path = request.url.raw_path + query = request.url.query.decode(encoding="ascii") + + default_port = {"http": 80, "ws": 80, "https": 443, "wss": 443}[scheme] + + if ":" in netloc: + host, port_string = netloc.split(":", 1) + port = int(port_string) + else: + host = netloc + port = default_port + + # Include the 'host' header. + if "host" in request.headers: + headers: list[tuple[bytes, bytes]] = [] + elif port == default_port: # pragma: no cover + headers = [(b"host", host.encode())] + else: # pragma: no cover + headers = [(b"host", (f"{host}:{port}").encode())] + + # Include other request headers. + headers += [(key.lower().encode(), value.encode()) for key, value in request.headers.multi_items()] + + scope: dict[str, typing.Any] + + if scheme in {"ws", "wss"}: + subprotocol = request.headers.get("sec-websocket-protocol", None) + if subprotocol is None: + subprotocols: typing.Sequence[str] = [] + else: + subprotocols = [value.strip() for value in subprotocol.split(",")] + scope = { + "type": "websocket", + "path": unquote(path), + "raw_path": raw_path.split(b"?", 1)[0], + "root_path": self.root_path, + "scheme": scheme, + "query_string": query.encode(), + "headers": headers, + "client": self.client, + "server": [host, port], + "subprotocols": subprotocols, + "state": self.app_state.copy(), + "extensions": {"websocket.http.response": {}}, + } + session = WebSocketTestSession(self.app, scope, self.portal_factory) + raise _Upgrade(session) + + scope = { + "type": "http", + "http_version": "1.1", + "method": request.method, + "path": unquote(path), + "raw_path": raw_path.split(b"?", 1)[0], + "root_path": self.root_path, + "scheme": scheme, + "query_string": query.encode(), + "headers": headers, + "client": self.client, + "server": [host, port], + "extensions": {"http.response.debug": {}}, + "state": self.app_state.copy(), + } + + request_complete = False + response_started = False + response_complete: anyio.Event + raw_kwargs: dict[str, typing.Any] = {"stream": io.BytesIO()} + template = None + context = None + + async def receive() -> Message: + nonlocal request_complete + + if request_complete: + if not response_complete.is_set(): + await response_complete.wait() + return {"type": "http.disconnect"} + + body = request.read() + if isinstance(body, str): + body_bytes: bytes = body.encode("utf-8") # pragma: no cover + elif body is None: + body_bytes = b"" # pragma: no cover + elif isinstance(body, GeneratorType): + try: # pragma: no cover + chunk = body.send(None) + if isinstance(chunk, str): + chunk = chunk.encode("utf-8") + return {"type": "http.request", "body": chunk, "more_body": True} + except StopIteration: # pragma: no cover + request_complete = True + return {"type": "http.request", "body": b""} + else: + body_bytes = body + + request_complete = True + return {"type": "http.request", "body": body_bytes} + + async def send(message: Message) -> None: + nonlocal raw_kwargs, response_started, template, context + + if message["type"] == "http.response.start": + assert not response_started, 'Received multiple "http.response.start" messages.' + raw_kwargs["status_code"] = message["status"] + raw_kwargs["headers"] = [(key.decode(), value.decode()) for key, value in message.get("headers", [])] + response_started = True + elif message["type"] == "http.response.body": + assert response_started, 'Received "http.response.body" without "http.response.start".' + assert not response_complete.is_set(), 'Received "http.response.body" after response completed.' + body = message.get("body", b"") + more_body = message.get("more_body", False) + if request.method != "HEAD": + raw_kwargs["stream"].write(body) + if not more_body: + raw_kwargs["stream"].seek(0) + response_complete.set() + elif message["type"] == "http.response.debug": + template = message["info"]["template"] + context = message["info"]["context"] + + try: + with self.portal_factory() as portal: + response_complete = portal.call(anyio.Event) + portal.call(self.app, scope, receive, send) + except BaseException as exc: + if self.raise_server_exceptions: + raise exc + + if self.raise_server_exceptions: + assert response_started, "TestClient did not receive any response." + elif not response_started: + raw_kwargs = { + "status_code": 500, + "headers": [], + "stream": io.BytesIO(), + } + + raw_kwargs["stream"] = httpx.ByteStream(raw_kwargs["stream"].read()) + + response = httpx.Response(**raw_kwargs, request=request) + if template is not None: + response.template = template # type: ignore[attr-defined] + response.context = context # type: ignore[attr-defined] + return response + + +class TestClient(httpx.Client): + __test__ = False + task: Future[None] + portal: anyio.abc.BlockingPortal | None = None + + def __init__( + self, + app: ASGIApp, + base_url: str = "http://testserver", + raise_server_exceptions: bool = True, + root_path: str = "", + backend: typing.Literal["asyncio", "trio"] = "asyncio", + backend_options: dict[str, typing.Any] | None = None, + cookies: httpx._types.CookieTypes | None = None, + headers: dict[str, str] | None = None, + follow_redirects: bool = True, + client: tuple[str, int] = ("testclient", 50000), + ) -> None: + self.async_backend = _AsyncBackend(backend=backend, backend_options=backend_options or {}) + if _is_asgi3(app): + asgi_app = app + else: + app = typing.cast(ASGI2App, app) # type: ignore[assignment] + asgi_app = _WrapASGI2(app) # type: ignore[arg-type] + self.app = asgi_app + self.app_state: dict[str, typing.Any] = {} + transport = _TestClientTransport( + self.app, + portal_factory=self._portal_factory, + raise_server_exceptions=raise_server_exceptions, + root_path=root_path, + app_state=self.app_state, + client=client, + ) + if headers is None: + headers = {} + headers.setdefault("user-agent", "testclient") + super().__init__( + base_url=base_url, + headers=headers, + transport=transport, + follow_redirects=follow_redirects, + cookies=cookies, + ) + + @contextlib.contextmanager + def _portal_factory(self) -> typing.Generator[anyio.abc.BlockingPortal, None, None]: + if self.portal is not None: + yield self.portal + else: + with anyio.from_thread.start_blocking_portal(**self.async_backend) as portal: + yield portal + + def request( # type: ignore[override] + self, + method: str, + url: httpx._types.URLTypes, + *, + content: httpx._types.RequestContent | None = None, + data: _RequestData | None = None, + files: httpx._types.RequestFiles | None = None, + json: typing.Any = None, + params: httpx._types.QueryParamTypes | None = None, + headers: httpx._types.HeaderTypes | None = None, + cookies: httpx._types.CookieTypes | None = None, + auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + follow_redirects: bool | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + extensions: dict[str, typing.Any] | None = None, + ) -> httpx.Response: + if timeout is not httpx.USE_CLIENT_DEFAULT: + warnings.warn( + "You should not use the 'timeout' argument with the TestClient. " + "See https://github.com/encode/starlette/issues/1108 for more information.", + DeprecationWarning, + ) + url = self._merge_url(url) + return super().request( + method, + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def get( # type: ignore[override] + self, + url: httpx._types.URLTypes, + *, + params: httpx._types.QueryParamTypes | None = None, + headers: httpx._types.HeaderTypes | None = None, + cookies: httpx._types.CookieTypes | None = None, + auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + follow_redirects: bool | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + extensions: dict[str, typing.Any] | None = None, + ) -> httpx.Response: + return super().get( + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def options( # type: ignore[override] + self, + url: httpx._types.URLTypes, + *, + params: httpx._types.QueryParamTypes | None = None, + headers: httpx._types.HeaderTypes | None = None, + cookies: httpx._types.CookieTypes | None = None, + auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + follow_redirects: bool | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + extensions: dict[str, typing.Any] | None = None, + ) -> httpx.Response: + return super().options( + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def head( # type: ignore[override] + self, + url: httpx._types.URLTypes, + *, + params: httpx._types.QueryParamTypes | None = None, + headers: httpx._types.HeaderTypes | None = None, + cookies: httpx._types.CookieTypes | None = None, + auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + follow_redirects: bool | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + extensions: dict[str, typing.Any] | None = None, + ) -> httpx.Response: + return super().head( + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def post( # type: ignore[override] + self, + url: httpx._types.URLTypes, + *, + content: httpx._types.RequestContent | None = None, + data: _RequestData | None = None, + files: httpx._types.RequestFiles | None = None, + json: typing.Any = None, + params: httpx._types.QueryParamTypes | None = None, + headers: httpx._types.HeaderTypes | None = None, + cookies: httpx._types.CookieTypes | None = None, + auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + follow_redirects: bool | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + extensions: dict[str, typing.Any] | None = None, + ) -> httpx.Response: + return super().post( + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def put( # type: ignore[override] + self, + url: httpx._types.URLTypes, + *, + content: httpx._types.RequestContent | None = None, + data: _RequestData | None = None, + files: httpx._types.RequestFiles | None = None, + json: typing.Any = None, + params: httpx._types.QueryParamTypes | None = None, + headers: httpx._types.HeaderTypes | None = None, + cookies: httpx._types.CookieTypes | None = None, + auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + follow_redirects: bool | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + extensions: dict[str, typing.Any] | None = None, + ) -> httpx.Response: + return super().put( + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def patch( # type: ignore[override] + self, + url: httpx._types.URLTypes, + *, + content: httpx._types.RequestContent | None = None, + data: _RequestData | None = None, + files: httpx._types.RequestFiles | None = None, + json: typing.Any = None, + params: httpx._types.QueryParamTypes | None = None, + headers: httpx._types.HeaderTypes | None = None, + cookies: httpx._types.CookieTypes | None = None, + auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + follow_redirects: bool | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + extensions: dict[str, typing.Any] | None = None, + ) -> httpx.Response: + return super().patch( + url, + content=content, + data=data, + files=files, + json=json, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def delete( # type: ignore[override] + self, + url: httpx._types.URLTypes, + *, + params: httpx._types.QueryParamTypes | None = None, + headers: httpx._types.HeaderTypes | None = None, + cookies: httpx._types.CookieTypes | None = None, + auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + follow_redirects: bool | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT, + extensions: dict[str, typing.Any] | None = None, + ) -> httpx.Response: + return super().delete( + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=follow_redirects, + timeout=timeout, + extensions=extensions, + ) + + def websocket_connect( + self, + url: str, + subprotocols: typing.Sequence[str] | None = None, + **kwargs: typing.Any, + ) -> WebSocketTestSession: + url = urljoin("ws://testserver", url) + headers = kwargs.get("headers", {}) + headers.setdefault("connection", "upgrade") + headers.setdefault("sec-websocket-key", "testserver==") + headers.setdefault("sec-websocket-version", "13") + if subprotocols is not None: + headers.setdefault("sec-websocket-protocol", ", ".join(subprotocols)) + kwargs["headers"] = headers + try: + super().request("GET", url, **kwargs) + except _Upgrade as exc: + session = exc.session + else: + raise RuntimeError("Expected WebSocket upgrade") # pragma: no cover + + return session + + def __enter__(self) -> TestClient: + with contextlib.ExitStack() as stack: + self.portal = portal = stack.enter_context(anyio.from_thread.start_blocking_portal(**self.async_backend)) + + @stack.callback + def reset_portal() -> None: + self.portal = None + + send: anyio.create_memory_object_stream[typing.MutableMapping[str, typing.Any] | None] = ( + anyio.create_memory_object_stream(math.inf) + ) + receive: anyio.create_memory_object_stream[typing.MutableMapping[str, typing.Any]] = ( + anyio.create_memory_object_stream(math.inf) + ) + for channel in (*send, *receive): + stack.callback(channel.close) + self.stream_send = StapledObjectStream(*send) + self.stream_receive = StapledObjectStream(*receive) + self.task = portal.start_task_soon(self.lifespan) + portal.call(self.wait_startup) + + @stack.callback + def wait_shutdown() -> None: + portal.call(self.wait_shutdown) + + self.exit_stack = stack.pop_all() + + return self + + def __exit__(self, *args: typing.Any) -> None: + self.exit_stack.close() + + async def lifespan(self) -> None: + scope = {"type": "lifespan", "state": self.app_state} + try: + await self.app(scope, self.stream_receive.receive, self.stream_send.send) + finally: + await self.stream_send.send(None) + + async def wait_startup(self) -> None: + await self.stream_receive.send({"type": "lifespan.startup"}) + + async def receive() -> typing.Any: + message = await self.stream_send.receive() + if message is None: + self.task.result() + return message + + message = await receive() + assert message["type"] in ( + "lifespan.startup.complete", + "lifespan.startup.failed", + ) + if message["type"] == "lifespan.startup.failed": + await receive() + + async def wait_shutdown(self) -> None: + async def receive() -> typing.Any: + message = await self.stream_send.receive() + if message is None: + self.task.result() + return message + + await self.stream_receive.send({"type": "lifespan.shutdown"}) + message = await receive() + assert message["type"] in ( + "lifespan.shutdown.complete", + "lifespan.shutdown.failed", + ) + if message["type"] == "lifespan.shutdown.failed": + await receive() diff --git a/venv/Lib/site-packages/starlette/types.py b/venv/Lib/site-packages/starlette/types.py new file mode 100644 index 00000000..893f8729 --- /dev/null +++ b/venv/Lib/site-packages/starlette/types.py @@ -0,0 +1,24 @@ +import typing + +if typing.TYPE_CHECKING: + from starlette.requests import Request + from starlette.responses import Response + from starlette.websockets import WebSocket + +AppType = typing.TypeVar("AppType") + +Scope = typing.MutableMapping[str, typing.Any] +Message = typing.MutableMapping[str, typing.Any] + +Receive = typing.Callable[[], typing.Awaitable[Message]] +Send = typing.Callable[[Message], typing.Awaitable[None]] + +ASGIApp = typing.Callable[[Scope, Receive, Send], typing.Awaitable[None]] + +StatelessLifespan = typing.Callable[[AppType], typing.AsyncContextManager[None]] +StatefulLifespan = typing.Callable[[AppType], typing.AsyncContextManager[typing.Mapping[str, typing.Any]]] +Lifespan = typing.Union[StatelessLifespan[AppType], StatefulLifespan[AppType]] + +HTTPExceptionHandler = typing.Callable[["Request", Exception], "Response | typing.Awaitable[Response]"] +WebSocketExceptionHandler = typing.Callable[["WebSocket", Exception], typing.Awaitable[None]] +ExceptionHandler = typing.Union[HTTPExceptionHandler, WebSocketExceptionHandler] diff --git a/venv/Lib/site-packages/starlette/websockets.py b/venv/Lib/site-packages/starlette/websockets.py new file mode 100644 index 00000000..6b46f4ea --- /dev/null +++ b/venv/Lib/site-packages/starlette/websockets.py @@ -0,0 +1,195 @@ +from __future__ import annotations + +import enum +import json +import typing + +from starlette.requests import HTTPConnection +from starlette.responses import Response +from starlette.types import Message, Receive, Scope, Send + + +class WebSocketState(enum.Enum): + CONNECTING = 0 + CONNECTED = 1 + DISCONNECTED = 2 + RESPONSE = 3 + + +class WebSocketDisconnect(Exception): + def __init__(self, code: int = 1000, reason: str | None = None) -> None: + self.code = code + self.reason = reason or "" + + +class WebSocket(HTTPConnection): + def __init__(self, scope: Scope, receive: Receive, send: Send) -> None: + super().__init__(scope) + assert scope["type"] == "websocket" + self._receive = receive + self._send = send + self.client_state = WebSocketState.CONNECTING + self.application_state = WebSocketState.CONNECTING + + async def receive(self) -> Message: + """ + Receive ASGI websocket messages, ensuring valid state transitions. + """ + if self.client_state == WebSocketState.CONNECTING: + message = await self._receive() + message_type = message["type"] + if message_type != "websocket.connect": + raise RuntimeError(f'Expected ASGI message "websocket.connect", but got {message_type!r}') + self.client_state = WebSocketState.CONNECTED + return message + elif self.client_state == WebSocketState.CONNECTED: + message = await self._receive() + message_type = message["type"] + if message_type not in {"websocket.receive", "websocket.disconnect"}: + raise RuntimeError( + f'Expected ASGI message "websocket.receive" or "websocket.disconnect", but got {message_type!r}' + ) + if message_type == "websocket.disconnect": + self.client_state = WebSocketState.DISCONNECTED + return message + else: + raise RuntimeError('Cannot call "receive" once a disconnect message has been received.') + + async def send(self, message: Message) -> None: + """ + Send ASGI websocket messages, ensuring valid state transitions. + """ + if self.application_state == WebSocketState.CONNECTING: + message_type = message["type"] + if message_type not in {"websocket.accept", "websocket.close", "websocket.http.response.start"}: + raise RuntimeError( + 'Expected ASGI message "websocket.accept", "websocket.close" or "websocket.http.response.start", ' + f"but got {message_type!r}" + ) + if message_type == "websocket.close": + self.application_state = WebSocketState.DISCONNECTED + elif message_type == "websocket.http.response.start": + self.application_state = WebSocketState.RESPONSE + else: + self.application_state = WebSocketState.CONNECTED + await self._send(message) + elif self.application_state == WebSocketState.CONNECTED: + message_type = message["type"] + if message_type not in {"websocket.send", "websocket.close"}: + raise RuntimeError( + f'Expected ASGI message "websocket.send" or "websocket.close", but got {message_type!r}' + ) + if message_type == "websocket.close": + self.application_state = WebSocketState.DISCONNECTED + try: + await self._send(message) + except OSError: + self.application_state = WebSocketState.DISCONNECTED + raise WebSocketDisconnect(code=1006) + elif self.application_state == WebSocketState.RESPONSE: + message_type = message["type"] + if message_type != "websocket.http.response.body": + raise RuntimeError(f'Expected ASGI message "websocket.http.response.body", but got {message_type!r}') + if not message.get("more_body", False): + self.application_state = WebSocketState.DISCONNECTED + await self._send(message) + else: + raise RuntimeError('Cannot call "send" once a close message has been sent.') + + async def accept( + self, + subprotocol: str | None = None, + headers: typing.Iterable[tuple[bytes, bytes]] | None = None, + ) -> None: + headers = headers or [] + + if self.client_state == WebSocketState.CONNECTING: # pragma: no branch + # If we haven't yet seen the 'connect' message, then wait for it first. + await self.receive() + await self.send({"type": "websocket.accept", "subprotocol": subprotocol, "headers": headers}) + + def _raise_on_disconnect(self, message: Message) -> None: + if message["type"] == "websocket.disconnect": + raise WebSocketDisconnect(message["code"], message.get("reason")) + + async def receive_text(self) -> str: + if self.application_state != WebSocketState.CONNECTED: + raise RuntimeError('WebSocket is not connected. Need to call "accept" first.') + message = await self.receive() + self._raise_on_disconnect(message) + return typing.cast(str, message["text"]) + + async def receive_bytes(self) -> bytes: + if self.application_state != WebSocketState.CONNECTED: + raise RuntimeError('WebSocket is not connected. Need to call "accept" first.') + message = await self.receive() + self._raise_on_disconnect(message) + return typing.cast(bytes, message["bytes"]) + + async def receive_json(self, mode: str = "text") -> typing.Any: + if mode not in {"text", "binary"}: + raise RuntimeError('The "mode" argument should be "text" or "binary".') + if self.application_state != WebSocketState.CONNECTED: + raise RuntimeError('WebSocket is not connected. Need to call "accept" first.') + message = await self.receive() + self._raise_on_disconnect(message) + + if mode == "text": + text = message["text"] + else: + text = message["bytes"].decode("utf-8") + return json.loads(text) + + async def iter_text(self) -> typing.AsyncIterator[str]: + try: + while True: + yield await self.receive_text() + except WebSocketDisconnect: + pass + + async def iter_bytes(self) -> typing.AsyncIterator[bytes]: + try: + while True: + yield await self.receive_bytes() + except WebSocketDisconnect: + pass + + async def iter_json(self) -> typing.AsyncIterator[typing.Any]: + try: + while True: + yield await self.receive_json() + except WebSocketDisconnect: + pass + + async def send_text(self, data: str) -> None: + await self.send({"type": "websocket.send", "text": data}) + + async def send_bytes(self, data: bytes) -> None: + await self.send({"type": "websocket.send", "bytes": data}) + + async def send_json(self, data: typing.Any, mode: str = "text") -> None: + if mode not in {"text", "binary"}: + raise RuntimeError('The "mode" argument should be "text" or "binary".') + text = json.dumps(data, separators=(",", ":"), ensure_ascii=False) + if mode == "text": + await self.send({"type": "websocket.send", "text": text}) + else: + await self.send({"type": "websocket.send", "bytes": text.encode("utf-8")}) + + async def close(self, code: int = 1000, reason: str | None = None) -> None: + await self.send({"type": "websocket.close", "code": code, "reason": reason or ""}) + + async def send_denial_response(self, response: Response) -> None: + if "websocket.http.response" in self.scope.get("extensions", {}): + await response(self.scope, self.receive, self.send) + else: + raise RuntimeError("The server doesn't support the Websocket Denial Response extension.") + + +class WebSocketClose: + def __init__(self, code: int = 1000, reason: str | None = None) -> None: + self.code = code + self.reason = reason or "" + + async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: + await send({"type": "websocket.close", "code": self.code, "reason": self.reason}) diff --git a/venv/Lib/site-packages/twilio-9.6.3.dist-info/INSTALLER b/venv/Lib/site-packages/twilio-9.6.3.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/venv/Lib/site-packages/twilio-9.6.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/twilio-9.6.3.dist-info/METADATA b/venv/Lib/site-packages/twilio-9.6.3.dist-info/METADATA new file mode 100644 index 00000000..268ccefc --- /dev/null +++ b/venv/Lib/site-packages/twilio-9.6.3.dist-info/METADATA @@ -0,0 +1,362 @@ +Metadata-Version: 2.4 +Name: twilio +Version: 9.6.3 +Summary: Twilio API client and TwiML generator +Home-page: https://github.com/twilio/twilio-python/ +Author: Twilio +License: MIT +Keywords: twilio,twiml +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Communications :: Telephony +Requires-Python: >=3.7.0 +Description-Content-Type: text/markdown +License-File: LICENSE +License-File: AUTHORS.md +Requires-Dist: requests>=2.0.0 +Requires-Dist: PyJWT<3.0.0,>=2.0.0 +Requires-Dist: aiohttp>=3.8.4 +Requires-Dist: aiohttp-retry>=2.8.3 +Dynamic: author +Dynamic: classifier +Dynamic: description +Dynamic: description-content-type +Dynamic: home-page +Dynamic: keywords +Dynamic: license-file +Dynamic: requires-dist +Dynamic: requires-python +Dynamic: summary + +# twilio-python + +[![Tests](https://github.com/twilio/twilio-python/actions/workflows/test-and-deploy.yml/badge.svg)](https://github.com/twilio/twilio-python/actions/workflows/test-and-deploy.yml) +[![PyPI](https://img.shields.io/pypi/v/twilio.svg)](https://pypi.python.org/pypi/twilio) +[![PyPI](https://img.shields.io/pypi/pyversions/twilio.svg)](https://pypi.python.org/pypi/twilio) +[![Learn OSS Contribution in TwilioQuest](https://img.shields.io/static/v1?label=TwilioQuest&message=Learn%20to%20contribute%21&color=F22F46&labelColor=1f243c&style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAASFBMVEUAAAAZGRkcHBwjIyMoKCgAAABgYGBoaGiAgICMjIyzs7PJycnMzMzNzc3UoBfd3d3m5ubqrhfrMEDu7u739/f4vSb/3AD///9tbdyEAAAABXRSTlMAAAAAAMJrBrEAAAKoSURBVHgB7ZrRcuI6EESdyxXGYoNFvMD//+l2bSszRgyUYpFAsXOeiJGmj4NkuWx1Qeh+Ekl9DgEXOBwOx+Px5xyQhDykfgq4wG63MxxaR4ddIkg6Ul3g84vCIcjPBA5gmUMeXESrlukuoK33+33uID8TWeLAdOWsKpJYzwVMB7bOzYSGOciyUlXSn0/ABXTosJ1M1SbypZ4O4MbZuIDMU02PMbauhhHMHXbmebmALIiEbbbbbUrpF1gwE9kFfRNAJaP+FQEXCCTGyJ4ngDrjOFo3jEL5JdqjF/pueR4cCeCGgAtwmuRS6gDwaRiGvu+DMFwSBLTE3+jF8JyuV1okPZ+AC4hDFhCHyHQjdjPHUKFDlHSJkHQXMB3KpSwXNGJPcwwTdZiXlRN0gSp0zpWxNtM0beYE0nRH6QIbO7rawwXaBYz0j78gxjokDuv12gVeUuBD0MDi0OQCLvDaAho4juP1Q/jkAncXqIcCfd+7gAu4QLMACCLxpRsSuQh0igu0C9Svhi7weAGZg50L3IE3cai4IfkNZAC8dfdhsUD3CgKBVC9JE5ABAFzg4QL/taYPAAWrHdYcgfLaIgAXWJ7OV38n1LEF8tt2TH29E+QAoDoO5Ve/LtCQDmKM9kPbvCEBApK+IXzbcSJ0cIGF6e8gpcRhUDogWZ8JnaWjPXc/fNnBBUKRngiHgTUSivSzDRDgHZQOLvBQgf8rRt+VdBUUhwkU6VpJ+xcOwQUqZr+mR0kvBUgv6cB4+37hQAkXqE8PwGisGhJtN4xAHMzrsgvI7rccXqSvKh6jltGlrOHA3Xk1At3LC4QiPdX9/0ndHpGVvTjR4bZA1ypAKgVcwE5vx74ulwIugDt8e/X7JgfkucBMIAr26ndnB4UCLnDOqvteQsHlgX9N4A+c4cW3DXSPbwAAAABJRU5ErkJggg==)](https://twil.io/learn-open-source) + +## Documentation + +The documentation for the Twilio API can be found [here][apidocs]. + +The Python library documentation can be found [here][libdocs]. + +## Versions + +`twilio-python` uses a modified version of [Semantic Versioning](https://semver.org) for all changes. [See this document](VERSIONS.md) for details. + +### Supported Python Versions + +This library supports the following Python implementations: + +- Python 3.7 +- Python 3.8 +- Python 3.9 +- Python 3.10 +- Python 3.11 + +## Installation + +Install from PyPi using [pip](https://pip.pypa.io/en/latest/), a +package manager for Python. + +```shell +pip3 install twilio +``` + +If pip install fails on Windows, check the path length of the directory. If it is greater 260 characters then enable [Long Paths](https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation) or choose other shorter location. + +Don't have pip installed? Try installing it, by running this from the command +line: + +```shell +curl https://bootstrap.pypa.io/get-pip.py | python +``` + +Or, you can [download the source code +(ZIP)](https://github.com/twilio/twilio-python/zipball/main 'twilio-python +source code') for `twilio-python`, and then run: + +```shell +python3 setup.py install +``` + +> **Info** +> If the command line gives you an error message that says Permission Denied, try running the above commands with `sudo` (e.g., `sudo pip3 install twilio`). + +### Test your installation + +Try sending yourself an SMS message. Save the following code sample to your computer with a text editor. Be sure to update the `account_sid`, `auth_token`, and `from_` phone number with values from your [Twilio account](https://console.twilio.com). The `to` phone number will be your own mobile phone. + +```python +from twilio.rest import Client + +# Your Account SID and Auth Token from console.twilio.com +account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +auth_token = "your_auth_token" + +client = Client(account_sid, auth_token) + +message = client.messages.create( + to="+15558675309", + from_="+15017250604", + body="Hello from Python!") + +print(message.sid) +``` + +Save the file as `send_sms.py`. In the terminal, `cd` to the directory containing the file you just saved then run: + +```shell +python3 send_sms.py +``` + +After a brief delay, you will receive the text message on your phone. + +> **Warning** +> It's okay to hardcode your credentials when testing locally, but you should use environment variables to keep them secret before committing any code or deploying to production. Check out [How to Set Environment Variables](https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html) for more information. + +## OAuth Feature for Twilio APIs +We are introducing Client Credentials Flow-based OAuth 2.0 authentication. This feature is currently in beta and its implementation is subject to change. + +API examples [here](https://github.com/twilio/twilio-python/blob/main/examples/public_oauth.py) + +Organisation API examples [here](https://github.com/twilio/twilio-python/blob/main/examples/organization_api.py) + +## Use the helper library + +### API Credentials + +The `Twilio` client needs your Twilio credentials. You can either pass these directly to the constructor (see the code below) or via environment variables. + +Authenticating with Account SID and Auth Token: + +```python +from twilio.rest import Client + +account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +auth_token = "your_auth_token" +client = Client(account_sid, auth_token) +``` + +Authenticating with API Key and API Secret: + +```python +from twilio.rest import Client + +api_key = "XXXXXXXXXXXXXXXXX" +api_secret = "YYYYYYYYYYYYYYYYYY" +account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +client = Client(api_key, api_secret, account_sid) +``` + +Alternatively, a `Client` constructor without these parameters will +look for `TWILIO_ACCOUNT_SID` and `TWILIO_AUTH_TOKEN` variables inside the +current environment. + +We suggest storing your credentials as environment variables. Why? You'll never +have to worry about committing your credentials and accidentally posting them +somewhere public. + +```python +from twilio.rest import Client +client = Client() +``` + +### Specify Region and/or Edge + +To take advantage of Twilio's [Global Infrastructure](https://www.twilio.com/docs/global-infrastructure), specify the target Region and Edge for the client: + +> **Note:** When specifying a `region` parameter for a helper library client, be sure to also specify the `edge` parameter. For backward compatibility purposes, specifying a `region` without specifying an `edge` will result in requests being routed to US1. + +```python +from twilio.rest import Client + +client = Client(region='au1', edge='sydney') +``` + +A `Client` constructor without these parameters will also look for `TWILIO_REGION` and `TWILIO_EDGE` variables inside the current environment. + +Alternatively, you may specify the edge and/or region after constructing the Twilio client: + +```python +from twilio.rest import Client + +client = Client() +client.region = 'au1' +client.edge = 'sydney' +``` + +This will result in the `hostname` transforming from `api.twilio.com` to `api.sydney.au1.twilio.com`. + +### Make a Call + +```python +from twilio.rest import Client + +account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +auth_token = "your_auth_token" +client = Client(account_sid, auth_token) + +call = client.calls.create(to="9991231234", + from_="9991231234", + url="http://twimlets.com/holdmusic?Bucket=com.twilio.music.ambient") +print(call.sid) +``` + +### Get data about an existing call + +```python +from twilio.rest import Client + +account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +auth_token = "your_auth_token" +client = Client(account_sid, auth_token) + +call = client.calls.get("CA42ed11f93dc08b952027ffbc406d0868") +print(call.to) +``` + +### Iterate through records + +The library automatically handles paging for you. Collections, such as `calls` and `messages`, have `list` and `stream` methods that page under the hood. With both `list` and `stream`, you can specify the number of records you want to receive (`limit`) and the maximum size you want each page fetch to be (`page_size`). The library will then handle the task for you. + +`list` eagerly fetches all records and returns them as a list, whereas `stream` returns an iterator and lazily retrieves pages of records as you iterate over the collection. You can also page manually using the `page` method. + +`page_size` as a parameter is used to tell how many records should we get in every page and `limit` parameter is used to limit the max number of records we want to fetch. + +#### Use the `list` method + +```python +from twilio.rest import Client + +account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +auth_token = "your_auth_token" +client = Client(account_sid, auth_token) + +for sms in client.messages.list(): + print(sms.to) +``` + +```python +client.messages.list(limit=20, page_size=20) +``` +This will make 1 call that will fetch 20 records from backend service. + +```python +client.messages.list(limit=20, page_size=10) +``` +This will make 2 calls that will fetch 10 records each from backend service. + +```python +client.messages.list(limit=20, page_size=100) +``` +This will make 1 call which will fetch 100 records but user will get only 20 records. + +### Asynchronous API Requests + +By default, the Twilio Client will make synchronous requests to the Twilio API. To allow for asynchronous, non-blocking requests, we've included an optional asynchronous HTTP client. When used with the Client and the accompanying `*_async` methods, requests made to the Twilio API will be performed asynchronously. + +```python +from twilio.http.async_http_client import AsyncTwilioHttpClient +from twilio.rest import Client + +async def main(): + account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + auth_token = "your_auth_token" + http_client = AsyncTwilioHttpClient() + client = Client(account_sid, auth_token, http_client=http_client) + + message = await client.messages.create_async(to="+12316851234", from_="+15555555555", + body="Hello there!") + +asyncio.run(main()) +``` + +### Enable Debug Logging + +Log the API request and response data to the console: + +```python +import logging + +client = Client(account_sid, auth_token) +logging.basicConfig() +client.http_client.logger.setLevel(logging.INFO) +``` + +Log the API request and response data to a file: + +```python +import logging + +client = Client(account_sid, auth_token) +logging.basicConfig(filename='./log.txt') +client.http_client.logger.setLevel(logging.INFO) +``` + +### Handling Exceptions + +Version 8.x of `twilio-python` exports an exception class to help you handle exceptions that are specific to Twilio methods. To use it, import `TwilioRestException` and catch exceptions as follows: + +```python +from twilio.rest import Client +from twilio.base.exceptions import TwilioRestException + +account_sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +auth_token = "your_auth_token" +client = Client(account_sid, auth_token) + +try: + message = client.messages.create(to="+12316851234", from_="+15555555555", + body="Hello there!") +except TwilioRestException as e: + print(e) +``` + +### Generating TwiML + +To control phone calls, your application needs to output [TwiML][twiml]. + +Use `twilio.twiml.Response` to easily create such responses. + +```python +from twilio.twiml.voice_response import VoiceResponse + +r = VoiceResponse() +r.say("Welcome to twilio!") +print(str(r)) +``` + +```xml + +Welcome to twilio! +``` + +### Other advanced examples + +- [Learn how to create your own custom HTTP client](./advanced-examples/custom-http-client.md) + +### Docker Image + +The `Dockerfile` present in this repository and its respective `twilio/twilio-python` Docker image are currently used by Twilio for testing purposes only. + +### Getting help + +If you need help installing or using the library, please check the [Twilio Support Help Center](https://support.twilio.com) first, and [file a support ticket](https://twilio.com/help/contact) if you don't find an answer to your question. + +If you've instead found a bug in the library or would like new features added, go ahead and open issues or pull requests against this repo! + +[apidocs]: https://www.twilio.com/docs/api +[twiml]: https://www.twilio.com/docs/api/twiml +[libdocs]: https://twilio.github.io/twilio-python diff --git a/venv/Lib/site-packages/twilio-9.6.3.dist-info/RECORD b/venv/Lib/site-packages/twilio-9.6.3.dist-info/RECORD new file mode 100644 index 00000000..1a4253f0 --- /dev/null +++ b/venv/Lib/site-packages/twilio-9.6.3.dist-info/RECORD @@ -0,0 +1,1368 @@ +twilio-9.6.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +twilio-9.6.3.dist-info/METADATA,sha256=QJN1GFIpg-3TCVxgNQPspyhipDKWXVPejFVIbViJZXk,13510 +twilio-9.6.3.dist-info/RECORD,, +twilio-9.6.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +twilio-9.6.3.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109 +twilio-9.6.3.dist-info/licenses/AUTHORS.md,sha256=o3292UoaDN3jrjNs-qzN7yDnhvH6TqV7EzSfJdnCf4Q,1387 +twilio-9.6.3.dist-info/licenses/LICENSE,sha256=8UK19n5LbVBeSP2SuveHtbmQ2BMV-Dat89xZ8As-YZ0,1108 +twilio-9.6.3.dist-info/top_level.txt,sha256=fAdnbTJw2Q-bY1dyTpCPQR9_kIISEW1tNn4jYb-g3Ic,7 +twilio/__init__.py,sha256=VcHftSjmpZe8gXTigvYpbaBJZm535eHadrPCB39HPZs,76 +twilio/__pycache__/__init__.cpython-312.pyc,, +twilio/__pycache__/request_validator.cpython-312.pyc,, +twilio/auth_strategy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +twilio/auth_strategy/__pycache__/__init__.cpython-312.pyc,, +twilio/auth_strategy/__pycache__/auth_strategy.cpython-312.pyc,, +twilio/auth_strategy/__pycache__/auth_type.cpython-312.pyc,, +twilio/auth_strategy/__pycache__/no_auth_strategy.cpython-312.pyc,, +twilio/auth_strategy/__pycache__/token_auth_strategy.cpython-312.pyc,, +twilio/auth_strategy/auth_strategy.py,sha256=fY6KQdzezUB5EE0mt5tKU01-pvi2u1ugxeyy3b62MnE,521 +twilio/auth_strategy/auth_type.py,sha256=IwG71YYNfc9TJPL-T-lgJH0l-CSDcEIVaTx6UDeNAJA,240 +twilio/auth_strategy/no_auth_strategy.py,sha256=i87zDWRF42wInZGhigHMepo7904I8CkHx-ozJvfpX7s,322 +twilio/auth_strategy/token_auth_strategy.py,sha256=z0OBeGTpZrhArWGXEVgB7uieNgLszNlMq6UL6YO6KpU,1894 +twilio/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +twilio/base/__pycache__/__init__.cpython-312.pyc,, +twilio/base/__pycache__/client_base.cpython-312.pyc,, +twilio/base/__pycache__/deserialize.cpython-312.pyc,, +twilio/base/__pycache__/domain.cpython-312.pyc,, +twilio/base/__pycache__/exceptions.cpython-312.pyc,, +twilio/base/__pycache__/instance_context.cpython-312.pyc,, +twilio/base/__pycache__/instance_resource.cpython-312.pyc,, +twilio/base/__pycache__/list_resource.cpython-312.pyc,, +twilio/base/__pycache__/obsolete.cpython-312.pyc,, +twilio/base/__pycache__/page.cpython-312.pyc,, +twilio/base/__pycache__/serialize.cpython-312.pyc,, +twilio/base/__pycache__/values.cpython-312.pyc,, +twilio/base/__pycache__/version.cpython-312.pyc,, +twilio/base/client_base.py,sha256=cTUD-570kA1nbg-eLAquYGwNvbMgazjFlMinFqHWsbU,9592 +twilio/base/deserialize.py,sha256=ro6hPYvNK1c7WrpWeS3PgM_p0ppjPwJxM2iYVhgCvDk,2005 +twilio/base/domain.py,sha256=z0ESHLf2LEQxfi1JJ2xEQk8tQheW0mU1Bt_r3ko41U4,2978 +twilio/base/exceptions.py,sha256=qYou_kqs04_0ybcVzcfpRqN88RYf41iINB4B8egok7Q,2890 +twilio/base/instance_context.py,sha256=ln0XUHSb6ByjV6oHx0sa7TknQ0ahe8yuk-mhmOM5fMU,147 +twilio/base/instance_resource.py,sha256=84FA89HN55_rSWUQ2rwRFGaABXRYoudcLaYvBQDbQmo,148 +twilio/base/list_resource.py,sha256=WLDg_ByCMR9P7YOHLuQxNjkZvToteF7A3k-ZCb853Xc,144 +twilio/base/obsolete.py,sha256=A5EqW8Nu4aLatse83CIxdrZXxXic8yhaXiQC16RyvVg,1417 +twilio/base/page.py,sha256=YTKd63kVfwb1OHmf74_PJ0ucXS_Vpp3f1IiQP2ZIBoc,5264 +twilio/base/serialize.py,sha256=TlIJtVfXArDLLmH8WyfGZmczffxWZNuUtOckd4d9aJ0,2316 +twilio/base/values.py,sha256=okdxSj7zc0tg_IfScuZYQKOX-fHu99ZXQcFh_XuBAuE,280 +twilio/base/version.py,sha256=eRnp96pRPim0KxdxZtf34phugQ9s-hhVeeOUI7tatn8,14611 +twilio/credential/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +twilio/credential/__pycache__/__init__.cpython-312.pyc,, +twilio/credential/__pycache__/client_credential_provider.cpython-312.pyc,, +twilio/credential/__pycache__/credential_provider.cpython-312.pyc,, +twilio/credential/__pycache__/orgs_credential_provider.cpython-312.pyc,, +twilio/credential/client_credential_provider.py,sha256=VunG0k3knjK9t2UMCTnWxgjdMqerwP3bVu2thYb21Nk,1184 +twilio/credential/credential_provider.py,sha256=1cuNNjCoYBipYVDIfItc-r5HFz-ga5_SK8vPKkttogo,352 +twilio/credential/orgs_credential_provider.py,sha256=ETIthhf1u4OZYhPjoqrP0V2WA6Q1JPPPwojja-Aq10o,1174 +twilio/http/__init__.py,sha256=aklR5-Xl8fnZNgV3jxylkbCcJCBEKQM3nt024ttm-Gs,3434 +twilio/http/__pycache__/__init__.cpython-312.pyc,, +twilio/http/__pycache__/async_http_client.cpython-312.pyc,, +twilio/http/__pycache__/client_token_manager.cpython-312.pyc,, +twilio/http/__pycache__/http_client.cpython-312.pyc,, +twilio/http/__pycache__/orgs_token_manager.cpython-312.pyc,, +twilio/http/__pycache__/request.cpython-312.pyc,, +twilio/http/__pycache__/response.cpython-312.pyc,, +twilio/http/__pycache__/token_manager.cpython-312.pyc,, +twilio/http/__pycache__/validation_client.cpython-312.pyc,, +twilio/http/async_http_client.py,sha256=Ei7OXkbp26n3MAtWsX-0mTVZcEOgBui4Y4y8T20l1x0,4503 +twilio/http/client_token_manager.py,sha256=p6CKaXjnPjYM9ku0n1puHgyFSIJLU2FN-31anjVqPUk,1154 +twilio/http/http_client.py,sha256=FxvtTb-EbuWMcPttpDzLe1BBZZu1P2KWjbWaNX-I6Bo,4141 +twilio/http/orgs_token_manager.py,sha256=WcxkMITQdJRkaT7t7AovdARNfc-_mdilacNIWEQBLUY,1149 +twilio/http/request.py,sha256=kVHsIN0kJQXRySE2VRVQwCPmp9ZycMxJ9zG7FnvArhM,2655 +twilio/http/response.py,sha256=BmDMxrJFDhgAxXQzoLwzO5pZSuw-y9KjEA-i3lz3yY4,518 +twilio/http/token_manager.py,sha256=pmt5lw3LsCGCIinmt7G8hq468TOJwYszYmy5-u8iMUE,128 +twilio/http/validation_client.py,sha256=ndVZrpcpG9i7db10mbrCjmU3ks8rqYu4EDWJeWnKFUM,4818 +twilio/jwt/__init__.py,sha256=MScUNrJ0oRY16IYehs1wYQVGlV5QKxLY0msD9xmjRpo,5085 +twilio/jwt/__pycache__/__init__.cpython-312.pyc,, +twilio/jwt/access_token/__init__.py,sha256=RJOJBVlO4xm3hgiltdFNKOgInJVId3G8CYVkhx6vP54,2415 +twilio/jwt/access_token/__pycache__/__init__.cpython-312.pyc,, +twilio/jwt/access_token/__pycache__/grants.cpython-312.pyc,, +twilio/jwt/access_token/grants.py,sha256=CVuyFTkyRC9nCc8Z70KpBpyYPygYqku08l8hoXO6BOc,4902 +twilio/jwt/client/__init__.py,sha256=GCWbuOKucutdnMIMtTesx0qvjEs25ieB_0upacFT604,3982 +twilio/jwt/client/__pycache__/__init__.cpython-312.pyc,, +twilio/jwt/taskrouter/__init__.py,sha256=2LIrC_6D4qvW278bKvqKM-VDBYLhwXxzwKfuri6LQ9I,5726 +twilio/jwt/taskrouter/__pycache__/__init__.cpython-312.pyc,, +twilio/jwt/taskrouter/__pycache__/capabilities.cpython-312.pyc,, +twilio/jwt/taskrouter/capabilities.py,sha256=TGE-YHo60LL-ubtu4JJitO0sviweqNPQjsRzBjWBzxo,4309 +twilio/jwt/validation/__init__.py,sha256=NSTRTHrEp5aoI-jbcc7KrKCRYIPMK5SITRMKj4y_sKQ,3156 +twilio/jwt/validation/__pycache__/__init__.cpython-312.pyc,, +twilio/request_validator.py,sha256=ZeoQ7BbnPrDGTy-M_RzcLq0l8Hir64Il5VbiqyOJNdc,4100 +twilio/rest/__init__.py,sha256=u46sq9dnCH4fZWlghIxEMxSQfQclMYcKPpaoW7IvP_Q,22772 +twilio/rest/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/accounts/AccountsBase.py,sha256=AqLmd6aIbV985gG5b473bkD2DqejaY4S3lvZaiNwcwg,1211 +twilio/rest/accounts/__init__.py,sha256=Oj-WM5ZDQWaF-2jstKhWRRPpkuCLs5AlDBpQlGDfZ28,1168 +twilio/rest/accounts/__pycache__/AccountsBase.cpython-312.pyc,, +twilio/rest/accounts/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/accounts/v1/__init__.py,sha256=R_igwYsDAEPd2evNtCQC7L1hyulyhJR-cC2_-5Hcm90,3035 +twilio/rest/accounts/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/accounts/v1/__pycache__/auth_token_promotion.cpython-312.pyc,, +twilio/rest/accounts/v1/__pycache__/bulk_consents.cpython-312.pyc,, +twilio/rest/accounts/v1/__pycache__/bulk_contacts.cpython-312.pyc,, +twilio/rest/accounts/v1/__pycache__/safelist.cpython-312.pyc,, +twilio/rest/accounts/v1/__pycache__/secondary_auth_token.cpython-312.pyc,, +twilio/rest/accounts/v1/auth_token_promotion.py,sha256=CEPC3tjgkDuq_qi1oGso40VWYuV9IXUu4ccMeFnZk3k,5693 +twilio/rest/accounts/v1/bulk_consents.py,sha256=luOHxVumkZ7CpCJInni3F8-xkVdh_gbxArWYa6gPWwk,5427 +twilio/rest/accounts/v1/bulk_contacts.py,sha256=aNvChaLiqiSgLPxCcZ6T6-TJcBz8B8KkAkjf5x6bthg,4673 +twilio/rest/accounts/v1/credential/__init__.py,sha256=NsXgoL4scQZKaq3Q1qIpWSGGbjPWF2KzOHfL6iwkLPo,1766 +twilio/rest/accounts/v1/credential/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/accounts/v1/credential/__pycache__/aws.cpython-312.pyc,, +twilio/rest/accounts/v1/credential/__pycache__/public_key.cpython-312.pyc,, +twilio/rest/accounts/v1/credential/aws.py,sha256=G9wy35gNqQwEMeLiqmsTwJzi4AGHBpftderkqEqdcWg,20690 +twilio/rest/accounts/v1/credential/public_key.py,sha256=XqkXV0xJv1In9T8uPea25gxj0ibhXSNcfUgY4uhu0fU,21208 +twilio/rest/accounts/v1/safelist.py,sha256=pT5xFckxFZ5yAPvqfesyjGUsjObQgcuDv_0qEnQFL3Y,6774 +twilio/rest/accounts/v1/secondary_auth_token.py,sha256=v6E6teddkZx0e6Mf8_wxMuYprtiab8VHjlUNg4yymSA,6605 +twilio/rest/api/ApiBase.py,sha256=1118YkG0wU9g7mMByeOtL4HfpUGvePUq4fK3_rpnsKU,1209 +twilio/rest/api/__init__.py,sha256=IF3HTJJA-JYCkkGZ_Mr6Js5AE3DVR7kVVfWZIbabN5Q,8255 +twilio/rest/api/__pycache__/ApiBase.cpython-312.pyc,, +twilio/rest/api/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/__init__.py,sha256=G3bZ5wo8gF9DrYNnYOVztO-T2-vPg_mBvHNXBVAaiSM,1806 +twilio/rest/api/v2010/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/__init__.py,sha256=Sm9ZE-1zXfhgMPK7drfcsXPJsbQqljhyRf_0S6m4W2A,37355 +twilio/rest/api/v2010/account/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/application.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/authorized_connect_app.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/balance.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/connect_app.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/key.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/new_key.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/new_signing_key.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/notification.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/outgoing_caller_id.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/short_code.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/signing_key.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/token.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/transcription.cpython-312.pyc,, +twilio/rest/api/v2010/account/__pycache__/validation_request.cpython-312.pyc,, +twilio/rest/api/v2010/account/address/__init__.py,sha256=vdZk4EaH3fidb4Th3a_KTaZxTkWFKa2QvUd-hKWvDvw,39062 +twilio/rest/api/v2010/account/address/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/address/__pycache__/dependent_phone_number.cpython-312.pyc,, +twilio/rest/api/v2010/account/address/dependent_phone_number.py,sha256=sMQLvzyiphrWC0VVjaCxgXBgyBRz94DjsQXzQfRRoJY,17366 +twilio/rest/api/v2010/account/application.py,sha256=TS8FsKf56PUiCE7B_abo0rvotD7xseg8dhRToypH0uc,49301 +twilio/rest/api/v2010/account/authorized_connect_app.py,sha256=F7PFVW5KZPz90UO3q0WTk1gR4uRJI7TyMVO8A0NyFWQ,17145 +twilio/rest/api/v2010/account/available_phone_number_country/__init__.py,sha256=sqW0aE7vhte9lavKlQyXC3ThpDrLrtvunpiix0peFw4,21896 +twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/local.cpython-312.pyc,, +twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/machine_to_machine.cpython-312.pyc,, +twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/mobile.cpython-312.pyc,, +twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/national.cpython-312.pyc,, +twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/shared_cost.cpython-312.pyc,, +twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/toll_free.cpython-312.pyc,, +twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/voip.cpython-312.pyc,, +twilio/rest/api/v2010/account/available_phone_number_country/local.py,sha256=laEx-fN4FMB_KOpj_c1UGlxR_iE771gboTlULr6lOCc,47262 +twilio/rest/api/v2010/account/available_phone_number_country/machine_to_machine.py,sha256=qcOEMC5jSht_SIva5o4E9AQkVMYuNCFoWFtI9WyVKn0,47233 +twilio/rest/api/v2010/account/available_phone_number_country/mobile.py,sha256=mcgfpgsgv3IPUSLTvY2uxDQyZbUPwITtdl_uEkwR038,46883 +twilio/rest/api/v2010/account/available_phone_number_country/national.py,sha256=7lj-_Cz7YHFWFJlTEJBV--eXEdN9xfJ-V6O51jgrhtQ,46953 +twilio/rest/api/v2010/account/available_phone_number_country/shared_cost.py,sha256=tALZGWREUHPshZ7XHdc8Q8Pgk_VeROu1a1i08BqJy0I,47023 +twilio/rest/api/v2010/account/available_phone_number_country/toll_free.py,sha256=roXo-I5eMYGRo0io77CPNxmEvMxcMeHDO6n49Vc081g,46953 +twilio/rest/api/v2010/account/available_phone_number_country/voip.py,sha256=2YVwsl_2KLYqhaQiZUqveWBmE2y89oyfHz3nvzf0iGY,46813 +twilio/rest/api/v2010/account/balance.py,sha256=K_7BbuHsg8Aeixu1aTGvOxkXahrDrsZGmrHEj_sxaA4,3538 +twilio/rest/api/v2010/account/call/__init__.py,sha256=BYVO4Xk4qxSI07LGZdD8Ehuk9HiOql_nQKNKlfMkVyw,93513 +twilio/rest/api/v2010/account/call/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/call/__pycache__/event.cpython-312.pyc,, +twilio/rest/api/v2010/account/call/__pycache__/notification.cpython-312.pyc,, +twilio/rest/api/v2010/account/call/__pycache__/payment.cpython-312.pyc,, +twilio/rest/api/v2010/account/call/__pycache__/recording.cpython-312.pyc,, +twilio/rest/api/v2010/account/call/__pycache__/siprec.cpython-312.pyc,, +twilio/rest/api/v2010/account/call/__pycache__/stream.cpython-312.pyc,, +twilio/rest/api/v2010/account/call/__pycache__/transcription.cpython-312.pyc,, +twilio/rest/api/v2010/account/call/__pycache__/user_defined_message.cpython-312.pyc,, +twilio/rest/api/v2010/account/call/__pycache__/user_defined_message_subscription.cpython-312.pyc,, +twilio/rest/api/v2010/account/call/event.py,sha256=35dC9vby41o3dpr2horEB_9T3y-lL0LcTpkZwkF5gJo,10978 +twilio/rest/api/v2010/account/call/notification.py,sha256=aXiBKdoenFitiDbLHonqdalRg1sv8bLPLkrsAFaatgM,28832 +twilio/rest/api/v2010/account/call/payment.py,sha256=hSxpKIPQvFAc3qj3YyiuQmXfNbGtWHXSo1C_WN3av8U,24310 +twilio/rest/api/v2010/account/call/recording.py,sha256=PopYJRkdLNWsOKneTjOyz20xWbBRjdVdB6qcWrR_1x4,39698 +twilio/rest/api/v2010/account/call/siprec.py,sha256=ih7ryOlR6EizYbaaZ3a9A-jgApmEFEloAd8RyqZRNjc,77906 +twilio/rest/api/v2010/account/call/stream.py,sha256=ZwtFxhtNzHKNIndruUTHb2zUgxJAtmdCHSf4vYmZwoc,77929 +twilio/rest/api/v2010/account/call/transcription.py,sha256=BmAAS6uyqMkYT5GFTSQo6nWTJRUZto5ir_FLpRuIEO0,17830 +twilio/rest/api/v2010/account/call/user_defined_message.py,sha256=lRrMjXP8vTJTd_AVOeNdu8o2qhbL8XDHlwn78fuYjLc,5667 +twilio/rest/api/v2010/account/call/user_defined_message_subscription.py,sha256=v7R8MBXAqZHO4AdojZfTOMRzDW2IlBDmOq-nv4xb8aw,11342 +twilio/rest/api/v2010/account/conference/__init__.py,sha256=tV6mKe9A4NdQdWWr5vPRGzjugsXaMgUwLdroBdSBGdk,47964 +twilio/rest/api/v2010/account/conference/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/conference/__pycache__/participant.cpython-312.pyc,, +twilio/rest/api/v2010/account/conference/__pycache__/recording.cpython-312.pyc,, +twilio/rest/api/v2010/account/conference/participant.py,sha256=9t2FkE75w-TWlUA3EmxGc3wwYikRjKHON-y4D3EJUTQ,79654 +twilio/rest/api/v2010/account/conference/recording.py,sha256=Nt715MUKsj1_UxedykHPGbKdTm3wvAfY1W8Fwgjc5nQ,33542 +twilio/rest/api/v2010/account/connect_app.py,sha256=lPHPbHrXq39lSyjfOr_MQZwTl4_aPRHtzj4mliJKJiI,27352 +twilio/rest/api/v2010/account/incoming_phone_number/__init__.py,sha256=X-oJqbA8oRk442_C5ISegdqsNy0oZd0XePub0nJ79sE,74914 +twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/local.cpython-312.pyc,, +twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/mobile.cpython-312.pyc,, +twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/toll_free.cpython-312.pyc,, +twilio/rest/api/v2010/account/incoming_phone_number/assigned_add_on/__init__.py,sha256=dMaCWRPylUFGS-rCh7VPcodWv-TaiYYyHB9b6KU4tyI,21663 +twilio/rest/api/v2010/account/incoming_phone_number/assigned_add_on/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/incoming_phone_number/assigned_add_on/__pycache__/assigned_add_on_extension.cpython-312.pyc,, +twilio/rest/api/v2010/account/incoming_phone_number/assigned_add_on/assigned_add_on_extension.py,sha256=FxyLuWNlPgPNzR2rbP4fH_VXp5ZNzdxFCa2ZjeRN4Pc,18810 +twilio/rest/api/v2010/account/incoming_phone_number/local.py,sha256=2V5X3oWot6bbrjccEFmq_dm7l8nNkft-Fk7RsmUaol0,37854 +twilio/rest/api/v2010/account/incoming_phone_number/mobile.py,sha256=R2rNjLg2J_Xu656cdw9sncT6uGXvty7t8RcptnWMY8I,37938 +twilio/rest/api/v2010/account/incoming_phone_number/toll_free.py,sha256=eKn4qqcxHadSlRKo89UWVGeZqymeOhjzi1CIMOJW8HY,38024 +twilio/rest/api/v2010/account/key.py,sha256=7o10k4zQXssQanG1hHN2ARlwx_LSETXyFzH4Q7ew2P8,18800 +twilio/rest/api/v2010/account/message/__init__.py,sha256=UuqQJGG4QWdXiEoVo9lxghbA_dm5an9l0pkO3sm94-M,58874 +twilio/rest/api/v2010/account/message/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/message/__pycache__/feedback.cpython-312.pyc,, +twilio/rest/api/v2010/account/message/__pycache__/media.cpython-312.pyc,, +twilio/rest/api/v2010/account/message/feedback.py,sha256=2gGH74VJbI9pICWkq1wzfokE6viCVg9FCh0nUOMhEIQ,5586 +twilio/rest/api/v2010/account/message/media.py,sha256=58JeQHU_XjVSkND6EZvFp6fvqmcqqZUXldP7m310jkA,28066 +twilio/rest/api/v2010/account/new_key.py,sha256=QQRwQ55JXp008p2VHbjtLcxu222aSYWIIrpOAqYCo7c,5174 +twilio/rest/api/v2010/account/new_signing_key.py,sha256=ml4mwDgkK06FUKJWFI4KSNMho1EmBGwXU4tKJ4u8wpY,5202 +twilio/rest/api/v2010/account/notification.py,sha256=ZzA_0h_ivRe2gRPZPXouJxW-lFBQlk763NdX5n0rcXw,27974 +twilio/rest/api/v2010/account/outgoing_caller_id.py,sha256=FBXTNqu9Fg5Xt34AIZU75rNIGkLH9mvUARzoVL7x--c,23010 +twilio/rest/api/v2010/account/queue/__init__.py,sha256=0NbAGOuAcf4bnSBex_71vxyruCB7p1w2h2Fex7FzQQ4,23629 +twilio/rest/api/v2010/account/queue/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/queue/__pycache__/member.cpython-312.pyc,, +twilio/rest/api/v2010/account/queue/member.py,sha256=jVbeoDZ9eh3NgaMYwxqkK79NsMsxA0bqJ_e2YG6psqo,19888 +twilio/rest/api/v2010/account/recording/__init__.py,sha256=iwZNdf2cByvRvosP3MNbnaNllAFx6pYLP_hrHUXFbQE,38236 +twilio/rest/api/v2010/account/recording/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/recording/__pycache__/transcription.cpython-312.pyc,, +twilio/rest/api/v2010/account/recording/add_on_result/__init__.py,sha256=SEcSdT9l8zz1FbtOk-BTtek4akBIJ7nq5gvbGHuLmA4,19764 +twilio/rest/api/v2010/account/recording/add_on_result/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/recording/add_on_result/payload/__init__.py,sha256=2P-YLw4EX98LXPlvSweN55l9Eh1O8_NIbaEOxFKMeyc,20438 +twilio/rest/api/v2010/account/recording/add_on_result/payload/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/recording/add_on_result/payload/__pycache__/data.cpython-312.pyc,, +twilio/rest/api/v2010/account/recording/add_on_result/payload/data.py,sha256=l1XKqSpFwHr_FlWee9LSw83hWpk3DnIU3llAs94Oeu0,7986 +twilio/rest/api/v2010/account/recording/transcription.py,sha256=2Sd-gon5TzQ_VFxypJLzGscq77_Sc-SD-RWbpVe4rhA,19533 +twilio/rest/api/v2010/account/short_code.py,sha256=cGWy0l9ZEgWJ_LeYlyxHT9uxVBY1nGs4oQqPzWOpUUk,27163 +twilio/rest/api/v2010/account/signing_key.py,sha256=xlcskx0qnbRRHDb_-1wSazdVioI07TrflMNNZBVjFj0,18187 +twilio/rest/api/v2010/account/sip/__init__.py,sha256=UNiLJ1eMTojjpoUrhgnV4Pux6F4udK3U7eVOMOHp9ws,2871 +twilio/rest/api/v2010/account/sip/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/credential_list/__init__.py,sha256=6Iz29WLYKKfzmqxGwQ00eYF1qR0KM2QH6GRNNTYRMuQ,22479 +twilio/rest/api/v2010/account/sip/credential_list/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/credential_list/__pycache__/credential.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/credential_list/credential.py,sha256=MqjBJV_lVJDBOXAiZPOsjIorJi6fT59y_rNAvWJE2ec,23958 +twilio/rest/api/v2010/account/sip/domain/__init__.py,sha256=N5Fg6CAZVWA0n_NpZWN4b5HDnL3ux3t8zFIeHhgBajY,46828 +twilio/rest/api/v2010/account/sip/domain/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/domain/__pycache__/credential_list_mapping.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/domain/__pycache__/ip_access_control_list_mapping.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/domain/auth_types/__init__.py,sha256=9e9q4NNr8KnUwHdYNbh2fpuaAVUuZ2OeQCuRQc-gsco,2758 +twilio/rest/api/v2010/account/sip/domain/auth_types/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__init__.py,sha256=nolfbRsWWIcMstPOS1VXOH9gDrNceSCUQYfcM4OSIXo,3332 +twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/auth_calls_credential_list_mapping.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/auth_calls_ip_access_control_list_mapping.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/auth_calls_credential_list_mapping.py,sha256=-qOf-2WU1AxDwO7ASuA62MQ1I8TiXgOhfjpJKcn2uvs,21353 +twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/auth_calls_ip_access_control_list_mapping.py,sha256=ddyvBSX5bi1rybHobzg-yrDfGyqT6yTgwZCiek9IdMM,21894 +twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__init__.py,sha256=L0TAMoyPSClaHsol6TCehYLaBbNTf9EXMHSM2ipyDKA,2473 +twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__pycache__/auth_registrations_credential_list_mapping.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/auth_registrations_credential_list_mapping.py,sha256=tGa7y9pBeZFyzTVea9MJlFzS8Hmo_QoyEAnlLF9m-Tg,21961 +twilio/rest/api/v2010/account/sip/domain/credential_list_mapping.py,sha256=xq5A5I1I_mY7uuAVQSrIXk0SXrTcvarSRDn_u9XPZfg,20806 +twilio/rest/api/v2010/account/sip/domain/ip_access_control_list_mapping.py,sha256=FAhe9JiJBX28oWKuBg7VmxyXjCb2IU-H4icW3s1IZbU,21077 +twilio/rest/api/v2010/account/sip/ip_access_control_list/__init__.py,sha256=a8zaJdVdF2pTtxiaCws9V0ktd-mbb3dCBwxP-pTTCIM,23009 +twilio/rest/api/v2010/account/sip/ip_access_control_list/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/ip_access_control_list/__pycache__/ip_address.cpython-312.pyc,, +twilio/rest/api/v2010/account/sip/ip_access_control_list/ip_address.py,sha256=jIYtlIx04iTR4dOJFEAyNfglGAKwJzCJ4g6QeTRplVE,27439 +twilio/rest/api/v2010/account/token.py,sha256=y4Qw6yQgr9uC2lbVxoTQ3YOXE6oEkv1Q8d56uf777D8,5212 +twilio/rest/api/v2010/account/transcription.py,sha256=k_P5_2VUd5CNgN5ia4zV3FoqW6KhMdYbZv_YYGtnDBE,18559 +twilio/rest/api/v2010/account/usage/__init__.py,sha256=uuxXF4PSniarhk76bNQxiOXKpBGhFXDVJhNiO-T69qI,2220 +twilio/rest/api/v2010/account/usage/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/__pycache__/trigger.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/record/__init__.py,sha256=9EjEEbxXJcIIUZjK5v6eQ-581RfhJreccq4lm0qymcc,68865 +twilio/rest/api/v2010/account/usage/record/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/record/__pycache__/all_time.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/record/__pycache__/daily.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/record/__pycache__/last_month.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/record/__pycache__/monthly.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/record/__pycache__/this_month.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/record/__pycache__/today.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/record/__pycache__/yearly.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/record/__pycache__/yesterday.cpython-312.pyc,, +twilio/rest/api/v2010/account/usage/record/all_time.py,sha256=Qj2ph9VT3ezj5_ZK9ANXkT3wJZmLWEHHTEtSz6Xyzqk,65509 +twilio/rest/api/v2010/account/usage/record/daily.py,sha256=puhl_bIMspI9LOypZsupUVgymJ3_e-nbnWvTErCy_5o,65417 +twilio/rest/api/v2010/account/usage/record/last_month.py,sha256=UFnee7ZbLqBt-NbIYwgknLLWvibPFAIQnweFcPUfVZQ,65601 +twilio/rest/api/v2010/account/usage/record/monthly.py,sha256=xj_dsqBtHDm-7ydC2dDNy4zDPTB9h0S0j4K3wECfvyk,65509 +twilio/rest/api/v2010/account/usage/record/this_month.py,sha256=ZBmGSy6XNn2h04l_EY9zojjrKmA-c16DZIQFV_mS_0M,65601 +twilio/rest/api/v2010/account/usage/record/today.py,sha256=X-Tdd0CVL9VpCMbdgntzshadhHsTPcP0ozKj4NFsPZ0,65417 +twilio/rest/api/v2010/account/usage/record/yearly.py,sha256=fuzQdPbzKLB0bDWCHMx5Z2S-m6Edu0RDi5vZ36DkmE0,65463 +twilio/rest/api/v2010/account/usage/record/yesterday.py,sha256=vxoFxArKfrYhxgNh9f5LJIckv3xiZ39MEWJT3JwmeWQ,65601 +twilio/rest/api/v2010/account/usage/trigger.py,sha256=I8UTmyz9IZGKwQ_-RST3zzA1kZdeBoEOivstoCGCJqk,77238 +twilio/rest/api/v2010/account/validation_request.py,sha256=6ySMvEZxVIn5bPbD3j5l5XaUZEyncLkrWnlchEQRds0,7786 +twilio/rest/assistants/AssistantsBase.py,sha256=zEffT94q3Z61xfAO_L5x66CwpLTcwk9d47V8iBAQhyo,1225 +twilio/rest/assistants/__init__.py,sha256=4Wu-shnCXczxJryvZmphy2Zg7vppA4IFTnO-nXqQcrw,1578 +twilio/rest/assistants/__pycache__/AssistantsBase.cpython-312.pyc,, +twilio/rest/assistants/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/assistants/v1/__init__.py,sha256=FHupHKV682ELSutx8B9JUMFqfaBO2X4ELcv0JgHLtqs,2407 +twilio/rest/assistants/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/assistants/v1/__pycache__/policy.cpython-312.pyc,, +twilio/rest/assistants/v1/__pycache__/tool.cpython-312.pyc,, +twilio/rest/assistants/v1/assistant/__init__.py,sha256=Sx5ueNQP0JN19eCDcaME5RPu8jo-CQ6SRLI5glDUpkQ,36305 +twilio/rest/assistants/v1/assistant/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/assistants/v1/assistant/__pycache__/assistants_knowledge.cpython-312.pyc,, +twilio/rest/assistants/v1/assistant/__pycache__/assistants_tool.cpython-312.pyc,, +twilio/rest/assistants/v1/assistant/__pycache__/feedback.cpython-312.pyc,, +twilio/rest/assistants/v1/assistant/__pycache__/message.cpython-312.pyc,, +twilio/rest/assistants/v1/assistant/assistants_knowledge.py,sha256=_mYOFtWdPf6ovwWxuI-64qBSEKzWxIXkYPHDevq1nAs,18788 +twilio/rest/assistants/v1/assistant/assistants_tool.py,sha256=qAv-9ZkPB87A8rwkpsUrdlDkqz5oLsYe1dTl4Z_7WXY,18172 +twilio/rest/assistants/v1/assistant/feedback.py,sha256=hxJ-MMZy-6JuJvFOVVAbHNH0lwcQCLVpsFCCX6MPeh8,15127 +twilio/rest/assistants/v1/assistant/message.py,sha256=HXFkpnClfPGrv75P-XGnt2M8qQSRtecpabI57IOIih8,6751 +twilio/rest/assistants/v1/knowledge/__init__.py,sha256=UQJL3bmsmFhSdV8wC8UIqOLFcYraNHSqReBuwRi9acU,35246 +twilio/rest/assistants/v1/knowledge/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/assistants/v1/knowledge/__pycache__/chunk.cpython-312.pyc,, +twilio/rest/assistants/v1/knowledge/__pycache__/knowledge_status.cpython-312.pyc,, +twilio/rest/assistants/v1/knowledge/chunk.py,sha256=RT8yJBkvAHi828_ogPqFOgSbuLTfnpiXFw-k4dNM8Zc,11243 +twilio/rest/assistants/v1/knowledge/knowledge_status.py,sha256=gtY8hL5aUNCjf9UkUgE4EsMRM_C8mKX8PjWYpFJ2NNw,6049 +twilio/rest/assistants/v1/policy.py,sha256=9mFdp1Ze7cK8PfiU7m2hAj7IO-L1LkcOiNK7GuNJk1M,12955 +twilio/rest/assistants/v1/session/__init__.py,sha256=O_cTY3J_UbVtnPgECu53bM1csISk8nodZkCHcEOWrM0,14943 +twilio/rest/assistants/v1/session/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/assistants/v1/session/__pycache__/message.cpython-312.pyc,, +twilio/rest/assistants/v1/session/message.py,sha256=sZicIuZYgGHv94-QyXJ7esWr65j9nJynzqddU7MhXrE,11964 +twilio/rest/assistants/v1/tool.py,sha256=CZpw1fwlWmRA7Dhoe4z7jdMhbrveigzZEm8EpLEahd8,32256 +twilio/rest/bulkexports/BulkexportsBase.py,sha256=zZVbqHt-GFEwknpCSTIkMnUiy0psGTVr707I65ppqRA,1232 +twilio/rest/bulkexports/__init__.py,sha256=W70NE5bxC2jLDmKtWWL5WUe_hYQeywBIlqfRrQQxsnU,792 +twilio/rest/bulkexports/__pycache__/BulkexportsBase.cpython-312.pyc,, +twilio/rest/bulkexports/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/bulkexports/v1/__init__.py,sha256=17bpWiEa9ctnhyCFjXOlYLQNcrqMILJ28XTUY5MSeXc,1693 +twilio/rest/bulkexports/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/bulkexports/v1/__pycache__/export_configuration.cpython-312.pyc,, +twilio/rest/bulkexports/v1/export/__init__.py,sha256=bgpvSCEkYd2P3eq5vtQgLBrne_OBBECJ6_Okc25Ozjw,7262 +twilio/rest/bulkexports/v1/export/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/bulkexports/v1/export/__pycache__/day.cpython-312.pyc,, +twilio/rest/bulkexports/v1/export/__pycache__/export_custom_job.cpython-312.pyc,, +twilio/rest/bulkexports/v1/export/__pycache__/job.cpython-312.pyc,, +twilio/rest/bulkexports/v1/export/day.py,sha256=IGG0nj_6-nwoUjIaD6o7G1g9DZSaWI8YJO_T-brJSog,14990 +twilio/rest/bulkexports/v1/export/export_custom_job.py,sha256=IWcqxrpR7k-KjL07G6lsYKgS-iV8FF7J7diw3reuVLg,17715 +twilio/rest/bulkexports/v1/export/job.py,sha256=kXTZ7jNMacOhtxVibodj8ZtPrT_pbD5B8H_PqnzxKU0,8457 +twilio/rest/bulkexports/v1/export_configuration.py,sha256=BpPQXqAqfj0eKRYZHLZaH5ZfSBae9wQjTCyIYpIqBaU,11316 +twilio/rest/chat/ChatBase.py,sha256=KD32OSHBJlk3FnRUTh5rYBgVCX-8Wd3FxMK-sMbwfCU,1701 +twilio/rest/chat/__init__.py,sha256=yqheEsHshStD2dZwRJIab6Vd7pJ8l99lx6I1D-SDLaA,970 +twilio/rest/chat/__pycache__/ChatBase.cpython-312.pyc,, +twilio/rest/chat/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/chat/v1/__init__.py,sha256=pIPnbTMhwrC_TrSuEkGC1FMRoI9P0fl7auFCScLZs5g,1570 +twilio/rest/chat/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/chat/v1/__pycache__/credential.cpython-312.pyc,, +twilio/rest/chat/v1/credential.py,sha256=kSIXMoqKDnyASylYeK1AFS1Jg54UtkEf5NUMlTNNzX4,29186 +twilio/rest/chat/v1/service/__init__.py,sha256=lz04U3hL9dU_Qt1VPCFkG3YGsCO_SPzAS_xKvzovqhY,94603 +twilio/rest/chat/v1/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/chat/v1/service/__pycache__/role.cpython-312.pyc,, +twilio/rest/chat/v1/service/channel/__init__.py,sha256=z4Hm7Wqpl2jj6svVwaZJnVIGS9bJ88K5E6wr_saEu2k,30170 +twilio/rest/chat/v1/service/channel/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/chat/v1/service/channel/__pycache__/invite.cpython-312.pyc,, +twilio/rest/chat/v1/service/channel/__pycache__/member.cpython-312.pyc,, +twilio/rest/chat/v1/service/channel/__pycache__/message.cpython-312.pyc,, +twilio/rest/chat/v1/service/channel/invite.py,sha256=I1AsyjaFixkMSYORBeQzg_uQ2m3v0FZN7kQgVHzrJWg,23225 +twilio/rest/chat/v1/service/channel/member.py,sha256=YK1ZHjFhefjbSOVIpzygcf8YYCeoazPVpHvJyajPSGw,28912 +twilio/rest/chat/v1/service/channel/message.py,sha256=ppCuv00iaqkP9SSlF9GJWm0G8RRZ9zxhr6lwxBU3txw,27559 +twilio/rest/chat/v1/service/role.py,sha256=AirHxVzWEiFdMnZX3sedeYIMzmRBzEmcU6LWAel4TM0,23034 +twilio/rest/chat/v1/service/user/__init__.py,sha256=Bdihokzz7E0wCsRoufK-fZ8EcX62pYwiYzOtlsrJRKE,27518 +twilio/rest/chat/v1/service/user/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/chat/v1/service/user/__pycache__/user_channel.cpython-312.pyc,, +twilio/rest/chat/v1/service/user/user_channel.py,sha256=7gq6lCWzKU9vknd3Axrqo58lGjKi_euTjoPsqyZ5i1Q,13247 +twilio/rest/chat/v2/__init__.py,sha256=2MmAILBGDLB1r-m1D9B3OuCk0N-b8XosRDGwinn32C0,1570 +twilio/rest/chat/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/chat/v2/__pycache__/credential.cpython-312.pyc,, +twilio/rest/chat/v2/credential.py,sha256=QyNZAtP6HqEvykxZiNXtcGSvugMufKRUEBeFiNQ4hX4,28816 +twilio/rest/chat/v2/service/__init__.py,sha256=DL8U0qjDj2ZCvIVatGdH-M_biqeOYaY9kFsBjQaJeTs,68767 +twilio/rest/chat/v2/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/chat/v2/service/__pycache__/binding.cpython-312.pyc,, +twilio/rest/chat/v2/service/__pycache__/role.cpython-312.pyc,, +twilio/rest/chat/v2/service/binding.py,sha256=-g6MZo7KlKODz0ups8aqfXeVW_xbwcvX0TXSknnOvEI,22643 +twilio/rest/chat/v2/service/channel/__init__.py,sha256=lb-UlGCc8j_7ih-LjK5lhXD8_Ur-ZuBuFAbiCT8H7hM,40660 +twilio/rest/chat/v2/service/channel/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/chat/v2/service/channel/__pycache__/invite.cpython-312.pyc,, +twilio/rest/chat/v2/service/channel/__pycache__/member.cpython-312.pyc,, +twilio/rest/chat/v2/service/channel/__pycache__/message.cpython-312.pyc,, +twilio/rest/chat/v2/service/channel/__pycache__/webhook.cpython-312.pyc,, +twilio/rest/chat/v2/service/channel/invite.py,sha256=EWJyb1ZH36q-e4sSgaUbO0eXWfBmwejRNZBuhg5iqCc,23205 +twilio/rest/chat/v2/service/channel/member.py,sha256=ybSJITkqTN6yGwRdWYuI0k54sIOwE1PR9zVd0Y3u578,42648 +twilio/rest/chat/v2/service/channel/message.py,sha256=WLMbljK0eo3SfeUpi67_vQDYgrrRfNA8FpdxwsKyt8k,39082 +twilio/rest/chat/v2/service/channel/webhook.py,sha256=U_NujpfO7Lg07UFZ3ACPJuXFHl8wUmoupi7cvoYpCTk,34973 +twilio/rest/chat/v2/service/role.py,sha256=YulJAE3beY2sR3ZzZVmdvXuPxGNl4dllNCXQz9kjCRI,23435 +twilio/rest/chat/v2/service/user/__init__.py,sha256=haouJvuAu3H-9L2dDmZyIWc1Y45PFOjNd8c84wHeRb0,30560 +twilio/rest/chat/v2/service/user/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/chat/v2/service/user/__pycache__/user_binding.cpython-312.pyc,, +twilio/rest/chat/v2/service/user/__pycache__/user_channel.cpython-312.pyc,, +twilio/rest/chat/v2/service/user/user_binding.py,sha256=0b6_z2ZRybkURNriatBLj6kpbPQSYrZbNkRt-L7Exw8,22434 +twilio/rest/chat/v2/service/user/user_channel.py,sha256=IhLMQn64a0hvrCiY_-29k5oIgG7a7x6wh6lHf71SG5A,27877 +twilio/rest/chat/v3/__init__.py,sha256=iNQ57HwS3IRB3wny2tHXgjL_qW8eN_c37SAGYYMRpAU,1269 +twilio/rest/chat/v3/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/chat/v3/__pycache__/channel.cpython-312.pyc,, +twilio/rest/chat/v3/channel.py,sha256=poEyzBnZNliy4aS1lPXh024oDRnFHJXZ-1ZSYLgjV8A,12259 +twilio/rest/content/ContentBase.py,sha256=dQqMOWOjQ3xMGuDM2r1W9l2mkrxpxBCubglipq8ZdfM,1469 +twilio/rest/content/__init__.py,sha256=Q9Dc5LDsvNo1f1FttcKGP8uwMr2DDOoyrzdVHjgb5YA,1110 +twilio/rest/content/__pycache__/ContentBase.cpython-312.pyc,, +twilio/rest/content/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/content/v1/__init__.py,sha256=OJ_jzAzh2Q0NcAQUb3l5ohrBR08wfwDYfLMNwoQZ4No,2025 +twilio/rest/content/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/content/v1/__pycache__/content_and_approvals.cpython-312.pyc,, +twilio/rest/content/v1/__pycache__/legacy_content.cpython-312.pyc,, +twilio/rest/content/v1/content/__init__.py,sha256=o_f6Xr8Fttjqy5du6f3oYDoyFSXtB82CZkDLbpKHtP4,88781 +twilio/rest/content/v1/content/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/content/v1/content/__pycache__/approval_create.cpython-312.pyc,, +twilio/rest/content/v1/content/__pycache__/approval_fetch.cpython-312.pyc,, +twilio/rest/content/v1/content/approval_create.py,sha256=1LjKaTUSnQU1qCGo6PAv60DPaO6-Et8jeHXLvEmCEM4,5148 +twilio/rest/content/v1/content/approval_fetch.py,sha256=4G4JVwF7-wCC8Nq0vjcyDR-_Z8eAZWzoezXs-c3_z-E,6018 +twilio/rest/content/v1/content_and_approvals.py,sha256=9M0X55_Y-y0Jh-I_gum3c0xQ3oAQ6XYUVZVXIiBFE_4,12244 +twilio/rest/content/v1/legacy_content.py,sha256=icfgdpBAHNHpFqLstktL7e1xQd-siB2R_W6za8NV0k0,12443 +twilio/rest/content/v2/__init__.py,sha256=AEiqhEK9xMUccgKm_QcMCtHuk7cCO_bGTIu-icgBnZ4,1685 +twilio/rest/content/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/content/v2/__pycache__/content.cpython-312.pyc,, +twilio/rest/content/v2/__pycache__/content_and_approvals.cpython-312.pyc,, +twilio/rest/content/v2/content.py,sha256=BRqYh2LROOZQMdcVh4OaP0X_8fd2LRqzU5EbFEqBBrw,22457 +twilio/rest/content/v2/content_and_approvals.py,sha256=KIId6S1cJ5rSYed6fPh78DnHzf4aA8QpKD6qe8qbj2g,22787 +twilio/rest/conversations/ConversationsBase.py,sha256=_xLX2JZyT_NNtyDsHn9NVE3LT3rh9x_gSlqFNE5zxyE,1246 +twilio/rest/conversations/__init__.py,sha256=wrtnbo04IMJ0dAyAXcBU2FPCV3fRFfDjjvQdGtNqbiA,2760 +twilio/rest/conversations/__pycache__/ConversationsBase.cpython-312.pyc,, +twilio/rest/conversations/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/__init__.py,sha256=8dH1CjGT_tk7xeq5ntTI2gOUnlOPVzVJdKZxIPUoFFE,4218 +twilio/rest/conversations/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/__pycache__/address_configuration.cpython-312.pyc,, +twilio/rest/conversations/v1/__pycache__/conversation_with_participants.cpython-312.pyc,, +twilio/rest/conversations/v1/__pycache__/credential.cpython-312.pyc,, +twilio/rest/conversations/v1/__pycache__/participant_conversation.cpython-312.pyc,, +twilio/rest/conversations/v1/__pycache__/role.cpython-312.pyc,, +twilio/rest/conversations/v1/address_configuration.py,sha256=mk4leUh4m4KeWSVz6qVCscVdzwcBTXDna4L513apDaw,39180 +twilio/rest/conversations/v1/configuration/__init__.py,sha256=mrnQMOVnFnBd34XA_Gkad6lqnXtClH8aAYgNJGAIqNg,13003 +twilio/rest/conversations/v1/configuration/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/configuration/__pycache__/webhook.cpython-312.pyc,, +twilio/rest/conversations/v1/configuration/webhook.py,sha256=3MM5VvdVSiuoRZRMgs5nmkri-pzorOrO_ZEc3VT6oeI,13076 +twilio/rest/conversations/v1/conversation/__init__.py,sha256=f2AWwVwbtVxU0LH51yYmJ_bK0nYlcsYmUtnbeUixQpk,51446 +twilio/rest/conversations/v1/conversation/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/conversation/__pycache__/participant.cpython-312.pyc,, +twilio/rest/conversations/v1/conversation/__pycache__/webhook.cpython-312.pyc,, +twilio/rest/conversations/v1/conversation/message/__init__.py,sha256=g5IAs5OQDbINqx3_JzHbSBeuDNYqKWZ2f3d0eR98XR8,37538 +twilio/rest/conversations/v1/conversation/message/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/conversation/message/__pycache__/delivery_receipt.cpython-312.pyc,, +twilio/rest/conversations/v1/conversation/message/delivery_receipt.py,sha256=T0yBAlBcYc8HNknohDaYJHwMFeNyHNjctCmKUYlEeYc,18534 +twilio/rest/conversations/v1/conversation/participant.py,sha256=9Wk0CAFor7iX0qgERR-424AssONStbXulEeUY_2N5tI,41653 +twilio/rest/conversations/v1/conversation/webhook.py,sha256=XTmVt7FEMoldiFQiW0KJsSADIOJwu-CE_Z8uR6q_11g,28439 +twilio/rest/conversations/v1/conversation_with_participants.py,sha256=hQfYR85cFKUH9JcFX9ftFj-XByCDAbBVqeL44f_DmnM,13383 +twilio/rest/conversations/v1/credential.py,sha256=AKUOd-i3kzGkvSAJ-5icaVjrP9OulDtluiiZH6fFPQA,29265 +twilio/rest/conversations/v1/participant_conversation.py,sha256=GQ2CBDQPmT2_QnVAtB7jzSzXPfRxDBAehXcD_GCp8RA,19067 +twilio/rest/conversations/v1/role.py,sha256=jBWZCQid-lAbhDiH6eIVeY7KCNUt69GBv0_aGwHU_To,22146 +twilio/rest/conversations/v1/service/__init__.py,sha256=ZwztACi4635N39jM6z87siFcnNjyKVzMxqwvMvH2z4k,21856 +twilio/rest/conversations/v1/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/service/__pycache__/binding.cpython-312.pyc,, +twilio/rest/conversations/v1/service/__pycache__/conversation_with_participants.cpython-312.pyc,, +twilio/rest/conversations/v1/service/__pycache__/participant_conversation.cpython-312.pyc,, +twilio/rest/conversations/v1/service/__pycache__/role.cpython-312.pyc,, +twilio/rest/conversations/v1/service/binding.py,sha256=TKI13VFqXGLGoNG_gciR2QHoBOjg8vDFsIh-hSOTkEc,22814 +twilio/rest/conversations/v1/service/configuration/__init__.py,sha256=vU4xrwjBZX0xbMk_u-Sxm1_ISfgfrgHVV10O7x0uE1k,16599 +twilio/rest/conversations/v1/service/configuration/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/service/configuration/__pycache__/notification.cpython-312.pyc,, +twilio/rest/conversations/v1/service/configuration/__pycache__/webhook.cpython-312.pyc,, +twilio/rest/conversations/v1/service/configuration/notification.py,sha256=B9Y8Oz1pzZtaPleMLHDsSqdRYHgHzuDaxaj2Bv3IzW4,25509 +twilio/rest/conversations/v1/service/configuration/webhook.py,sha256=cY9V3K2ByznSMatOQeKvpT7lrmfxqU42pmdFyQWlfvA,14319 +twilio/rest/conversations/v1/service/conversation/__init__.py,sha256=uYgWc-u_SLSx16a3oxQ3gv6eEtxs0WmnE7bN68yr0Ng,53297 +twilio/rest/conversations/v1/service/conversation/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/service/conversation/__pycache__/participant.cpython-312.pyc,, +twilio/rest/conversations/v1/service/conversation/__pycache__/webhook.cpython-312.pyc,, +twilio/rest/conversations/v1/service/conversation/message/__init__.py,sha256=QPH2y1ttmlREN9c-m9gg34p0MZEBLj_SiSvAuTMNMzI,39195 +twilio/rest/conversations/v1/service/conversation/message/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/service/conversation/message/__pycache__/delivery_receipt.cpython-312.pyc,, +twilio/rest/conversations/v1/service/conversation/message/delivery_receipt.py,sha256=PpNlvz6SH6tsalMba69lkD7UL2Z3eqKi475Ig22SOZE,19869 +twilio/rest/conversations/v1/service/conversation/participant.py,sha256=M3blybA18uatyzT55fI5I45OzRoGkOWwLhczk1ia280,43630 +twilio/rest/conversations/v1/service/conversation/webhook.py,sha256=eJJQim1Q87xIMkNBOy9fXhR9WAhsiNqZnOXIFeY0AgU,30129 +twilio/rest/conversations/v1/service/conversation_with_participants.py,sha256=2MSv8o1xtWq2tlUd0JbR0K1-KAe8kMl4dkLmmGaAg2k,14204 +twilio/rest/conversations/v1/service/participant_conversation.py,sha256=1GCqZGj-BtLkEQlqJf1SWhXQCZcWjGhViIVaGBgJurc,19858 +twilio/rest/conversations/v1/service/role.py,sha256=Lz7PcgnuPvmBDLO7Ml1LmLpxaMFqZgN4jYas1Q9bpCs,23737 +twilio/rest/conversations/v1/service/user/__init__.py,sha256=fjp1dkaaQwL1KSQ0Yp1iIjSdjFO6mbXsb6Lfd_kmV74,31219 +twilio/rest/conversations/v1/service/user/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/service/user/__pycache__/user_conversation.cpython-312.pyc,, +twilio/rest/conversations/v1/service/user/user_conversation.py,sha256=SHiSIItso8VNGoU3h9_vxl82AG1GUj_U3mbvJn3hM3c,27325 +twilio/rest/conversations/v1/user/__init__.py,sha256=GGbwZDCEJeHoR-CyxYLb333-h3PvsWwhxd_-8-FzY5Q,29553 +twilio/rest/conversations/v1/user/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/conversations/v1/user/__pycache__/user_conversation.cpython-312.pyc,, +twilio/rest/conversations/v1/user/user_conversation.py,sha256=10XdwEZeyEcaRg0XkKOB9qtbXDPbMq5JYm2laPESZAw,26030 +twilio/rest/events/EventsBase.py,sha256=VmnvvHtsOqJHgao-2Db4suiqZbpRmzlbR_0mkXyg-yg,1197 +twilio/rest/events/__init__.py,sha256=0c7O0oWx1KIrwS_tzCy8c34OkPJfqXCK_9lULiGi_7s,1277 +twilio/rest/events/__pycache__/EventsBase.cpython-312.pyc,, +twilio/rest/events/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/events/v1/__init__.py,sha256=gxoinjjx5rqW0zUxOp6Ild8m1mNG8zayV5-nnlbCR-Q,2134 +twilio/rest/events/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/events/v1/__pycache__/event_type.cpython-312.pyc,, +twilio/rest/events/v1/event_type.py,sha256=LP6dyDkCj_SP237YQOAEPoqu1awzUYb51P6Y3vOSElo,16265 +twilio/rest/events/v1/schema/__init__.py,sha256=lY5TfjZ40DF7MTZuOzvUX992RBGlbH2roGhFxlYbmLE,6575 +twilio/rest/events/v1/schema/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/events/v1/schema/__pycache__/schema_version.cpython-312.pyc,, +twilio/rest/events/v1/schema/schema_version.py,sha256=vPU4IXvWWi0lNSg96JaHFqG1lG1n4VJcaGZVQxl9ZRY,15389 +twilio/rest/events/v1/sink/__init__.py,sha256=V1SUPy4QT_rXFfZSOv61L8UPL6ziHfmpt8IswZMqWCc,24157 +twilio/rest/events/v1/sink/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/events/v1/sink/__pycache__/sink_test.cpython-312.pyc,, +twilio/rest/events/v1/sink/__pycache__/sink_validate.cpython-312.pyc,, +twilio/rest/events/v1/sink/sink_test.py,sha256=wqSIshtRm7x1gmDS7wfllqtGBm4vUqxrXxY9uNZnKcs,3048 +twilio/rest/events/v1/sink/sink_validate.py,sha256=px942vCIcWnG9uTd6l7sdUeGO535hoYUB34XfSKzbY0,3747 +twilio/rest/events/v1/subscription/__init__.py,sha256=oqYgQLe3aV_K4IJCBN_GOsXouhoRwQX7Wai8Ns3u0Zg,23810 +twilio/rest/events/v1/subscription/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/events/v1/subscription/__pycache__/subscribed_event.cpython-312.pyc,, +twilio/rest/events/v1/subscription/subscribed_event.py,sha256=KKHkkPzKU5eGtTx8D-aD3JN4-TLaqj7CGTUCCYWOLL8,21483 +twilio/rest/flex_api/FlexApiBase.py,sha256=uej-QbJtfmiUEUj54Hs5nXUoUmeWUnebYCqlHZ__Nck,1472 +twilio/rest/flex_api/__init__.py,sha256=95CohrSn9QGa5NEMqi1FfZ0ojxuqK5rVvszrR0NQd9Q,6332 +twilio/rest/flex_api/__pycache__/FlexApiBase.cpython-312.pyc,, +twilio/rest/flex_api/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/flex_api/v1/__init__.py,sha256=obnvo_MQ0rmSwmTbgQk7DEM9fxHwuMxmkJeL3_4BP30,10023 +twilio/rest/flex_api/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/assessments.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/channel.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/configuration.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/flex_flow.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/insights_assessments_comment.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/insights_conversations.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/insights_questionnaires.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/insights_questionnaires_category.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/insights_questionnaires_question.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/insights_segments.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/insights_session.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/insights_settings_answer_sets.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/insights_settings_comment.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/insights_user_roles.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/plugin_archive.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/plugin_configuration_archive.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/plugin_release.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/plugin_version_archive.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/provisioning_status.cpython-312.pyc,, +twilio/rest/flex_api/v1/__pycache__/web_channel.cpython-312.pyc,, +twilio/rest/flex_api/v1/assessments.py,sha256=V9qcvA7siGHPibeVTZrHMFZ7M6x2LaHfMjjHgqFrMpc,24804 +twilio/rest/flex_api/v1/channel.py,sha256=yLGvmFX1n8wGcxYkMu1jtbesmwmwy7Dps3P_dv2mDKs,20775 +twilio/rest/flex_api/v1/configuration.py,sha256=4orBSh9VTT9XR3rXnk6sOtGTcoOgNYjmH7g_fPWI0lQ,16390 +twilio/rest/flex_api/v1/flex_flow.py,sha256=WEc_bJfuyuX6QMrxTYwlHbq6BaXvyMmI1khdAFzL4vA,48692 +twilio/rest/flex_api/v1/insights_assessments_comment.py,sha256=yWj0JBRafpvk2eY_E8RqQOcw_-TDai7AGniC4m8bZ2c,18263 +twilio/rest/flex_api/v1/insights_conversations.py,sha256=e4RDXZL5ixoxia9IMXOQH48pxkYxnikA0xcLfK8AfEE,13403 +twilio/rest/flex_api/v1/insights_questionnaires.py,sha256=YiGf1i74hxkJ0Av3k2f_UpAC7vXhrLEggbwLClWzVkY,29788 +twilio/rest/flex_api/v1/insights_questionnaires_category.py,sha256=9a7q2C35bIhYi9rQchkhBXTtDYfCADz6DyNjpTRA_gw,22522 +twilio/rest/flex_api/v1/insights_questionnaires_question.py,sha256=7WThQaMXdhYzP0BcgUVr-_2mZPKpC1Bm6lYyLvHfBU0,28319 +twilio/rest/flex_api/v1/insights_segments.py,sha256=UELfB0Mdnlm9qodiTh6OFDZPce90CnqEFfcHiYywLbw,16466 +twilio/rest/flex_api/v1/insights_session.py,sha256=bc4_hAx5exIgh0at-hmnAECjAh3ur33MguxMi4JjIRE,5688 +twilio/rest/flex_api/v1/insights_settings_answer_sets.py,sha256=-ti-THOVV7-H3GJyN3WLj1P5DfSMqXtPw9Kmg0Ri1Ao,3987 +twilio/rest/flex_api/v1/insights_settings_comment.py,sha256=CQ8a8-toTifomRxGJqsjiMEC0gMV8mGxU6Q-2N4CbzU,3568 +twilio/rest/flex_api/v1/insights_user_roles.py,sha256=KEmrtjjlSJdXIPqh4L5QwSNKDb7U3O5U9ufpX7CYiMo,5583 +twilio/rest/flex_api/v1/interaction/__init__.py,sha256=056bAYLNB5qkw5g1EAeLC1hzRQTBLhHPpRLP_liqjZk,12738 +twilio/rest/flex_api/v1/interaction/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/flex_api/v1/interaction/interaction_channel/__init__.py,sha256=4h-o492vXOZs1tM7JH5wTvUNbnjLY_ADG_AE_-6OIOE,23059 +twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/interaction_channel_invite.cpython-312.pyc,, +twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/interaction_channel_participant.cpython-312.pyc,, +twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/interaction_transfer.cpython-312.pyc,, +twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_channel_invite.py,sha256=r_9xfu6Cn2IzB8vjOCahqBOKOHRD2WJEXpaRnLy2i0w,14571 +twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_channel_participant.py,sha256=rPlAhdDU4eg-GT4Jm9B_J2C1jXVrzcpgAwGgMHqU_gg,21534 +twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_transfer.py,sha256=sMdG-j_Gqk1R_8bqEu-IV1KOWQ_7RSTHoxNiQ2JMSeI,13562 +twilio/rest/flex_api/v1/plugin/__init__.py,sha256=tDHboT1oPnJ-sqjDY_gZUcUlwNe-W0GFFdCbCIw3yt8,24859 +twilio/rest/flex_api/v1/plugin/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/flex_api/v1/plugin/__pycache__/plugin_versions.cpython-312.pyc,, +twilio/rest/flex_api/v1/plugin/plugin_versions.py,sha256=jAUztORMeQqbKS7W7HzY5JahmEWA0zid4pD00IdJ8IQ,22650 +twilio/rest/flex_api/v1/plugin_archive.py,sha256=C9QY5HU6Ge48qKfVTwAPWo7hNR21gFgH0jS26jQe9eo,7951 +twilio/rest/flex_api/v1/plugin_configuration/__init__.py,sha256=NeTdo-f7C0iPYcV1xCEQbyoulbS6UQbB7ecyMxpEPko,21237 +twilio/rest/flex_api/v1/plugin_configuration/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/flex_api/v1/plugin_configuration/__pycache__/configured_plugin.cpython-312.pyc,, +twilio/rest/flex_api/v1/plugin_configuration/configured_plugin.py,sha256=hXVC4o0uSWnIcq3ULPH7EMHjfBFRa92r-8qM6mRBEbI,20249 +twilio/rest/flex_api/v1/plugin_configuration_archive.py,sha256=6JAyPB76AgNmj290Mtwc4co7nPiVgzB0mpC0lKtBmrU,8094 +twilio/rest/flex_api/v1/plugin_release.py,sha256=DHWrxcVdJNaBofYRlBSxDb5knG39e_bFZndz9jdtrw0,18932 +twilio/rest/flex_api/v1/plugin_version_archive.py,sha256=-dxjlhquldQRPNascrY8TCWHdSlog7XNwGvN0tXzLt0,9101 +twilio/rest/flex_api/v1/provisioning_status.py,sha256=buD8d9ddh3mlingquoYGBQit0Ujuhuwo9CR__Vtu_vA,4918 +twilio/rest/flex_api/v1/web_channel.py,sha256=BxDf5RFPLu4stg9V8rX2tli_veY892He189T-ybdvJ4,22024 +twilio/rest/flex_api/v2/__init__.py,sha256=WMe1F3S9rix25wT-TMn9o4BdKxc65EeMjC1VyDUWgyE,1610 +twilio/rest/flex_api/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/flex_api/v2/__pycache__/flex_user.cpython-312.pyc,, +twilio/rest/flex_api/v2/__pycache__/web_channels.cpython-312.pyc,, +twilio/rest/flex_api/v2/flex_user.py,sha256=atkcufDa6QwJPQM0C3Zk3RNiEs8wIwqjGmUaDQvDbw4,11739 +twilio/rest/flex_api/v2/web_channels.py,sha256=tgBOhRiHkdKKGabc6o0gMDIJSXkiqX2rvop21zJKQjY,6396 +twilio/rest/frontline_api/FrontlineApiBase.py,sha256=LxpGZeNOYqlqYNh8VxMXZoDR_z13_Nh36r-vRQYUDRE,1241 +twilio/rest/frontline_api/__init__.py,sha256=dY4Pp2907z2kTJJ3jaSt4pX9-qP3t36LRK1Zs8Yniog,410 +twilio/rest/frontline_api/__pycache__/FrontlineApiBase.cpython-312.pyc,, +twilio/rest/frontline_api/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/frontline_api/v1/__init__.py,sha256=AcNIDcakdTFSUXD3AF55ot77IsixzC-rJAPP9Cs6A4I,1278 +twilio/rest/frontline_api/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/frontline_api/v1/__pycache__/user.cpython-312.pyc,, +twilio/rest/frontline_api/v1/user.py,sha256=IrXEAr_ZHznL6QlbTqe3RqnzthdiNLyoPfQMLqZo0D0,11329 +twilio/rest/iam/IamBase.py,sha256=2VtqB_DfMQWvBNKmGpnVIv7cFhU_210bV0X_WeP77Z4,1176 +twilio/rest/iam/__init__.py,sha256=LxDMjMsrLsWeQPOe8NPXEs39BB0ngAotZuntX9pew9E,679 +twilio/rest/iam/__pycache__/IamBase.cpython-312.pyc,, +twilio/rest/iam/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/iam/v1/__init__.py,sha256=vMJItvxisyNy-OiJaIKOElhq2z5aUyCsjJvybTGrcNc,2104 +twilio/rest/iam/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/iam/v1/__pycache__/api_key.cpython-312.pyc,, +twilio/rest/iam/v1/__pycache__/get_api_keys.cpython-312.pyc,, +twilio/rest/iam/v1/__pycache__/new_api_key.cpython-312.pyc,, +twilio/rest/iam/v1/__pycache__/token.cpython-312.pyc,, +twilio/rest/iam/v1/api_key.py,sha256=rGuFKiia8IQml7TxUMwdcs_9YNqZDCXm6JJ_UyyKDtk,11776 +twilio/rest/iam/v1/get_api_keys.py,sha256=4svxSithdku2x4NAWSNc9q819QEWJcPSw2ye02mrOq8,12220 +twilio/rest/iam/v1/new_api_key.py,sha256=V4aDUDMpSBdbmHZgG2rvTixnz0pXhLuFp5ASD87U6uk,6387 +twilio/rest/iam/v1/token.py,sha256=P-0XE0J6i2tEjl_W2_BXGjXu1wE_kCNjElN9bN0i_8Y,6048 +twilio/rest/insights/InsightsBase.py,sha256=E0d9cswKhgPZByiFy51V7AGE-TiQ7lZOB1hbGOczY7Q,1211 +twilio/rest/insights/__init__.py,sha256=quAZLguZrWAk1irDvVn1ChI9LgdMewLt9SO_YgfGkzQ,1579 +twilio/rest/insights/__pycache__/InsightsBase.cpython-312.pyc,, +twilio/rest/insights/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/insights/v1/__init__.py,sha256=CQgywgxUWHdv3N_p5I_-SpoczEh6-Q2TvrQE7BZAJoQ,2420 +twilio/rest/insights/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/insights/v1/__pycache__/call_summaries.cpython-312.pyc,, +twilio/rest/insights/v1/__pycache__/setting.cpython-312.pyc,, +twilio/rest/insights/v1/call/__init__.py,sha256=BwO0pCW0XHN3kPsb1cCRsj2l9Xay5mlWsxZEl9xsA-8,7160 +twilio/rest/insights/v1/call/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/insights/v1/call/__pycache__/annotation.cpython-312.pyc,, +twilio/rest/insights/v1/call/__pycache__/call_summary.cpython-312.pyc,, +twilio/rest/insights/v1/call/__pycache__/event.cpython-312.pyc,, +twilio/rest/insights/v1/call/__pycache__/metric.cpython-312.pyc,, +twilio/rest/insights/v1/call/annotation.py,sha256=2hQqz6BcQ9KUVqD4b-yi1x2snCBVvmalUieHkfnQC1Y,18056 +twilio/rest/insights/v1/call/call_summary.py,sha256=P7jJITDSrn5dAwrxWQazAh20OjZnchhKd4peQxKM9E0,11418 +twilio/rest/insights/v1/call/event.py,sha256=foL0V6owoVlDBt3f0Iz8CpCJc0f7QaI-qt8fyHZT0Lw,13972 +twilio/rest/insights/v1/call/metric.py,sha256=15TxR0D7bV-uKkoleu7G-1DuJQLqVSEdEna8WNgPSh0,15144 +twilio/rest/insights/v1/call_summaries.py,sha256=cINt0JH-X6b-56LxEn4_sckHqFYka8AUyPBa8_D5CNI,70422 +twilio/rest/insights/v1/conference/__init__.py,sha256=9aeY6AJKYAdLaQwR-SsomHllZ8wnKeEzQ5-ndYqZNMo,31953 +twilio/rest/insights/v1/conference/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/insights/v1/conference/__pycache__/conference_participant.cpython-312.pyc,, +twilio/rest/insights/v1/conference/conference_participant.py,sha256=ZvkMdXmIS7XjvV6Yj6r-JKYrW6DL0UO3fHiO1rF_I5s,25819 +twilio/rest/insights/v1/room/__init__.py,sha256=Xa5uJ9BUT-RDugYk_tWw_PKZzMpsvrw52fX7-H9VevQ,26172 +twilio/rest/insights/v1/room/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/insights/v1/room/__pycache__/participant.cpython-312.pyc,, +twilio/rest/insights/v1/room/participant.py,sha256=Y4sR3e8KrlqTAle4-QN40Uswn3hWcxhiI2EVxhXBC7E,18834 +twilio/rest/insights/v1/setting.py,sha256=nDlNCACxZwW7GHikDMq3NRmxqYuKfnRdODbpdD8n9iA,9670 +twilio/rest/intelligence/IntelligenceBase.py,sha256=IKwaNvPV9xaBmfpigqsK4zwhtfYDnV5pIf9mmonGVhs,1239 +twilio/rest/intelligence/__init__.py,sha256=F98_JVdUwFkjg-k58c8j6A45f_5HGYyW7mEoCziqMUk,417 +twilio/rest/intelligence/__pycache__/IntelligenceBase.cpython-312.pyc,, +twilio/rest/intelligence/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/intelligence/v2/__init__.py,sha256=fSaSi1PPutIUr8tPsEWTaQ1jijDddwHuHVYjxzPSXPI,3757 +twilio/rest/intelligence/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/intelligence/v2/__pycache__/custom_operator.cpython-312.pyc,, +twilio/rest/intelligence/v2/__pycache__/operator.cpython-312.pyc,, +twilio/rest/intelligence/v2/__pycache__/operator_attachment.cpython-312.pyc,, +twilio/rest/intelligence/v2/__pycache__/operator_attachments.cpython-312.pyc,, +twilio/rest/intelligence/v2/__pycache__/operator_type.cpython-312.pyc,, +twilio/rest/intelligence/v2/__pycache__/prebuilt_operator.cpython-312.pyc,, +twilio/rest/intelligence/v2/__pycache__/service.cpython-312.pyc,, +twilio/rest/intelligence/v2/custom_operator.py,sha256=uctBMPQL810btmlS3LERqNaV5ZMLr0fu0DppbvoA2jQ,26696 +twilio/rest/intelligence/v2/operator.py,sha256=WKTNgW0Axck1mtS-Vah5HROLSE4p3jph4_c5b8H3_nc,18628 +twilio/rest/intelligence/v2/operator_attachment.py,sha256=ulpXpj5ZqtrUoVGIgF7op-UfHI_MPbnhmAXmwRGMqUU,7771 +twilio/rest/intelligence/v2/operator_attachments.py,sha256=XXB99Jvs_mKaH0zFcQ1tGWGplv0y8eT85L7dRm-ppZI,6005 +twilio/rest/intelligence/v2/operator_type.py,sha256=1c1BaUryfGKcANaADnVc-dmmgDZEBhrZwMDkYWM24Cw,16722 +twilio/rest/intelligence/v2/prebuilt_operator.py,sha256=5ymQj1za1_F2ZthxVh-0KL-BNo9gdDYVi1ITLAn2ev0,19605 +twilio/rest/intelligence/v2/service.py,sha256=XkJ20q3KxaQlQG0qrDNy91-Yy1CnEKg_6R9r6xfQ20w,35447 +twilio/rest/intelligence/v2/transcript/__init__.py,sha256=XX_LMUy-4YWJRQfCX2OEgcHkHYYIf8xvEwM4Nbv0k6M,29951 +twilio/rest/intelligence/v2/transcript/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/intelligence/v2/transcript/__pycache__/media.cpython-312.pyc,, +twilio/rest/intelligence/v2/transcript/__pycache__/operator_result.cpython-312.pyc,, +twilio/rest/intelligence/v2/transcript/__pycache__/sentence.cpython-312.pyc,, +twilio/rest/intelligence/v2/transcript/media.py,sha256=FY-Z_NacoIjrwg2Y4QI84uh3aI8uwLGHWYc17KHrwjs,6730 +twilio/rest/intelligence/v2/transcript/operator_result.py,sha256=oqKPKHOG-xx0L3Hq015iClodq8Te_vQg7KKz-Qrpv00,21124 +twilio/rest/intelligence/v2/transcript/sentence.py,sha256=7kw4sl8RwWUVb7PwKgk6wAltu8m0QVOAatXNblX867I,14882 +twilio/rest/ip_messaging/IpMessagingBase.py,sha256=Auoz1W9XNlV8F6owgPNOKpYY93GZnvtpYzUAzYQXyws,1508 +twilio/rest/ip_messaging/__init__.py,sha256=9mxOrxP0A0GodgNQW2cfokhI3-Ejo3MiX9EcPzBrY9s,738 +twilio/rest/ip_messaging/__pycache__/IpMessagingBase.cpython-312.pyc,, +twilio/rest/ip_messaging/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/__init__.py,sha256=NppQLF43kYaFcWw_ipWY9LDyWN1DH2b_lLbNm2H6okA,1616 +twilio/rest/ip_messaging/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/__pycache__/credential.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/credential.py,sha256=Lnf1H1sbLUfvpwIQofouScgrobA5BZ6aSD-YE4ygUr8,22962 +twilio/rest/ip_messaging/v1/service/__init__.py,sha256=oY3Or2h1KK3KL8Y_Y5QQX-TnbhjotH21AUfg8nQw8Ic,64889 +twilio/rest/ip_messaging/v1/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/service/__pycache__/role.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/service/channel/__init__.py,sha256=Yo605xbth1i8z6D8VM2TJ3FeYb9urX6LZ_BoMAiN9Rk,25267 +twilio/rest/ip_messaging/v1/service/channel/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/service/channel/__pycache__/invite.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/service/channel/__pycache__/member.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/service/channel/__pycache__/message.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/service/channel/invite.py,sha256=J8jV8pnxqc0hG9fEZMYLYHBju6nSS0foRObiGne4T8A,19454 +twilio/rest/ip_messaging/v1/service/channel/member.py,sha256=0V9K59QUR7vk-lXwLmiwj3Y_ceneNM21pu-2Fl5KraE,22928 +twilio/rest/ip_messaging/v1/service/channel/message.py,sha256=gOoi_0Bl8VTLXiOLc-05ib4d2_Vaezh6twbUCYdocBY,23021 +twilio/rest/ip_messaging/v1/service/role.py,sha256=hJIZ4WiPVDL2edpLMo5utVzTI3MBN3-5YvMYfeanb2Y,20058 +twilio/rest/ip_messaging/v1/service/user/__init__.py,sha256=rIdOSPhxnSffqxTzLX0H1fG8nR0YeHP8tisppnexS-M,22566 +twilio/rest/ip_messaging/v1/service/user/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/service/user/__pycache__/user_channel.cpython-312.pyc,, +twilio/rest/ip_messaging/v1/service/user/user_channel.py,sha256=__2mYHonWu6GkyJiXMMV2VEaMBru88OaMnvzL7cY3fc,11870 +twilio/rest/ip_messaging/v2/__init__.py,sha256=7jGoUJ93kos9yv2hkMzA5vflhMYUYzVY92S9Z9B6NlU,1616 +twilio/rest/ip_messaging/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/__pycache__/credential.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/credential.py,sha256=H88g_73iSdVta78v5IJpLs4XBkTAnrt82Ub_bEUzAJQ,22962 +twilio/rest/ip_messaging/v2/service/__init__.py,sha256=Iu928DalMsJqC2d3BtW32luMh0g-8wgld3TdMftuz3Y,47587 +twilio/rest/ip_messaging/v2/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/__pycache__/binding.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/__pycache__/role.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/binding.py,sha256=gUCWroQ24j-BXqZE7LzTjhnKNCKM_cGJsOz6Q05GBqQ,18432 +twilio/rest/ip_messaging/v2/service/channel/__init__.py,sha256=o49rPokvhl8WjfK7PJ5nwrm3Laf6CQCQGrvVm_hh1GI,32105 +twilio/rest/ip_messaging/v2/service/channel/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/channel/__pycache__/invite.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/channel/__pycache__/member.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/channel/__pycache__/message.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/channel/__pycache__/webhook.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/channel/invite.py,sha256=7BYSk3PKypYrrhslndER3REoy70Rb-c9rubgsqeDbQo,19454 +twilio/rest/ip_messaging/v2/service/channel/member.py,sha256=2OgOiAqMWZEmoMHFWDAd5aSe84MS9s1tKMrUxSvJL_M,31059 +twilio/rest/ip_messaging/v2/service/channel/message.py,sha256=OgviUUENynQghtlezC9ZuqLZ-w4YGa6Nknf9cObp0ic,30335 +twilio/rest/ip_messaging/v2/service/channel/webhook.py,sha256=tTvnLCmwG9uia0oYURA12FCA9y6eD_zVqH6WUs0_2LM,27378 +twilio/rest/ip_messaging/v2/service/role.py,sha256=Ug1dUlCedwgJMXhbImwhtOEmMSYGYxF2gEjN72RxX-E,20058 +twilio/rest/ip_messaging/v2/service/user/__init__.py,sha256=nZlU7FtSmZ0CKjZ9Yaoa0_YGwElKmJzGwsRoPYWxnBI,25576 +twilio/rest/ip_messaging/v2/service/user/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/user/__pycache__/user_binding.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/user/__pycache__/user_channel.cpython-312.pyc,, +twilio/rest/ip_messaging/v2/service/user/user_binding.py,sha256=u9YDRNfj-vA44eLFBp-yN_ywsJNlP5d2X5712dn7m3k,18717 +twilio/rest/ip_messaging/v2/service/user/user_channel.py,sha256=MVOYLEcKUWGX-1d_dpOEx2IlqzMDX-PWtPcfHUqegGw,22291 +twilio/rest/lookups/LookupsBase.py,sha256=mH77GksjdX4_ynK3OmtPAjMIboayKFZBTcx8fpQk544,1469 +twilio/rest/lookups/__init__.py,sha256=LDDJTWTOQ1TyhW8ZWS-XfJfF3zO93E5PPyaTzR_6j1g,432 +twilio/rest/lookups/__pycache__/LookupsBase.cpython-312.pyc,, +twilio/rest/lookups/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/lookups/v1/__init__.py,sha256=2wsVTUfxrQaxpH18BvIJTnU-00nq-Y3bCOTymJjfTZk,1330 +twilio/rest/lookups/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/lookups/v1/__pycache__/phone_number.cpython-312.pyc,, +twilio/rest/lookups/v1/phone_number.py,sha256=FPgslzNCHuOzQs7q_pfn3h1nnw1RAxzO6OB6ZbC5Ybg,12790 +twilio/rest/lookups/v2/__init__.py,sha256=ngFacNsEH1hxQOpRWj4067Te6fxzhLYeQLr_gr0pBDU,1330 +twilio/rest/lookups/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/lookups/v2/__pycache__/phone_number.cpython-312.pyc,, +twilio/rest/lookups/v2/phone_number.py,sha256=i9HcLX1P6uljXBLvQOEExRDl_no2mdh2X1E_-swny_Q,26525 +twilio/rest/marketplace/MarketplaceBase.py,sha256=1mfggmVz9sJyhE8pjMrplw521ZbCvhDuHO8n1U8BC5A,1232 +twilio/rest/marketplace/__init__.py,sha256=kUvdmbOANktX1ZFzZtF4vuv0RzdDukVFO1IF-r0dSPA,255 +twilio/rest/marketplace/__pycache__/MarketplaceBase.cpython-312.pyc,, +twilio/rest/marketplace/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/marketplace/v1/__init__.py,sha256=v9bI7ImeSQ7dY5szR6cuyQcXQM5nyVTMwkouirJUrqU,2859 +twilio/rest/marketplace/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/marketplace/v1/__pycache__/module_data.cpython-312.pyc,, +twilio/rest/marketplace/v1/__pycache__/module_data_management.cpython-312.pyc,, +twilio/rest/marketplace/v1/__pycache__/referral_conversion.cpython-312.pyc,, +twilio/rest/marketplace/v1/available_add_on/__init__.py,sha256=hY_5irnPG1mp84zp0n9NYAIS4p0FNn13xi0j6s8X2kU,15515 +twilio/rest/marketplace/v1/available_add_on/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/marketplace/v1/available_add_on/__pycache__/available_add_on_extension.cpython-312.pyc,, +twilio/rest/marketplace/v1/available_add_on/available_add_on_extension.py,sha256=BViTDTPYR3hfsXjC-fk9KU-BTM1DqpICu9i3XuywOoQ,16616 +twilio/rest/marketplace/v1/installed_add_on/__init__.py,sha256=tkGiOOet4_rdBoVEmZb_rPzfC4l9Y4_Ch0zu-TIUkp0,25232 +twilio/rest/marketplace/v1/installed_add_on/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/marketplace/v1/installed_add_on/__pycache__/installed_add_on_extension.cpython-312.pyc,, +twilio/rest/marketplace/v1/installed_add_on/__pycache__/installed_add_on_usage.cpython-312.pyc,, +twilio/rest/marketplace/v1/installed_add_on/installed_add_on_extension.py,sha256=kpWthj74_ok2wf-FY_K34V5qTlP9lj8T0tFVB9q0jZk,19352 +twilio/rest/marketplace/v1/installed_add_on/installed_add_on_usage.py,sha256=LpDTGm1IxQxSyJ6CqF4yIQEMqleREOP2jjGPwMX80ss,8309 +twilio/rest/marketplace/v1/module_data.py,sha256=SeSgNjkzMIa6REYi18jtW6Uq344g-mpV1-HlEBnl2rs,6833 +twilio/rest/marketplace/v1/module_data_management.py,sha256=n5SP2hCyfgQ1SMjg-btAW3Qz7Nm5ltt5DjqKsv2ekrk,16162 +twilio/rest/marketplace/v1/referral_conversion.py,sha256=em9lnu-qLHXKhT_Q6EMyt5m_8M8ESBRDsuqPV85qksQ,4122 +twilio/rest/messaging/MessagingBase.py,sha256=X8EKE7NkpXB6ZFrJW6kFEaNCeaSaMgsR7f-qeBnSPUk,1487 +twilio/rest/messaging/__init__.py,sha256=b_aOOaeRTDPGh-xajYYKry13McI3bmeF050u6j2UXa8,3308 +twilio/rest/messaging/__pycache__/MessagingBase.cpython-312.pyc,, +twilio/rest/messaging/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/messaging/v1/__init__.py,sha256=WdGN6ZanVxdTWNmYZBwmvQe5AcQnXbATRC7wMyhGwiA,6006 +twilio/rest/messaging/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/messaging/v1/__pycache__/deactivations.cpython-312.pyc,, +twilio/rest/messaging/v1/__pycache__/domain_certs.cpython-312.pyc,, +twilio/rest/messaging/v1/__pycache__/domain_config.cpython-312.pyc,, +twilio/rest/messaging/v1/__pycache__/domain_config_messaging_service.cpython-312.pyc,, +twilio/rest/messaging/v1/__pycache__/external_campaign.cpython-312.pyc,, +twilio/rest/messaging/v1/__pycache__/linkshortening_messaging_service.cpython-312.pyc,, +twilio/rest/messaging/v1/__pycache__/linkshortening_messaging_service_domain_association.cpython-312.pyc,, +twilio/rest/messaging/v1/__pycache__/request_managed_cert.cpython-312.pyc,, +twilio/rest/messaging/v1/__pycache__/tollfree_verification.cpython-312.pyc,, +twilio/rest/messaging/v1/__pycache__/usecase.cpython-312.pyc,, +twilio/rest/messaging/v1/brand_registration/__init__.py,sha256=vwN1T13tXXqeTQXcnLfvsfXcM-UI0yPa72MgcQaIxjY,25786 +twilio/rest/messaging/v1/brand_registration/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/messaging/v1/brand_registration/__pycache__/brand_registration_otp.cpython-312.pyc,, +twilio/rest/messaging/v1/brand_registration/__pycache__/brand_vetting.cpython-312.pyc,, +twilio/rest/messaging/v1/brand_registration/brand_registration_otp.py,sha256=la1p4GyOQZCkRajdrceZaqPc62vgJQ7UJ7ArqVrY_oU,3863 +twilio/rest/messaging/v1/brand_registration/brand_vetting.py,sha256=0yvCpsT49B80d_vUB6yK_wED8TG6OIn2W8lPgxq67ys,20801 +twilio/rest/messaging/v1/deactivations.py,sha256=_xU8CL1GYSQnmPCm5Fogsy0FlsX4V8hHaE7irqMUpk8,6014 +twilio/rest/messaging/v1/domain_certs.py,sha256=s-DvT8cYizH9c6se-G4GD9OXgiRr0b-H1EpjSNPC1cs,10985 +twilio/rest/messaging/v1/domain_config.py,sha256=rtO1y97rtxBlvFCim4hEML1BRZLKU7vQovXEjme3kz0,14438 +twilio/rest/messaging/v1/domain_config_messaging_service.py,sha256=OnHPXrT7-2mo3l4QjM1N0cYJclhpVm756pn4w9FgSZE,8146 +twilio/rest/messaging/v1/external_campaign.py,sha256=DJ5e4CPCDn01fs9mzhH-yk0jYdf42NNL2Yr77nEhWek,5827 +twilio/rest/messaging/v1/linkshortening_messaging_service.py,sha256=HnbvZrSFQ3lV_qVgJmZZy0Sdv3ik3t8-RnJijv1XEbg,9270 +twilio/rest/messaging/v1/linkshortening_messaging_service_domain_association.py,sha256=F84pNV01Bbe5tn1eGP8CoPZTsEb17YLv0kV3d_xTFG8,7562 +twilio/rest/messaging/v1/request_managed_cert.py,sha256=fg0N6_uR4ygu3njHRE80X_JUFZTZg_GSYr8mn_-pt5k,7362 +twilio/rest/messaging/v1/service/__init__.py,sha256=qUd-KVBwVHa5ByTPn7e5IdxXtj4IgDcWcQ8jJNDM3e0,58925 +twilio/rest/messaging/v1/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/messaging/v1/service/__pycache__/alpha_sender.cpython-312.pyc,, +twilio/rest/messaging/v1/service/__pycache__/channel_sender.cpython-312.pyc,, +twilio/rest/messaging/v1/service/__pycache__/destination_alpha_sender.cpython-312.pyc,, +twilio/rest/messaging/v1/service/__pycache__/phone_number.cpython-312.pyc,, +twilio/rest/messaging/v1/service/__pycache__/short_code.cpython-312.pyc,, +twilio/rest/messaging/v1/service/__pycache__/us_app_to_person.cpython-312.pyc,, +twilio/rest/messaging/v1/service/__pycache__/us_app_to_person_usecase.cpython-312.pyc,, +twilio/rest/messaging/v1/service/alpha_sender.py,sha256=YOuoL8KKN6QSRku1m0bG0NJIBBOGGsNxHyA62NjEBJM,19261 +twilio/rest/messaging/v1/service/channel_sender.py,sha256=wxBaS8d6PzBhS_PlHx8ODvxbDgWc29nfzSLfXu2dikk,19693 +twilio/rest/messaging/v1/service/destination_alpha_sender.py,sha256=5--4D-UPjnSIV8yp_6MlM7hBa_qgcpmrOo4zTuuUYJg,22713 +twilio/rest/messaging/v1/service/phone_number.py,sha256=0Bq5ntSJ2Uy_Bhl1c_SKFhbwrict9QbyraiWqXQcluw,19326 +twilio/rest/messaging/v1/service/short_code.py,sha256=E04lWux1kq2RXmKrAXU_DPPfny-dd6tnux9F_OHE1mc,19048 +twilio/rest/messaging/v1/service/us_app_to_person.py,sha256=Ghjh3ejPA7XY-c8xzVmfCn_ohylp4o-vMXtCHrRlNUo,45251 +twilio/rest/messaging/v1/service/us_app_to_person_usecase.py,sha256=OxYKFgTzChJ_o65jBzljNuXVN8dhnJZD4MONzsVzWMk,4517 +twilio/rest/messaging/v1/tollfree_verification.py,sha256=N4dzS_WXCFlMjwo_GuOnrsKRKWCx0poCrYpPhSjzqOs,63270 +twilio/rest/messaging/v1/usecase.py,sha256=nqg6oL7XY5RhV5pELB1VMcpTwhZexK-gHa9cxhSzIZU,2685 +twilio/rest/messaging/v2/__init__.py,sha256=tnGhnc1ogHpyPnkHAb6vn1W09UcqWuiUHlnu0gEcI9Y,1370 +twilio/rest/messaging/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/messaging/v2/__pycache__/channels_sender.cpython-312.pyc,, +twilio/rest/messaging/v2/channels_sender.py,sha256=R6Y8wjkdNf-pbOvzimNKcTF8WEW0YbhRv5_-5fUVPuI,42985 +twilio/rest/microvisor/MicrovisorBase.py,sha256=qAQUxPKy5T4sjQxS1QLzNwZUuHSVNA1R6ANInXmLo1Q,1225 +twilio/rest/microvisor/__init__.py,sha256=VvCLDiEovqv3pvNtlafvwWWGupHDSOqLg0fDFLg-jrQ,1321 +twilio/rest/microvisor/__pycache__/MicrovisorBase.cpython-312.pyc,, +twilio/rest/microvisor/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/microvisor/v1/__init__.py,sha256=FpDCQcXn-wXd9-pDgvYRweUvclcQmcw7q9scbHbiYJU,2212 +twilio/rest/microvisor/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/microvisor/v1/__pycache__/account_config.cpython-312.pyc,, +twilio/rest/microvisor/v1/__pycache__/account_secret.cpython-312.pyc,, +twilio/rest/microvisor/v1/account_config.py,sha256=KpL3ESLPFQ1aNo7x4Q-et796Y1Sf8hQ_B4fPGTt6fz0,19039 +twilio/rest/microvisor/v1/account_secret.py,sha256=8JXOcQlW8KSixp4HB5mjsd2U-Yc39USef4tOOute9hY,18924 +twilio/rest/microvisor/v1/app/__init__.py,sha256=_uNBLnpCjBSAU4M4I9wBPpREyATS6DFbKqAYXj3wuc8,16187 +twilio/rest/microvisor/v1/app/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/microvisor/v1/app/__pycache__/app_manifest.cpython-312.pyc,, +twilio/rest/microvisor/v1/app/app_manifest.py,sha256=nRdO9A1p5m7D9qFFQaBWt55tB48e_yRHiN4-SYGePf0,5713 +twilio/rest/microvisor/v1/device/__init__.py,sha256=gmQZSVDDSK-IthXhM679eZWJTwLmflLHyW2R3r24XZA,21735 +twilio/rest/microvisor/v1/device/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/microvisor/v1/device/__pycache__/device_config.cpython-312.pyc,, +twilio/rest/microvisor/v1/device/__pycache__/device_secret.cpython-312.pyc,, +twilio/rest/microvisor/v1/device/device_config.py,sha256=0PAMSw7IVxoM_regmpfusGH7xzR3onaBE1o5o1H3HRY,20346 +twilio/rest/microvisor/v1/device/device_secret.py,sha256=6N__YRbPFhtwlSjidTbqjojSCHgdT6oxSQ38YjEwVOQ,20231 +twilio/rest/monitor/MonitorBase.py,sha256=ZUBQwu6h9-c-QsjqzqWOjAgKW0CLbhSzWkCaA6T9_I8,1204 +twilio/rest/monitor/__init__.py,sha256=qSQaNLR3BLW7RbTgo4-K5hyUs8WjFpQkejqdEmA1dgo,658 +twilio/rest/monitor/__pycache__/MonitorBase.cpython-312.pyc,, +twilio/rest/monitor/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/monitor/v1/__init__.py,sha256=jKGc7sS5H9TlP4M_SYtRAlTBGuVTG_NHrsmMqKxLaKg,1518 +twilio/rest/monitor/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/monitor/v1/__pycache__/alert.cpython-312.pyc,, +twilio/rest/monitor/v1/__pycache__/event.cpython-312.pyc,, +twilio/rest/monitor/v1/alert.py,sha256=Wbt-Koprj-Fr8v2iqEUm33dHJOeEW-HnYXcOTqW6W9w,23192 +twilio/rest/monitor/v1/event.py,sha256=U0G5AipPfHGHSrCbUydBrm1O0nELS5oFSr3E8lIfj50,26092 +twilio/rest/notify/NotifyBase.py,sha256=63iUENxBxbeJ-AfquhzrOnfHxjA1Oh_ZF4JzKXFjrZQ,1197 +twilio/rest/notify/__init__.py,sha256=fqpFtdtT21ai83xGyuIHVTFFp04n0XS3J2N20Ebn4rc,700 +twilio/rest/notify/__pycache__/NotifyBase.cpython-312.pyc,, +twilio/rest/notify/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/notify/v1/__init__.py,sha256=w5j4Nxwc7PAmhImW90TEa38frEH3mjwUgAxT2Wn2iXA,1582 +twilio/rest/notify/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/notify/v1/__pycache__/credential.cpython-312.pyc,, +twilio/rest/notify/v1/credential.py,sha256=BvvrnWkHOgP8nvI8erdpwc_DmjRy3mgNNB0gKVmh0BQ,29291 +twilio/rest/notify/v1/service/__init__.py,sha256=_aght_AEruxM0zX7EjWfOApvmlC_-Xv2rOkmGL-f0js,48635 +twilio/rest/notify/v1/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/notify/v1/service/__pycache__/binding.cpython-312.pyc,, +twilio/rest/notify/v1/service/__pycache__/notification.cpython-312.pyc,, +twilio/rest/notify/v1/service/binding.py,sha256=css5If7sBQ_gMjiQeAWSw7-mL9sW7YxtmhyF2lvtlRI,31187 +twilio/rest/notify/v1/service/notification.py,sha256=uJPJGag_p-XzwIegypxzkBNpR7_r7m5vOdJAttGYt28,25875 +twilio/rest/numbers/NumbersBase.py,sha256=4QlX-Tsp953-WAZAJSdbn4b3hxx67pL_KI4N5rEbq0E,1469 +twilio/rest/numbers/__init__.py,sha256=wIjsaoiSWgzPPa5leWNXsOwttzjCbOg7NhVG0eGV2c8,491 +twilio/rest/numbers/__pycache__/NumbersBase.cpython-312.pyc,, +twilio/rest/numbers/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/numbers/v1/__init__.py,sha256=WxUlp7QgaVdIDvjjCrCWvM_s3qgXuR7EIFfE8LIJoHk,5210 +twilio/rest/numbers/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/numbers/v1/__pycache__/bulk_eligibility.cpython-312.pyc,, +twilio/rest/numbers/v1/__pycache__/eligibility.cpython-312.pyc,, +twilio/rest/numbers/v1/__pycache__/porting_port_in.cpython-312.pyc,, +twilio/rest/numbers/v1/__pycache__/porting_port_in_phone_number.cpython-312.pyc,, +twilio/rest/numbers/v1/__pycache__/porting_portability.cpython-312.pyc,, +twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration.cpython-312.pyc,, +twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration_delete.cpython-312.pyc,, +twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration_fetch.cpython-312.pyc,, +twilio/rest/numbers/v1/__pycache__/signing_request_configuration.cpython-312.pyc,, +twilio/rest/numbers/v1/bulk_eligibility.py,sha256=JaMLcdaH5-Z019koozU63L6XCbZrL0o97nMUut9bcZE,8657 +twilio/rest/numbers/v1/eligibility.py,sha256=-r6-FXwDgg1O1J_NRcUwiQYZOz71-ftdIPH56prVJIg,3686 +twilio/rest/numbers/v1/porting_port_in.py,sha256=tn5y-5Ko6VVP7tYpJxmbUJiAh6SeNuX4i68kSvScIf4,11509 +twilio/rest/numbers/v1/porting_port_in_phone_number.py,sha256=eINfYnzgw4K_0pQS1pDholToP4i5p6QXzeZS9J2ATVM,12813 +twilio/rest/numbers/v1/porting_portability.py,sha256=8vr5i2JmBGC1u-Z7M9IyRF6h7ZQaAw4aXQlOB0NKSlc,10479 +twilio/rest/numbers/v1/porting_webhook_configuration.py,sha256=Exqs-T-E8eZofodAdjC6vF1Hma1Zl-14EPdmbawLIqU,4046 +twilio/rest/numbers/v1/porting_webhook_configuration_delete.py,sha256=8KO4wKvyhEa55qK55Jlin7mAOI0lYLS3Nshx4QjCOO0,3849 +twilio/rest/numbers/v1/porting_webhook_configuration_fetch.py,sha256=VDXsAa8CR6b9AccGByzR-lARd2cqU6CWVRKCWj2eNT8,4288 +twilio/rest/numbers/v1/signing_request_configuration.py,sha256=X_l0ReZhhE2yzvo6NNaU7_o0da6uYDy-Bj-E5SH3H2c,16134 +twilio/rest/numbers/v2/__init__.py,sha256=Qv5QHA7dwnszYN-boixMR4llKlcmqPrB3a_8bjcani4,2968 +twilio/rest/numbers/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/numbers/v2/__pycache__/bulk_hosted_number_order.cpython-312.pyc,, +twilio/rest/numbers/v2/__pycache__/bundle_clone.cpython-312.pyc,, +twilio/rest/numbers/v2/__pycache__/hosted_number_order.cpython-312.pyc,, +twilio/rest/numbers/v2/authorization_document/__init__.py,sha256=q33XwBIEsKPmUV_I4QEM_-x-ucKRNB2Bnh3eb3RVFeA,26285 +twilio/rest/numbers/v2/authorization_document/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/numbers/v2/authorization_document/__pycache__/dependent_hosted_number_order.cpython-312.pyc,, +twilio/rest/numbers/v2/authorization_document/dependent_hosted_number_order.py,sha256=we-we-lsyaJg102TGf4pB-_46WolSF289SsiwQt12fM,22570 +twilio/rest/numbers/v2/bulk_hosted_number_order.py,sha256=XaQRiDk8_b0p6QXJparOW9-j4HvgQrQcqQBtW3s3NYQ,11270 +twilio/rest/numbers/v2/bundle_clone.py,sha256=ifPMAzubZF73XdmpQxY0XNyTm4bO-l-RVIHZt3NtrJs,10336 +twilio/rest/numbers/v2/hosted_number_order.py,sha256=FBisjr-1qMoqHcTvolPhaoHxU-MFmdGiITdYnApCTaE,42405 +twilio/rest/numbers/v2/regulatory_compliance/__init__.py,sha256=om1Yd8YuZ5T0YX0OPdwl__lmeV3rf1uQI9a6VXnlPFo,3690 +twilio/rest/numbers/v2/regulatory_compliance/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/__pycache__/end_user.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/__pycache__/end_user_type.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/__pycache__/regulation.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/__pycache__/supporting_document.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/__pycache__/supporting_document_type.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/bundle/__init__.py,sha256=u6eUL_hiQNJe3poZMLxIyQiX01HEy4fUS2GPGY3UfkQ,49181 +twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/bundle_copy.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/evaluation.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/item_assignment.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/replace_items.cpython-312.pyc,, +twilio/rest/numbers/v2/regulatory_compliance/bundle/bundle_copy.py,sha256=gp25rHvCL0z9POpX7ympvvDBzatQpLQx-myAZOad1R0,14592 +twilio/rest/numbers/v2/regulatory_compliance/bundle/evaluation.py,sha256=SaTEnlcZOKVVxlyW4_7jXBcayDDW9LeLaNjwqVY9-u0,16918 +twilio/rest/numbers/v2/regulatory_compliance/bundle/item_assignment.py,sha256=_tJzr1corQuIUB_sBeDcwmpJoEEl1JYq37Zud-JWT3I,18746 +twilio/rest/numbers/v2/regulatory_compliance/bundle/replace_items.py,sha256=NqXzEwGw45-YKNJOYWPuIPzLu_x5EIRR0R2LBpILR4U,6056 +twilio/rest/numbers/v2/regulatory_compliance/end_user.py,sha256=3f6kQrSV-3fKNT_Pc1dCMeAon_Ww80C1EcN-jW7oNRg,21703 +twilio/rest/numbers/v2/regulatory_compliance/end_user_type.py,sha256=IvvMK3UoH7JxdFxzgbLcPFG6ZOS7FN9GTxoQNqnPjO8,14620 +twilio/rest/numbers/v2/regulatory_compliance/regulation.py,sha256=rbezHBPfMT3pdVJGvLjT6DthiKNW7Juala2YifWyx9M,22156 +twilio/rest/numbers/v2/regulatory_compliance/supporting_document.py,sha256=rm6B0xzqpq5EeMqxMXjF_o-inMrNFmkD-SAwfApXvuE,23771 +twilio/rest/numbers/v2/regulatory_compliance/supporting_document_type.py,sha256=BPEX9r78rsoBHDYzq42SvDWN_bCgaYOkMS8Wwx3EvR8,15268 +twilio/rest/oauth/OauthBase.py,sha256=osnf61tFtaKzvSRec80nclNAGL2hjobh7cCzzM7yNnA,1190 +twilio/rest/oauth/__init__.py,sha256=NIyb2ajGCJ85V0wIoDgWvteT7TGUNYG9X3xLBE3RDaA,370 +twilio/rest/oauth/__pycache__/OauthBase.cpython-312.pyc,, +twilio/rest/oauth/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/oauth/v1/__init__.py,sha256=_O7z9N65ZEXjX5DAiMDvj-Sw4rNHP4JvxFhx1_yhRCg,1536 +twilio/rest/oauth/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/oauth/v1/__pycache__/authorize.cpython-312.pyc,, +twilio/rest/oauth/v1/__pycache__/token.cpython-312.pyc,, +twilio/rest/oauth/v1/authorize.py,sha256=Fqlo4Z2C_xVqVlV6R_CkZz20SCsZlDwvTQ2zu5N45ZY,4329 +twilio/rest/oauth/v1/token.py,sha256=X042V3dwmnEBHcDL-tQUa-KOyU-RC9yYTEAjCmHwZgk,6044 +twilio/rest/preview/PreviewBase.py,sha256=4FwwsIDgUAaBNRu0L3IPZuOJY0fmOs7rfqOpRfIvs1I,2027 +twilio/rest/preview/__init__.py,sha256=pPSeRmKwcqT27hzxO7-7ViMAeZcWsUSDVhKZL0cHcso,2889 +twilio/rest/preview/__pycache__/PreviewBase.cpython-312.pyc,, +twilio/rest/preview/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview/hosted_numbers/__init__.py,sha256=Q0CYZWP0LWjme7cyzlNZFMMI6BDqN0Fa5uvNtGXcVq8,1893 +twilio/rest/preview/hosted_numbers/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview/hosted_numbers/__pycache__/hosted_number_order.cpython-312.pyc,, +twilio/rest/preview/hosted_numbers/authorization_document/__init__.py,sha256=ba-SzDbDhe63CtLoXOi9eneraL_XT-I7X1Wyl85udk4,33527 +twilio/rest/preview/hosted_numbers/authorization_document/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview/hosted_numbers/authorization_document/__pycache__/dependent_hosted_number_order.cpython-312.pyc,, +twilio/rest/preview/hosted_numbers/authorization_document/dependent_hosted_number_order.py,sha256=3GajRpiCDWS0yModzEcy8pRlp5VU05snSbQFviZkEAc,25401 +twilio/rest/preview/hosted_numbers/hosted_number_order.py,sha256=KpsnZ8nHYW-4NvNpEqh-ap-m8JL5lbeouJ4-PZR9kI4,49656 +twilio/rest/preview/marketplace/__init__.py,sha256=Z1ULxHOw4TLnAX6wXweELqxekmXLlhysuzjz34rOc9A,1776 +twilio/rest/preview/marketplace/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview/marketplace/available_add_on/__init__.py,sha256=kewAJJfdJtF1qLlFer6nLK2r20TnF7G5ehxSP4tZZ8A,15536 +twilio/rest/preview/marketplace/available_add_on/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview/marketplace/available_add_on/__pycache__/available_add_on_extension.cpython-312.pyc,, +twilio/rest/preview/marketplace/available_add_on/available_add_on_extension.py,sha256=GG3Tx_OOFyovMG65zx9LqIRBOaWTfEg7T_2mdTfkUks,16632 +twilio/rest/preview/marketplace/installed_add_on/__init__.py,sha256=5DCmwA43LPeSmiMappzOgTYPJw-nU7nxCa2chn6Lnb8,24628 +twilio/rest/preview/marketplace/installed_add_on/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview/marketplace/installed_add_on/__pycache__/installed_add_on_extension.cpython-312.pyc,, +twilio/rest/preview/marketplace/installed_add_on/installed_add_on_extension.py,sha256=qTx7ZtS5RUCftsf4YHXNtMUSY051PDVBYSWybOmkyNw,19368 +twilio/rest/preview/wireless/__init__.py,sha256=ZlKINNHwHiqAhehhMb7g_jGDFUNK6XWGzlhA8XdGfZY,1850 +twilio/rest/preview/wireless/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview/wireless/__pycache__/command.cpython-312.pyc,, +twilio/rest/preview/wireless/__pycache__/rate_plan.cpython-312.pyc,, +twilio/rest/preview/wireless/command.py,sha256=5OIhP5tj_D2omdixIaejAqrTAnGfMlHy2q0nHVHdsI0,19770 +twilio/rest/preview/wireless/rate_plan.py,sha256=lBlcBCeUKoTTfbXiYtufOaLu5Uyf9YJT-BdTDKa02Hc,23248 +twilio/rest/preview/wireless/sim/__init__.py,sha256=nGW4QXMc_l6qGcor5VHcM_o9ChoeCl3V4olUm8yzWfk,29624 +twilio/rest/preview/wireless/sim/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview/wireless/sim/__pycache__/usage.cpython-312.pyc,, +twilio/rest/preview/wireless/sim/usage.py,sha256=ry8_Ney-F51nXRMje0P8mAv6wNpYqZVoI0F8UlGpY6k,6810 +twilio/rest/preview_iam/PreviewIamBase.py,sha256=PoU3blksO0afcjPCmHa_4JzVUD8PuyyZpa1EsjkwIPY,1227 +twilio/rest/preview_iam/__init__.py,sha256=abr7pyb5BO3J654krTvqpPWIqt762cN3G9MVaAwR-Xk,662 +twilio/rest/preview_iam/__pycache__/PreviewIamBase.cpython-312.pyc,, +twilio/rest/preview_iam/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview_iam/v1/__init__.py,sha256=nMeH5PgNfXvKemg5wnYJldyrm9_jfOYWGmz9a4Q8Yp4,1644 +twilio/rest/preview_iam/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview_iam/v1/__pycache__/authorize.cpython-312.pyc,, +twilio/rest/preview_iam/v1/__pycache__/token.cpython-312.pyc,, +twilio/rest/preview_iam/v1/authorize.py,sha256=vUSPtCJZwSnpoo4Sl7b8Szoh7S0-GaA7duhmOflxtKA,4425 +twilio/rest/preview_iam/v1/token.py,sha256=D9jGVlq-hgYPJoD4JDkTafeZoSXjrp4sqxtd2-R_mkw,6144 +twilio/rest/preview_iam/versionless/__init__.py,sha256=xFbC9PXTOvN9NLNEKOMh1n17dYTeHqR-yJO7fajYzjo,1468 +twilio/rest/preview_iam/versionless/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview_iam/versionless/organization/__init__.py,sha256=Mw08g47tZxDPm3DrCiO2aqau95h--xbbz6enOtrMeWw,3916 +twilio/rest/preview_iam/versionless/organization/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/preview_iam/versionless/organization/__pycache__/account.cpython-312.pyc,, +twilio/rest/preview_iam/versionless/organization/__pycache__/role_assignment.cpython-312.pyc,, +twilio/rest/preview_iam/versionless/organization/__pycache__/user.cpython-312.pyc,, +twilio/rest/preview_iam/versionless/organization/account.py,sha256=Sst7OP0EUn6KKQCPdFKqRAdezjEAzxoo6a74WOG8stM,15149 +twilio/rest/preview_iam/versionless/organization/role_assignment.py,sha256=vtHw1f2FdzG6Jh5Dg5g_sN0AONPtD3dXgch8K5dzUF4,20400 +twilio/rest/preview_iam/versionless/organization/user.py,sha256=h-yRzU2OJ2lE9qRbBf1JE14HoncESylywXmLOLd7D1o,38114 +twilio/rest/pricing/PricingBase.py,sha256=NLCOp1P4eV2ZlQikfRsLHd1zUZyqms5HRsl4Y54QtZ8,1469 +twilio/rest/pricing/__init__.py,sha256=ge3TqYJHEMFblpBnfC9X4FW0d0SsO7I5b4qKGY-jkVU,1569 +twilio/rest/pricing/__pycache__/PricingBase.cpython-312.pyc,, +twilio/rest/pricing/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/pricing/v1/__init__.py,sha256=CurnOGdO6y0wIWCGSGxgxt0YdszryeMAmdRbj7Ooeog,1868 +twilio/rest/pricing/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/pricing/v1/messaging/__init__.py,sha256=rSOhH2QMvljfAGkFDYwomtLmOqPZwBjbOkcUfRbqXPA,1443 +twilio/rest/pricing/v1/messaging/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/pricing/v1/messaging/__pycache__/country.cpython-312.pyc,, +twilio/rest/pricing/v1/messaging/country.py,sha256=ZnYb5Gy1xbHzkOGf1peO5jhpPP2N7SfwSanGw84l8wQ,14999 +twilio/rest/pricing/v1/phone_number/__init__.py,sha256=Y5i7NuFEchDtGXMSoTkFMonR8iyMVBzZM8Ud8xXW5ik,1455 +twilio/rest/pricing/v1/phone_number/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/pricing/v1/phone_number/__pycache__/country.cpython-312.pyc,, +twilio/rest/pricing/v1/phone_number/country.py,sha256=OhcpWGvwz8fhGn-Lq7946ZxtTa8qOy9ZuXZkTCttO5c,14592 +twilio/rest/pricing/v1/voice/__init__.py,sha256=I_2ql8yNyelIDbO6xLw_YZOtvdVS4YsJ1_xA5inn4dI,1753 +twilio/rest/pricing/v1/voice/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/pricing/v1/voice/__pycache__/country.cpython-312.pyc,, +twilio/rest/pricing/v1/voice/__pycache__/number.cpython-312.pyc,, +twilio/rest/pricing/v1/voice/country.py,sha256=VwgIhuBsL8lhUcRzb8SsMpZHVe7jKBTS3oF3uVKrK7Y,14885 +twilio/rest/pricing/v1/voice/number.py,sha256=jPe0U15gAiRvUgvyg2EIrZpIho9g9Py1ZsOJJmS33pc,5880 +twilio/rest/pricing/v2/__init__.py,sha256=lt22Da-7bXFid4KEGWNLc5_R4u5Is6fDuYCoVa1wjj0,1802 +twilio/rest/pricing/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/pricing/v2/__pycache__/country.cpython-312.pyc,, +twilio/rest/pricing/v2/__pycache__/number.cpython-312.pyc,, +twilio/rest/pricing/v2/country.py,sha256=7DLs2hvkX12BagctGEgghE129is26RfcmakHGjP3IgY,14939 +twilio/rest/pricing/v2/number.py,sha256=ZRRvI8-dlQ9KHpbYsUv19nl_heZ20V11PUHAQepdzD0,9184 +twilio/rest/pricing/v2/voice/__init__.py,sha256=EV0LqxLaOB0PgH7E182h0InT6g9wmJsoPSBC5e6WSVE,1753 +twilio/rest/pricing/v2/voice/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/pricing/v2/voice/__pycache__/country.cpython-312.pyc,, +twilio/rest/pricing/v2/voice/__pycache__/number.cpython-312.pyc,, +twilio/rest/pricing/v2/voice/country.py,sha256=H4p1Gk5PTSoSDMjbQuBodJpawEW3a3hVcvJ4E_yFieQ,14915 +twilio/rest/pricing/v2/voice/number.py,sha256=FZLh9qSfDJl0f6ndrf1w_Iv5x9uSvaF6nr7z2LO6IK0,9258 +twilio/rest/proxy/ProxyBase.py,sha256=U3nXl8igDx1PLplE9GdldvQ7-_1ZofMO8kPMoptnTPY,1190 +twilio/rest/proxy/__init__.py,sha256=t3suaVnvsgCHvrHOkPBshzKqaK0xZ0OAfoBvPsgS_MA,387 +twilio/rest/proxy/__pycache__/ProxyBase.cpython-312.pyc,, +twilio/rest/proxy/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/proxy/v1/__init__.py,sha256=K_YLKgkAp-_QiAKKVb_RKJF1Bk2ge_6Z16uFrOqdq1Q,1274 +twilio/rest/proxy/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/proxy/v1/service/__init__.py,sha256=ojVop07d0E7CrmQcdgXBTPyvpmrmC08dhvFM8T1GWNA,39366 +twilio/rest/proxy/v1/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/proxy/v1/service/__pycache__/phone_number.cpython-312.pyc,, +twilio/rest/proxy/v1/service/__pycache__/short_code.cpython-312.pyc,, +twilio/rest/proxy/v1/service/phone_number.py,sha256=3w1QA2Xk5A4PnHleevnQ1_5pxaHv3hIj5AqnmnpHkVE,25082 +twilio/rest/proxy/v1/service/session/__init__.py,sha256=Wn-cp_eQwBiYs1x_j9d_8qFeGDXNhEacpGhJxPju1wk,28970 +twilio/rest/proxy/v1/service/session/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/proxy/v1/service/session/__pycache__/interaction.cpython-312.pyc,, +twilio/rest/proxy/v1/service/session/interaction.py,sha256=6cyaP98FMIibyCfYioOFxuHiWrQgvEqzkpP5BHE9IPM,21646 +twilio/rest/proxy/v1/service/session/participant/__init__.py,sha256=qGtO9flZ0mCtHza8SiUkBF00HIfY3Dg-4SlsOz580Og,23678 +twilio/rest/proxy/v1/service/session/participant/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/proxy/v1/service/session/participant/__pycache__/message_interaction.cpython-312.pyc,, +twilio/rest/proxy/v1/service/session/participant/message_interaction.py,sha256=p23k8qBF9Bw1evIc2Vkoxa1diklfMR2EgQwn1Dr7y88,24103 +twilio/rest/proxy/v1/service/short_code.py,sha256=etcwcuRI8smorLFDdubKDjcJyZIeqpWeQVYkuoLVlss,22637 +twilio/rest/routes/RoutesBase.py,sha256=Wd7ZCiv13Jkec4cmQTcAEWgftoIU1m57bZ-qkzoriXg,1197 +twilio/rest/routes/__init__.py,sha256=2c-YFuPc4-lbnbloGWO0HBglvgusSEin0PqD7MhDKi4,1003 +twilio/rest/routes/__pycache__/RoutesBase.cpython-312.pyc,, +twilio/rest/routes/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/routes/v2/__init__.py,sha256=yOGIyQHTtHeDgd-yu4LSv5AcLa2KT__TcSmWUYploSo,1877 +twilio/rest/routes/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/routes/v2/__pycache__/phone_number.cpython-312.pyc,, +twilio/rest/routes/v2/__pycache__/sip_domain.cpython-312.pyc,, +twilio/rest/routes/v2/__pycache__/trunk.cpython-312.pyc,, +twilio/rest/routes/v2/phone_number.py,sha256=lKVw4cbxRLYCkHFiOFgLodbbyR3CpsOt97rnuGn8p08,10163 +twilio/rest/routes/v2/sip_domain.py,sha256=UlgBl06DzAP5K4cyqBtd2LYUIP3mCnXKe6zdvUCSths,8755 +twilio/rest/routes/v2/trunk.py,sha256=NAacTltZwq8WjuN3XaIA3gbbmg1oj5bgWbFRCZxDIp8,9972 +twilio/rest/serverless/ServerlessBase.py,sha256=tkHMV_J34VboZ9KpnPZGKoWqoRvQmi7jUKNgGbQif_Y,1225 +twilio/rest/serverless/__init__.py,sha256=RSch0EvaZC7vInV-DXpUwtaitRhC1dpLXllzK-keHIQ,417 +twilio/rest/serverless/__pycache__/ServerlessBase.cpython-312.pyc,, +twilio/rest/serverless/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/serverless/v1/__init__.py,sha256=FE26OpLcLc2D4bdUE9-madIxREcrRBOk8jPT-H99_zw,1299 +twilio/rest/serverless/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/serverless/v1/service/__init__.py,sha256=m4QzN2phun9teH5wkVGB5tZCdZGtVR5jF4AkzQo0SlY,26954 +twilio/rest/serverless/v1/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/serverless/v1/service/asset/__init__.py,sha256=9oov6zyI3eOXrWnh-yvCKvxSjOk2mnavs-9x_Cf0jUY,21783 +twilio/rest/serverless/v1/service/asset/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/serverless/v1/service/asset/__pycache__/asset_version.cpython-312.pyc,, +twilio/rest/serverless/v1/service/asset/asset_version.py,sha256=td0TPORDdf4mOEDDnCs03g8MnCI-DlLsBqgbb7ljllI,17185 +twilio/rest/serverless/v1/service/build/__init__.py,sha256=uUrHixsuYAgeb7sVjnMJWn-iTWJvLibR36VIo8U7mjE,21695 +twilio/rest/serverless/v1/service/build/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/serverless/v1/service/build/__pycache__/build_status.cpython-312.pyc,, +twilio/rest/serverless/v1/service/build/build_status.py,sha256=T-gNHyQsiD_AatrctHKaNFm8hzF-yfULrqRggNs0jDA,6686 +twilio/rest/serverless/v1/service/environment/__init__.py,sha256=v_1yRUP5Oc9onosllPi6p3nP3s3wWOi6yLfQguh5GGQ,21922 +twilio/rest/serverless/v1/service/environment/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/serverless/v1/service/environment/__pycache__/deployment.cpython-312.pyc,, +twilio/rest/serverless/v1/service/environment/__pycache__/log.cpython-312.pyc,, +twilio/rest/serverless/v1/service/environment/__pycache__/variable.cpython-312.pyc,, +twilio/rest/serverless/v1/service/environment/deployment.py,sha256=VnPee8tNRgGeIlbeWI_lSf0eV8T7BXAYyAsUCb40Cog,19307 +twilio/rest/serverless/v1/service/environment/log.py,sha256=DnAaJUInzoTTZqRwkHq6WpNwxT2PkUx-SwbKAVRoLVY,21397 +twilio/rest/serverless/v1/service/environment/variable.py,sha256=QN_eyxH-w6t0eKsqD7Btnl5d8dYG3fzqxOm35xZC9kA,23799 +twilio/rest/serverless/v1/service/function/__init__.py,sha256=uZxmjE1VB_UMCnoCD15cbccB4lFSJZgM1hJ6RMlMs1w,22129 +twilio/rest/serverless/v1/service/function/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/serverless/v1/service/function/function_version/__init__.py,sha256=xlZP3O8DVvnOHImF-_JAG6w2JwBrPwuAIdCgJk6Kj1o,18564 +twilio/rest/serverless/v1/service/function/function_version/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/serverless/v1/service/function/function_version/__pycache__/function_version_content.cpython-312.pyc,, +twilio/rest/serverless/v1/service/function/function_version/function_version_content.py,sha256=v9C75LS4AFWf-Ac2r2sAvRqE-8msJAXQgUUd5IuMMh4,7915 +twilio/rest/studio/StudioBase.py,sha256=Ir8Bf4wI_qF2HPpL59i94svqiX_FB0g6Y3Tw02ZA4lQ,1460 +twilio/rest/studio/__init__.py,sha256=VF97OQEqJW5-ycSz4oqnGlxyvDEo-Hzxf0GZQzgv3ts,694 +twilio/rest/studio/__pycache__/StudioBase.cpython-312.pyc,, +twilio/rest/studio/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v1/__init__.py,sha256=x63ZfUydLZEcampmW0D3vaSqnpCc2mMGH5zg4uckLTA,1249 +twilio/rest/studio/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v1/flow/__init__.py,sha256=gkghYu5WGSbS2jVi2-NPkAr0bjIL00YASKpHDQ4TGRw,16929 +twilio/rest/studio/v1/flow/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v1/flow/engagement/__init__.py,sha256=fDQDSuqi92MzdQ__4hN6fqFbqF9FJbjNrz4yRS0RPm8,22281 +twilio/rest/studio/v1/flow/engagement/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v1/flow/engagement/__pycache__/engagement_context.cpython-312.pyc,, +twilio/rest/studio/v1/flow/engagement/engagement_context.py,sha256=4D7a2a5dlsIF1rQR4LcORBti6v4XZ2C-8qq-kkvPFDk,6899 +twilio/rest/studio/v1/flow/engagement/step/__init__.py,sha256=Znrh_kCQM_YI3m9q9WQs6HlJ99sOHspWf8TkKo5zeLg,17820 +twilio/rest/studio/v1/flow/engagement/step/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v1/flow/engagement/step/__pycache__/step_context.cpython-312.pyc,, +twilio/rest/studio/v1/flow/engagement/step/step_context.py,sha256=SHjKvjBN7LxxexCtFUvpT2aoZM-MSR-lmZg271MHQNQ,7574 +twilio/rest/studio/v1/flow/execution/__init__.py,sha256=UHcdqa2uGgr83Q_kUpKeN719v9qYGbtr78jFnXfwKZo,28473 +twilio/rest/studio/v1/flow/execution/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v1/flow/execution/__pycache__/execution_context.cpython-312.pyc,, +twilio/rest/studio/v1/flow/execution/execution_context.py,sha256=PhVrZdllf1lwZJ-dfrZSaa31TQj7f9YUD-kx3c8nwco,7056 +twilio/rest/studio/v1/flow/execution/execution_step/__init__.py,sha256=HlSBUR_Q3Br4PNLnTKtmWueQiTq9ZHhmje0QoY_7iTk,18618 +twilio/rest/studio/v1/flow/execution/execution_step/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v1/flow/execution/execution_step/__pycache__/execution_step_context.cpython-312.pyc,, +twilio/rest/studio/v1/flow/execution/execution_step/execution_step_context.py,sha256=K-kkFSodl-r5aDErRSlC7XvYbBA2bH0ZQit1ZlqI11Q,7895 +twilio/rest/studio/v2/__init__.py,sha256=W2t8U-5spMVgebzQZzLAkN8fOhceKLAPVTfJ3EWCXCo,1573 +twilio/rest/studio/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v2/__pycache__/flow_validate.cpython-312.pyc,, +twilio/rest/studio/v2/flow/__init__.py,sha256=OaZPTmOWOeAKrO7gnUp4zR9xvwunSOq4h2NTNy3rch0,24883 +twilio/rest/studio/v2/flow/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v2/flow/__pycache__/flow_revision.cpython-312.pyc,, +twilio/rest/studio/v2/flow/__pycache__/flow_test_user.cpython-312.pyc,, +twilio/rest/studio/v2/flow/execution/__init__.py,sha256=d6_WO6H3zXxxmrD_saxOkJd8XYjwDTxP08r_p0_mtaE,28357 +twilio/rest/studio/v2/flow/execution/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v2/flow/execution/__pycache__/execution_context.cpython-312.pyc,, +twilio/rest/studio/v2/flow/execution/execution_context.py,sha256=mZ3_zssbsq-GZzYFLRSGFay_vs2fDLWWP34gJEfUKbM,7056 +twilio/rest/studio/v2/flow/execution/execution_step/__init__.py,sha256=5P-ueoYcoHTjedaGZY4dpb0KripB6L6EPh15Dor-I7g,18489 +twilio/rest/studio/v2/flow/execution/execution_step/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/studio/v2/flow/execution/execution_step/__pycache__/execution_step_context.cpython-312.pyc,, +twilio/rest/studio/v2/flow/execution/execution_step/execution_step_context.py,sha256=mE3HYlu3d4GvynE_Ir4y7ll955q-5dCnnUKyuW2NBZ8,7895 +twilio/rest/studio/v2/flow/flow_revision.py,sha256=8xmJ-lgIRZHTz8itHMzfnSN9PqpNoizjnJ9EZv7c43Q,16541 +twilio/rest/studio/v2/flow/flow_test_user.py,sha256=waIZQz_LUlTJbZOemmi9espZZtaTdMYbzFZHlMhYXq8,7858 +twilio/rest/studio/v2/flow_validate.py,sha256=9YXzVhtkOCg3phCX9xkq9n_CQYsxayjeKXqYvtTtKRQ,4283 +twilio/rest/supersim/SupersimBase.py,sha256=tzDOW6QQb0M_HEBpS5SmrK9AN0FWPkMKxNRgN9bGoxQ,1211 +twilio/rest/supersim/__init__.py,sha256=dRLKZs5p-3LCF1VlFz1_jV9r338yrTYW7kzraj64vuc,2908 +twilio/rest/supersim/__pycache__/SupersimBase.cpython-312.pyc,, +twilio/rest/supersim/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/supersim/v1/__init__.py,sha256=ExvMot1Mt7LpQfp5mlZgaOTf-yVEfZo9hL-lIgPc03Y,3801 +twilio/rest/supersim/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/supersim/v1/__pycache__/esim_profile.cpython-312.pyc,, +twilio/rest/supersim/v1/__pycache__/fleet.cpython-312.pyc,, +twilio/rest/supersim/v1/__pycache__/ip_command.cpython-312.pyc,, +twilio/rest/supersim/v1/__pycache__/network.cpython-312.pyc,, +twilio/rest/supersim/v1/__pycache__/settings_update.cpython-312.pyc,, +twilio/rest/supersim/v1/__pycache__/sms_command.cpython-312.pyc,, +twilio/rest/supersim/v1/__pycache__/usage_record.cpython-312.pyc,, +twilio/rest/supersim/v1/esim_profile.py,sha256=P43eGCYk0UO_A1NMgLqc3hu_vBjgKx-BSKKEgIYoIsM,24581 +twilio/rest/supersim/v1/fleet.py,sha256=IgQI3Bpuowy04j0PHdGsGoE-BhexndrUBlhMaiGi5aQ,36497 +twilio/rest/supersim/v1/ip_command.py,sha256=Y_J6thO-FE9Lt4zOGHXF7fpNaw_aVMNcmB0T9iH0UE8,27525 +twilio/rest/supersim/v1/network.py,sha256=aEtv-jepmc8AGSFfmwsczwOZ6PVskhWORtNIRrMMJaw,18062 +twilio/rest/supersim/v1/network_access_profile/__init__.py,sha256=HQDEuOUfHJx2tNzrR94fUjc7zA19mx79t_Yh6QxKNF0,21218 +twilio/rest/supersim/v1/network_access_profile/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/supersim/v1/network_access_profile/__pycache__/network_access_profile_network.cpython-312.pyc,, +twilio/rest/supersim/v1/network_access_profile/network_access_profile_network.py,sha256=qf7x40ND6e56G4-JHZQiwn5IebrJacKjUfeQaTXy2K8,20283 +twilio/rest/supersim/v1/settings_update.py,sha256=2YQlT2fRw8HdaVtwAshrOaIWMqD_W2bwqU4wCVqPYI4,14539 +twilio/rest/supersim/v1/sim/__init__.py,sha256=qKQXvmEF0ITq495TKtdAcnAyl8233IPiIXB88-TJv18,29881 +twilio/rest/supersim/v1/sim/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/supersim/v1/sim/__pycache__/billing_period.cpython-312.pyc,, +twilio/rest/supersim/v1/sim/__pycache__/sim_ip_address.cpython-312.pyc,, +twilio/rest/supersim/v1/sim/billing_period.py,sha256=yuqyKSGlxodrRPckQNtlbUtaRqq6AoxNHWJIHlc1cuo,12352 +twilio/rest/supersim/v1/sim/sim_ip_address.py,sha256=8KTtLk6dmCnfynWcjPuLyQ7St_qC9uD-_lVcw_TV0w8,10949 +twilio/rest/supersim/v1/sms_command.py,sha256=t-YRhuJ_57y2ASSmKSnmhMYsdUqSrlepHQEYc3GofXw,23862 +twilio/rest/supersim/v1/usage_record.py,sha256=z0jxspCN-7YOtXIWAHGeroCR2GuMtiDOLBpWA-2u4is,27163 +twilio/rest/sync/SyncBase.py,sha256=qfnPzbBdwYLKn45ZV51XawiTF0J9LVVp7WoiWeNNuF8,1183 +twilio/rest/sync/__init__.py,sha256=IV4mK6fA37ohGhjUmJXQMoBrLYhbKu4rExsU7ZhBemI,381 +twilio/rest/sync/__pycache__/SyncBase.cpython-312.pyc,, +twilio/rest/sync/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/sync/v1/__init__.py,sha256=lo8inAzFDENbjugimex6jV8cKsaekYSSdhfnVb-jK08,1269 +twilio/rest/sync/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/sync/v1/service/__init__.py,sha256=fg8SJtsFXdU4Gk4Rqczy_1V-As-fDJY_bzDehzYWxL8,38755 +twilio/rest/sync/v1/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/sync/v1/service/document/__init__.py,sha256=Geh-Lsh7bX3V-03JR7puPkIKfSWodWlPl3QhnilOcxk,26694 +twilio/rest/sync/v1/service/document/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/sync/v1/service/document/__pycache__/document_permission.cpython-312.pyc,, +twilio/rest/sync/v1/service/document/document_permission.py,sha256=T5GDe7N6RFKjKYp23YXtPkA9-FrZet_flMMnR61ezTs,22818 +twilio/rest/sync/v1/service/sync_list/__init__.py,sha256=B_og3ugqnSoVSM8WbvfeBGCbz-PpbeAkswbRTZiRgWA,26399 +twilio/rest/sync/v1/service/sync_list/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/sync/v1/service/sync_list/__pycache__/sync_list_item.cpython-312.pyc,, +twilio/rest/sync/v1/service/sync_list/__pycache__/sync_list_permission.cpython-312.pyc,, +twilio/rest/sync/v1/service/sync_list/sync_list_item.py,sha256=BgXaq75g3XseOCuCiLYjUomodmeWpYgn7uFK0VCJXtI,38006 +twilio/rest/sync/v1/service/sync_list/sync_list_permission.py,sha256=LWoy9ULPKi_6rx2QIlQF89z7pedN-NsIwf5B7UNUqoI,22822 +twilio/rest/sync/v1/service/sync_map/__init__.py,sha256=Dlea9vhxxccpECrsJBfJk7ysPkwqguw9xEOM5pzy5yY,26087 +twilio/rest/sync/v1/service/sync_map/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/sync/v1/service/sync_map/__pycache__/sync_map_item.cpython-312.pyc,, +twilio/rest/sync/v1/service/sync_map/__pycache__/sync_map_permission.cpython-312.pyc,, +twilio/rest/sync/v1/service/sync_map/sync_map_item.py,sha256=kglhoY3mqq3HZ3DKlRurNhUdfG-10RklhS_Vn6GUJlo,38565 +twilio/rest/sync/v1/service/sync_map/sync_map_permission.py,sha256=YQ-hUgWsfD_a4pa4xTQcF35c35vXq6edmBvA7Td7VDo,22750 +twilio/rest/sync/v1/service/sync_stream/__init__.py,sha256=GVIf6X8zTeQAE1Xq4NOc2OR45JxtfhJ4q3wpxScXrnA,24100 +twilio/rest/sync/v1/service/sync_stream/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/sync/v1/service/sync_stream/__pycache__/stream_message.cpython-312.pyc,, +twilio/rest/sync/v1/service/sync_stream/stream_message.py,sha256=gPXLse1tM8XNj3bDwD1_24BnJygOkEvWlBzwImRzryA,4704 +twilio/rest/taskrouter/TaskrouterBase.py,sha256=0pduWi9gHRMDnWejrHNLhL1UFtnTbFTD7K4_uBvk698,1225 +twilio/rest/taskrouter/__init__.py,sha256=LsvpBhg8Cg-tYPzdacb1bKJ9fEAwRBd6sdH41_s-CGA,431 +twilio/rest/taskrouter/__pycache__/TaskrouterBase.cpython-312.pyc,, +twilio/rest/taskrouter/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/taskrouter/v1/__init__.py,sha256=dgBlDHuEdkXOOBusvaS3DPEdV6KpgNdnRKPxRPxmvsc,1319 +twilio/rest/taskrouter/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/__init__.py,sha256=-kzAKagMxJtS1OErpphiFX_hyivFm2ZDYXpBa4GAly0,45784 +twilio/rest/taskrouter/v1/workspace/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/__pycache__/activity.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/__pycache__/event.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/__pycache__/task_channel.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/__pycache__/workspace_cumulative_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/__pycache__/workspace_real_time_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/__pycache__/workspace_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/activity.py,sha256=caZQKdRCg3nRWNFCHcFa9iBo-Fliy2xfP8GrKWz7rGk,27256 +twilio/rest/taskrouter/v1/workspace/event.py,sha256=d8-bEDWXiml12ka6t38gRLfkd_L6FpscnjbPAgV5ZtI,33245 +twilio/rest/taskrouter/v1/workspace/task/__init__.py,sha256=5utVTRSw9M7ffEMUxsMlC1F6t3g2QUvC03D2w14JoK8,60103 +twilio/rest/taskrouter/v1/workspace/task/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/task/__pycache__/reservation.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/task/reservation.py,sha256=Su5uvemUYtURHuw-fXFuv_ASJJX-gDeIvG95uDNDNKc,82418 +twilio/rest/taskrouter/v1/workspace/task_channel.py,sha256=b4hteITkASJmfka_j1lKeA9DcTuWhhHwk_2Pki4Vb70,24950 +twilio/rest/taskrouter/v1/workspace/task_queue/__init__.py,sha256=EzzZTUJRbpN49fgRGF5_EX6hx5STB8yUT4ulEngd7qA,41127 +twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/task_queue_bulk_real_time_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/task_queue_cumulative_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/task_queue_real_time_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/task_queue_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/task_queue/__pycache__/task_queues_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/task_queue/task_queue_bulk_real_time_statistics.py,sha256=G-4CmLkSGkrors4P9_S_sbmVZXde-jRb2v1_HNclPxY,5533 +twilio/rest/taskrouter/v1/workspace/task_queue/task_queue_cumulative_statistics.py,sha256=Owzy2GLnZ2chsPZLsUJgFs7r1tHWYWhcLwXlgMDk_K8,18538 +twilio/rest/taskrouter/v1/workspace/task_queue/task_queue_real_time_statistics.py,sha256=oHvXO9ZRSB2HJ49LXE9yVk75CoovfxUbX9opTO1OOd0,11309 +twilio/rest/taskrouter/v1/workspace/task_queue/task_queue_statistics.py,sha256=0OEqLQlKjd6E_eitn_QfG3TyjLg7TNgiHLnZhiIwu4w,13598 +twilio/rest/taskrouter/v1/workspace/task_queue/task_queues_statistics.py,sha256=MsadNOzs6tSp7ihI30AULA5rG2vTbR2mVM3d7RFm-Nk,21635 +twilio/rest/taskrouter/v1/workspace/worker/__init__.py,sha256=UFtA2wNgCYKfwUINg2bGD2_oBbaMHZj8KCZFt1wc7xY,45390 +twilio/rest/taskrouter/v1/workspace/worker/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/worker/__pycache__/reservation.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/worker/__pycache__/worker_channel.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/worker/__pycache__/worker_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/worker/__pycache__/workers_cumulative_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/worker/__pycache__/workers_real_time_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/worker/__pycache__/workers_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/worker/reservation.py,sha256=mUqm71lfxPzTtLvH_gvpVT8FHHmLQIZVMyxvXY004zE,80200 +twilio/rest/taskrouter/v1/workspace/worker/worker_channel.py,sha256=UkBLmPdLYTNxTZYjce8EjmYIAMLtXWDA7ZIoQiHOO6Y,22917 +twilio/rest/taskrouter/v1/workspace/worker/worker_statistics.py,sha256=W3IBjoY9k6Wj5GvHcHF6yXpa6QWIY6fLncyxb4XZSFw,11948 +twilio/rest/taskrouter/v1/workspace/worker/workers_cumulative_statistics.py,sha256=20N-BV-7b0J4zrr_9c9jnsZNXE6jYtfia5k3Krmptz8,13470 +twilio/rest/taskrouter/v1/workspace/worker/workers_real_time_statistics.py,sha256=HaJEWw4jqTX9egJFxlyK4gSNP3lcEPAd5idhzEyucJ4,8113 +twilio/rest/taskrouter/v1/workspace/worker/workers_statistics.py,sha256=3xP9S84x-L1czrTuWYt6J615VLkvmP2dbYgiB38M1KE,13763 +twilio/rest/taskrouter/v1/workspace/workflow/__init__.py,sha256=dZgoAfgMhhb8Yq8puZ1zMPIxHDYkGkOj2AHqn0l3qwU,35780 +twilio/rest/taskrouter/v1/workspace/workflow/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/workflow/__pycache__/workflow_cumulative_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/workflow/__pycache__/workflow_real_time_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/workflow/__pycache__/workflow_statistics.cpython-312.pyc,, +twilio/rest/taskrouter/v1/workspace/workflow/workflow_cumulative_statistics.py,sha256=SXjcPAejVN6AyR9Z1pMqOf7OyHfu5uR4-tHVgNf5tO0,19446 +twilio/rest/taskrouter/v1/workspace/workflow/workflow_real_time_statistics.py,sha256=ZzfRIIXLrfut803EK82QX_Y09PXERLpMi1G2O_8ITPo,9907 +twilio/rest/taskrouter/v1/workspace/workflow/workflow_statistics.py,sha256=KiR4khvRrjxHa51tbtag-Gp06l8ZugOQ7BHF9XiIxjE,14919 +twilio/rest/taskrouter/v1/workspace/workspace_cumulative_statistics.py,sha256=xJ_CVDVOZhNyqKxc7NLsmYJnQXglUBwLm_a7IyyoKpQ,18383 +twilio/rest/taskrouter/v1/workspace/workspace_real_time_statistics.py,sha256=o8V7VYUXWBrkKEI40gEcTApkYWk6Nc_KHVeeyJ1T8tE,9256 +twilio/rest/taskrouter/v1/workspace/workspace_statistics.py,sha256=svL4Jk3fU8ylmKBCdo3BUBimak6wTvHgUYtFo85PVyA,13782 +twilio/rest/trunking/TrunkingBase.py,sha256=KEpBtt8vyNLrV0C6xgPB0EJy5eEylY48LePvQKhEi4U,1211 +twilio/rest/trunking/__init__.py,sha256=VX22mT-YnOfya6CQBiGMPyk7rHQmYGnJF5oiGiU7Jlg,391 +twilio/rest/trunking/__pycache__/TrunkingBase.cpython-312.pyc,, +twilio/rest/trunking/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/trunking/v1/__init__.py,sha256=qbIMhWiC4TsBoUrQJNtWBduHzJSNW7w0usKKrT1vWXE,1269 +twilio/rest/trunking/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/trunking/v1/trunk/__init__.py,sha256=-0jEpyK6c4e2UEotMvRGLPYeY1_qwmGmeCk7IYMAcVg,41424 +twilio/rest/trunking/v1/trunk/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/trunking/v1/trunk/__pycache__/credential_list.cpython-312.pyc,, +twilio/rest/trunking/v1/trunk/__pycache__/ip_access_control_list.cpython-312.pyc,, +twilio/rest/trunking/v1/trunk/__pycache__/origination_url.cpython-312.pyc,, +twilio/rest/trunking/v1/trunk/__pycache__/phone_number.cpython-312.pyc,, +twilio/rest/trunking/v1/trunk/__pycache__/recording.cpython-312.pyc,, +twilio/rest/trunking/v1/trunk/credential_list.py,sha256=DiaFxSeQHzQVUdQ443HryYev1H2xEguSfOM_o-ZBEXQ,19263 +twilio/rest/trunking/v1/trunk/ip_access_control_list.py,sha256=5w5vNMvcxS7bgAO90EXLuhEPh3FCXyZ3Fz1CTUvNSJ4,19633 +twilio/rest/trunking/v1/trunk/origination_url.py,sha256=wR1_hdm8NbEJsCf_6R0AYRRQ_J2LGYxPw44stYIf4fg,29067 +twilio/rest/trunking/v1/trunk/phone_number.py,sha256=CXghf3xUwyigxnUPpf5Qwv13SZCj7wuom4jH4ikbwOw,23374 +twilio/rest/trunking/v1/trunk/recording.py,sha256=mQy8EGrSX4Xjs11rRJlGZrwbYXeb9grlqMNX2MRYNq8,8619 +twilio/rest/trusthub/TrusthubBase.py,sha256=LSqCTPqT2RLzvjNzVcTXdvmVqwmyGa46Mvp8NmhsSjA,1211 +twilio/rest/trusthub/__init__.py,sha256=HF6EMXEDfJnPqcSZRYnkzrwMEARiFkTxX57LIuhl_uA,2483 +twilio/rest/trusthub/__pycache__/TrusthubBase.cpython-312.pyc,, +twilio/rest/trusthub/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/trusthub/v1/__init__.py,sha256=ylVjXc_ydfpG1fHfAe_zPUENSRXRiFgYw4VlVQmvFcE,4926 +twilio/rest/trusthub/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/trusthub/v1/__pycache__/compliance_inquiries.cpython-312.pyc,, +twilio/rest/trusthub/v1/__pycache__/compliance_registration_inquiries.cpython-312.pyc,, +twilio/rest/trusthub/v1/__pycache__/compliance_tollfree_inquiries.cpython-312.pyc,, +twilio/rest/trusthub/v1/__pycache__/end_user.cpython-312.pyc,, +twilio/rest/trusthub/v1/__pycache__/end_user_type.cpython-312.pyc,, +twilio/rest/trusthub/v1/__pycache__/policies.cpython-312.pyc,, +twilio/rest/trusthub/v1/__pycache__/supporting_document.cpython-312.pyc,, +twilio/rest/trusthub/v1/__pycache__/supporting_document_type.cpython-312.pyc,, +twilio/rest/trusthub/v1/compliance_inquiries.py,sha256=7N_DBUDEfQtTCbjx6s2N7jliKSSaRQbxvxEV_yVUqwk,11702 +twilio/rest/trusthub/v1/compliance_registration_inquiries.py,sha256=nmMqv3S49VTyZMHDXqpLbvcOVtPg_w_2pLmyPVIiGKU,28318 +twilio/rest/trusthub/v1/compliance_tollfree_inquiries.py,sha256=zd4iItGhbhUjVkiil8rJUODrRweyJHJUT_zQGkbt2BQ,14834 +twilio/rest/trusthub/v1/customer_profiles/__init__.py,sha256=tDyUmTRFNDQ7XpH_PY9ppn_KaBbqK6f9kcdkiMxmscY,32132 +twilio/rest/trusthub/v1/customer_profiles/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/trusthub/v1/customer_profiles/__pycache__/customer_profiles_channel_endpoint_assignment.cpython-312.pyc,, +twilio/rest/trusthub/v1/customer_profiles/__pycache__/customer_profiles_entity_assignments.cpython-312.pyc,, +twilio/rest/trusthub/v1/customer_profiles/__pycache__/customer_profiles_evaluations.cpython-312.pyc,, +twilio/rest/trusthub/v1/customer_profiles/customer_profiles_channel_endpoint_assignment.py,sha256=6Bn2Cftxm7mGRjXIPkVCu_WfjoseN9CItbU6Sp0q9K8,24350 +twilio/rest/trusthub/v1/customer_profiles/customer_profiles_entity_assignments.py,sha256=Y9VoVi_dW7rhTWIDr7_fCRsRvcAko_A7lM6vVMVzXM4,22795 +twilio/rest/trusthub/v1/customer_profiles/customer_profiles_evaluations.py,sha256=MBv7dFnstEx-BK-4LMjUEDJ3_EDP2w_61ys5VQY4Ij0,19310 +twilio/rest/trusthub/v1/end_user.py,sha256=FzBSwDDmHdBktQnPKGcIbXBTduaDfBaYwNjLtjjQeRo,21761 +twilio/rest/trusthub/v1/end_user_type.py,sha256=AD37MAi6XDD0iJIxkgSyXHVMzwAabWzHmDif8A9hzlw,14583 +twilio/rest/trusthub/v1/policies.py,sha256=EPIg9jHa8Otq4_NalbxK0QQVYCSSwfnigq20LdFsCNQ,14011 +twilio/rest/trusthub/v1/supporting_document.py,sha256=a_u94ntENL7QZIQjhUB3Tyx8PBJLCTxUkrg8AZobglQ,23394 +twilio/rest/trusthub/v1/supporting_document_type.py,sha256=ZSEwsngIwbaeKBByPFLcgprAabOiK9wtjHtOsmS5gYE,15209 +twilio/rest/trusthub/v1/trust_products/__init__.py,sha256=_zv1dpHZTdjokT8GWLkm0F6D3tcfXB5FOab5mw3Kh48,31492 +twilio/rest/trusthub/v1/trust_products/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/trusthub/v1/trust_products/__pycache__/trust_products_channel_endpoint_assignment.cpython-312.pyc,, +twilio/rest/trusthub/v1/trust_products/__pycache__/trust_products_entity_assignments.cpython-312.pyc,, +twilio/rest/trusthub/v1/trust_products/__pycache__/trust_products_evaluations.cpython-312.pyc,, +twilio/rest/trusthub/v1/trust_products/trust_products_channel_endpoint_assignment.py,sha256=FwxYxXryAXwYkoWGVnOkNRRaRhsZ6y2lw73MnP6234U,24044 +twilio/rest/trusthub/v1/trust_products/trust_products_entity_assignments.py,sha256=dmIQ_F2ZG_Z0uxgLfJXmJSg15Ho6MZk9ne4KPTiNPbs,22366 +twilio/rest/trusthub/v1/trust_products/trust_products_evaluations.py,sha256=rdTiKFlP-m29ZjRO4oC4xRFt3I44uZQ9-FzwTDelJBM,18929 +twilio/rest/verify/VerifyBase.py,sha256=slTn-f0x41HIoCytOvLLAYdWVdgh0Vfdno0Abcx0LC8,1197 +twilio/rest/verify/__init__.py,sha256=64lABdnh-2wHRS-ODTfyTpa3DHZlfAsSxsvLP5O9TK8,2056 +twilio/rest/verify/__pycache__/VerifyBase.cpython-312.pyc,, +twilio/rest/verify/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/verify/v2/__init__.py,sha256=CRuH0It_FUkZwbFGIhF4HmqAvwABDjm1dMUApkLqlFI,2993 +twilio/rest/verify/v2/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/verify/v2/__pycache__/form.cpython-312.pyc,, +twilio/rest/verify/v2/__pycache__/safelist.cpython-312.pyc,, +twilio/rest/verify/v2/__pycache__/template.cpython-312.pyc,, +twilio/rest/verify/v2/__pycache__/verification_attempt.cpython-312.pyc,, +twilio/rest/verify/v2/__pycache__/verification_attempts_summary.cpython-312.pyc,, +twilio/rest/verify/v2/form.py,sha256=909gfUJuAw_bW71J6HARQ4-ARsJ7o3vIstHEdguQC-o,5876 +twilio/rest/verify/v2/safelist.py,sha256=Ag90aA4SOTgXFluJv4Jj8a6vAztCI_yvs3hBCxURFhA,8628 +twilio/rest/verify/v2/service/__init__.py,sha256=WmL8y2Dasd-v80kz_lYjjdrY7gqsAFWNEDEOlHBeBSE,63600 +twilio/rest/verify/v2/service/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/verify/v2/service/__pycache__/access_token.cpython-312.pyc,, +twilio/rest/verify/v2/service/__pycache__/messaging_configuration.cpython-312.pyc,, +twilio/rest/verify/v2/service/__pycache__/verification.cpython-312.pyc,, +twilio/rest/verify/v2/service/__pycache__/verification_check.cpython-312.pyc,, +twilio/rest/verify/v2/service/__pycache__/webhook.cpython-312.pyc,, +twilio/rest/verify/v2/service/access_token.py,sha256=1ZpaHFwwpjWMmXI7y3mJFeFDulTF2SMM-5q5k821jmU,10807 +twilio/rest/verify/v2/service/entity/__init__.py,sha256=itrroE7UTwKM03yPBfC_EnyCLiY_Ufqb_WyNGCC0-4s,21581 +twilio/rest/verify/v2/service/entity/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/verify/v2/service/entity/__pycache__/factor.cpython-312.pyc,, +twilio/rest/verify/v2/service/entity/__pycache__/new_factor.cpython-312.pyc,, +twilio/rest/verify/v2/service/entity/challenge/__init__.py,sha256=iZ_efdWSqqG0LzLZHSqfYCRQ14XrM6-RUsJvFYrsySg,35609 +twilio/rest/verify/v2/service/entity/challenge/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/verify/v2/service/entity/challenge/__pycache__/notification.cpython-312.pyc,, +twilio/rest/verify/v2/service/entity/challenge/notification.py,sha256=jHoqJF5UV0c6BSJ17jf5yDkMXlSwicsdn8FvzgmJ_ns,6946 +twilio/rest/verify/v2/service/entity/factor.py,sha256=8M5KTGNV_myl89zhQh1peYEcPGt52BPcan02CUXPMzU,30406 +twilio/rest/verify/v2/service/entity/new_factor.py,sha256=ZQwCSA25oMDePqlWyhXLSpXfxR0NjO7ceAdWkeUXDKE,16555 +twilio/rest/verify/v2/service/messaging_configuration.py,sha256=10nFnWOIK2GsTc8M_vVGaJYpOqCcbLIMc-z1RLJjkkQ,24500 +twilio/rest/verify/v2/service/rate_limit/__init__.py,sha256=RDqM6xpir69k4fmKs4_s4pl_34nH9t6D2QqAnU-b4n0,22708 +twilio/rest/verify/v2/service/rate_limit/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/verify/v2/service/rate_limit/__pycache__/bucket.cpython-312.pyc,, +twilio/rest/verify/v2/service/rate_limit/bucket.py,sha256=4UfvcaXif8peF_hjPLYazJgGmfqKah8rt28jEs_f-Wk,23443 +twilio/rest/verify/v2/service/verification.py,sha256=UbDYqseVvl265qsGh0PmyIYmTdxYQMU1nmS4M1ee_JQ,24228 +twilio/rest/verify/v2/service/verification_check.py,sha256=773bJ0nSXxC8gng-6sj1Bd-NtcChD5pIb73-kwD41qU,9418 +twilio/rest/verify/v2/service/webhook.py,sha256=h5jSWrl4iozfO7FW7Z3IL6qjnQc9BUcE1G8mKxKDUuk,26592 +twilio/rest/verify/v2/template.py,sha256=YCtBY-w6M6OwtENuBlgQhTxP80NGgFEwQV8yarjhjfM,12051 +twilio/rest/verify/v2/verification_attempt.py,sha256=2ToIzv1ZMa14aYeRQlEo9wnhBjZuFaavIff6-vSSC_0,30897 +twilio/rest/verify/v2/verification_attempts_summary.py,sha256=OHp1b9X1IFP-P4grVYk7illDA9KExQpQBM9bMlML3C0,13606 +twilio/rest/video/VideoBase.py,sha256=qDVCaYofOZ9GyWTLVAkIr-z20L7qJzK6UVkaoCSix7E,1190 +twilio/rest/video/__init__.py,sha256=n0lfmIKLLW72CaH5QxWw4PzNz9xs-sS7lcn3IVFNZZc,2050 +twilio/rest/video/__pycache__/VideoBase.cpython-312.pyc,, +twilio/rest/video/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/video/v1/__init__.py,sha256=dkp1TkZI0FLmxCCZ3nLx3YOtDwdzlm940z3vnPQSwXg,2972 +twilio/rest/video/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/video/v1/__pycache__/composition.cpython-312.pyc,, +twilio/rest/video/v1/__pycache__/composition_hook.cpython-312.pyc,, +twilio/rest/video/v1/__pycache__/composition_settings.cpython-312.pyc,, +twilio/rest/video/v1/__pycache__/recording.cpython-312.pyc,, +twilio/rest/video/v1/__pycache__/recording_settings.cpython-312.pyc,, +twilio/rest/video/v1/composition.py,sha256=RCS6MKuTHXpK-TqoSMbhHs0uZ5BO3Ww5IFLd8H8vf-E,35950 +twilio/rest/video/v1/composition_hook.py,sha256=hMVK3E4orclhDG2rPdilugt7wLC4gOpBCrVXELOtSI0,56200 +twilio/rest/video/v1/composition_settings.py,sha256=kBu6WRkDoV-5YrvVAHXsPlsiGiB95cB_6YPWpmap9uk,14299 +twilio/rest/video/v1/recording.py,sha256=olKXsqVZbLTOUD0BZ_hK23lSF30KRTwBbxORB_N7Wpk,27838 +twilio/rest/video/v1/recording_settings.py,sha256=c8FiVzy4sKp9RIP55nT_zjijKttYTmtE0TzrO4N2WtQ,14130 +twilio/rest/video/v1/room/__init__.py,sha256=53xRHI10FMaa5dZ_qyOqyNr8W2C12Q9AOKLKQTd1q1I,40422 +twilio/rest/video/v1/room/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/video/v1/room/__pycache__/recording_rules.cpython-312.pyc,, +twilio/rest/video/v1/room/__pycache__/room_recording.cpython-312.pyc,, +twilio/rest/video/v1/room/participant/__init__.py,sha256=h9R1KpOb900lpxQctmbXyDXJUCLvdIqxXAfCEo70lzI,29495 +twilio/rest/video/v1/room/participant/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/video/v1/room/participant/__pycache__/anonymize.cpython-312.pyc,, +twilio/rest/video/v1/room/participant/__pycache__/published_track.cpython-312.pyc,, +twilio/rest/video/v1/room/participant/__pycache__/subscribe_rules.cpython-312.pyc,, +twilio/rest/video/v1/room/participant/__pycache__/subscribed_track.cpython-312.pyc,, +twilio/rest/video/v1/room/participant/anonymize.py,sha256=mkGn7zr3wEPVwsgezSyjzRSmGz5gTO47KtrR7P-MFeY,8053 +twilio/rest/video/v1/room/participant/published_track.py,sha256=WJPJep0V2N42HRNKSZhadI33af98Gw9x4MNtI8WV1FY,17358 +twilio/rest/video/v1/room/participant/subscribe_rules.py,sha256=wehmgUSun7ajqKKZj9uArlybLi7gJd90GVfYy8bRpPo,7102 +twilio/rest/video/v1/room/participant/subscribed_track.py,sha256=5g8bV91G-OUrckhHLzXIgdb7QwIo1FSIvBgKNZsJods,17550 +twilio/rest/video/v1/room/recording_rules.py,sha256=-9RUQb-7TRIVJwseEFG5r756rM1V5bsoYe_ztLPrNbw,5798 +twilio/rest/video/v1/room/room_recording.py,sha256=KWomK3OaiLF5ayzg-1JhgPcgfmR_2dAaOk7kx8j8gH4,25271 +twilio/rest/voice/VoiceBase.py,sha256=vx3BwrZ7ey2vqPrenZfgzIkoMV1txQR_vJlPGgMQLn4,1190 +twilio/rest/voice/__init__.py,sha256=mW4XcGaW44Uoa7eyNAKz4Nn4paB0Ck0Mkoub3XQYwwE,2099 +twilio/rest/voice/__pycache__/VoiceBase.cpython-312.pyc,, +twilio/rest/voice/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/voice/v1/__init__.py,sha256=dEg-rToBdmoNw7zta9H53Krf2WCRRe43XEWTXXkf3Hg,3036 +twilio/rest/voice/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/voice/v1/__pycache__/archived_call.cpython-312.pyc,, +twilio/rest/voice/v1/__pycache__/byoc_trunk.cpython-312.pyc,, +twilio/rest/voice/v1/__pycache__/ip_record.cpython-312.pyc,, +twilio/rest/voice/v1/__pycache__/source_ip_mapping.cpython-312.pyc,, +twilio/rest/voice/v1/archived_call.py,sha256=V_i84d8jCU9G-BLqSenCnoB7eLpE3vilbaj2n79rYkY,3402 +twilio/rest/voice/v1/byoc_trunk.py,sha256=WzGIcc7nJBwGfYcvspcU8B2wYbBXrzE3ufNJAxrzh7c,38687 +twilio/rest/voice/v1/connection_policy/__init__.py,sha256=rfdFRasVKd9yVFypPO9zaiBrtWJ5mvqNyvf_zVbLLT4,21685 +twilio/rest/voice/v1/connection_policy/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/voice/v1/connection_policy/__pycache__/connection_policy_target.cpython-312.pyc,, +twilio/rest/voice/v1/connection_policy/connection_policy_target.py,sha256=1ZseM2OXJir4NBZV8xIZi9ggmN3IPkqHD7YBJ3T76a4,30498 +twilio/rest/voice/v1/dialing_permissions/__init__.py,sha256=SJbMDsLFYUD-mkvu8YVDhjUbloobBrKuQwEtRC-Yvgw,2327 +twilio/rest/voice/v1/dialing_permissions/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/voice/v1/dialing_permissions/__pycache__/bulk_country_update.cpython-312.pyc,, +twilio/rest/voice/v1/dialing_permissions/__pycache__/settings.cpython-312.pyc,, +twilio/rest/voice/v1/dialing_permissions/bulk_country_update.py,sha256=giefzUf5SmBDspVb9PWy_GbTCt9aLsfHnfidwIcPNKU,4226 +twilio/rest/voice/v1/dialing_permissions/country/__init__.py,sha256=xOuoc2YYOUFVSrVaRczP2ED5PB3J91R2R0IGjZKbXDI,27816 +twilio/rest/voice/v1/dialing_permissions/country/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/voice/v1/dialing_permissions/country/__pycache__/highrisk_special_prefix.cpython-312.pyc,, +twilio/rest/voice/v1/dialing_permissions/country/highrisk_special_prefix.py,sha256=CG4hyNvOZOXh5C062bQsaimVPkPhhVH0ivBI9yskbMw,11448 +twilio/rest/voice/v1/dialing_permissions/settings.py,sha256=pezyWh8-p55k-CHnb2I0hBMFMpq0TrZgVKcz8yWnfOQ,7576 +twilio/rest/voice/v1/ip_record.py,sha256=meZcdGs5DgInal0HPeeEl-HADgFI76qK9gDM2lXVJlo,21614 +twilio/rest/voice/v1/source_ip_mapping.py,sha256=ATbg-FM9F3O9slFNuEB6kzZLrp3MUEVH0nmHuTbH7GA,20630 +twilio/rest/wireless/WirelessBase.py,sha256=VqCO0nP3Ox8WIkFHHdjMj-6bQeIWIBbW3_YnLYiyBMc,1211 +twilio/rest/wireless/__init__.py,sha256=37apinMOZa6Gr3Dl5SUnt5sy-fQE20i4bUBONAnhdGY,1261 +twilio/rest/wireless/__pycache__/WirelessBase.cpython-312.pyc,, +twilio/rest/wireless/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/wireless/v1/__init__.py,sha256=V2ghA15n9ZpyofyFP0pUiQtAkoDX4-u1a4-PqluNojM,2136 +twilio/rest/wireless/v1/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/wireless/v1/__pycache__/command.cpython-312.pyc,, +twilio/rest/wireless/v1/__pycache__/rate_plan.cpython-312.pyc,, +twilio/rest/wireless/v1/__pycache__/usage_record.cpython-312.pyc,, +twilio/rest/wireless/v1/command.py,sha256=dFVxuu00-yeLGIs26Rvm7LyyGNOm9pWzVKaEwMs3eQo,28457 +twilio/rest/wireless/v1/rate_plan.py,sha256=0NuRmFYBbaNC5jksOW5r_99IS2munT2EXuidh98JbC8,31676 +twilio/rest/wireless/v1/sim/__init__.py,sha256=E_nLykjUOfJRsZABVmm9eGuj0yJ5TqKc7ox6AinB9J4,47034 +twilio/rest/wireless/v1/sim/__pycache__/__init__.cpython-312.pyc,, +twilio/rest/wireless/v1/sim/__pycache__/data_session.cpython-312.pyc,, +twilio/rest/wireless/v1/sim/__pycache__/usage_record.cpython-312.pyc,, +twilio/rest/wireless/v1/sim/data_session.py,sha256=cka3NNQ3laIkeeQ0J6XH90yxWKNq3V1sBDDjZUD9a3Y,14643 +twilio/rest/wireless/v1/sim/usage_record.py,sha256=crqO1JRUbp-T1XLGCIslGFYjB4ZLSpQu7zm6v011ijs,17801 +twilio/rest/wireless/v1/usage_record.py,sha256=COri6A7vFfzfGcB7Y9M3YtcZfs4Ehx9xU_PJG_MB43M,16389 +twilio/twiml/__init__.py,sha256=2RyXWXsT4Nv38P4Gc51drBxMNMVQzyp7Wzmny5G5QjI,3471 +twilio/twiml/__pycache__/__init__.cpython-312.pyc,, +twilio/twiml/__pycache__/fax_response.cpython-312.pyc,, +twilio/twiml/__pycache__/messaging_response.cpython-312.pyc,, +twilio/twiml/__pycache__/voice_response.cpython-312.pyc,, +twilio/twiml/fax_response.py,sha256=tIz38pGfUL6kj2CHGUxyP1CKQtdjJySVFiedm64exKI,1435 +twilio/twiml/messaging_response.py,sha256=R3SFGVbZpkQHKf4v5FOm7S_sj97OyrUfjH2z4X53DXk,3017 +twilio/twiml/voice_response.py,sha256=tNSHigGk7dU-tNcA43u_PnUDRlGEKUjJEbASS1Y6o0k,101574 diff --git a/venv/Lib/site-packages/twilio-9.6.3.dist-info/REQUESTED b/venv/Lib/site-packages/twilio-9.6.3.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/twilio-9.6.3.dist-info/WHEEL b/venv/Lib/site-packages/twilio-9.6.3.dist-info/WHEEL new file mode 100644 index 00000000..5f133dbb --- /dev/null +++ b/venv/Lib/site-packages/twilio-9.6.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/twilio-9.6.3.dist-info/licenses/AUTHORS.md b/venv/Lib/site-packages/twilio-9.6.3.dist-info/licenses/AUTHORS.md new file mode 100644 index 00000000..58eabd02 --- /dev/null +++ b/venv/Lib/site-packages/twilio-9.6.3.dist-info/licenses/AUTHORS.md @@ -0,0 +1,41 @@ +# Authors + +We'd like to thank the following people who have contributed to the +`twilio-python` repository. + +- Adam Ballai +- Alex Brinsmead +- Alex Chan +- Andrew Benton +- Chad Selph +- Comrade DOS +- Dan Yang +- Dennis Pilarinos +- Doug Black +- Evan Fossier +- Fabian Topfstedt +- Florian Le Goff +- Frank Tobia +- Frederik De Bleser +- Guillaume BINET +- Hunter Blanks +- Joël Franusic +- Justin Van Koten +- Kenneth Reitz +- Kevin Burke +- Kyle Conroy +- Michael Parker +- Moses Palmér +- Ryan Horn +- Sam Kimbrel +- Skylar Saveland +- Tiberiu Ana +- Zachary Voase +- aes +- dnathe4th +- isbo +- negeorge +- Evan Cooke +- tysonholub +- Brodan +- Kyle Jones \ No newline at end of file diff --git a/venv/Lib/site-packages/twilio-9.6.3.dist-info/licenses/LICENSE b/venv/Lib/site-packages/twilio-9.6.3.dist-info/licenses/LICENSE new file mode 100644 index 00000000..6485c1f8 --- /dev/null +++ b/venv/Lib/site-packages/twilio-9.6.3.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (C) 2023, Twilio, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/venv/Lib/site-packages/twilio-9.6.3.dist-info/top_level.txt b/venv/Lib/site-packages/twilio-9.6.3.dist-info/top_level.txt new file mode 100644 index 00000000..105a6864 --- /dev/null +++ b/venv/Lib/site-packages/twilio-9.6.3.dist-info/top_level.txt @@ -0,0 +1 @@ +twilio diff --git a/venv/Lib/site-packages/twilio/__init__.py b/venv/Lib/site-packages/twilio/__init__.py new file mode 100644 index 00000000..5ce3ed13 --- /dev/null +++ b/venv/Lib/site-packages/twilio/__init__.py @@ -0,0 +1,2 @@ +__version_info__ = ("9", "6", "3") +__version__ = ".".join(__version_info__) diff --git a/venv/Lib/site-packages/twilio/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17389793a52a94d6920d93a994098857aff29ad5 GIT binary patch literal 278 zcmX@j%ge<81U;7$GJJsaV-N=hn4yf%T0q8hh7^VRGw&8RLOgyY!)K5o zzr38SVnU07s$;x8Jwsw#Qj4=o@(W_h@-vfD9n(|uN@B`V^U7j;GLvG8GfPr+3lfvF z6Vp?RV@k?1b29Vwu*uC&Da}c>E8+nf4RU0$6p;A9%*e=iLs;no ZgTM_w!TyZSj0@uGm-#drxr;!-0RV}6OJM*2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/__pycache__/request_validator.cpython-312.pyc b/venv/Lib/site-packages/twilio/__pycache__/request_validator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca95a1dd5e204b8d1582d4b5c30727063487f307 GIT binary patch literal 5663 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 GKo$Vht}<@` literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/auth_strategy/__pycache__/auth_strategy.cpython-312.pyc b/venv/Lib/site-packages/twilio/auth_strategy/__pycache__/auth_strategy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a293019cda3f154608daf38b2652b1f2e8f60d29 GIT binary patch literal 1347 zcma)6&ubG=5PolWvrTH+p#7m1X;r%biA3%bTW%6tVamQ7<>)a#mR7%^k)}a> zsV+*ZevN@XZWcVjO-odmD7m&3#YeK6OgcK)Ey9RSZK6vyW%8P2OHD;rSj?6~OKB?m z-CSK|BY?&sCN_X3LUa^RbpSo#kEG*45*e)k55bClkTAhA1Q4{K2mOUQQtF%n(IVS) zn;3nkPueusropJuPfkmL;<54?AAu+jvo-DL$(@_|#~$Ne{=xF{YW^{IBm4E0I@}48um6~a7m__F0#WSbuxL3o|v17<|*vi!WAZ{2=)e(l#m>Mi8 z(}Pu{k^r$wKF?fyp}bCYz#xIjnW*!sMbYXm)WdpbK!JM6de1YkuMm#MaU7dAsCLHf+fJ~4oG7()*6x293MC_Os`FHTvo|FG0wb&)K%Ii#X z){YZ%JdLx>y2F`$Sz~37Y4=Q!nH-;lkNidUbT`-w8UHD;F+W85A5kaq$Y~VV&s;i* zlTkG*%rIa?jf!j6%cv&}W3z6SBM-;h=HnoOc#XR?#)Ti=Ajj4RGIWhkp{5jEx6IFA zbjTgQ5#2Y=7e|3V3$Fm8Ne(3%o8P)(9?%j;nplbnL z5zu#K>HA6aWohXA4$)Z}mKc6CmsW$>=%Hl7G3z~)$if#L))>fU!HSAf-NHJvM3{c8 pn4|cus86@~1tfEfgh42o|IaEjvO;A+>@@U7`t!lqyP{l$uqtU?6GdbdAux!VWgDG+f z6gvtnI4V^fjjB$OYK~5eGvpYVUNwYK8>MI6Y{p{I7jc%8{q#>2MpNYK^uGFh)FY?g|E4+ zy?=F5f9xJ}mT?wCbmw-ubaJV@F8(DVCVk8wAB7lc9l zNUjYo5-(-FERRyKcQDL^PGo|R$@a?h!ScyEjOHbPDVlHXex7`sTo~nr+}p0+5C$QU zH(-Q_H9`h49feYt2zfj5!d0ey)aa0IyJ^}&x7(z4+~3DM4O~YfwS(2LLlPzj<%^V!pXIZOlu%Q**v~2UL0g zLfu=aSgYjKve2$7LS=9@68RVMUS+BN^}jNngo)8Ka`NPjWHAy>zG-)nB{5FYH{bmHzW2@Rr(&@iu)Y2~zjT)X z{7{2-%e6rBI)ZKR!6zY9iA{*YTBucZTPL8wL-6$t@C~N#>e(6FXymN?Pc^VeVoufN z(rlx~5ceoNBe^SCrQv0}v#7NO%^L__At3{s_+V?But@5nYt?6bB-UcwtpSQ_n_XZbez+wZn+BhbLS z%9fGjM7_p%Vp1AJfuxkH`;)HnQ#v&_`^eG~L$Gi$DNyQ#t`L+8m1b%Ec>dl^XHGCK zoX6ACv(9}cmStRXR^z~9Qxz6TXO%^(&XZul5rJgaYOc5JR+w<)^B@f32^VdoqUGa6 z6w{80@mhlykZ5hV(~j}BPL-UvfZ=EzzMI9Zu03<){m9o*Yj4#0VqR(D3M6^XWSvLe zX%E#x>Y*}f8ydvY$_ebi4&mo;MyS0dUc{L6RhT@H6-1S_u`^=MtSiAn72P^~>pRbT z5&f6?0q@6cd_WyNMLo>fNZDvkGiidWiXXu71S$7Zk17* zbW>W5{d%Zy52Y)0H_TR2*ApEdh7aN$iLnsJAy-Bx#a0b?EDR~N2v13r=*iSCuHGaK zidd8|9Bsg%MsimV@+8;)VW0`vDLnLX@HgV2R9JeXjHO>lOF-g(mQ~@UtW?H3E2Cq? w)hlMisgKI@RLrq?J4^5mzld{6r5MI=pc6v&VQe369p+6k^w#+W*rh`L0AarmX8-^I literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/auth_strategy/__pycache__/token_auth_strategy.cpython-312.pyc b/venv/Lib/site-packages/twilio/auth_strategy/__pycache__/token_auth_strategy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da3a3932da0f11afc3df6fbbdc28256e6e8b8942 GIT binary patch literal 3466 zcmcInZ%kX)6~FJF{fuo4*nokungjxF91@acirAEukUs@7XKLuOT1ccARvl6&r+=nVX;X<3sjF0JUzcdoHtoZ3!esVBwMx@I>>CZ~8f9O0?t6YV zg>>I`5$B$J?z!ilckb_;d;Mp>zYalr{oX56DK|p@paZ7~6=pjHOc5zaVKOLT_e_GZ z#%zLxp3QJsF2QB_1kccUE+b@J375t58FyAph!!toJlVQL9fMeO4k@l{NO5EF7H991 z@Xj+)@n3WhkFutyBn@n+S!{}w7PK6WGNw2*V@!?D=PB=_{6&L+-sC(Tk89I7_nl-e zIf;pE8?|X=2ekbHjDHH>f)Vu}d}lD1VwX^gQP^v~1g~&dNU;ikjZe6McLOf~FH&C< z9>oo`ZV6ps65fj_Dw>Vfjyv5j{RVYH%2vE!cep{lp#R%V3_?F=ipZ!=US}838xU`U zcSLEI!`1p*u#PqcEiem6s_H5TM$Ty=!*6RLl&*KUT7Rp;!V1xm8bOCkha9ff8%++M zZgIF;f19a!wZl%hrr~f#yTdsvz=x`b^C-&3;Shxkp2eAHz!dbEJSL_nNor0tB#F=u zH0v(Bcdt7BlT_%voYYl$Sj(kU z&=`rIy%WbhzTWnoCw9)z8 z62C6CZ#1_p@vqlyhB}M!<@o(jH;g=+VxTN`l*Eo-^?ne0KlWGg@McSAxuv(%(tBIH z-!ibozv0~m)5vrYY|N0HTmc`ILH<^t{5&v4fM0s&EXZhcpa!WAa82(_1zQ2Vi+;gE zBC+v;`xH(ROd^o@-V`?EDancnX#mZe4584`=@t?43{W!wXD2!Fg7YnO?Tykd6^d;A zSs;sOL-du!Fa(PRr!jmZ^vm|Q+i&>R0zGSD59tJ*FMTYG?YyN4S42>y*!cKOM7m(O z)2UX1U!742)-BHf1FD=fR4rGC?se`fRB77i6zJe&Ah_2RS`@4j@)iWciaQ8)w;w$R z(cUeDvBFIEf%y)Yr8ai8r>}8RmHY(es|BaF^f)a>Pu=bR;>95B^_0Sx_S8IbIE8h5 zw>-42IcLu9)73&*lRKD&(o_|~g$94OD)?p4JpAoP190|pEQ4N#2vFG-?qxK`M7g+$ z3P<92E@A;VVu2Yek(5RvNm<6a4seZVWHOmk3l=;gL*E^Vx-F!e4XSPfU&2@N040Uc z(oEWbn7o<;BUaICvQxyiSILxJXe1F>Q|R1_ydBxq0V?{hfdJaPfj0-Q53YGTS3)1O zzu&$}?sX0PX1siSv~+y*k6-`G;GYK9kAH8YvANi`-1ZrA`$w2hL*e4+^5|OVz(#9F zv9MfNdGTIrFYx8oSgAF(I{sneW@5ed1l1c`9xI2sOQG(yo=fYY?{9SVl)H|Vx{j5* z&X&5)-tT(hXQ$s9{USikZdt~+IP{H6%ol7;@ykNjf$!_WD9qLFB zTHuT-*wVB_?`pSQ&W=0mRPVu>^8dEt_%sbMxCn5py(QALX6|a;h;S6D;CuBp2U++k zZ!|lqihF^l1=+Do^%ZoL{~(c=fGTyn+>y=sHu5LS0{5xxFPUaxW3(5o|Zh_ z)N69-Im2`*Sk@G5a!{@bJwMZ*B3hO{`E(M=4 z%Li}Z`%T?T!=DD4mVN-a@W_Qi&y<7FQZTx@|Kq;j#y*Oz2fzLMzCXn7#5NnkMc=Y- zn`4KW`p*y>s^3Dazy9$f5j6zgeC_&c4-w-D|1H?M83;c_ENtv+TnqKCGAsI8)4_FL zY%|#UpDh6Yad-O!;G;f5uNbpVlCqjI zlc7%@pCr9Hlg!u;AVQ&SJv>Yfo+o4<)#fj2T88w{nFu8`aHhZVD3Wm|BS}$)Sk;8) z-1ByLX-y`Sc;R0^3gq!M2%t+ix{~=ELATYw3I|q#+X%WXkr6_xp=|`+LzhPwVgB9H zD1@yW&@uv^AE5>tDWP|{1r{3}U$Y-o{mz5H`axii4EU*FzZ~~{wUYA=BlK!9+bW7v zhLP{Lin#Ndw}WGSS2y*5z7(u)eIkC#4(CZS3^E!7ouX!oV;JTEs(XMM9-#Waquzg_ YW1paJeu9oZa>bbN4d3SoI?K*~0X2#JfdBvi literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/auth_strategy/auth_strategy.py b/venv/Lib/site-packages/twilio/auth_strategy/auth_strategy.py new file mode 100644 index 00000000..223cbff0 --- /dev/null +++ b/venv/Lib/site-packages/twilio/auth_strategy/auth_strategy.py @@ -0,0 +1,19 @@ +from twilio.auth_strategy.auth_type import AuthType +from abc import abstractmethod + + +class AuthStrategy(object): + def __init__(self, auth_type: AuthType): + self._auth_type = auth_type + + @property + def auth_type(self) -> AuthType: + return self._auth_type + + @abstractmethod + def get_auth_string(self) -> str: + """Return the authentication string.""" + + @abstractmethod + def requires_authentication(self) -> bool: + """Return True if authentication is required, else False.""" diff --git a/venv/Lib/site-packages/twilio/auth_strategy/auth_type.py b/venv/Lib/site-packages/twilio/auth_strategy/auth_type.py new file mode 100644 index 00000000..61886f92 --- /dev/null +++ b/venv/Lib/site-packages/twilio/auth_strategy/auth_type.py @@ -0,0 +1,12 @@ +from enum import Enum + + +class AuthType(Enum): + ORGS_TOKEN = "orgs_stoken" + NO_AUTH = "noauth" + BASIC = "basic" + API_KEY = "api_key" + CLIENT_CREDENTIALS = "client_credentials" + + def __str__(self): + return self.value diff --git a/venv/Lib/site-packages/twilio/auth_strategy/no_auth_strategy.py b/venv/Lib/site-packages/twilio/auth_strategy/no_auth_strategy.py new file mode 100644 index 00000000..a5bfd6d2 --- /dev/null +++ b/venv/Lib/site-packages/twilio/auth_strategy/no_auth_strategy.py @@ -0,0 +1,13 @@ +from auth_type import AuthType +from twilio.auth_strategy.auth_strategy import AuthStrategy + + +class NoAuthStrategy(AuthStrategy): + def __init__(self): + super().__init__(AuthType.NO_AUTH) + + def get_auth_string(self) -> str: + return "" + + def requires_authentication(self) -> bool: + return False diff --git a/venv/Lib/site-packages/twilio/auth_strategy/token_auth_strategy.py b/venv/Lib/site-packages/twilio/auth_strategy/token_auth_strategy.py new file mode 100644 index 00000000..33a8d385 --- /dev/null +++ b/venv/Lib/site-packages/twilio/auth_strategy/token_auth_strategy.py @@ -0,0 +1,55 @@ +import jwt +import threading +import logging +from datetime import datetime, timezone + +from twilio.auth_strategy.auth_type import AuthType +from twilio.auth_strategy.auth_strategy import AuthStrategy +from twilio.http.token_manager import TokenManager + + +class TokenAuthStrategy(AuthStrategy): + def __init__(self, token_manager: TokenManager): + super().__init__(AuthType.ORGS_TOKEN) + self.token_manager = token_manager + self.token = None + self.lock = threading.Lock() + logging.basicConfig(level=logging.INFO) + self.logger = logging.getLogger(__name__) + + def get_auth_string(self) -> str: + self.fetch_token() + return f"Bearer {self.token}" + + def requires_authentication(self) -> bool: + return True + + def fetch_token(self): + if self.token is None or self.token == "" or self.is_token_expired(self.token): + with self.lock: + if ( + self.token is None + or self.token == "" + or self.is_token_expired(self.token) + ): + self.logger.info("New token fetched for accessing organization API") + self.token = self.token_manager.fetch_access_token() + + def is_token_expired(self, token): + try: + decoded = jwt.decode(token, options={"verify_signature": False}) + exp = decoded.get("exp") + + if exp is None: + return True # No expiration time present, consider it expired + + # Check if the expiration time has passed by using time-zone + return datetime.fromtimestamp(exp, tz=timezone.utc) < datetime.now( + timezone.utc + ) + + except jwt.DecodeError: + return True # Token is invalid + except Exception as e: + print(f"An error occurred: {e}") + return True diff --git a/venv/Lib/site-packages/twilio/base/__init__.py b/venv/Lib/site-packages/twilio/base/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/twilio/base/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/base/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce0da1628509a1c9819333605333584087777c26 GIT binary patch literal 176 zcmX@j%ge<81U;7$GC=fW5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!@^`k12`x@7Dvt5? z^bCn{NiEJU$uEd0%g;JmtkIamWj77{q768X^E`0z1 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/base/__pycache__/client_base.cpython-312.pyc b/venv/Lib/site-packages/twilio/base/__pycache__/client_base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..029a129b0bb57d6f614dfe6ac522131c76fa71f0 GIT binary patch literal 10994 zcmeHNYj6`;c5X?n_gk|3z{a%S7TD%x4C4hBk7d9E7zUfk#DOS6-NrI{c)DAFHFE9j z?o>)-Nygqy1x+$lYqquu6E<0XPAd5^oB5Nf{6Q8IE4?#Wr}8AfwBt!OGe0sp=k`NF zXxROcs#K-Y;M@0}KKI_!x6e7>x##MyolYAC*PV^un!nXUQU8Dq^)f1z?e9Y6F2z!; zE>6wLcipTG+WNRYVVE@}=vg{poHZs)v!;Z3)~rJwL)?mYSw z+?jCAx=7s=cPBiv9#S{Qy$Ro}kJK%3f1+WwK}YGSQxt1`n__KT;Gsd5X|{1m7qmac z##GQK(VPC#^_^2$bTsA0;ZI2#TlcR72XZ5UZ)?lS-|FJt+14nbl7U;y%TFt1{ zOj^whH51{pK+Vhe+ojgK?gb$PY9Zk)VNdvjNTn^Ebl$-v7nu2l9 z9H@SaIht*Go1SeTD^%~T17y9Fb(k};JAgYt)-nJqL9?yUZiF`n4z>;IO-uUVF3Bcq z+RG7v%k+*hQKEOuT#9ER(I_Vfpv#On&oQzZGGiAeho(T21&&Wf5}agNj0nQb6wgX_ z;7_HKVpxc=l8NW8fj&$2dC=vsJg8*nk~d;}DwzOvm1vH=#z_GjC>*&4lrVQoSd~! zSlvSy4X-Q}RxF+Z8_DWl*h^p4iUf$_rb1L#nb%%e(J7dONpRwPiiLS1 zB9r7emdtvUOj`LWl5ghMCeKcu508zHpT9IU69!$8yejR|%<1sV`7;w!l3gK9gicLJ zPNi{i;?(5%si~k-(x(K;tgNYIxWA12EGvsGMqM&fcC5!Cc}JjaeVYL+L>_q%;eVt;njfT~V%sRtt=OTlZKLtTn*F}}p8Juz$eaMW z9qB!z8$Bo9znY_;SUO9Vj#AgiM%VH8yRprbEW5W_dpBASuXq1=@WCL`nz2uySh>VGRAXJQ9#5M(|j_jd2V3GFGo=Fj*ODjf`V^A z*RHHCYka7n=wv>eK6?sOsUDty$}WhDF+Rl=?htWOYY@oE(6$>tM+@+kviO zNu~cceL#0s+G;IpdZ@hJvMH%&^@#SY;d(zPv;pR#k0Fw|Rqo0?tKs)Dpw|LgRn3*v zPbxp3 z7x*zX5R0agbFph_`0@;TdL?4h+}c=J|RS{}tj6!A{W22;y~t`Gp?ndPbFQLGE_Nj5WB zK1SeR#o6cNs6Y^=g4qweIGIX;!Bj&&f=)})i1 zD0YgEWypt|l1!nAvlBBDk_qAuZc%(-;)9@l{BA7vV1dqpAHZS|ilAMx17d_#SAqZ` zdBjv0*CY(M2qDt7CCQCEDhbrB0uz!&eIz-^Kq)~a;eSIkwYU@p^}#0l(bobcmv9*SxzxQ@% z%ioj>ZP~pmuW#6QmOM>)%VST+mdm&4+EsAvS~C<~-8n<4xoxv~f1!E*qwZq!;heMN z_HVj(72LZv-F*djU&-MsIou_GOUc__YG^Ha16a20DSIhT|2Ady*vgdEYU6w1wVreK z-v;9LzkwS(L+Nl^L@fZJ_NwRL1-qziLMq#!Z|Pu!Ixf5hGIXq7bF&8GW)(+QJu`uj zI`jqnqBWNa5d=c&xO(+Dx^)dgTs4D0lRyYY4>cEo5R80kt{Mn20)$X?UHh|;p>1v| z!_`1W<$+dPKqIWVo`VdN3K`#~SmT=j<$s{RYxr%Wk(#CsQ+Mb;G2GMz&5>_ZL&=!1 zl#I^9E<2SLz!l@R;>F1Ft3%5Sy0*IL!z9vz$Ux)^+mlF@0RN9r3V!}yN2tv4s$FMA z8>&?SHe^D2aWTbaS;+s0L>FT zpW^vpWG9=QLs%QZqOvJEjLjohyo3c}1phTC>OzR*R3Jm1DAW8rn8;7kID!s5?7vd~ z38*qcc^Xvj-M``P|Jc`F@?6+9=>4uTrFXi@7V0_JDb)gm3PYv;Q5gDVuoGz64D=KN zJ)42SLSXO(u+umMu+wP!g@!!;7L8s9yBQ1{`0ZhSxe;h+)fQDrLu4=D=$ zJ$Nl@8*)H^N1_s-LyAc!YJBSEgFlqjy=X%bqTbQJV~84JR8)TjKKo@DVOhUy$Qr<( zW9VKFskAiP_w;vKX)0=1HZ1F>pOr*IB~6mftPW|u8lKrzrL*0l_4f_UD`P8fl>7}V$I3>^>suM#^bZvL1M9CA{d)_Zz1s%h zDpR!6^_h)wHRtK~*eA}et)nOY!=P_)m4=Ue5GsUbR_IMnu;2-Y~(S*1H04G#g)-Q)RlIyO*3-cf`5nwtfB6>=7);!$v`|A zHAKm%cNiLux$5y(R!Hp!a~M$))&w;(kx9o|FzywMkZ7=y2-wQnvici3-pJa4%SQMe z3dIQ&2k8g?C+NyN(UhlFN0nd!HlNXWn#FxTs@@>UVh%8sV-lz*qbXzPFQ zFxfFg}8JmWUr3#O{THRtCOv_oZa{ko(ca91^5CV<=^q$!TiOX z`7;xwM|1X%eLL>%UEN#sb>+-Zm$$t|UpKT`IyPJO68!_clfbibw&>_syLA8Zy~~e+#h#-D z$I&N_j^WTMIs6y)VoxY%hV5^`(g_&TGk^`I0QpmgZ)I-7(Y9t<@A-lI zQSz@&6-K5@y_2xVo+>!HN_Kz#aKYYLVh#Z1biuK6%iWlB$?grkqQ`-b z1s6Du>Rw83L66{E+45$!lRwA->g%0}EmY@Kl~F1iWeh@C;(nItuX1dxfu(m)4;44G z3|rS_6a1M)ZG)TDf)&oA(QK~EXC{0$jn51<3%WtFbyei7zRBl-Su;4z zx+^1}*OBv76Pypi872>)!CGNFeZB1ISG+9^8BbFdPMsl)vM6B`0MfE0YY{MvvOu6@ zC4rJfU6CKz)EWR31_k62wQYJOPpk4N;gx>b0wI+>^LIAYd_tH>On}A8r-yJ*wg{&{ z^Gec+xfX*H3i%i1Rv0x0ijl%x41OVkL!pa@=R{4M#8)t7RilKeDxa?9<1XX*A5gj)Gf zj)tM`wyw5rct_VvP^=IC@$p9!In!2P*Jhx<5a3cZM%$&L|FyD#Y7A~u`bJyM2Hx7^|NYVYLeU>Ax_3Xe?Ed^yBenB2h;Csu zKJ=K!k2*eVrlE`~UIWOo*CU<}7ZiRUrK@|YQ`fp5D&s%^qR-4}s-^sJh>1WJ8h&=f zLf!~8g69N?D2TpS>A9x9=VVa)$}Z~H&)APD=NNA;ABUj#B1lb6Cm{~*g1Ue*$tr^9 zfH?7U=YTTN3Yf_JATH%ZQJ;N*)XBEc_lA_1o0n z()%Eb(A8J!>@D>KOH6lZU|(tUc&WX!bm*nh(Gx!p3>mw&d^_?7R|m^Rr~};kTS?1| zEeqAyo{z3xDO<5+qr5G7|EjZW$Cd-1EffO5vJ;ywY$n&IA9bz2UT7aF1P+(oNcT|g zrWN6KqU^<%k7D}Q>GkOc*21m>Wj~S{sP^8+y+;Z=U)n}#%JVvE??IFk{_h?tf$&Vv z&;19Dwk?mpY=k?==<=4$ShJu+4f*KWNd9`EWp}}|r))*K4JQ@z<7MOgE>_P6H)m>#TwtNuIlu-_l z*yh^~V2!UU>tRJ!xGS<^t)8q%uO}&S}aIOo*2f?D*H7O|6?Tr4DWJW7=mY-;(GQyc?CaauEPFbQO{K<`vH|bi1M4%7x*iFS z`XBseq5CKyZdskV=*q#|{O$H_BQTXu>lovnHA9(#+qz*JZ{?8AWE{zNeFj60$f}A8 z8f@Zsp|VavA(>#Sf#*eN5wevKdm%PN48sA?5szIRB0$0uEJA>Qj^sB1a^P*38$*~$ zBvvOiRZ$38`6U_oMT68({S=%P`9&l#JE=!`RQVmpP^GH7fK6rSi-hn_1hjqd=wh(vkh< z&Ahj7-n{wVoB7e{v?FMr{`CIEpREY}MhBJFP-aR9BXk>yNW=*groAbFlcumK$%Q#g z$6Ugkw1h2;HzyjB*042c3)^692{(!jVY_IRc+n==BoyCKF~8AE{FG@Y45!Ru<45MO zvqpPEsmj%8+d;djtZfC`RhM1Tn{>y~s3OOP(QVpNqt%XTuO%IQ=zp<7O+fXUjr z&IP)Xfi5xIQsF{f$AevC!LG@$jupLuNa_qp#UR?%W(JOff9Ve(w^1WftD>!T8>hOP z+8k1;71owbMjwZ>-rQ;|+cwJ(iZh(l&)>z%WnbgYdI=pZm!~FC2U43Va<#d_O_@3o z0nE&ynCTpvL|4#N?i{*;{if`)=v4@F*Fd0n>O0c?8U@A?LQB{@1 zx;4A|d;10gy?ufH0l)F3;X#lM?qIz^&C02%w7*feQD0R#Dd{$F7_b1G2R1_Yaeibd zGVs zFFczV4n|HX5>X;=oj4JSj7Z8QHJyoEPRlWAXj)3Ck;_u*a^!9KLPU{ODUgZAE=8v$ zC8A!D6LR{%g{UGO5GAl6M-y^Z>dDON4p~VvSE(0-CM^Yk@-C2hRBW}$Gl+fcQt(0t|WIGT8)uatry}1^K)DN;7rs-dK z4+uc9*7aWMXiW zE)znCs4Il};>W}XU2U#e%jQW32o6&reJahPKkdljgc7}ATjyJD_T5UX@*R0|2N6K3 zV|nYX9tR;S&08b{D~we@Z@f;PTNrURQWuDn09%))C591tnH!N{)3srcgPRl$VFhgP zl@S+C=YZcRLlB%!@V_oNhPkN&A=83%K`dqBQ8pI0ns@~5#pgk zdO@?&NGPhwUP`E^cMv-!mIBXguP4*uOhP(B_JfEXjPgAYxOg%C1-Tv~|F6jR5Vb$r zF65DCZC6howG|thu>0n45kZ$5UF`lQ@O9vxC*OWh^A42gWU<|e-D_5Rk%Rt`#lCR3 zoH4OH@6#;pB@4_K1v?Jm99KlNU$ialDENaK{Djv^Y^u1+iaQss=C~WziU`=nZHrg# laf@@B?_i0Ji>-~=y`U5kbT?;mlZzd>vtNApgbvvT{{~)j&@TW0 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/base/__pycache__/domain.cpython-312.pyc b/venv/Lib/site-packages/twilio/base/__pycache__/domain.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7120c6ef610706bee694fe669955bf9645deefb7 GIT binary patch literal 3778 zcmeHKO>7&-6`tjCmp`KTBTBaAxboPFVKH{8qydsb2pYIDVjE6Ww^q}F5wKcuht^6< zE;G9;R}!5DiIF;hi^P|jIaTPXh7%yCqOA|xoK2A~AA-81b9LP+0Q59LA}nHq}z%pV%nLe*C;yb^YY` znyzU#bjw#3y{5%VlArtmbDDO;L0z4*YVv=h)yq{!|+W6VfFFM6a|l7Y_Bwb&#C$3J7_09z)qDMNmvU>kw4 z!?rBgG9pTjjl%rd+L)2QsZ?^iv!}>cJbwY^&u=D6MPEH{*LAb8buCSyEUuak<*dn> z0|)I;-KC4yP0O_Dxht2be2>lY%INMt}HpG z%f8vvtLyqT<}8JaoyE1zMtg5=`bkYQ8>XviTevd2wd<;?YXql$a&7Znt-?+s9ZT+-TLpM4iXT4Zf_Ow_T~C+4mr(C~gV zz9l`m|9%wlDjeU|Z$yd^2=jJhgK(p_%*|-K><{Ti3?M46#j<4(MY!G2+ba*av^xWR~bOw*#pmwcBT?A;Dh|*xO zTgvv0+3g#TrCGR1)SAufx+@UjE4Y*q94~ichyh0W}Vrd>*sXKvaf5L875~{*Qur;NWUP) z1w7V30a}m);W0@1jnw}R6`)wECAZ=&rKPqKt>nkj{bV>TKq97p1~?iV^lOkffJB2{ zTwJ^YX?@dUj*A%`O3P3_Lo|e^5F$a03l01H25=Eh(Awt_p5q+-zQ_0`6)on%QSNiZ zgYH8wT;qyuZ0>W5GBLEY$g65j6sS9_}LA7Pv!Xh@S`Z6 zLU9bmH&9H0D9QXV>IgDF5oPsWI^@g|>_HYhIR@TrmV*)S9texz7(W5Ft!zZCC^#<1 zxd;MSRVKOOqwMic_V|wcF#Gf^xtl9~u>Jn_quj|(?qoMJ*3IO)#mR1AqC5UnB#)g5 z3M4<>BdL5kAgNSZFm4}X-h~-@?}4~Xq_2!M@51G~4P5<2?5_NtqL8cPMRGg-iF{ou z$@-rTWRvb}Hma-KZrGmle`mdF?{&OHfCMNH`ap#Rk6XniC`3VF$Gz$bdl>YaCB|w#Y`muvg-#gzvCrQ7TUXDLd zKq;vUSY9a=@Y4owGfnf;npU?B&q6(;X>WSE74;-E&9JMQ#uE_9m*I`&IncseB#s)s zRlaJktiemh@%zMAYL>0LetgBYEskG1;$q-<3ipVhZ+KnctH)8GkMlF&%T4k{EUqMj zOiVe^-UtX(pB8&q1xZ!8DDB7r!TQ&7Pt?H?GW&e@?6dg)nR0jfbeEp`qIg0{|1Dn( z6sQB0WD7w8wInG_w#VDmofq2coyli9`7=QZ?P-!b{Gr>P-#OI2+&Mhc$(Di9O7fY75fWVXa@{TEiS+W)@0m_=?|b!Z)5sG#4osSsssm2duhovkX5X#4k6IZhs`| z0;?;4!_V|n&C96aN0Y$7*p1vY>HagKusWJ!|#N@hA_=5tc|oJ@VG{z#J2 Mw_g7j!CD0PFOw6l`~Uy| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/base/__pycache__/exceptions.cpython-312.pyc b/venv/Lib/site-packages/twilio/base/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9a77ed11e24be256793db5e5c5c5965ffbdb047 GIT binary patch literal 4138 zcmbssTWlN0agTR=in1P*WI1w_bu24pDv@@r*beOqQRyVOeI4`u=iz@tZ&4p z5Fa^DO!WpaHKs1B9{-3YseYgam{z6w^GZDUZ)6#YD{kmlGmd5Fj7-{FU;N}t;>Ja1(z`|LYuCYKJyRX3#TIU~z--Hqsa);4D|IF9Q2+p|W-o4HF$ zDD?5Kf1Vn>EEpG~uMZ9mkDg&-+OcOw=WHv@1}0d}8J%OfxzS%(W23@ySnrIHo;D_! z7d)Z}>+-W`z02eP-PaZ6uuc#p~UeXQ7KsI8`ed zC9vrLg#$8frD@-hBh=>fCFnA2j%8@|M0A|nS?WwO>PevkZwy8v6k2M=;6|2OIfn|z zaArkHvRxP+expnP+;Hf;At-0gEYC5Mj>9e}tSY}&lyEqmSvI##n~YEE59m>dB^@+q`x|(0yUZ&M}&{O@;!zGxmxZmbS*h zE(}-5+08-{prR$HC8RX82F=+HHRcQ}Be%wL8X2%73J{6fO|#6Iv`z1j(pVmWdZ)B$ z)|h7Uw4A*?3wKt#)?^Os0G1vwP0I_EvX14MAF}k28}Kg6Rl(A(3WjqvJiQz6)Nq4k zN$DW?RHgY~fMHy^0$_nIj7dV3iOh3o2m9FWZ6!SUCX@vfu|ytIh=gt0WVW zCvjyc9^efy%`qr=BZ4Lb%?M%u;z3svEHmygNY-t*1gb7Cg;EaLi(o>qa+ag(h5g$E zL!vU<2D~Bx;9XK|CM|p4(>@5Tx9x|nZavl}v6gn|!WH7)&iAz6MP+2W0nf?PRZD;z z++5o2Yp@8UO2q+!*G%7&@wf)bQd?AZnAc$5x5K<2=G7hM12C_dL8p2%TlNpZyx*zb zhJ(3Fwy98M^rSb#%VjzI?>lo&p#`?IeBMF{SJkzIb;O~@q$@IBbmH&kfsxOVJlw&Pmg%h^MshmQ9yS&t>YXkCpRUx^-d0}}YN2(V!IaSHYQutM5cW|kG=yV3_)lmCZ0$9JKQ!;H)>)j`&u zZc;}+51UMc*;e{f7Ys1tPF3R@2<5gwDzW1ES@)#l%!pJnIX^$2aAaYZNZZ+@X{SZf zd%}~~k1Rrc8i0pAYdCR5?p*7F!3pN*@TL}ec4gW!_e-FWKz-2_Pd$jex*B`+uYGH= z3oFqJ8ZHi4Og{t>uQv8 z!&Q~shAj%Y!Lm9oDYSxaHfQiWkK3pySP;6x3%>+n?N(40<>?r!DX}IQXDRpq2v^t3 z+My7W2ZZbLDx(y=esmG4U={L!t3uXtgOdiD6flt&SPz+CRQ>{70zZU6RvVjZ3s;+h zgeI$wc#yXu*M0=gAvl2GAcAfL_yRp$fdqA3CZa;e4(@^L#UMB=)E@yQeBvWfB+%U! zCF~^Wc1)7)#A-;YM^bkp4Jx+}BHN&H=OFS8DvzQh8vE$jQtHFht#`hyJACib{gJyP z4|@Aod;7obeWj==O(*_!;%8sZZFC;^q-U)&xj_%DbicetQyZPne`emFUY`D{@0*if zpIkY3X07w=Mpu00#W&Zw-rCqt@5DYC{?nCDul(`Zwf)Ir9XZ)wB7u|5ML(%;EVhuw zmfz>!&#$+&FHL+n@vyyPy}j>2`>ECTQybksS?RgF*8S!N?fUes&xY?`y?b@-(1|sA z5|-{eT_WnfXNvwnYg%Oe}YWSNgf4Q<2JGT-& zCu1nCaV+YFT=o3f;h}hhV{yZ=NaR@DxNtWR>AKF3BIyVMOe1c<9-CrmhhtgDk0Ze6 zM~akXCC4{J0?gE68o&+my)Wz!6+1~w+j{5o>unwDU5CGK*yDfhVPmZ5hrSpfdzy+t z9EETc#!-Yc?7b;|n=RHM79~wB#d;j=ARxR+P(l$!+T%a3+=@LS*n4`Q3Q#p4 zgU$^&`5A~%Px)~5ThIF-mAY=$|8eNF_i^0MPs4gllmf$`s49x`9f|ytbUX?uO8BPr Uh(Px!bU{&I|Kxv&97qNJ3!K8$2mk;8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/base/__pycache__/instance_context.cpython-312.pyc b/venv/Lib/site-packages/twilio/base/__pycache__/instance_context.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ee6e9a8a4a14985c6b9efdcd713032c0007d734 GIT binary patch literal 613 zcmZ8ezfaph6n=NM6QHC;z>uw(T6t*LtEy53QWb$RK`U974#&QvR~$R|4!1!J3=9k) zAu(iSMf@qCL0UOw6UhWPcq9Uk zMub~^ih8zZk1f|OUUU+vf+XadX`=XdRn+rJZLXk&G}pb$RfGwgkP~3Y%p2nnU7TZq zRi!R1Y{}z(R>K6TYg?`9=gqhNoB!Gh5%LcMo+v-(N$&56o-c*s zZ$?3Q5Dd8V)i)7~bfXtYz9Fh%S!kwhkH*-Ri9{&Ij+_7O(w;~3dF3L)Dg11{Jhv|! zB|6Y`9bKISL(W*S#Mm&6j$+N189O`*ViU>q=GilZTga9**FQ4TqBF3O$ma-W@IZ;v zx~V?`8k4HCx_IX`vqoF5(XQ?^6E13L?<)_L(Oc1?|9VUp-kFi!XKNTB_{nvI2a6E$ R3tm6gC}~~wp8(CQ>MtEll~@1( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/base/__pycache__/instance_resource.cpython-312.pyc b/venv/Lib/site-packages/twilio/base/__pycache__/instance_resource.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6f94e32cd29eb9088e7a1771fd75f2dfb34c1e1 GIT binary patch literal 616 zcmZ8ezfaph6n=Mh5}>3)r2|Z4YUQC}uPUUfl~B|wLsby6EL|P@L9aM=dgr(bV(7rY z01`u`tX-@ADQry05)%^}Qea`?UC!yyll;B!>Am;8A3kq37l7W$#h0(Y$X**~_G%TG zydW}$7-E({pZSadhfRq25yTGizmCoGossL+Zj9rxvayXy%Pfs-&?2v#$qJD%Aowf> zpT`WHT~2zg?~WYLEtfi}&cigqPpGq@im+@HmE26iC>d^=Po5Es;gB7IAZFi)rs&cj zbD}Esc0Z5C-)mzoNf^{n>|qulB(8PR_|9_HTIkv7ya1sHw$Il-;N T7`uX(cXiHMXT?2`nN~dlXQ!5x literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/base/__pycache__/list_resource.cpython-312.pyc b/venv/Lib/site-packages/twilio/base/__pycache__/list_resource.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ef5467e099fc155dcf362c3539894e56ed51662 GIT binary patch literal 604 zcmYjOziZn-6n=M-f5f#*X%g^OPc0hiY#mA|lm?24@lc!$LU5I(OL~ngxp%UQgNF_t zGNj`veF5cN+fY$f(B{sEbB<-z`-RU zxHKf(I;E&*yY|>}?5x@rD*eb+GL!+&N~2tATdq|!*NvA?5#}%<6JW^98RG;U9HPwf zQio=?;?b!rVuI4OjmEnB{7%Q6rS0&9ou!{#BrMzNHe8B#45N@fk35-L{dsC+7zipl`Ko!_3k*{WW8%< z)(LTADWFJ=B}99v8gb&lp;b6>f)nD#&w-RgD%~PciC(xFoCEa4n_X|*#^unF{pNSy zy!qyP-|kPny>SHPlV2{C8exR~5S^ev-z%**pt^x{q+=81{2J%5gx*2Aw1jk-N~^NJ zG$-q!C6o*45k0(wbK!ZM>G@MkO=|uE-{N+s)ensuh@u?UQBKlvPM()CvO93Dz-^N{ z^z9EdT5$~9s=Yj}a!NE)<(w34M&?vz8P*ghYQe5L#BM)8id1!~jPmScCgesH#Zt>u zQQWwqlx@9gigrR#KB%f@d!|QGbX!xDTc{kORd@b8KaQrhC^SfsM?G=MS0$tGfcxiQh+#*1mR>W^DG2jJtOes!Ym;- zbc_k$y>Tso0|t-)Qv6%vV6Ff-&erU-1Vh_O1Fg2_mr)VxcqzKtUQx#j_&mx;wa+e; z3{K#u5}j%`Qyl?c$ zxN17Yun0JzjDgbvg&QHXY&Z@$oGVd_IHlmy4BwGqaYwZrLxm;T$4DWN8G(Q644CWq z(Ua?VT41uRG^A;P?Y0u&5!4^!j5Jv@F4sv(%`DtEu#DJ6 zFJjXuFqO?`$$KUhv}3eLnLtRZGA7Ug##GDDPz5(VK2B8)U9~it&B)%Rx)ES$S#_8= z7En5*vMKIHW`MU)hl*887R#x7+xR0*b2+ZcoWI7xJR^Gk{c7w9osg!8=hlo zg=Zu-06thscoW>ZMEp>a+X7&_U@|6Fy#NOG+>E10@{012a_z!;_?eaz3ddVAiagsC zt!4rx(u?Q3ZJ$hSp(ldc0cGpBL-G!xSyVy`xYIumJ&({|d5nBIR_nCFs3u59%G4>@ zI?sAuI&7}k%x5z>(OwHzd(l^!ZOjHDa7PEucR1eVUnHE!D}S3V90mb`)=4ne@zW*w zvQz|}>`wE?1$HZ!eiU0sAl`U-OGjX+T^jO}G$qKKy0joU!jo4TAtw^FSKCU&26X9( zenWu|3+r;N7ooc32m*O!+I!^$J->#X62VB|9U}=fns?mbcjwi!jk7EJH%4CBNF2R8IJA;p8yx+7*X_a4wZy3ZQWE3@8S}(p zAGCdi5NdTPP^&%v8++~5uBpy(x~75??*-@lAees_(QmQT)se=?N_suEcTihEX*r#JTw;e(!w{{S)2W%B?4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/base/__pycache__/page.cpython-312.pyc b/venv/Lib/site-packages/twilio/base/__pycache__/page.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f427e27ae31911d35b47657d6957be9857d0f947 GIT binary patch literal 7679 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/base/__pycache__/values.cpython-312.pyc b/venv/Lib/site-packages/twilio/base/__pycache__/values.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35ea22b74ba3de147efecd1a2f458b09d4871f1e GIT binary patch literal 713 zcmY*W&1(}u6n``OVMuJTBB%(uf(Q{!5R5_)AsU3@2WTtBxPqJANxDfkyUt7!qY3oj zA!48vg(@D*NhyQq8N&5#>u$3p1{SwG!^s-C(Xk{jE(GzP| ddr!9FM}~m$KpiY>oE+TSGS2>vVm^nBe*yIOvn2ok literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/base/__pycache__/version.cpython-312.pyc b/venv/Lib/site-packages/twilio/base/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0df2b06c41013f70e1262358db8e1f3065f924d GIT binary patch literal 14920 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/base/client_base.py b/venv/Lib/site-packages/twilio/base/client_base.py new file mode 100644 index 00000000..b16f85bf --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/client_base.py @@ -0,0 +1,271 @@ +import os +import platform +from typing import Dict, List, MutableMapping, Optional, Tuple +from urllib.parse import urlparse, urlunparse + +from twilio import __version__ +from twilio.http import HttpClient +from twilio.http.http_client import TwilioHttpClient +from twilio.http.response import Response +from twilio.credential.credential_provider import CredentialProvider + + +class ClientBase(object): + """A client for accessing the Twilio API.""" + + def __init__( + self, + username: Optional[str] = None, + password: Optional[str] = None, + account_sid: Optional[str] = None, + region: Optional[str] = None, + http_client: Optional[HttpClient] = None, + environment: Optional[MutableMapping[str, str]] = None, + edge: Optional[str] = None, + user_agent_extensions: Optional[List[str]] = None, + credential_provider: Optional[CredentialProvider] = None, + ): + """ + Initializes the Twilio Client + + :param username: Username to authenticate with + :param password: Password to authenticate with + :param account_sid: Account SID, defaults to Username + :param region: Twilio Region to make requests to, defaults to 'us1' if an edge is provided + :param http_client: HttpClient, defaults to TwilioHttpClient + :param environment: Environment to look for auth details, defaults to os.environ + :param edge: Twilio Edge to make requests to, defaults to None + :param user_agent_extensions: Additions to the user agent string + :param credential_provider: credential provider for authentication method that needs to be used + """ + + environment = environment or os.environ + + self.username = username or environment.get("TWILIO_ACCOUNT_SID") + """ :type : str """ + self.password = password or environment.get("TWILIO_AUTH_TOKEN") + """ :type : str """ + self.edge = edge or environment.get("TWILIO_EDGE") + """ :type : str """ + self.region = region or environment.get("TWILIO_REGION") + """ :type : str """ + self.user_agent_extensions = user_agent_extensions or [] + """ :type : list[str] """ + self.credential_provider = credential_provider or None + """ :type : CredentialProvider """ + + self.account_sid = account_sid or self.username + """ :type : str """ + self.auth = (self.username, self.password) + """ :type : tuple(str, str) """ + self.http_client: HttpClient = http_client or TwilioHttpClient() + """ :type : HttpClient """ + + def request( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Response: + """ + Makes a request to the Twilio API using the configured http client + Authentication information is automatically added if none is provided + + :param method: HTTP Method + :param uri: Fully qualified url + :param params: Query string parameters + :param data: POST body data + :param headers: HTTP Headers + :param auth: Authentication + :param timeout: Timeout in seconds + :param allow_redirects: Should the client follow redirects + + :returns: Response from the Twilio API + """ + headers = self.get_headers(method, headers) + + if self.credential_provider: + + auth_strategy = self.credential_provider.to_auth_strategy() + headers["Authorization"] = auth_strategy.get_auth_string() + elif self.username is not None and self.password is not None: + auth = self.get_auth(auth) + else: + auth = None + + if method == "DELETE": + del headers["Accept"] + + uri = self.get_hostname(uri) + filtered_data = self.copy_non_none_values(data) + return self.http_client.request( + method, + uri, + params=params, + data=filtered_data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + async def request_async( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Response: + """ + Asynchronously makes a request to the Twilio API using the configured http client + The configured http client must be an asynchronous http client + Authentication information is automatically added if none is provided + + :param method: HTTP Method + :param uri: Fully qualified url + :param params: Query string parameters + :param data: POST body data + :param headers: HTTP Headers + :param auth: Authentication + :param timeout: Timeout in seconds + :param allow_redirects: Should the client follow redirects + + :returns: Response from the Twilio API + """ + if not self.http_client.is_async: + raise RuntimeError( + "http_client must be asynchronous to support async API requests" + ) + + headers = self.get_headers(method, headers) + if method == "DELETE": + del headers["Accept"] + + if self.credential_provider: + auth_strategy = self.credential_provider.to_auth_strategy() + headers["Authorization"] = auth_strategy.get_auth_string() + elif self.username is not None and self.password is not None: + auth = self.get_auth(auth) + else: + auth = None + + uri = self.get_hostname(uri) + filtered_data = self.copy_non_none_values(data) + return await self.http_client.request( + method, + uri, + params=params, + data=filtered_data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + def copy_non_none_values(self, data): + if isinstance(data, dict): + return { + k: self.copy_non_none_values(v) + for k, v in data.items() + if v is not None + } + elif isinstance(data, list): + return [ + self.copy_non_none_values(item) for item in data if item is not None + ] + return data + + def get_auth(self, auth: Optional[Tuple[str, str]]) -> Tuple[str, str]: + """ + Get the request authentication object + :param auth: Authentication (username, password) + :returns: The authentication object + """ + return auth or self.auth + + def get_headers( + self, method: str, headers: Optional[Dict[str, str]] + ) -> Dict[str, str]: + """ + Get the request headers including user-agent, extensions, encoding, content-type, MIME type + :param method: HTTP method + :param headers: HTTP headers + :returns: HTTP headers + """ + headers = headers or {} + + # Set User-Agent + pkg_version = __version__ + os_name = platform.system() + os_arch = platform.machine() + python_version = platform.python_version() + headers["User-Agent"] = "twilio-python/{} ({} {}) Python/{}".format( + pkg_version, + os_name, + os_arch, + python_version, + ) + # Extensions + for extension in self.user_agent_extensions: + headers["User-Agent"] += " {}".format(extension) + headers["X-Twilio-Client"] = "python-{}".format(__version__) + + # Types, encodings, etc. + headers["Accept-Charset"] = "utf-8" + if (method == "POST" or method == "PUT") and ("Content-Type" not in headers): + headers["Content-Type"] = "application/x-www-form-urlencoded" + if "Accept" not in headers: + headers["Accept"] = "application/json" + + return headers + + def get_hostname(self, uri: str) -> str: + """ + Determines the proper hostname given edge and region preferences + via client configuration or uri. + + :param uri: Fully qualified url + + :returns: The final uri used to make the request + """ + if not self.edge and not self.region: + return uri + + parsed_url = urlparse(uri) + pieces = parsed_url.netloc.split(".") + prefix = pieces[0] + suffix = ".".join(pieces[-2:]) + region = None + edge = None + if len(pieces) == 4: + # product.region.twilio.com + region = pieces[1] + elif len(pieces) == 5: + # product.edge.region.twilio.com + edge = pieces[1] + region = pieces[2] + + edge = self.edge or edge + region = self.region or region or (edge and "us1") + + parsed_url = parsed_url._replace( + netloc=".".join([part for part in [prefix, edge, region, suffix] if part]) + ) + return str(urlunparse(parsed_url)) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "".format(self.account_sid) diff --git a/venv/Lib/site-packages/twilio/base/deserialize.py b/venv/Lib/site-packages/twilio/base/deserialize.py new file mode 100644 index 00000000..71226c08 --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/deserialize.py @@ -0,0 +1,75 @@ +import datetime +from decimal import BasicContext, Decimal +from email.utils import parsedate +from typing import Optional, Union + +ISO8601_DATE_FORMAT = "%Y-%m-%d" +ISO8601_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ" + + +def iso8601_date(s: str) -> Union[datetime.date, str]: + """ + Parses an ISO 8601 date string and returns a UTC date object or the string + if the parsing failed. + :param s: ISO 8601-formatted date string (2015-01-25) + :return: + """ + try: + return ( + datetime.datetime.strptime(s, ISO8601_DATE_FORMAT) + .replace(tzinfo=datetime.timezone.utc) + .date() + ) + except (TypeError, ValueError): + return s + + +def iso8601_datetime( + s: str, +) -> Union[datetime.datetime, str]: + """ + Parses an ISO 8601 datetime string and returns a UTC datetime object, + or the string if parsing failed. + :param s: ISO 8601-formatted datetime string (2015-01-25T12:34:56Z) + """ + try: + return datetime.datetime.strptime(s, ISO8601_DATETIME_FORMAT).replace( + tzinfo=datetime.timezone.utc + ) + except (TypeError, ValueError): + return s + + +def rfc2822_datetime(s: str) -> Optional[datetime.datetime]: + """ + Parses an RFC 2822 date string and returns a UTC datetime object, + or the string if parsing failed. + :param s: RFC 2822-formatted string date + :return: datetime or str + """ + date_tuple = parsedate(s) + if date_tuple is None: + return None + return datetime.datetime(*date_tuple[:6]).replace(tzinfo=datetime.timezone.utc) + + +def decimal(d: Optional[str]) -> Union[Decimal, str]: + """ + Parses a decimal string into a Decimal + :param d: decimal string + """ + if not d: + return d + return Decimal(d, BasicContext) + + +def integer(i: str) -> Union[int, str]: + """ + Parses an integer string into an int + :param i: integer string + :return: int + """ + try: + return int(i) + except (TypeError, ValueError): + return i diff --git a/venv/Lib/site-packages/twilio/base/domain.py b/venv/Lib/site-packages/twilio/base/domain.py new file mode 100644 index 00000000..4f8395dd --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/domain.py @@ -0,0 +1,93 @@ +from typing import Dict, Optional, Tuple +from twilio.http.response import Response +from twilio.rest import Client + + +class Domain(object): + """ + This represents at Twilio API subdomain. + + Like, `api.twilio.com` or `lookups.twilio.com'. + """ + + def __init__(self, twilio: Client, base_url: str): + self.twilio = twilio + self.base_url = base_url + + def absolute_url(self, uri: str) -> str: + """ + Converts a relative `uri` to an absolute url. + :param string uri: The relative uri to make absolute. + :return: An absolute url (based off this domain) + """ + return "{}/{}".format(self.base_url.strip("/"), uri.strip("/")) + + def request( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Response: + """ + Makes an HTTP request to this domain. + :param method: The HTTP method. + :param uri: The HTTP uri. + :param params: Query parameters. + :param data: The request body. + :param headers: The HTTP headers. + :param auth: Basic auth tuple of (username, password) + :param timeout: The request timeout. + :param allow_redirects: True if the client should follow HTTP + redirects. + """ + url = self.absolute_url(uri) + return self.twilio.request( + method, + url, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + async def request_async( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Response: + """ + Makes an asynchronous HTTP request to this domain. + :param method: The HTTP method. + :param uri: The HTTP uri. + :param params: Query parameters. + :param data: The request body. + :param headers: The HTTP headers. + :param auth: Basic auth tuple of (username, password) + :param timeout: The request timeout. + :param allow_redirects: True if the client should follow HTTP + redirects. + """ + url = self.absolute_url(uri) + return await self.twilio.request_async( + method, + url, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) diff --git a/venv/Lib/site-packages/twilio/base/exceptions.py b/venv/Lib/site-packages/twilio/base/exceptions.py new file mode 100644 index 00000000..8f3b7cc7 --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/exceptions.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +import sys +from typing import Optional + + +class TwilioException(Exception): + pass + + +class TwilioRestException(TwilioException): + """A generic 400 or 500 level exception from the Twilio API + + :param int status: the HTTP status that was returned for the exception + :param str uri: The URI that caused the exception + :param str msg: A human-readable message for the error + :param int|None code: A Twilio-specific error code for the error. This is + not available for all errors. + :param method: The HTTP method used to make the request + :param details: Additional error details returned for the exception + """ + + def __init__( + self, + status: int, + uri: str, + msg: str = "", + code: Optional[int] = None, + method: str = "GET", + details: Optional[object] = None, + ): + self.uri = uri + self.status = status + self.msg = msg + self.code = code + self.method = method + self.details = details + + def __str__(self) -> str: + """Try to pretty-print the exception, if this is going on screen.""" + + def red(words: str) -> str: + return "\033[31m\033[49m%s\033[0m" % words + + def white(words: str) -> str: + return "\033[37m\033[49m%s\033[0m" % words + + def blue(words: str) -> str: + return "\033[34m\033[49m%s\033[0m" % words + + def teal(words: str) -> str: + return "\033[36m\033[49m%s\033[0m" % words + + def get_uri(code: int) -> str: + return "https://www.twilio.com/docs/errors/{0}".format(code) + + # If it makes sense to print a human readable error message, try to + # do it. The one problem is that someone might catch this error and + # try to display the message from it to an end user. + if hasattr(sys.stderr, "isatty") and sys.stderr.isatty(): + msg = ( + "\n{red_error} {request_was}\n\n{http_line}" + "\n\n{twilio_returned}\n\n{message}\n".format( + red_error=red("HTTP Error"), + request_was=white("Your request was:"), + http_line=teal("%s %s" % (self.method, self.uri)), + twilio_returned=white("Twilio returned the following information:"), + message=blue(str(self.msg)), + ) + ) + if self.code: + msg = "".join( + [ + msg, + "\n{more_info}\n\n{uri}\n\n".format( + more_info=white("More information may be available here:"), + uri=blue(get_uri(self.code)), + ), + ] + ) + return msg + else: + return "HTTP {0} error: {1}".format(self.status, self.msg) diff --git a/venv/Lib/site-packages/twilio/base/instance_context.py b/venv/Lib/site-packages/twilio/base/instance_context.py new file mode 100644 index 00000000..44ff9a38 --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/instance_context.py @@ -0,0 +1,6 @@ +from twilio.base.version import Version + + +class InstanceContext(object): + def __init__(self, version: Version): + self._version = version diff --git a/venv/Lib/site-packages/twilio/base/instance_resource.py b/venv/Lib/site-packages/twilio/base/instance_resource.py new file mode 100644 index 00000000..a05aac37 --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/instance_resource.py @@ -0,0 +1,6 @@ +from twilio.base.version import Version + + +class InstanceResource(object): + def __init__(self, version: Version): + self._version = version diff --git a/venv/Lib/site-packages/twilio/base/list_resource.py b/venv/Lib/site-packages/twilio/base/list_resource.py new file mode 100644 index 00000000..e3eb176d --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/list_resource.py @@ -0,0 +1,6 @@ +from twilio.base.version import Version + + +class ListResource(object): + def __init__(self, version: Version): + self._version = version diff --git a/venv/Lib/site-packages/twilio/base/obsolete.py b/venv/Lib/site-packages/twilio/base/obsolete.py new file mode 100644 index 00000000..e0f4a033 --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/obsolete.py @@ -0,0 +1,47 @@ +import warnings +import functools + + +class ObsoleteException(Exception): + """Base class for warnings about obsolete features.""" + + +def obsolete_client(func): + """This is a decorator which can be used to mark Client classes as + obsolete. It will result in an error being emitted when the class is + instantiated.""" + + @functools.wraps(func) + def new_func(*args, **kwargs): + raise ObsoleteException( + "{} has been removed from this version of the library. " + "Please refer to current documentation for guidance.".format(func.__name__) + ) + + return new_func + + +def deprecated_method(new_func=None): + """ + This is a decorator which can be used to mark deprecated methods. + It will report in a DeprecationWarning being emitted to stderr when the deprecated method is used. + """ + + def deprecated_method_wrapper(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + msg = "Function method .{}() is deprecated".format(func.__name__) + msg += ( + " in favor of .{}()".format(new_func) + if isinstance(new_func, str) + else "" + ) + warnings.warn(msg, DeprecationWarning) + return func(*args, **kwargs) + + return wrapper + + if callable(new_func): + return deprecated_method_wrapper(new_func) + + return deprecated_method_wrapper diff --git a/venv/Lib/site-packages/twilio/base/page.py b/venv/Lib/site-packages/twilio/base/page.py new file mode 100644 index 00000000..b5b2da7b --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/page.py @@ -0,0 +1,173 @@ +import json +from typing import Any, Dict, Optional + +from twilio.base.exceptions import TwilioException +from twilio.http.response import Response + + +class Page(object): + """ + Represents a page of records in a collection. + + A `Page` lets you iterate over its records and fetch the next and previous + pages in the collection. + """ + + META_KEYS = { + "end", + "first_page_uri", + "next_page_uri", + "last_page_uri", + "page", + "page_size", + "previous_page_uri", + "total", + "num_pages", + "start", + "uri", + } + + def __init__(self, version, response: Response, solution={}): + payload = self.process_response(response) + + self._version = version + self._payload = payload + self._solution = solution + self._records = iter(self.load_page(payload)) + + def __iter__(self): + """ + A `Page` is a valid iterator. + """ + return self + + def __next__(self): + return self.next() + + def next(self): + """ + Returns the next record in the `Page`. + """ + return self.get_instance(next(self._records)) + + @classmethod + def process_response(cls, response: Response) -> Any: + """ + Load a JSON response. + + :param response: The HTTP response. + :return The JSON-loaded content. + """ + if response.status_code != 200: + raise TwilioException("Unable to fetch page", response) + + return json.loads(response.text) + + def load_page(self, payload: Dict[str, Any]): + """ + Parses the collection of records out of a list payload. + + :param payload: The JSON-loaded content. + :return list: The list of records. + """ + if "meta" in payload and "key" in payload["meta"]: + return payload[payload["meta"]["key"]] + else: + keys = set(payload.keys()) + key = keys - self.META_KEYS + if len(key) == 1: + return payload[key.pop()] + if "Resources" in payload: + return payload["Resources"] + + raise TwilioException("Page Records can not be deserialized") + + @property + def previous_page_url(self) -> Optional[str]: + """ + :return str: Returns a link to the previous_page_url or None if doesn't exist. + """ + if "meta" in self._payload and "previous_page_url" in self._payload["meta"]: + return self._payload["meta"]["previous_page_url"] + elif ( + "previous_page_uri" in self._payload and self._payload["previous_page_uri"] + ): + return self._version.domain.absolute_url(self._payload["previous_page_uri"]) + + return None + + @property + def next_page_url(self) -> Optional[str]: + """ + :return str: Returns a link to the next_page_url or None if doesn't exist. + """ + if "meta" in self._payload and "next_page_url" in self._payload["meta"]: + return self._payload["meta"]["next_page_url"] + elif "next_page_uri" in self._payload and self._payload["next_page_uri"]: + return self._version.domain.absolute_url(self._payload["next_page_uri"]) + + return None + + def get_instance(self, payload: Dict[str, Any]) -> Any: + """ + :param dict payload: A JSON-loaded representation of an instance record. + :return: A rich, resource-dependent object. + """ + raise TwilioException( + "Page.get_instance() must be implemented in the derived class" + ) + + def next_page(self) -> Optional["Page"]: + """ + Return the `Page` after this one. + :return The next page. + """ + if not self.next_page_url: + return None + + response = self._version.domain.twilio.request("GET", self.next_page_url) + cls = type(self) + return cls(self._version, response, self._solution) + + async def next_page_async(self) -> Optional["Page"]: + """ + Asynchronously return the `Page` after this one. + :return The next page. + """ + if not self.next_page_url: + return None + + response = await self._version.domain.twilio.request_async( + "GET", self.next_page_url + ) + cls = type(self) + return cls(self._version, response, self._solution) + + def previous_page(self) -> Optional["Page"]: + """ + Return the `Page` before this one. + :return The previous page. + """ + if not self.previous_page_url: + return None + + response = self._version.domain.twilio.request("GET", self.previous_page_url) + cls = type(self) + return cls(self._version, response, self._solution) + + async def previous_page_async(self) -> Optional["Page"]: + """ + Asynchronously return the `Page` before this one. + :return The previous page. + """ + if not self.previous_page_url: + return None + + response = await self._version.domain.twilio.request_async( + "GET", self.previous_page_url + ) + cls = type(self) + return cls(self._version, response, self._solution) + + def __repr__(self) -> str: + return "" diff --git a/venv/Lib/site-packages/twilio/base/serialize.py b/venv/Lib/site-packages/twilio/base/serialize.py new file mode 100644 index 00000000..cea91b04 --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/serialize.py @@ -0,0 +1,93 @@ +import datetime +import json + +from twilio.base import values + + +def iso8601_date(d): + """ + Return a string representation of a date that the Twilio API understands + Format is YYYY-MM-DD. Returns None if d is not a string, datetime, or date + """ + if d == values.unset: + return d + elif isinstance(d, datetime.datetime): + return str(d.date()) + elif isinstance(d, datetime.date): + return str(d) + elif isinstance(d, str): + return d + + +def iso8601_datetime(d): + """ + Return a string representation of a date that the Twilio API understands + Format is YYYY-MM-DD. Returns None if d is not a string, datetime, or date + """ + if d == values.unset: + return d + elif isinstance(d, datetime.datetime) or isinstance(d, datetime.date): + return d.strftime("%Y-%m-%dT%H:%M:%SZ") + elif isinstance(d, str): + return d + + +def prefixed_collapsible_map(m, prefix): + """ + Return a dict of params corresponding to those in m with the added prefix + """ + if m == values.unset: + return {} + + def flatten_dict(d, result=None, prv_keys=None): + if result is None: + result = {} + + if prv_keys is None: + prv_keys = [] + + for k, v in d.items(): + if isinstance(v, dict): + flatten_dict(v, result, prv_keys + [k]) + else: + result[".".join(prv_keys + [k])] = v + + return result + + if isinstance(m, dict): + flattened = flatten_dict(m) + return {"{}.{}".format(prefix, k): v for k, v in flattened.items()} + + return {} + + +def boolean_to_string(bool_or_str): + if bool_or_str == values.unset: + return bool_or_str + + if bool_or_str is None: + return bool_or_str + + if isinstance(bool_or_str, str): + return bool_or_str.lower() + + return "true" if bool_or_str else "false" + + +def object(obj): + """ + Return a jsonified string represenation of obj if obj is jsonifiable else + return obj untouched + """ + if isinstance(obj, dict) or isinstance(obj, list): + return json.dumps(obj) + return obj + + +def map(lst, serialize_func): + """ + Applies serialize_func to every element in lst + """ + if not isinstance(lst, list): + return lst + return [serialize_func(e) for e in lst] diff --git a/venv/Lib/site-packages/twilio/base/values.py b/venv/Lib/site-packages/twilio/base/values.py new file mode 100644 index 00000000..16032b11 --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/values.py @@ -0,0 +1,13 @@ +from typing import Dict + +unset = object() + + +def of(d: Dict[str, object]) -> Dict[str, object]: + """ + Remove unset values from a dict. + + :param d: A dict to strip. + :return A dict with unset values removed. + """ + return {k: v for k, v in d.items() if v != unset} diff --git a/venv/Lib/site-packages/twilio/base/version.py b/venv/Lib/site-packages/twilio/base/version.py new file mode 100644 index 00000000..ed7e86f4 --- /dev/null +++ b/venv/Lib/site-packages/twilio/base/version.py @@ -0,0 +1,489 @@ +import json +from typing import Any, AsyncIterator, Dict, Iterator, Optional, Tuple + +from twilio.base import values +from twilio.base.domain import Domain +from twilio.base.exceptions import TwilioRestException +from twilio.base.page import Page +from twilio.http.response import Response + + +class Version(object): + """ + Represents an API version. + """ + + def __init__(self, domain: Domain, version: str): + self.domain = domain + self.version = version + + def absolute_url(self, uri: str) -> str: + """ + Turns a relative uri into an absolute url. + """ + return self.domain.absolute_url(self.relative_uri(uri)) + + def relative_uri(self, uri: str) -> str: + """ + Turns a relative uri into a versioned relative uri. + """ + return "{}/{}".format(self.version.strip("/"), uri.strip("/")) + + def request( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Response: + """ + Make an HTTP request. + """ + url = self.relative_uri(uri) + return self.domain.request( + method, + url, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + async def request_async( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Response: + """ + Make an asynchronous HTTP request + """ + url = self.relative_uri(uri) + return await self.domain.request_async( + method, + url, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + @classmethod + def exception( + cls, method: str, uri: str, response: Response, message: str + ) -> TwilioRestException: + """ + Wraps an exceptional response in a `TwilioRestException`. + """ + # noinspection PyBroadException + try: + error_payload = json.loads(response.text) + if "message" in error_payload: + message = "{}: {}".format(message, error_payload["message"]) + details = error_payload.get("details") + code = error_payload.get("code", response.status_code) + return TwilioRestException( + response.status_code, uri, message, code, method, details + ) + except Exception: + return TwilioRestException( + response.status_code, uri, message, response.status_code, method + ) + + def _parse_fetch(self, method: str, uri: str, response: Response) -> Any: + """ + Parses fetch response JSON + """ + # Note that 3XX response codes are allowed for fetches. + if response.status_code < 200 or response.status_code >= 400: + raise self.exception(method, uri, response, "Unable to fetch record") + + return json.loads(response.text) + + def fetch( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Any: + """ + Fetch a resource instance. + """ + response = self.request( + method, + uri, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + return self._parse_fetch(method, uri, response) + + async def fetch_async( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Any: + """ + Asynchronously fetch a resource instance. + """ + response = await self.request_async( + method, + uri, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + return self._parse_fetch(method, uri, response) + + def _parse_update(self, method: str, uri: str, response: Response) -> Any: + """ + Parses update response JSON + """ + if response.status_code < 200 or response.status_code >= 300: + raise self.exception(method, uri, response, "Unable to update record") + + return json.loads(response.text) + + def update( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Any: + """ + Update a resource instance. + """ + response = self.request( + method, + uri, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + return self._parse_update(method, uri, response) + + async def update_async( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Any: + """ + Asynchronously update a resource instance. + """ + response = await self.request_async( + method, + uri, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + return self._parse_update(method, uri, response) + + def _parse_delete(self, method: str, uri: str, response: Response) -> bool: + """ + Parses delete response JSON + """ + if response.status_code < 200 or response.status_code >= 300: + raise self.exception(method, uri, response, "Unable to delete record") + + return response.status_code == 204 + + def delete( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> bool: + """ + Delete a resource. + """ + response = self.request( + method, + uri, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + return self._parse_delete(method, uri, response) + + async def delete_async( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> bool: + """ + Asynchronously delete a resource. + """ + response = await self.request_async( + method, + uri, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + return self._parse_delete(method, uri, response) + + def read_limits( + self, limit: Optional[int] = None, page_size: Optional[int] = None + ) -> Dict[str, object]: + """ + Takes a limit on the max number of records to read and a max page_size + and calculates the max number of pages to read. + + :param limit: Max number of records to read. + :param page_size: Max page size. + :return A dictionary of paging limits. + """ + if limit is not None and page_size is None: + page_size = limit + + return { + "limit": limit or values.unset, + "page_size": page_size or values.unset, + } + + def page( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Response: + """ + Makes an HTTP request. + """ + return self.request( + method, + uri, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + async def page_async( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Response: + """ + Makes an asynchronous HTTP request. + """ + return await self.request_async( + method, + uri, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + + def stream( + self, + page: Optional[Page], + limit: Optional[int] = None, + page_limit: Optional[int] = None, + ) -> Iterator[Any]: + """ + Generates records one a time from a page, stopping at prescribed limits. + + :param page: The page to stream. + :param limit: The max number of records to read. + :param page_limit: The max number of pages to read. + """ + current_record = 1 + current_page = 1 + + while page is not None: + for record in page: + yield record + current_record += 1 + if limit and limit is not values.unset and limit < current_record: + return + + current_page += 1 + if ( + page_limit + and page_limit is not values.unset + and page_limit < current_page + ): + return + + page = page.next_page() + + async def stream_async( + self, + page: Optional[Page], + limit: Optional[int] = None, + page_limit: Optional[int] = None, + ) -> AsyncIterator[Any]: + """ + Generates records one a time from a page, stopping at prescribed limits. + + :param page: The page to stream. + :param limit: The max number of records to read. + :param page_limit: The max number of pages to read. + """ + current_record = 1 + current_page = 1 + + while page is not None: + for record in page: + yield record + current_record += 1 + if limit and limit is not values.unset and limit < current_record: + return + + current_page += 1 + if ( + page_limit + and page_limit is not values.unset + and page_limit < current_page + ): + return + + page = await page.next_page_async() + + def _parse_create(self, method: str, uri: str, response: Response) -> Any: + """ + Parse create response JSON + """ + if response.status_code < 200 or response.status_code >= 300: + raise self.exception(method, uri, response, "Unable to create record") + + return json.loads(response.text) + + def create( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Any: + """ + Create a resource instance. + """ + response = self.request( + method, + uri, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + return self._parse_create(method, uri, response) + + async def create_async( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Any: + """ + Asynchronously create a resource instance. + """ + response = await self.request_async( + method, + uri, + params=params, + data=data, + headers=headers, + auth=auth, + timeout=timeout, + allow_redirects=allow_redirects, + ) + return self._parse_create(method, uri, response) diff --git a/venv/Lib/site-packages/twilio/credential/__init__.py b/venv/Lib/site-packages/twilio/credential/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/venv/Lib/site-packages/twilio/credential/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/credential/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58130f5397d2dc31db75e88b510410e4aee1ac1e GIT binary patch literal 182 zcmX@j%ge<81U;7$GC=fW5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!3U#)M2`x@7Dvt5? z^bCn{NiEJU$uEd0%g;95r~UHjE~HWjEqIhKo$TT CJuw3S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/credential/__pycache__/client_credential_provider.cpython-312.pyc b/venv/Lib/site-packages/twilio/credential/__pycache__/client_credential_provider.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31a956b1153ae55606ef117d2fee3788c09fd932 GIT binary patch literal 1901 zcmZux&2Jk;6rc6(+G{(m)6|qCkYF1Xu}HX0lU@)4A}2)=sf9@3ureC9yOU&_^#`+? zP**+}6bV-<2M#C~4naafRWJEJxY#r((JDceIB^RKMO9C{nf)+nGSa?z@6DUH@8kF8 z*GwjbU_JQli?tmIp+A`rE;(RMJ_BYOnaC7uR1-8oV0_Gu)kIC?yl6``S(7<0+3{LJ zOK@Jcm0D6u3Mhs?L}q*onF%645`Di~s->vOznGv3-bmTDNZnm-tdsgJy{@kk3fk=Q zSC(xx=IAV_OG~#urj1R@Ge*P}sf$(wQ{2jEk|}K=P41$*f)-ywYTO(3BQ2i^!%G@G z2W**MCSV<6P~sX;+Gw%#*?00YkROC?7b$s-JY;GV^-f%mqv9vJ?`@Zn{2=rMMJCabb1ImBKW*wYbqDT%RR>yCr5 z!-|oI)p@>Jey94WL#R{zXklTwI!By!x6!O_HY|h8t^&NOo20&3U9@gj9m^$eH+5qj z{^?X*4#=y6VQR5JGyeP#5=(fzTR z{@Bc(a^p!l*Gs>;lj-Ge9F7!v#aoX@D!rk~lkrkldXPOBE5df+VB)Q=w5N;@_CiRfY~4PRgpK{C`Kb}s_dDQyI$fi|3afL5f0 z`~3BZ6rAadyO~gPeqo&7$$llx`zr^(&i z{#3a?RX!18#S7iJy`jnDI2s!MpZ)dSnf>Yc{`CCg!cA^)kiE2@E%dX6o>HJM!yo7v z5H-O@tFG4w#$F2JTEpD189#*amm9hroQN`f;F&)} zeqIa`&y{!m!oEk}0Ff2SDF8VZ1wlAM?;oM-M`-Q{O&_6~|HN}bvG>~4Qv^GA@gF@E B*IfVr literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/credential/__pycache__/credential_provider.cpython-312.pyc b/venv/Lib/site-packages/twilio/credential/__pycache__/credential_provider.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be723effff038f1cfe1931aa1808ccb701f8de70 GIT binary patch literal 1078 zcmZuwL2DC16n?YWY`3*dwe_H_v{5UVgY7{NA|jM3l2(GydI<~LZFbtM-DKm;B$7~Q zksK5hkMZa=^rv_!dXYsz@Z_y@4?<7Ax0|F@JCL{EdvD&G@0&OIG&VK@xZZwVFRwFz zpXBtH-UHDbf)2RgG9N0e$QWqw7+kFlZfajkb``azo=g8CC&xl_v98K%%^EKy*~F%L zPIL!B2RIa&3q{RkJhiD|JH4p$w3~`Oy{+%}wigXI-G<^&)5r~l6H9`-ysA9Me=358 z=W-DaJ9wI{=(rx6xRNj(8BL(+zz*91J5G>kLYEb~EF7^1#W^k1CHFUlfq6;Q+3fN9 z(mm^$_mL2R5ErofDgNPk6(p0DN;rydHCxxu5cBUQk|RmN9(>DOJ-C+tl36}5 zmt$3hoJq5)Iu&l)_-^b<;MRS@qqhB`?)XVYkXSK>CNy!(H7-;$zD;ovV_k@QC3j3S z6=Zb$$ptiRIMi5r?&Hk}@N;N@k)goshr34@n2l2XKxDA=3QKxXhe9qD&LmH6KAuot vcH+^0BOw-_c^NBCcpRJe6DbeGG$v>$lDHnG7-Qez_HSdDt*|2?8&~}Sh(QN< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/credential/__pycache__/orgs_credential_provider.cpython-312.pyc b/venv/Lib/site-packages/twilio/credential/__pycache__/orgs_credential_provider.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1bbd2e7e7a78585dcfae780af1468e9d304cdcfc GIT binary patch literal 1888 zcmZ`(&2Jk;6rc5a?X?}(X=*|eNU)6xED}!Iq?ZaIA}2)=sX-)gSQ!o5-AS^|`h(d` zs3RW?ii9hb0|&^3Ly(YA)l2>lE_NG~XcePMoVW#rqN*p}jCa?#gpu~mdvD&nc^|*G zza*1!1nb_z&o;gfBlJ5H{3UtJ*(bp4Ap;qLh01~|2#gO|p|YrooENQdSyCm=hpk9C zszy04S#mk1#sm~X?;#_yi;O6d9*8}^YP>Ehu|Jrg2yW^Fy1rW7B$b<5MO!D7saC%* zEwj3KM<+GMtX4oZQlP{j701-94{3GVG`OKWzvXPK)@uYTE^;SKvEoq8A?tO$_gs$# zIn99lHDpDQDi}x&8ImCo(FhT7E!;wDf+6lE)vyuXMXJ<7cLX)Ef|Q6m3Srv+4Z@A- zmI-lT({Pg>YZILkM~A8gi)GHfv!8%`C+s07IJz5dpl={LC$PUA2@V71fzV?G)DXT5 zHA2mV6Y~!Z!9V>Smkb0_;IWPrvAClYcxoBb$Y>QK z<4L{jG8!eBGN?7DO6%^3mpUZwb;(xZu4Hf32z6zQ&5G$@Oj#(<%H^fS;wmnDw73BK z(){uYWx2cYb*e!n9q1=z;G_wrO*#x57~W#&aFZHz7~5Wp70C_T#9Hgy(-C$lhOusG zwvDmPijjfUd`1e_OCQ^W+NJlGmR3s(#NKqOwbFLg)XDrhG_kZzD%+)H^H#|=9r9L9 z(>LKwyX0^u5X%n5u$-B{xJodxb z(fC|veC|-b_BfGlCtlu9wlmjGMzZbP%||1}_E7QhM7|ZimpUHL!FJ(z^37KGP@d@T z*;e>hdEyM*BHaTF;}NR?hu?3&>_MwW$K|onH^dchxn&>4avKdeWnug70 zWy;V|pzg3!#RKTtdHsL7_`Kl@%+sepn&>!@I!a7-5|i!3<&*5p@o;)C^=)cD{qxk1 zQwQmzD}~OL!kHM#U1%*F4o#g#(9rO|?5`fo9nCIwW)~l2Z*YU-)TN_Twv)=X zUZCSZlqegjidH5VyK#)mRb$Iy{1C>UZ)uiyBEpz(IMNBY@Ujp)U7yTKEOS%15PZ4Yf`V+SOJrbe(5M&IfR5vV z=Y1dbvSM&}CcoV)>pS!{5Lub*ERa)C5QHwe-bGitXrYT{yXeMWk+hI&PfkBUuyYsx E0DP0uF8}}l literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/credential/client_credential_provider.py b/venv/Lib/site-packages/twilio/credential/client_credential_provider.py new file mode 100644 index 00000000..656d4463 --- /dev/null +++ b/venv/Lib/site-packages/twilio/credential/client_credential_provider.py @@ -0,0 +1,28 @@ +from twilio.http.client_token_manager import ClientTokenManager +from twilio.base.exceptions import TwilioException +from twilio.credential.credential_provider import CredentialProvider +from twilio.auth_strategy.auth_type import AuthType +from twilio.auth_strategy.token_auth_strategy import TokenAuthStrategy + + +class ClientCredentialProvider(CredentialProvider): + def __init__(self, client_id: str, client_secret: str, token_manager=None): + super().__init__(AuthType.CLIENT_CREDENTIALS) + + if client_id is None or client_secret is None: + raise TwilioException("Client id and Client secret are mandatory") + + self.grant_type = "client_credentials" + self.client_id = client_id + self.client_secret = client_secret + self.token_manager = token_manager + self.auth_strategy = None + + def to_auth_strategy(self): + if self.token_manager is None: + self.token_manager = ClientTokenManager( + self.grant_type, self.client_id, self.client_secret + ) + if self.auth_strategy is None: + self.auth_strategy = TokenAuthStrategy(self.token_manager) + return self.auth_strategy diff --git a/venv/Lib/site-packages/twilio/credential/credential_provider.py b/venv/Lib/site-packages/twilio/credential/credential_provider.py new file mode 100644 index 00000000..72aafeed --- /dev/null +++ b/venv/Lib/site-packages/twilio/credential/credential_provider.py @@ -0,0 +1,13 @@ +from twilio.auth_strategy.auth_type import AuthType + + +class CredentialProvider: + def __init__(self, auth_type: AuthType): + self._auth_type = auth_type + + @property + def auth_type(self) -> AuthType: + return self._auth_type + + def to_auth_strategy(self): + raise NotImplementedError("Subclasses must implement this method") diff --git a/venv/Lib/site-packages/twilio/credential/orgs_credential_provider.py b/venv/Lib/site-packages/twilio/credential/orgs_credential_provider.py new file mode 100644 index 00000000..e623f523 --- /dev/null +++ b/venv/Lib/site-packages/twilio/credential/orgs_credential_provider.py @@ -0,0 +1,28 @@ +from twilio.http.orgs_token_manager import OrgTokenManager +from twilio.base.exceptions import TwilioException +from twilio.credential.credential_provider import CredentialProvider +from twilio.auth_strategy.auth_type import AuthType +from twilio.auth_strategy.token_auth_strategy import TokenAuthStrategy + + +class OrgsCredentialProvider(CredentialProvider): + def __init__(self, client_id: str, client_secret: str, token_manager=None): + super().__init__(AuthType.CLIENT_CREDENTIALS) + + if client_id is None or client_secret is None: + raise TwilioException("Client id and Client secret are mandatory") + + self.grant_type = "client_credentials" + self.client_id = client_id + self.client_secret = client_secret + self.token_manager = token_manager + self.auth_strategy = None + + def to_auth_strategy(self): + if self.token_manager is None: + self.token_manager = OrgTokenManager( + self.grant_type, self.client_id, self.client_secret + ) + if self.auth_strategy is None: + self.auth_strategy = TokenAuthStrategy(self.token_manager) + return self.auth_strategy diff --git a/venv/Lib/site-packages/twilio/http/__init__.py b/venv/Lib/site-packages/twilio/http/__init__.py new file mode 100644 index 00000000..3e248270 --- /dev/null +++ b/venv/Lib/site-packages/twilio/http/__init__.py @@ -0,0 +1,104 @@ +from logging import Logger +from typing import Any, Dict, Optional, Tuple +from urllib.parse import urlencode + +from requests import Response + +from twilio.base.exceptions import TwilioException +from twilio.http.request import Request as TwilioRequest +from twilio.http.response import Response as TwilioResponse + + +class HttpClient(object): + def __init__(self, logger: Logger, is_async: bool, timeout: Optional[float] = None): + """ + Constructor for the abstract HTTP client + + :param logger + :param is_async: Whether the client supports async request calls. + :param timeout: Timeout for the requests. + Timeout should never be zero (0) or less. + """ + self.logger = logger + self.is_async = is_async + + if timeout is not None and timeout <= 0: + raise ValueError(timeout) + self.timeout = timeout + + self._test_only_last_request: Optional[TwilioRequest] = None + self._test_only_last_response: Optional[TwilioResponse] = None + + """ + An abstract class representing an HTTP client. + """ + + def request( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> TwilioResponse: + """ + Make an HTTP request. + """ + raise TwilioException("HttpClient is an abstract class") + + def log_request(self, kwargs: Dict[str, Any]) -> None: + """ + Logs the HTTP request + """ + self.logger.info("-- BEGIN Twilio API Request --") + + if kwargs["params"]: + self.logger.info( + "{} Request: {}?{}".format( + kwargs["method"], kwargs["url"], urlencode(kwargs["params"]) + ) + ) + self.logger.info("Query Params: {}".format(kwargs["params"])) + else: + self.logger.info("{} Request: {}".format(kwargs["method"], kwargs["url"])) + + if kwargs["headers"]: + self.logger.info("Headers:") + for key, value in kwargs["headers"].items(): + # Do not log authorization headers + if "authorization" not in key.lower(): + self.logger.info("{} : {}".format(key, value)) + + self.logger.info("-- END Twilio API Request --") + + def log_response(self, status_code: int, response: Response) -> None: + """ + Logs the HTTP response + """ + self.logger.info("Response Status Code: {}".format(status_code)) + self.logger.info("Response Headers: {}".format(response.headers)) + + +class AsyncHttpClient(HttpClient): + """ + An abstract class representing an asynchronous HTTP client. + """ + + async def request( + self, + method: str, + uri: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> TwilioResponse: + """ + Make an asynchronous HTTP request. + """ + raise TwilioException("AsyncHttpClient is an abstract class") diff --git a/venv/Lib/site-packages/twilio/http/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/http/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c01cec1a59cd62478ddce61a9af4c8a764d4aed1 GIT binary patch literal 5098 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/http/__pycache__/http_client.cpython-312.pyc b/venv/Lib/site-packages/twilio/http/__pycache__/http_client.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffcfa0eeb94ec320406affb81d63e2032550527b GIT binary patch literal 5349 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/http/__pycache__/response.cpython-312.pyc b/venv/Lib/site-packages/twilio/http/__pycache__/response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebfe3098622117ddfe30fe3761437936f7ab5d7a GIT binary patch literal 1303 zcmZ8g&2QX96o2Ed^=^_bU1(UE0?|gQY9!i2I3a}81_2e-7LoL_vSeJ(ByqB9oAD&D zVUcp!Ly(Fnr}Wrslnb2rBe*nxl*kt`@ z%XLcw_?wIgnWZv*2bF!`z*!f1tiyU*M`NJDC&0BKa9!w!dXd{P`i5ivLx!Ve`t_)v z*|!rF#*yC*ij;!er7^yR%039_Fb*B93cSiSp<_>j8^RRU8yH`;xH&XC6=8Er7^@nu z42{FGL8n^!?4i-A^_f%4>@P%`#8E2R*;J~0wUv57%tdA>@r}wV>%!+krh!p*Ac3m` ztuW@u_F% zRf0HDB2u!7HJKIo!MfnGLWUM^I!0!sqPvDle2_uV@wZsdM;^X7{C zkw`aHoVeR@7>Mg@*w@__(YAXlyz8c+67ME{u<5Uf)Ky=H-7vnku2gbOmXKXd@WwnZ zj6&skJLe}zUY)q;O{9y+c40IP%}aa6z3G$J-^#`89Ez!vxyyUTpLX-4F?-x-9W`1H zmya4(_KY7YV=Tk{q)=Nj3QhqHcf?ZV^wt3M9DA3U<>Bza$&PDtj{+o<3>XB#h`4Shs-rqfF=Jf)Ya z&(L9+xr{$Sd#Cp4%F5^S-+qUmqi5D?EPK8xZj)A#7m&TM2*EE!BG15Ixbob$v0xWY z>T}2S)=|Cn@V(=O#iNDApI3f$e{uh)-*{x-$d{C_VWKld4I{rNJTI$xUN7cbUDBsL z@2f4pTSoLSQkkAADQO=`aL8AXWp*OtL`c;yo?a7u2T-)nVW;;liBVm82iXutHE3Oa zQmvWJ;|tA^iE?B?y)mkgW<%rRgN2{o98-MM1nb;LW9Fs%!M}iFtWO*xiex6cQ-_!@{>pc==l+!*&h^3e<)iRpu0_Hk&Sf5*k3UJ Q)M~ILwzvHskj(4;2aL)T*#H0l literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/http/__pycache__/token_manager.cpython-312.pyc b/venv/Lib/site-packages/twilio/http/__pycache__/token_manager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b217865a4c3cef7cb2ac1d84f732f7026aee93c1 GIT binary patch literal 587 zcmZWmF-yZh82v6uZKc*Mi~=@7|a1-TU5Mo{Pmi;JSag?v8PP7sYC6OETX@G6e@5;z6Gn zgn$C4;3yMt)F(x%3}vM0nGaFuB*|W}kh_6z%cjJo66V`jPl16!9557zFtx3qn`USu zRo9Y2Gw3n@!t$*S3zKZTv|1fsS*l3pBI6WBIJ5Bxx{_#|dF^lwzjC23mlw_Bee;r| zhj~`7H_a2qdr>ejG2xB86IBu{BSaE6}X z1xjy*mM1%*xNEpBASa+8K>WB+*rgyIf^Q&9V5X5w@uBhsxJju{HFP!El6R`MEY7OS nca`3$&tLCF?m(tF3^(yS5d%sHGnEkX29@tMl@vb#AszAq$ykmc literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/http/__pycache__/validation_client.cpython-312.pyc b/venv/Lib/site-packages/twilio/http/__pycache__/validation_client.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37f23efaef670c80b1eb04a6ec9726dde1cc38f9 GIT binary patch literal 5745 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 aD| Response: + """ + Make an asynchronous HTTP Request with parameters provided. + + :param method: The HTTP method to use + :param url: The URL to request + :param params: Query parameters to append to the URL + :param data: Parameters to go in the body of the HTTP request + :param headers: HTTP Headers to send with the request + :param auth: Basic Auth arguments (username, password entries) + :param timeout: Socket/Read timeout for the request. Overrides the timeout if set on the client. + :param allow_redirects: Whether or not to allow redirects + See the requests documentation for explanation of all these parameters + + :return: An http response + """ + if timeout is not None and timeout <= 0: + raise ValueError(timeout) + + basic_auth = None + if auth is not None: + basic_auth = BasicAuth(login=auth[0], password=auth[1]) + + kwargs = { + "method": method.upper(), + "url": url, + "params": params, + "data": data, + "headers": headers, + "auth": basic_auth, + "timeout": timeout, + "allow_redirects": allow_redirects, + } + + self.log_request(kwargs) + self._test_only_last_response = None + + temp = False + session = None + if self.session: + session = self.session + else: + session = ClientSession() + temp = True + self._test_only_last_request = TwilioRequest(**kwargs) + response = await session.request(**kwargs) + self.log_response(response.status, response) + self._test_only_last_response = Response( + response.status, await response.text(), response.headers + ) + if temp: + await session.close() + return self._test_only_last_response + + async def close(self): + """ + Closes the HTTP client session + """ + if self.session: + await self.session.close() + + async def __aenter__(self): + """ + Async context manager setup + """ + return self + + async def __aexit__(self, *excinfo): + """ + Async context manager exit + """ + if self.session: + await self.session.close() diff --git a/venv/Lib/site-packages/twilio/http/client_token_manager.py b/venv/Lib/site-packages/twilio/http/client_token_manager.py new file mode 100644 index 00000000..0d42428a --- /dev/null +++ b/venv/Lib/site-packages/twilio/http/client_token_manager.py @@ -0,0 +1,41 @@ +from twilio.http.token_manager import TokenManager +from twilio.rest import Client + + +class ClientTokenManager(TokenManager): + """ + Client Token Manager + """ + + def __init__( + self, + grant_type: str, + client_id: str, + client_secret: str, + code: str = None, + redirect_uri: str = None, + audience: str = None, + refreshToken: str = None, + scope: str = None, + ): + self.grant_type = grant_type + self.client_id = client_id + self.client_secret = client_secret + self.code = code + self.redirect_uri = redirect_uri + self.audience = audience + self.refreshToken = refreshToken + self.scope = scope + self.client = Client() + + def fetch_access_token(self): + token_instance = self.client.iam.v1.token.create( + grant_type=self.grant_type, + client_id=self.client_id, + client_secret=self.client_secret, + code=self.code, + redirect_uri=self.redirect_uri, + audience=self.audience, + scope=self.scope, + ) + return token_instance.access_token diff --git a/venv/Lib/site-packages/twilio/http/http_client.py b/venv/Lib/site-packages/twilio/http/http_client.py new file mode 100644 index 00000000..2f2d3635 --- /dev/null +++ b/venv/Lib/site-packages/twilio/http/http_client.py @@ -0,0 +1,119 @@ +import os +import logging +from typing import Dict, Optional, Tuple + +from requests import Request, Session, hooks +from requests.adapters import HTTPAdapter + +from twilio.http import HttpClient +from twilio.http.request import Request as TwilioRequest +from twilio.http.response import Response + +_logger = logging.getLogger("twilio.http_client") + + +class TwilioHttpClient(HttpClient): + """ + General purpose HTTP Client for interacting with the Twilio API + """ + + def __init__( + self, + pool_connections: bool = True, + request_hooks: Optional[Dict[str, object]] = None, + timeout: Optional[float] = None, + logger: logging.Logger = _logger, + proxy: Optional[Dict[str, str]] = None, + max_retries: Optional[int] = None, + ): + """ + Constructor for the TwilioHttpClient + :param pool_connections + :param request_hooks + :param timeout: Timeout for the requests. + Timeout should never be zero (0) or less + :param logger + :param proxy: Http proxy for the requests session + :param max_retries: Maximum number of retries each request should attempt + """ + super().__init__(logger, False, timeout) + self.session = Session() if pool_connections else None + if self.session and max_retries is not None: + self.session.mount("https://", HTTPAdapter(max_retries=max_retries)) + elif self.session is not None: + self.session.mount( + "https://", HTTPAdapter(pool_maxsize=min(32, os.cpu_count() + 4)) + ) + self.request_hooks = request_hooks or hooks.default_hooks() + self.proxy = proxy if proxy else {} + + def request( + self, + method: str, + url: str, + params: Optional[Dict[str, object]] = None, + data: Optional[Dict[str, object]] = None, + headers: Optional[Dict[str, str]] = None, + auth: Optional[Tuple[str, str]] = None, + timeout: Optional[float] = None, + allow_redirects: bool = False, + ) -> Response: + """ + Make an HTTP Request with parameters provided. + + :param method: The HTTP method to use + :param url: The URL to request + :param params: Query parameters to append to the URL + :param data: Parameters to go in the body of the HTTP request + :param headers: HTTP Headers to send with the request + :param auth: Basic Auth arguments + :param timeout: Socket/Read timeout for the request + :param allow_redirects: Whether to allow redirects + See the requests documentation for explanation of all these parameters + + :return: An HTTP response + """ + if timeout is None: + timeout = self.timeout + elif timeout <= 0: + raise ValueError(timeout) + + kwargs = { + "method": method.upper(), + "url": url, + "params": params, + "headers": headers, + "auth": auth, + "hooks": self.request_hooks, + } + if headers and headers.get("Content-Type") == "application/json": + kwargs["json"] = data + elif headers and headers.get("Content-Type") == "application/scim+json": + kwargs["json"] = data + else: + kwargs["data"] = data + self.log_request(kwargs) + self._test_only_last_response = None + session = self.session or Session() + request = Request(**kwargs) + self._test_only_last_request = TwilioRequest(**kwargs) + + prepped_request = session.prepare_request(request) + + settings = session.merge_environment_settings( + prepped_request.url, self.proxy, None, None, None + ) + response = session.send( + prepped_request, + allow_redirects=allow_redirects, + timeout=timeout, + **settings, + ) + + self.log_response(response.status_code, response) + + self._test_only_last_response = Response( + int(response.status_code), response.text, response.headers + ) + + return self._test_only_last_response diff --git a/venv/Lib/site-packages/twilio/http/orgs_token_manager.py b/venv/Lib/site-packages/twilio/http/orgs_token_manager.py new file mode 100644 index 00000000..76fad521 --- /dev/null +++ b/venv/Lib/site-packages/twilio/http/orgs_token_manager.py @@ -0,0 +1,41 @@ +from twilio.http.token_manager import TokenManager +from twilio.rest import Client + + +class OrgTokenManager(TokenManager): + """ + Orgs Token Manager + """ + + def __init__( + self, + grant_type: str, + client_id: str, + client_secret: str, + code: str = None, + redirect_uri: str = None, + audience: str = None, + refreshToken: str = None, + scope: str = None, + ): + self.grant_type = grant_type + self.client_id = client_id + self.client_secret = client_secret + self.code = code + self.redirect_uri = redirect_uri + self.audience = audience + self.refreshToken = refreshToken + self.scope = scope + self.client = Client() + + def fetch_access_token(self): + token_instance = self.client.iam.v1.token.create( + grant_type=self.grant_type, + client_id=self.client_id, + client_secret=self.client_secret, + code=self.code, + redirect_uri=self.redirect_uri, + audience=self.audience, + scope=self.scope, + ) + return token_instance.access_token diff --git a/venv/Lib/site-packages/twilio/http/request.py b/venv/Lib/site-packages/twilio/http/request.py new file mode 100644 index 00000000..e75cf12b --- /dev/null +++ b/venv/Lib/site-packages/twilio/http/request.py @@ -0,0 +1,91 @@ +from enum import Enum +from typing import Any, Dict, Tuple, Union +from urllib.parse import urlencode + + +class Match(Enum): + ANY = "*" + + +class Request(object): + """ + An HTTP request. + """ + + def __init__( + self, + method: Union[str, Match] = Match.ANY, + url: Union[str, Match] = Match.ANY, + auth: Union[Tuple[str, str], Match] = Match.ANY, + params: Union[Dict[str, str], Match] = Match.ANY, + data: Union[Dict[str, str], Match] = Match.ANY, + headers: Union[Dict[str, str], Match] = Match.ANY, + **kwargs: Any + ): + self.method = method + if method and method is not Match.ANY: + self.method = method.upper() + self.url = url + self.auth = auth + self.params = params + self.data = data + self.headers = headers + + @classmethod + def attribute_equal(cls, lhs, rhs) -> bool: + if lhs == Match.ANY or rhs == Match.ANY: + # ANY matches everything + return True + + lhs = lhs or None + rhs = rhs or None + + return lhs == rhs + + def __eq__(self, other) -> bool: + if not isinstance(other, Request): + return False + + return ( + self.attribute_equal(self.method, other.method) + and self.attribute_equal(self.url, other.url) + and self.attribute_equal(self.auth, other.auth) + and self.attribute_equal(self.params, other.params) + and self.attribute_equal(self.data, other.data) + and self.attribute_equal(self.headers, other.headers) + ) + + def __str__(self) -> str: + auth = "" + if self.auth and self.auth != Match.ANY: + auth = "{} ".format(self.auth) + + params = "" + if self.params and self.params != Match.ANY: + params = "?{}".format(urlencode(self.params, doseq=True)) + + data = "" + if self.data and self.data != Match.ANY: + if self.method == "GET": + data = "\n -G" + data += "\n{}".format( + "\n".join(' -d "{}={}"'.format(k, v) for k, v in self.data.items()) + ) + + headers = "" + if self.headers and self.headers != Match.ANY: + headers = "\n{}".format( + "\n".join(' -H "{}: {}"'.format(k, v) for k, v in self.headers.items()) + ) + + return "{auth}{method} {url}{params}{data}{headers}".format( + auth=auth, + method=self.method, + url=self.url, + params=params, + data=data, + headers=headers, + ) + + def __repr__(self) -> str: + return str(self) diff --git a/venv/Lib/site-packages/twilio/http/response.py b/venv/Lib/site-packages/twilio/http/response.py new file mode 100644 index 00000000..af5a3b17 --- /dev/null +++ b/venv/Lib/site-packages/twilio/http/response.py @@ -0,0 +1,22 @@ +from typing import Any, Optional + + +class Response(object): + def __init__( + self, + status_code: int, + text: str, + headers: Optional[Any] = None, + ): + self.content = text + self.headers = headers + self.cached = False + self.status_code = status_code + self.ok = self.status_code < 400 + + @property + def text(self) -> str: + return self.content + + def __repr__(self) -> str: + return "HTTP {} {}".format(self.status_code, self.content) diff --git a/venv/Lib/site-packages/twilio/http/token_manager.py b/venv/Lib/site-packages/twilio/http/token_manager.py new file mode 100644 index 00000000..28cc7310 --- /dev/null +++ b/venv/Lib/site-packages/twilio/http/token_manager.py @@ -0,0 +1,7 @@ +from twilio.base.version import Version + + +class TokenManager: + + def fetch_access_token(self, version: Version): + pass diff --git a/venv/Lib/site-packages/twilio/http/validation_client.py b/venv/Lib/site-packages/twilio/http/validation_client.py new file mode 100644 index 00000000..1a4a83f0 --- /dev/null +++ b/venv/Lib/site-packages/twilio/http/validation_client.py @@ -0,0 +1,138 @@ +from collections import namedtuple + +from requests import Request, Session + +from twilio.base.exceptions import TwilioRestException +from urllib.parse import urlparse +from twilio.http import HttpClient +from twilio.http.response import Response +from twilio.jwt.validation import ClientValidationJwt + + +ValidationPayload = namedtuple( + "ValidationPayload", + ["method", "path", "query_string", "all_headers", "signed_headers", "body"], +) + + +class ValidationClient(HttpClient): + __SIGNED_HEADERS = ["authorization", "host"] + + def __init__( + self, + account_sid, + api_key_sid, + credential_sid, + private_key, + pool_connections=True, + ): + """ + Build a ValidationClient which signs requests with private_key and allows Twilio to + validate request has not been tampered with. + + :param str account_sid: A Twilio Account Sid starting with 'AC' + :param str api_key_sid: A Twilio API Key Sid starting with 'SK' + :param str credential_sid: A Credential Sid starting with 'CR', + corresponds to public key Twilio will use to verify the JWT. + :param str private_key: The private key used to sign the Client Validation JWT. + """ + self.account_sid = account_sid + self.credential_sid = credential_sid + self.api_key_sid = api_key_sid + self.private_key = private_key + self.session = Session() if pool_connections else None + + def request( + self, + method, + url, + params=None, + data=None, + headers=None, + auth=None, + timeout=None, + allow_redirects=False, + ): + """ + Make a signed HTTP Request + + :param str method: The HTTP method to use + :param str url: The URL to request + :param dict params: Query parameters to append to the URL + :param dict data: Parameters to go in the body of the HTTP request + :param dict headers: HTTP Headers to send with the request + :param tuple auth: Basic Auth arguments + :param float timeout: Socket/Read timeout for the request + :param boolean allow_redirects: Whether or not to allow redirects + See the requests documentation for explanation of all these parameters + + :return: An http response + :rtype: A :class:`Response ` object + """ + session = self.session or Session() + request = Request( + method.upper(), url, params=params, data=data, headers=headers, auth=auth + ) + prepared_request = session.prepare_request(request) + + if ( + "Host" not in prepared_request.headers + and "host" not in prepared_request.headers + ): + prepared_request.headers["Host"] = self._get_host(prepared_request) + + validation_payload = self._build_validation_payload(prepared_request) + jwt = ClientValidationJwt( + self.account_sid, + self.api_key_sid, + self.credential_sid, + self.private_key, + validation_payload, + ) + prepared_request.headers["Twilio-Client-Validation"] = jwt.to_jwt() + + response = session.send( + prepared_request, + allow_redirects=allow_redirects, + timeout=timeout, + ) + + return Response(int(response.status_code), response.text) + + def _build_validation_payload(self, request): + """ + Extract relevant information from request to build a ClientValidationJWT + :param PreparedRequest request: request we will extract information from. + :return: ValidationPayload + """ + parsed = urlparse(request.url) + path = parsed.path + query_string = parsed.query or "" + + return ValidationPayload( + method=request.method, + path=path, + query_string=query_string, + all_headers=request.headers, + signed_headers=ValidationClient.__SIGNED_HEADERS, + body=request.body or "", + ) + + def _get_host(self, request): + """Pull the Host out of the request""" + parsed = urlparse(request.url) + return str(parsed.netloc) + + def validate_ssl_certificate(self, client): + """ + Validate that a request to the new SSL certificate is successful + :return: null on success, raise TwilioRestException if the request fails + """ + response = client.request("GET", "https://tls-test.twilio.com:443") + + if response.status_code < 200 or response.status_code >= 300: + raise TwilioRestException( + response.status_code, + "https://tls-test.twilio.com:443", + "Failed to validate SSL certificate", + ) diff --git a/venv/Lib/site-packages/twilio/jwt/__init__.py b/venv/Lib/site-packages/twilio/jwt/__init__.py new file mode 100644 index 00000000..7a51ea70 --- /dev/null +++ b/venv/Lib/site-packages/twilio/jwt/__init__.py @@ -0,0 +1,161 @@ +import jwt as jwt_lib +import time + + +__all__ = ["Jwt", "JwtDecodeError"] + + +class JwtDecodeError(Exception): + pass + + +class Jwt(object): + """Base class for building a Json Web Token""" + + GENERATE = object() + ALGORITHM = "HS256" + + def __init__( + self, + secret_key, + issuer, + subject=None, + algorithm=None, + nbf=GENERATE, + ttl=3600, + valid_until=None, + ): + self.secret_key = secret_key + """:type str: The secret used to encode the JWT""" + self.issuer = issuer + """:type str: The issuer of this JWT""" + self.subject = subject + """:type str: The subject of this JWT, omitted from payload by default""" + self.algorithm = algorithm or self.ALGORITHM + """:type str: The algorithm used to encode the JWT, defaults to 'HS256'""" + self.nbf = nbf + """:type int: Time in secs since epoch before which this JWT is invalid. Defaults to now.""" + self.ttl = ttl + """:type int: Time to live of the JWT in seconds, defaults to 1 hour""" + self.valid_until = valid_until + """:type int: Time in secs since epoch this JWT is valid for. Overrides ttl if provided.""" + + self.__decoded_payload = None + self.__decoded_headers = None + + def _generate_payload(self): + """:rtype: dict the payload of the JWT to send""" + raise NotImplementedError("Subclass must provide a payload.") + + def _generate_headers(self): + """:rtype dict: Additional headers to include in the JWT, defaults to an empty dict""" + return {} + + @classmethod + def _from_jwt(cls, headers, payload, key=None): + """ + Class specific implementation of from_jwt which should take jwt components and return + and instance of this Class with jwt information loaded. + :return: Jwt object containing the headers, payload and key + """ + jwt = Jwt( + secret_key=key, + issuer=payload.get("iss", None), + subject=payload.get("sub", None), + algorithm=headers.get("alg", None), + valid_until=payload.get("exp", None), + nbf=payload.get("nbf", None), + ) + jwt.__decoded_payload = payload + jwt.__decoded_headers = headers + return jwt + + @property + def payload(self): + if self.__decoded_payload: + return self.__decoded_payload + + payload = self._generate_payload().copy() + payload["iss"] = self.issuer + payload["exp"] = int(time.time()) + self.ttl + if self.nbf is not None: + if self.nbf == self.GENERATE: + payload["nbf"] = int(time.time()) + else: + payload["nbf"] = self.nbf + if self.valid_until: + payload["exp"] = self.valid_until + if self.subject: + payload["sub"] = self.subject + + return payload + + @property + def headers(self): + if self.__decoded_headers: + return self.__decoded_headers + + headers = self._generate_headers().copy() + headers["typ"] = "JWT" + headers["alg"] = self.algorithm + return headers + + def to_jwt(self, ttl=None): + """ + Encode this JWT object into a JWT string + :param int ttl: override the ttl configured in the constructor + :rtype: str The JWT string + """ + + if not self.secret_key: + raise ValueError("JWT does not have a signing key configured.") + + headers = self.headers.copy() + + payload = self.payload.copy() + if ttl: + payload["exp"] = int(time.time()) + ttl + + return jwt_lib.encode( + payload, self.secret_key, algorithm=self.algorithm, headers=headers + ) + + @classmethod + def from_jwt(cls, jwt, key=""): + """ + Decode a JWT string into a Jwt object + :param str jwt: JWT string + :param Optional[str] key: key used to verify JWT signature, if not provided then validation + is skipped. + :raises JwtDecodeError if decoding JWT fails for any reason. + :return: A DecodedJwt object containing the jwt information. + """ + verify = True if key else False + + try: + headers = jwt_lib.get_unverified_header(jwt) + + alg = headers.get("alg") + if alg != cls.ALGORITHM: + raise ValueError( + f"Incorrect decoding algorithm {alg}, " + f"expecting {cls.ALGORITHM}." + ) + + payload = jwt_lib.decode( + jwt, + key, + algorithms=[cls.ALGORITHM], + options={ + "verify_signature": verify, + "verify_exp": True, + "verify_nbf": True, + }, + ) + except Exception as e: + raise JwtDecodeError(getattr(e, "message", str(e))) + + return cls._from_jwt(headers, payload, key) + + def __str__(self): + return "".format(self.to_jwt()) diff --git a/venv/Lib/site-packages/twilio/jwt/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/jwt/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b45af854701a8000ed711b83be059a8ad29a70e1 GIT binary patch literal 6359 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".format(self.__class__.__name__, self.to_payload()) + + +class AccessToken(Jwt): + """Access Token containing one or more AccessTokenGrants used to access Twilio Resources""" + + ALGORITHM = "HS256" + + def __init__( + self, + account_sid, + signing_key_sid, + secret, + grants=None, + identity=None, + nbf=Jwt.GENERATE, + ttl=3600, + valid_until=None, + region=None, + ): + grants = grants or [] + if any(not isinstance(g, AccessTokenGrant) for g in grants): + raise ValueError("Grants must be instances of AccessTokenGrant.") + + self.account_sid = account_sid + self.signing_key_sid = signing_key_sid + self.identity = identity + self.region = region + self.grants = grants + super(AccessToken, self).__init__( + secret_key=secret, + algorithm=self.ALGORITHM, + issuer=signing_key_sid, + subject=self.account_sid, + nbf=nbf, + ttl=ttl, + valid_until=valid_until, + ) + + def add_grant(self, grant): + """Add a grant to this AccessToken""" + if not isinstance(grant, AccessTokenGrant): + raise ValueError("Grant must be an instance of AccessTokenGrant.") + self.grants.append(grant) + + def _generate_headers(self): + headers = {"cty": "twilio-fpa;v=1"} + if self.region and isinstance(self.region, str): + headers["twr"] = self.region + return headers + + def _generate_payload(self): + now = int(time.time()) + payload = { + "jti": "{}-{}".format(self.signing_key_sid, now), + "grants": {grant.key: grant.to_payload() for grant in self.grants}, + } + if self.identity: + payload["grants"]["identity"] = self.identity + return payload + + def __str__(self): + return "<{} {}>".format(self.__class__.__name__, self.to_jwt()) diff --git a/venv/Lib/site-packages/twilio/jwt/access_token/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/jwt/access_token/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..258b6d355303cc4c048501f9247fbfdff42dfafa GIT binary patch literal 4302 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 H*`)m!!%LlH literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/jwt/access_token/grants.py b/venv/Lib/site-packages/twilio/jwt/access_token/grants.py new file mode 100644 index 00000000..16d19aa3 --- /dev/null +++ b/venv/Lib/site-packages/twilio/jwt/access_token/grants.py @@ -0,0 +1,183 @@ +from twilio.jwt.access_token import AccessTokenGrant +import warnings +import functools + + +def deprecated(func): + """This is a decorator which can be used to mark functions + as deprecated. It will result in a warning being emitted + when the function is used.""" + + @functools.wraps(func) + def new_func(*args, **kwargs): + warnings.simplefilter("always", DeprecationWarning) + warnings.warn( + "Call to deprecated function {}.".format(func.__name__), + category=DeprecationWarning, + stacklevel=2, + ) + warnings.simplefilter("default", DeprecationWarning) + return func(*args, **kwargs) + + return new_func + + +class ChatGrant(AccessTokenGrant): + """Grant to access Twilio Chat""" + + def __init__( + self, + service_sid=None, + endpoint_id=None, + deployment_role_sid=None, + push_credential_sid=None, + ): + self.service_sid = service_sid + self.endpoint_id = endpoint_id + self.deployment_role_sid = deployment_role_sid + self.push_credential_sid = push_credential_sid + + @property + def key(self): + return "chat" + + def to_payload(self): + grant = {} + if self.service_sid: + grant["service_sid"] = self.service_sid + if self.endpoint_id: + grant["endpoint_id"] = self.endpoint_id + if self.deployment_role_sid: + grant["deployment_role_sid"] = self.deployment_role_sid + if self.push_credential_sid: + grant["push_credential_sid"] = self.push_credential_sid + + return grant + + +class SyncGrant(AccessTokenGrant): + """Grant to access Twilio Sync""" + + def __init__(self, service_sid=None, endpoint_id=None): + self.service_sid = service_sid + self.endpoint_id = endpoint_id + + @property + def key(self): + return "data_sync" + + def to_payload(self): + grant = {} + if self.service_sid: + grant["service_sid"] = self.service_sid + if self.endpoint_id: + grant["endpoint_id"] = self.endpoint_id + + return grant + + +class VoiceGrant(AccessTokenGrant): + """Grant to access Twilio Programmable Voice""" + + def __init__( + self, + incoming_allow=None, + outgoing_application_sid=None, + outgoing_application_params=None, + push_credential_sid=None, + endpoint_id=None, + ): + self.incoming_allow = incoming_allow + """ :type : bool """ + self.outgoing_application_sid = outgoing_application_sid + """ :type : str """ + self.outgoing_application_params = outgoing_application_params + """ :type : dict """ + self.push_credential_sid = push_credential_sid + """ :type : str """ + self.endpoint_id = endpoint_id + """ :type : str """ + + @property + def key(self): + return "voice" + + def to_payload(self): + grant = {} + if self.incoming_allow is True: + grant["incoming"] = {} + grant["incoming"]["allow"] = True + + if self.outgoing_application_sid: + grant["outgoing"] = {} + grant["outgoing"]["application_sid"] = self.outgoing_application_sid + + if self.outgoing_application_params: + grant["outgoing"]["params"] = self.outgoing_application_params + + if self.push_credential_sid: + grant["push_credential_sid"] = self.push_credential_sid + + if self.endpoint_id: + grant["endpoint_id"] = self.endpoint_id + + return grant + + +class VideoGrant(AccessTokenGrant): + """Grant to access Twilio Video""" + + def __init__(self, room=None): + self.room = room + + @property + def key(self): + return "video" + + def to_payload(self): + grant = {} + if self.room: + grant["room"] = self.room + + return grant + + +class TaskRouterGrant(AccessTokenGrant): + """Grant to access Twilio TaskRouter""" + + def __init__(self, workspace_sid=None, worker_sid=None, role=None): + self.workspace_sid = workspace_sid + self.worker_sid = worker_sid + self.role = role + + @property + def key(self): + return "task_router" + + def to_payload(self): + grant = {} + if self.workspace_sid: + grant["workspace_sid"] = self.workspace_sid + if self.worker_sid: + grant["worker_sid"] = self.worker_sid + if self.role: + grant["role"] = self.role + + return grant + + +class PlaybackGrant(AccessTokenGrant): + """Grant to access Twilio Live stream""" + + def __init__(self, grant=None): + """Initialize a PlaybackGrant with a grant retrieved from the Twilio API.""" + self.grant = grant + + @property + def key(self): + """Return the grant's key.""" + return "player" + + def to_payload(self): + """Return the grant.""" + return self.grant diff --git a/venv/Lib/site-packages/twilio/jwt/client/__init__.py b/venv/Lib/site-packages/twilio/jwt/client/__init__.py new file mode 100644 index 00000000..d5c38c47 --- /dev/null +++ b/venv/Lib/site-packages/twilio/jwt/client/__init__.py @@ -0,0 +1,117 @@ +from twilio.jwt import Jwt + +from urllib.parse import urlencode + + +class ClientCapabilityToken(Jwt): + """A token to control permissions with Twilio Client""" + + ALGORITHM = "HS256" + + def __init__( + self, + account_sid, + auth_token, + nbf=Jwt.GENERATE, + ttl=3600, + valid_until=None, + **kwargs + ): + """ + :param str account_sid: The account sid to which this token is granted access. + :param str auth_token: The secret key used to sign the token. Note, this auth token is not + visible to the user of the token. + :param int nbf: Time in secs from epic before which this token is considered invalid. + :param int ttl: the amount of time in seconds from generation that this token is valid for. + :param kwargs: + + + :returns: A new CapabilityToken with zero permissions + """ + super(ClientCapabilityToken, self).__init__( + algorithm=self.ALGORITHM, + secret_key=auth_token, + issuer=account_sid, + nbf=nbf, + ttl=ttl, + valid_until=None, + ) + + self.account_sid = account_sid + self.auth_token = auth_token + self.client_name = None + self.capabilities = {} + + if "allow_client_outgoing" in kwargs: + self.allow_client_outgoing(**kwargs["allow_client_outgoing"]) + if "allow_client_incoming" in kwargs: + self.allow_client_incoming(**kwargs["allow_client_incoming"]) + if "allow_event_stream" in kwargs: + self.allow_event_stream(**kwargs["allow_event_stream"]) + + def allow_client_outgoing(self, application_sid, **kwargs): + """ + Allow the user of this token to make outgoing connections. Keyword arguments are passed + to the application. + + :param str application_sid: Application to contact + """ + scope = ScopeURI("client", "outgoing", {"appSid": application_sid}) + if kwargs: + scope.add_param("appParams", urlencode(kwargs, doseq=True)) + + self.capabilities["outgoing"] = scope + + def allow_client_incoming(self, client_name): + """ + Allow the user of this token to accept incoming connections. + + :param str client_name: Client name to accept calls from + """ + self.client_name = client_name + self.capabilities["incoming"] = ScopeURI( + "client", "incoming", {"clientName": client_name} + ) + + def allow_event_stream(self, **kwargs): + """ + Allow the user of this token to access their event stream. + """ + scope = ScopeURI("stream", "subscribe", {"path": "/2010-04-01/Events"}) + if kwargs: + scope.add_param("params", urlencode(kwargs, doseq=True)) + + self.capabilities["events"] = scope + + def _generate_payload(self): + if "outgoing" in self.capabilities and self.client_name is not None: + self.capabilities["outgoing"].add_param("clientName", self.client_name) + + scope_uris = [ + scope_uri.to_payload() for scope_uri in self.capabilities.values() + ] + return {"scope": " ".join(scope_uris)} + + +class ScopeURI(object): + """A single capability granted to Twilio Client and scoped to a service""" + + def __init__(self, service, privilege, params=None): + self.service = service + self.privilege = privilege + self.params = params or {} + + def add_param(self, key, value): + self.params[key] = value + + def to_payload(self): + if self.params: + sorted_params = sorted([(k, v) for k, v in self.params.items()]) + encoded_params = urlencode(sorted_params) + param_string = "?{}".format(encoded_params) + else: + param_string = "" + return "scope:{}:{}{}".format(self.service, self.privilege, param_string) + + def __str__(self): + return "".format(self.to_payload()) diff --git a/venv/Lib/site-packages/twilio/jwt/client/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/jwt/client/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5efe8cdaf58935013edb4a29b49d5e62558c4c5b GIT binary patch literal 5758 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 Hm_GjlJy2!} literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/jwt/taskrouter/__init__.py b/venv/Lib/site-packages/twilio/jwt/taskrouter/__init__.py new file mode 100644 index 00000000..5a01560d --- /dev/null +++ b/venv/Lib/site-packages/twilio/jwt/taskrouter/__init__.py @@ -0,0 +1,142 @@ +from twilio.jwt import Jwt + + +class TaskRouterCapabilityToken(Jwt): + VERSION = "v1" + DOMAIN = "https://taskrouter.twilio.com" + EVENTS_BASE_URL = "https://event-bridge.twilio.com/v1/wschannels" + ALGORITHM = "HS256" + + def __init__(self, account_sid, auth_token, workspace_sid, channel_id, **kwargs): + """ + :param str account_sid: Twilio account sid + :param str auth_token: Twilio auth token used to sign the JWT + :param str workspace_sid: TaskRouter workspace sid + :param str channel_id: TaskRouter channel sid + :param kwargs: + :param bool allow_web_sockets: shortcut to calling allow_web_sockets, defaults to True + :param bool allow_fetch_self: shortcut to calling allow_fetch_self, defaults to True + :param bool allow_update_self: shortcut to calling allow_update_self, defaults to False + :param bool allow_delete_self: shortcut to calling allow_delete_self, defaults to False + :param bool allow_fetch_subresources: shortcut to calling allow_fetch_subresources, + defaults to False + :param bool allow_update_subresources: shortcut to calling allow_update_subresources, + defaults to False + :param bool allow_delete_subresources: shortcut to calling allow_delete_subresources, + defaults to False + :returns a new TaskRouterCapabilityToken with capabilities set depending on kwargs. + """ + super(TaskRouterCapabilityToken, self).__init__( + secret_key=auth_token, + issuer=account_sid, + algorithm=self.ALGORITHM, + nbf=kwargs.get("nbf", Jwt.GENERATE), + ttl=kwargs.get("ttl", 3600), + valid_until=kwargs.get("valid_until", None), + ) + + self._validate_inputs(account_sid, workspace_sid, channel_id) + + self.account_sid = account_sid + self.auth_token = auth_token + self.workspace_sid = workspace_sid + self.channel_id = channel_id + self.policies = [] + + if kwargs.get("allow_web_sockets", True): + self.allow_web_sockets() + if kwargs.get("allow_fetch_self", True): + self.allow_fetch_self() + if kwargs.get("allow_update_self", False): + self.allow_update_self() + if kwargs.get("allow_delete_self", False): + self.allow_delete_self() + if kwargs.get("allow_fetch_subresources", False): + self.allow_fetch_subresources() + if kwargs.get("allow_delete_subresources", False): + self.allow_delete_subresources() + if kwargs.get("allow_update_subresources", False): + self.allow_update_subresources() + + @property + def workspace_url(self): + return "{}/{}/Workspaces/{}".format( + self.DOMAIN, self.VERSION, self.workspace_sid + ) + + @property + def resource_url(self): + raise NotImplementedError("Subclass must set its specific resource_url.") + + @property + def channel_prefix(self): + raise NotImplementedError( + "Subclass must set its specific channel_id sid prefix." + ) + + def allow_fetch_self(self): + self._make_policy(self.resource_url, "GET", True) + + def allow_update_self(self): + self._make_policy(self.resource_url, "POST", True) + + def allow_delete_self(self): + self._make_policy(self.resource_url, "DELETE", True) + + def allow_fetch_subresources(self): + self._make_policy(self.resource_url + "/**", "GET", True) + + def allow_update_subresources(self): + self._make_policy(self.resource_url + "/**", "POST", True) + + def allow_delete_subresources(self): + self._make_policy(self.resource_url + "/**", "DELETE", True) + + def allow_web_sockets(self, channel_id=None): + channel_id = channel_id or self.channel_id + web_socket_url = "{}/{}/{}".format( + self.EVENTS_BASE_URL, self.account_sid, channel_id + ) + self._make_policy(web_socket_url, "GET", True) + self._make_policy(web_socket_url, "POST", True) + + def _generate_payload(self): + payload = { + "account_sid": self.account_sid, + "workspace_sid": self.workspace_sid, + "channel": self.channel_id, + "version": self.VERSION, + "friendly_name": self.channel_id, + "policies": self.policies, + } + + if self.channel_id.startswith("WK"): + payload["worker_sid"] = self.channel_id + elif self.channel_id.startswith("WQ"): + payload["taskqueue_sid"] = self.channel_id + + return payload + + def _make_policy(self, url, method, allowed, query_filter=None, post_filter=None): + self.policies.append( + { + "url": url, + "method": method.upper(), + "allow": allowed, + "query_filter": query_filter or {}, + "post_filter": post_filter or {}, + } + ) + + def _validate_inputs(self, account_sid, workspace_sid, channel_id): + if not account_sid or not account_sid.startswith("AC"): + raise ValueError("Invalid account sid provided {}".format(account_sid)) + + if not workspace_sid or not workspace_sid.startswith("WS"): + raise ValueError("Invalid workspace sid provided {}".format(workspace_sid)) + + if not channel_id or not channel_id.startswith(self.channel_prefix): + raise ValueError("Invalid channel id provided {}".format(channel_id)) + + def __str__(self): + return "".format(self.to_jwt()) diff --git a/venv/Lib/site-packages/twilio/jwt/taskrouter/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/jwt/taskrouter/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a37d5065153d1310ec27e0685e97177f39dbb23 GIT binary patch literal 8453 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 K3xXZ4{{H}".format(self.to_jwt()) + + +class TaskQueueCapabilityToken(TaskRouterCapabilityToken): + def __init__( + self, account_sid, auth_token, workspace_sid, task_queue_sid, ttl=3600, **kwargs + ): + super(TaskQueueCapabilityToken, self).__init__( + account_sid=account_sid, + auth_token=auth_token, + workspace_sid=workspace_sid, + channel_id=task_queue_sid, + ttl=ttl, + **kwargs + ) + + @property + def resource_url(self): + return "{}/TaskQueues/{}".format(self.workspace_url, self.channel_id) + + @property + def channel_prefix(self): + return "WQ" + + def __str__(self): + return "".format(self.to_jwt()) + + +class WorkspaceCapabilityToken(TaskRouterCapabilityToken): + def __init__(self, account_sid, auth_token, workspace_sid, ttl=3600, **kwargs): + super(WorkspaceCapabilityToken, self).__init__( + account_sid=account_sid, + auth_token=auth_token, + workspace_sid=workspace_sid, + channel_id=workspace_sid, + ttl=ttl, + **kwargs + ) + + @property + def resource_url(self): + return self.workspace_url + + @property + def channel_prefix(self): + return "WS" + + def __str__(self): + return "".format(self.to_jwt()) diff --git a/venv/Lib/site-packages/twilio/jwt/validation/__init__.py b/venv/Lib/site-packages/twilio/jwt/validation/__init__.py new file mode 100644 index 00000000..837d6196 --- /dev/null +++ b/venv/Lib/site-packages/twilio/jwt/validation/__init__.py @@ -0,0 +1,92 @@ +from hashlib import sha256 + +from twilio.jwt import Jwt + + +class ClientValidationJwt(Jwt): + """A JWT included on requests so that Twilio can verify request authenticity""" + + __CTY = "twilio-pkrv;v=1" + ALGORITHM = "RS256" + + def __init__( + self, account_sid, api_key_sid, credential_sid, private_key, validation_payload + ): + """ + Create a new ClientValidationJwt + :param str account_sid: A Twilio Account Sid starting with 'AC' + :param str api_key_sid: A Twilio API Key Sid starting with 'SK' + :param str credential_sid: A Credential Sid starting with 'CR', + public key Twilio will use to verify the JWT. + :param str private_key: The private key used to sign the JWT. + :param ValidationPayload validation_payload: information from the request to sign + """ + super(ClientValidationJwt, self).__init__( + secret_key=private_key, + issuer=api_key_sid, + subject=account_sid, + algorithm=self.ALGORITHM, + ttl=300, # 5 minute ttl + ) + self.credential_sid = credential_sid + self.validation_payload = validation_payload + + def _generate_headers(self): + return {"cty": ClientValidationJwt.__CTY, "kid": self.credential_sid} + + def _generate_payload(self): + # Lowercase header keys, combine and sort headers with list values + all_headers = { + k.lower(): self._sort_and_join(v, ",") + for k, v in self.validation_payload.all_headers.items() + } + # Names of headers we are signing in the jwt + signed_headers = sorted(self.validation_payload.signed_headers) + + # Stringify headers, only include headers in signed_headers + headers_str = [ + "{}:{}".format(h, all_headers[h]) + for h in signed_headers + if h in all_headers + ] + headers_str = "\n".join(headers_str) + + # Sort query string parameters + query_string = self.validation_payload.query_string.split("&") + query_string = self._sort_and_join(query_string, "&") + + req_body_hash = self._hash(self.validation_payload.body) or "" + + signed_headers_str = ";".join(signed_headers) + + signed_payload = [ + self.validation_payload.method, + self.validation_payload.path, + query_string, + ] + + if headers_str: + signed_payload.append(headers_str) + signed_payload.append("") + signed_payload.append(signed_headers_str) + signed_payload.append(req_body_hash) + + signed_payload = "\n".join(signed_payload) + + return {"hrh": signed_headers_str, "rqh": self._hash(signed_payload)} + + @classmethod + def _sort_and_join(cls, values, joiner): + if isinstance(values, str): + return values + return joiner.join(sorted(values)) + + @classmethod + def _hash(cls, input_str): + if not input_str: + return input_str + + if not isinstance(input_str, bytes): + input_str = input_str.encode("utf-8") + + return sha256(input_str).hexdigest() diff --git a/venv/Lib/site-packages/twilio/jwt/validation/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/jwt/validation/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f39865658ff9fee1453a05e9c7afb53e3a46fea5 GIT binary patch literal 4318 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 cOB6v6e?u+*KrNfD8wAnysN-J "Accounts": + """ + Access the Accounts Twilio Domain + + :returns: Accounts Twilio Domain + """ + if self._accounts is None: + from twilio.rest.accounts import Accounts + + self._accounts = Accounts(self) + return self._accounts + + @property + def api(self) -> "Api": + """ + Access the Api Twilio Domain + + :returns: Api Twilio Domain + """ + if self._api is None: + from twilio.rest.api import Api + + self._api = Api(self) + return self._api + + @property + def assistants(self) -> "Assistants": + """ + Access the Assistants Twilio Domain + + :returns: Assistants Twilio Domain + """ + if self._assistants is None: + from twilio.rest.assistants import Assistants + + self._assistants = Assistants(self) + return self._assistants + + @property + def bulkexports(self) -> "Bulkexports": + """ + Access the Bulkexports Twilio Domain + + :returns: Bulkexports Twilio Domain + """ + if self._bulkexports is None: + from twilio.rest.bulkexports import Bulkexports + + self._bulkexports = Bulkexports(self) + return self._bulkexports + + @property + def chat(self) -> "Chat": + """ + Access the Chat Twilio Domain + + :returns: Chat Twilio Domain + """ + if self._chat is None: + from twilio.rest.chat import Chat + + self._chat = Chat(self) + return self._chat + + @property + def content(self) -> "Content": + """ + Access the Content Twilio Domain + + :returns: Content Twilio Domain + """ + if self._content is None: + from twilio.rest.content import Content + + self._content = Content(self) + return self._content + + @property + def conversations(self) -> "Conversations": + """ + Access the Conversations Twilio Domain + + :returns: Conversations Twilio Domain + """ + if self._conversations is None: + from twilio.rest.conversations import Conversations + + self._conversations = Conversations(self) + return self._conversations + + @property + def events(self) -> "Events": + """ + Access the Events Twilio Domain + + :returns: Events Twilio Domain + """ + if self._events is None: + from twilio.rest.events import Events + + self._events = Events(self) + return self._events + + @property + def flex_api(self) -> "FlexApi": + """ + Access the FlexApi Twilio Domain + + :returns: FlexApi Twilio Domain + """ + if self._flex_api is None: + from twilio.rest.flex_api import FlexApi + + self._flex_api = FlexApi(self) + return self._flex_api + + @property + def frontline_api(self) -> "FrontlineApi": + """ + Access the FrontlineApi Twilio Domain + + :returns: FrontlineApi Twilio Domain + """ + if self._frontline_api is None: + from twilio.rest.frontline_api import FrontlineApi + + self._frontline_api = FrontlineApi(self) + return self._frontline_api + + @property + def preview_iam(self) -> "PreviewIam": + """ + Access the PreviewIam Twilio Domain + + :returns: PreviewIam Twilio Domain + """ + if self._preview_iam is None: + from twilio.rest.preview_iam import PreviewIam + + self._preview_iam = PreviewIam(self) + return self._preview_iam + + @property + def iam(self) -> "Iam": + """ + Access the Iam Twilio Domain + + :returns: Iam Twilio Domain + """ + if self._iam is None: + from twilio.rest.iam import Iam + + self._iam = Iam(self) + return self._iam + + @property + def insights(self) -> "Insights": + """ + Access the Insights Twilio Domain + + :returns: Insights Twilio Domain + """ + if self._insights is None: + from twilio.rest.insights import Insights + + self._insights = Insights(self) + return self._insights + + @property + def intelligence(self) -> "Intelligence": + """ + Access the Intelligence Twilio Domain + + :returns: Intelligence Twilio Domain + """ + if self._intelligence is None: + from twilio.rest.intelligence import Intelligence + + self._intelligence = Intelligence(self) + return self._intelligence + + @property + def ip_messaging(self) -> "IpMessaging": + """ + Access the IpMessaging Twilio Domain + + :returns: IpMessaging Twilio Domain + """ + if self._ip_messaging is None: + from twilio.rest.ip_messaging import IpMessaging + + self._ip_messaging = IpMessaging(self) + return self._ip_messaging + + @property + def knowledge(self) -> "Knowledge": + """ + Access the Knowledge Twilio Domain + + :returns: Knowledge Twilio Domain + """ + if self._knowledge is None: + from twilio.rest.knowledge import Knowledge + + self._knowledge = Knowledge(self) + return self._knowledge + + @property + def lookups(self) -> "Lookups": + """ + Access the Lookups Twilio Domain + + :returns: Lookups Twilio Domain + """ + if self._lookups is None: + from twilio.rest.lookups import Lookups + + self._lookups = Lookups(self) + return self._lookups + + @property + def marketplace(self) -> "Marketplace": + """ + Access the Marketplace Twilio Domain + + :returns: Marketplace Twilio Domain + """ + if self._marketplace is None: + from twilio.rest.marketplace import Marketplace + + self._marketplace = Marketplace(self) + return self._marketplace + + @property + def messaging(self) -> "Messaging": + """ + Access the Messaging Twilio Domain + + :returns: Messaging Twilio Domain + """ + if self._messaging is None: + from twilio.rest.messaging import Messaging + + self._messaging = Messaging(self) + return self._messaging + + @property + def microvisor(self) -> "Microvisor": + """ + Access the Microvisor Twilio Domain + + :returns: Microvisor Twilio Domain + """ + if self._microvisor is None: + from twilio.rest.microvisor import Microvisor + + self._microvisor = Microvisor(self) + return self._microvisor + + @property + def monitor(self) -> "Monitor": + """ + Access the Monitor Twilio Domain + + :returns: Monitor Twilio Domain + """ + if self._monitor is None: + from twilio.rest.monitor import Monitor + + self._monitor = Monitor(self) + return self._monitor + + @property + def notify(self) -> "Notify": + """ + Access the Notify Twilio Domain + + :returns: Notify Twilio Domain + """ + if self._notify is None: + from twilio.rest.notify import Notify + + self._notify = Notify(self) + return self._notify + + @property + def numbers(self) -> "Numbers": + """ + Access the Numbers Twilio Domain + + :returns: Numbers Twilio Domain + """ + if self._numbers is None: + from twilio.rest.numbers import Numbers + + self._numbers = Numbers(self) + return self._numbers + + @property + def oauth(self) -> "Oauth": + """ + Access the Oauth Twilio Domain + + :returns: Oauth Twilio Domain + """ + if self._oauth is None: + from twilio.rest.oauth import Oauth + + self._oauth = Oauth(self) + return self._oauth + + @property + def preview(self) -> "Preview": + """ + Access the Preview Twilio Domain + + :returns: Preview Twilio Domain + """ + if self._preview is None: + from twilio.rest.preview import Preview + + self._preview = Preview(self) + return self._preview + + @property + def pricing(self) -> "Pricing": + """ + Access the Pricing Twilio Domain + + :returns: Pricing Twilio Domain + """ + if self._pricing is None: + from twilio.rest.pricing import Pricing + + self._pricing = Pricing(self) + return self._pricing + + @property + def proxy(self) -> "Proxy": + """ + Access the Proxy Twilio Domain + + :returns: Proxy Twilio Domain + """ + if self._proxy is None: + from twilio.rest.proxy import Proxy + + self._proxy = Proxy(self) + return self._proxy + + @property + def routes(self) -> "Routes": + """ + Access the Routes Twilio Domain + + :returns: Routes Twilio Domain + """ + if self._routes is None: + from twilio.rest.routes import Routes + + self._routes = Routes(self) + return self._routes + + @property + def serverless(self) -> "Serverless": + """ + Access the Serverless Twilio Domain + + :returns: Serverless Twilio Domain + """ + if self._serverless is None: + from twilio.rest.serverless import Serverless + + self._serverless = Serverless(self) + return self._serverless + + @property + def studio(self) -> "Studio": + """ + Access the Studio Twilio Domain + + :returns: Studio Twilio Domain + """ + if self._studio is None: + from twilio.rest.studio import Studio + + self._studio = Studio(self) + return self._studio + + @property + def supersim(self) -> "Supersim": + """ + Access the Supersim Twilio Domain + + :returns: Supersim Twilio Domain + """ + if self._supersim is None: + from twilio.rest.supersim import Supersim + + self._supersim = Supersim(self) + return self._supersim + + @property + def sync(self) -> "Sync": + """ + Access the Sync Twilio Domain + + :returns: Sync Twilio Domain + """ + if self._sync is None: + from twilio.rest.sync import Sync + + self._sync = Sync(self) + return self._sync + + @property + def taskrouter(self) -> "Taskrouter": + """ + Access the Taskrouter Twilio Domain + + :returns: Taskrouter Twilio Domain + """ + if self._taskrouter is None: + from twilio.rest.taskrouter import Taskrouter + + self._taskrouter = Taskrouter(self) + return self._taskrouter + + @property + def trunking(self) -> "Trunking": + """ + Access the Trunking Twilio Domain + + :returns: Trunking Twilio Domain + """ + if self._trunking is None: + from twilio.rest.trunking import Trunking + + self._trunking = Trunking(self) + return self._trunking + + @property + def trusthub(self) -> "Trusthub": + """ + Access the Trusthub Twilio Domain + + :returns: Trusthub Twilio Domain + """ + if self._trusthub is None: + from twilio.rest.trusthub import Trusthub + + self._trusthub = Trusthub(self) + return self._trusthub + + @property + def verify(self) -> "Verify": + """ + Access the Verify Twilio Domain + + :returns: Verify Twilio Domain + """ + if self._verify is None: + from twilio.rest.verify import Verify + + self._verify = Verify(self) + return self._verify + + @property + def video(self) -> "Video": + """ + Access the Video Twilio Domain + + :returns: Video Twilio Domain + """ + if self._video is None: + from twilio.rest.video import Video + + self._video = Video(self) + return self._video + + @property + def voice(self) -> "Voice": + """ + Access the Voice Twilio Domain + + :returns: Voice Twilio Domain + """ + if self._voice is None: + from twilio.rest.voice import Voice + + self._voice = Voice(self) + return self._voice + + @property + def wireless(self) -> "Wireless": + """ + Access the Wireless Twilio Domain + + :returns: Wireless Twilio Domain + """ + if self._wireless is None: + from twilio.rest.wireless import Wireless + + self._wireless = Wireless(self) + return self._wireless + + @property + def addresses(self) -> "AddressList": + return self.api.account.addresses + + @property + def applications(self) -> "ApplicationList": + return self.api.account.applications + + @property + def authorized_connect_apps(self) -> "AuthorizedConnectAppList": + return self.api.account.authorized_connect_apps + + @property + def available_phone_numbers(self) -> "AvailablePhoneNumberCountryList": + return self.api.account.available_phone_numbers + + @property + def balance(self) -> "BalanceList": + return self.api.account.balance + + @property + def calls(self) -> "CallList": + return self.api.account.calls + + @property + def conferences(self) -> "ConferenceList": + return self.api.account.conferences + + @property + def connect_apps(self) -> "ConnectAppList": + return self.api.account.connect_apps + + @property + def incoming_phone_numbers(self) -> "IncomingPhoneNumberList": + return self.api.account.incoming_phone_numbers + + @property + def keys(self) -> "KeyList": + return self.api.account.keys + + @property + def new_keys(self) -> "NewKeyList": + return self.api.account.new_keys + + @property + def messages(self) -> "MessageList": + return self.api.account.messages + + @property + def signing_keys(self) -> "SigningKeyList": + return self.api.account.signing_keys + + @property + def new_signing_keys(self) -> "NewSigningKeyList": + return self.api.account.new_signing_keys + + @property + def notifications(self) -> "NotificationList": + return self.api.account.notifications + + @property + def outgoing_caller_ids(self) -> "OutgoingCallerIdList": + return self.api.account.outgoing_caller_ids + + @property + def validation_requests(self) -> "ValidationRequestList": + return self.api.account.validation_requests + + @property + def queues(self) -> "QueueList": + return self.api.account.queues + + @property + def recordings(self) -> "RecordingList": + return self.api.account.recordings + + @property + def short_codes(self) -> "ShortCodeList": + return self.api.account.short_codes + + @property + def sip(self) -> "SipList": + return self.api.account.sip + + @property + def tokens(self) -> "TokenList": + return self.api.account.tokens + + @property + def transcriptions(self) -> "TranscriptionList": + return self.api.account.transcriptions + + @property + def usage(self) -> "UsageList": + return self.api.account.usage diff --git a/venv/Lib/site-packages/twilio/rest/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d1fc5c3983701ddab19c4ae35eda32e4f95a0a0 GIT binary patch literal 28111 zcmd5_dvF`ac|VXK2@)V7iF)&Oe2Iei5=Bass3%40LCd0Kk&^8bWf;PpD42HuyZ|MU zrY$*f8nJbn^pPeV{o|&YREaxDCher1G?Px#Nv3H!DQKrLixx?lG<_s(Mv3eubtj#E z-`?I~7dVLgqcbo}@BQ|7-`?&1Zg20~y}i{ptE;Od_`UkZv)A8#N|Jtn5$jjRz{7!3 zN&1+iN{Xbq)Dqoglqe-esZ#2~c&Y9-%9Jvfq?LTcMdpEV>*Yp;QbG5Y=^mp}sie4E zuQI%fm*NWDXH+ZI6npd{-$uGH5V>y`BsSLqv!TBVj^ufEaPq->(tr*Ag4C|fA5 z*0&nllx-B(=-Z7trH*31UT-ug4HU1_8;vHViQ@ITY&0v)6mQU5j8>(U;#$4UXjj@P z-l*>|I+PBIH|aZ#fD)j1v%bsdR5~f%qIVhHN;kz@^&X>F>7{s^zT45oLtpR(;esp`4(&O+RUzQch9auAer>lrf5T=#Lp^lrt1}=#Lv`m9rG@ z)W?l;$~lSy`g!9C5zhpeAJV|l4{*>{w@-)Rgx?)^b zE>qmAPZ?K~D-`e6pD}_;km5f5StF!`DBh!AHNr}m;(lE!iyct|HkLP=13P){1O$}Gi)^c%)a z5@^p}j=%592=^*hGP%F7fV*WYKnUwOYv zDv?e}>c}gSI;xeu4)+TFlvn0X1Wty2&m~D!vOIY`l90nORg-Uq67sYb)kr9*sq)o1 z*cl84({d|7e^tU})|M25~2iVt}a^rZ53T z!C)^Ub`X>9wGJCxplMA@W(H?7kBGK#I*eYy0M9pN9afg{6y~30KUD?C9X~gDVuGkIZWQVU-PgVC5A zjU{DGjU?sdbxjV_6BwcBY)IGVdaC{%FIb=?T|N2q`4hpB(=%|??6z@@|S2yCi`6NyM788S)l@mYOFyA_WSYU3Wc z9!i2y#Yilggu?)=26#gwi4dLwk5hi)2JAspaZ=ZAnMd`VB#=UnL^XDn^F+H5(Qb}~ z3@|J;H=eO*A~JoQruB`%33NRI8iX;Y-m&;uEs+RKN21dZtvnNr-PAR88uwK^9*fP) z#_^Qivmr90CF6RCrmE!ARGp24N$f@>5hIxBY%Cf{QdmA7OGd8EAvr#4T!q2_EIS8R z?K*NSt0s(u%?y;CC$U?Yr2Il`HmPBXstJvN5;|lP`HAGL8i@h&Ow7jNm=P?gdtxpc zM%&3yVuoN!%!_A|%tmL-10zl(ug_iuzWkC#%#4*?il`bMtn5-OLW|~kGD0*wR{%;q ztf~ay<8a|1>K~5B^+=dr5k_qthQh>1WL{I@dPTKx5^UJMrr{f*h#tDCYv-@WqM9ke z2v!R+$4tD(LwX1<1dDn`puRC&1IN3j5xh(sBc5T)STr0npnTj3m~q7!%{ocdxOOue z^O~2=KIlYbItoX~8mtHNJaQeqlw#R8o|{ch#~>}{S|ejBJN2eZAw8l}l`d${&uWPz z+fn(%tTt<%xcY(?ju91-v%S?5AY^g`+CZxa6A??w%E{P_7G?bUNfL@C!X!fPKI_;Q zp$^lOVZ2$bA8Tx-ho5vy(g(pw(ImwMj!KE@Qc5eO-2c?$ccp9K!n{(cxV18ML@j;A z{W?3AQVz_h>gJdVU{0uI9OD7zq*~4~mB5@*D>$YKnA5613w%tl}?s2ezD z6EG8MEyrvIW>VeAFI4ROdT*!tJ^rH9vDU4 z&M^(ZTvqEirV*GawVq>|fVrYJaEuJhGioEpGy@YeNgm}ga)V_Ja;sm&bI2Fz8p zg=5-*39GFfvjZ4aZR3~@U^KOzV|D^_P2IsU0br)p4vyIc%yo4q$8-V{Q3D*)1ytswTokVficu>j@b=NRPEuIK44;MFURZwCa&)0n0{cMSNk|-02rd~ z;h4R^B-DP6*#}Hg9pIQjU}n|59J3#o8|preIRMN}b&z9*fVrja=a_@Q%&7-B<`6LR z>JY~q2Id9zAjcd5W95|hEz=?T*g8f&Dy zu*Ej-;iVEu`l#z;Qj+bEq{XTQ=|j+ETW~FuER-&|7s?jO7b+G!3ze@|nnvifE=WO0 zY5r);YC+9?(28>VtPY^LuUyzyA;dgFjGa$1)7kl_=fe`vAC38hShWzV5n_HJwoZtx z7h)TPSgjD-D8x1ivCTqkixAr?#I^~s?Lw?hh}8?R1|ilc#F~VdEX10HSc?#A6=H2d ztX+uh5MmudY^N2Qa|KF5PeG+XSD*gIz}<_$6MtSy@Kw{S#OS%3zoB@DgbX>6B=T%R zBhiqd4apZ7lEIHhw-72j`WVm)iX^Xh$r^+jt@`LS1rrff#ycS%3C?KPG0Hn~96AO! z!K)aO&oflu$au0~5}gWpXXF~>2yZO7#jNuLtP>@)Fwv5{k$Luj)9JYb49TnuAWw{q zcF6=BA@D0zIeRkmIJx=5{z_i4h&BzK0O5k*$8G`hrWf`u)(E(Y$w52PKf7-C3@Hqa*vL+2uoy3asrFDsvzUw zhUXqi2jBiO9PbLPmO*eLp{8lKpcj_Fju%`<6}p88@%Y#~#OfICqouvvy^?lg-A-@91Lal7bS*SUDmIiM9ZQV) zA&?I^5LAg^Fo6$HtG>zdop;ZT3{7D>o0vK?Ha0mmswHNUvG^3t|1j3}DX0xMrXG)6 zok~QKT6a7Yo`Kq(m@+GAFILiCt0wlu=SUn*Fz+|3ZI89%GLVTgFqrj=JJQ?xq{^Db ziY3q1W#2~nw`JM4Vc7>E{Hy5-JZi29a$_Q0lQdH*4k9oTQCVTbDNr+WtvBD;Ng z-;lZO+Y7YcI-+$R##*Om=VRw#u|PMZ^jaxJl37~mS(Igg6~fxdShiuN?BHyJ`#x0j z5FffQ{F(isGlu^^grRuo%q~dJW%t?WPOUWx|Dp@W9>L+0US~%E_s+I+P7N+->HHPD zm4v4l+}E_-V-K{1)wYesj8G)%)c6&!v}z?m50jv~7$_yr!zR6vZxGqNk|5|p21>}s z(He0A)5$XVeb}TumYH1@Edo3257C*qBR!~*eCs}ZWbsJK+nn+3U1?~4O}+Qb-O*Ra zm;JRLerfTgl&67w5=@Jt@`R(x@yHqk&NC9VMRyytC9p~R1#ROIg5I|!D`G*`Qh2(| zSFxKL@SlQ#Am)L^11WEP#@D&BweI7i_bNfmF%)xdaW3WAT0AjBj$+ym$u($N$X1jV zdn+Jq0ygQ*g0yyef=#fcFk(UBs_c_{e!V5Mo%U;B{;&%IR(ap@)-8GKQr^~#@4!k^ z;C|biO}%$VzwN6B&EN7jE%}>Lo~Gid9(Gcl8{1x8_QJ-Z?${Fq-LXHL-ooq7`91_Y zh?ek(1>wD%<@^SwJjcBO2}J4Zm%Q~UZ(GK9a7FICKl-NJhtfAt>E$KAobt%Ulm4QU z^!OfOb^N^jis)c>Oa6x5cu%o;gna-`1)7sTVET!cNPRbivqv6_+rXaUp#@Q3kaO; zoUBRag65*wIL-rN--JziTaMV-Ll7JQvLr_=NM0>;o#r=Yh0h-0zcG=}WH&B(8&lpL z8Q;;Bmfp|1-)z~7?M4%AH(HkbEh$e+@h-yCP8Y#^x463cj&`E#ID`hW--1ng124PT z>m)d+X6cPs(7W6;ny+R;o6&OcUWE#NXz@_W+m!M3t<*KY)^_g@RPe{Kf-fvCq&#)S z)7G&CVQ*_!7uVTPR2K&!LESl2SMZvxt~|kkNlRbEg1#Qh%=Vfs0;bVO2`8_4V5On$ zwaI%|K;!p>*PI=}fo_J?H{oA{uR&;QtYdf;KYFXF_B^UBG$F!h3BmDROLD}5KCA(tytM{Bj6#Bl>8xB6|Wg~9KNt7!K^_mHq4o0DGG*fXF#wQVIwxg z)*vatH#U}Phy~R=mYLlUTLjF@lgNFrFP?smO)NigC`TFFqZqQszaL>O>L{a1rQ{{p zq_^_!0zbk`n$e041tAu+^zo+iwaj(k$w|;uY+oCeybURDd&YNorMdgQ`et)K-sX+e zMQdL2H>W(!#na!hSIte-T7&%ASzS5CqWbu*5Y)e&uRb@RPg*(k5$CASnP%1J$WUSR z53MwJ-Jg83dCz-D{h(c)IS0d@7ndWaZJVw7g-k`|@l7l!e+M?{O?0H@MQ+ao>F}2EN=m^p|fh-cETMi&xPd{be@m zaCM=b4MmyJqXn5?Mwx{kH+wBb@IALBGGamG3T9>ZxLF+L088Y{U|l@v9NP$Pmgeg6 z6*d+n#CQK7;rn1CdSTrAJQ6@7)<7c`Wb|^Dwim{6cTvtihE&Cq)A6RaXSuFHOzZ7u zj;Sc+E>x+MydO5=O>e&pC7o!(ghVU|S!vtZH@(e#6h-_;NKrfy9s32@*}*x|I5eFF zZABTervx&-0vmA*KKmY-bfXQ^5wW0SRo2iRgU?c*KqWs9X^N+$W5dX1RQhQS02{GkWUt>zFB&ib5eouVFe|%ZWbw}xzhQJ7-!f;S=Lq6Z0Uhl`;dYzC z{R#>vjBlB<6-Xba8)8AXa?{8j-!h|LM%DfjY~N!Qj?LO%gKXyfj2uHzw>_v!Dfu95 z#0tkIcaVNGU=3NEZJ=@oS{x)8jm$^Q6`y zos*#`-F{QLUv-du%y zmLEBc``J?iv7lMGX=Fcc&1eq^OK8(rQ!Y8?Y1sUok1mw z+txYWwbnPzYtWI+Y|pV2RXlB~_?xJraMxP%;>j4NA!0#8k7YJ*%@DVUr;2~q7SfMS z^3PGlq16MWoh(KD9y9g(EhqhGYI26t4{@G;)Qs1U5?b-~b9~lbqF+X=uAZZvsNLhH zcE63<2}3L3s=(J57gLU?vK7-W2S2@&&`B96+JZU7myVxxeS!xr`)DNS}6%gMaWk>`GU#k44gzA#;fjTxo=UX#&du!ABGRNHvANvFo83}?nwUx<7BrMZTYd(L^3bs;T}%G1l&7l*McIO1_?b(p;D?L2;t70` z7|$eF^nsqbD}Rm0SV4x zD?&jku9~aYN4|1%mR6un&u1edEFzex+bRI+y&NDNkn+3gUa@T@Fj%W!o;^@~c?$ zcfsBwWO;LhExfeK9Sm#rN%IZ%gfw%pCNa&|3*Hy|mi+rto_$3qo*R}|$gfj}u`t$$ zJ!tXQ1+(6^@`%|9&VifF#y)0f3mxIA2Tk`52EV!C2 zm_vep!8_*+7!{!a<&bB{bzYufVOYr?bun#zR8apNOa2`x&yFHwzlvB34(1o(0v5sg z7&~kClY;lht|kAjlxJ5Fis4P*GKtVLQXMV@&U3fjKF;uGSZ!cI;bK&q(nKVlS7$C^ zMy+KAz~H|MD&4x|Z%uhxi=cElT^}mHvOI-(w?0rbZQezF&lgAEnk2s*W`1@R%s~?KJ9IocDpTp}pT+8829LDb}tz)u}0O|4BH)#~(2UC^}egO!T}Cj9KOQgXE+?>@Ut8aari2S!yHyQta11nho?Dwox>3hKgZ!2#3x}ftRSwd2MdN( z1z{O2byi303kIKug{;}0ieONUg@Zx5j1w$TMPOBISe1Nwzrf&s zF!)~#TzIRxF{r?x3WI74)?rYK!DbA$VNj1j69z39;BYO$u}*?Rg9L}q2o6ON9MB;+ zBtmdBfncwk9L50qgamt41p6ukJ%57kGC>EEpfg6$yCLWw5PY~2d~gwb0uXFh2{ucx z{F%A3oJcK+%fnZLEBbvmz8o}KKRbatv6PRDaf>%=*o*GU5>F8_G0vRzC+ zKo834z2GYAwz+Pb+i!FGAIa^s?RMIBJ8W);&2`yam(4kychI&QwC&n$uHEJWHWzp# z=X8!fJ8hqxw#VjrY;M5j1|G?E*mfPZU8l`;+MJUHZMI#TZRd2nUfZtMwlj5pyTnyy z_6li3IUe``31Qn>4hv?&022Xc51tDU*q@+Xg@0mR~FhFOId<6q^^~hgffQ}yd8V2a*k-x$KojmeQ4C*lW76$0x zktGb8F!(kG%^19e0lIc1jX^sG-^HK{u6^f3?5*B zt{i!Y0XlNz=NJrP@Gb`E#F1ZOa1a9tB&0KBNhzYE$dw}+MpTIiT{q%GbOMnd(J4e5 z5RD<)gy;;St%%MdszY=RQ6r)!5H%y30F-X$KU9EKx~#b=+iBaJ{^v45%fsY zJ6AEZU-S@kT31tydr3krqkaFQ5AXOcgPgCvi!k5f<1+F z>!Z&`$J>a8mK~3_w1>3__B2+jbJ@WoGL7b|)C3&k!H&vm*`>oJB!ZTmkIt?zQbDk@ zv)ZxEfrA;aq>qqKn}c1{1Ao_Z$m|XsA@I*MVXG)5ehk5bQkTp1(~?S;`{$b_SLY9< zp6{2g%ecEU?$(UEFXQgdxZ5-C&Ww97;|^rpT^aYjjC&8=3pRT*?tzTEml}X207wGH zUFsqDBb<35;ipUSvTvmH{| zP{w_X+Mdq1&t=?aGVY5R_oa;caK?Qi<35>jAE5Xwgm1&Yr{>ymS9wRmEgj1FKMsDj AFaQ7m literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/accounts/AccountsBase.py b/venv/Lib/site-packages/twilio/rest/accounts/AccountsBase.py new file mode 100644 index 00000000..e9ac0d58 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/accounts/AccountsBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.accounts.v1 import V1 + + +class AccountsBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Accounts Domain + + :returns: Domain for Accounts + """ + super().__init__(twilio, "https://accounts.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Accounts + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/accounts/__init__.py b/venv/Lib/site-packages/twilio/rest/accounts/__init__.py new file mode 100644 index 00000000..e2275aea --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/accounts/__init__.py @@ -0,0 +1,35 @@ +from warnings import warn + +from twilio.rest.accounts.AccountsBase import AccountsBase +from twilio.rest.accounts.v1.auth_token_promotion import AuthTokenPromotionList +from twilio.rest.accounts.v1.credential import CredentialList +from twilio.rest.accounts.v1.secondary_auth_token import SecondaryAuthTokenList + + +class Accounts(AccountsBase): + @property + def auth_token_promotion(self) -> AuthTokenPromotionList: + warn( + "auth_token_promotion is deprecated. Use v1.auth_token_promotion instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.auth_token_promotion + + @property + def credentials(self) -> CredentialList: + warn( + "credentials is deprecated. Use v1.credentials instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.credentials + + @property + def secondary_auth_token(self) -> SecondaryAuthTokenList: + warn( + "secondary_auth_token is deprecated. Use v1.secondary_auth_token instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.secondary_auth_token diff --git a/venv/Lib/site-packages/twilio/rest/accounts/__pycache__/AccountsBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/accounts/__pycache__/AccountsBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a2a32290b8fb98cb63c121e0d618336344f6d7e GIT binary patch literal 1999 zcmahK-*4MQ`0O~2lcqnmv9;5t=|;DqJS(`B+G=%;Thje8VWN#6WZRDUDaui4Pl%`r!6@h2GOjE0A64$(JQ?Ka~&w9D0 zQ8N^zqT9&PH;|K~+HNMcSIc*eQr`MeL8yT7a>EU=9XJ#}utK~_eab9O9lX*7CLshL zJQxUqL;#6*c{qMdq++g+kAG4Ntm3|S(?^~q1q5RbA%ZE70toHCDHJ3|NJU_Yk(gXb z&62*`2*K;16w`h7)BTg-+S)?_(9o5e8}8V`{)sjbYF3l-9!h56{uurp{tfMy)Q*C zO$8Pcf&T??sKXL-mZ$`c}6L`W#o#CZLUd27b}BBU%dKUr8r^E~i&pmVMt^rJ)%+uP_?&N*YlmjapQ=-0HF-cRc>npu%bVIGV-NT!(&GZzaOHMA9*M~89WVL``*PostF3~rj^buptY=oqxs z5*KnPd63~}mfdiD`o9{z6E~LS1uCcc%sxfzEePXq!Z3`&BO%9zASS;f^#o!agcvse)iOGsGA!lq#V57;< z+tl+2DJg6ms4~b8WLKCW3<+>bFs=c3y@3W=E_-FCvyWgKoJ9KAK-IHTPj0?Mu7&buwwUu9wvqm#*GDTAH_&Dg6LuQ$exxKy+35*)?cg#sC56h--4%`4je8Kj*56J36R UF1$cjUg>9*=_l9r5p2@Rzj%NHlmGw# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/accounts/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/accounts/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0340a0c7f0a9fe5307dd31d811c1cfc426c11e6 GIT binary patch literal 1887 zcmcgsOK;Oa5MDpxI3cA4LV1WsXa!Q#l8Orl1W1KSfItONUa}&Lv6o`%*kN~*DisF~ zJ%EG+xAGSd{1YyP3zbDrz=2yK^wJYEwvz^MBu=&D+1Z)dncZ(5?*|6*1ilv^?>&5_ z67mH%oiCFx?OVVs5r;UEM{1HGNyy8dTvH4s;uTM=WsFS3tDaWN8rg`?czP{oH7DOBez=EGW;wC$kb3x3Yx6!ycD4e{_sFh~7sET{#- z4g4!E7ogdGo>7PT!nM3aGCV`=z;`Ux>K;Ok9mk7l5}dTBVZTHuF(ii=GF2Rjst;sG zUR2*E_C_X>Y9Lj5r0@i=)j_KENOP@BSqt^f?L&=G(O|wU^#n&iF@F0xkR>9zI!6+6 z$Ig-8bs>_-6Y>bs^7r>h`&&ZD3@NMA3l}Yb%M^&0S?>T=a(T(2bw+JVP^VJ5$!V#1 zqLOavb3rYq@*OYqMhf#>SoWMpo75|-3~wLqoJxE_E^b5CTz@u{nMUa6mESk99r44cRj1- z@@siARD3!AeE!qm*oVQfWqqs-hGeVrchc?_HSd$QKP-}Lu>#zc4FE}!#0F6?1SH(n zbAasxNt_B+M2o#Z7K&ZedQ5krWe-?W>0pg~7#vyFN7yi!Z#7sKd8gma&C=_GTDs|f zz*kH=`45i!5y#EyOFMG_OxSKDh}CpCAL^#*TQzE$Vcs-rfz$AiFPP@zhUFz19lE$q znP@Sb9#NGu?EWZoEQ=h*eiM6*lbS;*68!lLkVUeR8Ca9G%=q%L(?1EUZG~vtBgxuO z!i~PZi>lGCYP75R^Vkn`6ulyfGF{#l>Nvh(5b$_J9Esbtg6&%Av}>hPW;ogzj8NDaK1c))YySR>{6^ Z AuthTokenPromotionList: + if self._auth_token_promotion is None: + self._auth_token_promotion = AuthTokenPromotionList(self) + return self._auth_token_promotion + + @property + def bulk_consents(self) -> BulkConsentsList: + if self._bulk_consents is None: + self._bulk_consents = BulkConsentsList(self) + return self._bulk_consents + + @property + def bulk_contacts(self) -> BulkContactsList: + if self._bulk_contacts is None: + self._bulk_contacts = BulkContactsList(self) + return self._bulk_contacts + + @property + def credentials(self) -> CredentialList: + if self._credentials is None: + self._credentials = CredentialList(self) + return self._credentials + + @property + def safelist(self) -> SafelistList: + if self._safelist is None: + self._safelist = SafelistList(self) + return self._safelist + + @property + def secondary_auth_token(self) -> SecondaryAuthTokenList: + if self._secondary_auth_token is None: + self._secondary_auth_token = SecondaryAuthTokenList(self) + return self._secondary_auth_token + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54d27eeef4d162c8e743fc89d2bb862238b01e8e GIT binary patch literal 4022 zcmc&$&2Jl35P$2hY;4B~N!s#}rY~+2v_Ndammn&Ew5du(Nf8M-7{g<;`_e33d(H0J zU@Jm7L?T5+oKSP*NYx7m{s1J7TpU_NwKNhEC&VQXDi9}T-hR{}iQq&x&g{%@X5QO* zZ)V>6rl%)O;JNbc+si*>2>A(x@JR;D&PTvpB|0e)UD9KwREd>h67q2~UP+V^f=`&q zN~)9+eA4Wy$R%0uDYLthE~N$EWo9bbQdaP?*;C1ta)R$Rdn1$ zS)ymwh@Rz%>v8{EN(0RvC8z!(5t63x%r6@b)hwOU_f&^oznfmMeIj)QKDiCI@DU5WkxMge|c;%gW~M2JXm%9S!8KF3%QxnK|}_YBjp=s2C$G^<{99UsNTgP*(1 zX|29!8XBGV4PQGmH&3TuJy-DEXD`g3nGDw2R2|`@)?I7Yg3}8%UIia|*53uoE{Iu{ zUAN{;7K;|B)tWILY!awlt}P3b8H-jemvY^3#m8u3l8RcbtESm3q<_ZES0qoqP;(8d zs+z!eEpXcb0oc@xRZ$J(4o}zJ<$3E8ufA$q6$_2e8;%Q_zEgGc(rK&eaESgNn5$|L zmOE{89c&EM46L$q>Jm3$lt4Z_$2F^}t9CP*3^kgcpgs+8@`q46oRlP}pO`N3 z_)=`0EI}QuWlIU3)Z;w06w?!HiR-}#r7nTWfF?W8Zh@u&O?99dfo1{i>Ogx0ngdks zKzjw+2WWQ(dLMj2KVa##L}_51yf2jo=ZKQ=Vha;qN*61u#X5pZ0FUwQw19jnT_tX$ zyc}C0A4Atzk#y;L-~%-cD2qlAQn)_84o4J^(1l&c*QIvpx`mwRAV_CL z1EyrmJH((6mYIt=$7*5Hc{#QS`NkkoM8b8*BH6qw)1o|cyl&+H+xiJNl%*5nkvABx`3Orre2t%;}C6IXJ=>^nKX1H%w6 zWplS~S2gJC(Sxz!|ITYbu96k5)P4x4H@M%{wvNC;?5B7HTy`D?vPyo;^nRZi-OP-(Gvl|F7rsi|P|mE+ z+{}*M>K*vLSJ~`U+OlHfD*m4V+s9x+2zd}*Hdc~NfpiAkvny#^eGus`>Jw547D>SZqvf&?hX1BZp~4#HFUF=wq<(H!aIVI z;hl3&cyibTMXw2kQy5qth$yR1rY=vlGb6W;DxaUYakRKTb7dBy`s9PlAGGD8_bjIS zF&wx(?~Q42ziuvC$bO2Ka0rZbZzKTv%@7aEtE4F@u@;YxC%El247dcVbjdb&RX3Z| z<~3;Q(D_xo1x1#Vexr3J=_{(XY*hKbdb9>l`nSSDczG-=OiW$d8!H@&I4NVnS>X$_ z@VyRpn^m%%CVgWfH02N;p;fiQ;RsDLR^2hNK-u5Duz^Lm0KRO6<}m?GH^0xD|lMbZ21 z9`r;a6kh}L=Nj2gWRvHmjm8~<@9iOy%5BHu$w%5_Cx0XG-ie0@gzD>#w~rN3cRbP^ z|4+J+jknNkByt;x+=e$EL)CDk8je)^en~PpwsHIq0xz-lBC1(s(CcDMw=`Jvl-sNs z)r&SBq~3skBPcAY4le|^C>xW`>+jU~cPFt!-eZ9RFA>oVs?gZ~m=qi6jUME(>%0+L z{O`7+af>AI@&}E3w^fQ9@#sN@Vc!u6bZ}_DO3RO57PD($E%pc#Di~kqcYol=wZrMV1YTm$zX5gi B#0CHW literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/auth_token_promotion.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/auth_token_promotion.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b69eacf2c0c604be10505e63f80c0bcd23bd6f99 GIT binary patch literal 7617 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/bulk_consents.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/bulk_consents.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82885b82583f2a733b312b19e1047ca1a4070196 GIT binary patch literal 7061 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/safelist.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/safelist.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a68abf849420878cd9a4ab46dc1ef9940e3c204c GIT binary patch literal 7854 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 H$oJvjF9tQT literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/secondary_auth_token.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/accounts/v1/__pycache__/secondary_auth_token.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c807318aeb47dd7148b24de232797211c6ffc0df GIT binary patch literal 8934 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/auth_token_promotion.py b/venv/Lib/site-packages/twilio/rest/accounts/v1/auth_token_promotion.py new file mode 100644 index 00000000..8580538a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/accounts/v1/auth_token_promotion.py @@ -0,0 +1,181 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Accounts + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class AuthTokenPromotionInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that the secondary Auth Token was created for. + :ivar auth_token: The promoted Auth Token that must be used to authenticate future API requests. + :ivar date_created: The date and time in UTC when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The URI for this resource, relative to `https://accounts.twilio.com` + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.auth_token: Optional[str] = payload.get("auth_token") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._context: Optional[AuthTokenPromotionContext] = None + + @property + def _proxy(self) -> "AuthTokenPromotionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AuthTokenPromotionContext for this AuthTokenPromotionInstance + """ + if self._context is None: + self._context = AuthTokenPromotionContext( + self._version, + ) + return self._context + + def update(self) -> "AuthTokenPromotionInstance": + """ + Update the AuthTokenPromotionInstance + + + :returns: The updated AuthTokenPromotionInstance + """ + return self._proxy.update() + + async def update_async(self) -> "AuthTokenPromotionInstance": + """ + Asynchronous coroutine to update the AuthTokenPromotionInstance + + + :returns: The updated AuthTokenPromotionInstance + """ + return await self._proxy.update_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class AuthTokenPromotionContext(InstanceContext): + + def __init__(self, version: Version): + """ + Initialize the AuthTokenPromotionContext + + :param version: Version that contains the resource + """ + super().__init__(version) + + self._uri = "/AuthTokens/Promote" + + def update(self) -> AuthTokenPromotionInstance: + """ + Update the AuthTokenPromotionInstance + + + :returns: The updated AuthTokenPromotionInstance + """ + + data = values.of({}) + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthTokenPromotionInstance(self._version, payload) + + async def update_async(self) -> AuthTokenPromotionInstance: + """ + Asynchronous coroutine to update the AuthTokenPromotionInstance + + + :returns: The updated AuthTokenPromotionInstance + """ + + data = values.of({}) + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthTokenPromotionInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class AuthTokenPromotionList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AuthTokenPromotionList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self) -> AuthTokenPromotionContext: + """ + Constructs a AuthTokenPromotionContext + + """ + return AuthTokenPromotionContext(self._version) + + def __call__(self) -> AuthTokenPromotionContext: + """ + Constructs a AuthTokenPromotionContext + + """ + return AuthTokenPromotionContext(self._version) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/bulk_consents.py b/venv/Lib/site-packages/twilio/rest/accounts/v1/bulk_consents.py new file mode 100644 index 00000000..9e242552 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/accounts/v1/bulk_consents.py @@ -0,0 +1,114 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Accounts + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional +from twilio.base import serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class BulkConsentsInstance(InstanceResource): + """ + :ivar items: A list of objects where each object represents the result of processing a `correlation_id`. Each object contains the following fields: `correlation_id`, a unique 32-character UUID that maps the response to the original request; `error_code`, an integer where 0 indicates success and any non-zero value represents an error; and `error_messages`, an array of strings describing specific validation errors encountered. If the request is successful, the error_messages array will be empty. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.items: Optional[Dict[str, object]] = payload.get("items") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class BulkConsentsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the BulkConsentsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Consents/Bulk" + + def create(self, items: List[object]) -> BulkConsentsInstance: + """ + Create the BulkConsentsInstance + + :param items: This is a list of objects that describes a contact's opt-in status. Each object contains the following fields: `contact_id`, which must be a string representing phone number in [E.164 format](https://www.twilio.com/docs/glossary/what-e164); `correlation_id`, a unique 32-character UUID used to uniquely map the request item with the response item; `sender_id`, which can be either a valid messaging service SID or a from phone number; `status`, a string representing the consent status. Can be one of [`opt-in`, `opt-out`]; `source`, a string indicating the medium through which the consent was collected. Can be one of [`website`, `offline`, `opt-in-message`, `opt-out-message`, `others`]; `date_of_consent`, an optional datetime string field in ISO-8601 format that captures the exact date and time when the user gave or revoked consent. If not provided, it will be empty. + + :returns: The created BulkConsentsInstance + """ + + data = values.of( + { + "Items": serialize.map(items, lambda e: serialize.object(e)), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BulkConsentsInstance(self._version, payload) + + async def create_async(self, items: List[object]) -> BulkConsentsInstance: + """ + Asynchronously create the BulkConsentsInstance + + :param items: This is a list of objects that describes a contact's opt-in status. Each object contains the following fields: `contact_id`, which must be a string representing phone number in [E.164 format](https://www.twilio.com/docs/glossary/what-e164); `correlation_id`, a unique 32-character UUID used to uniquely map the request item with the response item; `sender_id`, which can be either a valid messaging service SID or a from phone number; `status`, a string representing the consent status. Can be one of [`opt-in`, `opt-out`]; `source`, a string indicating the medium through which the consent was collected. Can be one of [`website`, `offline`, `opt-in-message`, `opt-out-message`, `others`]; `date_of_consent`, an optional datetime string field in ISO-8601 format that captures the exact date and time when the user gave or revoked consent. If not provided, it will be empty. + + :returns: The created BulkConsentsInstance + """ + + data = values.of( + { + "Items": serialize.map(items, lambda e: serialize.object(e)), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BulkConsentsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/bulk_contacts.py b/venv/Lib/site-packages/twilio/rest/accounts/v1/bulk_contacts.py new file mode 100644 index 00000000..17b6da33 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/accounts/v1/bulk_contacts.py @@ -0,0 +1,114 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Accounts + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional +from twilio.base import serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class BulkContactsInstance(InstanceResource): + """ + :ivar items: A list of objects where each object represents the result of processing a `correlation_id`. Each object contains the following fields: `correlation_id`, a unique 32-character UUID that maps the response to the original request; `error_code`, an integer where 0 indicates success and any non-zero value represents an error; and `error_messages`, an array of strings describing specific validation errors encountered. If the request is successful, the error_messages array will be empty. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.items: Optional[Dict[str, object]] = payload.get("items") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class BulkContactsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the BulkContactsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Contacts/Bulk" + + def create(self, items: List[object]) -> BulkContactsInstance: + """ + Create the BulkContactsInstance + + :param items: A list of objects where each object represents a contact's details. Each object includes the following fields: `contact_id`, which must be a string representing phone number in [E.164 format](https://www.twilio.com/docs/glossary/what-e164); `correlation_id`, a unique 32-character UUID that maps the response to the original request; `country_iso_code`, a string representing the country using the ISO format (e.g., US for the United States); and `zip_code`, a string representing the postal code. + + :returns: The created BulkContactsInstance + """ + + data = values.of( + { + "Items": serialize.map(items, lambda e: serialize.object(e)), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BulkContactsInstance(self._version, payload) + + async def create_async(self, items: List[object]) -> BulkContactsInstance: + """ + Asynchronously create the BulkContactsInstance + + :param items: A list of objects where each object represents a contact's details. Each object includes the following fields: `contact_id`, which must be a string representing phone number in [E.164 format](https://www.twilio.com/docs/glossary/what-e164); `correlation_id`, a unique 32-character UUID that maps the response to the original request; `country_iso_code`, a string representing the country using the ISO format (e.g., US for the United States); and `zip_code`, a string representing the postal code. + + :returns: The created BulkContactsInstance + """ + + data = values.of( + { + "Items": serialize.map(items, lambda e: serialize.object(e)), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BulkContactsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__init__.py b/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__init__.py new file mode 100644 index 00000000..e9c4653f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__init__.py @@ -0,0 +1,65 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Accounts + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.accounts.v1.credential.aws import AwsList +from twilio.rest.accounts.v1.credential.public_key import PublicKeyList + + +class CredentialList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CredentialList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Credentials" + + self._aws: Optional[AwsList] = None + self._public_key: Optional[PublicKeyList] = None + + @property + def aws(self) -> AwsList: + """ + Access the aws + """ + if self._aws is None: + self._aws = AwsList(self._version) + return self._aws + + @property + def public_key(self) -> PublicKeyList: + """ + Access the public_key + """ + if self._public_key is None: + self._public_key = PublicKeyList(self._version) + return self._public_key + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5474e48bc92f28b65ab194a14e536199c5a18e3 GIT binary patch literal 2683 zcmd58O>YxNbk<&f#IchUkVs0}Op8>oXl&6IsThPB5riTjP)Mm{8BI64W3pwv>&~u| z+VUZXNKGUvxK!atPc7omAJR)ws6Z=_kg8UydPy6iB2Im8W^E@xr5?N9ynXY&=FR(> z{FuvS2t3z+`fTpEBq6`xqVpsoWU~y&DzQkJSeg}cv|6kj(-4n4@tR)NC9XS(TC$v! zc*055(&e4M?Y ztK8+n2)IROo5*I2(cTXUNMficzY4sxjHI@SpdD0WOzzsIwB7vy85i(^h~hAY6uCrz zTed4eQ5a)I#3Cb#THQc~gR16-x!5pXc#;jwTbVdnYJauV?PF$EODD~;{Gp9;XtR2IbN=75_b_ATB zuX7i4=xLP&PZZ=Xb3st|OU0rGY@=?EM@a&9z|A=+GU-v*3n;hjKssZ}O=^bQFdU~@ z$o!7U&ud}&d_Ax|*Kh#Op0)kpBKN(9FgdJKm$~qPiRi?Fk6b`=7v#Cl@Fo&WRYVF# z6-72Hu>K0_m6NgtH5;=u98c`rXJvIVGuSpeD9a`#>@S zwB(Xr?q4QfYUS)Dl23&LCk3~-8`y?}euSxc<*XUo<`FuCf1A?)zR^}m&}FW~+T?3! zueNpV`0C zH1f1Wqxgc35kSkifnmF7tGRggGfmg50d$!3Z zptyp{Ja^|SXYJXFZwGw5ZkX4MtK6>yvbKxhZBR6#J}Ax~E}Grk6g%D(>P?Y@{aSl_ z$H2rDIs*HE=^q5}Y>_-2AbkTXsrB^mt-bftZ#~)b_OgDx@5zBf_<8ujhs*lU>ETU~ zC1FzVpdnl{N+Qx^%4OQCuvjH+^0_4M1dFc+-Q%a4bD$f8ZK3HEXqO8S z8Ul|+3c+3k!vMC2Cezbujl2+{9_u~S8V3*s>Oud$_5OWp{rew{z5D&l4_EG7xi@xf zdGdaC6k_#YaBO{WY%M+Za*x8a^NXjRzUwVWmuybjF( z9b@2B?R9TSRjFU1=L~bscKN@m;GDpxwg0%fISQQ%rf~UiVdsfY+<7@bFb>cO#$M5A zig66i;$ws%I9W1uL>@bz!$IO2H4cL$!&uF;8V=%F#=d|%LvaNDKO);WOxFcmKO$(# zauy@VkZHp{4�x#G8oaqH$w#$6+k5iCsXI8U08WyXZqr1Zcwl7{Ie7vY}@aM{lRL z2z)k1NpfH#mQ0M?{PZsZpUrrOurU;2^wv3K(JqT_3?&msZtedYsOp4rkLi3iOfhD8 zCLAppH0!o|Rp1y1N7O7U%o;u~I53zXjOr#7nEY_}c7D{lG92MM5eKJWp)&;w^M?y& zcM2Auc~#qw{|Dh-9jl1S2)zML$V|zoJx?E389E^j0Rv};oDLgtP1F92Wi@?klxU+{ cNus^~m>l?(lpd4QPm>3=BR4Bs1U}N#KiJ2qegFUf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__pycache__/aws.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__pycache__/aws.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8c5b0fc7b2caa1ecaa0713326b0ef9428be21ae GIT binary patch literal 25329 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__pycache__/public_key.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/__pycache__/public_key.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1f319c07bedcc0dca1329a6f0230878948a500c GIT binary patch literal 25761 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 "AwsContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AwsContext for this AwsInstance + """ + if self._context is None: + self._context = AwsContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AwsInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AwsInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AwsInstance": + """ + Fetch the AwsInstance + + + :returns: The fetched AwsInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AwsInstance": + """ + Asynchronous coroutine to fetch the AwsInstance + + + :returns: The fetched AwsInstance + """ + return await self._proxy.fetch_async() + + def update(self, friendly_name: Union[str, object] = values.unset) -> "AwsInstance": + """ + Update the AwsInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated AwsInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + ) + + async def update_async( + self, friendly_name: Union[str, object] = values.unset + ) -> "AwsInstance": + """ + Asynchronous coroutine to update the AwsInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated AwsInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AwsContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the AwsContext + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the AWS resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Credentials/AWS/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the AwsInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AwsInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AwsInstance: + """ + Fetch the AwsInstance + + + :returns: The fetched AwsInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AwsInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AwsInstance: + """ + Asynchronous coroutine to fetch the AwsInstance + + + :returns: The fetched AwsInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AwsInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update(self, friendly_name: Union[str, object] = values.unset) -> AwsInstance: + """ + Update the AwsInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated AwsInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AwsInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, friendly_name: Union[str, object] = values.unset + ) -> AwsInstance: + """ + Asynchronous coroutine to update the AwsInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated AwsInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AwsInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AwsPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AwsInstance: + """ + Build an instance of AwsInstance + + :param payload: Payload response from the API + """ + return AwsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AwsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AwsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Credentials/AWS" + + def create( + self, + credentials: str, + friendly_name: Union[str, object] = values.unset, + account_sid: Union[str, object] = values.unset, + ) -> AwsInstance: + """ + Create the AwsInstance + + :param credentials: A string that contains the AWS access credentials in the format `:`. For example, `AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param account_sid: The SID of the Subaccount that this Credential should be associated with. Must be a valid Subaccount of the account issuing the request. + + :returns: The created AwsInstance + """ + + data = values.of( + { + "Credentials": credentials, + "FriendlyName": friendly_name, + "AccountSid": account_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AwsInstance(self._version, payload) + + async def create_async( + self, + credentials: str, + friendly_name: Union[str, object] = values.unset, + account_sid: Union[str, object] = values.unset, + ) -> AwsInstance: + """ + Asynchronously create the AwsInstance + + :param credentials: A string that contains the AWS access credentials in the format `:`. For example, `AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param account_sid: The SID of the Subaccount that this Credential should be associated with. Must be a valid Subaccount of the account issuing the request. + + :returns: The created AwsInstance + """ + + data = values.of( + { + "Credentials": credentials, + "FriendlyName": friendly_name, + "AccountSid": account_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AwsInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AwsInstance]: + """ + Streams AwsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AwsInstance]: + """ + Asynchronously streams AwsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AwsInstance]: + """ + Lists AwsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AwsInstance]: + """ + Asynchronously lists AwsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AwsPage: + """ + Retrieve a single page of AwsInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AwsInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AwsPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AwsPage: + """ + Asynchronously retrieve a single page of AwsInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AwsInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AwsPage(self._version, response) + + def get_page(self, target_url: str) -> AwsPage: + """ + Retrieve a specific page of AwsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AwsInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AwsPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AwsPage: + """ + Asynchronously retrieve a specific page of AwsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AwsInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AwsPage(self._version, response) + + def get(self, sid: str) -> AwsContext: + """ + Constructs a AwsContext + + :param sid: The Twilio-provided string that uniquely identifies the AWS resource to update. + """ + return AwsContext(self._version, sid=sid) + + def __call__(self, sid: str) -> AwsContext: + """ + Constructs a AwsContext + + :param sid: The Twilio-provided string that uniquely identifies the AWS resource to update. + """ + return AwsContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/public_key.py b/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/public_key.py new file mode 100644 index 00000000..c2b4f9bb --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/accounts/v1/credential/public_key.py @@ -0,0 +1,613 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Accounts + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class PublicKeyInstance(InstanceResource): + """ + :ivar sid: The unique string that that we created to identify the PublicKey resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Credential that the PublicKey resource belongs to. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT when the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar url: The URI for this resource, relative to `https://accounts.twilio.com` + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[PublicKeyContext] = None + + @property + def _proxy(self) -> "PublicKeyContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PublicKeyContext for this PublicKeyInstance + """ + if self._context is None: + self._context = PublicKeyContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the PublicKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PublicKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "PublicKeyInstance": + """ + Fetch the PublicKeyInstance + + + :returns: The fetched PublicKeyInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "PublicKeyInstance": + """ + Asynchronous coroutine to fetch the PublicKeyInstance + + + :returns: The fetched PublicKeyInstance + """ + return await self._proxy.fetch_async() + + def update( + self, friendly_name: Union[str, object] = values.unset + ) -> "PublicKeyInstance": + """ + Update the PublicKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated PublicKeyInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + ) + + async def update_async( + self, friendly_name: Union[str, object] = values.unset + ) -> "PublicKeyInstance": + """ + Asynchronous coroutine to update the PublicKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated PublicKeyInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PublicKeyContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the PublicKeyContext + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the PublicKey resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Credentials/PublicKeys/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the PublicKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PublicKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> PublicKeyInstance: + """ + Fetch the PublicKeyInstance + + + :returns: The fetched PublicKeyInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return PublicKeyInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> PublicKeyInstance: + """ + Asynchronous coroutine to fetch the PublicKeyInstance + + + :returns: The fetched PublicKeyInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return PublicKeyInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, friendly_name: Union[str, object] = values.unset + ) -> PublicKeyInstance: + """ + Update the PublicKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated PublicKeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PublicKeyInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, friendly_name: Union[str, object] = values.unset + ) -> PublicKeyInstance: + """ + Asynchronous coroutine to update the PublicKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated PublicKeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PublicKeyInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PublicKeyPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> PublicKeyInstance: + """ + Build an instance of PublicKeyInstance + + :param payload: Payload response from the API + """ + return PublicKeyInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class PublicKeyList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PublicKeyList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Credentials/PublicKeys" + + def create( + self, + public_key: str, + friendly_name: Union[str, object] = values.unset, + account_sid: Union[str, object] = values.unset, + ) -> PublicKeyInstance: + """ + Create the PublicKeyInstance + + :param public_key: A URL encoded representation of the public key. For example, `-----BEGIN PUBLIC KEY-----MIIBIjANB.pa9xQIDAQAB-----END PUBLIC KEY-----` + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param account_sid: The SID of the Subaccount that this Credential should be associated with. Must be a valid Subaccount of the account issuing the request + + :returns: The created PublicKeyInstance + """ + + data = values.of( + { + "PublicKey": public_key, + "FriendlyName": friendly_name, + "AccountSid": account_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PublicKeyInstance(self._version, payload) + + async def create_async( + self, + public_key: str, + friendly_name: Union[str, object] = values.unset, + account_sid: Union[str, object] = values.unset, + ) -> PublicKeyInstance: + """ + Asynchronously create the PublicKeyInstance + + :param public_key: A URL encoded representation of the public key. For example, `-----BEGIN PUBLIC KEY-----MIIBIjANB.pa9xQIDAQAB-----END PUBLIC KEY-----` + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param account_sid: The SID of the Subaccount that this Credential should be associated with. Must be a valid Subaccount of the account issuing the request + + :returns: The created PublicKeyInstance + """ + + data = values.of( + { + "PublicKey": public_key, + "FriendlyName": friendly_name, + "AccountSid": account_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PublicKeyInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[PublicKeyInstance]: + """ + Streams PublicKeyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[PublicKeyInstance]: + """ + Asynchronously streams PublicKeyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PublicKeyInstance]: + """ + Lists PublicKeyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PublicKeyInstance]: + """ + Asynchronously lists PublicKeyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PublicKeyPage: + """ + Retrieve a single page of PublicKeyInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PublicKeyInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PublicKeyPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PublicKeyPage: + """ + Asynchronously retrieve a single page of PublicKeyInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PublicKeyInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PublicKeyPage(self._version, response) + + def get_page(self, target_url: str) -> PublicKeyPage: + """ + Retrieve a specific page of PublicKeyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PublicKeyInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return PublicKeyPage(self._version, response) + + async def get_page_async(self, target_url: str) -> PublicKeyPage: + """ + Asynchronously retrieve a specific page of PublicKeyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PublicKeyInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return PublicKeyPage(self._version, response) + + def get(self, sid: str) -> PublicKeyContext: + """ + Constructs a PublicKeyContext + + :param sid: The Twilio-provided string that uniquely identifies the PublicKey resource to update. + """ + return PublicKeyContext(self._version, sid=sid) + + def __call__(self, sid: str) -> PublicKeyContext: + """ + Constructs a PublicKeyContext + + :param sid: The Twilio-provided string that uniquely identifies the PublicKey resource to update. + """ + return PublicKeyContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/safelist.py b/venv/Lib/site-packages/twilio/rest/accounts/v1/safelist.py new file mode 100644 index 00000000..be8fe416 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/accounts/v1/safelist.py @@ -0,0 +1,204 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Accounts + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class SafelistInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the SafeList resource. + :ivar phone_number: The phone number or phone number 1k prefix in SafeList. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.phone_number: Optional[str] = payload.get("phone_number") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class SafelistList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SafelistList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/SafeList/Numbers" + + def create(self, phone_number: str) -> SafelistInstance: + """ + Create the SafelistInstance + + :param phone_number: The phone number or phone number 1k prefix to be added in SafeList. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + + :returns: The created SafelistInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SafelistInstance(self._version, payload) + + async def create_async(self, phone_number: str) -> SafelistInstance: + """ + Asynchronously create the SafelistInstance + + :param phone_number: The phone number or phone number 1k prefix to be added in SafeList. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + + :returns: The created SafelistInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SafelistInstance(self._version, payload) + + def delete(self, phone_number: Union[str, object] = values.unset) -> bool: + """ + Asynchronously delete the SafelistInstance + + :param phone_number: The phone number or phone number 1k prefix to be removed from SafeList. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + :returns: True if delete succeeds, False otherwise + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + params = values.of( + { + "PhoneNumber": phone_number, + } + ) + return self._version.delete( + method="DELETE", uri=self._uri, headers=headers, params=params + ) + + async def delete_async( + self, phone_number: Union[str, object] = values.unset + ) -> bool: + """ + Asynchronously delete the SafelistInstance + + :param phone_number: The phone number or phone number 1k prefix to be removed from SafeList. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + :returns: True if delete succeeds, False otherwise + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + params = values.of( + { + "PhoneNumber": phone_number, + } + ) + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers, params=params + ) + + def fetch( + self, phone_number: Union[str, object] = values.unset + ) -> SafelistInstance: + """ + Asynchronously fetch the SafelistInstance + + :param phone_number: The phone number or phone number 1k prefix to be fetched from SafeList. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + :returns: The fetched SafelistInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + params = values.of( + { + "PhoneNumber": phone_number, + } + ) + + payload = self._version.fetch( + method="GET", uri=self._uri, headers=headers, params=params + ) + + return SafelistInstance(self._version, payload) + + async def fetch_async( + self, phone_number: Union[str, object] = values.unset + ) -> SafelistInstance: + """ + Asynchronously fetch the SafelistInstance + + :param phone_number: The phone number or phone number 1k prefix to be fetched from SafeList. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + :returns: The fetched SafelistInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + params = values.of( + { + "PhoneNumber": phone_number, + } + ) + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers, params=params + ) + + return SafelistInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/accounts/v1/secondary_auth_token.py b/venv/Lib/site-packages/twilio/rest/accounts/v1/secondary_auth_token.py new file mode 100644 index 00000000..f5e2b5c1 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/accounts/v1/secondary_auth_token.py @@ -0,0 +1,215 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Accounts + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class SecondaryAuthTokenInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that the secondary Auth Token was created for. + :ivar date_created: The date and time in UTC when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in UTC when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar secondary_auth_token: The generated secondary Auth Token that can be used to authenticate future API requests. + :ivar url: The URI for this resource, relative to `https://accounts.twilio.com` + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.secondary_auth_token: Optional[str] = payload.get("secondary_auth_token") + self.url: Optional[str] = payload.get("url") + + self._context: Optional[SecondaryAuthTokenContext] = None + + @property + def _proxy(self) -> "SecondaryAuthTokenContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SecondaryAuthTokenContext for this SecondaryAuthTokenInstance + """ + if self._context is None: + self._context = SecondaryAuthTokenContext( + self._version, + ) + return self._context + + def create(self) -> "SecondaryAuthTokenInstance": + """ + Create the SecondaryAuthTokenInstance + + + :returns: The created SecondaryAuthTokenInstance + """ + return self._proxy.create() + + async def create_async(self) -> "SecondaryAuthTokenInstance": + """ + Asynchronous coroutine to create the SecondaryAuthTokenInstance + + + :returns: The created SecondaryAuthTokenInstance + """ + return await self._proxy.create_async() + + def delete(self) -> bool: + """ + Deletes the SecondaryAuthTokenInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SecondaryAuthTokenInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class SecondaryAuthTokenContext(InstanceContext): + + def __init__(self, version: Version): + """ + Initialize the SecondaryAuthTokenContext + + :param version: Version that contains the resource + """ + super().__init__(version) + + self._uri = "/AuthTokens/Secondary" + + def create(self) -> SecondaryAuthTokenInstance: + """ + Create the SecondaryAuthTokenInstance + + + :returns: The created SecondaryAuthTokenInstance + """ + data = values.of({}) + + payload = self._version.create(method="POST", uri=self._uri, data=data) + + return SecondaryAuthTokenInstance(self._version, payload) + + async def create_async(self) -> SecondaryAuthTokenInstance: + """ + Asynchronous coroutine to create the SecondaryAuthTokenInstance + + + :returns: The created SecondaryAuthTokenInstance + """ + data = values.of({}) + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data + ) + + return SecondaryAuthTokenInstance(self._version, payload) + + def delete(self) -> bool: + """ + Deletes the SecondaryAuthTokenInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SecondaryAuthTokenInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class SecondaryAuthTokenList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SecondaryAuthTokenList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self) -> SecondaryAuthTokenContext: + """ + Constructs a SecondaryAuthTokenContext + + """ + return SecondaryAuthTokenContext(self._version) + + def __call__(self) -> SecondaryAuthTokenContext: + """ + Constructs a SecondaryAuthTokenContext + + """ + return SecondaryAuthTokenContext(self._version) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/ApiBase.py b/venv/Lib/site-packages/twilio/rest/api/ApiBase.py new file mode 100644 index 00000000..e53535ab --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/ApiBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.api.v2010 import V2010 + + +class ApiBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Api Domain + + :returns: Domain for Api + """ + super().__init__(twilio, "https://api.twilio.com") + self._v2010: Optional[V2010] = None + + @property + def v2010(self) -> V2010: + """ + :returns: Versions v2010 of Api + """ + if self._v2010 is None: + self._v2010 = V2010(self) + return self._v2010 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/__init__.py b/venv/Lib/site-packages/twilio/rest/api/__init__.py new file mode 100644 index 00000000..08d5885c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/__init__.py @@ -0,0 +1,258 @@ +from warnings import warn + +from twilio.rest.api.ApiBase import ApiBase +from twilio.rest.api.v2010.account import AccountContext, AccountList +from twilio.rest.api.v2010.account.address import AddressList +from twilio.rest.api.v2010.account.application import ApplicationList +from twilio.rest.api.v2010.account.authorized_connect_app import ( + AuthorizedConnectAppList, +) +from twilio.rest.api.v2010.account.available_phone_number_country import ( + AvailablePhoneNumberCountryList, +) +from twilio.rest.api.v2010.account.balance import BalanceList +from twilio.rest.api.v2010.account.call import CallList +from twilio.rest.api.v2010.account.conference import ConferenceList +from twilio.rest.api.v2010.account.connect_app import ConnectAppList +from twilio.rest.api.v2010.account.incoming_phone_number import IncomingPhoneNumberList +from twilio.rest.api.v2010.account.key import KeyList +from twilio.rest.api.v2010.account.message import MessageList +from twilio.rest.api.v2010.account.new_key import NewKeyList +from twilio.rest.api.v2010.account.new_signing_key import NewSigningKeyList +from twilio.rest.api.v2010.account.notification import NotificationList +from twilio.rest.api.v2010.account.outgoing_caller_id import OutgoingCallerIdList +from twilio.rest.api.v2010.account.queue import QueueList +from twilio.rest.api.v2010.account.recording import RecordingList +from twilio.rest.api.v2010.account.short_code import ShortCodeList +from twilio.rest.api.v2010.account.signing_key import SigningKeyList +from twilio.rest.api.v2010.account.sip import SipList +from twilio.rest.api.v2010.account.token import TokenList +from twilio.rest.api.v2010.account.transcription import TranscriptionList +from twilio.rest.api.v2010.account.usage import UsageList +from twilio.rest.api.v2010.account.validation_request import ValidationRequestList + + +class Api(ApiBase): + @property + def account(self) -> AccountContext: + return self.v2010.account + + @property + def accounts(self) -> AccountList: + return self.v2010.accounts + + @property + def addresses(self) -> AddressList: + warn( + "addresses is deprecated. Use account.addresses instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.addresses + + @property + def applications(self) -> ApplicationList: + warn( + "applications is deprecated. Use account.applications instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.applications + + @property + def authorized_connect_apps(self) -> AuthorizedConnectAppList: + warn( + "authorized_connect_apps is deprecated. Use account.authorized_connect_apps instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.authorized_connect_apps + + @property + def available_phone_numbers(self) -> AvailablePhoneNumberCountryList: + warn( + "available_phone_numbers is deprecated. Use account.available_phone_numbers instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.available_phone_numbers + + @property + def balance(self) -> BalanceList: + warn( + "balance is deprecated. Use account.balance instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.balance + + @property + def calls(self) -> CallList: + warn( + "calls is deprecated. Use account.calls instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.calls + + @property + def conferences(self) -> ConferenceList: + warn( + "conferences is deprecated. Use account.conferences instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.conferences + + @property + def connect_apps(self) -> ConnectAppList: + warn( + "connect_apps is deprecated. Use account.connect_apps instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.connect_apps + + @property + def incoming_phone_numbers(self) -> IncomingPhoneNumberList: + warn( + "incoming_phone_numbers is deprecated. Use account.incoming_phone_numbers instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.incoming_phone_numbers + + @property + def keys(self) -> KeyList: + warn( + "keys is deprecated. Use account.keys instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.keys + + @property + def messages(self) -> MessageList: + warn( + "messages is deprecated. Use account.messages instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.messages + + @property + def new_keys(self) -> NewKeyList: + warn( + "new_keys is deprecated. Use account.new_keys instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.new_keys + + @property + def new_signing_keys(self) -> NewSigningKeyList: + warn( + "new_signing_keys is deprecated. Use account.new_signing_keys instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.new_signing_keys + + @property + def notifications(self) -> NotificationList: + warn( + "notifications is deprecated. Use account.notifications instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.notifications + + @property + def outgoing_caller_ids(self) -> OutgoingCallerIdList: + warn( + "outgoing_caller_ids is deprecated. Use account.outgoing_caller_ids instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.outgoing_caller_ids + + @property + def queues(self) -> QueueList: + warn( + "queues is deprecated. Use account.queues instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.queues + + @property + def recordings(self) -> RecordingList: + warn( + "recordings is deprecated. Use account.recordings instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.recordings + + @property + def signing_keys(self) -> SigningKeyList: + warn( + "signing_keys is deprecated. Use account.signing_keys instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.signing_keys + + @property + def sip(self) -> SipList: + warn( + "sip is deprecated. Use account.sip instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.sip + + @property + def short_codes(self) -> ShortCodeList: + warn( + "short_codes is deprecated. Use account.short_codes instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.short_codes + + @property + def tokens(self) -> TokenList: + warn( + "tokens is deprecated. Use account.tokens instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.tokens + + @property + def transcriptions(self) -> TranscriptionList: + warn( + "transcriptions is deprecated. Use account.transcriptions instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.transcriptions + + @property + def usage(self) -> UsageList: + warn( + "usage is deprecated. Use account.usage instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.usage + + @property + def validation_requests(self) -> ValidationRequestList: + warn( + "validation_requests is deprecated. Use account.validation_requests instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.account.validation_requests diff --git a/venv/Lib/site-packages/twilio/rest/api/__pycache__/ApiBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/__pycache__/ApiBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1eff59a88d618611ef5ad78e0b3ab3c0c3727ccd GIT binary patch literal 1958 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 XxZEXq=Re_OTVU<8`KJQ@QsVs|t~eKx literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/__init__.py new file mode 100644 index 00000000..2efb4ff3 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/__init__.py @@ -0,0 +1,59 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.api.v2010.account import AccountList +from twilio.rest.api.v2010.account import AccountContext + + +class V2010(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V2010 version of Api + + :param domain: The Twilio.api domain + """ + super().__init__(domain, "2010-04-01") + self._accounts: Optional[AccountList] = None + self._account: Optional[AccountContext] = None + + @property + def accounts(self) -> AccountList: + if self._accounts is None: + self._accounts = AccountList(self) + return self._accounts + + @property + def account(self) -> AccountContext: + if self._account is None: + self._account = AccountContext(self, self.domain.twilio.account_sid) + return self._account + + @account.setter + def account(self, value: AccountContext) -> None: + """ + Setter to override account + :param value: value to use as account + """ + self._account = value + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e626f8e9f9fe9e1d54891e951405dcaf62a0a751 GIT binary patch literal 2784 zcma)7-ER{|5Z|-U_SudNg@{s-prr+YTg6ULN~;K>rU^o*kRXyG)pEIBd>eA%>~r_d z0Y?U}pv5!T0p-=rI`VvYd(1}QuDpl&6OF%_Db!PW`n50#EwsvP{W@qQ) zH@iP&GARPz?VrDx%_a!>4HxY%77$xSAXbSUvb#E~XmET*~-eAtXiNo0_#;T6RoEuNf}A z!m5lL9y9551I4WuVoef_8A5u8UKfls3a3uyFx@P>~W{M~+zH zfJZh$=$7mx~!NOmE#t2f1FsT$~kacL5j(Op=6jsqT8YTKn0&yfGNekmo>bj`9Y zhxXBtnk5;SH~4$AjMnPYwpFH6Qs?67$tgN=;cQ;+9G{pvJrtzbHe9jEsC&+9xuz2} zR)szEj4Xh|^Wv0Q&#SpZg@OZOqh|F5^#QTR%Ckac%%N4sqs+8C;Y?W^QZcG^!?qjw z)E`*)oZ@Q}HP3RYh7EM$65}o`fQ*kh6~jU*JyI?^^{RKyay?jPgXO4G_1JZw$%0LU1+U#yYr3mYnPE zJVerFoM~p%Ow6dJ)~OA4(_kUFq!zoD$#tcenIyTCAG>tCf1uxwnjrp}B&O{hFnGq_Qq(nW*@3!syS5(n&1c_D=X_4N<-^$(2aR6pj{YmEDvu3K=X zuKP*dkacr`8IZZCue!{h;ds@6hAu#%>n{3F>Eg@JMu$qDy5L{wle1^1N@L8u>N&O2 zyknKw2!PBh&9mx!>6|rPaxIVb)r|60;|g<2p1^p4GuJDCw}pB1uF!TSUu*CT9I=oU z8OXQ!`+?`a4a18?@~n#_vnz=Q+WxhD-}U^We7 zv_SbD7=5js=yrJRHAW`FTO_}xcikOc8Qw@AdeVFB`|gLm`Q@?OjRDIx!2eHD_&(T>i}77Bad@qWL{wbD zz)uGm&|S;qZ-TfpU5P-rkda^rmd8+S5C)m7Q!A%7()3BsyWbDq@BZ%n>Xw_8-K04u}=j$uvCynr8B&Sl8Y=9!=9RC zp2s+aJJ^99y{5#PBav2sDe3ghmSm@;i?#v7C=?u46)wCOwvl=ufbg+T9eW*Dk z8_FG`=Z*5LRb~IVV`0xp`Jm$#WCwP(p|d#B|KPC!ts3(7m2UcIJ|w_Ylx=gc#%jPVn+SAD=O(n zU61oa$jJnEU76Xou0vVg0IopgN1};&5-s3>$ab&6@M4LyR4w+w+Wd0@Q>&ZAv#m%p zc5v;zrv#?0Xqy3XNKx`q%6oVM|9%V=N^Tj6;%}F&q$Y|KJOt)&n7v# ZNseri_czIh&*Ddv!^>x$6PSddzX8a-mRSG* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/__init__.py new file mode 100644 index 00000000..7c7e2c10 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/__init__.py @@ -0,0 +1,1136 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.address import AddressList +from twilio.rest.api.v2010.account.application import ApplicationList +from twilio.rest.api.v2010.account.authorized_connect_app import ( + AuthorizedConnectAppList, +) +from twilio.rest.api.v2010.account.available_phone_number_country import ( + AvailablePhoneNumberCountryList, +) +from twilio.rest.api.v2010.account.balance import BalanceList +from twilio.rest.api.v2010.account.call import CallList +from twilio.rest.api.v2010.account.conference import ConferenceList +from twilio.rest.api.v2010.account.connect_app import ConnectAppList +from twilio.rest.api.v2010.account.incoming_phone_number import IncomingPhoneNumberList +from twilio.rest.api.v2010.account.key import KeyList +from twilio.rest.api.v2010.account.message import MessageList +from twilio.rest.api.v2010.account.new_key import NewKeyList +from twilio.rest.api.v2010.account.new_signing_key import NewSigningKeyList +from twilio.rest.api.v2010.account.notification import NotificationList +from twilio.rest.api.v2010.account.outgoing_caller_id import OutgoingCallerIdList +from twilio.rest.api.v2010.account.queue import QueueList +from twilio.rest.api.v2010.account.recording import RecordingList +from twilio.rest.api.v2010.account.short_code import ShortCodeList +from twilio.rest.api.v2010.account.signing_key import SigningKeyList +from twilio.rest.api.v2010.account.sip import SipList +from twilio.rest.api.v2010.account.token import TokenList +from twilio.rest.api.v2010.account.transcription import TranscriptionList +from twilio.rest.api.v2010.account.usage import UsageList +from twilio.rest.api.v2010.account.validation_request import ValidationRequestList + + +class AccountInstance(InstanceResource): + + class Status(object): + ACTIVE = "active" + SUSPENDED = "suspended" + CLOSED = "closed" + + class Type(object): + TRIAL = "Trial" + FULL = "Full" + + """ + :ivar auth_token: The authorization token for this account. This token should be kept a secret, so no sharing. + :ivar date_created: The date that this account was created, in GMT in RFC 2822 format + :ivar date_updated: The date that this account was last updated, in GMT in RFC 2822 format. + :ivar friendly_name: A human readable description of this account, up to 64 characters long. By default the FriendlyName is your email address. + :ivar owner_account_sid: The unique 34 character id that represents the parent of this account. The OwnerAccountSid of a parent account is it's own sid. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar status: + :ivar subresource_uris: A Map of various subresources available for the given Account Instance + :ivar type: + :ivar uri: The URI for this resource, relative to `https://api.twilio.com` + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.auth_token: Optional[str] = payload.get("auth_token") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.owner_account_sid: Optional[str] = payload.get("owner_account_sid") + self.sid: Optional[str] = payload.get("sid") + self.status: Optional["AccountInstance.Status"] = payload.get("status") + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.type: Optional["AccountInstance.Type"] = payload.get("type") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[AccountContext] = None + + @property + def _proxy(self) -> "AccountContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AccountContext for this AccountInstance + """ + if self._context is None: + self._context = AccountContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "AccountInstance": + """ + Fetch the AccountInstance + + + :returns: The fetched AccountInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AccountInstance": + """ + Asynchronous coroutine to fetch the AccountInstance + + + :returns: The fetched AccountInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + status: Union["AccountInstance.Status", object] = values.unset, + ) -> "AccountInstance": + """ + Update the AccountInstance + + :param friendly_name: Update the human-readable description of this Account + :param status: + + :returns: The updated AccountInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + status=status, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + status: Union["AccountInstance.Status", object] = values.unset, + ) -> "AccountInstance": + """ + Asynchronous coroutine to update the AccountInstance + + :param friendly_name: Update the human-readable description of this Account + :param status: + + :returns: The updated AccountInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + status=status, + ) + + @property + def addresses(self) -> AddressList: + """ + Access the addresses + """ + return self._proxy.addresses + + @property + def applications(self) -> ApplicationList: + """ + Access the applications + """ + return self._proxy.applications + + @property + def authorized_connect_apps(self) -> AuthorizedConnectAppList: + """ + Access the authorized_connect_apps + """ + return self._proxy.authorized_connect_apps + + @property + def available_phone_numbers(self) -> AvailablePhoneNumberCountryList: + """ + Access the available_phone_numbers + """ + return self._proxy.available_phone_numbers + + @property + def balance(self) -> BalanceList: + """ + Access the balance + """ + return self._proxy.balance + + @property + def calls(self) -> CallList: + """ + Access the calls + """ + return self._proxy.calls + + @property + def conferences(self) -> ConferenceList: + """ + Access the conferences + """ + return self._proxy.conferences + + @property + def connect_apps(self) -> ConnectAppList: + """ + Access the connect_apps + """ + return self._proxy.connect_apps + + @property + def incoming_phone_numbers(self) -> IncomingPhoneNumberList: + """ + Access the incoming_phone_numbers + """ + return self._proxy.incoming_phone_numbers + + @property + def keys(self) -> KeyList: + """ + Access the keys + """ + return self._proxy.keys + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + return self._proxy.messages + + @property + def new_keys(self) -> NewKeyList: + """ + Access the new_keys + """ + return self._proxy.new_keys + + @property + def new_signing_keys(self) -> NewSigningKeyList: + """ + Access the new_signing_keys + """ + return self._proxy.new_signing_keys + + @property + def notifications(self) -> NotificationList: + """ + Access the notifications + """ + return self._proxy.notifications + + @property + def outgoing_caller_ids(self) -> OutgoingCallerIdList: + """ + Access the outgoing_caller_ids + """ + return self._proxy.outgoing_caller_ids + + @property + def queues(self) -> QueueList: + """ + Access the queues + """ + return self._proxy.queues + + @property + def recordings(self) -> RecordingList: + """ + Access the recordings + """ + return self._proxy.recordings + + @property + def short_codes(self) -> ShortCodeList: + """ + Access the short_codes + """ + return self._proxy.short_codes + + @property + def signing_keys(self) -> SigningKeyList: + """ + Access the signing_keys + """ + return self._proxy.signing_keys + + @property + def sip(self) -> SipList: + """ + Access the sip + """ + return self._proxy.sip + + @property + def tokens(self) -> TokenList: + """ + Access the tokens + """ + return self._proxy.tokens + + @property + def transcriptions(self) -> TranscriptionList: + """ + Access the transcriptions + """ + return self._proxy.transcriptions + + @property + def usage(self) -> UsageList: + """ + Access the usage + """ + return self._proxy.usage + + @property + def validation_requests(self) -> ValidationRequestList: + """ + Access the validation_requests + """ + return self._proxy.validation_requests + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AccountContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the AccountContext + + :param version: Version that contains the resource + :param sid: The Account Sid that uniquely identifies the account to update + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Accounts/{sid}.json".format(**self._solution) + + self._addresses: Optional[AddressList] = None + self._applications: Optional[ApplicationList] = None + self._authorized_connect_apps: Optional[AuthorizedConnectAppList] = None + self._available_phone_numbers: Optional[AvailablePhoneNumberCountryList] = None + self._balance: Optional[BalanceList] = None + self._calls: Optional[CallList] = None + self._conferences: Optional[ConferenceList] = None + self._connect_apps: Optional[ConnectAppList] = None + self._incoming_phone_numbers: Optional[IncomingPhoneNumberList] = None + self._keys: Optional[KeyList] = None + self._messages: Optional[MessageList] = None + self._new_keys: Optional[NewKeyList] = None + self._new_signing_keys: Optional[NewSigningKeyList] = None + self._notifications: Optional[NotificationList] = None + self._outgoing_caller_ids: Optional[OutgoingCallerIdList] = None + self._queues: Optional[QueueList] = None + self._recordings: Optional[RecordingList] = None + self._short_codes: Optional[ShortCodeList] = None + self._signing_keys: Optional[SigningKeyList] = None + self._sip: Optional[SipList] = None + self._tokens: Optional[TokenList] = None + self._transcriptions: Optional[TranscriptionList] = None + self._usage: Optional[UsageList] = None + self._validation_requests: Optional[ValidationRequestList] = None + + def fetch(self) -> AccountInstance: + """ + Fetch the AccountInstance + + + :returns: The fetched AccountInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AccountInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AccountInstance: + """ + Asynchronous coroutine to fetch the AccountInstance + + + :returns: The fetched AccountInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AccountInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + status: Union["AccountInstance.Status", object] = values.unset, + ) -> AccountInstance: + """ + Update the AccountInstance + + :param friendly_name: Update the human-readable description of this Account + :param status: + + :returns: The updated AccountInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + status: Union["AccountInstance.Status", object] = values.unset, + ) -> AccountInstance: + """ + Asynchronous coroutine to update the AccountInstance + + :param friendly_name: Update the human-readable description of this Account + :param status: + + :returns: The updated AccountInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def addresses(self) -> AddressList: + """ + Access the addresses + """ + if self._addresses is None: + self._addresses = AddressList( + self._version, + self._solution["sid"], + ) + return self._addresses + + @property + def applications(self) -> ApplicationList: + """ + Access the applications + """ + if self._applications is None: + self._applications = ApplicationList( + self._version, + self._solution["sid"], + ) + return self._applications + + @property + def authorized_connect_apps(self) -> AuthorizedConnectAppList: + """ + Access the authorized_connect_apps + """ + if self._authorized_connect_apps is None: + self._authorized_connect_apps = AuthorizedConnectAppList( + self._version, + self._solution["sid"], + ) + return self._authorized_connect_apps + + @property + def available_phone_numbers(self) -> AvailablePhoneNumberCountryList: + """ + Access the available_phone_numbers + """ + if self._available_phone_numbers is None: + self._available_phone_numbers = AvailablePhoneNumberCountryList( + self._version, + self._solution["sid"], + ) + return self._available_phone_numbers + + @property + def balance(self) -> BalanceList: + """ + Access the balance + """ + if self._balance is None: + self._balance = BalanceList( + self._version, + self._solution["sid"], + ) + return self._balance + + @property + def calls(self) -> CallList: + """ + Access the calls + """ + if self._calls is None: + self._calls = CallList( + self._version, + self._solution["sid"], + ) + return self._calls + + @property + def conferences(self) -> ConferenceList: + """ + Access the conferences + """ + if self._conferences is None: + self._conferences = ConferenceList( + self._version, + self._solution["sid"], + ) + return self._conferences + + @property + def connect_apps(self) -> ConnectAppList: + """ + Access the connect_apps + """ + if self._connect_apps is None: + self._connect_apps = ConnectAppList( + self._version, + self._solution["sid"], + ) + return self._connect_apps + + @property + def incoming_phone_numbers(self) -> IncomingPhoneNumberList: + """ + Access the incoming_phone_numbers + """ + if self._incoming_phone_numbers is None: + self._incoming_phone_numbers = IncomingPhoneNumberList( + self._version, + self._solution["sid"], + ) + return self._incoming_phone_numbers + + @property + def keys(self) -> KeyList: + """ + Access the keys + """ + if self._keys is None: + self._keys = KeyList( + self._version, + self._solution["sid"], + ) + return self._keys + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + if self._messages is None: + self._messages = MessageList( + self._version, + self._solution["sid"], + ) + return self._messages + + @property + def new_keys(self) -> NewKeyList: + """ + Access the new_keys + """ + if self._new_keys is None: + self._new_keys = NewKeyList( + self._version, + self._solution["sid"], + ) + return self._new_keys + + @property + def new_signing_keys(self) -> NewSigningKeyList: + """ + Access the new_signing_keys + """ + if self._new_signing_keys is None: + self._new_signing_keys = NewSigningKeyList( + self._version, + self._solution["sid"], + ) + return self._new_signing_keys + + @property + def notifications(self) -> NotificationList: + """ + Access the notifications + """ + if self._notifications is None: + self._notifications = NotificationList( + self._version, + self._solution["sid"], + ) + return self._notifications + + @property + def outgoing_caller_ids(self) -> OutgoingCallerIdList: + """ + Access the outgoing_caller_ids + """ + if self._outgoing_caller_ids is None: + self._outgoing_caller_ids = OutgoingCallerIdList( + self._version, + self._solution["sid"], + ) + return self._outgoing_caller_ids + + @property + def queues(self) -> QueueList: + """ + Access the queues + """ + if self._queues is None: + self._queues = QueueList( + self._version, + self._solution["sid"], + ) + return self._queues + + @property + def recordings(self) -> RecordingList: + """ + Access the recordings + """ + if self._recordings is None: + self._recordings = RecordingList( + self._version, + self._solution["sid"], + ) + return self._recordings + + @property + def short_codes(self) -> ShortCodeList: + """ + Access the short_codes + """ + if self._short_codes is None: + self._short_codes = ShortCodeList( + self._version, + self._solution["sid"], + ) + return self._short_codes + + @property + def signing_keys(self) -> SigningKeyList: + """ + Access the signing_keys + """ + if self._signing_keys is None: + self._signing_keys = SigningKeyList( + self._version, + self._solution["sid"], + ) + return self._signing_keys + + @property + def sip(self) -> SipList: + """ + Access the sip + """ + if self._sip is None: + self._sip = SipList( + self._version, + self._solution["sid"], + ) + return self._sip + + @property + def tokens(self) -> TokenList: + """ + Access the tokens + """ + if self._tokens is None: + self._tokens = TokenList( + self._version, + self._solution["sid"], + ) + return self._tokens + + @property + def transcriptions(self) -> TranscriptionList: + """ + Access the transcriptions + """ + if self._transcriptions is None: + self._transcriptions = TranscriptionList( + self._version, + self._solution["sid"], + ) + return self._transcriptions + + @property + def usage(self) -> UsageList: + """ + Access the usage + """ + if self._usage is None: + self._usage = UsageList( + self._version, + self._solution["sid"], + ) + return self._usage + + @property + def validation_requests(self) -> ValidationRequestList: + """ + Access the validation_requests + """ + if self._validation_requests is None: + self._validation_requests = ValidationRequestList( + self._version, + self._solution["sid"], + ) + return self._validation_requests + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AccountPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AccountInstance: + """ + Build an instance of AccountInstance + + :param payload: Payload response from the API + """ + return AccountInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AccountList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AccountList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Accounts.json" + + def create( + self, friendly_name: Union[str, object] = values.unset + ) -> AccountInstance: + """ + Create the AccountInstance + + :param friendly_name: A human readable description of the account to create, defaults to `SubAccount Created at {YYYY-MM-DD HH:MM meridian}` + + :returns: The created AccountInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountInstance(self._version, payload) + + async def create_async( + self, friendly_name: Union[str, object] = values.unset + ) -> AccountInstance: + """ + Asynchronously create the AccountInstance + + :param friendly_name: A human readable description of the account to create, defaults to `SubAccount Created at {YYYY-MM-DD HH:MM meridian}` + + :returns: The created AccountInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountInstance(self._version, payload) + + def stream( + self, + friendly_name: Union[str, object] = values.unset, + status: Union["AccountInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AccountInstance]: + """ + Streams AccountInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str friendly_name: Only return the Account resources with friendly names that exactly match this name. + :param "AccountInstance.Status" status: Only return Account resources with the given status. Can be `closed`, `suspended` or `active`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + friendly_name=friendly_name, status=status, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + friendly_name: Union[str, object] = values.unset, + status: Union["AccountInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AccountInstance]: + """ + Asynchronously streams AccountInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str friendly_name: Only return the Account resources with friendly names that exactly match this name. + :param "AccountInstance.Status" status: Only return Account resources with the given status. Can be `closed`, `suspended` or `active`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + friendly_name=friendly_name, status=status, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + friendly_name: Union[str, object] = values.unset, + status: Union["AccountInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AccountInstance]: + """ + Lists AccountInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str friendly_name: Only return the Account resources with friendly names that exactly match this name. + :param "AccountInstance.Status" status: Only return Account resources with the given status. Can be `closed`, `suspended` or `active`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + friendly_name=friendly_name, + status=status, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + friendly_name: Union[str, object] = values.unset, + status: Union["AccountInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AccountInstance]: + """ + Asynchronously lists AccountInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str friendly_name: Only return the Account resources with friendly names that exactly match this name. + :param "AccountInstance.Status" status: Only return Account resources with the given status. Can be `closed`, `suspended` or `active`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + friendly_name=friendly_name, + status=status, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + friendly_name: Union[str, object] = values.unset, + status: Union["AccountInstance.Status", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AccountPage: + """ + Retrieve a single page of AccountInstance records from the API. + Request is executed immediately + + :param friendly_name: Only return the Account resources with friendly names that exactly match this name. + :param status: Only return Account resources with the given status. Can be `closed`, `suspended` or `active`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AccountInstance + """ + data = values.of( + { + "FriendlyName": friendly_name, + "Status": status, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AccountPage(self._version, response) + + async def page_async( + self, + friendly_name: Union[str, object] = values.unset, + status: Union["AccountInstance.Status", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AccountPage: + """ + Asynchronously retrieve a single page of AccountInstance records from the API. + Request is executed immediately + + :param friendly_name: Only return the Account resources with friendly names that exactly match this name. + :param status: Only return Account resources with the given status. Can be `closed`, `suspended` or `active`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AccountInstance + """ + data = values.of( + { + "FriendlyName": friendly_name, + "Status": status, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AccountPage(self._version, response) + + def get_page(self, target_url: str) -> AccountPage: + """ + Retrieve a specific page of AccountInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AccountInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AccountPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AccountPage: + """ + Asynchronously retrieve a specific page of AccountInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AccountInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AccountPage(self._version, response) + + def get(self, sid: str) -> AccountContext: + """ + Constructs a AccountContext + + :param sid: The Account Sid that uniquely identifies the account to update + """ + return AccountContext(self._version, sid=sid) + + def __call__(self, sid: str) -> AccountContext: + """ + Constructs a AccountContext + + :param sid: The Account Sid that uniquely identifies the account to update + """ + return AccountContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..946d905b70331ee0f0e4a97e1a238aa463c0e72f GIT binary patch literal 44249 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/balance.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/balance.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f3f7cd74316cc628b4db68581f88e93700584f6 GIT binary patch literal 5146 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/new_key.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/new_key.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6bf7c8cc19052f4bbd63f3ca9e65923e3a77cd7 GIT binary patch literal 6815 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 sz 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 YYELc*SXnqC_KRZjLhO!!Z??cc0anejvj6}9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/transcription.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/transcription.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5f7846b952f1796c1818409894e643ad3fce1e3 GIT binary patch literal 21742 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 RYk6D7iA3$^0=?Np{x8kyX4e1! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/validation_request.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/__pycache__/validation_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..479d5b277279980a4c3eba63bf37c218691bcc23 GIT binary patch literal 9143 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 "AddressContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AddressContext for this AddressInstance + """ + if self._context is None: + self._context = AddressContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AddressInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AddressInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AddressInstance": + """ + Fetch the AddressInstance + + + :returns: The fetched AddressInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AddressInstance": + """ + Asynchronous coroutine to fetch the AddressInstance + + + :returns: The fetched AddressInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + customer_name: Union[str, object] = values.unset, + street: Union[str, object] = values.unset, + city: Union[str, object] = values.unset, + region: Union[str, object] = values.unset, + postal_code: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + auto_correct_address: Union[bool, object] = values.unset, + street_secondary: Union[str, object] = values.unset, + ) -> "AddressInstance": + """ + Update the AddressInstance + + :param friendly_name: A descriptive string that you create to describe the new address. It can be up to 64 characters long for Regulatory Compliance addresses and 32 characters long for Emergency addresses. + :param customer_name: The name to associate with the address. + :param street: The number and street address of the address. + :param city: The city of the address. + :param region: The state or region of the address. + :param postal_code: The postal code of the address. + :param emergency_enabled: Whether to enable emergency calling on the address. Can be: `true` or `false`. + :param auto_correct_address: Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + :param street_secondary: The additional number and street address of the address. + + :returns: The updated AddressInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + customer_name=customer_name, + street=street, + city=city, + region=region, + postal_code=postal_code, + emergency_enabled=emergency_enabled, + auto_correct_address=auto_correct_address, + street_secondary=street_secondary, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + customer_name: Union[str, object] = values.unset, + street: Union[str, object] = values.unset, + city: Union[str, object] = values.unset, + region: Union[str, object] = values.unset, + postal_code: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + auto_correct_address: Union[bool, object] = values.unset, + street_secondary: Union[str, object] = values.unset, + ) -> "AddressInstance": + """ + Asynchronous coroutine to update the AddressInstance + + :param friendly_name: A descriptive string that you create to describe the new address. It can be up to 64 characters long for Regulatory Compliance addresses and 32 characters long for Emergency addresses. + :param customer_name: The name to associate with the address. + :param street: The number and street address of the address. + :param city: The city of the address. + :param region: The state or region of the address. + :param postal_code: The postal code of the address. + :param emergency_enabled: Whether to enable emergency calling on the address. Can be: `true` or `false`. + :param auto_correct_address: Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + :param street_secondary: The additional number and street address of the address. + + :returns: The updated AddressInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + customer_name=customer_name, + street=street, + city=city, + region=region, + postal_code=postal_code, + emergency_enabled=emergency_enabled, + auto_correct_address=auto_correct_address, + street_secondary=street_secondary, + ) + + @property + def dependent_phone_numbers(self) -> DependentPhoneNumberList: + """ + Access the dependent_phone_numbers + """ + return self._proxy.dependent_phone_numbers + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AddressContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the AddressContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that is responsible for the Address resource to update. + :param sid: The Twilio-provided string that uniquely identifies the Address resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Addresses/{sid}.json".format( + **self._solution + ) + + self._dependent_phone_numbers: Optional[DependentPhoneNumberList] = None + + def delete(self) -> bool: + """ + Deletes the AddressInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AddressInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AddressInstance: + """ + Fetch the AddressInstance + + + :returns: The fetched AddressInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AddressInstance: + """ + Asynchronous coroutine to fetch the AddressInstance + + + :returns: The fetched AddressInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + customer_name: Union[str, object] = values.unset, + street: Union[str, object] = values.unset, + city: Union[str, object] = values.unset, + region: Union[str, object] = values.unset, + postal_code: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + auto_correct_address: Union[bool, object] = values.unset, + street_secondary: Union[str, object] = values.unset, + ) -> AddressInstance: + """ + Update the AddressInstance + + :param friendly_name: A descriptive string that you create to describe the new address. It can be up to 64 characters long for Regulatory Compliance addresses and 32 characters long for Emergency addresses. + :param customer_name: The name to associate with the address. + :param street: The number and street address of the address. + :param city: The city of the address. + :param region: The state or region of the address. + :param postal_code: The postal code of the address. + :param emergency_enabled: Whether to enable emergency calling on the address. Can be: `true` or `false`. + :param auto_correct_address: Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + :param street_secondary: The additional number and street address of the address. + + :returns: The updated AddressInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "CustomerName": customer_name, + "Street": street, + "City": city, + "Region": region, + "PostalCode": postal_code, + "EmergencyEnabled": serialize.boolean_to_string(emergency_enabled), + "AutoCorrectAddress": serialize.boolean_to_string(auto_correct_address), + "StreetSecondary": street_secondary, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + customer_name: Union[str, object] = values.unset, + street: Union[str, object] = values.unset, + city: Union[str, object] = values.unset, + region: Union[str, object] = values.unset, + postal_code: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + auto_correct_address: Union[bool, object] = values.unset, + street_secondary: Union[str, object] = values.unset, + ) -> AddressInstance: + """ + Asynchronous coroutine to update the AddressInstance + + :param friendly_name: A descriptive string that you create to describe the new address. It can be up to 64 characters long for Regulatory Compliance addresses and 32 characters long for Emergency addresses. + :param customer_name: The name to associate with the address. + :param street: The number and street address of the address. + :param city: The city of the address. + :param region: The state or region of the address. + :param postal_code: The postal code of the address. + :param emergency_enabled: Whether to enable emergency calling on the address. Can be: `true` or `false`. + :param auto_correct_address: Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + :param street_secondary: The additional number and street address of the address. + + :returns: The updated AddressInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "CustomerName": customer_name, + "Street": street, + "City": city, + "Region": region, + "PostalCode": postal_code, + "EmergencyEnabled": serialize.boolean_to_string(emergency_enabled), + "AutoCorrectAddress": serialize.boolean_to_string(auto_correct_address), + "StreetSecondary": street_secondary, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + @property + def dependent_phone_numbers(self) -> DependentPhoneNumberList: + """ + Access the dependent_phone_numbers + """ + if self._dependent_phone_numbers is None: + self._dependent_phone_numbers = DependentPhoneNumberList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._dependent_phone_numbers + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AddressPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AddressInstance: + """ + Build an instance of AddressInstance + + :param payload: Payload response from the API + """ + return AddressInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AddressList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the AddressList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that is responsible for the Address resource to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Addresses.json".format(**self._solution) + + def create( + self, + customer_name: str, + street: str, + city: str, + region: str, + postal_code: str, + iso_country: str, + friendly_name: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + auto_correct_address: Union[bool, object] = values.unset, + street_secondary: Union[str, object] = values.unset, + ) -> AddressInstance: + """ + Create the AddressInstance + + :param customer_name: The name to associate with the new address. + :param street: The number and street address of the new address. + :param city: The city of the new address. + :param region: The state or region of the new address. + :param postal_code: The postal code of the new address. + :param iso_country: The ISO country code of the new address. + :param friendly_name: A descriptive string that you create to describe the new address. It can be up to 64 characters long. + :param emergency_enabled: Whether to enable emergency calling on the new address. Can be: `true` or `false`. + :param auto_correct_address: Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + :param street_secondary: The additional number and street address of the address. + + :returns: The created AddressInstance + """ + + data = values.of( + { + "CustomerName": customer_name, + "Street": street, + "City": city, + "Region": region, + "PostalCode": postal_code, + "IsoCountry": iso_country, + "FriendlyName": friendly_name, + "EmergencyEnabled": serialize.boolean_to_string(emergency_enabled), + "AutoCorrectAddress": serialize.boolean_to_string(auto_correct_address), + "StreetSecondary": street_secondary, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AddressInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + customer_name: str, + street: str, + city: str, + region: str, + postal_code: str, + iso_country: str, + friendly_name: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + auto_correct_address: Union[bool, object] = values.unset, + street_secondary: Union[str, object] = values.unset, + ) -> AddressInstance: + """ + Asynchronously create the AddressInstance + + :param customer_name: The name to associate with the new address. + :param street: The number and street address of the new address. + :param city: The city of the new address. + :param region: The state or region of the new address. + :param postal_code: The postal code of the new address. + :param iso_country: The ISO country code of the new address. + :param friendly_name: A descriptive string that you create to describe the new address. It can be up to 64 characters long. + :param emergency_enabled: Whether to enable emergency calling on the new address. Can be: `true` or `false`. + :param auto_correct_address: Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + :param street_secondary: The additional number and street address of the address. + + :returns: The created AddressInstance + """ + + data = values.of( + { + "CustomerName": customer_name, + "Street": street, + "City": city, + "Region": region, + "PostalCode": postal_code, + "IsoCountry": iso_country, + "FriendlyName": friendly_name, + "EmergencyEnabled": serialize.boolean_to_string(emergency_enabled), + "AutoCorrectAddress": serialize.boolean_to_string(auto_correct_address), + "StreetSecondary": street_secondary, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AddressInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + customer_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + iso_country: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AddressInstance]: + """ + Streams AddressInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str customer_name: The `customer_name` of the Address resources to read. + :param str friendly_name: The string that identifies the Address resources to read. + :param bool emergency_enabled: Whether the address can be associated to a number for emergency calling. + :param str iso_country: The ISO country code of the Address resources to read. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + customer_name=customer_name, + friendly_name=friendly_name, + emergency_enabled=emergency_enabled, + iso_country=iso_country, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + customer_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + iso_country: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AddressInstance]: + """ + Asynchronously streams AddressInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str customer_name: The `customer_name` of the Address resources to read. + :param str friendly_name: The string that identifies the Address resources to read. + :param bool emergency_enabled: Whether the address can be associated to a number for emergency calling. + :param str iso_country: The ISO country code of the Address resources to read. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + customer_name=customer_name, + friendly_name=friendly_name, + emergency_enabled=emergency_enabled, + iso_country=iso_country, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + customer_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + iso_country: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AddressInstance]: + """ + Lists AddressInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str customer_name: The `customer_name` of the Address resources to read. + :param str friendly_name: The string that identifies the Address resources to read. + :param bool emergency_enabled: Whether the address can be associated to a number for emergency calling. + :param str iso_country: The ISO country code of the Address resources to read. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + customer_name=customer_name, + friendly_name=friendly_name, + emergency_enabled=emergency_enabled, + iso_country=iso_country, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + customer_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + iso_country: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AddressInstance]: + """ + Asynchronously lists AddressInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str customer_name: The `customer_name` of the Address resources to read. + :param str friendly_name: The string that identifies the Address resources to read. + :param bool emergency_enabled: Whether the address can be associated to a number for emergency calling. + :param str iso_country: The ISO country code of the Address resources to read. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + customer_name=customer_name, + friendly_name=friendly_name, + emergency_enabled=emergency_enabled, + iso_country=iso_country, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + customer_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + iso_country: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AddressPage: + """ + Retrieve a single page of AddressInstance records from the API. + Request is executed immediately + + :param customer_name: The `customer_name` of the Address resources to read. + :param friendly_name: The string that identifies the Address resources to read. + :param emergency_enabled: Whether the address can be associated to a number for emergency calling. + :param iso_country: The ISO country code of the Address resources to read. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AddressInstance + """ + data = values.of( + { + "CustomerName": customer_name, + "FriendlyName": friendly_name, + "EmergencyEnabled": serialize.boolean_to_string(emergency_enabled), + "IsoCountry": iso_country, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AddressPage(self._version, response, self._solution) + + async def page_async( + self, + customer_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + emergency_enabled: Union[bool, object] = values.unset, + iso_country: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AddressPage: + """ + Asynchronously retrieve a single page of AddressInstance records from the API. + Request is executed immediately + + :param customer_name: The `customer_name` of the Address resources to read. + :param friendly_name: The string that identifies the Address resources to read. + :param emergency_enabled: Whether the address can be associated to a number for emergency calling. + :param iso_country: The ISO country code of the Address resources to read. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AddressInstance + """ + data = values.of( + { + "CustomerName": customer_name, + "FriendlyName": friendly_name, + "EmergencyEnabled": serialize.boolean_to_string(emergency_enabled), + "IsoCountry": iso_country, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AddressPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AddressPage: + """ + Retrieve a specific page of AddressInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AddressInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AddressPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AddressPage: + """ + Asynchronously retrieve a specific page of AddressInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AddressInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AddressPage(self._version, response, self._solution) + + def get(self, sid: str) -> AddressContext: + """ + Constructs a AddressContext + + :param sid: The Twilio-provided string that uniquely identifies the Address resource to update. + """ + return AddressContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> AddressContext: + """ + Constructs a AddressContext + + :param sid: The Twilio-provided string that uniquely identifies the Address resource to update. + """ + return AddressContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/address/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/address/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..589d1646e3e5813eb37a4571f7d6799d8233d6ef GIT binary patch literal 40227 zcmeHwd2k%pnP2zZ7cjVQQcZ%_kiY;uMAAGYg8(Jdq9BTgoIsR^!4qH z^FmY@5Tat#5*HKVfGASl8n+~@1J;CXz?QHN*b|NcN5VPaOt=PI3HN}TwXwxL3GaY6 z;T!NJDh4W8ojqQe@DKP|-Vv`#R1Z|Myfa>ts2!+fc~`tHQ9n@6^6q#;qH&;+_8GZH-*3*De~V z4b+AIw%$RZvxkE@ZzvnO9U> z8JbW(bXh3G?m8w(WBNZ-Qvv_cgr5n8sD>3Op<9j}L=De{LS2+oJK@z`dcUDDb}?_N zwnOKetNq^VEFlSk!bX3x=7Qtls49F`TjEW+0VPwUmf+~=@NzJ{eN z3j-pSvn47HSlvRjC2EmvQLAj19kO%K(v0R&o9u|%WtZ%r(xB_KFepYHrz!^AvM1Ua zb)B+ZQac^+MxC;6&=Pf@vJF(Ic@OfH(Kakk+khXxKKxe6)yI~p7a4v&ZMB2$XoXyh znW|G~s?t>Qn@UxtQnjfBq+{r%7A2qFXPv23Z))j`3WIgghEw)|`cK>3l^*XWWJVh? zqYZ#=r`!l=ZZbf46Y3nOYX%fIpB7#e2U_+CfkiogPc*8?>9n?X!zZ08)z}g{9#*7q zB$66VWB`}BCY6wtP%@m5c^8zEfT~lG7^8(JVi{9UK}Ix(6kufqH#-W#8I}^^ z7h{RxgcO&PN6;M8uy&)gq4V%aMwTK+!%8>;jGFF{@G$GvO6!YH7>7idIuuc4x;Y;a z)kxuFR3ZdUPxttf`}tfE{m~|bk#O}oDLo`dVuLY|ax{N-?_<5vy3Om>nO{dt&I|@q z%8@Q*FhYOSBA5Zfra4c9GxG*DJVYb8{Xu~yWhC|Ddp@#3B?cN1A2GbabVi9KkMJ29 zNe$D>j2%g0Eyo@#?q+}18hYFsa^Y?0*eGlS4KFiq{6rgSjKCI zQlNZsTpm?niB~LinIazn;p6Wb9pGgHOn9ZXpi10KUw6aF*bBq5WPED2kWK*fI2h4` z$B2%`21nR~-)u3VA6d?*Yk`qm27A0((w0;CNf=gQ{Ne+9cWJ}dCb|QU6%S`($1(pY z>5zsTfCLQ4;gE4kWh_qcJ&}<)oyxl~PGO zE>?b$J%_Phuq!bYnzjCDF=>yd_oTO@0RwXl#YZHD5eS*Y=`9V@1ErEdX;)H(lbB4L zAyAnjzc3tAWQld6^(_Mpgp*j8rdo6wk278lunB}H4-ux44rP>K`4AdMV}!dn$Em%& z`Gdp-gW-7Ea0Pqa8u&(2ayq%PXk2Xc1ab8ITGupZ;49e>P16S6kI+itEtH-$wOR3` zeL|*79o_BDmiAD$I9Ghdgwk>(m5hcpbOH#Aac*0M%3EDsIp=ZCA?KV!;gNVM9L;$R zG&pAkLWpQmEwP}KC&_UxiS*CJ^FoGd*>T1`CVU;|$HYqz1?dolG0QRI)w~*Vu-0Ns z2vKkBDAU$rXlq-bt<}(0zi*~OyXsh_mMi?0xvNdEW%KDuBsS8OKXonnaP`{DYbMuRNldTqJ8k=^t7*1<^;=ut+QR&{X1g|CJ~?@EYU`8JUHx>$A`HB3 zI8xcMh-6^ zbDkD9ev6NnHf0J#PB^9$u|hjsM?DoCQITM}%sHlWdfTcgVSy_2t4ogp^0#gD=N<;b zNK~~T$$;PlxpEDxCR-D_e5{@5P&qz+7JOVJJVcB$SaH2WENc?+h-HQ(A4?5GgpJTz zO9!PMu%TLCTCEfY6AOv=MG`2%2NTby-k+;EX{1~DoTs;FOk}TVgcwQD+R%qnSj9>J zGZU~WUHHjWs_oT&fCp3tND1Qfq^PhpMXy*=*3kuy5RGwUw4vxmL0-QfZPGiDyd>nS z1Ygx_+s|yD@=EWwt)8u_J700GVzy0sqyP2(i`%nppP8*|I^Tb;|H8xBy1;d(ZBgav zzE_{jdxWaG*T&C`Pr2HZ_2|h2U=~y`0NaR6IRHDRgBKd9ho)@AYZq@E)2F3Rj>|F6^_QV7;P&CRpTWIv`8;O@_&eGV453R&OdwZ*_ryzY<=f+ zebBGiGNE=S@{FO;vr-#X;8gIL*;KIFzz}Y1+SZ%C+>j0f)o-OqGMf6rT~J$bEAd zyoEW`!OqJjrVP|QMpM~Zaw_>1U#1By1#}(R`i|-P;EX>wNR-WG6a=vLNf8Z9dBy?0zhf>Rp8w}cE=%+!DN#DJfYn4*aIQEjtDMscr ztrsYPNEf_*UCB##YWlK5bFRN(B$_{#Ng7cVeWdipfONe#S8^GYJM((s(!-tT35`QB zYwk;F6%DPq$ir`WD~eLXr3TT7U%!xQ)^P1SdCH*uN~yZW652?neAHiCQ0irGev78l z!+Tbhb@QgS)Oso06MEhB(bRA}Dp5Nq>Y*Bhv6tu^EieYz>LRTPwACcH=x$PdQeDo>zpK0C&5avJB-TakcI*l1$MW?NR$|Jvr+>Uv6>+GiJc z%`SO(c2Q@(R;XG!CwQtndBNlMa8g-}kzYZlbAw23mu0&dRt6hqDZ|ED|KWfUTbHMx z{J|gK@%hHf2Y8$ruIFKr2YCF@?=>D*h_Te!WFJQ$DxbU?r%Gbor*LAvm}b28GF`e0 z2^Z5gn#8o5qu+)g&~Jn1S2_*`BChh>NHcM6)mrg8VwdfbeXUuXBMF`H$)pA;%O{gI zqUd1yg$+7cgO3KtG((_K&Cx0}M4nb5ZZA#iO*N9%Sf=4TiH&6Z(UnC6HCX2AzeD3R z>E1!Sn1+Sv64qt?>!w`m<_mCSEn?4q3K@8AipOY1ijJt|6shA%%t9$Em!^T~6SUkV zwa;<*fgXe7OYu>#oRPBbMnSi>N9BXUy7T}u@DTLKP&PADYbn*uli|owQc!3DNAV>Z zBXC2MOp-lK1?i#YNUYNc^m9-}9>jx>i{qB4P-=3BG+$Du<{RR9Q50TnwFx64=}{&v zqxO^I+fR=7Pl`DQ_XL@=<}AVPocMfBJf5bh$9Nb|a>KoioDyFgQXUyyQ~b6=A$sso zD7cN;%F~Yo^~V25VSr9X7CwO#s`b;C!HLBWYU(i9ZSWMOhcHnL!+NaEB_pQOj;NdmUF6V z%QQW``VeH{;3F-izUOB?K=U-|^#Gzip|;`ts&lI_z^i@V@Bd!^%(gw*ZF{D-?fq%X zzUi8Mr=7F@jWho3S^xH{N2dLcO}QRpKpYSW_iR8X3iYJr$%qtar9qJA5zH)}P$-d# z4#z3)3x!^QE2nzK84AI13Zo@snL;lgR^N=G&@3qgq|6ABbAcCU&PiOoXFHrq#hEfs zA)S-bO9=stLN>yjeK?thU56~DIY;X7F^CY1)l>-cDYcZ)YF3B`%vGpXmWUjWheFW7 zu0<`=8Ge>Csq{1oC8QEazm94C^(o<+rP}VwcMFS`Uh^)sZ~CyhDR0LwwD~m+XCo8q z&mKLuIPatym(b9hcT>(IRN~y3=RTq<@}Cn0N98Xq74}7QR^;-O%P)4?mrdB_1pMS{ zoc8VueU$H>L%yAou6%>gx&HF*$=$OZ>)6loHE$h!^WbcI;H_B7XP?hjEzP^B$|Lye&h}0;oP8o&DdoLX&@-$F9uBUab zk#c**-`6MaCrHU#Z1(k2fu3Iq_*EeWxxCM5e_Whs{}sUGagi-b2CEUks(xrj-MOW} zbY_2I*{b>y+XfxXXV`YiH(-Y+G5JqA;6Le9^G@Vl$h%PwZ{h)unkO$}uk1V4qTfx= zeA;T^*XofgWt;3*J%zodlFwACFqJAzCBLaug_1+>v)WXuF}0-Gt&7&eueIvaHg~1R z`w5xRI?QObTmy)$1@zV%Jca8}XG2{BptzoS3O9iHX=K!l+vIg~e1u4ncIXTnX(@^v zk!+-{Xs7hsn&lXo@ zeY}3tq~+z(%RKp5_bBD8R;Q}ci<(s3+}jlDM%AH|J3AIU2erp8bsuKl9qs6X8_K8$r$fa89EvD7|M9?SUQ#LpA-TPWi?(J<82sY$2hv2Ekw>PO`$SEMZnJ0ZVhy) z4wsx?Aus?7E4{>dmNh7jHmY}5-?;9$@pGI^??VC;-1RDx;|7R6^F}awA=H0foT}R~ zQ@1Nyx9gf<# zZ%T-l9tq#OD!FdM1Ncc3 zzt4m%z_4jf>zmI%cka2F`mSt!*KBR;g}S$z-)z3}c-|^Bbk7MEQchS%L2PkTLduC6 zboFwN*y9o3vx+?~+j}-U@+Jr-S%g9GFOaz%2nJl@Bg}2M>Na2*n7s@v+ca1nw`9EN zlpUpeh6zzPMtYZ`BWi~@O`|Dwj(tD&w)2uoWw2sg$__NYQ57D7*$yt-aH{DdJeG5i zx@9Pnvp&9aKYPmtq{O^loNN&p-gz%NQrJ5umXtfaSUFOo^~4_+Q~5E-)u zHxUfPaMk=p)fPPMJnPE3nm?>*INy1$bEal_wr2Uo16OU|cYn|QqfJva%b8I7GymdQ zIL$nH=1F*+%{H~YQTcl1h4F0D!{j|vd9HF|I9s*+y4y~`V%Mw*I_ko$2`JcNbfNZk z7vuc`3@l5#aarC4pfF%411L@cqPJZIK!MxJCg!%{R(9f)@)9Lqq2y&s7#dg*LYNS5 zh7g5j*bEiaYP6*kRB-&zNwD!HG%AT73gCfPUh#UxOw-zI)7shErithqvDaf)8i6UA z*8x*B6Q-#3oOWJ!2~`i>4yfeaxK6_>jvW^9J(svcu)XKrjQnlc%}o9Tv|t$$dKnM6 z5E3$4t1>#9Sc>Hw)4jJBXjkyuc7vVOeY3|sw@iY(QOlS&Y9(|SwIOF$5n~C$eN0Dh zXsjMlM`>sr^Ne{5NNe1e@oQJ0eTlxue5lubxwW|tM4_2R>-T$S$Pu#;q17gI8wbc*K;?mu84=RmG;9@`@E&sp5d60(9LRG_SBWFfFlsaee zzeNI`r*v`P{bijq%O1@xdvxlvPfst~`~HfqnH4?R6+Kfso|#_ph1vG?*J?c#m2*~K z6}a5%EoL5L=}wTC%B<_54-42tBQ`6tH7j73p2)m0^7_cd%+)UdpVY1dKDi@Q!dXD0 z4Vzv9qdMQhbKVNo`TfNNpoK0IExdEgz*c`5tl?pp!CSx#IxX}m{dil-S1CD5$vH}1 zqU0--{4phef`orv!M`J5%v15QQ~r#aGGT?_h4{l-vDa(+VcllrO}xDWPtM5dw~#4ketc=; z{qm#NIQm=iqPHqfV~_NGOTb52_){K|jo3ox_ijK3r6@0fCRl$K-JoS(vtJ{cxY zWk1c_0VF2qAl7L;{_degQuzYi>7P+DfW*w)ei1dJtBYQhX3r~OdHgY6mlC4B4$+m% z%9<5bB1u+7B~0z3NKAtFAayWbZNv?R|CzvIBU;>|!SLZ3|F*1u+tn{j`*%*cb}|rv zYV`=+`6wkMym7nV^ORddNrDpM3Atgfo^rjE5X;XQktF4ar&CgtFs_4P#5fh%I?%0q z$`IAPfW&CgqlaKB-hZMKFK~-q-d1aWTD;)Q3-o&>!he5Y{fL$Gt3CDuBAMpsH{ay5 zd&oA2pL|=b-E;QKb7d=kZMoIk^*(j;%6ZYf~gUC|nv3D{{ z9e!0y9dh|5r~NV2Quml@sUtv);7>nnYHn^FGRC++vK4kIyK0xRz&eNcKd@Oi$$AI- zg$;Svh&|xQc~!(g0f+bpg-jW%n;p=vPVRQIn-pX>a5u(w>R7-%mNZB355&yM)zO4* z8`v=%BY$4Q_g!#>RtH!3GC*VMRZD{U8Tb}y5C0w=kRp5q`F~>5 z72CU&?^IqL&vrj~-KuF4=TkUb$+-%8spsK~f&meQ8C_f!L(>=@Q8H*WkAO4OtSQ3S zST&OHKQYcZ(nK-5T-D7+(jRaaV_KqP3d6KCAU;`dP>#ChHzhL1rK@jJj*`EjSs;e= zl#sW%2~a4#(BNjEW1rD$u#a~@1j=ERmxSe zm+A&9qui)_pWx)ajJ-x5dp+hI!Nl$ljNg~B*Xd*Dfy_RgW9K2m?$g-s{(TNQ?|8K| znbuA-N`4)C)tX9`2$xnBZ2<%}-TjE~R}UZKOtfMqnxk!?05mhU=pwLEEr#-9lv|?@ zvGZ*>FQL51P+o%aVq8mX*iz&lVs0c73}@{+Ge!{}3+^Nll6$p-s4|u3$W~h9NdhZi zaY!2&jVv+p0?`?@yZ0kuo+BdYyv|pZ_8g(7_#JZ_K`=1{&(oiqF_NPz7WC%eejJQv zf?>OaD+g19Lp8$~&<4C&uCQ5)T$;Equ)Ri44UMm(8P?r2D5Pz=2aSKtES$#p8jyP` zS|+yUtrj&_ghQzBgO|p(nY!LA{Xg)7=wBz_OCo~^5^m0swb3xzDQTr-DJ4rNktlhH z65@6XUwtvh-iQ}<+Cln72CQ+6?RM->W6oQ(EG^JZw>gb@V1d#j{)~GIQcNisCTfXV zV|v`DaUWc#eB3AxE0ph^S)sgRK7$piVnHiZMHziEvqHV?))a%lC7$q3z>N;5y(|iz z(XFejNOgOk#u~rv)$gVXXTV{%9!BqG9Tf$)R6miu*%i0&ne5Fjzm-pAZ+5*QWD$38 zD;GiWW}RqXLa1RKKaNkY=lR3k-S=X~r+e`2FTNiBM1K3LMaV4HwSeZZ17Gi+1|C<= zQ1SJwnzQQq)=BPBO}4Negc9uW58K*2_; zQ_PY)AnYn{_JFYe?g#Z)h_EYv4oq`%60LffEJUMy{8s9RW0=L{om1q`C{%^ zE?iO6nu?`9szBr^XVgj>ckOEJT>@5LhRgHd*cvjY$e?JH;Rr z4~dlFL_thp8xhc#zC46?JUki$QKZPww1ooi4_(NEgRuyLna?7&ytxpkq`CFs|LjWX+74(>* zJPZWQx&}^co+-3yP=&@-0Ud74g2a(wgiu2eQi@rRO^RfEF{eU}1YlsX7?b>VK}qT> z#Gp#1c&*;8`t&+h*dp zjM1@l%x-ZHWfkmEJSXI>cgGi?crgByi#YjZ~>MITh6Nj zd}!eef)xxQdKZUe8q7`lEb_qB;RGUVG3754Xp6d`9#~&F2ftK#2Q_Io5`C_@)cTjGGE1#| zib=@}?5YPY8KaE(0_78!4G`1vNPj;{(DJ+&Smth)u4CFK-dzzA4!HtJR(K_cM11(768+&%{x ziOV4W4i%$SM#~xXc$H8)xt7CjM&Wts>uBuTGP`&U{a?C%7I8!xT4!6@^A$ox6QY=r zZOlzy(z~@U=}XELFQZFcu269-s`NwGYe5HAz{ZdbOwo7O39mULmLo#MvR*r5E22QUq-eQ2ZS$rPS&Bw4!+Bd%%7D0Z}1V8^Ks^MXRLhHp#%CqH>PQa~_%u&eH2~ z*LR~TSg8MBgxC+^O3t%y5mv65S+Oa*VpB=fzH&2A`^rj$A6!!TD?1|nUZ-%sA2zi8 z(kfKc<}IlHb)M>f{YyO}@NZc5H)(p3ms=kd|An~D_ASSw;+GDjB!S^S`X^0 z)Pmv1;A!Xze*g&3S)RQJq#A>&TM9${nmmGCw`kHyjjVD6n&Y7^dKkadD#$f^xeA-~ z%kqnIWEgwFO0h&jj?$LY@ezamw(O1`cdc8xU-U^gbliW7$$d~Ku|>od6n%DgMBYzp zOVT6d9ai^OHhgwxv|sSm$FEfNJgUsf?G1R}=@{E%m`p;EI9csrC%{YBLCn}4srbw2 zi@1TVL)+bh(bH4f{KFyZkqX`-NXTo>H4|%+c)X{WK*B?mPhOVi5h*M5;9B_f}`YI+P9Hua{AKn zJbpRbP9_C2+dhQHu|vU;K95si+q(_!Zu9)x$mwm-N-`R>Ex+b>5%&%(jzB0)B|X~; zQBZ0d&u>4seWrGKwsv_TrjqUI5kx_$TY-oUb)M5M?B`h3I9gr_p3BO2>2l@_r6X>I%%G+5FSR!F*o1#M@4b$& z@V`O>?gw>$5OMROHx|9VXr_5>w%HKejw9k03UAj!;q7jUjq^^N*TUF+W=FgD-d1tP z65D&*Rv@4AAYd4MFpqd+5ug(NAU`8KpfLAsBxU`Yj8~|amI``Y$}5Q?Cu;skh;B%B zb9R)rM6)oML`8}Y1J7$2ozs~EBf~o+N3gMU`S$GUqdCi>&Nd<=F!x=n$|m_TUG|=!!$+i;q&G-<<$lv8wT20H98ktzoDk3&Ph;i1P0NX!fhH zsr(r4Qu%L4auq66s#eJY9ww(!Gdx!6kjLzqdbm(CRI+o=6KsASJ#dvrjnJ}~qt4E3 zbLUL+hHUeOndTkY<{dwH_(!X!n-9#?9w-Z;#N|FCsz%5SJ&VQfial+%cUK_Cg1eQ* zl)G_rqn-ko%n0N-O9yIgJZDVRjk--?t|zUd-_S7{;y%FwFdQLAM@?#1V?i0v1{b^U zf53E#)xx5tPg;4HeL_DR!KeXS$W6x-mZ}34qkf|W0`K+&UfSGpoPi{R@GM#+-wTS|Zo}3j{X@#gYGe;>zlbKdiA)C5Fb|&RNQo@!s$*-K{`Wwpq zgp!Sv5Hu+NgOWi?hA4Rfi7~?0zobe^eg<@!7STWU?8)0I?a#0XU-Ww=@{vHl*u+QO zQK#f~ITX?A!^W1pokyUmuFE@l;3RNOs=>4u4vVYRL=m={>13bf(>LaMQNh&dR`)7;sC~A568BlA0_k*+l!|Lm|^muG!coPR2U@Jeh5B zwZ`-6mOU(nX0FP3hU74=#NMV>qnk`HjGYFLvz-RjU21}1zIA<>eJpu2O-9NY>1BkO z(N-3tP7fD%!?lg?@AruEGmH{6S4gLjir2EX`N(1sE!RDtvx<+4Qw=Mw3oLj28Ha2Y9}~}pt_v)4eUGz7 Y>^{5fx`3bSs}l|sIzAHUm$5AWA2LKB+W-In literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/address/__pycache__/dependent_phone_number.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/address/__pycache__/dependent_phone_number.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e34a8ec1612d2e726531d960cb3601f67f3c562 GIT binary patch literal 17112 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/address/dependent_phone_number.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/address/dependent_phone_number.py new file mode 100644 index 00000000..504e69bc --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/address/dependent_phone_number.py @@ -0,0 +1,374 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class DependentPhoneNumberInstance(InstanceResource): + + class AddressRequirement(object): + NONE = "none" + ANY = "any" + LOCAL = "local" + FOREIGN = "foreign" + + class EmergencyStatus(object): + ACTIVE = "Active" + INACTIVE = "Inactive" + + """ + :ivar sid: The unique string that that we created to identify the DependentPhoneNumber resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the DependentPhoneNumber resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar voice_url: The URL we call when the phone number receives a call. The `voice_url` will not be used if a `voice_application_sid` or a `trunk_sid` is set. + :ivar voice_method: The HTTP method we use to call `voice_url`. Can be: `GET` or `POST`. + :ivar voice_fallback_method: The HTTP method we use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :ivar voice_fallback_url: The URL that we call when an error occurs retrieving or executing the TwiML requested by `url`. + :ivar voice_caller_id_lookup: Whether we look up the caller's caller-ID name from the CNAM database. Can be: `true` or `false`. Caller ID lookups can cost $0.01 each. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar sms_fallback_method: The HTTP method we use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :ivar sms_fallback_url: The URL that we call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :ivar sms_method: The HTTP method we use to call `sms_url`. Can be: `GET` or `POST`. + :ivar sms_url: The URL we call when the phone number receives an incoming SMS message. + :ivar address_requirements: + :ivar capabilities: The set of Boolean properties that indicates whether a phone number can receive calls or messages. Capabilities are `Voice`, `SMS`, and `MMS` and each capability can be: `true` or `false`. + :ivar status_callback: The URL we call using the `status_callback_method` to send status information to your application. + :ivar status_callback_method: The HTTP method we use to call `status_callback`. Can be: `GET` or `POST`. + :ivar api_version: The API version used to start a new TwiML session. + :ivar sms_application_sid: The SID of the application that handles SMS messages sent to the phone number. If an `sms_application_sid` is present, we ignore all `sms_*_url` values and use those of the application. + :ivar voice_application_sid: The SID of the application that handles calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :ivar trunk_sid: The SID of the Trunk that handles calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :ivar emergency_status: + :ivar emergency_address_sid: The SID of the emergency address configuration that we use for emergency calling from the phone number. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + address_sid: str, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.phone_number: Optional[str] = payload.get("phone_number") + self.voice_url: Optional[str] = payload.get("voice_url") + self.voice_method: Optional[str] = payload.get("voice_method") + self.voice_fallback_method: Optional[str] = payload.get("voice_fallback_method") + self.voice_fallback_url: Optional[str] = payload.get("voice_fallback_url") + self.voice_caller_id_lookup: Optional[bool] = payload.get( + "voice_caller_id_lookup" + ) + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.sms_fallback_method: Optional[str] = payload.get("sms_fallback_method") + self.sms_fallback_url: Optional[str] = payload.get("sms_fallback_url") + self.sms_method: Optional[str] = payload.get("sms_method") + self.sms_url: Optional[str] = payload.get("sms_url") + self.address_requirements: Optional[ + "DependentPhoneNumberInstance.AddressRequirement" + ] = payload.get("address_requirements") + self.capabilities: Optional[Dict[str, object]] = payload.get("capabilities") + self.status_callback: Optional[str] = payload.get("status_callback") + self.status_callback_method: Optional[str] = payload.get( + "status_callback_method" + ) + self.api_version: Optional[str] = payload.get("api_version") + self.sms_application_sid: Optional[str] = payload.get("sms_application_sid") + self.voice_application_sid: Optional[str] = payload.get("voice_application_sid") + self.trunk_sid: Optional[str] = payload.get("trunk_sid") + self.emergency_status: Optional[ + "DependentPhoneNumberInstance.EmergencyStatus" + ] = payload.get("emergency_status") + self.emergency_address_sid: Optional[str] = payload.get("emergency_address_sid") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "address_sid": address_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DependentPhoneNumberPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> DependentPhoneNumberInstance: + """ + Build an instance of DependentPhoneNumberInstance + + :param payload: Payload response from the API + """ + return DependentPhoneNumberInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + address_sid=self._solution["address_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DependentPhoneNumberList(ListResource): + + def __init__(self, version: Version, account_sid: str, address_sid: str): + """ + Initialize the DependentPhoneNumberList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the DependentPhoneNumber resources to read. + :param address_sid: The SID of the Address resource associated with the phone number. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "address_sid": address_sid, + } + self._uri = "/Accounts/{account_sid}/Addresses/{address_sid}/DependentPhoneNumbers.json".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DependentPhoneNumberInstance]: + """ + Streams DependentPhoneNumberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DependentPhoneNumberInstance]: + """ + Asynchronously streams DependentPhoneNumberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DependentPhoneNumberInstance]: + """ + Lists DependentPhoneNumberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DependentPhoneNumberInstance]: + """ + Asynchronously lists DependentPhoneNumberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DependentPhoneNumberPage: + """ + Retrieve a single page of DependentPhoneNumberInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DependentPhoneNumberInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DependentPhoneNumberPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DependentPhoneNumberPage: + """ + Asynchronously retrieve a single page of DependentPhoneNumberInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DependentPhoneNumberInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DependentPhoneNumberPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DependentPhoneNumberPage: + """ + Retrieve a specific page of DependentPhoneNumberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DependentPhoneNumberInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DependentPhoneNumberPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DependentPhoneNumberPage: + """ + Asynchronously retrieve a specific page of DependentPhoneNumberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DependentPhoneNumberInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DependentPhoneNumberPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/application.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/application.py new file mode 100644 index 00000000..555ab72b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/application.py @@ -0,0 +1,984 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ApplicationInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Application resource. + :ivar api_version: The API version used to start a new TwiML session. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar message_status_callback: The URL we call using a POST method to send message status information to your application. + :ivar sid: The unique string that that we created to identify the Application resource. + :ivar sms_fallback_method: The HTTP method we use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :ivar sms_fallback_url: The URL that we call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :ivar sms_method: The HTTP method we use to call `sms_url`. Can be: `GET` or `POST`. + :ivar sms_status_callback: The URL we call using a POST method to send status information to your application about SMS messages that refer to the application. + :ivar sms_url: The URL we call when the phone number receives an incoming SMS message. + :ivar status_callback: The URL we call using the `status_callback_method` to send status information to your application. + :ivar status_callback_method: The HTTP method we use to call `status_callback`. Can be: `GET` or `POST`. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar voice_caller_id_lookup: Whether we look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + :ivar voice_fallback_method: The HTTP method we use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :ivar voice_fallback_url: The URL that we call when an error occurs retrieving or executing the TwiML requested by `url`. + :ivar voice_method: The HTTP method we use to call `voice_url`. Can be: `GET` or `POST`. + :ivar voice_url: The URL we call when the phone number assigned to this application receives a call. + :ivar public_application_connect_enabled: Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.message_status_callback: Optional[str] = payload.get( + "message_status_callback" + ) + self.sid: Optional[str] = payload.get("sid") + self.sms_fallback_method: Optional[str] = payload.get("sms_fallback_method") + self.sms_fallback_url: Optional[str] = payload.get("sms_fallback_url") + self.sms_method: Optional[str] = payload.get("sms_method") + self.sms_status_callback: Optional[str] = payload.get("sms_status_callback") + self.sms_url: Optional[str] = payload.get("sms_url") + self.status_callback: Optional[str] = payload.get("status_callback") + self.status_callback_method: Optional[str] = payload.get( + "status_callback_method" + ) + self.uri: Optional[str] = payload.get("uri") + self.voice_caller_id_lookup: Optional[bool] = payload.get( + "voice_caller_id_lookup" + ) + self.voice_fallback_method: Optional[str] = payload.get("voice_fallback_method") + self.voice_fallback_url: Optional[str] = payload.get("voice_fallback_url") + self.voice_method: Optional[str] = payload.get("voice_method") + self.voice_url: Optional[str] = payload.get("voice_url") + self.public_application_connect_enabled: Optional[bool] = payload.get( + "public_application_connect_enabled" + ) + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[ApplicationContext] = None + + @property + def _proxy(self) -> "ApplicationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ApplicationContext for this ApplicationInstance + """ + if self._context is None: + self._context = ApplicationContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ApplicationInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ApplicationInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ApplicationInstance": + """ + Fetch the ApplicationInstance + + + :returns: The fetched ApplicationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ApplicationInstance": + """ + Asynchronous coroutine to fetch the ApplicationInstance + + + :returns: The fetched ApplicationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_status_callback: Union[str, object] = values.unset, + message_status_callback: Union[str, object] = values.unset, + public_application_connect_enabled: Union[bool, object] = values.unset, + ) -> "ApplicationInstance": + """ + Update the ApplicationInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param api_version: The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is your account's default API version. + :param voice_url: The URL we should call when the phone number assigned to this application receives a call. + :param voice_method: The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + :param voice_caller_id_lookup: Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + :param sms_url: The URL we should call when the phone number receives an incoming SMS message. + :param sms_method: The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :param sms_fallback_method: The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :param sms_status_callback: Same as message_status_callback: The URL we should call using a POST method to send status information about SMS messages sent by the application. Deprecated, included for backwards compatibility. + :param message_status_callback: The URL we should call using a POST method to send message status information to your application. + :param public_application_connect_enabled: Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + + :returns: The updated ApplicationInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + api_version=api_version, + voice_url=voice_url, + voice_method=voice_method, + voice_fallback_url=voice_fallback_url, + voice_fallback_method=voice_fallback_method, + status_callback=status_callback, + status_callback_method=status_callback_method, + voice_caller_id_lookup=voice_caller_id_lookup, + sms_url=sms_url, + sms_method=sms_method, + sms_fallback_url=sms_fallback_url, + sms_fallback_method=sms_fallback_method, + sms_status_callback=sms_status_callback, + message_status_callback=message_status_callback, + public_application_connect_enabled=public_application_connect_enabled, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_status_callback: Union[str, object] = values.unset, + message_status_callback: Union[str, object] = values.unset, + public_application_connect_enabled: Union[bool, object] = values.unset, + ) -> "ApplicationInstance": + """ + Asynchronous coroutine to update the ApplicationInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param api_version: The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is your account's default API version. + :param voice_url: The URL we should call when the phone number assigned to this application receives a call. + :param voice_method: The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + :param voice_caller_id_lookup: Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + :param sms_url: The URL we should call when the phone number receives an incoming SMS message. + :param sms_method: The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :param sms_fallback_method: The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :param sms_status_callback: Same as message_status_callback: The URL we should call using a POST method to send status information about SMS messages sent by the application. Deprecated, included for backwards compatibility. + :param message_status_callback: The URL we should call using a POST method to send message status information to your application. + :param public_application_connect_enabled: Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + + :returns: The updated ApplicationInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + api_version=api_version, + voice_url=voice_url, + voice_method=voice_method, + voice_fallback_url=voice_fallback_url, + voice_fallback_method=voice_fallback_method, + status_callback=status_callback, + status_callback_method=status_callback_method, + voice_caller_id_lookup=voice_caller_id_lookup, + sms_url=sms_url, + sms_method=sms_method, + sms_fallback_url=sms_fallback_url, + sms_fallback_method=sms_fallback_method, + sms_status_callback=sms_status_callback, + message_status_callback=message_status_callback, + public_application_connect_enabled=public_application_connect_enabled, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ApplicationContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the ApplicationContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Application resources to update. + :param sid: The Twilio-provided string that uniquely identifies the Application resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Applications/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the ApplicationInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ApplicationInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ApplicationInstance: + """ + Fetch the ApplicationInstance + + + :returns: The fetched ApplicationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ApplicationInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ApplicationInstance: + """ + Asynchronous coroutine to fetch the ApplicationInstance + + + :returns: The fetched ApplicationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ApplicationInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_status_callback: Union[str, object] = values.unset, + message_status_callback: Union[str, object] = values.unset, + public_application_connect_enabled: Union[bool, object] = values.unset, + ) -> ApplicationInstance: + """ + Update the ApplicationInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param api_version: The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is your account's default API version. + :param voice_url: The URL we should call when the phone number assigned to this application receives a call. + :param voice_method: The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + :param voice_caller_id_lookup: Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + :param sms_url: The URL we should call when the phone number receives an incoming SMS message. + :param sms_method: The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :param sms_fallback_method: The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :param sms_status_callback: Same as message_status_callback: The URL we should call using a POST method to send status information about SMS messages sent by the application. Deprecated, included for backwards compatibility. + :param message_status_callback: The URL we should call using a POST method to send message status information to your application. + :param public_application_connect_enabled: Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + + :returns: The updated ApplicationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ApiVersion": api_version, + "VoiceUrl": voice_url, + "VoiceMethod": voice_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceFallbackMethod": voice_fallback_method, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "SmsUrl": sms_url, + "SmsMethod": sms_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsFallbackMethod": sms_fallback_method, + "SmsStatusCallback": sms_status_callback, + "MessageStatusCallback": message_status_callback, + "PublicApplicationConnectEnabled": serialize.boolean_to_string( + public_application_connect_enabled + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ApplicationInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_status_callback: Union[str, object] = values.unset, + message_status_callback: Union[str, object] = values.unset, + public_application_connect_enabled: Union[bool, object] = values.unset, + ) -> ApplicationInstance: + """ + Asynchronous coroutine to update the ApplicationInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param api_version: The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is your account's default API version. + :param voice_url: The URL we should call when the phone number assigned to this application receives a call. + :param voice_method: The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + :param voice_caller_id_lookup: Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + :param sms_url: The URL we should call when the phone number receives an incoming SMS message. + :param sms_method: The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :param sms_fallback_method: The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :param sms_status_callback: Same as message_status_callback: The URL we should call using a POST method to send status information about SMS messages sent by the application. Deprecated, included for backwards compatibility. + :param message_status_callback: The URL we should call using a POST method to send message status information to your application. + :param public_application_connect_enabled: Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + + :returns: The updated ApplicationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ApiVersion": api_version, + "VoiceUrl": voice_url, + "VoiceMethod": voice_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceFallbackMethod": voice_fallback_method, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "SmsUrl": sms_url, + "SmsMethod": sms_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsFallbackMethod": sms_fallback_method, + "SmsStatusCallback": sms_status_callback, + "MessageStatusCallback": message_status_callback, + "PublicApplicationConnectEnabled": serialize.boolean_to_string( + public_application_connect_enabled + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ApplicationInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ApplicationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ApplicationInstance: + """ + Build an instance of ApplicationInstance + + :param payload: Payload response from the API + """ + return ApplicationInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ApplicationList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the ApplicationList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Application resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Applications.json".format(**self._solution) + + def create( + self, + api_version: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_status_callback: Union[str, object] = values.unset, + message_status_callback: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + public_application_connect_enabled: Union[bool, object] = values.unset, + ) -> ApplicationInstance: + """ + Create the ApplicationInstance + + :param api_version: The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is the account's default API version. + :param voice_url: The URL we should call when the phone number assigned to this application receives a call. + :param voice_method: The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + :param voice_caller_id_lookup: Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + :param sms_url: The URL we should call when the phone number receives an incoming SMS message. + :param sms_method: The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :param sms_fallback_method: The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :param sms_status_callback: The URL we should call using a POST method to send status information about SMS messages sent by the application. + :param message_status_callback: The URL we should call using a POST method to send message status information to your application. + :param friendly_name: A descriptive string that you create to describe the new application. It can be up to 64 characters long. + :param public_application_connect_enabled: Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + + :returns: The created ApplicationInstance + """ + + data = values.of( + { + "ApiVersion": api_version, + "VoiceUrl": voice_url, + "VoiceMethod": voice_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceFallbackMethod": voice_fallback_method, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "SmsUrl": sms_url, + "SmsMethod": sms_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsFallbackMethod": sms_fallback_method, + "SmsStatusCallback": sms_status_callback, + "MessageStatusCallback": message_status_callback, + "FriendlyName": friendly_name, + "PublicApplicationConnectEnabled": serialize.boolean_to_string( + public_application_connect_enabled + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ApplicationInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + api_version: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_status_callback: Union[str, object] = values.unset, + message_status_callback: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + public_application_connect_enabled: Union[bool, object] = values.unset, + ) -> ApplicationInstance: + """ + Asynchronously create the ApplicationInstance + + :param api_version: The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is the account's default API version. + :param voice_url: The URL we should call when the phone number assigned to this application receives a call. + :param voice_method: The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + :param voice_caller_id_lookup: Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + :param sms_url: The URL we should call when the phone number receives an incoming SMS message. + :param sms_method: The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :param sms_fallback_method: The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :param sms_status_callback: The URL we should call using a POST method to send status information about SMS messages sent by the application. + :param message_status_callback: The URL we should call using a POST method to send message status information to your application. + :param friendly_name: A descriptive string that you create to describe the new application. It can be up to 64 characters long. + :param public_application_connect_enabled: Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + + :returns: The created ApplicationInstance + """ + + data = values.of( + { + "ApiVersion": api_version, + "VoiceUrl": voice_url, + "VoiceMethod": voice_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceFallbackMethod": voice_fallback_method, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "SmsUrl": sms_url, + "SmsMethod": sms_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsFallbackMethod": sms_fallback_method, + "SmsStatusCallback": sms_status_callback, + "MessageStatusCallback": message_status_callback, + "FriendlyName": friendly_name, + "PublicApplicationConnectEnabled": serialize.boolean_to_string( + public_application_connect_enabled + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ApplicationInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ApplicationInstance]: + """ + Streams ApplicationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str friendly_name: The string that identifies the Application resources to read. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(friendly_name=friendly_name, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ApplicationInstance]: + """ + Asynchronously streams ApplicationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str friendly_name: The string that identifies the Application resources to read. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + friendly_name=friendly_name, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ApplicationInstance]: + """ + Lists ApplicationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str friendly_name: The string that identifies the Application resources to read. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ApplicationInstance]: + """ + Asynchronously lists ApplicationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str friendly_name: The string that identifies the Application resources to read. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ApplicationPage: + """ + Retrieve a single page of ApplicationInstance records from the API. + Request is executed immediately + + :param friendly_name: The string that identifies the Application resources to read. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ApplicationInstance + """ + data = values.of( + { + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ApplicationPage(self._version, response, self._solution) + + async def page_async( + self, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ApplicationPage: + """ + Asynchronously retrieve a single page of ApplicationInstance records from the API. + Request is executed immediately + + :param friendly_name: The string that identifies the Application resources to read. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ApplicationInstance + """ + data = values.of( + { + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ApplicationPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ApplicationPage: + """ + Retrieve a specific page of ApplicationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ApplicationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ApplicationPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ApplicationPage: + """ + Asynchronously retrieve a specific page of ApplicationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ApplicationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ApplicationPage(self._version, response, self._solution) + + def get(self, sid: str) -> ApplicationContext: + """ + Constructs a ApplicationContext + + :param sid: The Twilio-provided string that uniquely identifies the Application resource to update. + """ + return ApplicationContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ApplicationContext: + """ + Constructs a ApplicationContext + + :param sid: The Twilio-provided string that uniquely identifies the Application resource to update. + """ + return ApplicationContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/authorized_connect_app.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/authorized_connect_app.py new file mode 100644 index 00000000..cceb694c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/authorized_connect_app.py @@ -0,0 +1,458 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AuthorizedConnectAppInstance(InstanceResource): + + class Permission(object): + GET_ALL = "get-all" + POST_ALL = "post-all" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the AuthorizedConnectApp resource. + :ivar connect_app_company_name: The company name set for the Connect App. + :ivar connect_app_description: A detailed description of the Connect App. + :ivar connect_app_friendly_name: The name of the Connect App. + :ivar connect_app_homepage_url: The public URL for the Connect App. + :ivar connect_app_sid: The SID that we assigned to the Connect App. + :ivar permissions: The set of permissions that you authorized for the Connect App. Can be: `get-all` or `post-all`. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + connect_app_sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.connect_app_company_name: Optional[str] = payload.get( + "connect_app_company_name" + ) + self.connect_app_description: Optional[str] = payload.get( + "connect_app_description" + ) + self.connect_app_friendly_name: Optional[str] = payload.get( + "connect_app_friendly_name" + ) + self.connect_app_homepage_url: Optional[str] = payload.get( + "connect_app_homepage_url" + ) + self.connect_app_sid: Optional[str] = payload.get("connect_app_sid") + self.permissions: Optional[List["AuthorizedConnectAppInstance.Permission"]] = ( + payload.get("permissions") + ) + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "connect_app_sid": connect_app_sid or self.connect_app_sid, + } + self._context: Optional[AuthorizedConnectAppContext] = None + + @property + def _proxy(self) -> "AuthorizedConnectAppContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AuthorizedConnectAppContext for this AuthorizedConnectAppInstance + """ + if self._context is None: + self._context = AuthorizedConnectAppContext( + self._version, + account_sid=self._solution["account_sid"], + connect_app_sid=self._solution["connect_app_sid"], + ) + return self._context + + def fetch(self) -> "AuthorizedConnectAppInstance": + """ + Fetch the AuthorizedConnectAppInstance + + + :returns: The fetched AuthorizedConnectAppInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AuthorizedConnectAppInstance": + """ + Asynchronous coroutine to fetch the AuthorizedConnectAppInstance + + + :returns: The fetched AuthorizedConnectAppInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AuthorizedConnectAppContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, connect_app_sid: str): + """ + Initialize the AuthorizedConnectAppContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the AuthorizedConnectApp resource to fetch. + :param connect_app_sid: The SID of the Connect App to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "connect_app_sid": connect_app_sid, + } + self._uri = "/Accounts/{account_sid}/AuthorizedConnectApps/{connect_app_sid}.json".format( + **self._solution + ) + + def fetch(self) -> AuthorizedConnectAppInstance: + """ + Fetch the AuthorizedConnectAppInstance + + + :returns: The fetched AuthorizedConnectAppInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AuthorizedConnectAppInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + connect_app_sid=self._solution["connect_app_sid"], + ) + + async def fetch_async(self) -> AuthorizedConnectAppInstance: + """ + Asynchronous coroutine to fetch the AuthorizedConnectAppInstance + + + :returns: The fetched AuthorizedConnectAppInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AuthorizedConnectAppInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + connect_app_sid=self._solution["connect_app_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AuthorizedConnectAppPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AuthorizedConnectAppInstance: + """ + Build an instance of AuthorizedConnectAppInstance + + :param payload: Payload response from the API + """ + return AuthorizedConnectAppInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AuthorizedConnectAppList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the AuthorizedConnectAppList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the AuthorizedConnectApp resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/AuthorizedConnectApps.json".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AuthorizedConnectAppInstance]: + """ + Streams AuthorizedConnectAppInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AuthorizedConnectAppInstance]: + """ + Asynchronously streams AuthorizedConnectAppInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthorizedConnectAppInstance]: + """ + Lists AuthorizedConnectAppInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthorizedConnectAppInstance]: + """ + Asynchronously lists AuthorizedConnectAppInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthorizedConnectAppPage: + """ + Retrieve a single page of AuthorizedConnectAppInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthorizedConnectAppInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthorizedConnectAppPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthorizedConnectAppPage: + """ + Asynchronously retrieve a single page of AuthorizedConnectAppInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthorizedConnectAppInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthorizedConnectAppPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AuthorizedConnectAppPage: + """ + Retrieve a specific page of AuthorizedConnectAppInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthorizedConnectAppInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AuthorizedConnectAppPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AuthorizedConnectAppPage: + """ + Asynchronously retrieve a specific page of AuthorizedConnectAppInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthorizedConnectAppInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AuthorizedConnectAppPage(self._version, response, self._solution) + + def get(self, connect_app_sid: str) -> AuthorizedConnectAppContext: + """ + Constructs a AuthorizedConnectAppContext + + :param connect_app_sid: The SID of the Connect App to fetch. + """ + return AuthorizedConnectAppContext( + self._version, + account_sid=self._solution["account_sid"], + connect_app_sid=connect_app_sid, + ) + + def __call__(self, connect_app_sid: str) -> AuthorizedConnectAppContext: + """ + Constructs a AuthorizedConnectAppContext + + :param connect_app_sid: The SID of the Connect App to fetch. + """ + return AuthorizedConnectAppContext( + self._version, + account_sid=self._solution["account_sid"], + connect_app_sid=connect_app_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__init__.py new file mode 100644 index 00000000..fc2a6f06 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__init__.py @@ -0,0 +1,612 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.available_phone_number_country.local import LocalList +from twilio.rest.api.v2010.account.available_phone_number_country.machine_to_machine import ( + MachineToMachineList, +) +from twilio.rest.api.v2010.account.available_phone_number_country.mobile import ( + MobileList, +) +from twilio.rest.api.v2010.account.available_phone_number_country.national import ( + NationalList, +) +from twilio.rest.api.v2010.account.available_phone_number_country.shared_cost import ( + SharedCostList, +) +from twilio.rest.api.v2010.account.available_phone_number_country.toll_free import ( + TollFreeList, +) +from twilio.rest.api.v2010.account.available_phone_number_country.voip import VoipList + + +class AvailablePhoneNumberCountryInstance(InstanceResource): + """ + :ivar country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country. + :ivar country: The name of the country. + :ivar uri: The URI of the Country resource, relative to `https://api.twilio.com`. + :ivar beta: Whether all phone numbers available in the country are new to the Twilio platform. `true` if they are and `false` if all numbers are not in the Twilio Phone Number Beta program. + :ivar subresource_uris: A list of related AvailablePhoneNumber resources identified by their URIs relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + country_code: Optional[str] = None, + ): + super().__init__(version) + + self.country_code: Optional[str] = payload.get("country_code") + self.country: Optional[str] = payload.get("country") + self.uri: Optional[str] = payload.get("uri") + self.beta: Optional[bool] = payload.get("beta") + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + + self._solution = { + "account_sid": account_sid, + "country_code": country_code or self.country_code, + } + self._context: Optional[AvailablePhoneNumberCountryContext] = None + + @property + def _proxy(self) -> "AvailablePhoneNumberCountryContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AvailablePhoneNumberCountryContext for this AvailablePhoneNumberCountryInstance + """ + if self._context is None: + self._context = AvailablePhoneNumberCountryContext( + self._version, + account_sid=self._solution["account_sid"], + country_code=self._solution["country_code"], + ) + return self._context + + def fetch(self) -> "AvailablePhoneNumberCountryInstance": + """ + Fetch the AvailablePhoneNumberCountryInstance + + + :returns: The fetched AvailablePhoneNumberCountryInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AvailablePhoneNumberCountryInstance": + """ + Asynchronous coroutine to fetch the AvailablePhoneNumberCountryInstance + + + :returns: The fetched AvailablePhoneNumberCountryInstance + """ + return await self._proxy.fetch_async() + + @property + def local(self) -> LocalList: + """ + Access the local + """ + return self._proxy.local + + @property + def machine_to_machine(self) -> MachineToMachineList: + """ + Access the machine_to_machine + """ + return self._proxy.machine_to_machine + + @property + def mobile(self) -> MobileList: + """ + Access the mobile + """ + return self._proxy.mobile + + @property + def national(self) -> NationalList: + """ + Access the national + """ + return self._proxy.national + + @property + def shared_cost(self) -> SharedCostList: + """ + Access the shared_cost + """ + return self._proxy.shared_cost + + @property + def toll_free(self) -> TollFreeList: + """ + Access the toll_free + """ + return self._proxy.toll_free + + @property + def voip(self) -> VoipList: + """ + Access the voip + """ + return self._proxy.voip + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AvailablePhoneNumberCountryContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, country_code: str): + """ + Initialize the AvailablePhoneNumberCountryContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) requesting the available phone number Country resource. + :param country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country to fetch available phone number information about. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + self._uri = ( + "/Accounts/{account_sid}/AvailablePhoneNumbers/{country_code}.json".format( + **self._solution + ) + ) + + self._local: Optional[LocalList] = None + self._machine_to_machine: Optional[MachineToMachineList] = None + self._mobile: Optional[MobileList] = None + self._national: Optional[NationalList] = None + self._shared_cost: Optional[SharedCostList] = None + self._toll_free: Optional[TollFreeList] = None + self._voip: Optional[VoipList] = None + + def fetch(self) -> AvailablePhoneNumberCountryInstance: + """ + Fetch the AvailablePhoneNumberCountryInstance + + + :returns: The fetched AvailablePhoneNumberCountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AvailablePhoneNumberCountryInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + country_code=self._solution["country_code"], + ) + + async def fetch_async(self) -> AvailablePhoneNumberCountryInstance: + """ + Asynchronous coroutine to fetch the AvailablePhoneNumberCountryInstance + + + :returns: The fetched AvailablePhoneNumberCountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AvailablePhoneNumberCountryInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + country_code=self._solution["country_code"], + ) + + @property + def local(self) -> LocalList: + """ + Access the local + """ + if self._local is None: + self._local = LocalList( + self._version, + self._solution["account_sid"], + self._solution["country_code"], + ) + return self._local + + @property + def machine_to_machine(self) -> MachineToMachineList: + """ + Access the machine_to_machine + """ + if self._machine_to_machine is None: + self._machine_to_machine = MachineToMachineList( + self._version, + self._solution["account_sid"], + self._solution["country_code"], + ) + return self._machine_to_machine + + @property + def mobile(self) -> MobileList: + """ + Access the mobile + """ + if self._mobile is None: + self._mobile = MobileList( + self._version, + self._solution["account_sid"], + self._solution["country_code"], + ) + return self._mobile + + @property + def national(self) -> NationalList: + """ + Access the national + """ + if self._national is None: + self._national = NationalList( + self._version, + self._solution["account_sid"], + self._solution["country_code"], + ) + return self._national + + @property + def shared_cost(self) -> SharedCostList: + """ + Access the shared_cost + """ + if self._shared_cost is None: + self._shared_cost = SharedCostList( + self._version, + self._solution["account_sid"], + self._solution["country_code"], + ) + return self._shared_cost + + @property + def toll_free(self) -> TollFreeList: + """ + Access the toll_free + """ + if self._toll_free is None: + self._toll_free = TollFreeList( + self._version, + self._solution["account_sid"], + self._solution["country_code"], + ) + return self._toll_free + + @property + def voip(self) -> VoipList: + """ + Access the voip + """ + if self._voip is None: + self._voip = VoipList( + self._version, + self._solution["account_sid"], + self._solution["country_code"], + ) + return self._voip + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AvailablePhoneNumberCountryPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> AvailablePhoneNumberCountryInstance: + """ + Build an instance of AvailablePhoneNumberCountryInstance + + :param payload: Payload response from the API + """ + return AvailablePhoneNumberCountryInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AvailablePhoneNumberCountryList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the AvailablePhoneNumberCountryList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) requesting the available phone number Country resources. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/AvailablePhoneNumbers.json".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AvailablePhoneNumberCountryInstance]: + """ + Streams AvailablePhoneNumberCountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AvailablePhoneNumberCountryInstance]: + """ + Asynchronously streams AvailablePhoneNumberCountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AvailablePhoneNumberCountryInstance]: + """ + Lists AvailablePhoneNumberCountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AvailablePhoneNumberCountryInstance]: + """ + Asynchronously lists AvailablePhoneNumberCountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AvailablePhoneNumberCountryPage: + """ + Retrieve a single page of AvailablePhoneNumberCountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AvailablePhoneNumberCountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AvailablePhoneNumberCountryPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AvailablePhoneNumberCountryPage: + """ + Asynchronously retrieve a single page of AvailablePhoneNumberCountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AvailablePhoneNumberCountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AvailablePhoneNumberCountryPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AvailablePhoneNumberCountryPage: + """ + Retrieve a specific page of AvailablePhoneNumberCountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AvailablePhoneNumberCountryInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AvailablePhoneNumberCountryPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AvailablePhoneNumberCountryPage: + """ + Asynchronously retrieve a specific page of AvailablePhoneNumberCountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AvailablePhoneNumberCountryInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AvailablePhoneNumberCountryPage(self._version, response, self._solution) + + def get(self, country_code: str) -> AvailablePhoneNumberCountryContext: + """ + Constructs a AvailablePhoneNumberCountryContext + + :param country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country to fetch available phone number information about. + """ + return AvailablePhoneNumberCountryContext( + self._version, + account_sid=self._solution["account_sid"], + country_code=country_code, + ) + + def __call__(self, country_code: str) -> AvailablePhoneNumberCountryContext: + """ + Constructs a AvailablePhoneNumberCountryContext + + :param country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country to fetch available phone number information about. + """ + return AvailablePhoneNumberCountryContext( + self._version, + account_sid=self._solution["account_sid"], + country_code=country_code, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2760af6980ece77c6c27f9e82654231d163cfd28 GIT binary patch literal 26822 zcmeHwYj9h~mFB&`#giaG@lA@PF2yG#5|m_Ha;Qg4NtPo^qGUbn46GP}fJ+e)UcMKU zOqz5wwsu2qDX~?v6H)WBoSof}v3H`()J&Y3nN9L*y|q6Uh*CusO0H7XZf)&u%?~J) z%Z`5SclthXL4p)*DVuo9*J7jl^y7A)K7IQ1Ieo7GYk9ew!*lglXGW$@aom5Wg#OsH z$fC$|+;uL(1-J+wvBdbeC18nL1J<|@5aPCgEp89k247?7e*#Tz5zonys3L}w z5lOrhQp9soLXtyiDI%U7qwHWXC>H)B0D*#3k^QQ{vZPkZRD{~0YQZ3T>x3vy82(XlRaw6jmuTnobtsT0EMP5~w3Sr%pgp_OrK)q|+&7puazf>`*G&r_B$t(^7bZ z71^H@6UnqFMWSienJ{}vJd_v>#bRTA_x~o!@i}tV!Ngcj*dGn2bHd@MlFm7grqa=5 zA{5KnP9+e@IS;03@{@9|d{7xng!QD4&)F}AVxy9RnD<~pNrw_)X|Q4oJ_`I2V_aF;e0U}O;KK0V-W0z@e#xpv81{0fL};l zfCta8MEHQ!g|!v2NJ7La*(AH<7`8N`Xhe|g5u4tnuzm? z@IGsr;{s)o+KB6l5b)sFjo)&Va7Y!ymPnbYl$Sv(0ri-m>lm~O&~g*Bnn7y-tuR4r z8MF>iuL)YupbdalnxKsg+63r26LdZLWe2PZy=jf$jY-Ew zk_l;OG=5f+_a#RYX?aYa?9dU5#zF?77eg|52+IxpXh3{v zL;^36MXWk8MOYIP3~h=S(vc}f6XsEfpj|N`U84688`1bj3U41y%5lGVCM}OjXT&HQ z`xq-8N<_pn!=ad>!s%tkYp6AF0_`PQYit5Vbq2+~=&6{Jljr16+<h^sGMoAaJA% zh=XDbi-vH-uz?Ms6iFCJ16PYkiF9;0%C-&~PE;0wW#w~VGv~OdGKric6&i~rLy=rr zD9q?8s6-<7{HOeNE=^GOOxq^7@1pDk|332Q;kgORd2?+Q zjJ;PcF~J43{TB5~m$jJ63R(jzm9?768t+}9UBOh={*ZQUrm_yBtaU3G5cRwFg~XaiJ)B2rKiTQQw+(?Nah?GwsTfcL{1zjw)eoKe6WoMT!l}#Af9t z3XC_PLXd55!JtAzqm5j={NVDwfzziHkk08t2M?Y+y9EDefpx5 zxOn<-^z3ORnwI)fq3{K4LCR@$J@;0$rs>yfZ9@&^dk8+e%-yfxTou!ftg~UJ{@2d7yPLQDc<0>C zTW{Rnd|*oWwX<=dtM7*w-n($ice`uXlyKFvu+jI!&F^iVm2Pi*5^3i`$L1d%dhgIJ z`|XY$NV^tx@BjJBKYMw>)4FK2>~T{YEqOQB+`Z7;^Q-3Fv-{_JcV~Nd-?Lepka@Kt z@8q825AjpNcgq*iBQ9r`rSzzr2x|+5U>xC_EwP)3Tqokf@6zY;j&xz+aOaJMQ7E?p zQSvm~E99~5_XDdgz=B+j=1TVhTbK}9ht9hhfgsSNDoG3_z#dik1^WsUU_|g*#(wpT zUX4eqxg;HjQnVF<85#|O%85ls6X!(iebMA7xO|uhS@Da5;K_PhI+XElFy7aQKWgk= zd%r3rQcnj|v=jH$cZ}uR@4lj5qj#&6)wgP++l8ehZv+y3g4~Ut+{RVf(B6jysxfD| z3svTLxd%TAQHUsSqDJgN8sFIXrd1l#JLFf(9;7CoMR1wRS8|@pw|7tP&XkFFn)fVJ z)?6>YR=&_IzB_bdXm)qD`D+U;ZSTHvO5SqLa9&2C3zC7L~NP%H{*k1ooAlK2O28R$D8rNbkPI@T~ocd3abv1piDSz$w6 z!Y+(A`z-QS^ety&mE|pnn{Y2biS)Q{4W06{`hP^#>k$C&6@m}Z2dGMFUSlQWQ zL{27XRfUss5<3K>DXbdS`QHovhx7?3V|@sQ=zO$n8g>9Va764>$D$kFH69%t}ngMEeuyCx2=HZWFlfNfcCTgKV;xChv248t_Qgr+et^7J7( z^_*pc+((04lQgF{ak=C$+q2&GjI;f553|P@ifNb%Q-nY`RnkVbKGHH%=CZ*apuw(* zXPH|0PRa3hWxZV)XV>E%Zw^>sx@>%hX?#6v86Q>u(~?8mko9iJI5#XG8l7C( z{&EEoXxRDl#FLji5z7@4<4f!^rB2+sn6;nNWAAHiPC_q#-Z;}1UQ#&4laT+QAdnxE zlNX_a5JTdy9F-E0*ccQKDV*$Z{9_!Tlr(lk-2qmtLK_A>4|uU?t0h!CfxkssJi0XW zEgWG^W8jngq$R?YLe2y~VR>Ie&G-51JkMQSFK}Z#NkDU!aog*YyI-FinuE5L&K9Bc zoHb|hZ^`i&a{NVwP>-%KS^I%&7b${YOUZl2zrL2~4h9Js!JvN^+k2HgexrdO&^YK^ z&cu&jHJ$j${#%2$UY*(T?w%WaX4__8m|x$YZ94JWMFC~r+|b64e{GklTJl2`?thVv z%>Fg>L4193&zz7G&L^V@c7({;a2Ag%@(Hv%XJN+)(mAkGmqJ+5220umwfAe|$$II( zKoiPN1Q0MhTy@>`o@+fA$cOuXKJ>Gp`CZ4dyN=!7b^O;&CvI1rm~t$5pP%=>koCT> z;Hk!`xze5IEG{=&1wNjnzh1N?lW3*K8z|mNy(6U~bRF(sFrJKz#whLy2498#UCVI< zgOOwy9jl;52$4Cfl9pwfQ<)CdOo5Pd;sAw%WqORs`b?;oNu-o3DIobuUPl2*9C8%} z&rncJ!9EH|oRWzqHC9*0N|tEYD)C4qN+TmBZGbuVOI4*7nZWZ#evDg%HF1QE|cM z&vZOZd440$Z{%&9aZ}btBWt6P)iKjcSsg}JhmqAi^9p5k8(G~(R_Dwv%IY+-I*lyx zoe|0sjVv+maoOB6?Vob^VN}C#7zQ$phbEey#s7n#*ytcxHG_jNY-ffA;fg0=7dJD=}NY2RDGVI$_vvf&>v%KxdX@&^{r4! zeLG=|@Jx-VaZ?V)(uk#`x>JbKhGc%5_SV1VzsEzDWaLDwNKsGN!&3T;aV%wQM=VuP zpi(_oQ9a$fq}D6b^Tw<`Tj(RKC}TT62rX$e6pN1Ic#HGaDr{6!!7b4XWX6&XZCP04}Ms<}|LL|}6hwVtt8%VYmfOi2a3 z!V0~OCe+;+$~`f37Rrc1cbO7xe6U|bmeT*a38#}Kg=&;Bk8aX`UP&f~<~W~6ZU>#P zjeu>BY+uX?WR8JqjcwbxYW<*UI;7y0dsf8rR?by^)djxWy9Ju+vW0!mkv3ag=-Y~6sciRGV z%txk=K*n2WXnwciM#as^Y{OFvjVwC z`zIeLRc&Ua>LZX7BbgOQ%|WF0fwMqPP~Gles#}*#+I4x9f{PSfqTn?IL#2sEew_+1 zs$tS?G1bTu$StN6rdD0;j8Q}>s#cXG3FQq0>{tUnv;xV149ahm&o^w%Hf&v}ZkUO@ z8@&;|RS(9~xNVWMG`c_KEYzAG24=qKyLI9>PT^Z?z z3F+Ny*jeeEJ-8I#1JeVUvX(oIZ4bwH6XE-L72o62;~8h;a(vTSor#WD5c$Kf$;d;5 z#G?p`gk0(=9X}tV$wYpE-gKOTlL(5>4BrG~e9s!DNjDdiFpZqV?8$#b?FXo}r$3k7 zLtA@f_K;tuHeNwswrenb{F=5ay^BLcO*_%d8Z8pCj0n!^~b8N z0b?J4)vpIbQuSCgR^2-3!3}5Jc2@6{uDTl&V*TdQr)fQRqAjM=GSmw*J8lU-t@ugB zhm+YYNA4HfB8zw`YO36y2;w>n$>`(|qT|~>7pJ0r?U65_;<9u58ES1c9UU8!&Ywmw zo<%3BF#c4zpJyA^kk7T0+faXH#%*ZxQZfB+D0YSd)|1T?+eE>X9s~$oeMk{oaNFDq z_3LN$-K?JZ#`}vvn`yBnUKCniL){t(nS!}>$mNLc-3(OE_ zB}1HxgHKQ$c>qaF4@Sl~EoO&Dkc)INZE=~cBy9A3G<*WQ2Tk_QM&9Gcyk5b zTo>`eV~ctskl$0F-js&NQ=lP&(ICGO`PE1_nbI{#uSXv7$Xdh;o>29xa!PV5E0|Ei zM9ca^;tr)3Ne{Zjq6wS8QiqfXZiYn38fkFRN4IA(Ya?7xzlgPwMz)Nd{{LWVR5Yhd zSRq8l=*PExF6*6Yu460;Hnet3?h=cgOxkSdE7)d1>zBPnwX6}_!+Xt!wbghlO@d)n zBS}f2!}e#TtZL;=GduHEi{{Q@=W37fnVN6R*Bs5(9EDM>*1b?s^>$)90i#+iTt2?* zVq7t2i$&wnbk3E+4ge3Uaf#h>DNV>fz`IvcPM5kuZ@%m_NoFuw5=$O3;}eb`3SfBj zOv2oMUX2!orHpG60_t0-zJ95S?u3P2#kw>0^b=`W3dPstBmwCFm(3$ek#HcwCpx5i z>cUS13m)wiEWpfrnl9}ybD9_njYo0wj9k~q@l9f^d&o<`{3;1RWi*yXm*DEBI*Y)Mpty^@qC(z;Xra(8B;ry$DUTI8 zVp<29(Vg{RKs=SgXyE(@!Z18zRL>{X8BiS)F5|23_iHHW@fn?`wN-e|jpCjHE_F$` zi~vt%30y?0Dxybp?*TqJ>~(%o+%FA>FhKIFP9#;R(X7@@gH{K0r$*+ZXmm^U5uh<> zml1l!OCwT(c}6NyT7(N{OdM4T_eKj{)njxOBck<$`90IfpW1>3*;~-hgTvH6qbt;3 zRDhR4#OSWxSmF2VXd1MnVzy8L^TlYY$ES8Jl*X;N6kNFp!yz~ejjYyHwY5vpwCa`; z$MxUB9J3CJw61%_s9*An@K@?#HG0LZTefWRnOMBxdZf8ZF`p>hBw^?pi%O8lM^n@( z^^F=K8l#o3VHx5!8U4ubAOH&_**RB6g9x%pN=_h*Js zg5ge;0>6*sc-JbY0LCrVmj4y;O3i}NgZpXMTduXtuiKPew`uk%IMJ=!HDzD$R=+(q zJ$7^Z?B;Cy_NlSkUU<&k1rV-8^Ip2ReRKb8*RA@w{@dPxjB`L$y@0bA5B2XY{4M?` z1o|D&lB~;IORN6Hm?KQR)*@5y=Vg{cF|&jTx1E`AZK2EPq%oOh2OKag6{%nG(64wX zd6$31Lw~0{RQ?mNh#@lzmH#auIXByEnA=&-qpnEJ3GF(vl_lKr&jDLi7h&R-YBPUD zJo6<~Q@zkuVw<&%*MrxBvlnk&$oB7jCwRMd-@JF9iF5k0Uf*oTE&HuYKk?r7K9g}i zleclu1Uyi@X#35l23z=_@`LMz4?7Sm5;P6n65SP8qFY*lgMPs4g5Ud^_y_^e5~?us zG8*WkvaT2j;s$p-m54n3UzS9h-mS-L58X!_7X-TH;5cCdi*hDFX=Ua@E`zFlWt*u((d z!r$UJ0z;tE7B)b}L&8&G=|d>8n1!Nk+}qZ$TZlvsP&rVst00E4gOr) zQD)M50wK?0mpCR2Swk&m2C_sLqQQQ}PxJ-x6+ii6M?RvWRStZA==?V524S8u!FLu?^2mb&P{_>g^g7`h!3Nfzfd+yoQ3SWs$jASK1lOjJF;Cn4BpcH zGROgz0wWEf2I3wUGs0OTzPfg0`O;ff`9fK%E)tem;1LY`deiS8h*2W zCx3(Y3x8(c$=|eW7k(gYv;PNvi~EPxZT24t+l9a3ck;LRZT7$Aw+nyg+{tUQSUPz@ zO61CzT&5~WihNoOd4|IP%<{|%mNEddP(HHDNW5vrOa^g@ZoQ#eLLv=hTI zQUXGDL{~~SN6MNN6kDo>rdQWYF?HHgTTH_-R5&z>HR96f1n&L2jM2*^tmmARK7kHB z@UY7aiFDt|v6S?n&Fnz%S|1#P`p843Z&Z#+3Hth5WXWalIYAyngQ`P;onc*(X_xn@ zUIeBK;iURuDs|S_=PLVW(?6b^oBVL(BjLYQ{FjQ` z-j_1YmsCv?u}=Ll1S5PmbWLstBq05vaubMaPP4f7IJgUhxlYv;A@n0NmsujZVSRkX zbkxORc-j%=Gt1BKh3Uxu9yBh`QZPrsCY4TY*Q&A0WAW^;5}* z%Nh&^OtVrB^Q-b*R8pNr9*qsasi@^f%Y5V3Y@^AuL}dd_&@%dEFGkzFg_|7{yoYE1uWycY{w4jpWuaP zaO(JB!$hVTn*h~qbVOE9iIb1L4rYxiXv`{o;;%r-tb-?%s1xc3)NeYELz zS|^tSn2*J7l*Y-x!&Mqi#6=#&o%kdr=@tatao9YG#*X~BCtLnU8tXq%@XrX$#EN( zG~{btdd;+gvLy;SD4=sx&I-GWOgazs)+s5$WfEYRDodt`l1b|=zefQ{EjimLZVabo zI$GxJ$+PFBa9Z7I>1-)8Ve}s;_A?3??Ga_kzo6g@1to90e~)q~cokSyM2v>rcCWO# z>9#w5ZiPRgpL`D|b}Y1a-*eR4cHZ^Y&se7?^ESls<(-=5nSIxG=P3tYR&ZBks-DWa zwlBIUy}eLvkT=yEq)+w~Dk6!R^|(i$b?u~@02oypaHm#(BjTotltR6VOvTo$YuloW z(ogGeY&2Cv+*FNH=4zB4;5Kdfar0dB0)BeudKY^9KlaRd?zuMDzRBOMX`E@Fxj3^q zTho=d5d@9Zt)F?~rhR5-wzfO(U@#|#a@8}#GwX5U&a;|un{oRV%UJdS{&)V0y}TQp zyZJ;Oclp1`XEr~-$Rha$O3o@8c*lzcu=}Q!pzcf$D~n6ZNZdT3!upO2X{ zL^4CZZaIQqNPuH0sL#~zNYTPn3780-(W^@6MBceFRao?&4dFxCjINta5Wjwb9iLob zAK;S9s8UPGA`o!d|K&mUP?<(^nHZ^fjr?-TuQumvS4f$=Nv_hIL*l5acG|0f(M;M; zU)^V4<@Re|R`G}QZ_1SXDz~3GkTYME+|fsBXt`rF^SRFLd$d;7&uUf?W}bbdmUJIh z<`kRz#v`?5^37!ap1A{$)STgN$Q&4RgOAi0`_N$>@TD?r#$cI1$T(=RufPN6F7*p+ zd*s`wLHn2T9RztR&-3>z9$xsgnd6V}^W5Pqclcwj^<(bokGX-5xosbF-5+ypA9LUQ z#A4wspV&(U9RCu3-#)?f?#!lv`w+W$_x(4lNel0u-Eg0y-}@0;4Zoki8M)8V?|r{w PrDW_A2(5^)t?K^*PgsF@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/local.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/local.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1dadf36310e8bd0af5f4362d77ce9c578a95ecd GIT binary patch literal 48377 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 C0!gy~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/national.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/national.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4205f515bb537057a790919377b396d5f675a79e GIT binary patch literal 48082 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/toll_free.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/__pycache__/toll_free.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0b85e3f0b163ab9e784ef751bac48781d2449b5 GIT binary patch literal 48083 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/local.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/local.py new file mode 100644 index 00000000..4f0b2e79 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/local.py @@ -0,0 +1,664 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class LocalInstance(InstanceResource): + """ + :ivar friendly_name: A formatted version of the phone number. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar lata: The [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) of this phone number. Available for only phone numbers from the US and Canada. + :ivar locality: The locality or city of this phone number's location. + :ivar rate_center: The [rate center](https://en.wikipedia.org/wiki/Telephone_exchange) of this phone number. Available for only phone numbers from the US and Canada. + :ivar latitude: The latitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar longitude: The longitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar region: The two-letter state or province abbreviation of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar postal_code: The postal or ZIP code of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of this phone number. + :ivar address_requirements: The type of [Address](https://www.twilio.com/docs/usage/api/address) resource the phone number requires. Can be: `none`, `any`, `local`, or `foreign`. `none` means no address is required. `any` means an address is required, but it can be anywhere in the world. `local` means an address in the phone number's country is required. `foreign` means an address outside of the phone number's country is required. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + country_code: str, + ): + super().__init__(version) + + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.phone_number: Optional[str] = payload.get("phone_number") + self.lata: Optional[str] = payload.get("lata") + self.locality: Optional[str] = payload.get("locality") + self.rate_center: Optional[str] = payload.get("rate_center") + self.latitude: Optional[float] = deserialize.decimal(payload.get("latitude")) + self.longitude: Optional[float] = deserialize.decimal(payload.get("longitude")) + self.region: Optional[str] = payload.get("region") + self.postal_code: Optional[str] = payload.get("postal_code") + self.iso_country: Optional[str] = payload.get("iso_country") + self.address_requirements: Optional[str] = payload.get("address_requirements") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class LocalPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> LocalInstance: + """ + Build an instance of LocalInstance + + :param payload: Payload response from the API + """ + return LocalInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + country_code=self._solution["country_code"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class LocalList(ListResource): + + def __init__(self, version: Version, account_sid: str, country_code: str): + """ + Initialize the LocalList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) requesting the AvailablePhoneNumber resources. + :param country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country from which to read phone numbers. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + self._uri = "/Accounts/{account_sid}/AvailablePhoneNumbers/{country_code}/Local.json".format( + **self._solution + ) + + def stream( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[LocalInstance]: + """ + Streams LocalInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-number-pattern) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-character-pattern). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[LocalInstance]: + """ + Asynchronously streams LocalInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-number-pattern) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-character-pattern). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[LocalInstance]: + """ + Lists LocalInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-number-pattern) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-character-pattern). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[LocalInstance]: + """ + Asynchronously lists LocalInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-number-pattern) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-character-pattern). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> LocalPage: + """ + Retrieve a single page of LocalInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-number-pattern) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-character-pattern). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of LocalInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return LocalPage(self._version, response, self._solution) + + async def page_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> LocalPage: + """ + Asynchronously retrieve a single page of LocalInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-number-pattern) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-character-pattern). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of LocalInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return LocalPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> LocalPage: + """ + Retrieve a specific page of LocalInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of LocalInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return LocalPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> LocalPage: + """ + Asynchronously retrieve a specific page of LocalInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of LocalInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return LocalPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/machine_to_machine.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/machine_to_machine.py new file mode 100644 index 00000000..5695c917 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/machine_to_machine.py @@ -0,0 +1,664 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MachineToMachineInstance(InstanceResource): + """ + :ivar friendly_name: A formatted version of the phone number. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar lata: The [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) of this phone number. Available for only phone numbers from the US and Canada. + :ivar locality: The locality or city of this phone number's location. + :ivar rate_center: The [rate center](https://en.wikipedia.org/wiki/Telephone_exchange) of this phone number. Available for only phone numbers from the US and Canada. + :ivar latitude: The latitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar longitude: The longitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar region: The two-letter state or province abbreviation of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar postal_code: The postal or ZIP code of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of this phone number. + :ivar address_requirements: The type of [Address](https://www.twilio.com/docs/usage/api/address) resource the phone number requires. Can be: `none`, `any`, `local`, or `foreign`. `none` means no address is required. `any` means an address is required, but it can be anywhere in the world. `local` means an address in the phone number's country is required. `foreign` means an address outside of the phone number's country is required. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + country_code: str, + ): + super().__init__(version) + + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.phone_number: Optional[str] = payload.get("phone_number") + self.lata: Optional[str] = payload.get("lata") + self.locality: Optional[str] = payload.get("locality") + self.rate_center: Optional[str] = payload.get("rate_center") + self.latitude: Optional[float] = deserialize.decimal(payload.get("latitude")) + self.longitude: Optional[float] = deserialize.decimal(payload.get("longitude")) + self.region: Optional[str] = payload.get("region") + self.postal_code: Optional[str] = payload.get("postal_code") + self.iso_country: Optional[str] = payload.get("iso_country") + self.address_requirements: Optional[str] = payload.get("address_requirements") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MachineToMachinePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MachineToMachineInstance: + """ + Build an instance of MachineToMachineInstance + + :param payload: Payload response from the API + """ + return MachineToMachineInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + country_code=self._solution["country_code"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MachineToMachineList(ListResource): + + def __init__(self, version: Version, account_sid: str, country_code: str): + """ + Initialize the MachineToMachineList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) requesting the AvailablePhoneNumber resources. + :param country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country from which to read phone numbers. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + self._uri = "/Accounts/{account_sid}/AvailablePhoneNumbers/{country_code}/MachineToMachine.json".format( + **self._solution + ) + + def stream( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MachineToMachineInstance]: + """ + Streams MachineToMachineInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MachineToMachineInstance]: + """ + Asynchronously streams MachineToMachineInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MachineToMachineInstance]: + """ + Lists MachineToMachineInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MachineToMachineInstance]: + """ + Asynchronously lists MachineToMachineInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MachineToMachinePage: + """ + Retrieve a single page of MachineToMachineInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MachineToMachineInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MachineToMachinePage(self._version, response, self._solution) + + async def page_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MachineToMachinePage: + """ + Asynchronously retrieve a single page of MachineToMachineInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MachineToMachineInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MachineToMachinePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MachineToMachinePage: + """ + Retrieve a specific page of MachineToMachineInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MachineToMachineInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MachineToMachinePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MachineToMachinePage: + """ + Asynchronously retrieve a specific page of MachineToMachineInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MachineToMachineInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MachineToMachinePage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/mobile.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/mobile.py new file mode 100644 index 00000000..2382155e --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/mobile.py @@ -0,0 +1,664 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MobileInstance(InstanceResource): + """ + :ivar friendly_name: A formatted version of the phone number. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar lata: The [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) of this phone number. Available for only phone numbers from the US and Canada. + :ivar locality: The locality or city of this phone number's location. + :ivar rate_center: The [rate center](https://en.wikipedia.org/wiki/Telephone_exchange) of this phone number. Available for only phone numbers from the US and Canada. + :ivar latitude: The latitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar longitude: The longitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar region: The two-letter state or province abbreviation of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar postal_code: The postal or ZIP code of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of this phone number. + :ivar address_requirements: The type of [Address](https://www.twilio.com/docs/usage/api/address) resource the phone number requires. Can be: `none`, `any`, `local`, or `foreign`. `none` means no address is required. `any` means an address is required, but it can be anywhere in the world. `local` means an address in the phone number's country is required. `foreign` means an address outside of the phone number's country is required. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + country_code: str, + ): + super().__init__(version) + + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.phone_number: Optional[str] = payload.get("phone_number") + self.lata: Optional[str] = payload.get("lata") + self.locality: Optional[str] = payload.get("locality") + self.rate_center: Optional[str] = payload.get("rate_center") + self.latitude: Optional[float] = deserialize.decimal(payload.get("latitude")) + self.longitude: Optional[float] = deserialize.decimal(payload.get("longitude")) + self.region: Optional[str] = payload.get("region") + self.postal_code: Optional[str] = payload.get("postal_code") + self.iso_country: Optional[str] = payload.get("iso_country") + self.address_requirements: Optional[str] = payload.get("address_requirements") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MobilePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MobileInstance: + """ + Build an instance of MobileInstance + + :param payload: Payload response from the API + """ + return MobileInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + country_code=self._solution["country_code"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MobileList(ListResource): + + def __init__(self, version: Version, account_sid: str, country_code: str): + """ + Initialize the MobileList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) requesting the AvailablePhoneNumber resources. + :param country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country from which to read phone numbers. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + self._uri = "/Accounts/{account_sid}/AvailablePhoneNumbers/{country_code}/Mobile.json".format( + **self._solution + ) + + def stream( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MobileInstance]: + """ + Streams MobileInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MobileInstance]: + """ + Asynchronously streams MobileInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MobileInstance]: + """ + Lists MobileInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MobileInstance]: + """ + Asynchronously lists MobileInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MobilePage: + """ + Retrieve a single page of MobileInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MobileInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MobilePage(self._version, response, self._solution) + + async def page_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MobilePage: + """ + Asynchronously retrieve a single page of MobileInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MobileInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MobilePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MobilePage: + """ + Retrieve a specific page of MobileInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MobileInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MobilePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MobilePage: + """ + Asynchronously retrieve a specific page of MobileInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MobileInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MobilePage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/national.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/national.py new file mode 100644 index 00000000..a5e92642 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/national.py @@ -0,0 +1,664 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class NationalInstance(InstanceResource): + """ + :ivar friendly_name: A formatted version of the phone number. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar lata: The [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) of this phone number. Available for only phone numbers from the US and Canada. + :ivar locality: The locality or city of this phone number's location. + :ivar rate_center: The [rate center](https://en.wikipedia.org/wiki/Telephone_exchange) of this phone number. Available for only phone numbers from the US and Canada. + :ivar latitude: The latitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar longitude: The longitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar region: The two-letter state or province abbreviation of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar postal_code: The postal or ZIP code of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of this phone number. + :ivar address_requirements: The type of [Address](https://www.twilio.com/docs/usage/api/address) resource the phone number requires. Can be: `none`, `any`, `local`, or `foreign`. `none` means no address is required. `any` means an address is required, but it can be anywhere in the world. `local` means an address in the phone number's country is required. `foreign` means an address outside of the phone number's country is required. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + country_code: str, + ): + super().__init__(version) + + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.phone_number: Optional[str] = payload.get("phone_number") + self.lata: Optional[str] = payload.get("lata") + self.locality: Optional[str] = payload.get("locality") + self.rate_center: Optional[str] = payload.get("rate_center") + self.latitude: Optional[float] = deserialize.decimal(payload.get("latitude")) + self.longitude: Optional[float] = deserialize.decimal(payload.get("longitude")) + self.region: Optional[str] = payload.get("region") + self.postal_code: Optional[str] = payload.get("postal_code") + self.iso_country: Optional[str] = payload.get("iso_country") + self.address_requirements: Optional[str] = payload.get("address_requirements") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NationalPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> NationalInstance: + """ + Build an instance of NationalInstance + + :param payload: Payload response from the API + """ + return NationalInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + country_code=self._solution["country_code"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class NationalList(ListResource): + + def __init__(self, version: Version, account_sid: str, country_code: str): + """ + Initialize the NationalList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) requesting the AvailablePhoneNumber resources. + :param country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country from which to read phone numbers. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + self._uri = "/Accounts/{account_sid}/AvailablePhoneNumbers/{country_code}/National.json".format( + **self._solution + ) + + def stream( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[NationalInstance]: + """ + Streams NationalInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[NationalInstance]: + """ + Asynchronously streams NationalInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[NationalInstance]: + """ + Lists NationalInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[NationalInstance]: + """ + Asynchronously lists NationalInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> NationalPage: + """ + Retrieve a single page of NationalInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of NationalInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return NationalPage(self._version, response, self._solution) + + async def page_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> NationalPage: + """ + Asynchronously retrieve a single page of NationalInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of NationalInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return NationalPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> NationalPage: + """ + Retrieve a specific page of NationalInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of NationalInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return NationalPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> NationalPage: + """ + Asynchronously retrieve a specific page of NationalInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of NationalInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return NationalPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/shared_cost.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/shared_cost.py new file mode 100644 index 00000000..3a9c02ba --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/shared_cost.py @@ -0,0 +1,664 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class SharedCostInstance(InstanceResource): + """ + :ivar friendly_name: A formatted version of the phone number. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar lata: The [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) of this phone number. Available for only phone numbers from the US and Canada. + :ivar locality: The locality or city of this phone number's location. + :ivar rate_center: The [rate center](https://en.wikipedia.org/wiki/Telephone_exchange) of this phone number. Available for only phone numbers from the US and Canada. + :ivar latitude: The latitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar longitude: The longitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar region: The two-letter state or province abbreviation of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar postal_code: The postal or ZIP code of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of this phone number. + :ivar address_requirements: The type of [Address](https://www.twilio.com/docs/usage/api/address) resource the phone number requires. Can be: `none`, `any`, `local`, or `foreign`. `none` means no address is required. `any` means an address is required, but it can be anywhere in the world. `local` means an address in the phone number's country is required. `foreign` means an address outside of the phone number's country is required. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + country_code: str, + ): + super().__init__(version) + + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.phone_number: Optional[str] = payload.get("phone_number") + self.lata: Optional[str] = payload.get("lata") + self.locality: Optional[str] = payload.get("locality") + self.rate_center: Optional[str] = payload.get("rate_center") + self.latitude: Optional[float] = deserialize.decimal(payload.get("latitude")) + self.longitude: Optional[float] = deserialize.decimal(payload.get("longitude")) + self.region: Optional[str] = payload.get("region") + self.postal_code: Optional[str] = payload.get("postal_code") + self.iso_country: Optional[str] = payload.get("iso_country") + self.address_requirements: Optional[str] = payload.get("address_requirements") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SharedCostPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SharedCostInstance: + """ + Build an instance of SharedCostInstance + + :param payload: Payload response from the API + """ + return SharedCostInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + country_code=self._solution["country_code"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SharedCostList(ListResource): + + def __init__(self, version: Version, account_sid: str, country_code: str): + """ + Initialize the SharedCostList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) requesting the AvailablePhoneNumber resources. + :param country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country from which to read phone numbers. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + self._uri = "/Accounts/{account_sid}/AvailablePhoneNumbers/{country_code}/SharedCost.json".format( + **self._solution + ) + + def stream( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SharedCostInstance]: + """ + Streams SharedCostInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SharedCostInstance]: + """ + Asynchronously streams SharedCostInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SharedCostInstance]: + """ + Lists SharedCostInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SharedCostInstance]: + """ + Asynchronously lists SharedCostInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SharedCostPage: + """ + Retrieve a single page of SharedCostInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SharedCostInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SharedCostPage(self._version, response, self._solution) + + async def page_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SharedCostPage: + """ + Asynchronously retrieve a single page of SharedCostInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SharedCostInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SharedCostPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> SharedCostPage: + """ + Retrieve a specific page of SharedCostInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SharedCostInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SharedCostPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> SharedCostPage: + """ + Asynchronously retrieve a specific page of SharedCostInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SharedCostInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SharedCostPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/toll_free.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/toll_free.py new file mode 100644 index 00000000..de4a2d98 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/toll_free.py @@ -0,0 +1,664 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class TollFreeInstance(InstanceResource): + """ + :ivar friendly_name: A formatted version of the phone number. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar lata: The [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) of this phone number. Available for only phone numbers from the US and Canada. + :ivar locality: The locality or city of this phone number's location. + :ivar rate_center: The [rate center](https://en.wikipedia.org/wiki/Telephone_exchange) of this phone number. Available for only phone numbers from the US and Canada. + :ivar latitude: The latitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar longitude: The longitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar region: The two-letter state or province abbreviation of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar postal_code: The postal or ZIP code of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of this phone number. + :ivar address_requirements: The type of [Address](https://www.twilio.com/docs/usage/api/address) resource the phone number requires. Can be: `none`, `any`, `local`, or `foreign`. `none` means no address is required. `any` means an address is required, but it can be anywhere in the world. `local` means an address in the phone number's country is required. `foreign` means an address outside of the phone number's country is required. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + country_code: str, + ): + super().__init__(version) + + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.phone_number: Optional[str] = payload.get("phone_number") + self.lata: Optional[str] = payload.get("lata") + self.locality: Optional[str] = payload.get("locality") + self.rate_center: Optional[str] = payload.get("rate_center") + self.latitude: Optional[float] = deserialize.decimal(payload.get("latitude")) + self.longitude: Optional[float] = deserialize.decimal(payload.get("longitude")) + self.region: Optional[str] = payload.get("region") + self.postal_code: Optional[str] = payload.get("postal_code") + self.iso_country: Optional[str] = payload.get("iso_country") + self.address_requirements: Optional[str] = payload.get("address_requirements") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TollFreePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> TollFreeInstance: + """ + Build an instance of TollFreeInstance + + :param payload: Payload response from the API + """ + return TollFreeInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + country_code=self._solution["country_code"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class TollFreeList(ListResource): + + def __init__(self, version: Version, account_sid: str, country_code: str): + """ + Initialize the TollFreeList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) requesting the AvailablePhoneNumber resources. + :param country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country from which to read phone numbers. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + self._uri = "/Accounts/{account_sid}/AvailablePhoneNumbers/{country_code}/TollFree.json".format( + **self._solution + ) + + def stream( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[TollFreeInstance]: + """ + Streams TollFreeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[TollFreeInstance]: + """ + Asynchronously streams TollFreeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TollFreeInstance]: + """ + Lists TollFreeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TollFreeInstance]: + """ + Asynchronously lists TollFreeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TollFreePage: + """ + Retrieve a single page of TollFreeInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TollFreeInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TollFreePage(self._version, response, self._solution) + + async def page_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TollFreePage: + """ + Asynchronously retrieve a single page of TollFreeInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TollFreeInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TollFreePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> TollFreePage: + """ + Retrieve a specific page of TollFreeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TollFreeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return TollFreePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> TollFreePage: + """ + Asynchronously retrieve a specific page of TollFreeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TollFreeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return TollFreePage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/voip.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/voip.py new file mode 100644 index 00000000..9ebfae53 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/available_phone_number_country/voip.py @@ -0,0 +1,664 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class VoipInstance(InstanceResource): + """ + :ivar friendly_name: A formatted version of the phone number. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar lata: The [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) of this phone number. Available for only phone numbers from the US and Canada. + :ivar locality: The locality or city of this phone number's location. + :ivar rate_center: The [rate center](https://en.wikipedia.org/wiki/Telephone_exchange) of this phone number. Available for only phone numbers from the US and Canada. + :ivar latitude: The latitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar longitude: The longitude of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar region: The two-letter state or province abbreviation of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar postal_code: The postal or ZIP code of this phone number's location. Available for only phone numbers from the US and Canada. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of this phone number. + :ivar address_requirements: The type of [Address](https://www.twilio.com/docs/usage/api/address) resource the phone number requires. Can be: `none`, `any`, `local`, or `foreign`. `none` means no address is required. `any` means an address is required, but it can be anywhere in the world. `local` means an address in the phone number's country is required. `foreign` means an address outside of the phone number's country is required. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + country_code: str, + ): + super().__init__(version) + + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.phone_number: Optional[str] = payload.get("phone_number") + self.lata: Optional[str] = payload.get("lata") + self.locality: Optional[str] = payload.get("locality") + self.rate_center: Optional[str] = payload.get("rate_center") + self.latitude: Optional[float] = deserialize.decimal(payload.get("latitude")) + self.longitude: Optional[float] = deserialize.decimal(payload.get("longitude")) + self.region: Optional[str] = payload.get("region") + self.postal_code: Optional[str] = payload.get("postal_code") + self.iso_country: Optional[str] = payload.get("iso_country") + self.address_requirements: Optional[str] = payload.get("address_requirements") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class VoipPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> VoipInstance: + """ + Build an instance of VoipInstance + + :param payload: Payload response from the API + """ + return VoipInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + country_code=self._solution["country_code"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class VoipList(ListResource): + + def __init__(self, version: Version, account_sid: str, country_code: str): + """ + Initialize the VoipList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) requesting the AvailablePhoneNumber resources. + :param country_code: The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country from which to read phone numbers. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "country_code": country_code, + } + self._uri = "/Accounts/{account_sid}/AvailablePhoneNumbers/{country_code}/Voip.json".format( + **self._solution + ) + + def stream( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[VoipInstance]: + """ + Streams VoipInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[VoipInstance]: + """ + Asynchronously streams VoipInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[VoipInstance]: + """ + Lists VoipInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[VoipInstance]: + """ + Asynchronously lists VoipInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param str contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param bool sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param bool mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param bool voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param bool exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param bool beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param str near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param int distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param str in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param str in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param str in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param str in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param str in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param bool fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + area_code=area_code, + contains=contains, + sms_enabled=sms_enabled, + mms_enabled=mms_enabled, + voice_enabled=voice_enabled, + exclude_all_address_required=exclude_all_address_required, + exclude_local_address_required=exclude_local_address_required, + exclude_foreign_address_required=exclude_foreign_address_required, + beta=beta, + near_number=near_number, + near_lat_long=near_lat_long, + distance=distance, + in_postal_code=in_postal_code, + in_region=in_region, + in_rate_center=in_rate_center, + in_lata=in_lata, + in_locality=in_locality, + fax_enabled=fax_enabled, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> VoipPage: + """ + Retrieve a single page of VoipInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of VoipInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return VoipPage(self._version, response, self._solution) + + async def page_async( + self, + area_code: Union[int, object] = values.unset, + contains: Union[str, object] = values.unset, + sms_enabled: Union[bool, object] = values.unset, + mms_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + exclude_all_address_required: Union[bool, object] = values.unset, + exclude_local_address_required: Union[bool, object] = values.unset, + exclude_foreign_address_required: Union[bool, object] = values.unset, + beta: Union[bool, object] = values.unset, + near_number: Union[str, object] = values.unset, + near_lat_long: Union[str, object] = values.unset, + distance: Union[int, object] = values.unset, + in_postal_code: Union[str, object] = values.unset, + in_region: Union[str, object] = values.unset, + in_rate_center: Union[str, object] = values.unset, + in_lata: Union[str, object] = values.unset, + in_locality: Union[str, object] = values.unset, + fax_enabled: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> VoipPage: + """ + Asynchronously retrieve a single page of VoipInstance records from the API. + Request is executed immediately + + :param area_code: The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + :param contains: The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + :param sms_enabled: Whether the phone numbers can receive text messages. Can be: `true` or `false`. + :param mms_enabled: Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + :param voice_enabled: Whether the phone numbers can receive calls. Can be: `true` or `false`. + :param exclude_all_address_required: Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_local_address_required: Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param exclude_foreign_address_required: Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + :param beta: Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param near_number: Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + :param near_lat_long: Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + :param distance: The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + :param in_postal_code: Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + :param in_region: Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + :param in_rate_center: Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + :param in_lata: Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + :param in_locality: Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + :param fax_enabled: Whether the phone numbers can receive faxes. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of VoipInstance + """ + data = values.of( + { + "AreaCode": area_code, + "Contains": contains, + "SmsEnabled": serialize.boolean_to_string(sms_enabled), + "MmsEnabled": serialize.boolean_to_string(mms_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "ExcludeAllAddressRequired": serialize.boolean_to_string( + exclude_all_address_required + ), + "ExcludeLocalAddressRequired": serialize.boolean_to_string( + exclude_local_address_required + ), + "ExcludeForeignAddressRequired": serialize.boolean_to_string( + exclude_foreign_address_required + ), + "Beta": serialize.boolean_to_string(beta), + "NearNumber": near_number, + "NearLatLong": near_lat_long, + "Distance": distance, + "InPostalCode": in_postal_code, + "InRegion": in_region, + "InRateCenter": in_rate_center, + "InLata": in_lata, + "InLocality": in_locality, + "FaxEnabled": serialize.boolean_to_string(fax_enabled), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return VoipPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> VoipPage: + """ + Retrieve a specific page of VoipInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of VoipInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return VoipPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> VoipPage: + """ + Asynchronously retrieve a specific page of VoipInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of VoipInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return VoipPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/balance.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/balance.py new file mode 100644 index 00000000..66bb91e9 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/balance.py @@ -0,0 +1,111 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class BalanceInstance(InstanceResource): + """ + :ivar account_sid: The unique SID identifier of the Account. + :ivar balance: The balance of the Account, in units specified by the unit parameter. Balance changes may not be reflected immediately. Child accounts do not contain balance information + :ivar currency: The units of currency for the account balance + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.balance: Optional[str] = payload.get("balance") + self.currency: Optional[str] = payload.get("currency") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BalanceList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the BalanceList + + :param version: Version that contains the resource + :param account_sid: The unique SID identifier of the Account. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Balance.json".format(**self._solution) + + def fetch(self) -> BalanceInstance: + """ + Asynchronously fetch the BalanceInstance + + + :returns: The fetched BalanceInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return BalanceInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def fetch_async(self) -> BalanceInstance: + """ + Asynchronously fetch the BalanceInstance + + + :returns: The fetched BalanceInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return BalanceInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__init__.py new file mode 100644 index 00000000..f7756c40 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__init__.py @@ -0,0 +1,1400 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.call.event import EventList +from twilio.rest.api.v2010.account.call.notification import NotificationList +from twilio.rest.api.v2010.account.call.payment import PaymentList +from twilio.rest.api.v2010.account.call.recording import RecordingList +from twilio.rest.api.v2010.account.call.siprec import SiprecList +from twilio.rest.api.v2010.account.call.stream import StreamList +from twilio.rest.api.v2010.account.call.transcription import TranscriptionList +from twilio.rest.api.v2010.account.call.user_defined_message import ( + UserDefinedMessageList, +) +from twilio.rest.api.v2010.account.call.user_defined_message_subscription import ( + UserDefinedMessageSubscriptionList, +) + + +class CallInstance(InstanceResource): + + class Status(object): + QUEUED = "queued" + RINGING = "ringing" + IN_PROGRESS = "in-progress" + COMPLETED = "completed" + BUSY = "busy" + FAILED = "failed" + NO_ANSWER = "no-answer" + CANCELED = "canceled" + + class UpdateStatus(object): + CANCELED = "canceled" + COMPLETED = "completed" + + """ + :ivar sid: The unique string that we created to identify this Call resource. + :ivar date_created: The date and time in UTC that this resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in UTC that this resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar parent_call_sid: The SID that identifies the call that created this leg. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Call resource. + :ivar to: The phone number, SIP address, Client identifier or SIM SID that received this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). SIP addresses are formatted as `name@company.com`. Client identifiers are formatted `client:name`. SIM SIDs are formatted as `sim:sid`. + :ivar to_formatted: The phone number, SIP address or Client identifier that received this call. Formatted for display. Non-North American phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +442071838750). + :ivar _from: The phone number, SIP address, Client identifier or SIM SID that made this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). SIP addresses are formatted as `name@company.com`. Client identifiers are formatted `client:name`. SIM SIDs are formatted as `sim:sid`. + :ivar from_formatted: The calling phone number, SIP address, or Client identifier formatted for display. Non-North American phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +442071838750). + :ivar phone_number_sid: If the call was inbound, this is the SID of the IncomingPhoneNumber resource that received the call. If the call was outbound, it is the SID of the OutgoingCallerId resource from which the call was placed. + :ivar status: + :ivar start_time: The start time of the call, given as UTC in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. Empty if the call has not yet been dialed. + :ivar end_time: The time the call ended, given as UTC in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. Empty if the call did not complete successfully. + :ivar duration: The length of the call in seconds. This value is empty for busy, failed, unanswered, or ongoing calls. + :ivar price: The charge for this call, in the currency associated with the account. Populated after the call is completed. May not be immediately available. The price associated with a call only reflects the charge for connectivity. Charges for other call-related features such as Answering Machine Detection, Text-To-Speech, and SIP REFER are not included in this value. + :ivar price_unit: The currency in which `Price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g., `USD`, `EUR`, `JPY`). Always capitalized for calls. + :ivar direction: A string describing the direction of the call. Can be: `inbound` for inbound calls, `outbound-api` for calls initiated via the REST API or `outbound-dial` for calls initiated by a `` verb. Using [Elastic SIP Trunking](https://www.twilio.com/docs/sip-trunking), the values can be [`trunking-terminating`](https://www.twilio.com/docs/sip-trunking#termination) for outgoing calls from your communications infrastructure to the PSTN or [`trunking-originating`](https://www.twilio.com/docs/sip-trunking#origination) for incoming calls to your communications infrastructure from the PSTN. + :ivar answered_by: Either `human` or `machine` if this call was initiated with answering machine detection. Empty otherwise. + :ivar api_version: The API version used to create the call. + :ivar forwarded_from: The forwarding phone number if this call was an incoming call forwarded from another number (depends on carrier supporting forwarding). Otherwise, empty. + :ivar group_sid: The Group SID associated with this call. If no Group is associated with the call, the field is empty. + :ivar caller_name: The caller's name if this call was an incoming call to a phone number with caller ID Lookup enabled. Otherwise, empty. + :ivar queue_time: The wait time in milliseconds before the call is placed. + :ivar trunk_sid: The unique identifier of the trunk resource that was used for this call. The field is empty if the call was not made using a SIP trunk or if the call is not terminated. + :ivar uri: The URI of this resource, relative to `https://api.twilio.com`. + :ivar subresource_uris: A list of subresources available to this call, identified by their URIs relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.parent_call_sid: Optional[str] = payload.get("parent_call_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.to: Optional[str] = payload.get("to") + self.to_formatted: Optional[str] = payload.get("to_formatted") + self._from: Optional[str] = payload.get("from") + self.from_formatted: Optional[str] = payload.get("from_formatted") + self.phone_number_sid: Optional[str] = payload.get("phone_number_sid") + self.status: Optional["CallInstance.Status"] = payload.get("status") + self.start_time: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("start_time") + ) + self.end_time: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("end_time") + ) + self.duration: Optional[str] = payload.get("duration") + self.price: Optional[str] = payload.get("price") + self.price_unit: Optional[str] = payload.get("price_unit") + self.direction: Optional[str] = payload.get("direction") + self.answered_by: Optional[str] = payload.get("answered_by") + self.api_version: Optional[str] = payload.get("api_version") + self.forwarded_from: Optional[str] = payload.get("forwarded_from") + self.group_sid: Optional[str] = payload.get("group_sid") + self.caller_name: Optional[str] = payload.get("caller_name") + self.queue_time: Optional[str] = payload.get("queue_time") + self.trunk_sid: Optional[str] = payload.get("trunk_sid") + self.uri: Optional[str] = payload.get("uri") + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[CallContext] = None + + @property + def _proxy(self) -> "CallContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CallContext for this CallInstance + """ + if self._context is None: + self._context = CallContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CallInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CallInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CallInstance": + """ + Fetch the CallInstance + + + :returns: The fetched CallInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CallInstance": + """ + Asynchronous coroutine to fetch the CallInstance + + + :returns: The fetched CallInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + url: Union[str, object] = values.unset, + method: Union[str, object] = values.unset, + status: Union["CallInstance.UpdateStatus", object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + twiml: Union[str, object] = values.unset, + time_limit: Union[int, object] = values.unset, + ) -> "CallInstance": + """ + Update the CallInstance + + :param url: The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + :param method: The HTTP method we should use when calling the `url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param status: + :param fallback_url: The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + :param fallback_method: The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + :param status_callback_method: The HTTP method we should use when requesting the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param twiml: TwiML instructions for the call Twilio will use without fetching Twiml from url. Twiml and url parameters are mutually exclusive + :param time_limit: The maximum duration of the call in seconds. Constraints depend on account and configuration. + + :returns: The updated CallInstance + """ + return self._proxy.update( + url=url, + method=method, + status=status, + fallback_url=fallback_url, + fallback_method=fallback_method, + status_callback=status_callback, + status_callback_method=status_callback_method, + twiml=twiml, + time_limit=time_limit, + ) + + async def update_async( + self, + url: Union[str, object] = values.unset, + method: Union[str, object] = values.unset, + status: Union["CallInstance.UpdateStatus", object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + twiml: Union[str, object] = values.unset, + time_limit: Union[int, object] = values.unset, + ) -> "CallInstance": + """ + Asynchronous coroutine to update the CallInstance + + :param url: The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + :param method: The HTTP method we should use when calling the `url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param status: + :param fallback_url: The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + :param fallback_method: The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + :param status_callback_method: The HTTP method we should use when requesting the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param twiml: TwiML instructions for the call Twilio will use without fetching Twiml from url. Twiml and url parameters are mutually exclusive + :param time_limit: The maximum duration of the call in seconds. Constraints depend on account and configuration. + + :returns: The updated CallInstance + """ + return await self._proxy.update_async( + url=url, + method=method, + status=status, + fallback_url=fallback_url, + fallback_method=fallback_method, + status_callback=status_callback, + status_callback_method=status_callback_method, + twiml=twiml, + time_limit=time_limit, + ) + + @property + def events(self) -> EventList: + """ + Access the events + """ + return self._proxy.events + + @property + def notifications(self) -> NotificationList: + """ + Access the notifications + """ + return self._proxy.notifications + + @property + def payments(self) -> PaymentList: + """ + Access the payments + """ + return self._proxy.payments + + @property + def recordings(self) -> RecordingList: + """ + Access the recordings + """ + return self._proxy.recordings + + @property + def siprec(self) -> SiprecList: + """ + Access the siprec + """ + return self._proxy.siprec + + @property + def streams(self) -> StreamList: + """ + Access the streams + """ + return self._proxy.streams + + @property + def transcriptions(self) -> TranscriptionList: + """ + Access the transcriptions + """ + return self._proxy.transcriptions + + @property + def user_defined_messages(self) -> UserDefinedMessageList: + """ + Access the user_defined_messages + """ + return self._proxy.user_defined_messages + + @property + def user_defined_message_subscriptions(self) -> UserDefinedMessageSubscriptionList: + """ + Access the user_defined_message_subscriptions + """ + return self._proxy.user_defined_message_subscriptions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CallContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the CallContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Call resource(s) to update. + :param sid: The Twilio-provided string that uniquely identifies the Call resource to update + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Calls/{sid}.json".format(**self._solution) + + self._events: Optional[EventList] = None + self._notifications: Optional[NotificationList] = None + self._payments: Optional[PaymentList] = None + self._recordings: Optional[RecordingList] = None + self._siprec: Optional[SiprecList] = None + self._streams: Optional[StreamList] = None + self._transcriptions: Optional[TranscriptionList] = None + self._user_defined_messages: Optional[UserDefinedMessageList] = None + self._user_defined_message_subscriptions: Optional[ + UserDefinedMessageSubscriptionList + ] = None + + def delete(self) -> bool: + """ + Deletes the CallInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CallInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CallInstance: + """ + Fetch the CallInstance + + + :returns: The fetched CallInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CallInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CallInstance: + """ + Asynchronous coroutine to fetch the CallInstance + + + :returns: The fetched CallInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CallInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + url: Union[str, object] = values.unset, + method: Union[str, object] = values.unset, + status: Union["CallInstance.UpdateStatus", object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + twiml: Union[str, object] = values.unset, + time_limit: Union[int, object] = values.unset, + ) -> CallInstance: + """ + Update the CallInstance + + :param url: The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + :param method: The HTTP method we should use when calling the `url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param status: + :param fallback_url: The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + :param fallback_method: The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + :param status_callback_method: The HTTP method we should use when requesting the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param twiml: TwiML instructions for the call Twilio will use without fetching Twiml from url. Twiml and url parameters are mutually exclusive + :param time_limit: The maximum duration of the call in seconds. Constraints depend on account and configuration. + + :returns: The updated CallInstance + """ + + data = values.of( + { + "Url": url, + "Method": method, + "Status": status, + "FallbackUrl": fallback_url, + "FallbackMethod": fallback_method, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "Twiml": twiml, + "TimeLimit": time_limit, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CallInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + url: Union[str, object] = values.unset, + method: Union[str, object] = values.unset, + status: Union["CallInstance.UpdateStatus", object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + twiml: Union[str, object] = values.unset, + time_limit: Union[int, object] = values.unset, + ) -> CallInstance: + """ + Asynchronous coroutine to update the CallInstance + + :param url: The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + :param method: The HTTP method we should use when calling the `url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param status: + :param fallback_url: The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + :param fallback_method: The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + :param status_callback_method: The HTTP method we should use when requesting the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param twiml: TwiML instructions for the call Twilio will use without fetching Twiml from url. Twiml and url parameters are mutually exclusive + :param time_limit: The maximum duration of the call in seconds. Constraints depend on account and configuration. + + :returns: The updated CallInstance + """ + + data = values.of( + { + "Url": url, + "Method": method, + "Status": status, + "FallbackUrl": fallback_url, + "FallbackMethod": fallback_method, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "Twiml": twiml, + "TimeLimit": time_limit, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CallInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + @property + def events(self) -> EventList: + """ + Access the events + """ + if self._events is None: + self._events = EventList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._events + + @property + def notifications(self) -> NotificationList: + """ + Access the notifications + """ + if self._notifications is None: + self._notifications = NotificationList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._notifications + + @property + def payments(self) -> PaymentList: + """ + Access the payments + """ + if self._payments is None: + self._payments = PaymentList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._payments + + @property + def recordings(self) -> RecordingList: + """ + Access the recordings + """ + if self._recordings is None: + self._recordings = RecordingList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._recordings + + @property + def siprec(self) -> SiprecList: + """ + Access the siprec + """ + if self._siprec is None: + self._siprec = SiprecList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._siprec + + @property + def streams(self) -> StreamList: + """ + Access the streams + """ + if self._streams is None: + self._streams = StreamList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._streams + + @property + def transcriptions(self) -> TranscriptionList: + """ + Access the transcriptions + """ + if self._transcriptions is None: + self._transcriptions = TranscriptionList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._transcriptions + + @property + def user_defined_messages(self) -> UserDefinedMessageList: + """ + Access the user_defined_messages + """ + if self._user_defined_messages is None: + self._user_defined_messages = UserDefinedMessageList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._user_defined_messages + + @property + def user_defined_message_subscriptions(self) -> UserDefinedMessageSubscriptionList: + """ + Access the user_defined_message_subscriptions + """ + if self._user_defined_message_subscriptions is None: + self._user_defined_message_subscriptions = ( + UserDefinedMessageSubscriptionList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + ) + return self._user_defined_message_subscriptions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CallPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CallInstance: + """ + Build an instance of CallInstance + + :param payload: Payload response from the API + """ + return CallInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CallList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the CallList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Call resource(s) to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Calls.json".format(**self._solution) + + def create( + self, + to: str, + from_: str, + method: Union[str, object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_event: Union[List[str], object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + send_digits: Union[str, object] = values.unset, + timeout: Union[int, object] = values.unset, + record: Union[bool, object] = values.unset, + recording_channels: Union[str, object] = values.unset, + recording_status_callback: Union[str, object] = values.unset, + recording_status_callback_method: Union[str, object] = values.unset, + sip_auth_username: Union[str, object] = values.unset, + sip_auth_password: Union[str, object] = values.unset, + machine_detection: Union[str, object] = values.unset, + machine_detection_timeout: Union[int, object] = values.unset, + recording_status_callback_event: Union[List[str], object] = values.unset, + trim: Union[str, object] = values.unset, + caller_id: Union[str, object] = values.unset, + machine_detection_speech_threshold: Union[int, object] = values.unset, + machine_detection_speech_end_threshold: Union[int, object] = values.unset, + machine_detection_silence_timeout: Union[int, object] = values.unset, + async_amd: Union[str, object] = values.unset, + async_amd_status_callback: Union[str, object] = values.unset, + async_amd_status_callback_method: Union[str, object] = values.unset, + byoc: Union[str, object] = values.unset, + call_reason: Union[str, object] = values.unset, + call_token: Union[str, object] = values.unset, + recording_track: Union[str, object] = values.unset, + time_limit: Union[int, object] = values.unset, + url: Union[str, object] = values.unset, + twiml: Union[str, object] = values.unset, + application_sid: Union[str, object] = values.unset, + ) -> CallInstance: + """ + Create the CallInstance + + :param to: The phone number, SIP address, or client identifier to call. + :param from_: The phone number or client identifier to use as the caller id. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `From` must also be a phone number. + :param method: The HTTP method we should use when calling the `url` parameter's value. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param fallback_url: The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + :param fallback_method: The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + :param status_callback_event: The call progress events that we will send to the `status_callback` URL. Can be: `initiated`, `ringing`, `answered`, and `completed`. If no event is specified, we send the `completed` status. If you want to receive multiple events, specify each one in a separate `status_callback_event` parameter. See the code sample for [monitoring call progress](https://www.twilio.com/docs/voice/api/call-resource?code-sample=code-create-a-call-resource-and-specify-a-statuscallbackevent&code-sdk-version=json). If an `application_sid` is present, this parameter is ignored. + :param status_callback_method: The HTTP method we should use when calling the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param send_digits: The string of keys to dial after connecting to the number, with a maximum length of 32 digits. Valid digits in the string include any digit (`0`-`9`), '`A`', '`B`', '`C`', '`D`', '`#`', and '`*`'. You can also use '`w`' to insert a half-second pause and '`W`' to insert a one-second pause. For example, to pause for one second after connecting and then dial extension 1234 followed by the # key, set this parameter to `W1234#`. Be sure to URL-encode this string because the '`#`' character has special meaning in a URL. If both `SendDigits` and `MachineDetection` parameters are provided, then `MachineDetection` will be ignored. + :param timeout: The integer number of seconds that we should allow the phone to ring before assuming there is no answer. The default is `60` seconds and the maximum is `600` seconds. For some call flows, we will add a 5-second buffer to the timeout value you provide. For this reason, a timeout value of 10 seconds could result in an actual timeout closer to 15 seconds. You can set this to a short time, such as `15` seconds, to hang up before reaching an answering machine or voicemail. + :param record: Whether to record the call. Can be `true` to record the phone call, or `false` to not. The default is `false`. The `recording_url` is sent to the `status_callback` URL. + :param recording_channels: The number of channels in the final recording. Can be: `mono` or `dual`. The default is `mono`. `mono` records both legs of the call in a single channel of the recording file. `dual` records each leg to a separate channel of the recording file. The first channel of a dual-channel recording contains the parent call and the second channel contains the child call. + :param recording_status_callback: The URL that we call when the recording is available to be accessed. + :param recording_status_callback_method: The HTTP method we should use when calling the `recording_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + :param sip_auth_username: The username used to authenticate the caller making a SIP call. + :param sip_auth_password: The password required to authenticate the user account specified in `sip_auth_username`. + :param machine_detection: Whether to detect if a human, answering machine, or fax has picked up the call. Can be: `Enable` or `DetectMessageEnd`. Use `Enable` if you would like us to return `AnsweredBy` as soon as the called party is identified. Use `DetectMessageEnd`, if you would like to leave a message on an answering machine. If `send_digits` is provided, this parameter is ignored. For more information, see [Answering Machine Detection](https://www.twilio.com/docs/voice/answering-machine-detection). + :param machine_detection_timeout: The number of seconds that we should attempt to detect an answering machine before timing out and sending a voice request with `AnsweredBy` of `unknown`. The default timeout is 30 seconds. + :param recording_status_callback_event: The recording status events that will trigger calls to the URL specified in `recording_status_callback`. Can be: `in-progress`, `completed` and `absent`. Defaults to `completed`. Separate multiple values with a space. + :param trim: Whether to trim any leading and trailing silence from the recording. Can be: `trim-silence` or `do-not-trim` and the default is `trim-silence`. + :param caller_id: The phone number, SIP address, or Client identifier that made this call. Phone numbers are in [E.164 format](https://wwnw.twilio.com/docs/glossary/what-e164) (e.g., +16175551212). SIP addresses are formatted as `name@company.com`. + :param machine_detection_speech_threshold: The number of milliseconds that is used as the measuring stick for the length of the speech activity, where durations lower than this value will be interpreted as a human and longer than this value as a machine. Possible Values: 1000-6000. Default: 2400. + :param machine_detection_speech_end_threshold: The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Possible Values: 500-5000. Default: 1200. + :param machine_detection_silence_timeout: The number of milliseconds of initial silence after which an `unknown` AnsweredBy result will be returned. Possible Values: 2000-10000. Default: 5000. + :param async_amd: Select whether to perform answering machine detection in the background. Default, blocks the execution of the call until Answering Machine Detection is completed. Can be: `true` or `false`. + :param async_amd_status_callback: The URL that we should call using the `async_amd_status_callback_method` to notify customer application whether the call was answered by human, machine or fax. + :param async_amd_status_callback_method: The HTTP method we should use when calling the `async_amd_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + :param byoc: The SID of a BYOC (Bring Your Own Carrier) trunk to route this call with. Note that `byoc` is only meaningful when `to` is a phone number; it will otherwise be ignored. (Beta) + :param call_reason: The Reason for the outgoing call. Use it to specify the purpose of the call that is presented on the called party's phone. (Branded Calls Beta) + :param call_token: A token string needed to invoke a forwarded call. A call_token is generated when an incoming call is received on a Twilio number. Pass an incoming call's call_token value to a forwarded call via the call_token parameter when creating a new call. A forwarded call should bear the same CallerID of the original incoming call. + :param recording_track: The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is generated from Twilio. `both` records the audio that is received and generated by Twilio. + :param time_limit: The maximum duration of the call in seconds. Constraints depend on account and configuration. + :param url: The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + :param twiml: TwiML instructions for the call Twilio will use without fetching Twiml from url parameter. If both `twiml` and `url` are provided then `twiml` parameter will be ignored. Max 4000 characters. + :param application_sid: The SID of the Application resource that will handle the call, if the call will be handled by an application. + + :returns: The created CallInstance + """ + + data = values.of( + { + "To": to, + "From": from_, + "Method": method, + "FallbackUrl": fallback_url, + "FallbackMethod": fallback_method, + "StatusCallback": status_callback, + "StatusCallbackEvent": serialize.map( + status_callback_event, lambda e: e + ), + "StatusCallbackMethod": status_callback_method, + "SendDigits": send_digits, + "Timeout": timeout, + "Record": serialize.boolean_to_string(record), + "RecordingChannels": recording_channels, + "RecordingStatusCallback": recording_status_callback, + "RecordingStatusCallbackMethod": recording_status_callback_method, + "SipAuthUsername": sip_auth_username, + "SipAuthPassword": sip_auth_password, + "MachineDetection": machine_detection, + "MachineDetectionTimeout": machine_detection_timeout, + "RecordingStatusCallbackEvent": serialize.map( + recording_status_callback_event, lambda e: e + ), + "Trim": trim, + "CallerId": caller_id, + "MachineDetectionSpeechThreshold": machine_detection_speech_threshold, + "MachineDetectionSpeechEndThreshold": machine_detection_speech_end_threshold, + "MachineDetectionSilenceTimeout": machine_detection_silence_timeout, + "AsyncAmd": async_amd, + "AsyncAmdStatusCallback": async_amd_status_callback, + "AsyncAmdStatusCallbackMethod": async_amd_status_callback_method, + "Byoc": byoc, + "CallReason": call_reason, + "CallToken": call_token, + "RecordingTrack": recording_track, + "TimeLimit": time_limit, + "Url": url, + "Twiml": twiml, + "ApplicationSid": application_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CallInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + to: str, + from_: str, + method: Union[str, object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_event: Union[List[str], object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + send_digits: Union[str, object] = values.unset, + timeout: Union[int, object] = values.unset, + record: Union[bool, object] = values.unset, + recording_channels: Union[str, object] = values.unset, + recording_status_callback: Union[str, object] = values.unset, + recording_status_callback_method: Union[str, object] = values.unset, + sip_auth_username: Union[str, object] = values.unset, + sip_auth_password: Union[str, object] = values.unset, + machine_detection: Union[str, object] = values.unset, + machine_detection_timeout: Union[int, object] = values.unset, + recording_status_callback_event: Union[List[str], object] = values.unset, + trim: Union[str, object] = values.unset, + caller_id: Union[str, object] = values.unset, + machine_detection_speech_threshold: Union[int, object] = values.unset, + machine_detection_speech_end_threshold: Union[int, object] = values.unset, + machine_detection_silence_timeout: Union[int, object] = values.unset, + async_amd: Union[str, object] = values.unset, + async_amd_status_callback: Union[str, object] = values.unset, + async_amd_status_callback_method: Union[str, object] = values.unset, + byoc: Union[str, object] = values.unset, + call_reason: Union[str, object] = values.unset, + call_token: Union[str, object] = values.unset, + recording_track: Union[str, object] = values.unset, + time_limit: Union[int, object] = values.unset, + url: Union[str, object] = values.unset, + twiml: Union[str, object] = values.unset, + application_sid: Union[str, object] = values.unset, + ) -> CallInstance: + """ + Asynchronously create the CallInstance + + :param to: The phone number, SIP address, or client identifier to call. + :param from_: The phone number or client identifier to use as the caller id. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `From` must also be a phone number. + :param method: The HTTP method we should use when calling the `url` parameter's value. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param fallback_url: The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + :param fallback_method: The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + :param status_callback_event: The call progress events that we will send to the `status_callback` URL. Can be: `initiated`, `ringing`, `answered`, and `completed`. If no event is specified, we send the `completed` status. If you want to receive multiple events, specify each one in a separate `status_callback_event` parameter. See the code sample for [monitoring call progress](https://www.twilio.com/docs/voice/api/call-resource?code-sample=code-create-a-call-resource-and-specify-a-statuscallbackevent&code-sdk-version=json). If an `application_sid` is present, this parameter is ignored. + :param status_callback_method: The HTTP method we should use when calling the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + :param send_digits: The string of keys to dial after connecting to the number, with a maximum length of 32 digits. Valid digits in the string include any digit (`0`-`9`), '`A`', '`B`', '`C`', '`D`', '`#`', and '`*`'. You can also use '`w`' to insert a half-second pause and '`W`' to insert a one-second pause. For example, to pause for one second after connecting and then dial extension 1234 followed by the # key, set this parameter to `W1234#`. Be sure to URL-encode this string because the '`#`' character has special meaning in a URL. If both `SendDigits` and `MachineDetection` parameters are provided, then `MachineDetection` will be ignored. + :param timeout: The integer number of seconds that we should allow the phone to ring before assuming there is no answer. The default is `60` seconds and the maximum is `600` seconds. For some call flows, we will add a 5-second buffer to the timeout value you provide. For this reason, a timeout value of 10 seconds could result in an actual timeout closer to 15 seconds. You can set this to a short time, such as `15` seconds, to hang up before reaching an answering machine or voicemail. + :param record: Whether to record the call. Can be `true` to record the phone call, or `false` to not. The default is `false`. The `recording_url` is sent to the `status_callback` URL. + :param recording_channels: The number of channels in the final recording. Can be: `mono` or `dual`. The default is `mono`. `mono` records both legs of the call in a single channel of the recording file. `dual` records each leg to a separate channel of the recording file. The first channel of a dual-channel recording contains the parent call and the second channel contains the child call. + :param recording_status_callback: The URL that we call when the recording is available to be accessed. + :param recording_status_callback_method: The HTTP method we should use when calling the `recording_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + :param sip_auth_username: The username used to authenticate the caller making a SIP call. + :param sip_auth_password: The password required to authenticate the user account specified in `sip_auth_username`. + :param machine_detection: Whether to detect if a human, answering machine, or fax has picked up the call. Can be: `Enable` or `DetectMessageEnd`. Use `Enable` if you would like us to return `AnsweredBy` as soon as the called party is identified. Use `DetectMessageEnd`, if you would like to leave a message on an answering machine. If `send_digits` is provided, this parameter is ignored. For more information, see [Answering Machine Detection](https://www.twilio.com/docs/voice/answering-machine-detection). + :param machine_detection_timeout: The number of seconds that we should attempt to detect an answering machine before timing out and sending a voice request with `AnsweredBy` of `unknown`. The default timeout is 30 seconds. + :param recording_status_callback_event: The recording status events that will trigger calls to the URL specified in `recording_status_callback`. Can be: `in-progress`, `completed` and `absent`. Defaults to `completed`. Separate multiple values with a space. + :param trim: Whether to trim any leading and trailing silence from the recording. Can be: `trim-silence` or `do-not-trim` and the default is `trim-silence`. + :param caller_id: The phone number, SIP address, or Client identifier that made this call. Phone numbers are in [E.164 format](https://wwnw.twilio.com/docs/glossary/what-e164) (e.g., +16175551212). SIP addresses are formatted as `name@company.com`. + :param machine_detection_speech_threshold: The number of milliseconds that is used as the measuring stick for the length of the speech activity, where durations lower than this value will be interpreted as a human and longer than this value as a machine. Possible Values: 1000-6000. Default: 2400. + :param machine_detection_speech_end_threshold: The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Possible Values: 500-5000. Default: 1200. + :param machine_detection_silence_timeout: The number of milliseconds of initial silence after which an `unknown` AnsweredBy result will be returned. Possible Values: 2000-10000. Default: 5000. + :param async_amd: Select whether to perform answering machine detection in the background. Default, blocks the execution of the call until Answering Machine Detection is completed. Can be: `true` or `false`. + :param async_amd_status_callback: The URL that we should call using the `async_amd_status_callback_method` to notify customer application whether the call was answered by human, machine or fax. + :param async_amd_status_callback_method: The HTTP method we should use when calling the `async_amd_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + :param byoc: The SID of a BYOC (Bring Your Own Carrier) trunk to route this call with. Note that `byoc` is only meaningful when `to` is a phone number; it will otherwise be ignored. (Beta) + :param call_reason: The Reason for the outgoing call. Use it to specify the purpose of the call that is presented on the called party's phone. (Branded Calls Beta) + :param call_token: A token string needed to invoke a forwarded call. A call_token is generated when an incoming call is received on a Twilio number. Pass an incoming call's call_token value to a forwarded call via the call_token parameter when creating a new call. A forwarded call should bear the same CallerID of the original incoming call. + :param recording_track: The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is generated from Twilio. `both` records the audio that is received and generated by Twilio. + :param time_limit: The maximum duration of the call in seconds. Constraints depend on account and configuration. + :param url: The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + :param twiml: TwiML instructions for the call Twilio will use without fetching Twiml from url parameter. If both `twiml` and `url` are provided then `twiml` parameter will be ignored. Max 4000 characters. + :param application_sid: The SID of the Application resource that will handle the call, if the call will be handled by an application. + + :returns: The created CallInstance + """ + + data = values.of( + { + "To": to, + "From": from_, + "Method": method, + "FallbackUrl": fallback_url, + "FallbackMethod": fallback_method, + "StatusCallback": status_callback, + "StatusCallbackEvent": serialize.map( + status_callback_event, lambda e: e + ), + "StatusCallbackMethod": status_callback_method, + "SendDigits": send_digits, + "Timeout": timeout, + "Record": serialize.boolean_to_string(record), + "RecordingChannels": recording_channels, + "RecordingStatusCallback": recording_status_callback, + "RecordingStatusCallbackMethod": recording_status_callback_method, + "SipAuthUsername": sip_auth_username, + "SipAuthPassword": sip_auth_password, + "MachineDetection": machine_detection, + "MachineDetectionTimeout": machine_detection_timeout, + "RecordingStatusCallbackEvent": serialize.map( + recording_status_callback_event, lambda e: e + ), + "Trim": trim, + "CallerId": caller_id, + "MachineDetectionSpeechThreshold": machine_detection_speech_threshold, + "MachineDetectionSpeechEndThreshold": machine_detection_speech_end_threshold, + "MachineDetectionSilenceTimeout": machine_detection_silence_timeout, + "AsyncAmd": async_amd, + "AsyncAmdStatusCallback": async_amd_status_callback, + "AsyncAmdStatusCallbackMethod": async_amd_status_callback_method, + "Byoc": byoc, + "CallReason": call_reason, + "CallToken": call_token, + "RecordingTrack": recording_track, + "TimeLimit": time_limit, + "Url": url, + "Twiml": twiml, + "ApplicationSid": application_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CallInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + parent_call_sid: Union[str, object] = values.unset, + status: Union["CallInstance.Status", object] = values.unset, + start_time: Union[datetime, object] = values.unset, + start_time_before: Union[datetime, object] = values.unset, + start_time_after: Union[datetime, object] = values.unset, + end_time: Union[datetime, object] = values.unset, + end_time_before: Union[datetime, object] = values.unset, + end_time_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CallInstance]: + """ + Streams CallInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str to: Only show calls made to this phone number, SIP address, Client identifier or SIM SID. + :param str from_: Only include calls from this phone number, SIP address, Client identifier or SIM SID. + :param str parent_call_sid: Only include calls spawned by calls with this SID. + :param "CallInstance.Status" status: The status of the calls to include. Can be: `queued`, `ringing`, `in-progress`, `canceled`, `completed`, `failed`, `busy`, or `no-answer`. + :param datetime start_time: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime start_time_before: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime start_time_after: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime end_time: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param datetime end_time_before: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param datetime end_time_after: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + to=to, + from_=from_, + parent_call_sid=parent_call_sid, + status=status, + start_time=start_time, + start_time_before=start_time_before, + start_time_after=start_time_after, + end_time=end_time, + end_time_before=end_time_before, + end_time_after=end_time_after, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + parent_call_sid: Union[str, object] = values.unset, + status: Union["CallInstance.Status", object] = values.unset, + start_time: Union[datetime, object] = values.unset, + start_time_before: Union[datetime, object] = values.unset, + start_time_after: Union[datetime, object] = values.unset, + end_time: Union[datetime, object] = values.unset, + end_time_before: Union[datetime, object] = values.unset, + end_time_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CallInstance]: + """ + Asynchronously streams CallInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str to: Only show calls made to this phone number, SIP address, Client identifier or SIM SID. + :param str from_: Only include calls from this phone number, SIP address, Client identifier or SIM SID. + :param str parent_call_sid: Only include calls spawned by calls with this SID. + :param "CallInstance.Status" status: The status of the calls to include. Can be: `queued`, `ringing`, `in-progress`, `canceled`, `completed`, `failed`, `busy`, or `no-answer`. + :param datetime start_time: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime start_time_before: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime start_time_after: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime end_time: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param datetime end_time_before: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param datetime end_time_after: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + to=to, + from_=from_, + parent_call_sid=parent_call_sid, + status=status, + start_time=start_time, + start_time_before=start_time_before, + start_time_after=start_time_after, + end_time=end_time, + end_time_before=end_time_before, + end_time_after=end_time_after, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + parent_call_sid: Union[str, object] = values.unset, + status: Union["CallInstance.Status", object] = values.unset, + start_time: Union[datetime, object] = values.unset, + start_time_before: Union[datetime, object] = values.unset, + start_time_after: Union[datetime, object] = values.unset, + end_time: Union[datetime, object] = values.unset, + end_time_before: Union[datetime, object] = values.unset, + end_time_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CallInstance]: + """ + Lists CallInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str to: Only show calls made to this phone number, SIP address, Client identifier or SIM SID. + :param str from_: Only include calls from this phone number, SIP address, Client identifier or SIM SID. + :param str parent_call_sid: Only include calls spawned by calls with this SID. + :param "CallInstance.Status" status: The status of the calls to include. Can be: `queued`, `ringing`, `in-progress`, `canceled`, `completed`, `failed`, `busy`, or `no-answer`. + :param datetime start_time: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime start_time_before: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime start_time_after: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime end_time: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param datetime end_time_before: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param datetime end_time_after: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + to=to, + from_=from_, + parent_call_sid=parent_call_sid, + status=status, + start_time=start_time, + start_time_before=start_time_before, + start_time_after=start_time_after, + end_time=end_time, + end_time_before=end_time_before, + end_time_after=end_time_after, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + parent_call_sid: Union[str, object] = values.unset, + status: Union["CallInstance.Status", object] = values.unset, + start_time: Union[datetime, object] = values.unset, + start_time_before: Union[datetime, object] = values.unset, + start_time_after: Union[datetime, object] = values.unset, + end_time: Union[datetime, object] = values.unset, + end_time_before: Union[datetime, object] = values.unset, + end_time_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CallInstance]: + """ + Asynchronously lists CallInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str to: Only show calls made to this phone number, SIP address, Client identifier or SIM SID. + :param str from_: Only include calls from this phone number, SIP address, Client identifier or SIM SID. + :param str parent_call_sid: Only include calls spawned by calls with this SID. + :param "CallInstance.Status" status: The status of the calls to include. Can be: `queued`, `ringing`, `in-progress`, `canceled`, `completed`, `failed`, `busy`, or `no-answer`. + :param datetime start_time: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime start_time_before: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime start_time_after: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param datetime end_time: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param datetime end_time_before: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param datetime end_time_after: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + to=to, + from_=from_, + parent_call_sid=parent_call_sid, + status=status, + start_time=start_time, + start_time_before=start_time_before, + start_time_after=start_time_after, + end_time=end_time, + end_time_before=end_time_before, + end_time_after=end_time_after, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + parent_call_sid: Union[str, object] = values.unset, + status: Union["CallInstance.Status", object] = values.unset, + start_time: Union[datetime, object] = values.unset, + start_time_before: Union[datetime, object] = values.unset, + start_time_after: Union[datetime, object] = values.unset, + end_time: Union[datetime, object] = values.unset, + end_time_before: Union[datetime, object] = values.unset, + end_time_after: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CallPage: + """ + Retrieve a single page of CallInstance records from the API. + Request is executed immediately + + :param to: Only show calls made to this phone number, SIP address, Client identifier or SIM SID. + :param from_: Only include calls from this phone number, SIP address, Client identifier or SIM SID. + :param parent_call_sid: Only include calls spawned by calls with this SID. + :param status: The status of the calls to include. Can be: `queued`, `ringing`, `in-progress`, `canceled`, `completed`, `failed`, `busy`, or `no-answer`. + :param start_time: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param start_time_before: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param start_time_after: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param end_time: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param end_time_before: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param end_time_after: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CallInstance + """ + data = values.of( + { + "To": to, + "From": from_, + "ParentCallSid": parent_call_sid, + "Status": status, + "StartTime": serialize.iso8601_datetime(start_time), + "StartTime<": serialize.iso8601_datetime(start_time_before), + "StartTime>": serialize.iso8601_datetime(start_time_after), + "EndTime": serialize.iso8601_datetime(end_time), + "EndTime<": serialize.iso8601_datetime(end_time_before), + "EndTime>": serialize.iso8601_datetime(end_time_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CallPage(self._version, response, self._solution) + + async def page_async( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + parent_call_sid: Union[str, object] = values.unset, + status: Union["CallInstance.Status", object] = values.unset, + start_time: Union[datetime, object] = values.unset, + start_time_before: Union[datetime, object] = values.unset, + start_time_after: Union[datetime, object] = values.unset, + end_time: Union[datetime, object] = values.unset, + end_time_before: Union[datetime, object] = values.unset, + end_time_after: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CallPage: + """ + Asynchronously retrieve a single page of CallInstance records from the API. + Request is executed immediately + + :param to: Only show calls made to this phone number, SIP address, Client identifier or SIM SID. + :param from_: Only include calls from this phone number, SIP address, Client identifier or SIM SID. + :param parent_call_sid: Only include calls spawned by calls with this SID. + :param status: The status of the calls to include. Can be: `queued`, `ringing`, `in-progress`, `canceled`, `completed`, `failed`, `busy`, or `no-answer`. + :param start_time: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param start_time_before: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param start_time_after: Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + :param end_time: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param end_time_before: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param end_time_after: Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CallInstance + """ + data = values.of( + { + "To": to, + "From": from_, + "ParentCallSid": parent_call_sid, + "Status": status, + "StartTime": serialize.iso8601_datetime(start_time), + "StartTime<": serialize.iso8601_datetime(start_time_before), + "StartTime>": serialize.iso8601_datetime(start_time_after), + "EndTime": serialize.iso8601_datetime(end_time), + "EndTime<": serialize.iso8601_datetime(end_time_before), + "EndTime>": serialize.iso8601_datetime(end_time_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CallPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> CallPage: + """ + Retrieve a specific page of CallInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CallInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CallPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> CallPage: + """ + Asynchronously retrieve a specific page of CallInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CallInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CallPage(self._version, response, self._solution) + + def get(self, sid: str) -> CallContext: + """ + Constructs a CallContext + + :param sid: The Twilio-provided string that uniquely identifies the Call resource to update + """ + return CallContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> CallContext: + """ + Constructs a CallContext + + :param sid: The Twilio-provided string that uniquely identifies the Call resource to update + """ + return CallContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3efe3da288d58d37761274a5458863bc74115d9d GIT binary patch literal 89522 zcmeIb33MArnkJYa0TKic@V<{EDIO4S>NIs&6e+o69af2wJw?e4LI5a1!a*lMNtB@) zca^tW+No|!Q?o64UiVs>sd*OL-ZeGTGq!uTr^-`3TQ%MLUK7QdB^GN>xw~ig&Azw$ z9^6!IRcmLD?~lk#WF|mSl4ZAC1&E4__%kw&KO+8!_~ZZo`19gon}FYUelm6TK)@vY zH3gKPMfR*7G6}*>!6Qrx9+M}>Zwi=l#4iR~CtI1{ z?r#gUPqs6EseePDW3q$!%lw^zuE{RuFZXu`9Fq={kRv=Ncq(2OJeA(EcXBx{CO0x@ z6`<8#y9(`L&>BE%y)`PdmqF_Qt@l=_(7w3_N2BY114?Zoe#g)H!lFCm@roB+VeyPN z=#^X%uSYyRN3WeurTz0|;;Ui=6d}Gqb1tKDT(B$2qod;wO&kS`obSYMcl z_(DOKKVdl$gePG=5TT9`k`l$E;klq&2|98Ug&uF%EBRc0-(_#2Amz=w;PTIU!^p~h zAQ+Cgf^P3vC>ZfxiU3rqfR1^?p;^i81+0j&)`at4^h#l5j#uWRt}_&+VBZCAFhcPt zjU%CmZ`$W}QBh@B;ZfIIAQh$fnAaVWJig!=`MqtzHzRr7YA7OkT>&{%c3g4=!*0pP z>MjGTPoPHQ-f3UZ>pAQVhfxmsO}M^9qwD5V0IK zEKL}eIo@1#Seh9$7f`bXYAFy31W%{O;?48qdGoziZ^3j<9TN7y@3DGqUMq#BtyhI< zlc(VI;>kj9k*CX3_`3NWIs3_CkIh>$o#QEb-8^ZR{l)N?db&L&c$VR5$Ftm9ajskb zNb~rrL8l8mrQRxFDp$r-nJ!fBt@2c;?<#fgs&t`hU8qJEs?~++5UN(ww0VT-N>Bak zmdTp08tyWe_bI_>129^P-fi>Np*J^bdU!p9HUQeBfi^N|6QIo+XfuPh0NSE~iVWHc zsHlOqF=#uWts3YC2JHZ}O#|&@&@MpRHPCJbbpX0S1Ko%^SOM$6sOz~ZTry4eP6!T1 zqG${xTOpJ>T7ub{{Z@PNNKq1xX)@Q7GimnZPFg(X$vlr`GT)OoY4zk!7I>_awz&d_ z?S6$e)&7ZyD>55SDlmH zB5&H|^Lss)3xc6O(9DZoDPeUJg$MA6qcCB0I)ko&*Xc~yoX$YVGwUaRk<#Kk>~K2C_He)dGy!|&tbxxNED2{aQNtHxIaBMa*C*O_|(Az2acZ__lD0$LNli>gnVxA zDCWw@DNG+1P95@{J{9&wynQn+_jwTX@Tmx!ss~Wn$N=WmfeXWfLxTe@w>vZ&j10KZ z3vWBGVumJhxiB4+Xd9d(4vW-Dfi7~We9|B} z)K{b-a#;SG;7b(glGq9my$ct?L47Kku3AxxYX$s^ZS+O{1wJb$@@HIg{*cR)D3tN! z4EsEZTsUrJrH=Rl`DwMfD#7<(nQjUZg0kN=OH}wBK%=I2&>%_Ha;;J=X zBi%erToos4#Ld^lEnKGzR!v;$9PGD7x&@lJ#p}eiY2ucw6Sq(k*RI5UtQIR$Qc|91 zvC_|#VzH8v@dcO;?hc&{nn^kwI*);I&o_>aU0f&TdRrNxK7+UP28q+;?`^8 zHmh-SqvlJda1kh@a89LD%3Cb_8-70reT`-!_VXZ~Q3kL67Y7%wj7^yGqN9gqb;EV-M#n=GR1l$A|qH zdt1m?7G96@^c*Ic8J|;`dP-2Fi!RB7SFA(@XQa^V49mKZ>VRUzGs_HCjjAv99C_HEk|p@5}uu*WsNfLCvwktBkZL_#4=GTO}mG; z4-Y$)eYCU-U}-lw&yqtpl=hG_3MXMl88c5uFAxu|P3H)qIp)%;Uy-Mu_vXy=0> zB=dxUt?!**IKMPW%vF6ux{22hjl*in(b?JK=s zi}ij@d2d@TYRCINdS8rsbPv4!>g`t-N0z&G6GSOf{_=+H2;1V0!S@;#8WvA2JN8nF z@$P~53Kt3&4=#7_LAWHn)@f)+uhqI~te2^wIpe#=zkl+>lkuWv)ND6v!=|K7XzYqt zRR67L)_BKQChw}u7Enwz(afd5cFcVFuWf9Iz>&FfUeOg4 zeKKzgOjE|(5<#07<4t+d%h_=9TjH*|W?ZNJUNJPSCJ0JHR2CaA@q$b8g=WK|ixI(a zzc}jmr!tYDBIvbX;SrGr@|do8D28@)s|87s2k8WG z;xJ36@JJMDQUFPm>9BMX?-oqb%XoyTWkp6k5_wK4+T3ORPLl(Fo8l7bdre4|3Pq)F z?7FsVsZjhFy{NSEX7P>Uc%%5%kvEUr*%fPiCSF;4^T>@Ox3yzjGK} zuC(%vE7z_pSsPjB(se2jCf=!NFSAysI;VCiM3R3Be+*4+x_?GR$T+sN5ijTK>M)iG z&&Q=%ujrc=J?tYfJnMFQy`FHdxZmXuqruTk(nVj`tETSAkvzyhk;lJ~+z4neDV;&s zfJPqkCPk!$70_5h_;~f&t1I@_n7wt`-o9jQPe%+@`P=xvO4G(c!Sqo$>RYZFSg{W*SqGNv z1NT>HGxV+IF4HYjhxxXp%k%|w#uF-D_j@Dmvuv=h-xWa-rYSlIgf6l|!xThWSgbS* z1yQfd<=QX%S;PfGOR++qM706nlp|We0SovOHd?AX{l0)N;#S!Q$cI+EL_k() zZTcuwHEN3HM6rd5TB3Q;{HQfr@UH0{nTY{PoAZ}W8Igh1*1GvM7*xV`2^4V0KoZUcMzxWbPIenO3DTFUDDN;JK zVVZ|&N}b}^nG!Fa^#&P)#l%b-#2y86^M1_rfe_|mUy$Z+wyWtC!(O6wUh(7!$uAzI z5@QOHUhY;-?=D`v*v~nR{a~yPctY;*0OL^(1YGC6eUwMIJv`%e`=;mmTz#l5IF)iL z4y4ZNf-J?8hh68XtYh@WqowcQ2a0T+z>&)9%JKTO2n=k^_+5`mVfqc2Rr=L%wh0$g~!)2>;6gpNr0n||@YG_9Ye zTr)E`EoG>q-Px3=)|DdTv@VRTDJ`NXq@aOb`OXA^dQVzKco!d0dzIX2)Ul!V9<|e; zimYKZEw9E_x&Wqil-4Urs9VVGo|VEJ7m^p7%rNG+GgNEuC9j(%JKleI2gIZ|#gX(y z)!0zj^fqKOuf8F%YLtu4+Gk2l<0)-Vm4@-!QQM^|WNf|6RBnov%IHlVk-yiDT6#4H zW`L;aj;xCYL*kS%IWL_;Pf;J_qZF&~UMdYECM*L+J=9Z^DLKO@*XM~)g~h;ZIKtNb zE)WA3whn%uM?4z}M~M3&cFzVq;MHUOh4m|K7)UMvI}H$bFmuugfU%a3KoB&8fYscP z)D#u>siF~Vx1daIkh|)X#_ccQ(RT6Ew<^K)^2&6N)CKemP7;55W|<;`k5D zMwk!=sD#@OT5}<_5s+zAYWn59Jm9+I3(N*Yg=2<2BO9%(zoX4D7leWyOhnk-g(DKW zK_m=P3+WJ#7($oe2Uv^OxYEasIGR_ zn&h%8CfaFcS4`Ozld?3Sl}>iWgvCgTufFbzNs404pt6gK_-rlni@r&#l}ziK-^2?8 zb5i@^U(t7TP{^5+TXoFI2QPH0`?1iew*5j~?O@4MYP-+GeZJK_WcowXfcYKEke-Q2 zjD5!Y>4#@c-VgEJ4L`<7Z&$bBqhN+Z+?n3^k4o~AnzK({K!ult}B1rDcG zuRCV%Ub1#S>FRZ4svbnVNSZpmW>)1*TBZI0RZ4$!ti*-FM27mb$JRKp_-DLGF3(Y zO&UV}fDkgUE<*IFjAq2nu9$t-l66-)b}Yz)P2@D6LVwP5js}9^=gE1Uq$V;<=b7Yk zl|%D!LGisKr+Ee1c;~>wF#b}qz9ds|KP3WjR0>`2LG8>1ZkiALEB_q$(=zv;9S&%C z8Y;``u*-dxPL|jDL}4A>H;KA~SwaN~I<1oYmBQ0`84@F>Q1L6KD>)t^6LN@~^Nx&~ z-!t7bnS}2&n1wkL9e^+7T(-P=W!I}$jx3lUAJ0yM7IG6g{eub9`Go00m{5=MFcFFS z1v^P~>(Y$0`*OFg)tyeNHN?z!`a^C=4eah$V;%u&S4q&1E&P5`KXG?_adh#O`E76Q zeslMo);nKcX&8vrPyFqw8F9YV(rUWgwiEnG=&AKXORfJ!l4A^^6{dR2#V4saUQEMGuYkWsJ(CV7u`nwVDynaG z-{?lsJ{bT0kq?io>^vIVd31T_v7gpYESFC}THd~C#Xb_Vk9@Fg**>;p9b2o+2V?y=PHu{F7Z%O1FN2i!2B*KYA{gKJGC9IH80V_N* z$K@}~r$Zq>leUn~Q5-t`mgoRiA_3-vWi}Xw@E-|kCvw4KWh_YPH|c!^Ij@sL3pI(B zbP@^DO0*7=s>z|%gG5K>63x64iMUEMmq{d{BoXPC>d7IZC^e8n)IhomCs8cR=s~l> z?{q@e<~IOk5+ZxJq#mI|BBzsH+(0M$z3Brt4>KG$->3Vil_Ek_F_m2_<-U?d6}-7s<0G zA+O|ba*8cYtGVzc$(L--w``aqyS^h<+>*2afO3~nxwl?FA1iH3<`c*Y&{Fl#;?||=XJVxz$pQk}gqp_r zv0K&i2V>RU$wC4Z3H2@W;amIXUyarEB#Q}Dq666pR4TM~-g4jBdh2{l98Q)Is9Y$m zx;`=AdHp1$ZITrPsuZf~=iBEm%=g49JCjsYRM=L#T0_2LreEK>gJe-3FqDV9O}Cb^F8!xgZgTN`l@sOFum$jUv;Xl+U9L*W!64lPp=@G zDd*m8XUaVcAy=cbUuklwh<97=?~8dTb?nZ?#4rvWh{g0j<$Mp*@SZ zwSd-Ypmhvd4``hR+Q6WVfYxiEO$^!$XoCjY!k{9cS{>3>25kdWt3%q(pc??y>X3Gz zTxP(aK|0yV^f$Y(xE0y5g-hO#U=T9h0XMBfl%KjF|0N&>)i`q|)wpP`$Hde<)a7{& z&JZ)Ig_wP`jMwHS=lVU<@0uX+tiJK&B19!&KNcdv>{Liy#Itv_21>n?CApx6LaC^y zrYuybi>WG&v3IIk7?c_r#hnlh&@`(5%S4qSN zkhP)pDh|Rqr%}=HP?MLr+49La2^{fr(TM}&%HjG+Feymy^T7gDK39OLipnWD{pZ4=;1Q-H>L`(3L<6$bGTR%lO+ms;sxpau zC+EK=N}M`|C3H{}USFaRI|PNfzQDkn58 zoyH5k&-xSi+jlkpQ+oyJ z1gzMJoqT8e2bJHi`>^iE&n?;8m+i-wtj9C6L%xlqR_Ebx9>Cuf9w7;myM`o)S@NNH z(vQjccW_9#o3JVUIXMiSY{yFIl>SFJIy}-VE`zMcBR_(=Lf9k@2xBOq%j*zYRd@5{ z8!xX^4aBMj;uQ_ID&MZVUAOpLGFPY`TorQY7%7K@W^xM1p<|?SB=xOP)2Pk#QLbs! zYW~POOz-mO-Mjhk$kQwaid6~#biY(1UpPSIHjxLq?45}uav?d(n%Jm=lW%Nr z#+_gd-h?E%7EUfFfHabro?n=-464Vu1oXw_GUELx{eVfX{{!j()W6b)Q)BYIHx`c}$2V&xroPJCege!+(YKi;-f-obb`|IywMhZfJ_Ylorw7O!o5tK`j+ zTUTPWTS%R!br;Z6TtLcf@1MAEnS!3 zl;IY23_76BNEuRn1MOY>X7NhxP^@++UQs*mdCT{vZ?Oh6qHY*8qK;@ph3#toJ*!aK z_$d7(S%B{pijucC$Mliav{x{HRInX>qX;1}8l?z1Yl$N2lo@EeG8(iMwOo$|r3>(3 z39ec=xMF+gDWlMn6D{=Q5(V>^;j=siVq0R$Q{0TT}{7+L6jUwqaU|9P1} zF4ISSroA2JkNUU6uUp&_--Jyp|1~^oNlLx8^@~zySC+I7rOuu!(MU}71892xYXY$I zEVivUNkKOptwQqa2la&SZSYjX}Fqi zZX~ttLtKC>dM&zSZAjm&eYH^g+k`rm4FS}Cp8)KDaBb9HCDbyVWQF+acq`ip!_OlQ zlXWX9T`6pi6*eywc7EJ8ygrWGf#aVRwJ;>F*w>Vd`D&s0zcixx2LzyV6}~af*n^3| z!=;E6G%GBtea1e#``YfM!q$(Qy4S~VGxgykybpi#+BcW1O<(ms{5yn3Z6E%K0PH|} z?LJIL-IuGi`^*#*@K{<0Zip2&EETqY+|s)~f<@MW8|4n%60^4~SzEs9IKFPg@xLJe z6BSq+$2SPaI^G!PtvU(6`|wgG5Go1oSRcE;dL;O}M%4b008I8`ZPb!f2A7OfXoJkH z_8W1lSS{&XAGZ%g)${-72*tYjttD32vQ*gh zar@@=k-UMC2T>*uYl;+qweb9=5zqgY0QC>X^FJm$w`xgn#$%P=N<(*Ntgv&bu>a$Y zd)7yH4?}mCjP8vw`^F{f#;-ax{(U35{|5pvfvmMj#vc&6nN*$9tuvupe_Hij!u?@< zs4nF;#R@kq74GH zM%T7Yvf*tC3-EgFkTKs5+SGv z!KZu@S%eUj8Gh@W#gPZ|?BMd##U0%6C`od=LFm+{Ph6a^vOy_Kl=or*i|JGHluBq7;uTLdA;BUzbe>6>rAC*Z;IXW#1j@&Tkl zztzgh%%Zl_W+rBvOJcU(ymKWyy4KA?IX1F*_-f)|x)m1*nMqI;7YA8E!8I2LX+l=r zy8>MZmz3awAv5js)vpV6F^Y7dVuT9Sm?a1msUf>AW~nYzrVEwpLKV7Dr7lF5{G{@$ zM#xy&8eRNaU8qj?b-gaspbItXzH8EjnsuQTT}af0T6Li|U8o(QR82PM-gW3gow`t$ zw|M$%o^A+Mmt@E3S96?Z+wDQ^mZf5l9{Tm5Vh&I-`>*n7@ND#KoG!wwteuT5x=@cU z)Qcg)2Bdy5G+UGLe7HmS(A ziDtd@chx49YMX3Bn^a}n1)|BzqFSk8V zgH@}$YRRO#%EXx=i^=%$+tDUmy6rdM3lmow!uYRoF?>2M<=Rq&PgOtkhs2H^#k*fJ zbt&!5XE@p_uAkqL%*~N+zseJ;_CP&!`%2}rG5Y)Z4>tU$|D%3*a3_|0o$4MWm9Ws6 zf|DyJL;y&suq3JsR@AxDEikTrFool6(@skZi&>p{vOV&=px^=FwbF1uSV1)9Mv_7^GJvH&;7 z1T$f{j-K5_SCrX&U=FidkPPbh;pB2w$r(a6Oo#PU8DL!`s!R8cmrN3zXEs|X(H=Y+Jm%A z$7ntxO{VWcnKGIKH#eFK*Bmv&wL~p&^P+ih^CLv?*e{cPfoMMLjR=Y@EW|H}TH)HF z1#kHa6iBAP@QbR~xgu_Hv2{ES^~E;YKL1EErnYiE&Hws<*ta9BUGtL zmyQq(zi5T0N>{S#XeGX?iB`d_jaI|0i`KxckJiF%h}OYvjMl?#iZ;M)jyA$=i8jF% zqs?$zqb+dTq9WY(Xe-z*U|48zZ}5eK3fj;f*?q8;z{DEc8+IwNJuhlrmc?Pw?9q`PbQ zd3tHv|8Ae6SAc1<-(^C_Q|a;;vv!~wJ6Q8XH4@@R7T86hBEKlKSDZL-RCIYf7`fqI zx;w?~hut^a5TjT(z%_ayb}vhsxdcWt)012?5r|}An6h$mYJyDIT^#(v7ni6nm@mR_ z);LYp=(t4&xzLn@i_A@s^#zZ35_IegjHjJp#q>%@_Q6IY_$@zl!?^M#yY0s-_4zz7 z5CN4o`4SRtfr6Eh&YPzqA;Y~m#xhUs$2>B{%MG(}Aza3Tl4|RfhQ+l^pQo->A-rY2 z@JCc{;^_+0y(6>Ur|NnS)x5iU??LviA9hU<8w1(9ezJG{7}j}g#l@JC+dZfE%Eww$TdT}jHVORPxg zcPy=Uy%H{Q5-++ik6`k^%F2sdc0d*V5#J21T;Pqv!0i;Pb=*1nMnms>sd-D}4E z1MgUma;co50gS!sDY#@Vwg2L^lPxttxa_=l4r`5&=z$q4(KU^$|Hvj4-5AJBIq`9$ zEP^iLMk#bX<)SC-K+XVwR5lGG0ova6i!ZW!y?BUvDy<0Q?0iAoBt=$pgL6E(*gZ8k z)i?Fbl%rSdni`$zqQ_qT7~_v|{%EHMjlHg^jZn!Fs|T9-yQVHqbx}ni zrUp}~DCJp~f4Yy~IfVrPTUD{|UoynQh|)#l7bSWxv0;L%{6g~AG+=1-$w{W+ib{vd z201EW0?Zo>$HqxS_E@SF5l@08WFlkdCF@=poP({(_S{@EXKoCR$_u+Bc zjmysPmG)l8t%JDe4y**+NX9xArK)snd^xpsFcpD!iEs$_)G;zSjbdOMpiD8?7ofjw zQF_to+39K228E+E<(l$!CoPz1x*~gNJWtOgIwiXD;%n90Vuq{Kt<@2Yl-#Oo4M11KitZ(o#au7ojVO3d^ zWB-7gso7;dniza@K=Ii2i&lkU9tn!a>8;CObNCcb21TWNXZcNtw0Dym$T)v;@~v(g zWgC2{G!!Nk@4K8d5)D+~3ekh{c{Gjsol?CKT-1uYruns_9<&~Yxv_7u2>nV#od@!_xZalyb;kP0*a&J43R9KmpoGxTUYYgb(%X!= zP&w2)ANgvKxD@ElQ);?OS*Oy-Ng6{`M_D*amoB%*GGI2~3ewuaK&}`WnRZ=bv*e5q zD^Fa5Ig>_>FkJTqsf+Ld%jd+y=p_(8-xu^?@SecxLydzh*_xh_YQOJ1E~#Y8D}D)p zI5oX|^yRfUTydG^}|>8MRY83ZZgNSc&Ax`~f#fpX3#!jw7!kM0FYQP@4*+lznmw z_wlyGLMr_Z*tAZdaKm{&Op#_~o;NNhaJ6h;hD`)Km(25;Jo#a&q-uc|hG;N$id7RI zA8gWNogG&z<62!>Q)$~7^l@r7cs>}q7&Op&Wo-aNZ&K&^w7$M3so-ZUys~N}EVk)X zM86lNd&6-+afVh|G?ZDN#IR>qi0cQRnvjvyq3mN=aFr{5P>OM&;B&VM^1Cq(%S=u!y zTPPzRc`TieOl#f%jFEyCp<^)0D<0J(!q?y+lqdJ~4{fEr1zqN@9bLinE8EXtX&81% za|0KVe4iKJImB*g@bveJJwscEwr$z6WoUS47<+6@3FWJpc?MvMur(r09($<8fp)qQ z{vn976J1Pq@?{*L0d!EGZj_?tp#CgJ!alYy*a*>h!|mnn^Nf2z@YEKRLOdH<75gsu zBG_MH+Q&vfxsW(4(jE-!V=P=aa#^24m&5R&%?kD*68H#mP35_Rb!mSnNMpzNB}g}I zhuOU@{o+xe*oUct_Q1GieFTg5!NERkBnH)yFd`0bM$kA{r&BT+W3+Ks&jBBZHBcF) zyYsE70U09gq|W-VC1yJ$rB(UVi$z^}`=H2!ebh+Wim-Ya8%RAj9Rca` zgF8Z93n*lpEm-iQA%c!#m|{UR=jSr_MG#45#YV#bZ8=0rEHfX60UcW-?Pkw}dtevw9%yiOv1iM)c7#|UjRv21(znmqOr zea)IZu_Zd4wR1$v7TsOq-fz4xCU);-qz+6jNqpgA5bY`9nkflJ*(EF_XgQ58#8&I_ z1i@y_e(^|%0Ws32C~3B!3k6|>UFQBw&-w}77&ml8hi~R+<6tLf7lr zY7K>yIlG`p7#7s$C`W|YN*O15j5W|tNW;1e@G-W)S-Y%El3_#~MHwK{pfD$cUN3!& za`}Q6@B+BOpuXsm2ueBj;|o?-{uv5Jw_*_s-oud!dISz z_PS_#!<>NWouSYxrEVF(5dqFZz|PQBFl`K~%PTUM?>^7FgKO5~11pRGgk2s-?HwGm zD#7vvPZM#ZMJ4(T_tS`oeL`-`*+U4XIaV2d&c4fqfKEmgQRhaPsP!2@>8o`g}fgIGX#s% zL1M=76NGSDPcevh=_W5~&(WC~KXH<11*4n`q5!n^q>h1ww+HKErR5m|LkXw_;*r=< z35cU6M~#rB{#t8(&d4dhD%YdfD^BDb4<*bbaU!iiL`aI0^FNc5fRm`0&>4B&cL6(B zow*+pmm)(lt0ccghEgX4>7T>PECJy9M3Yxzd*Hrxr{5Jg?Q!kqX04b^CNG}GSdSc~ zH&;&eHDU4VuL;~9!2g1z6SmZuOd|idA~1Q33rv>rCn)$lrj4i&UrQwl$bXzkV3w#@K2B4r^a*vv|B0NBspphvM&JbGFMmdF zn0@68rj@x+@hYM?Y?^x;$nD_h2#{GQ%p_?Id*dBT5_q3oN{vJC=ZDo5?7Tf2=-Ux`!jN$ffMe6qtK3Zo?HU^ z86`Dn6${5GMi_0~YLko-m5UrhcIp{(P_|*IV_UL` z0?k6%#-*O|WD5mEp=@wz=+%3XJeic94IkQ07?LIF{T+f!)Y)Y4B+BSqkhi@mxkt z6xxdr;bn}4aK&g@Fea3mrnJcE0Mf!z_f` zBk8-(UZBuw?nY+M{za2w(Ec};`i?F&eto(8*wy?`pNL)i2U^xKN?d;%oqF{Wy5qxL zT9TEz{&kYN#$5oty1M`#UkbaANn!V=q_AP{-@z`48E}Ht~p+(-1oL$qHv<;Q{7vRydnZgXA+fa3@s@0-Tbj zBmiZ}WJp!=Bjl`bHu{dd2IOa+I1$SVXUj4z(pn}a9((m*n*N@psZC?6ShyOl>wRob6&-aabE>g|mr+loiewR|YTDniy-;cN{%GAo>&70zaQ0T8^- z3THEc$wv^*ma0esvznX?!r4*{UOc=oc4o<8c5|vmGSlfI>D+W_?0*UQVX2WyLYD|i zB!?|EQLveu7IH*#TFGf6r=6S)FRR2qq!K$QS61SUTJIdaw=?B^Y2;Lz1uQbfSC8g<>>m~8ZR0jG5u+YX?(l+PwgAw zKO#L#gk>K&E#&NnlPH6ff)ruqE1aC8nJCqOm_oPo9L2Pgv;b2SljD`B02V7@VG3l4 zf*BYnfe74XuUl)4mn`sNd*LNZU zvs8gF(^*vHMpdmmHZwEDq@xEoLr7M{!}$W_Ebw7U#pyViTL?kaiK{R9U6*~3Or_gZ znI0#MhJ&F5!y41mJ~tWv#Y+UCw#t?Mxso>J#ack!PBPU)DA8!m3LQr*uBMJ8p{u3n zs2hq1)i*LCrYjZ#0WWmq=28XG>P0cdHmVwS_9Nm8r2GrEr$hrW(dy$ijGvhz_%{0udc*Z=O0hDRRv<3iuF} zoJ}()YP6n0x9UQnS#L=No2+S=G2!6Tv*9_sMk7oGL$IGob_UYzZg`-JOr(K|DpQk; zh++D8EDl#pW+fKGw_BK4lAu*cXDi z_)Op6w!XowC?n8-VMPk4B-YKkzytDwiaR3VV27+gD+=Lk*A3fI5KJT^9;$UZG=~%+ zC99pgG=)lKnK?HgO+F+F_&h=1nX?hDM~i_(b>wCxr_{7}YtvS1vu4uV)<(vZ(*{b0 z_K~T5wwb7JKgG?&nmOA_Ph%@7>z}n-2Qj`xLYFDGMCe0knCx))hJ^&^#N9tZ0FbQ;3g+r zDKn64<%+^QAWeoMdPybRzMglyNqR}uOI7a7z65NU-U9#aE{b9VJRl* zbKHy&hWgWj{i z7zffQ`JnhLun(m%_;9}%NY)6Yb*n-VDQ835 zy|nU;E7z{9*xO_F_FLn3Iu~me2A1t3OV$y_QBC8Vd>chs{RtedMZE?e;|t}UKvy?c zr>py@+!V8(n*#mZcBY?eaoM$86@z{*Z;vdKh4otv-y_Rp$ue2IYcFuKOqMK@CCdvV z&Z4?*k%?y}Uf4RjlI&pmyBkc(mVRwgmuVOG#c`7}<@Rf_XH>_H(jx0}kTanw+c5k* zLpiL_u=iDTVL$fyxL@m#Gc}_ulLg$)FN`b6cAq0+mdTQ3vfyCX%Z zIY1IN#*JdqWQiiaL6$|FU?=VYtPWU;)5JIQcsv*K+WPCVccE_C!i+PI|@7kB`dzP$wl1+$nKTNkUf9u)NF4IRQ(`bkJqnr)! z>-Zt1h(Vl=)gy4U_jrRVl8FP7Nj3yBCGVQvA#;=Xy#ut+4-y_Zu0MdFin?SZ5wC}4 zJ@^qhwc0!pWS8)89CzcIK}Kv-LLT4>dcp4ksfYO;W}=qlJ;W(SHKr8)BhI}eA+)*$Zl?t0c9L)rZftub&@Ad~J`w@p-Zecl$yG6)`S?)mZ?W*u^- z_JAyd;AvzK&_)9y1Sx3?b%UTe+=iD6V5s67Ss4rx+USK;216g)b7hdgFo>e)QA(jF zDS<&{(Fk8CwoxA>ez8#W7?KyNP=q5VVWvza5_@nIe{La*FzI;caKxo5zD}%$;xR~J zA3|>Zl;umrVjxu#TucB?L}_KbsPv74*AB)js^ZlRad9AC(-d#$h_`Kuw+_YYS_#t9 zN3ZJJlXXII?W#~r2JY>pwxnP$usuLh;&+jYDk&lF?g3JN8TCbUJOM~M!y57}t77S7j zgr6*<0XNOjb}g&!fopWL>K<8j4=9~*@$tu9iL>q1!%0MIc4A-3sxNbXSw_P&E|^<; zE1MZ>Sw_RUn_3Ox9(OQdSHylLTQ2RZ<+UR!`qPWw^~OnrhjVMZvI{#Jb#!o zDwy9j@61~?jo9wy?#%lmGXNi$@am6EJM;c~6GDGtMMxIbU{`l13Yp*rSFv&vCX}Bl z)9_2+S}W6V4(4QxKZSb{Q7vJdqZ?ukzo>&hm2S7knwCvJhB8r zRy}^dSbC9fM-Y#VbP$u`cH-Z# zmh8tv=e;b_n92syJJ$gW0>T3;N@a-Z0Qnq^`OOJB{6U}jfYzJh2oSk-9+(G zcAXdPP$qmHX)|^^iGm5me%fW5>fNdF?@r|J<2=vHR@t*t_3cg+s7RE^wq?Rf;R)0$ zqovpwqAZvt;uS~}6g`jaY{Jr?A>b&GNMb?yb8=``mnijxL)*6w4mlMCH)fiG8I9l; zV?U#)C*drVJuVOAICiPh33AAGhV)mIB9$g#g>j9UP%!LedJoFRPknM(3bJ3Jk)@bH z<$p}v5K0EJ6nI@)O_nG=t*(vNHpN>9MHP*Ow@$WA;K9>r8bGdPUys0Z* z+a7Q1_^hFXL@~f8xoW<*L8z#^>A2yT*I7Gl?7y0S-5RsjeOgg-bJvYsD-|8FijH_i z?Y!qL-17sN{DhuSPVVFR`#;O&tc@hj1h~IQDVVeTi544OFgRl*#T9&U8^oo3< z`8)<#vwRh@HL5o|n^oH&+q7i#>dUops@b_`m14VdD6_S2x* zh1f77TP{@Aaz0pBtfFhBqCZyAzf!R^RmQ)80uq;1NH-W zR7EHFjlWDnF^|*FjOtKNqTi|9n%v9(S?zxhVAcFecgG`gf0Vq`%ckKZishatoAyc3 z@Uv-sute!_vH)F8T2JIJj!}Pn9-V{>(UlAJ&74a1#p?Q2>NdyfHm}s}jn(b_!ImFy zT&_E@QgLFVdZaa9&I-LE7NGB`Tb7#q#ej2Gf_N*H(L2N5GQTNmisTD z8Hgdj&naqpHz!5B7IH7Yp?01zaMB~vtQ)FyE+!)dK*W0~qM;D%C;;atxVYyy&R~wS zLEony&ERuLT5*lc*`N=iQ^eo#;Dp6D?IW}1_=a#x1Sm8sxp4z!2*$FB)uEPx-%ob} zRRQI2;lXEPc7l+@NeSU6O!bzDi1hd1zg(nkwckKft#$wm4u6qQ+Ca*Zhp!#J6?yxc zx4*dEHz zTAUh7cj>bfA$B???~DYOGXKBm1IpadCUug(i=1w9%E$zkt-?FJBju<`T;>)2;lZK+i?@&)GBC zEp+z2ed_k9c+b##I~R7w`!~PmU+^oBkv-q<{jfK_Wykxc?w*Qo9DJ{Lp*M~X{I~te zV`$s^jdvU4+joDz=)ge-6F$7jxzrIj}CowDBkXPd*|()@$UZj ziWZ9EqtE@Q@uSB0zJotH_0g&Lp8Y>6`lv{Gr%zh`PA-dM;JwC$My0rNsIB|$-rK$L z4IAG+bo-F}?z01?=W;BzPmAnH3we?_OsYucGp|)BtG@1@-+KLgth6mzz+g6^rg47k zR`vYBSao-@kim+C`j+|dt^M<_#_D>K#SB)WgV`CZR1iCE9lz6l`x}dSOC4KdE!&c1 z>_xfI+Ih=;XX~x=F>yFq!C;j_b;JCoTY2+4VpUzqDh8_-%4@EN=l5TKHCEQ1tYNTP zDx?Q6f2lQW++=(oXEzEt; zxiqjR<`_*n*o%#Vz4H3leD(E%u@W)a!(hEaW!-$m{PcVS4*ZgR4Aw974KKDYURdmj z_3lm%Fxa3lv~|(_!Pdp|vBAB`AqE>3dWRM(7N-{*Vm-T(n;2}fF1;-bwpCZiZ49MeL-F3>_YN%_if?-6 z{hfDr#)r4R-+Q+=-qId#@A|A^n`OtRMP=99uV1*{6Dw*?S^%KwO+!}l31rpLlmY_T zFsUq6_uP4Lsd`habaS$hfJH>Tx^L}Ys^1u^#5_l^5}E~S?`&Oa9f~y!C+!3)6&l1_ z);pa`;$W`GGoa36}T{CaP!pk=j*f)`9r8ik`KBMwJR z=|}`D4U2$fKqH{(cmyyVkpQM+62Np+0+^0V0Mn5Ppcb15YSD=x@L6*`8Y|d9_(b?g zBXlb*wX}T_03$jHWWXkY(vV3&BQ6PML?ywDm?W4Hkpwg1kzhtN5-f#93Z;-pA>gp& zsy|lHu-ZgH2pB!#VQoO+He`}EtkY0PvC>dTKqCqXW<(*uj3^|S5rqUZqL5%l6cQ|j zLJFl&NFfahDfq;Cp}Y~0Hwk=?@mbR@^mKi%B#05G3})z;43>sf1~sCU0gZTNKqF!q z(1=+EG@_OPjksmNTHQ*sj=}16i`NDQYt$`}877j=psA}Z?DgK9C)9Vdh*!6A4~6(| znr!HTw>BjOdftHoDm|06EQG@pdM;j4pjM0RI)Hf0zq(3~WF`5>80gkP8I)(~n{WSx zfCpn`FiyY`M}H#U>GXu$;B*it0^IDm88EUWVyF=BLuOwv1_fhjFfIi#C=!L7@!fyg z74}M`|H#B*84D!QsCn1#19OcojCPWhGH}%-lF3XoWsIV*$0SmUOw?)PFg;)OJt;&c zDzxu$X<*nF3Nn^VqE!2anCx5txLXDznMl72yrBz>H{^1=L%0mR-wh63KNKf}5vhXG zA9#r9xHAweJ~z98U8nriyQ@erSceKYtKJ^q+qJHxZ5 zQw3>2Qk=`iSYwQF#&};t^n%!Uj30L2x-$^+%=*2%rQZVM41YrS8k}UV$z=L0r^saf zd81%z{+V!SMK}}_4*g8n8WXmDB5eOe82LmP{zT~dL}>j)*!_uc=o4Y@C&KXuOBL<+1m?T<_X=LJn8r-k2kr^Xb1z~mH}zeO+!OG)xACG4 Mf#}Z#da|Pa|8|rdXaE2J literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/event.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/event.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e119f6ce770eac2478f36392b83adade2d3ba5a GIT binary patch literal 13849 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/notification.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/notification.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccea54351355252262019eb473a0af2a9c5972c7 GIT binary patch literal 32224 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/payment.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/payment.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e5cacb3166acba0c49d1a0dc24b9c28e2f12d30 GIT binary patch literal 24468 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/recording.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/recording.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14d687fbb3201cb866704172f8c7dff68a10a2d6 GIT binary patch literal 40853 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/siprec.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/siprec.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29b58d66314e33eaf08f280c0ca5977f51102645 GIT binary patch literal 77599 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/stream.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/stream.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28a88f213002a7526e945a6970a52648ee9935b9 GIT binary patch literal 77619 zcmeHw34Bx6mG_e+dEZ!r*&>zz4zUg14TP}R?3l#{f?0%+WGt{P^CSZ{a$cIy6xyVL zrVY@h4M~?klQc=UB;As9ZD-@EVXzN0tt^0GDfd+?`w+CuXj+OLs_Kex4U^$W0ZS_^0`TEG!V zYj<=wS{x4CcDAQ=I9r?@t`=8^yT#p+-jZ(GUF{hinJt+eSuI&6ceiJElykF z4QTS>j^-x2!_Q zTsBy)H)ifkp;jCePDNrc9xl*b2w34xQLe{>bY!bWjgJSPy01oe=w zJ=7bFryugQcLyU-K*8$HNYvNq4=xXPMuSJ9U@8=*&A~{xTlWXSmb)$#iAp?UYfz6s z!G3D1gt->E`fb?w0Cb3rc2iJEG
    d6l{+=t{ri-jBe73$HnuTqI%HRAp~LX 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/transcription.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/transcription.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..514066dec8e187c9910fc4e393ec5149ca7305c6 GIT binary patch literal 18890 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/user_defined_message_subscription.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/__pycache__/user_defined_message_subscription.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b02ba873a8e86e77a507419bdefa542f8e107f8e GIT binary patch literal 13773 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/event.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/event.py new file mode 100644 index 00000000..80eb8aa8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/event.py @@ -0,0 +1,298 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class EventInstance(InstanceResource): + """ + :ivar request: Contains a dictionary representing the request of the call. + :ivar response: Contains a dictionary representing the call response, including a list of the call events. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], account_sid: str, call_sid: str + ): + super().__init__(version) + + self.request: Optional[Dict[str, object]] = payload.get("request") + self.response: Optional[Dict[str, object]] = payload.get("response") + + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EventPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> EventInstance: + """ + Build an instance of EventInstance + + :param payload: Payload response from the API + """ + return EventInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class EventList(ListResource): + + def __init__(self, version: Version, account_sid: str, call_sid: str): + """ + Initialize the EventList + + :param version: Version that contains the resource + :param account_sid: The unique SID identifier of the Account. + :param call_sid: The unique SID identifier of the Call. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + self._uri = "/Accounts/{account_sid}/Calls/{call_sid}/Events.json".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[EventInstance]: + """ + Streams EventInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[EventInstance]: + """ + Asynchronously streams EventInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EventInstance]: + """ + Lists EventInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EventInstance]: + """ + Asynchronously lists EventInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EventPage: + """ + Retrieve a single page of EventInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EventInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EventPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EventPage: + """ + Asynchronously retrieve a single page of EventInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EventInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EventPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> EventPage: + """ + Retrieve a specific page of EventInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EventInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return EventPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> EventPage: + """ + Asynchronously retrieve a specific page of EventInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EventInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return EventPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/notification.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/notification.py new file mode 100644 index 00000000..fd9e8c0d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/notification.py @@ -0,0 +1,562 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date, datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class NotificationInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Call Notification resource. + :ivar api_version: The API version used to create the Call Notification resource. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Call Notification resource is associated with. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar error_code: A unique error code for the error condition that is described in our [Error Dictionary](https://www.twilio.com/docs/api/errors). + :ivar log: An integer log level that corresponds to the type of notification: `0` is ERROR, `1` is WARNING. + :ivar message_date: The date the notification was actually generated in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. Message buffering can cause this value to differ from `date_created`. + :ivar message_text: The text of the notification. + :ivar more_info: The URL for more information about the error condition. This value is a page in our [Error Dictionary](https://www.twilio.com/docs/api/errors). + :ivar request_method: The HTTP method used to generate the notification. If the notification was generated during a phone call, this is the HTTP Method used to request the resource on your server. If the notification was generated by your use of our REST API, this is the HTTP method used to call the resource on our servers. + :ivar request_url: The URL of the resource that generated the notification. If the notification was generated during a phone call, this is the URL of the resource on your server that caused the notification. If the notification was generated by your use of our REST API, this is the URL of the resource you called. + :ivar request_variables: The HTTP GET or POST variables we sent to your server. However, if the notification was generated by our REST API, this contains the HTTP POST or PUT variables you sent to our API. + :ivar response_body: The HTTP body returned by your server. + :ivar response_headers: The HTTP headers returned by your server. + :ivar sid: The unique string that that we created to identify the Call Notification resource. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + call_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.call_sid: Optional[str] = payload.get("call_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.error_code: Optional[str] = payload.get("error_code") + self.log: Optional[str] = payload.get("log") + self.message_date: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("message_date") + ) + self.message_text: Optional[str] = payload.get("message_text") + self.more_info: Optional[str] = payload.get("more_info") + self.request_method: Optional[str] = payload.get("request_method") + self.request_url: Optional[str] = payload.get("request_url") + self.request_variables: Optional[str] = payload.get("request_variables") + self.response_body: Optional[str] = payload.get("response_body") + self.response_headers: Optional[str] = payload.get("response_headers") + self.sid: Optional[str] = payload.get("sid") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid or self.sid, + } + self._context: Optional[NotificationContext] = None + + @property + def _proxy(self) -> "NotificationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: NotificationContext for this NotificationInstance + """ + if self._context is None: + self._context = NotificationContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "NotificationInstance": + """ + Fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "NotificationInstance": + """ + Asynchronous coroutine to fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NotificationContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, call_sid: str, sid: str): + """ + Initialize the NotificationContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Call Notification resource to fetch. + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the Call Notification resource to fetch. + :param sid: The Twilio-provided string that uniquely identifies the Call Notification resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid, + } + self._uri = ( + "/Accounts/{account_sid}/Calls/{call_sid}/Notifications/{sid}.json".format( + **self._solution + ) + ) + + def fetch(self) -> NotificationInstance: + """ + Fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return NotificationInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> NotificationInstance: + """ + Asynchronous coroutine to fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return NotificationInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NotificationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> NotificationInstance: + """ + Build an instance of NotificationInstance + + :param payload: Payload response from the API + """ + return NotificationInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class NotificationList(ListResource): + + def __init__(self, version: Version, account_sid: str, call_sid: str): + """ + Initialize the NotificationList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Call Notification resources to read. + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the Call Notification resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + self._uri = ( + "/Accounts/{account_sid}/Calls/{call_sid}/Notifications.json".format( + **self._solution + ) + ) + + def stream( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[NotificationInstance]: + """ + Streams NotificationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param date message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + log=log, + message_date=message_date, + message_date_before=message_date_before, + message_date_after=message_date_after, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[NotificationInstance]: + """ + Asynchronously streams NotificationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param date message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + log=log, + message_date=message_date, + message_date_before=message_date_before, + message_date_after=message_date_after, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[NotificationInstance]: + """ + Lists NotificationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param date message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + log=log, + message_date=message_date, + message_date_before=message_date_before, + message_date_after=message_date_after, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[NotificationInstance]: + """ + Asynchronously lists NotificationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param date message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + log=log, + message_date=message_date, + message_date_before=message_date_before, + message_date_after=message_date_after, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> NotificationPage: + """ + Retrieve a single page of NotificationInstance records from the API. + Request is executed immediately + + :param log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of NotificationInstance + """ + data = values.of( + { + "Log": log, + "MessageDate": serialize.iso8601_date(message_date), + "MessageDate<": serialize.iso8601_date(message_date_before), + "MessageDate>": serialize.iso8601_date(message_date_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return NotificationPage(self._version, response, self._solution) + + async def page_async( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> NotificationPage: + """ + Asynchronously retrieve a single page of NotificationInstance records from the API. + Request is executed immediately + + :param log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of NotificationInstance + """ + data = values.of( + { + "Log": log, + "MessageDate": serialize.iso8601_date(message_date), + "MessageDate<": serialize.iso8601_date(message_date_before), + "MessageDate>": serialize.iso8601_date(message_date_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return NotificationPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> NotificationPage: + """ + Retrieve a specific page of NotificationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of NotificationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return NotificationPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> NotificationPage: + """ + Asynchronously retrieve a specific page of NotificationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of NotificationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return NotificationPage(self._version, response, self._solution) + + def get(self, sid: str) -> NotificationContext: + """ + Constructs a NotificationContext + + :param sid: The Twilio-provided string that uniquely identifies the Call Notification resource to fetch. + """ + return NotificationContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> NotificationContext: + """ + Constructs a NotificationContext + + :param sid: The Twilio-provided string that uniquely identifies the Call Notification resource to fetch. + """ + return NotificationContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/payment.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/payment.py new file mode 100644 index 00000000..0f918609 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/payment.py @@ -0,0 +1,503 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PaymentInstance(InstanceResource): + + class BankAccountType(object): + CONSUMER_CHECKING = "consumer-checking" + CONSUMER_SAVINGS = "consumer-savings" + COMMERCIAL_CHECKING = "commercial-checking" + + class Capture(object): + PAYMENT_CARD_NUMBER = "payment-card-number" + EXPIRATION_DATE = "expiration-date" + SECURITY_CODE = "security-code" + POSTAL_CODE = "postal-code" + BANK_ROUTING_NUMBER = "bank-routing-number" + BANK_ACCOUNT_NUMBER = "bank-account-number" + + class PaymentMethod(object): + CREDIT_CARD = "credit-card" + ACH_DEBIT = "ach-debit" + + class Status(object): + COMPLETE = "complete" + CANCEL = "cancel" + + class TokenType(object): + ONE_TIME = "one-time" + REUSABLE = "reusable" + PAYMENT_METHOD = "payment-method" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Payments resource. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Payments resource is associated with. This will refer to the call sid that is producing the payment card (credit/ACH) information thru DTMF. + :ivar sid: The SID of the Payments resource. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + call_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.sid: Optional[str] = payload.get("sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid or self.sid, + } + self._context: Optional[PaymentContext] = None + + @property + def _proxy(self) -> "PaymentContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PaymentContext for this PaymentInstance + """ + if self._context is None: + self._context = PaymentContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + return self._context + + def update( + self, + idempotency_key: str, + status_callback: str, + capture: Union["PaymentInstance.Capture", object] = values.unset, + status: Union["PaymentInstance.Status", object] = values.unset, + ) -> "PaymentInstance": + """ + Update the PaymentInstance + + :param idempotency_key: A unique token that will be used to ensure that multiple API calls with the same information do not result in multiple transactions. This should be a unique string value per API call and can be a randomly generated. + :param status_callback: Provide an absolute or relative URL to receive status updates regarding your Pay session. Read more about the [Update](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-update) and [Complete/Cancel](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-cancelcomplete) POST requests. + :param capture: + :param status: + + :returns: The updated PaymentInstance + """ + return self._proxy.update( + idempotency_key=idempotency_key, + status_callback=status_callback, + capture=capture, + status=status, + ) + + async def update_async( + self, + idempotency_key: str, + status_callback: str, + capture: Union["PaymentInstance.Capture", object] = values.unset, + status: Union["PaymentInstance.Status", object] = values.unset, + ) -> "PaymentInstance": + """ + Asynchronous coroutine to update the PaymentInstance + + :param idempotency_key: A unique token that will be used to ensure that multiple API calls with the same information do not result in multiple transactions. This should be a unique string value per API call and can be a randomly generated. + :param status_callback: Provide an absolute or relative URL to receive status updates regarding your Pay session. Read more about the [Update](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-update) and [Complete/Cancel](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-cancelcomplete) POST requests. + :param capture: + :param status: + + :returns: The updated PaymentInstance + """ + return await self._proxy.update_async( + idempotency_key=idempotency_key, + status_callback=status_callback, + capture=capture, + status=status, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PaymentContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, call_sid: str, sid: str): + """ + Initialize the PaymentContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that will update the resource. + :param call_sid: The SID of the call that will update the resource. This should be the same call sid that was used to create payments resource. + :param sid: The SID of Payments session that needs to be updated. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid, + } + self._uri = ( + "/Accounts/{account_sid}/Calls/{call_sid}/Payments/{sid}.json".format( + **self._solution + ) + ) + + def update( + self, + idempotency_key: str, + status_callback: str, + capture: Union["PaymentInstance.Capture", object] = values.unset, + status: Union["PaymentInstance.Status", object] = values.unset, + ) -> PaymentInstance: + """ + Update the PaymentInstance + + :param idempotency_key: A unique token that will be used to ensure that multiple API calls with the same information do not result in multiple transactions. This should be a unique string value per API call and can be a randomly generated. + :param status_callback: Provide an absolute or relative URL to receive status updates regarding your Pay session. Read more about the [Update](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-update) and [Complete/Cancel](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-cancelcomplete) POST requests. + :param capture: + :param status: + + :returns: The updated PaymentInstance + """ + + data = values.of( + { + "IdempotencyKey": idempotency_key, + "StatusCallback": status_callback, + "Capture": capture, + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PaymentInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + idempotency_key: str, + status_callback: str, + capture: Union["PaymentInstance.Capture", object] = values.unset, + status: Union["PaymentInstance.Status", object] = values.unset, + ) -> PaymentInstance: + """ + Asynchronous coroutine to update the PaymentInstance + + :param idempotency_key: A unique token that will be used to ensure that multiple API calls with the same information do not result in multiple transactions. This should be a unique string value per API call and can be a randomly generated. + :param status_callback: Provide an absolute or relative URL to receive status updates regarding your Pay session. Read more about the [Update](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-update) and [Complete/Cancel](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-cancelcomplete) POST requests. + :param capture: + :param status: + + :returns: The updated PaymentInstance + """ + + data = values.of( + { + "IdempotencyKey": idempotency_key, + "StatusCallback": status_callback, + "Capture": capture, + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PaymentInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PaymentList(ListResource): + + def __init__(self, version: Version, account_sid: str, call_sid: str): + """ + Initialize the PaymentList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that will create the resource. + :param call_sid: The SID of the call that will create the resource. Call leg associated with this sid is expected to provide payment information thru DTMF. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + self._uri = "/Accounts/{account_sid}/Calls/{call_sid}/Payments.json".format( + **self._solution + ) + + def create( + self, + idempotency_key: str, + status_callback: str, + bank_account_type: Union[ + "PaymentInstance.BankAccountType", object + ] = values.unset, + charge_amount: Union[float, object] = values.unset, + currency: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + input: Union[str, object] = values.unset, + min_postal_code_length: Union[int, object] = values.unset, + parameter: Union[object, object] = values.unset, + payment_connector: Union[str, object] = values.unset, + payment_method: Union["PaymentInstance.PaymentMethod", object] = values.unset, + postal_code: Union[bool, object] = values.unset, + security_code: Union[bool, object] = values.unset, + timeout: Union[int, object] = values.unset, + token_type: Union["PaymentInstance.TokenType", object] = values.unset, + valid_card_types: Union[str, object] = values.unset, + ) -> PaymentInstance: + """ + Create the PaymentInstance + + :param idempotency_key: A unique token that will be used to ensure that multiple API calls with the same information do not result in multiple transactions. This should be a unique string value per API call and can be a randomly generated. + :param status_callback: Provide an absolute or relative URL to receive status updates regarding your Pay session. Read more about the [expected StatusCallback values](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback) + :param bank_account_type: + :param charge_amount: A positive decimal value less than 1,000,000 to charge against the credit card or bank account. Default currency can be overwritten with `currency` field. Leave blank or set to 0 to tokenize. + :param currency: The currency of the `charge_amount`, formatted as [ISO 4127](http://www.iso.org/iso/home/standards/currency_codes.htm) format. The default value is `USD` and all values allowed from the Pay Connector are accepted. + :param description: The description can be used to provide more details regarding the transaction. This information is submitted along with the payment details to the Payment Connector which are then posted on the transactions. + :param input: A list of inputs that should be accepted. Currently only `dtmf` is supported. All digits captured during a pay session are redacted from the logs. + :param min_postal_code_length: A positive integer that is used to validate the length of the `PostalCode` inputted by the user. User must enter this many digits. + :param parameter: A single-level JSON object used to pass custom parameters to payment processors. (Required for ACH payments). The information that has to be included here depends on the Connector. [Read more](https://www.twilio.com/console/voice/pay-connectors). + :param payment_connector: This is the unique name corresponding to the Pay Connector installed in the Twilio Add-ons. Learn more about [ Connectors](https://www.twilio.com/console/voice/pay-connectors). The default value is `Default`. + :param payment_method: + :param postal_code: Indicates whether the credit card postal code (zip code) is a required piece of payment information that must be provided by the caller. The default is `true`. + :param security_code: Indicates whether the credit card security code is a required piece of payment information that must be provided by the caller. The default is `true`. + :param timeout: The number of seconds that should wait for the caller to press a digit between each subsequent digit, after the first one, before moving on to validate the digits captured. The default is `5`, maximum is `600`. + :param token_type: + :param valid_card_types: Credit card types separated by space that Pay should accept. The default value is `visa mastercard amex` + + :returns: The created PaymentInstance + """ + + data = values.of( + { + "IdempotencyKey": idempotency_key, + "StatusCallback": status_callback, + "BankAccountType": bank_account_type, + "ChargeAmount": charge_amount, + "Currency": currency, + "Description": description, + "Input": input, + "MinPostalCodeLength": min_postal_code_length, + "Parameter": serialize.object(parameter), + "PaymentConnector": payment_connector, + "PaymentMethod": payment_method, + "PostalCode": serialize.boolean_to_string(postal_code), + "SecurityCode": serialize.boolean_to_string(security_code), + "Timeout": timeout, + "TokenType": token_type, + "ValidCardTypes": valid_card_types, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PaymentInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + async def create_async( + self, + idempotency_key: str, + status_callback: str, + bank_account_type: Union[ + "PaymentInstance.BankAccountType", object + ] = values.unset, + charge_amount: Union[float, object] = values.unset, + currency: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + input: Union[str, object] = values.unset, + min_postal_code_length: Union[int, object] = values.unset, + parameter: Union[object, object] = values.unset, + payment_connector: Union[str, object] = values.unset, + payment_method: Union["PaymentInstance.PaymentMethod", object] = values.unset, + postal_code: Union[bool, object] = values.unset, + security_code: Union[bool, object] = values.unset, + timeout: Union[int, object] = values.unset, + token_type: Union["PaymentInstance.TokenType", object] = values.unset, + valid_card_types: Union[str, object] = values.unset, + ) -> PaymentInstance: + """ + Asynchronously create the PaymentInstance + + :param idempotency_key: A unique token that will be used to ensure that multiple API calls with the same information do not result in multiple transactions. This should be a unique string value per API call and can be a randomly generated. + :param status_callback: Provide an absolute or relative URL to receive status updates regarding your Pay session. Read more about the [expected StatusCallback values](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback) + :param bank_account_type: + :param charge_amount: A positive decimal value less than 1,000,000 to charge against the credit card or bank account. Default currency can be overwritten with `currency` field. Leave blank or set to 0 to tokenize. + :param currency: The currency of the `charge_amount`, formatted as [ISO 4127](http://www.iso.org/iso/home/standards/currency_codes.htm) format. The default value is `USD` and all values allowed from the Pay Connector are accepted. + :param description: The description can be used to provide more details regarding the transaction. This information is submitted along with the payment details to the Payment Connector which are then posted on the transactions. + :param input: A list of inputs that should be accepted. Currently only `dtmf` is supported. All digits captured during a pay session are redacted from the logs. + :param min_postal_code_length: A positive integer that is used to validate the length of the `PostalCode` inputted by the user. User must enter this many digits. + :param parameter: A single-level JSON object used to pass custom parameters to payment processors. (Required for ACH payments). The information that has to be included here depends on the Connector. [Read more](https://www.twilio.com/console/voice/pay-connectors). + :param payment_connector: This is the unique name corresponding to the Pay Connector installed in the Twilio Add-ons. Learn more about [ Connectors](https://www.twilio.com/console/voice/pay-connectors). The default value is `Default`. + :param payment_method: + :param postal_code: Indicates whether the credit card postal code (zip code) is a required piece of payment information that must be provided by the caller. The default is `true`. + :param security_code: Indicates whether the credit card security code is a required piece of payment information that must be provided by the caller. The default is `true`. + :param timeout: The number of seconds that should wait for the caller to press a digit between each subsequent digit, after the first one, before moving on to validate the digits captured. The default is `5`, maximum is `600`. + :param token_type: + :param valid_card_types: Credit card types separated by space that Pay should accept. The default value is `visa mastercard amex` + + :returns: The created PaymentInstance + """ + + data = values.of( + { + "IdempotencyKey": idempotency_key, + "StatusCallback": status_callback, + "BankAccountType": bank_account_type, + "ChargeAmount": charge_amount, + "Currency": currency, + "Description": description, + "Input": input, + "MinPostalCodeLength": min_postal_code_length, + "Parameter": serialize.object(parameter), + "PaymentConnector": payment_connector, + "PaymentMethod": payment_method, + "PostalCode": serialize.boolean_to_string(postal_code), + "SecurityCode": serialize.boolean_to_string(security_code), + "Timeout": timeout, + "TokenType": token_type, + "ValidCardTypes": valid_card_types, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PaymentInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + def get(self, sid: str) -> PaymentContext: + """ + Constructs a PaymentContext + + :param sid: The SID of Payments session that needs to be updated. + """ + return PaymentContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> PaymentContext: + """ + Constructs a PaymentContext + + :param sid: The SID of Payments session that needs to be updated. + """ + return PaymentContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/recording.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/recording.py new file mode 100644 index 00000000..5b93ec6c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/recording.py @@ -0,0 +1,822 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date, datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RecordingInstance(InstanceResource): + + class Source(object): + DIALVERB = "DialVerb" + CONFERENCE = "Conference" + OUTBOUNDAPI = "OutboundAPI" + TRUNKING = "Trunking" + RECORDVERB = "RecordVerb" + STARTCALLRECORDINGAPI = "StartCallRecordingAPI" + STARTCONFERENCERECORDINGAPI = "StartConferenceRecordingAPI" + + class Status(object): + IN_PROGRESS = "in-progress" + PAUSED = "paused" + STOPPED = "stopped" + PROCESSING = "processing" + COMPLETED = "completed" + ABSENT = "absent" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording resource. + :ivar api_version: The API version used to make the recording. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Recording resource is associated with. + :ivar conference_sid: The Conference SID that identifies the conference associated with the recording, if a conference recording. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar start_time: The start time of the recording in GMT and in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar duration: The length of the recording in seconds. + :ivar sid: The unique string that that we created to identify the Recording resource. + :ivar price: The one-time cost of creating the recording in the `price_unit` currency. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar encryption_details: How to decrypt the recording if it was encrypted using [Call Recording Encryption](https://www.twilio.com/docs/voice/tutorials/voice-recording-encryption) feature. + :ivar price_unit: The currency used in the `price` property. Example: `USD`. + :ivar status: + :ivar channels: The number of channels in the final recording file. Can be: `1`, or `2`. Separating a two leg call into two separate channels of the recording file is supported in [Dial](https://www.twilio.com/docs/voice/twiml/dial#attributes-record) and [Outbound Rest API](https://www.twilio.com/docs/voice/make-calls) record options. + :ivar source: + :ivar error_code: The error code that describes why the recording is `absent`. The error code is described in our [Error Dictionary](https://www.twilio.com/docs/api/errors). This value is null if the recording `status` is not `absent`. + :ivar track: The recorded track. Can be: `inbound`, `outbound`, or `both`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + call_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.call_sid: Optional[str] = payload.get("call_sid") + self.conference_sid: Optional[str] = payload.get("conference_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.start_time: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("start_time") + ) + self.duration: Optional[str] = payload.get("duration") + self.sid: Optional[str] = payload.get("sid") + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.uri: Optional[str] = payload.get("uri") + self.encryption_details: Optional[Dict[str, object]] = payload.get( + "encryption_details" + ) + self.price_unit: Optional[str] = payload.get("price_unit") + self.status: Optional["RecordingInstance.Status"] = payload.get("status") + self.channels: Optional[int] = deserialize.integer(payload.get("channels")) + self.source: Optional["RecordingInstance.Source"] = payload.get("source") + self.error_code: Optional[int] = deserialize.integer(payload.get("error_code")) + self.track: Optional[str] = payload.get("track") + + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid or self.sid, + } + self._context: Optional[RecordingContext] = None + + @property + def _proxy(self) -> "RecordingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RecordingContext for this RecordingInstance + """ + if self._context is None: + self._context = RecordingContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "RecordingInstance": + """ + Fetch the RecordingInstance + + + :returns: The fetched RecordingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "RecordingInstance": + """ + Asynchronous coroutine to fetch the RecordingInstance + + + :returns: The fetched RecordingInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + status: "RecordingInstance.Status", + pause_behavior: Union[str, object] = values.unset, + ) -> "RecordingInstance": + """ + Update the RecordingInstance + + :param status: + :param pause_behavior: Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + + :returns: The updated RecordingInstance + """ + return self._proxy.update( + status=status, + pause_behavior=pause_behavior, + ) + + async def update_async( + self, + status: "RecordingInstance.Status", + pause_behavior: Union[str, object] = values.unset, + ) -> "RecordingInstance": + """ + Asynchronous coroutine to update the RecordingInstance + + :param status: + :param pause_behavior: Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + + :returns: The updated RecordingInstance + """ + return await self._proxy.update_async( + status=status, + pause_behavior=pause_behavior, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RecordingContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, call_sid: str, sid: str): + """ + Initialize the RecordingContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording resource to update. + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resource to update. + :param sid: The Twilio-provided string that uniquely identifies the Recording resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid, + } + self._uri = ( + "/Accounts/{account_sid}/Calls/{call_sid}/Recordings/{sid}.json".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> RecordingInstance: + """ + Fetch the RecordingInstance + + + :returns: The fetched RecordingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> RecordingInstance: + """ + Asynchronous coroutine to fetch the RecordingInstance + + + :returns: The fetched RecordingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + status: "RecordingInstance.Status", + pause_behavior: Union[str, object] = values.unset, + ) -> RecordingInstance: + """ + Update the RecordingInstance + + :param status: + :param pause_behavior: Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + + :returns: The updated RecordingInstance + """ + + data = values.of( + { + "Status": status, + "PauseBehavior": pause_behavior, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + status: "RecordingInstance.Status", + pause_behavior: Union[str, object] = values.unset, + ) -> RecordingInstance: + """ + Asynchronous coroutine to update the RecordingInstance + + :param status: + :param pause_behavior: Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + + :returns: The updated RecordingInstance + """ + + data = values.of( + { + "Status": status, + "PauseBehavior": pause_behavior, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RecordingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RecordingInstance: + """ + Build an instance of RecordingInstance + + :param payload: Payload response from the API + """ + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RecordingList(ListResource): + + def __init__(self, version: Version, account_sid: str, call_sid: str): + """ + Initialize the RecordingList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording resources to read. + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + self._uri = "/Accounts/{account_sid}/Calls/{call_sid}/Recordings.json".format( + **self._solution + ) + + def create( + self, + recording_status_callback_event: Union[List[str], object] = values.unset, + recording_status_callback: Union[str, object] = values.unset, + recording_status_callback_method: Union[str, object] = values.unset, + trim: Union[str, object] = values.unset, + recording_channels: Union[str, object] = values.unset, + recording_track: Union[str, object] = values.unset, + ) -> RecordingInstance: + """ + Create the RecordingInstance + + :param recording_status_callback_event: The recording status events on which we should call the `recording_status_callback` URL. Can be: `in-progress`, `completed` and `absent` and the default is `completed`. Separate multiple event values with a space. + :param recording_status_callback: The URL we should call using the `recording_status_callback_method` on each recording event specified in `recording_status_callback_event`. For more information, see [RecordingStatusCallback parameters](https://www.twilio.com/docs/voice/api/recording#recordingstatuscallback). + :param recording_status_callback_method: The HTTP method we should use to call `recording_status_callback`. Can be: `GET` or `POST` and the default is `POST`. + :param trim: Whether to trim any leading and trailing silence in the recording. Can be: `trim-silence` or `do-not-trim` and the default is `do-not-trim`. `trim-silence` trims the silence from the beginning and end of the recording and `do-not-trim` does not. + :param recording_channels: The number of channels used in the recording. Can be: `mono` or `dual` and the default is `mono`. `mono` records all parties of the call into one channel. `dual` records each party of a 2-party call into separate channels. + :param recording_track: The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is generated from Twilio. `both` records the audio that is received and generated by Twilio. + + :returns: The created RecordingInstance + """ + + data = values.of( + { + "RecordingStatusCallbackEvent": serialize.map( + recording_status_callback_event, lambda e: e + ), + "RecordingStatusCallback": recording_status_callback, + "RecordingStatusCallbackMethod": recording_status_callback_method, + "Trim": trim, + "RecordingChannels": recording_channels, + "RecordingTrack": recording_track, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + async def create_async( + self, + recording_status_callback_event: Union[List[str], object] = values.unset, + recording_status_callback: Union[str, object] = values.unset, + recording_status_callback_method: Union[str, object] = values.unset, + trim: Union[str, object] = values.unset, + recording_channels: Union[str, object] = values.unset, + recording_track: Union[str, object] = values.unset, + ) -> RecordingInstance: + """ + Asynchronously create the RecordingInstance + + :param recording_status_callback_event: The recording status events on which we should call the `recording_status_callback` URL. Can be: `in-progress`, `completed` and `absent` and the default is `completed`. Separate multiple event values with a space. + :param recording_status_callback: The URL we should call using the `recording_status_callback_method` on each recording event specified in `recording_status_callback_event`. For more information, see [RecordingStatusCallback parameters](https://www.twilio.com/docs/voice/api/recording#recordingstatuscallback). + :param recording_status_callback_method: The HTTP method we should use to call `recording_status_callback`. Can be: `GET` or `POST` and the default is `POST`. + :param trim: Whether to trim any leading and trailing silence in the recording. Can be: `trim-silence` or `do-not-trim` and the default is `do-not-trim`. `trim-silence` trims the silence from the beginning and end of the recording and `do-not-trim` does not. + :param recording_channels: The number of channels used in the recording. Can be: `mono` or `dual` and the default is `mono`. `mono` records all parties of the call into one channel. `dual` records each party of a 2-party call into separate channels. + :param recording_track: The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is generated from Twilio. `both` records the audio that is received and generated by Twilio. + + :returns: The created RecordingInstance + """ + + data = values.of( + { + "RecordingStatusCallbackEvent": serialize.map( + recording_status_callback_event, lambda e: e + ), + "RecordingStatusCallback": recording_status_callback, + "RecordingStatusCallbackMethod": recording_status_callback_method, + "Trim": trim, + "RecordingChannels": recording_channels, + "RecordingTrack": recording_track, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + def stream( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RecordingInstance]: + """ + Streams RecordingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param date date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RecordingInstance]: + """ + Asynchronously streams RecordingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param date date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RecordingInstance]: + """ + Lists RecordingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param date date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RecordingInstance]: + """ + Asynchronously lists RecordingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param date date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RecordingPage: + """ + Retrieve a single page of RecordingInstance records from the API. + Request is executed immediately + + :param date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RecordingInstance + """ + data = values.of( + { + "DateCreated": serialize.iso8601_date(date_created), + "DateCreated<": serialize.iso8601_date(date_created_before), + "DateCreated>": serialize.iso8601_date(date_created_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RecordingPage(self._version, response, self._solution) + + async def page_async( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RecordingPage: + """ + Asynchronously retrieve a single page of RecordingInstance records from the API. + Request is executed immediately + + :param date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RecordingInstance + """ + data = values.of( + { + "DateCreated": serialize.iso8601_date(date_created), + "DateCreated<": serialize.iso8601_date(date_created_before), + "DateCreated>": serialize.iso8601_date(date_created_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RecordingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> RecordingPage: + """ + Retrieve a specific page of RecordingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RecordingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RecordingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> RecordingPage: + """ + Asynchronously retrieve a specific page of RecordingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RecordingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RecordingPage(self._version, response, self._solution) + + def get(self, sid: str) -> RecordingContext: + """ + Constructs a RecordingContext + + :param sid: The Twilio-provided string that uniquely identifies the Recording resource to update. + """ + return RecordingContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> RecordingContext: + """ + Constructs a RecordingContext + + :param sid: The Twilio-provided string that uniquely identifies the Recording resource to update. + """ + return RecordingContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/siprec.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/siprec.py new file mode 100644 index 00000000..d808331c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/siprec.py @@ -0,0 +1,1561 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class SiprecInstance(InstanceResource): + + class Status(object): + IN_PROGRESS = "in-progress" + STOPPED = "stopped" + + class Track(object): + INBOUND_TRACK = "inbound_track" + OUTBOUND_TRACK = "outbound_track" + BOTH_TRACKS = "both_tracks" + + class UpdateStatus(object): + STOPPED = "stopped" + + """ + :ivar sid: The SID of the Siprec resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Siprec resource. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Siprec resource is associated with. + :ivar name: The user-specified name of this Siprec, if one was given when the Siprec was created. This may be used to stop the Siprec. + :ivar status: + :ivar date_updated: The date and time in GMT that this resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + call_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.name: Optional[str] = payload.get("name") + self.status: Optional["SiprecInstance.Status"] = payload.get("status") + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid or self.sid, + } + self._context: Optional[SiprecContext] = None + + @property + def _proxy(self) -> "SiprecContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SiprecContext for this SiprecInstance + """ + if self._context is None: + self._context = SiprecContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + return self._context + + def update(self, status: "SiprecInstance.UpdateStatus") -> "SiprecInstance": + """ + Update the SiprecInstance + + :param status: + + :returns: The updated SiprecInstance + """ + return self._proxy.update( + status=status, + ) + + async def update_async( + self, status: "SiprecInstance.UpdateStatus" + ) -> "SiprecInstance": + """ + Asynchronous coroutine to update the SiprecInstance + + :param status: + + :returns: The updated SiprecInstance + """ + return await self._proxy.update_async( + status=status, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SiprecContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, call_sid: str, sid: str): + """ + Initialize the SiprecContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Siprec resource. + :param call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Siprec resource is associated with. + :param sid: The SID of the Siprec resource, or the `name` used when creating the resource + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Calls/{call_sid}/Siprec/{sid}.json".format( + **self._solution + ) + + def update(self, status: "SiprecInstance.UpdateStatus") -> SiprecInstance: + """ + Update the SiprecInstance + + :param status: + + :returns: The updated SiprecInstance + """ + + data = values.of( + { + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SiprecInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, status: "SiprecInstance.UpdateStatus" + ) -> SiprecInstance: + """ + Asynchronous coroutine to update the SiprecInstance + + :param status: + + :returns: The updated SiprecInstance + """ + + data = values.of( + { + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SiprecInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SiprecList(ListResource): + + def __init__(self, version: Version, account_sid: str, call_sid: str): + """ + Initialize the SiprecList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Siprec resource. + :param call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Siprec resource is associated with. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + self._uri = "/Accounts/{account_sid}/Calls/{call_sid}/Siprec.json".format( + **self._solution + ) + + def create( + self, + name: Union[str, object] = values.unset, + connector_name: Union[str, object] = values.unset, + track: Union["SiprecInstance.Track", object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + parameter1_name: Union[str, object] = values.unset, + parameter1_value: Union[str, object] = values.unset, + parameter2_name: Union[str, object] = values.unset, + parameter2_value: Union[str, object] = values.unset, + parameter3_name: Union[str, object] = values.unset, + parameter3_value: Union[str, object] = values.unset, + parameter4_name: Union[str, object] = values.unset, + parameter4_value: Union[str, object] = values.unset, + parameter5_name: Union[str, object] = values.unset, + parameter5_value: Union[str, object] = values.unset, + parameter6_name: Union[str, object] = values.unset, + parameter6_value: Union[str, object] = values.unset, + parameter7_name: Union[str, object] = values.unset, + parameter7_value: Union[str, object] = values.unset, + parameter8_name: Union[str, object] = values.unset, + parameter8_value: Union[str, object] = values.unset, + parameter9_name: Union[str, object] = values.unset, + parameter9_value: Union[str, object] = values.unset, + parameter10_name: Union[str, object] = values.unset, + parameter10_value: Union[str, object] = values.unset, + parameter11_name: Union[str, object] = values.unset, + parameter11_value: Union[str, object] = values.unset, + parameter12_name: Union[str, object] = values.unset, + parameter12_value: Union[str, object] = values.unset, + parameter13_name: Union[str, object] = values.unset, + parameter13_value: Union[str, object] = values.unset, + parameter14_name: Union[str, object] = values.unset, + parameter14_value: Union[str, object] = values.unset, + parameter15_name: Union[str, object] = values.unset, + parameter15_value: Union[str, object] = values.unset, + parameter16_name: Union[str, object] = values.unset, + parameter16_value: Union[str, object] = values.unset, + parameter17_name: Union[str, object] = values.unset, + parameter17_value: Union[str, object] = values.unset, + parameter18_name: Union[str, object] = values.unset, + parameter18_value: Union[str, object] = values.unset, + parameter19_name: Union[str, object] = values.unset, + parameter19_value: Union[str, object] = values.unset, + parameter20_name: Union[str, object] = values.unset, + parameter20_value: Union[str, object] = values.unset, + parameter21_name: Union[str, object] = values.unset, + parameter21_value: Union[str, object] = values.unset, + parameter22_name: Union[str, object] = values.unset, + parameter22_value: Union[str, object] = values.unset, + parameter23_name: Union[str, object] = values.unset, + parameter23_value: Union[str, object] = values.unset, + parameter24_name: Union[str, object] = values.unset, + parameter24_value: Union[str, object] = values.unset, + parameter25_name: Union[str, object] = values.unset, + parameter25_value: Union[str, object] = values.unset, + parameter26_name: Union[str, object] = values.unset, + parameter26_value: Union[str, object] = values.unset, + parameter27_name: Union[str, object] = values.unset, + parameter27_value: Union[str, object] = values.unset, + parameter28_name: Union[str, object] = values.unset, + parameter28_value: Union[str, object] = values.unset, + parameter29_name: Union[str, object] = values.unset, + parameter29_value: Union[str, object] = values.unset, + parameter30_name: Union[str, object] = values.unset, + parameter30_value: Union[str, object] = values.unset, + parameter31_name: Union[str, object] = values.unset, + parameter31_value: Union[str, object] = values.unset, + parameter32_name: Union[str, object] = values.unset, + parameter32_value: Union[str, object] = values.unset, + parameter33_name: Union[str, object] = values.unset, + parameter33_value: Union[str, object] = values.unset, + parameter34_name: Union[str, object] = values.unset, + parameter34_value: Union[str, object] = values.unset, + parameter35_name: Union[str, object] = values.unset, + parameter35_value: Union[str, object] = values.unset, + parameter36_name: Union[str, object] = values.unset, + parameter36_value: Union[str, object] = values.unset, + parameter37_name: Union[str, object] = values.unset, + parameter37_value: Union[str, object] = values.unset, + parameter38_name: Union[str, object] = values.unset, + parameter38_value: Union[str, object] = values.unset, + parameter39_name: Union[str, object] = values.unset, + parameter39_value: Union[str, object] = values.unset, + parameter40_name: Union[str, object] = values.unset, + parameter40_value: Union[str, object] = values.unset, + parameter41_name: Union[str, object] = values.unset, + parameter41_value: Union[str, object] = values.unset, + parameter42_name: Union[str, object] = values.unset, + parameter42_value: Union[str, object] = values.unset, + parameter43_name: Union[str, object] = values.unset, + parameter43_value: Union[str, object] = values.unset, + parameter44_name: Union[str, object] = values.unset, + parameter44_value: Union[str, object] = values.unset, + parameter45_name: Union[str, object] = values.unset, + parameter45_value: Union[str, object] = values.unset, + parameter46_name: Union[str, object] = values.unset, + parameter46_value: Union[str, object] = values.unset, + parameter47_name: Union[str, object] = values.unset, + parameter47_value: Union[str, object] = values.unset, + parameter48_name: Union[str, object] = values.unset, + parameter48_value: Union[str, object] = values.unset, + parameter49_name: Union[str, object] = values.unset, + parameter49_value: Union[str, object] = values.unset, + parameter50_name: Union[str, object] = values.unset, + parameter50_value: Union[str, object] = values.unset, + parameter51_name: Union[str, object] = values.unset, + parameter51_value: Union[str, object] = values.unset, + parameter52_name: Union[str, object] = values.unset, + parameter52_value: Union[str, object] = values.unset, + parameter53_name: Union[str, object] = values.unset, + parameter53_value: Union[str, object] = values.unset, + parameter54_name: Union[str, object] = values.unset, + parameter54_value: Union[str, object] = values.unset, + parameter55_name: Union[str, object] = values.unset, + parameter55_value: Union[str, object] = values.unset, + parameter56_name: Union[str, object] = values.unset, + parameter56_value: Union[str, object] = values.unset, + parameter57_name: Union[str, object] = values.unset, + parameter57_value: Union[str, object] = values.unset, + parameter58_name: Union[str, object] = values.unset, + parameter58_value: Union[str, object] = values.unset, + parameter59_name: Union[str, object] = values.unset, + parameter59_value: Union[str, object] = values.unset, + parameter60_name: Union[str, object] = values.unset, + parameter60_value: Union[str, object] = values.unset, + parameter61_name: Union[str, object] = values.unset, + parameter61_value: Union[str, object] = values.unset, + parameter62_name: Union[str, object] = values.unset, + parameter62_value: Union[str, object] = values.unset, + parameter63_name: Union[str, object] = values.unset, + parameter63_value: Union[str, object] = values.unset, + parameter64_name: Union[str, object] = values.unset, + parameter64_value: Union[str, object] = values.unset, + parameter65_name: Union[str, object] = values.unset, + parameter65_value: Union[str, object] = values.unset, + parameter66_name: Union[str, object] = values.unset, + parameter66_value: Union[str, object] = values.unset, + parameter67_name: Union[str, object] = values.unset, + parameter67_value: Union[str, object] = values.unset, + parameter68_name: Union[str, object] = values.unset, + parameter68_value: Union[str, object] = values.unset, + parameter69_name: Union[str, object] = values.unset, + parameter69_value: Union[str, object] = values.unset, + parameter70_name: Union[str, object] = values.unset, + parameter70_value: Union[str, object] = values.unset, + parameter71_name: Union[str, object] = values.unset, + parameter71_value: Union[str, object] = values.unset, + parameter72_name: Union[str, object] = values.unset, + parameter72_value: Union[str, object] = values.unset, + parameter73_name: Union[str, object] = values.unset, + parameter73_value: Union[str, object] = values.unset, + parameter74_name: Union[str, object] = values.unset, + parameter74_value: Union[str, object] = values.unset, + parameter75_name: Union[str, object] = values.unset, + parameter75_value: Union[str, object] = values.unset, + parameter76_name: Union[str, object] = values.unset, + parameter76_value: Union[str, object] = values.unset, + parameter77_name: Union[str, object] = values.unset, + parameter77_value: Union[str, object] = values.unset, + parameter78_name: Union[str, object] = values.unset, + parameter78_value: Union[str, object] = values.unset, + parameter79_name: Union[str, object] = values.unset, + parameter79_value: Union[str, object] = values.unset, + parameter80_name: Union[str, object] = values.unset, + parameter80_value: Union[str, object] = values.unset, + parameter81_name: Union[str, object] = values.unset, + parameter81_value: Union[str, object] = values.unset, + parameter82_name: Union[str, object] = values.unset, + parameter82_value: Union[str, object] = values.unset, + parameter83_name: Union[str, object] = values.unset, + parameter83_value: Union[str, object] = values.unset, + parameter84_name: Union[str, object] = values.unset, + parameter84_value: Union[str, object] = values.unset, + parameter85_name: Union[str, object] = values.unset, + parameter85_value: Union[str, object] = values.unset, + parameter86_name: Union[str, object] = values.unset, + parameter86_value: Union[str, object] = values.unset, + parameter87_name: Union[str, object] = values.unset, + parameter87_value: Union[str, object] = values.unset, + parameter88_name: Union[str, object] = values.unset, + parameter88_value: Union[str, object] = values.unset, + parameter89_name: Union[str, object] = values.unset, + parameter89_value: Union[str, object] = values.unset, + parameter90_name: Union[str, object] = values.unset, + parameter90_value: Union[str, object] = values.unset, + parameter91_name: Union[str, object] = values.unset, + parameter91_value: Union[str, object] = values.unset, + parameter92_name: Union[str, object] = values.unset, + parameter92_value: Union[str, object] = values.unset, + parameter93_name: Union[str, object] = values.unset, + parameter93_value: Union[str, object] = values.unset, + parameter94_name: Union[str, object] = values.unset, + parameter94_value: Union[str, object] = values.unset, + parameter95_name: Union[str, object] = values.unset, + parameter95_value: Union[str, object] = values.unset, + parameter96_name: Union[str, object] = values.unset, + parameter96_value: Union[str, object] = values.unset, + parameter97_name: Union[str, object] = values.unset, + parameter97_value: Union[str, object] = values.unset, + parameter98_name: Union[str, object] = values.unset, + parameter98_value: Union[str, object] = values.unset, + parameter99_name: Union[str, object] = values.unset, + parameter99_value: Union[str, object] = values.unset, + ) -> SiprecInstance: + """ + Create the SiprecInstance + + :param name: The user-specified name of this Siprec, if one was given when the Siprec was created. This may be used to stop the Siprec. + :param connector_name: Unique name used when configuring the connector via Marketplace Add-on. + :param track: + :param status_callback: Absolute URL of the status callback. + :param status_callback_method: The http method for the status_callback (one of GET, POST). + :param parameter1_name: Parameter name + :param parameter1_value: Parameter value + :param parameter2_name: Parameter name + :param parameter2_value: Parameter value + :param parameter3_name: Parameter name + :param parameter3_value: Parameter value + :param parameter4_name: Parameter name + :param parameter4_value: Parameter value + :param parameter5_name: Parameter name + :param parameter5_value: Parameter value + :param parameter6_name: Parameter name + :param parameter6_value: Parameter value + :param parameter7_name: Parameter name + :param parameter7_value: Parameter value + :param parameter8_name: Parameter name + :param parameter8_value: Parameter value + :param parameter9_name: Parameter name + :param parameter9_value: Parameter value + :param parameter10_name: Parameter name + :param parameter10_value: Parameter value + :param parameter11_name: Parameter name + :param parameter11_value: Parameter value + :param parameter12_name: Parameter name + :param parameter12_value: Parameter value + :param parameter13_name: Parameter name + :param parameter13_value: Parameter value + :param parameter14_name: Parameter name + :param parameter14_value: Parameter value + :param parameter15_name: Parameter name + :param parameter15_value: Parameter value + :param parameter16_name: Parameter name + :param parameter16_value: Parameter value + :param parameter17_name: Parameter name + :param parameter17_value: Parameter value + :param parameter18_name: Parameter name + :param parameter18_value: Parameter value + :param parameter19_name: Parameter name + :param parameter19_value: Parameter value + :param parameter20_name: Parameter name + :param parameter20_value: Parameter value + :param parameter21_name: Parameter name + :param parameter21_value: Parameter value + :param parameter22_name: Parameter name + :param parameter22_value: Parameter value + :param parameter23_name: Parameter name + :param parameter23_value: Parameter value + :param parameter24_name: Parameter name + :param parameter24_value: Parameter value + :param parameter25_name: Parameter name + :param parameter25_value: Parameter value + :param parameter26_name: Parameter name + :param parameter26_value: Parameter value + :param parameter27_name: Parameter name + :param parameter27_value: Parameter value + :param parameter28_name: Parameter name + :param parameter28_value: Parameter value + :param parameter29_name: Parameter name + :param parameter29_value: Parameter value + :param parameter30_name: Parameter name + :param parameter30_value: Parameter value + :param parameter31_name: Parameter name + :param parameter31_value: Parameter value + :param parameter32_name: Parameter name + :param parameter32_value: Parameter value + :param parameter33_name: Parameter name + :param parameter33_value: Parameter value + :param parameter34_name: Parameter name + :param parameter34_value: Parameter value + :param parameter35_name: Parameter name + :param parameter35_value: Parameter value + :param parameter36_name: Parameter name + :param parameter36_value: Parameter value + :param parameter37_name: Parameter name + :param parameter37_value: Parameter value + :param parameter38_name: Parameter name + :param parameter38_value: Parameter value + :param parameter39_name: Parameter name + :param parameter39_value: Parameter value + :param parameter40_name: Parameter name + :param parameter40_value: Parameter value + :param parameter41_name: Parameter name + :param parameter41_value: Parameter value + :param parameter42_name: Parameter name + :param parameter42_value: Parameter value + :param parameter43_name: Parameter name + :param parameter43_value: Parameter value + :param parameter44_name: Parameter name + :param parameter44_value: Parameter value + :param parameter45_name: Parameter name + :param parameter45_value: Parameter value + :param parameter46_name: Parameter name + :param parameter46_value: Parameter value + :param parameter47_name: Parameter name + :param parameter47_value: Parameter value + :param parameter48_name: Parameter name + :param parameter48_value: Parameter value + :param parameter49_name: Parameter name + :param parameter49_value: Parameter value + :param parameter50_name: Parameter name + :param parameter50_value: Parameter value + :param parameter51_name: Parameter name + :param parameter51_value: Parameter value + :param parameter52_name: Parameter name + :param parameter52_value: Parameter value + :param parameter53_name: Parameter name + :param parameter53_value: Parameter value + :param parameter54_name: Parameter name + :param parameter54_value: Parameter value + :param parameter55_name: Parameter name + :param parameter55_value: Parameter value + :param parameter56_name: Parameter name + :param parameter56_value: Parameter value + :param parameter57_name: Parameter name + :param parameter57_value: Parameter value + :param parameter58_name: Parameter name + :param parameter58_value: Parameter value + :param parameter59_name: Parameter name + :param parameter59_value: Parameter value + :param parameter60_name: Parameter name + :param parameter60_value: Parameter value + :param parameter61_name: Parameter name + :param parameter61_value: Parameter value + :param parameter62_name: Parameter name + :param parameter62_value: Parameter value + :param parameter63_name: Parameter name + :param parameter63_value: Parameter value + :param parameter64_name: Parameter name + :param parameter64_value: Parameter value + :param parameter65_name: Parameter name + :param parameter65_value: Parameter value + :param parameter66_name: Parameter name + :param parameter66_value: Parameter value + :param parameter67_name: Parameter name + :param parameter67_value: Parameter value + :param parameter68_name: Parameter name + :param parameter68_value: Parameter value + :param parameter69_name: Parameter name + :param parameter69_value: Parameter value + :param parameter70_name: Parameter name + :param parameter70_value: Parameter value + :param parameter71_name: Parameter name + :param parameter71_value: Parameter value + :param parameter72_name: Parameter name + :param parameter72_value: Parameter value + :param parameter73_name: Parameter name + :param parameter73_value: Parameter value + :param parameter74_name: Parameter name + :param parameter74_value: Parameter value + :param parameter75_name: Parameter name + :param parameter75_value: Parameter value + :param parameter76_name: Parameter name + :param parameter76_value: Parameter value + :param parameter77_name: Parameter name + :param parameter77_value: Parameter value + :param parameter78_name: Parameter name + :param parameter78_value: Parameter value + :param parameter79_name: Parameter name + :param parameter79_value: Parameter value + :param parameter80_name: Parameter name + :param parameter80_value: Parameter value + :param parameter81_name: Parameter name + :param parameter81_value: Parameter value + :param parameter82_name: Parameter name + :param parameter82_value: Parameter value + :param parameter83_name: Parameter name + :param parameter83_value: Parameter value + :param parameter84_name: Parameter name + :param parameter84_value: Parameter value + :param parameter85_name: Parameter name + :param parameter85_value: Parameter value + :param parameter86_name: Parameter name + :param parameter86_value: Parameter value + :param parameter87_name: Parameter name + :param parameter87_value: Parameter value + :param parameter88_name: Parameter name + :param parameter88_value: Parameter value + :param parameter89_name: Parameter name + :param parameter89_value: Parameter value + :param parameter90_name: Parameter name + :param parameter90_value: Parameter value + :param parameter91_name: Parameter name + :param parameter91_value: Parameter value + :param parameter92_name: Parameter name + :param parameter92_value: Parameter value + :param parameter93_name: Parameter name + :param parameter93_value: Parameter value + :param parameter94_name: Parameter name + :param parameter94_value: Parameter value + :param parameter95_name: Parameter name + :param parameter95_value: Parameter value + :param parameter96_name: Parameter name + :param parameter96_value: Parameter value + :param parameter97_name: Parameter name + :param parameter97_value: Parameter value + :param parameter98_name: Parameter name + :param parameter98_value: Parameter value + :param parameter99_name: Parameter name + :param parameter99_value: Parameter value + + :returns: The created SiprecInstance + """ + + data = values.of( + { + "Name": name, + "ConnectorName": connector_name, + "Track": track, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "Parameter1.Name": parameter1_name, + "Parameter1.Value": parameter1_value, + "Parameter2.Name": parameter2_name, + "Parameter2.Value": parameter2_value, + "Parameter3.Name": parameter3_name, + "Parameter3.Value": parameter3_value, + "Parameter4.Name": parameter4_name, + "Parameter4.Value": parameter4_value, + "Parameter5.Name": parameter5_name, + "Parameter5.Value": parameter5_value, + "Parameter6.Name": parameter6_name, + "Parameter6.Value": parameter6_value, + "Parameter7.Name": parameter7_name, + "Parameter7.Value": parameter7_value, + "Parameter8.Name": parameter8_name, + "Parameter8.Value": parameter8_value, + "Parameter9.Name": parameter9_name, + "Parameter9.Value": parameter9_value, + "Parameter10.Name": parameter10_name, + "Parameter10.Value": parameter10_value, + "Parameter11.Name": parameter11_name, + "Parameter11.Value": parameter11_value, + "Parameter12.Name": parameter12_name, + "Parameter12.Value": parameter12_value, + "Parameter13.Name": parameter13_name, + "Parameter13.Value": parameter13_value, + "Parameter14.Name": parameter14_name, + "Parameter14.Value": parameter14_value, + "Parameter15.Name": parameter15_name, + "Parameter15.Value": parameter15_value, + "Parameter16.Name": parameter16_name, + "Parameter16.Value": parameter16_value, + "Parameter17.Name": parameter17_name, + "Parameter17.Value": parameter17_value, + "Parameter18.Name": parameter18_name, + "Parameter18.Value": parameter18_value, + "Parameter19.Name": parameter19_name, + "Parameter19.Value": parameter19_value, + "Parameter20.Name": parameter20_name, + "Parameter20.Value": parameter20_value, + "Parameter21.Name": parameter21_name, + "Parameter21.Value": parameter21_value, + "Parameter22.Name": parameter22_name, + "Parameter22.Value": parameter22_value, + "Parameter23.Name": parameter23_name, + "Parameter23.Value": parameter23_value, + "Parameter24.Name": parameter24_name, + "Parameter24.Value": parameter24_value, + "Parameter25.Name": parameter25_name, + "Parameter25.Value": parameter25_value, + "Parameter26.Name": parameter26_name, + "Parameter26.Value": parameter26_value, + "Parameter27.Name": parameter27_name, + "Parameter27.Value": parameter27_value, + "Parameter28.Name": parameter28_name, + "Parameter28.Value": parameter28_value, + "Parameter29.Name": parameter29_name, + "Parameter29.Value": parameter29_value, + "Parameter30.Name": parameter30_name, + "Parameter30.Value": parameter30_value, + "Parameter31.Name": parameter31_name, + "Parameter31.Value": parameter31_value, + "Parameter32.Name": parameter32_name, + "Parameter32.Value": parameter32_value, + "Parameter33.Name": parameter33_name, + "Parameter33.Value": parameter33_value, + "Parameter34.Name": parameter34_name, + "Parameter34.Value": parameter34_value, + "Parameter35.Name": parameter35_name, + "Parameter35.Value": parameter35_value, + "Parameter36.Name": parameter36_name, + "Parameter36.Value": parameter36_value, + "Parameter37.Name": parameter37_name, + "Parameter37.Value": parameter37_value, + "Parameter38.Name": parameter38_name, + "Parameter38.Value": parameter38_value, + "Parameter39.Name": parameter39_name, + "Parameter39.Value": parameter39_value, + "Parameter40.Name": parameter40_name, + "Parameter40.Value": parameter40_value, + "Parameter41.Name": parameter41_name, + "Parameter41.Value": parameter41_value, + "Parameter42.Name": parameter42_name, + "Parameter42.Value": parameter42_value, + "Parameter43.Name": parameter43_name, + "Parameter43.Value": parameter43_value, + "Parameter44.Name": parameter44_name, + "Parameter44.Value": parameter44_value, + "Parameter45.Name": parameter45_name, + "Parameter45.Value": parameter45_value, + "Parameter46.Name": parameter46_name, + "Parameter46.Value": parameter46_value, + "Parameter47.Name": parameter47_name, + "Parameter47.Value": parameter47_value, + "Parameter48.Name": parameter48_name, + "Parameter48.Value": parameter48_value, + "Parameter49.Name": parameter49_name, + "Parameter49.Value": parameter49_value, + "Parameter50.Name": parameter50_name, + "Parameter50.Value": parameter50_value, + "Parameter51.Name": parameter51_name, + "Parameter51.Value": parameter51_value, + "Parameter52.Name": parameter52_name, + "Parameter52.Value": parameter52_value, + "Parameter53.Name": parameter53_name, + "Parameter53.Value": parameter53_value, + "Parameter54.Name": parameter54_name, + "Parameter54.Value": parameter54_value, + "Parameter55.Name": parameter55_name, + "Parameter55.Value": parameter55_value, + "Parameter56.Name": parameter56_name, + "Parameter56.Value": parameter56_value, + "Parameter57.Name": parameter57_name, + "Parameter57.Value": parameter57_value, + "Parameter58.Name": parameter58_name, + "Parameter58.Value": parameter58_value, + "Parameter59.Name": parameter59_name, + "Parameter59.Value": parameter59_value, + "Parameter60.Name": parameter60_name, + "Parameter60.Value": parameter60_value, + "Parameter61.Name": parameter61_name, + "Parameter61.Value": parameter61_value, + "Parameter62.Name": parameter62_name, + "Parameter62.Value": parameter62_value, + "Parameter63.Name": parameter63_name, + "Parameter63.Value": parameter63_value, + "Parameter64.Name": parameter64_name, + "Parameter64.Value": parameter64_value, + "Parameter65.Name": parameter65_name, + "Parameter65.Value": parameter65_value, + "Parameter66.Name": parameter66_name, + "Parameter66.Value": parameter66_value, + "Parameter67.Name": parameter67_name, + "Parameter67.Value": parameter67_value, + "Parameter68.Name": parameter68_name, + "Parameter68.Value": parameter68_value, + "Parameter69.Name": parameter69_name, + "Parameter69.Value": parameter69_value, + "Parameter70.Name": parameter70_name, + "Parameter70.Value": parameter70_value, + "Parameter71.Name": parameter71_name, + "Parameter71.Value": parameter71_value, + "Parameter72.Name": parameter72_name, + "Parameter72.Value": parameter72_value, + "Parameter73.Name": parameter73_name, + "Parameter73.Value": parameter73_value, + "Parameter74.Name": parameter74_name, + "Parameter74.Value": parameter74_value, + "Parameter75.Name": parameter75_name, + "Parameter75.Value": parameter75_value, + "Parameter76.Name": parameter76_name, + "Parameter76.Value": parameter76_value, + "Parameter77.Name": parameter77_name, + "Parameter77.Value": parameter77_value, + "Parameter78.Name": parameter78_name, + "Parameter78.Value": parameter78_value, + "Parameter79.Name": parameter79_name, + "Parameter79.Value": parameter79_value, + "Parameter80.Name": parameter80_name, + "Parameter80.Value": parameter80_value, + "Parameter81.Name": parameter81_name, + "Parameter81.Value": parameter81_value, + "Parameter82.Name": parameter82_name, + "Parameter82.Value": parameter82_value, + "Parameter83.Name": parameter83_name, + "Parameter83.Value": parameter83_value, + "Parameter84.Name": parameter84_name, + "Parameter84.Value": parameter84_value, + "Parameter85.Name": parameter85_name, + "Parameter85.Value": parameter85_value, + "Parameter86.Name": parameter86_name, + "Parameter86.Value": parameter86_value, + "Parameter87.Name": parameter87_name, + "Parameter87.Value": parameter87_value, + "Parameter88.Name": parameter88_name, + "Parameter88.Value": parameter88_value, + "Parameter89.Name": parameter89_name, + "Parameter89.Value": parameter89_value, + "Parameter90.Name": parameter90_name, + "Parameter90.Value": parameter90_value, + "Parameter91.Name": parameter91_name, + "Parameter91.Value": parameter91_value, + "Parameter92.Name": parameter92_name, + "Parameter92.Value": parameter92_value, + "Parameter93.Name": parameter93_name, + "Parameter93.Value": parameter93_value, + "Parameter94.Name": parameter94_name, + "Parameter94.Value": parameter94_value, + "Parameter95.Name": parameter95_name, + "Parameter95.Value": parameter95_value, + "Parameter96.Name": parameter96_name, + "Parameter96.Value": parameter96_value, + "Parameter97.Name": parameter97_name, + "Parameter97.Value": parameter97_value, + "Parameter98.Name": parameter98_name, + "Parameter98.Value": parameter98_value, + "Parameter99.Name": parameter99_name, + "Parameter99.Value": parameter99_value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SiprecInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + async def create_async( + self, + name: Union[str, object] = values.unset, + connector_name: Union[str, object] = values.unset, + track: Union["SiprecInstance.Track", object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + parameter1_name: Union[str, object] = values.unset, + parameter1_value: Union[str, object] = values.unset, + parameter2_name: Union[str, object] = values.unset, + parameter2_value: Union[str, object] = values.unset, + parameter3_name: Union[str, object] = values.unset, + parameter3_value: Union[str, object] = values.unset, + parameter4_name: Union[str, object] = values.unset, + parameter4_value: Union[str, object] = values.unset, + parameter5_name: Union[str, object] = values.unset, + parameter5_value: Union[str, object] = values.unset, + parameter6_name: Union[str, object] = values.unset, + parameter6_value: Union[str, object] = values.unset, + parameter7_name: Union[str, object] = values.unset, + parameter7_value: Union[str, object] = values.unset, + parameter8_name: Union[str, object] = values.unset, + parameter8_value: Union[str, object] = values.unset, + parameter9_name: Union[str, object] = values.unset, + parameter9_value: Union[str, object] = values.unset, + parameter10_name: Union[str, object] = values.unset, + parameter10_value: Union[str, object] = values.unset, + parameter11_name: Union[str, object] = values.unset, + parameter11_value: Union[str, object] = values.unset, + parameter12_name: Union[str, object] = values.unset, + parameter12_value: Union[str, object] = values.unset, + parameter13_name: Union[str, object] = values.unset, + parameter13_value: Union[str, object] = values.unset, + parameter14_name: Union[str, object] = values.unset, + parameter14_value: Union[str, object] = values.unset, + parameter15_name: Union[str, object] = values.unset, + parameter15_value: Union[str, object] = values.unset, + parameter16_name: Union[str, object] = values.unset, + parameter16_value: Union[str, object] = values.unset, + parameter17_name: Union[str, object] = values.unset, + parameter17_value: Union[str, object] = values.unset, + parameter18_name: Union[str, object] = values.unset, + parameter18_value: Union[str, object] = values.unset, + parameter19_name: Union[str, object] = values.unset, + parameter19_value: Union[str, object] = values.unset, + parameter20_name: Union[str, object] = values.unset, + parameter20_value: Union[str, object] = values.unset, + parameter21_name: Union[str, object] = values.unset, + parameter21_value: Union[str, object] = values.unset, + parameter22_name: Union[str, object] = values.unset, + parameter22_value: Union[str, object] = values.unset, + parameter23_name: Union[str, object] = values.unset, + parameter23_value: Union[str, object] = values.unset, + parameter24_name: Union[str, object] = values.unset, + parameter24_value: Union[str, object] = values.unset, + parameter25_name: Union[str, object] = values.unset, + parameter25_value: Union[str, object] = values.unset, + parameter26_name: Union[str, object] = values.unset, + parameter26_value: Union[str, object] = values.unset, + parameter27_name: Union[str, object] = values.unset, + parameter27_value: Union[str, object] = values.unset, + parameter28_name: Union[str, object] = values.unset, + parameter28_value: Union[str, object] = values.unset, + parameter29_name: Union[str, object] = values.unset, + parameter29_value: Union[str, object] = values.unset, + parameter30_name: Union[str, object] = values.unset, + parameter30_value: Union[str, object] = values.unset, + parameter31_name: Union[str, object] = values.unset, + parameter31_value: Union[str, object] = values.unset, + parameter32_name: Union[str, object] = values.unset, + parameter32_value: Union[str, object] = values.unset, + parameter33_name: Union[str, object] = values.unset, + parameter33_value: Union[str, object] = values.unset, + parameter34_name: Union[str, object] = values.unset, + parameter34_value: Union[str, object] = values.unset, + parameter35_name: Union[str, object] = values.unset, + parameter35_value: Union[str, object] = values.unset, + parameter36_name: Union[str, object] = values.unset, + parameter36_value: Union[str, object] = values.unset, + parameter37_name: Union[str, object] = values.unset, + parameter37_value: Union[str, object] = values.unset, + parameter38_name: Union[str, object] = values.unset, + parameter38_value: Union[str, object] = values.unset, + parameter39_name: Union[str, object] = values.unset, + parameter39_value: Union[str, object] = values.unset, + parameter40_name: Union[str, object] = values.unset, + parameter40_value: Union[str, object] = values.unset, + parameter41_name: Union[str, object] = values.unset, + parameter41_value: Union[str, object] = values.unset, + parameter42_name: Union[str, object] = values.unset, + parameter42_value: Union[str, object] = values.unset, + parameter43_name: Union[str, object] = values.unset, + parameter43_value: Union[str, object] = values.unset, + parameter44_name: Union[str, object] = values.unset, + parameter44_value: Union[str, object] = values.unset, + parameter45_name: Union[str, object] = values.unset, + parameter45_value: Union[str, object] = values.unset, + parameter46_name: Union[str, object] = values.unset, + parameter46_value: Union[str, object] = values.unset, + parameter47_name: Union[str, object] = values.unset, + parameter47_value: Union[str, object] = values.unset, + parameter48_name: Union[str, object] = values.unset, + parameter48_value: Union[str, object] = values.unset, + parameter49_name: Union[str, object] = values.unset, + parameter49_value: Union[str, object] = values.unset, + parameter50_name: Union[str, object] = values.unset, + parameter50_value: Union[str, object] = values.unset, + parameter51_name: Union[str, object] = values.unset, + parameter51_value: Union[str, object] = values.unset, + parameter52_name: Union[str, object] = values.unset, + parameter52_value: Union[str, object] = values.unset, + parameter53_name: Union[str, object] = values.unset, + parameter53_value: Union[str, object] = values.unset, + parameter54_name: Union[str, object] = values.unset, + parameter54_value: Union[str, object] = values.unset, + parameter55_name: Union[str, object] = values.unset, + parameter55_value: Union[str, object] = values.unset, + parameter56_name: Union[str, object] = values.unset, + parameter56_value: Union[str, object] = values.unset, + parameter57_name: Union[str, object] = values.unset, + parameter57_value: Union[str, object] = values.unset, + parameter58_name: Union[str, object] = values.unset, + parameter58_value: Union[str, object] = values.unset, + parameter59_name: Union[str, object] = values.unset, + parameter59_value: Union[str, object] = values.unset, + parameter60_name: Union[str, object] = values.unset, + parameter60_value: Union[str, object] = values.unset, + parameter61_name: Union[str, object] = values.unset, + parameter61_value: Union[str, object] = values.unset, + parameter62_name: Union[str, object] = values.unset, + parameter62_value: Union[str, object] = values.unset, + parameter63_name: Union[str, object] = values.unset, + parameter63_value: Union[str, object] = values.unset, + parameter64_name: Union[str, object] = values.unset, + parameter64_value: Union[str, object] = values.unset, + parameter65_name: Union[str, object] = values.unset, + parameter65_value: Union[str, object] = values.unset, + parameter66_name: Union[str, object] = values.unset, + parameter66_value: Union[str, object] = values.unset, + parameter67_name: Union[str, object] = values.unset, + parameter67_value: Union[str, object] = values.unset, + parameter68_name: Union[str, object] = values.unset, + parameter68_value: Union[str, object] = values.unset, + parameter69_name: Union[str, object] = values.unset, + parameter69_value: Union[str, object] = values.unset, + parameter70_name: Union[str, object] = values.unset, + parameter70_value: Union[str, object] = values.unset, + parameter71_name: Union[str, object] = values.unset, + parameter71_value: Union[str, object] = values.unset, + parameter72_name: Union[str, object] = values.unset, + parameter72_value: Union[str, object] = values.unset, + parameter73_name: Union[str, object] = values.unset, + parameter73_value: Union[str, object] = values.unset, + parameter74_name: Union[str, object] = values.unset, + parameter74_value: Union[str, object] = values.unset, + parameter75_name: Union[str, object] = values.unset, + parameter75_value: Union[str, object] = values.unset, + parameter76_name: Union[str, object] = values.unset, + parameter76_value: Union[str, object] = values.unset, + parameter77_name: Union[str, object] = values.unset, + parameter77_value: Union[str, object] = values.unset, + parameter78_name: Union[str, object] = values.unset, + parameter78_value: Union[str, object] = values.unset, + parameter79_name: Union[str, object] = values.unset, + parameter79_value: Union[str, object] = values.unset, + parameter80_name: Union[str, object] = values.unset, + parameter80_value: Union[str, object] = values.unset, + parameter81_name: Union[str, object] = values.unset, + parameter81_value: Union[str, object] = values.unset, + parameter82_name: Union[str, object] = values.unset, + parameter82_value: Union[str, object] = values.unset, + parameter83_name: Union[str, object] = values.unset, + parameter83_value: Union[str, object] = values.unset, + parameter84_name: Union[str, object] = values.unset, + parameter84_value: Union[str, object] = values.unset, + parameter85_name: Union[str, object] = values.unset, + parameter85_value: Union[str, object] = values.unset, + parameter86_name: Union[str, object] = values.unset, + parameter86_value: Union[str, object] = values.unset, + parameter87_name: Union[str, object] = values.unset, + parameter87_value: Union[str, object] = values.unset, + parameter88_name: Union[str, object] = values.unset, + parameter88_value: Union[str, object] = values.unset, + parameter89_name: Union[str, object] = values.unset, + parameter89_value: Union[str, object] = values.unset, + parameter90_name: Union[str, object] = values.unset, + parameter90_value: Union[str, object] = values.unset, + parameter91_name: Union[str, object] = values.unset, + parameter91_value: Union[str, object] = values.unset, + parameter92_name: Union[str, object] = values.unset, + parameter92_value: Union[str, object] = values.unset, + parameter93_name: Union[str, object] = values.unset, + parameter93_value: Union[str, object] = values.unset, + parameter94_name: Union[str, object] = values.unset, + parameter94_value: Union[str, object] = values.unset, + parameter95_name: Union[str, object] = values.unset, + parameter95_value: Union[str, object] = values.unset, + parameter96_name: Union[str, object] = values.unset, + parameter96_value: Union[str, object] = values.unset, + parameter97_name: Union[str, object] = values.unset, + parameter97_value: Union[str, object] = values.unset, + parameter98_name: Union[str, object] = values.unset, + parameter98_value: Union[str, object] = values.unset, + parameter99_name: Union[str, object] = values.unset, + parameter99_value: Union[str, object] = values.unset, + ) -> SiprecInstance: + """ + Asynchronously create the SiprecInstance + + :param name: The user-specified name of this Siprec, if one was given when the Siprec was created. This may be used to stop the Siprec. + :param connector_name: Unique name used when configuring the connector via Marketplace Add-on. + :param track: + :param status_callback: Absolute URL of the status callback. + :param status_callback_method: The http method for the status_callback (one of GET, POST). + :param parameter1_name: Parameter name + :param parameter1_value: Parameter value + :param parameter2_name: Parameter name + :param parameter2_value: Parameter value + :param parameter3_name: Parameter name + :param parameter3_value: Parameter value + :param parameter4_name: Parameter name + :param parameter4_value: Parameter value + :param parameter5_name: Parameter name + :param parameter5_value: Parameter value + :param parameter6_name: Parameter name + :param parameter6_value: Parameter value + :param parameter7_name: Parameter name + :param parameter7_value: Parameter value + :param parameter8_name: Parameter name + :param parameter8_value: Parameter value + :param parameter9_name: Parameter name + :param parameter9_value: Parameter value + :param parameter10_name: Parameter name + :param parameter10_value: Parameter value + :param parameter11_name: Parameter name + :param parameter11_value: Parameter value + :param parameter12_name: Parameter name + :param parameter12_value: Parameter value + :param parameter13_name: Parameter name + :param parameter13_value: Parameter value + :param parameter14_name: Parameter name + :param parameter14_value: Parameter value + :param parameter15_name: Parameter name + :param parameter15_value: Parameter value + :param parameter16_name: Parameter name + :param parameter16_value: Parameter value + :param parameter17_name: Parameter name + :param parameter17_value: Parameter value + :param parameter18_name: Parameter name + :param parameter18_value: Parameter value + :param parameter19_name: Parameter name + :param parameter19_value: Parameter value + :param parameter20_name: Parameter name + :param parameter20_value: Parameter value + :param parameter21_name: Parameter name + :param parameter21_value: Parameter value + :param parameter22_name: Parameter name + :param parameter22_value: Parameter value + :param parameter23_name: Parameter name + :param parameter23_value: Parameter value + :param parameter24_name: Parameter name + :param parameter24_value: Parameter value + :param parameter25_name: Parameter name + :param parameter25_value: Parameter value + :param parameter26_name: Parameter name + :param parameter26_value: Parameter value + :param parameter27_name: Parameter name + :param parameter27_value: Parameter value + :param parameter28_name: Parameter name + :param parameter28_value: Parameter value + :param parameter29_name: Parameter name + :param parameter29_value: Parameter value + :param parameter30_name: Parameter name + :param parameter30_value: Parameter value + :param parameter31_name: Parameter name + :param parameter31_value: Parameter value + :param parameter32_name: Parameter name + :param parameter32_value: Parameter value + :param parameter33_name: Parameter name + :param parameter33_value: Parameter value + :param parameter34_name: Parameter name + :param parameter34_value: Parameter value + :param parameter35_name: Parameter name + :param parameter35_value: Parameter value + :param parameter36_name: Parameter name + :param parameter36_value: Parameter value + :param parameter37_name: Parameter name + :param parameter37_value: Parameter value + :param parameter38_name: Parameter name + :param parameter38_value: Parameter value + :param parameter39_name: Parameter name + :param parameter39_value: Parameter value + :param parameter40_name: Parameter name + :param parameter40_value: Parameter value + :param parameter41_name: Parameter name + :param parameter41_value: Parameter value + :param parameter42_name: Parameter name + :param parameter42_value: Parameter value + :param parameter43_name: Parameter name + :param parameter43_value: Parameter value + :param parameter44_name: Parameter name + :param parameter44_value: Parameter value + :param parameter45_name: Parameter name + :param parameter45_value: Parameter value + :param parameter46_name: Parameter name + :param parameter46_value: Parameter value + :param parameter47_name: Parameter name + :param parameter47_value: Parameter value + :param parameter48_name: Parameter name + :param parameter48_value: Parameter value + :param parameter49_name: Parameter name + :param parameter49_value: Parameter value + :param parameter50_name: Parameter name + :param parameter50_value: Parameter value + :param parameter51_name: Parameter name + :param parameter51_value: Parameter value + :param parameter52_name: Parameter name + :param parameter52_value: Parameter value + :param parameter53_name: Parameter name + :param parameter53_value: Parameter value + :param parameter54_name: Parameter name + :param parameter54_value: Parameter value + :param parameter55_name: Parameter name + :param parameter55_value: Parameter value + :param parameter56_name: Parameter name + :param parameter56_value: Parameter value + :param parameter57_name: Parameter name + :param parameter57_value: Parameter value + :param parameter58_name: Parameter name + :param parameter58_value: Parameter value + :param parameter59_name: Parameter name + :param parameter59_value: Parameter value + :param parameter60_name: Parameter name + :param parameter60_value: Parameter value + :param parameter61_name: Parameter name + :param parameter61_value: Parameter value + :param parameter62_name: Parameter name + :param parameter62_value: Parameter value + :param parameter63_name: Parameter name + :param parameter63_value: Parameter value + :param parameter64_name: Parameter name + :param parameter64_value: Parameter value + :param parameter65_name: Parameter name + :param parameter65_value: Parameter value + :param parameter66_name: Parameter name + :param parameter66_value: Parameter value + :param parameter67_name: Parameter name + :param parameter67_value: Parameter value + :param parameter68_name: Parameter name + :param parameter68_value: Parameter value + :param parameter69_name: Parameter name + :param parameter69_value: Parameter value + :param parameter70_name: Parameter name + :param parameter70_value: Parameter value + :param parameter71_name: Parameter name + :param parameter71_value: Parameter value + :param parameter72_name: Parameter name + :param parameter72_value: Parameter value + :param parameter73_name: Parameter name + :param parameter73_value: Parameter value + :param parameter74_name: Parameter name + :param parameter74_value: Parameter value + :param parameter75_name: Parameter name + :param parameter75_value: Parameter value + :param parameter76_name: Parameter name + :param parameter76_value: Parameter value + :param parameter77_name: Parameter name + :param parameter77_value: Parameter value + :param parameter78_name: Parameter name + :param parameter78_value: Parameter value + :param parameter79_name: Parameter name + :param parameter79_value: Parameter value + :param parameter80_name: Parameter name + :param parameter80_value: Parameter value + :param parameter81_name: Parameter name + :param parameter81_value: Parameter value + :param parameter82_name: Parameter name + :param parameter82_value: Parameter value + :param parameter83_name: Parameter name + :param parameter83_value: Parameter value + :param parameter84_name: Parameter name + :param parameter84_value: Parameter value + :param parameter85_name: Parameter name + :param parameter85_value: Parameter value + :param parameter86_name: Parameter name + :param parameter86_value: Parameter value + :param parameter87_name: Parameter name + :param parameter87_value: Parameter value + :param parameter88_name: Parameter name + :param parameter88_value: Parameter value + :param parameter89_name: Parameter name + :param parameter89_value: Parameter value + :param parameter90_name: Parameter name + :param parameter90_value: Parameter value + :param parameter91_name: Parameter name + :param parameter91_value: Parameter value + :param parameter92_name: Parameter name + :param parameter92_value: Parameter value + :param parameter93_name: Parameter name + :param parameter93_value: Parameter value + :param parameter94_name: Parameter name + :param parameter94_value: Parameter value + :param parameter95_name: Parameter name + :param parameter95_value: Parameter value + :param parameter96_name: Parameter name + :param parameter96_value: Parameter value + :param parameter97_name: Parameter name + :param parameter97_value: Parameter value + :param parameter98_name: Parameter name + :param parameter98_value: Parameter value + :param parameter99_name: Parameter name + :param parameter99_value: Parameter value + + :returns: The created SiprecInstance + """ + + data = values.of( + { + "Name": name, + "ConnectorName": connector_name, + "Track": track, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "Parameter1.Name": parameter1_name, + "Parameter1.Value": parameter1_value, + "Parameter2.Name": parameter2_name, + "Parameter2.Value": parameter2_value, + "Parameter3.Name": parameter3_name, + "Parameter3.Value": parameter3_value, + "Parameter4.Name": parameter4_name, + "Parameter4.Value": parameter4_value, + "Parameter5.Name": parameter5_name, + "Parameter5.Value": parameter5_value, + "Parameter6.Name": parameter6_name, + "Parameter6.Value": parameter6_value, + "Parameter7.Name": parameter7_name, + "Parameter7.Value": parameter7_value, + "Parameter8.Name": parameter8_name, + "Parameter8.Value": parameter8_value, + "Parameter9.Name": parameter9_name, + "Parameter9.Value": parameter9_value, + "Parameter10.Name": parameter10_name, + "Parameter10.Value": parameter10_value, + "Parameter11.Name": parameter11_name, + "Parameter11.Value": parameter11_value, + "Parameter12.Name": parameter12_name, + "Parameter12.Value": parameter12_value, + "Parameter13.Name": parameter13_name, + "Parameter13.Value": parameter13_value, + "Parameter14.Name": parameter14_name, + "Parameter14.Value": parameter14_value, + "Parameter15.Name": parameter15_name, + "Parameter15.Value": parameter15_value, + "Parameter16.Name": parameter16_name, + "Parameter16.Value": parameter16_value, + "Parameter17.Name": parameter17_name, + "Parameter17.Value": parameter17_value, + "Parameter18.Name": parameter18_name, + "Parameter18.Value": parameter18_value, + "Parameter19.Name": parameter19_name, + "Parameter19.Value": parameter19_value, + "Parameter20.Name": parameter20_name, + "Parameter20.Value": parameter20_value, + "Parameter21.Name": parameter21_name, + "Parameter21.Value": parameter21_value, + "Parameter22.Name": parameter22_name, + "Parameter22.Value": parameter22_value, + "Parameter23.Name": parameter23_name, + "Parameter23.Value": parameter23_value, + "Parameter24.Name": parameter24_name, + "Parameter24.Value": parameter24_value, + "Parameter25.Name": parameter25_name, + "Parameter25.Value": parameter25_value, + "Parameter26.Name": parameter26_name, + "Parameter26.Value": parameter26_value, + "Parameter27.Name": parameter27_name, + "Parameter27.Value": parameter27_value, + "Parameter28.Name": parameter28_name, + "Parameter28.Value": parameter28_value, + "Parameter29.Name": parameter29_name, + "Parameter29.Value": parameter29_value, + "Parameter30.Name": parameter30_name, + "Parameter30.Value": parameter30_value, + "Parameter31.Name": parameter31_name, + "Parameter31.Value": parameter31_value, + "Parameter32.Name": parameter32_name, + "Parameter32.Value": parameter32_value, + "Parameter33.Name": parameter33_name, + "Parameter33.Value": parameter33_value, + "Parameter34.Name": parameter34_name, + "Parameter34.Value": parameter34_value, + "Parameter35.Name": parameter35_name, + "Parameter35.Value": parameter35_value, + "Parameter36.Name": parameter36_name, + "Parameter36.Value": parameter36_value, + "Parameter37.Name": parameter37_name, + "Parameter37.Value": parameter37_value, + "Parameter38.Name": parameter38_name, + "Parameter38.Value": parameter38_value, + "Parameter39.Name": parameter39_name, + "Parameter39.Value": parameter39_value, + "Parameter40.Name": parameter40_name, + "Parameter40.Value": parameter40_value, + "Parameter41.Name": parameter41_name, + "Parameter41.Value": parameter41_value, + "Parameter42.Name": parameter42_name, + "Parameter42.Value": parameter42_value, + "Parameter43.Name": parameter43_name, + "Parameter43.Value": parameter43_value, + "Parameter44.Name": parameter44_name, + "Parameter44.Value": parameter44_value, + "Parameter45.Name": parameter45_name, + "Parameter45.Value": parameter45_value, + "Parameter46.Name": parameter46_name, + "Parameter46.Value": parameter46_value, + "Parameter47.Name": parameter47_name, + "Parameter47.Value": parameter47_value, + "Parameter48.Name": parameter48_name, + "Parameter48.Value": parameter48_value, + "Parameter49.Name": parameter49_name, + "Parameter49.Value": parameter49_value, + "Parameter50.Name": parameter50_name, + "Parameter50.Value": parameter50_value, + "Parameter51.Name": parameter51_name, + "Parameter51.Value": parameter51_value, + "Parameter52.Name": parameter52_name, + "Parameter52.Value": parameter52_value, + "Parameter53.Name": parameter53_name, + "Parameter53.Value": parameter53_value, + "Parameter54.Name": parameter54_name, + "Parameter54.Value": parameter54_value, + "Parameter55.Name": parameter55_name, + "Parameter55.Value": parameter55_value, + "Parameter56.Name": parameter56_name, + "Parameter56.Value": parameter56_value, + "Parameter57.Name": parameter57_name, + "Parameter57.Value": parameter57_value, + "Parameter58.Name": parameter58_name, + "Parameter58.Value": parameter58_value, + "Parameter59.Name": parameter59_name, + "Parameter59.Value": parameter59_value, + "Parameter60.Name": parameter60_name, + "Parameter60.Value": parameter60_value, + "Parameter61.Name": parameter61_name, + "Parameter61.Value": parameter61_value, + "Parameter62.Name": parameter62_name, + "Parameter62.Value": parameter62_value, + "Parameter63.Name": parameter63_name, + "Parameter63.Value": parameter63_value, + "Parameter64.Name": parameter64_name, + "Parameter64.Value": parameter64_value, + "Parameter65.Name": parameter65_name, + "Parameter65.Value": parameter65_value, + "Parameter66.Name": parameter66_name, + "Parameter66.Value": parameter66_value, + "Parameter67.Name": parameter67_name, + "Parameter67.Value": parameter67_value, + "Parameter68.Name": parameter68_name, + "Parameter68.Value": parameter68_value, + "Parameter69.Name": parameter69_name, + "Parameter69.Value": parameter69_value, + "Parameter70.Name": parameter70_name, + "Parameter70.Value": parameter70_value, + "Parameter71.Name": parameter71_name, + "Parameter71.Value": parameter71_value, + "Parameter72.Name": parameter72_name, + "Parameter72.Value": parameter72_value, + "Parameter73.Name": parameter73_name, + "Parameter73.Value": parameter73_value, + "Parameter74.Name": parameter74_name, + "Parameter74.Value": parameter74_value, + "Parameter75.Name": parameter75_name, + "Parameter75.Value": parameter75_value, + "Parameter76.Name": parameter76_name, + "Parameter76.Value": parameter76_value, + "Parameter77.Name": parameter77_name, + "Parameter77.Value": parameter77_value, + "Parameter78.Name": parameter78_name, + "Parameter78.Value": parameter78_value, + "Parameter79.Name": parameter79_name, + "Parameter79.Value": parameter79_value, + "Parameter80.Name": parameter80_name, + "Parameter80.Value": parameter80_value, + "Parameter81.Name": parameter81_name, + "Parameter81.Value": parameter81_value, + "Parameter82.Name": parameter82_name, + "Parameter82.Value": parameter82_value, + "Parameter83.Name": parameter83_name, + "Parameter83.Value": parameter83_value, + "Parameter84.Name": parameter84_name, + "Parameter84.Value": parameter84_value, + "Parameter85.Name": parameter85_name, + "Parameter85.Value": parameter85_value, + "Parameter86.Name": parameter86_name, + "Parameter86.Value": parameter86_value, + "Parameter87.Name": parameter87_name, + "Parameter87.Value": parameter87_value, + "Parameter88.Name": parameter88_name, + "Parameter88.Value": parameter88_value, + "Parameter89.Name": parameter89_name, + "Parameter89.Value": parameter89_value, + "Parameter90.Name": parameter90_name, + "Parameter90.Value": parameter90_value, + "Parameter91.Name": parameter91_name, + "Parameter91.Value": parameter91_value, + "Parameter92.Name": parameter92_name, + "Parameter92.Value": parameter92_value, + "Parameter93.Name": parameter93_name, + "Parameter93.Value": parameter93_value, + "Parameter94.Name": parameter94_name, + "Parameter94.Value": parameter94_value, + "Parameter95.Name": parameter95_name, + "Parameter95.Value": parameter95_value, + "Parameter96.Name": parameter96_name, + "Parameter96.Value": parameter96_value, + "Parameter97.Name": parameter97_name, + "Parameter97.Value": parameter97_value, + "Parameter98.Name": parameter98_name, + "Parameter98.Value": parameter98_value, + "Parameter99.Name": parameter99_name, + "Parameter99.Value": parameter99_value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SiprecInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + def get(self, sid: str) -> SiprecContext: + """ + Constructs a SiprecContext + + :param sid: The SID of the Siprec resource, or the `name` used when creating the resource + """ + return SiprecContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> SiprecContext: + """ + Constructs a SiprecContext + + :param sid: The SID of the Siprec resource, or the `name` used when creating the resource + """ + return SiprecContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/stream.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/stream.py new file mode 100644 index 00000000..1a506e66 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/stream.py @@ -0,0 +1,1563 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class StreamInstance(InstanceResource): + + class Status(object): + IN_PROGRESS = "in-progress" + STOPPED = "stopped" + + class Track(object): + INBOUND_TRACK = "inbound_track" + OUTBOUND_TRACK = "outbound_track" + BOTH_TRACKS = "both_tracks" + + class UpdateStatus(object): + STOPPED = "stopped" + + """ + :ivar sid: The SID of the Stream resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Stream resource. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Stream resource is associated with. + :ivar name: The user-specified name of this Stream, if one was given when the Stream was created. This can be used to stop the Stream. + :ivar status: + :ivar date_updated: The date and time in GMT that this resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + call_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.name: Optional[str] = payload.get("name") + self.status: Optional["StreamInstance.Status"] = payload.get("status") + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid or self.sid, + } + self._context: Optional[StreamContext] = None + + @property + def _proxy(self) -> "StreamContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: StreamContext for this StreamInstance + """ + if self._context is None: + self._context = StreamContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + return self._context + + def update(self, status: "StreamInstance.UpdateStatus") -> "StreamInstance": + """ + Update the StreamInstance + + :param status: + + :returns: The updated StreamInstance + """ + return self._proxy.update( + status=status, + ) + + async def update_async( + self, status: "StreamInstance.UpdateStatus" + ) -> "StreamInstance": + """ + Asynchronous coroutine to update the StreamInstance + + :param status: + + :returns: The updated StreamInstance + """ + return await self._proxy.update_async( + status=status, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class StreamContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, call_sid: str, sid: str): + """ + Initialize the StreamContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Stream resource. + :param call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Stream resource is associated with. + :param sid: The SID or the `name` of the Stream resource to be stopped + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid, + } + self._uri = ( + "/Accounts/{account_sid}/Calls/{call_sid}/Streams/{sid}.json".format( + **self._solution + ) + ) + + def update(self, status: "StreamInstance.UpdateStatus") -> StreamInstance: + """ + Update the StreamInstance + + :param status: + + :returns: The updated StreamInstance + """ + + data = values.of( + { + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return StreamInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, status: "StreamInstance.UpdateStatus" + ) -> StreamInstance: + """ + Asynchronous coroutine to update the StreamInstance + + :param status: + + :returns: The updated StreamInstance + """ + + data = values.of( + { + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return StreamInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class StreamList(ListResource): + + def __init__(self, version: Version, account_sid: str, call_sid: str): + """ + Initialize the StreamList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Stream resource. + :param call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Stream resource is associated with. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + self._uri = "/Accounts/{account_sid}/Calls/{call_sid}/Streams.json".format( + **self._solution + ) + + def create( + self, + url: str, + name: Union[str, object] = values.unset, + track: Union["StreamInstance.Track", object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + parameter1_name: Union[str, object] = values.unset, + parameter1_value: Union[str, object] = values.unset, + parameter2_name: Union[str, object] = values.unset, + parameter2_value: Union[str, object] = values.unset, + parameter3_name: Union[str, object] = values.unset, + parameter3_value: Union[str, object] = values.unset, + parameter4_name: Union[str, object] = values.unset, + parameter4_value: Union[str, object] = values.unset, + parameter5_name: Union[str, object] = values.unset, + parameter5_value: Union[str, object] = values.unset, + parameter6_name: Union[str, object] = values.unset, + parameter6_value: Union[str, object] = values.unset, + parameter7_name: Union[str, object] = values.unset, + parameter7_value: Union[str, object] = values.unset, + parameter8_name: Union[str, object] = values.unset, + parameter8_value: Union[str, object] = values.unset, + parameter9_name: Union[str, object] = values.unset, + parameter9_value: Union[str, object] = values.unset, + parameter10_name: Union[str, object] = values.unset, + parameter10_value: Union[str, object] = values.unset, + parameter11_name: Union[str, object] = values.unset, + parameter11_value: Union[str, object] = values.unset, + parameter12_name: Union[str, object] = values.unset, + parameter12_value: Union[str, object] = values.unset, + parameter13_name: Union[str, object] = values.unset, + parameter13_value: Union[str, object] = values.unset, + parameter14_name: Union[str, object] = values.unset, + parameter14_value: Union[str, object] = values.unset, + parameter15_name: Union[str, object] = values.unset, + parameter15_value: Union[str, object] = values.unset, + parameter16_name: Union[str, object] = values.unset, + parameter16_value: Union[str, object] = values.unset, + parameter17_name: Union[str, object] = values.unset, + parameter17_value: Union[str, object] = values.unset, + parameter18_name: Union[str, object] = values.unset, + parameter18_value: Union[str, object] = values.unset, + parameter19_name: Union[str, object] = values.unset, + parameter19_value: Union[str, object] = values.unset, + parameter20_name: Union[str, object] = values.unset, + parameter20_value: Union[str, object] = values.unset, + parameter21_name: Union[str, object] = values.unset, + parameter21_value: Union[str, object] = values.unset, + parameter22_name: Union[str, object] = values.unset, + parameter22_value: Union[str, object] = values.unset, + parameter23_name: Union[str, object] = values.unset, + parameter23_value: Union[str, object] = values.unset, + parameter24_name: Union[str, object] = values.unset, + parameter24_value: Union[str, object] = values.unset, + parameter25_name: Union[str, object] = values.unset, + parameter25_value: Union[str, object] = values.unset, + parameter26_name: Union[str, object] = values.unset, + parameter26_value: Union[str, object] = values.unset, + parameter27_name: Union[str, object] = values.unset, + parameter27_value: Union[str, object] = values.unset, + parameter28_name: Union[str, object] = values.unset, + parameter28_value: Union[str, object] = values.unset, + parameter29_name: Union[str, object] = values.unset, + parameter29_value: Union[str, object] = values.unset, + parameter30_name: Union[str, object] = values.unset, + parameter30_value: Union[str, object] = values.unset, + parameter31_name: Union[str, object] = values.unset, + parameter31_value: Union[str, object] = values.unset, + parameter32_name: Union[str, object] = values.unset, + parameter32_value: Union[str, object] = values.unset, + parameter33_name: Union[str, object] = values.unset, + parameter33_value: Union[str, object] = values.unset, + parameter34_name: Union[str, object] = values.unset, + parameter34_value: Union[str, object] = values.unset, + parameter35_name: Union[str, object] = values.unset, + parameter35_value: Union[str, object] = values.unset, + parameter36_name: Union[str, object] = values.unset, + parameter36_value: Union[str, object] = values.unset, + parameter37_name: Union[str, object] = values.unset, + parameter37_value: Union[str, object] = values.unset, + parameter38_name: Union[str, object] = values.unset, + parameter38_value: Union[str, object] = values.unset, + parameter39_name: Union[str, object] = values.unset, + parameter39_value: Union[str, object] = values.unset, + parameter40_name: Union[str, object] = values.unset, + parameter40_value: Union[str, object] = values.unset, + parameter41_name: Union[str, object] = values.unset, + parameter41_value: Union[str, object] = values.unset, + parameter42_name: Union[str, object] = values.unset, + parameter42_value: Union[str, object] = values.unset, + parameter43_name: Union[str, object] = values.unset, + parameter43_value: Union[str, object] = values.unset, + parameter44_name: Union[str, object] = values.unset, + parameter44_value: Union[str, object] = values.unset, + parameter45_name: Union[str, object] = values.unset, + parameter45_value: Union[str, object] = values.unset, + parameter46_name: Union[str, object] = values.unset, + parameter46_value: Union[str, object] = values.unset, + parameter47_name: Union[str, object] = values.unset, + parameter47_value: Union[str, object] = values.unset, + parameter48_name: Union[str, object] = values.unset, + parameter48_value: Union[str, object] = values.unset, + parameter49_name: Union[str, object] = values.unset, + parameter49_value: Union[str, object] = values.unset, + parameter50_name: Union[str, object] = values.unset, + parameter50_value: Union[str, object] = values.unset, + parameter51_name: Union[str, object] = values.unset, + parameter51_value: Union[str, object] = values.unset, + parameter52_name: Union[str, object] = values.unset, + parameter52_value: Union[str, object] = values.unset, + parameter53_name: Union[str, object] = values.unset, + parameter53_value: Union[str, object] = values.unset, + parameter54_name: Union[str, object] = values.unset, + parameter54_value: Union[str, object] = values.unset, + parameter55_name: Union[str, object] = values.unset, + parameter55_value: Union[str, object] = values.unset, + parameter56_name: Union[str, object] = values.unset, + parameter56_value: Union[str, object] = values.unset, + parameter57_name: Union[str, object] = values.unset, + parameter57_value: Union[str, object] = values.unset, + parameter58_name: Union[str, object] = values.unset, + parameter58_value: Union[str, object] = values.unset, + parameter59_name: Union[str, object] = values.unset, + parameter59_value: Union[str, object] = values.unset, + parameter60_name: Union[str, object] = values.unset, + parameter60_value: Union[str, object] = values.unset, + parameter61_name: Union[str, object] = values.unset, + parameter61_value: Union[str, object] = values.unset, + parameter62_name: Union[str, object] = values.unset, + parameter62_value: Union[str, object] = values.unset, + parameter63_name: Union[str, object] = values.unset, + parameter63_value: Union[str, object] = values.unset, + parameter64_name: Union[str, object] = values.unset, + parameter64_value: Union[str, object] = values.unset, + parameter65_name: Union[str, object] = values.unset, + parameter65_value: Union[str, object] = values.unset, + parameter66_name: Union[str, object] = values.unset, + parameter66_value: Union[str, object] = values.unset, + parameter67_name: Union[str, object] = values.unset, + parameter67_value: Union[str, object] = values.unset, + parameter68_name: Union[str, object] = values.unset, + parameter68_value: Union[str, object] = values.unset, + parameter69_name: Union[str, object] = values.unset, + parameter69_value: Union[str, object] = values.unset, + parameter70_name: Union[str, object] = values.unset, + parameter70_value: Union[str, object] = values.unset, + parameter71_name: Union[str, object] = values.unset, + parameter71_value: Union[str, object] = values.unset, + parameter72_name: Union[str, object] = values.unset, + parameter72_value: Union[str, object] = values.unset, + parameter73_name: Union[str, object] = values.unset, + parameter73_value: Union[str, object] = values.unset, + parameter74_name: Union[str, object] = values.unset, + parameter74_value: Union[str, object] = values.unset, + parameter75_name: Union[str, object] = values.unset, + parameter75_value: Union[str, object] = values.unset, + parameter76_name: Union[str, object] = values.unset, + parameter76_value: Union[str, object] = values.unset, + parameter77_name: Union[str, object] = values.unset, + parameter77_value: Union[str, object] = values.unset, + parameter78_name: Union[str, object] = values.unset, + parameter78_value: Union[str, object] = values.unset, + parameter79_name: Union[str, object] = values.unset, + parameter79_value: Union[str, object] = values.unset, + parameter80_name: Union[str, object] = values.unset, + parameter80_value: Union[str, object] = values.unset, + parameter81_name: Union[str, object] = values.unset, + parameter81_value: Union[str, object] = values.unset, + parameter82_name: Union[str, object] = values.unset, + parameter82_value: Union[str, object] = values.unset, + parameter83_name: Union[str, object] = values.unset, + parameter83_value: Union[str, object] = values.unset, + parameter84_name: Union[str, object] = values.unset, + parameter84_value: Union[str, object] = values.unset, + parameter85_name: Union[str, object] = values.unset, + parameter85_value: Union[str, object] = values.unset, + parameter86_name: Union[str, object] = values.unset, + parameter86_value: Union[str, object] = values.unset, + parameter87_name: Union[str, object] = values.unset, + parameter87_value: Union[str, object] = values.unset, + parameter88_name: Union[str, object] = values.unset, + parameter88_value: Union[str, object] = values.unset, + parameter89_name: Union[str, object] = values.unset, + parameter89_value: Union[str, object] = values.unset, + parameter90_name: Union[str, object] = values.unset, + parameter90_value: Union[str, object] = values.unset, + parameter91_name: Union[str, object] = values.unset, + parameter91_value: Union[str, object] = values.unset, + parameter92_name: Union[str, object] = values.unset, + parameter92_value: Union[str, object] = values.unset, + parameter93_name: Union[str, object] = values.unset, + parameter93_value: Union[str, object] = values.unset, + parameter94_name: Union[str, object] = values.unset, + parameter94_value: Union[str, object] = values.unset, + parameter95_name: Union[str, object] = values.unset, + parameter95_value: Union[str, object] = values.unset, + parameter96_name: Union[str, object] = values.unset, + parameter96_value: Union[str, object] = values.unset, + parameter97_name: Union[str, object] = values.unset, + parameter97_value: Union[str, object] = values.unset, + parameter98_name: Union[str, object] = values.unset, + parameter98_value: Union[str, object] = values.unset, + parameter99_name: Union[str, object] = values.unset, + parameter99_value: Union[str, object] = values.unset, + ) -> StreamInstance: + """ + Create the StreamInstance + + :param url: Relative or absolute URL where WebSocket connection will be established. + :param name: The user-specified name of this Stream, if one was given when the Stream was created. This can be used to stop the Stream. + :param track: + :param status_callback: Absolute URL to which Twilio sends status callback HTTP requests. + :param status_callback_method: The HTTP method Twilio uses when sending `status_callback` requests. Possible values are `GET` and `POST`. Default is `POST`. + :param parameter1_name: Parameter name + :param parameter1_value: Parameter value + :param parameter2_name: Parameter name + :param parameter2_value: Parameter value + :param parameter3_name: Parameter name + :param parameter3_value: Parameter value + :param parameter4_name: Parameter name + :param parameter4_value: Parameter value + :param parameter5_name: Parameter name + :param parameter5_value: Parameter value + :param parameter6_name: Parameter name + :param parameter6_value: Parameter value + :param parameter7_name: Parameter name + :param parameter7_value: Parameter value + :param parameter8_name: Parameter name + :param parameter8_value: Parameter value + :param parameter9_name: Parameter name + :param parameter9_value: Parameter value + :param parameter10_name: Parameter name + :param parameter10_value: Parameter value + :param parameter11_name: Parameter name + :param parameter11_value: Parameter value + :param parameter12_name: Parameter name + :param parameter12_value: Parameter value + :param parameter13_name: Parameter name + :param parameter13_value: Parameter value + :param parameter14_name: Parameter name + :param parameter14_value: Parameter value + :param parameter15_name: Parameter name + :param parameter15_value: Parameter value + :param parameter16_name: Parameter name + :param parameter16_value: Parameter value + :param parameter17_name: Parameter name + :param parameter17_value: Parameter value + :param parameter18_name: Parameter name + :param parameter18_value: Parameter value + :param parameter19_name: Parameter name + :param parameter19_value: Parameter value + :param parameter20_name: Parameter name + :param parameter20_value: Parameter value + :param parameter21_name: Parameter name + :param parameter21_value: Parameter value + :param parameter22_name: Parameter name + :param parameter22_value: Parameter value + :param parameter23_name: Parameter name + :param parameter23_value: Parameter value + :param parameter24_name: Parameter name + :param parameter24_value: Parameter value + :param parameter25_name: Parameter name + :param parameter25_value: Parameter value + :param parameter26_name: Parameter name + :param parameter26_value: Parameter value + :param parameter27_name: Parameter name + :param parameter27_value: Parameter value + :param parameter28_name: Parameter name + :param parameter28_value: Parameter value + :param parameter29_name: Parameter name + :param parameter29_value: Parameter value + :param parameter30_name: Parameter name + :param parameter30_value: Parameter value + :param parameter31_name: Parameter name + :param parameter31_value: Parameter value + :param parameter32_name: Parameter name + :param parameter32_value: Parameter value + :param parameter33_name: Parameter name + :param parameter33_value: Parameter value + :param parameter34_name: Parameter name + :param parameter34_value: Parameter value + :param parameter35_name: Parameter name + :param parameter35_value: Parameter value + :param parameter36_name: Parameter name + :param parameter36_value: Parameter value + :param parameter37_name: Parameter name + :param parameter37_value: Parameter value + :param parameter38_name: Parameter name + :param parameter38_value: Parameter value + :param parameter39_name: Parameter name + :param parameter39_value: Parameter value + :param parameter40_name: Parameter name + :param parameter40_value: Parameter value + :param parameter41_name: Parameter name + :param parameter41_value: Parameter value + :param parameter42_name: Parameter name + :param parameter42_value: Parameter value + :param parameter43_name: Parameter name + :param parameter43_value: Parameter value + :param parameter44_name: Parameter name + :param parameter44_value: Parameter value + :param parameter45_name: Parameter name + :param parameter45_value: Parameter value + :param parameter46_name: Parameter name + :param parameter46_value: Parameter value + :param parameter47_name: Parameter name + :param parameter47_value: Parameter value + :param parameter48_name: Parameter name + :param parameter48_value: Parameter value + :param parameter49_name: Parameter name + :param parameter49_value: Parameter value + :param parameter50_name: Parameter name + :param parameter50_value: Parameter value + :param parameter51_name: Parameter name + :param parameter51_value: Parameter value + :param parameter52_name: Parameter name + :param parameter52_value: Parameter value + :param parameter53_name: Parameter name + :param parameter53_value: Parameter value + :param parameter54_name: Parameter name + :param parameter54_value: Parameter value + :param parameter55_name: Parameter name + :param parameter55_value: Parameter value + :param parameter56_name: Parameter name + :param parameter56_value: Parameter value + :param parameter57_name: Parameter name + :param parameter57_value: Parameter value + :param parameter58_name: Parameter name + :param parameter58_value: Parameter value + :param parameter59_name: Parameter name + :param parameter59_value: Parameter value + :param parameter60_name: Parameter name + :param parameter60_value: Parameter value + :param parameter61_name: Parameter name + :param parameter61_value: Parameter value + :param parameter62_name: Parameter name + :param parameter62_value: Parameter value + :param parameter63_name: Parameter name + :param parameter63_value: Parameter value + :param parameter64_name: Parameter name + :param parameter64_value: Parameter value + :param parameter65_name: Parameter name + :param parameter65_value: Parameter value + :param parameter66_name: Parameter name + :param parameter66_value: Parameter value + :param parameter67_name: Parameter name + :param parameter67_value: Parameter value + :param parameter68_name: Parameter name + :param parameter68_value: Parameter value + :param parameter69_name: Parameter name + :param parameter69_value: Parameter value + :param parameter70_name: Parameter name + :param parameter70_value: Parameter value + :param parameter71_name: Parameter name + :param parameter71_value: Parameter value + :param parameter72_name: Parameter name + :param parameter72_value: Parameter value + :param parameter73_name: Parameter name + :param parameter73_value: Parameter value + :param parameter74_name: Parameter name + :param parameter74_value: Parameter value + :param parameter75_name: Parameter name + :param parameter75_value: Parameter value + :param parameter76_name: Parameter name + :param parameter76_value: Parameter value + :param parameter77_name: Parameter name + :param parameter77_value: Parameter value + :param parameter78_name: Parameter name + :param parameter78_value: Parameter value + :param parameter79_name: Parameter name + :param parameter79_value: Parameter value + :param parameter80_name: Parameter name + :param parameter80_value: Parameter value + :param parameter81_name: Parameter name + :param parameter81_value: Parameter value + :param parameter82_name: Parameter name + :param parameter82_value: Parameter value + :param parameter83_name: Parameter name + :param parameter83_value: Parameter value + :param parameter84_name: Parameter name + :param parameter84_value: Parameter value + :param parameter85_name: Parameter name + :param parameter85_value: Parameter value + :param parameter86_name: Parameter name + :param parameter86_value: Parameter value + :param parameter87_name: Parameter name + :param parameter87_value: Parameter value + :param parameter88_name: Parameter name + :param parameter88_value: Parameter value + :param parameter89_name: Parameter name + :param parameter89_value: Parameter value + :param parameter90_name: Parameter name + :param parameter90_value: Parameter value + :param parameter91_name: Parameter name + :param parameter91_value: Parameter value + :param parameter92_name: Parameter name + :param parameter92_value: Parameter value + :param parameter93_name: Parameter name + :param parameter93_value: Parameter value + :param parameter94_name: Parameter name + :param parameter94_value: Parameter value + :param parameter95_name: Parameter name + :param parameter95_value: Parameter value + :param parameter96_name: Parameter name + :param parameter96_value: Parameter value + :param parameter97_name: Parameter name + :param parameter97_value: Parameter value + :param parameter98_name: Parameter name + :param parameter98_value: Parameter value + :param parameter99_name: Parameter name + :param parameter99_value: Parameter value + + :returns: The created StreamInstance + """ + + data = values.of( + { + "Url": url, + "Name": name, + "Track": track, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "Parameter1.Name": parameter1_name, + "Parameter1.Value": parameter1_value, + "Parameter2.Name": parameter2_name, + "Parameter2.Value": parameter2_value, + "Parameter3.Name": parameter3_name, + "Parameter3.Value": parameter3_value, + "Parameter4.Name": parameter4_name, + "Parameter4.Value": parameter4_value, + "Parameter5.Name": parameter5_name, + "Parameter5.Value": parameter5_value, + "Parameter6.Name": parameter6_name, + "Parameter6.Value": parameter6_value, + "Parameter7.Name": parameter7_name, + "Parameter7.Value": parameter7_value, + "Parameter8.Name": parameter8_name, + "Parameter8.Value": parameter8_value, + "Parameter9.Name": parameter9_name, + "Parameter9.Value": parameter9_value, + "Parameter10.Name": parameter10_name, + "Parameter10.Value": parameter10_value, + "Parameter11.Name": parameter11_name, + "Parameter11.Value": parameter11_value, + "Parameter12.Name": parameter12_name, + "Parameter12.Value": parameter12_value, + "Parameter13.Name": parameter13_name, + "Parameter13.Value": parameter13_value, + "Parameter14.Name": parameter14_name, + "Parameter14.Value": parameter14_value, + "Parameter15.Name": parameter15_name, + "Parameter15.Value": parameter15_value, + "Parameter16.Name": parameter16_name, + "Parameter16.Value": parameter16_value, + "Parameter17.Name": parameter17_name, + "Parameter17.Value": parameter17_value, + "Parameter18.Name": parameter18_name, + "Parameter18.Value": parameter18_value, + "Parameter19.Name": parameter19_name, + "Parameter19.Value": parameter19_value, + "Parameter20.Name": parameter20_name, + "Parameter20.Value": parameter20_value, + "Parameter21.Name": parameter21_name, + "Parameter21.Value": parameter21_value, + "Parameter22.Name": parameter22_name, + "Parameter22.Value": parameter22_value, + "Parameter23.Name": parameter23_name, + "Parameter23.Value": parameter23_value, + "Parameter24.Name": parameter24_name, + "Parameter24.Value": parameter24_value, + "Parameter25.Name": parameter25_name, + "Parameter25.Value": parameter25_value, + "Parameter26.Name": parameter26_name, + "Parameter26.Value": parameter26_value, + "Parameter27.Name": parameter27_name, + "Parameter27.Value": parameter27_value, + "Parameter28.Name": parameter28_name, + "Parameter28.Value": parameter28_value, + "Parameter29.Name": parameter29_name, + "Parameter29.Value": parameter29_value, + "Parameter30.Name": parameter30_name, + "Parameter30.Value": parameter30_value, + "Parameter31.Name": parameter31_name, + "Parameter31.Value": parameter31_value, + "Parameter32.Name": parameter32_name, + "Parameter32.Value": parameter32_value, + "Parameter33.Name": parameter33_name, + "Parameter33.Value": parameter33_value, + "Parameter34.Name": parameter34_name, + "Parameter34.Value": parameter34_value, + "Parameter35.Name": parameter35_name, + "Parameter35.Value": parameter35_value, + "Parameter36.Name": parameter36_name, + "Parameter36.Value": parameter36_value, + "Parameter37.Name": parameter37_name, + "Parameter37.Value": parameter37_value, + "Parameter38.Name": parameter38_name, + "Parameter38.Value": parameter38_value, + "Parameter39.Name": parameter39_name, + "Parameter39.Value": parameter39_value, + "Parameter40.Name": parameter40_name, + "Parameter40.Value": parameter40_value, + "Parameter41.Name": parameter41_name, + "Parameter41.Value": parameter41_value, + "Parameter42.Name": parameter42_name, + "Parameter42.Value": parameter42_value, + "Parameter43.Name": parameter43_name, + "Parameter43.Value": parameter43_value, + "Parameter44.Name": parameter44_name, + "Parameter44.Value": parameter44_value, + "Parameter45.Name": parameter45_name, + "Parameter45.Value": parameter45_value, + "Parameter46.Name": parameter46_name, + "Parameter46.Value": parameter46_value, + "Parameter47.Name": parameter47_name, + "Parameter47.Value": parameter47_value, + "Parameter48.Name": parameter48_name, + "Parameter48.Value": parameter48_value, + "Parameter49.Name": parameter49_name, + "Parameter49.Value": parameter49_value, + "Parameter50.Name": parameter50_name, + "Parameter50.Value": parameter50_value, + "Parameter51.Name": parameter51_name, + "Parameter51.Value": parameter51_value, + "Parameter52.Name": parameter52_name, + "Parameter52.Value": parameter52_value, + "Parameter53.Name": parameter53_name, + "Parameter53.Value": parameter53_value, + "Parameter54.Name": parameter54_name, + "Parameter54.Value": parameter54_value, + "Parameter55.Name": parameter55_name, + "Parameter55.Value": parameter55_value, + "Parameter56.Name": parameter56_name, + "Parameter56.Value": parameter56_value, + "Parameter57.Name": parameter57_name, + "Parameter57.Value": parameter57_value, + "Parameter58.Name": parameter58_name, + "Parameter58.Value": parameter58_value, + "Parameter59.Name": parameter59_name, + "Parameter59.Value": parameter59_value, + "Parameter60.Name": parameter60_name, + "Parameter60.Value": parameter60_value, + "Parameter61.Name": parameter61_name, + "Parameter61.Value": parameter61_value, + "Parameter62.Name": parameter62_name, + "Parameter62.Value": parameter62_value, + "Parameter63.Name": parameter63_name, + "Parameter63.Value": parameter63_value, + "Parameter64.Name": parameter64_name, + "Parameter64.Value": parameter64_value, + "Parameter65.Name": parameter65_name, + "Parameter65.Value": parameter65_value, + "Parameter66.Name": parameter66_name, + "Parameter66.Value": parameter66_value, + "Parameter67.Name": parameter67_name, + "Parameter67.Value": parameter67_value, + "Parameter68.Name": parameter68_name, + "Parameter68.Value": parameter68_value, + "Parameter69.Name": parameter69_name, + "Parameter69.Value": parameter69_value, + "Parameter70.Name": parameter70_name, + "Parameter70.Value": parameter70_value, + "Parameter71.Name": parameter71_name, + "Parameter71.Value": parameter71_value, + "Parameter72.Name": parameter72_name, + "Parameter72.Value": parameter72_value, + "Parameter73.Name": parameter73_name, + "Parameter73.Value": parameter73_value, + "Parameter74.Name": parameter74_name, + "Parameter74.Value": parameter74_value, + "Parameter75.Name": parameter75_name, + "Parameter75.Value": parameter75_value, + "Parameter76.Name": parameter76_name, + "Parameter76.Value": parameter76_value, + "Parameter77.Name": parameter77_name, + "Parameter77.Value": parameter77_value, + "Parameter78.Name": parameter78_name, + "Parameter78.Value": parameter78_value, + "Parameter79.Name": parameter79_name, + "Parameter79.Value": parameter79_value, + "Parameter80.Name": parameter80_name, + "Parameter80.Value": parameter80_value, + "Parameter81.Name": parameter81_name, + "Parameter81.Value": parameter81_value, + "Parameter82.Name": parameter82_name, + "Parameter82.Value": parameter82_value, + "Parameter83.Name": parameter83_name, + "Parameter83.Value": parameter83_value, + "Parameter84.Name": parameter84_name, + "Parameter84.Value": parameter84_value, + "Parameter85.Name": parameter85_name, + "Parameter85.Value": parameter85_value, + "Parameter86.Name": parameter86_name, + "Parameter86.Value": parameter86_value, + "Parameter87.Name": parameter87_name, + "Parameter87.Value": parameter87_value, + "Parameter88.Name": parameter88_name, + "Parameter88.Value": parameter88_value, + "Parameter89.Name": parameter89_name, + "Parameter89.Value": parameter89_value, + "Parameter90.Name": parameter90_name, + "Parameter90.Value": parameter90_value, + "Parameter91.Name": parameter91_name, + "Parameter91.Value": parameter91_value, + "Parameter92.Name": parameter92_name, + "Parameter92.Value": parameter92_value, + "Parameter93.Name": parameter93_name, + "Parameter93.Value": parameter93_value, + "Parameter94.Name": parameter94_name, + "Parameter94.Value": parameter94_value, + "Parameter95.Name": parameter95_name, + "Parameter95.Value": parameter95_value, + "Parameter96.Name": parameter96_name, + "Parameter96.Value": parameter96_value, + "Parameter97.Name": parameter97_name, + "Parameter97.Value": parameter97_value, + "Parameter98.Name": parameter98_name, + "Parameter98.Value": parameter98_value, + "Parameter99.Name": parameter99_name, + "Parameter99.Value": parameter99_value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return StreamInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + async def create_async( + self, + url: str, + name: Union[str, object] = values.unset, + track: Union["StreamInstance.Track", object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + parameter1_name: Union[str, object] = values.unset, + parameter1_value: Union[str, object] = values.unset, + parameter2_name: Union[str, object] = values.unset, + parameter2_value: Union[str, object] = values.unset, + parameter3_name: Union[str, object] = values.unset, + parameter3_value: Union[str, object] = values.unset, + parameter4_name: Union[str, object] = values.unset, + parameter4_value: Union[str, object] = values.unset, + parameter5_name: Union[str, object] = values.unset, + parameter5_value: Union[str, object] = values.unset, + parameter6_name: Union[str, object] = values.unset, + parameter6_value: Union[str, object] = values.unset, + parameter7_name: Union[str, object] = values.unset, + parameter7_value: Union[str, object] = values.unset, + parameter8_name: Union[str, object] = values.unset, + parameter8_value: Union[str, object] = values.unset, + parameter9_name: Union[str, object] = values.unset, + parameter9_value: Union[str, object] = values.unset, + parameter10_name: Union[str, object] = values.unset, + parameter10_value: Union[str, object] = values.unset, + parameter11_name: Union[str, object] = values.unset, + parameter11_value: Union[str, object] = values.unset, + parameter12_name: Union[str, object] = values.unset, + parameter12_value: Union[str, object] = values.unset, + parameter13_name: Union[str, object] = values.unset, + parameter13_value: Union[str, object] = values.unset, + parameter14_name: Union[str, object] = values.unset, + parameter14_value: Union[str, object] = values.unset, + parameter15_name: Union[str, object] = values.unset, + parameter15_value: Union[str, object] = values.unset, + parameter16_name: Union[str, object] = values.unset, + parameter16_value: Union[str, object] = values.unset, + parameter17_name: Union[str, object] = values.unset, + parameter17_value: Union[str, object] = values.unset, + parameter18_name: Union[str, object] = values.unset, + parameter18_value: Union[str, object] = values.unset, + parameter19_name: Union[str, object] = values.unset, + parameter19_value: Union[str, object] = values.unset, + parameter20_name: Union[str, object] = values.unset, + parameter20_value: Union[str, object] = values.unset, + parameter21_name: Union[str, object] = values.unset, + parameter21_value: Union[str, object] = values.unset, + parameter22_name: Union[str, object] = values.unset, + parameter22_value: Union[str, object] = values.unset, + parameter23_name: Union[str, object] = values.unset, + parameter23_value: Union[str, object] = values.unset, + parameter24_name: Union[str, object] = values.unset, + parameter24_value: Union[str, object] = values.unset, + parameter25_name: Union[str, object] = values.unset, + parameter25_value: Union[str, object] = values.unset, + parameter26_name: Union[str, object] = values.unset, + parameter26_value: Union[str, object] = values.unset, + parameter27_name: Union[str, object] = values.unset, + parameter27_value: Union[str, object] = values.unset, + parameter28_name: Union[str, object] = values.unset, + parameter28_value: Union[str, object] = values.unset, + parameter29_name: Union[str, object] = values.unset, + parameter29_value: Union[str, object] = values.unset, + parameter30_name: Union[str, object] = values.unset, + parameter30_value: Union[str, object] = values.unset, + parameter31_name: Union[str, object] = values.unset, + parameter31_value: Union[str, object] = values.unset, + parameter32_name: Union[str, object] = values.unset, + parameter32_value: Union[str, object] = values.unset, + parameter33_name: Union[str, object] = values.unset, + parameter33_value: Union[str, object] = values.unset, + parameter34_name: Union[str, object] = values.unset, + parameter34_value: Union[str, object] = values.unset, + parameter35_name: Union[str, object] = values.unset, + parameter35_value: Union[str, object] = values.unset, + parameter36_name: Union[str, object] = values.unset, + parameter36_value: Union[str, object] = values.unset, + parameter37_name: Union[str, object] = values.unset, + parameter37_value: Union[str, object] = values.unset, + parameter38_name: Union[str, object] = values.unset, + parameter38_value: Union[str, object] = values.unset, + parameter39_name: Union[str, object] = values.unset, + parameter39_value: Union[str, object] = values.unset, + parameter40_name: Union[str, object] = values.unset, + parameter40_value: Union[str, object] = values.unset, + parameter41_name: Union[str, object] = values.unset, + parameter41_value: Union[str, object] = values.unset, + parameter42_name: Union[str, object] = values.unset, + parameter42_value: Union[str, object] = values.unset, + parameter43_name: Union[str, object] = values.unset, + parameter43_value: Union[str, object] = values.unset, + parameter44_name: Union[str, object] = values.unset, + parameter44_value: Union[str, object] = values.unset, + parameter45_name: Union[str, object] = values.unset, + parameter45_value: Union[str, object] = values.unset, + parameter46_name: Union[str, object] = values.unset, + parameter46_value: Union[str, object] = values.unset, + parameter47_name: Union[str, object] = values.unset, + parameter47_value: Union[str, object] = values.unset, + parameter48_name: Union[str, object] = values.unset, + parameter48_value: Union[str, object] = values.unset, + parameter49_name: Union[str, object] = values.unset, + parameter49_value: Union[str, object] = values.unset, + parameter50_name: Union[str, object] = values.unset, + parameter50_value: Union[str, object] = values.unset, + parameter51_name: Union[str, object] = values.unset, + parameter51_value: Union[str, object] = values.unset, + parameter52_name: Union[str, object] = values.unset, + parameter52_value: Union[str, object] = values.unset, + parameter53_name: Union[str, object] = values.unset, + parameter53_value: Union[str, object] = values.unset, + parameter54_name: Union[str, object] = values.unset, + parameter54_value: Union[str, object] = values.unset, + parameter55_name: Union[str, object] = values.unset, + parameter55_value: Union[str, object] = values.unset, + parameter56_name: Union[str, object] = values.unset, + parameter56_value: Union[str, object] = values.unset, + parameter57_name: Union[str, object] = values.unset, + parameter57_value: Union[str, object] = values.unset, + parameter58_name: Union[str, object] = values.unset, + parameter58_value: Union[str, object] = values.unset, + parameter59_name: Union[str, object] = values.unset, + parameter59_value: Union[str, object] = values.unset, + parameter60_name: Union[str, object] = values.unset, + parameter60_value: Union[str, object] = values.unset, + parameter61_name: Union[str, object] = values.unset, + parameter61_value: Union[str, object] = values.unset, + parameter62_name: Union[str, object] = values.unset, + parameter62_value: Union[str, object] = values.unset, + parameter63_name: Union[str, object] = values.unset, + parameter63_value: Union[str, object] = values.unset, + parameter64_name: Union[str, object] = values.unset, + parameter64_value: Union[str, object] = values.unset, + parameter65_name: Union[str, object] = values.unset, + parameter65_value: Union[str, object] = values.unset, + parameter66_name: Union[str, object] = values.unset, + parameter66_value: Union[str, object] = values.unset, + parameter67_name: Union[str, object] = values.unset, + parameter67_value: Union[str, object] = values.unset, + parameter68_name: Union[str, object] = values.unset, + parameter68_value: Union[str, object] = values.unset, + parameter69_name: Union[str, object] = values.unset, + parameter69_value: Union[str, object] = values.unset, + parameter70_name: Union[str, object] = values.unset, + parameter70_value: Union[str, object] = values.unset, + parameter71_name: Union[str, object] = values.unset, + parameter71_value: Union[str, object] = values.unset, + parameter72_name: Union[str, object] = values.unset, + parameter72_value: Union[str, object] = values.unset, + parameter73_name: Union[str, object] = values.unset, + parameter73_value: Union[str, object] = values.unset, + parameter74_name: Union[str, object] = values.unset, + parameter74_value: Union[str, object] = values.unset, + parameter75_name: Union[str, object] = values.unset, + parameter75_value: Union[str, object] = values.unset, + parameter76_name: Union[str, object] = values.unset, + parameter76_value: Union[str, object] = values.unset, + parameter77_name: Union[str, object] = values.unset, + parameter77_value: Union[str, object] = values.unset, + parameter78_name: Union[str, object] = values.unset, + parameter78_value: Union[str, object] = values.unset, + parameter79_name: Union[str, object] = values.unset, + parameter79_value: Union[str, object] = values.unset, + parameter80_name: Union[str, object] = values.unset, + parameter80_value: Union[str, object] = values.unset, + parameter81_name: Union[str, object] = values.unset, + parameter81_value: Union[str, object] = values.unset, + parameter82_name: Union[str, object] = values.unset, + parameter82_value: Union[str, object] = values.unset, + parameter83_name: Union[str, object] = values.unset, + parameter83_value: Union[str, object] = values.unset, + parameter84_name: Union[str, object] = values.unset, + parameter84_value: Union[str, object] = values.unset, + parameter85_name: Union[str, object] = values.unset, + parameter85_value: Union[str, object] = values.unset, + parameter86_name: Union[str, object] = values.unset, + parameter86_value: Union[str, object] = values.unset, + parameter87_name: Union[str, object] = values.unset, + parameter87_value: Union[str, object] = values.unset, + parameter88_name: Union[str, object] = values.unset, + parameter88_value: Union[str, object] = values.unset, + parameter89_name: Union[str, object] = values.unset, + parameter89_value: Union[str, object] = values.unset, + parameter90_name: Union[str, object] = values.unset, + parameter90_value: Union[str, object] = values.unset, + parameter91_name: Union[str, object] = values.unset, + parameter91_value: Union[str, object] = values.unset, + parameter92_name: Union[str, object] = values.unset, + parameter92_value: Union[str, object] = values.unset, + parameter93_name: Union[str, object] = values.unset, + parameter93_value: Union[str, object] = values.unset, + parameter94_name: Union[str, object] = values.unset, + parameter94_value: Union[str, object] = values.unset, + parameter95_name: Union[str, object] = values.unset, + parameter95_value: Union[str, object] = values.unset, + parameter96_name: Union[str, object] = values.unset, + parameter96_value: Union[str, object] = values.unset, + parameter97_name: Union[str, object] = values.unset, + parameter97_value: Union[str, object] = values.unset, + parameter98_name: Union[str, object] = values.unset, + parameter98_value: Union[str, object] = values.unset, + parameter99_name: Union[str, object] = values.unset, + parameter99_value: Union[str, object] = values.unset, + ) -> StreamInstance: + """ + Asynchronously create the StreamInstance + + :param url: Relative or absolute URL where WebSocket connection will be established. + :param name: The user-specified name of this Stream, if one was given when the Stream was created. This can be used to stop the Stream. + :param track: + :param status_callback: Absolute URL to which Twilio sends status callback HTTP requests. + :param status_callback_method: The HTTP method Twilio uses when sending `status_callback` requests. Possible values are `GET` and `POST`. Default is `POST`. + :param parameter1_name: Parameter name + :param parameter1_value: Parameter value + :param parameter2_name: Parameter name + :param parameter2_value: Parameter value + :param parameter3_name: Parameter name + :param parameter3_value: Parameter value + :param parameter4_name: Parameter name + :param parameter4_value: Parameter value + :param parameter5_name: Parameter name + :param parameter5_value: Parameter value + :param parameter6_name: Parameter name + :param parameter6_value: Parameter value + :param parameter7_name: Parameter name + :param parameter7_value: Parameter value + :param parameter8_name: Parameter name + :param parameter8_value: Parameter value + :param parameter9_name: Parameter name + :param parameter9_value: Parameter value + :param parameter10_name: Parameter name + :param parameter10_value: Parameter value + :param parameter11_name: Parameter name + :param parameter11_value: Parameter value + :param parameter12_name: Parameter name + :param parameter12_value: Parameter value + :param parameter13_name: Parameter name + :param parameter13_value: Parameter value + :param parameter14_name: Parameter name + :param parameter14_value: Parameter value + :param parameter15_name: Parameter name + :param parameter15_value: Parameter value + :param parameter16_name: Parameter name + :param parameter16_value: Parameter value + :param parameter17_name: Parameter name + :param parameter17_value: Parameter value + :param parameter18_name: Parameter name + :param parameter18_value: Parameter value + :param parameter19_name: Parameter name + :param parameter19_value: Parameter value + :param parameter20_name: Parameter name + :param parameter20_value: Parameter value + :param parameter21_name: Parameter name + :param parameter21_value: Parameter value + :param parameter22_name: Parameter name + :param parameter22_value: Parameter value + :param parameter23_name: Parameter name + :param parameter23_value: Parameter value + :param parameter24_name: Parameter name + :param parameter24_value: Parameter value + :param parameter25_name: Parameter name + :param parameter25_value: Parameter value + :param parameter26_name: Parameter name + :param parameter26_value: Parameter value + :param parameter27_name: Parameter name + :param parameter27_value: Parameter value + :param parameter28_name: Parameter name + :param parameter28_value: Parameter value + :param parameter29_name: Parameter name + :param parameter29_value: Parameter value + :param parameter30_name: Parameter name + :param parameter30_value: Parameter value + :param parameter31_name: Parameter name + :param parameter31_value: Parameter value + :param parameter32_name: Parameter name + :param parameter32_value: Parameter value + :param parameter33_name: Parameter name + :param parameter33_value: Parameter value + :param parameter34_name: Parameter name + :param parameter34_value: Parameter value + :param parameter35_name: Parameter name + :param parameter35_value: Parameter value + :param parameter36_name: Parameter name + :param parameter36_value: Parameter value + :param parameter37_name: Parameter name + :param parameter37_value: Parameter value + :param parameter38_name: Parameter name + :param parameter38_value: Parameter value + :param parameter39_name: Parameter name + :param parameter39_value: Parameter value + :param parameter40_name: Parameter name + :param parameter40_value: Parameter value + :param parameter41_name: Parameter name + :param parameter41_value: Parameter value + :param parameter42_name: Parameter name + :param parameter42_value: Parameter value + :param parameter43_name: Parameter name + :param parameter43_value: Parameter value + :param parameter44_name: Parameter name + :param parameter44_value: Parameter value + :param parameter45_name: Parameter name + :param parameter45_value: Parameter value + :param parameter46_name: Parameter name + :param parameter46_value: Parameter value + :param parameter47_name: Parameter name + :param parameter47_value: Parameter value + :param parameter48_name: Parameter name + :param parameter48_value: Parameter value + :param parameter49_name: Parameter name + :param parameter49_value: Parameter value + :param parameter50_name: Parameter name + :param parameter50_value: Parameter value + :param parameter51_name: Parameter name + :param parameter51_value: Parameter value + :param parameter52_name: Parameter name + :param parameter52_value: Parameter value + :param parameter53_name: Parameter name + :param parameter53_value: Parameter value + :param parameter54_name: Parameter name + :param parameter54_value: Parameter value + :param parameter55_name: Parameter name + :param parameter55_value: Parameter value + :param parameter56_name: Parameter name + :param parameter56_value: Parameter value + :param parameter57_name: Parameter name + :param parameter57_value: Parameter value + :param parameter58_name: Parameter name + :param parameter58_value: Parameter value + :param parameter59_name: Parameter name + :param parameter59_value: Parameter value + :param parameter60_name: Parameter name + :param parameter60_value: Parameter value + :param parameter61_name: Parameter name + :param parameter61_value: Parameter value + :param parameter62_name: Parameter name + :param parameter62_value: Parameter value + :param parameter63_name: Parameter name + :param parameter63_value: Parameter value + :param parameter64_name: Parameter name + :param parameter64_value: Parameter value + :param parameter65_name: Parameter name + :param parameter65_value: Parameter value + :param parameter66_name: Parameter name + :param parameter66_value: Parameter value + :param parameter67_name: Parameter name + :param parameter67_value: Parameter value + :param parameter68_name: Parameter name + :param parameter68_value: Parameter value + :param parameter69_name: Parameter name + :param parameter69_value: Parameter value + :param parameter70_name: Parameter name + :param parameter70_value: Parameter value + :param parameter71_name: Parameter name + :param parameter71_value: Parameter value + :param parameter72_name: Parameter name + :param parameter72_value: Parameter value + :param parameter73_name: Parameter name + :param parameter73_value: Parameter value + :param parameter74_name: Parameter name + :param parameter74_value: Parameter value + :param parameter75_name: Parameter name + :param parameter75_value: Parameter value + :param parameter76_name: Parameter name + :param parameter76_value: Parameter value + :param parameter77_name: Parameter name + :param parameter77_value: Parameter value + :param parameter78_name: Parameter name + :param parameter78_value: Parameter value + :param parameter79_name: Parameter name + :param parameter79_value: Parameter value + :param parameter80_name: Parameter name + :param parameter80_value: Parameter value + :param parameter81_name: Parameter name + :param parameter81_value: Parameter value + :param parameter82_name: Parameter name + :param parameter82_value: Parameter value + :param parameter83_name: Parameter name + :param parameter83_value: Parameter value + :param parameter84_name: Parameter name + :param parameter84_value: Parameter value + :param parameter85_name: Parameter name + :param parameter85_value: Parameter value + :param parameter86_name: Parameter name + :param parameter86_value: Parameter value + :param parameter87_name: Parameter name + :param parameter87_value: Parameter value + :param parameter88_name: Parameter name + :param parameter88_value: Parameter value + :param parameter89_name: Parameter name + :param parameter89_value: Parameter value + :param parameter90_name: Parameter name + :param parameter90_value: Parameter value + :param parameter91_name: Parameter name + :param parameter91_value: Parameter value + :param parameter92_name: Parameter name + :param parameter92_value: Parameter value + :param parameter93_name: Parameter name + :param parameter93_value: Parameter value + :param parameter94_name: Parameter name + :param parameter94_value: Parameter value + :param parameter95_name: Parameter name + :param parameter95_value: Parameter value + :param parameter96_name: Parameter name + :param parameter96_value: Parameter value + :param parameter97_name: Parameter name + :param parameter97_value: Parameter value + :param parameter98_name: Parameter name + :param parameter98_value: Parameter value + :param parameter99_name: Parameter name + :param parameter99_value: Parameter value + + :returns: The created StreamInstance + """ + + data = values.of( + { + "Url": url, + "Name": name, + "Track": track, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "Parameter1.Name": parameter1_name, + "Parameter1.Value": parameter1_value, + "Parameter2.Name": parameter2_name, + "Parameter2.Value": parameter2_value, + "Parameter3.Name": parameter3_name, + "Parameter3.Value": parameter3_value, + "Parameter4.Name": parameter4_name, + "Parameter4.Value": parameter4_value, + "Parameter5.Name": parameter5_name, + "Parameter5.Value": parameter5_value, + "Parameter6.Name": parameter6_name, + "Parameter6.Value": parameter6_value, + "Parameter7.Name": parameter7_name, + "Parameter7.Value": parameter7_value, + "Parameter8.Name": parameter8_name, + "Parameter8.Value": parameter8_value, + "Parameter9.Name": parameter9_name, + "Parameter9.Value": parameter9_value, + "Parameter10.Name": parameter10_name, + "Parameter10.Value": parameter10_value, + "Parameter11.Name": parameter11_name, + "Parameter11.Value": parameter11_value, + "Parameter12.Name": parameter12_name, + "Parameter12.Value": parameter12_value, + "Parameter13.Name": parameter13_name, + "Parameter13.Value": parameter13_value, + "Parameter14.Name": parameter14_name, + "Parameter14.Value": parameter14_value, + "Parameter15.Name": parameter15_name, + "Parameter15.Value": parameter15_value, + "Parameter16.Name": parameter16_name, + "Parameter16.Value": parameter16_value, + "Parameter17.Name": parameter17_name, + "Parameter17.Value": parameter17_value, + "Parameter18.Name": parameter18_name, + "Parameter18.Value": parameter18_value, + "Parameter19.Name": parameter19_name, + "Parameter19.Value": parameter19_value, + "Parameter20.Name": parameter20_name, + "Parameter20.Value": parameter20_value, + "Parameter21.Name": parameter21_name, + "Parameter21.Value": parameter21_value, + "Parameter22.Name": parameter22_name, + "Parameter22.Value": parameter22_value, + "Parameter23.Name": parameter23_name, + "Parameter23.Value": parameter23_value, + "Parameter24.Name": parameter24_name, + "Parameter24.Value": parameter24_value, + "Parameter25.Name": parameter25_name, + "Parameter25.Value": parameter25_value, + "Parameter26.Name": parameter26_name, + "Parameter26.Value": parameter26_value, + "Parameter27.Name": parameter27_name, + "Parameter27.Value": parameter27_value, + "Parameter28.Name": parameter28_name, + "Parameter28.Value": parameter28_value, + "Parameter29.Name": parameter29_name, + "Parameter29.Value": parameter29_value, + "Parameter30.Name": parameter30_name, + "Parameter30.Value": parameter30_value, + "Parameter31.Name": parameter31_name, + "Parameter31.Value": parameter31_value, + "Parameter32.Name": parameter32_name, + "Parameter32.Value": parameter32_value, + "Parameter33.Name": parameter33_name, + "Parameter33.Value": parameter33_value, + "Parameter34.Name": parameter34_name, + "Parameter34.Value": parameter34_value, + "Parameter35.Name": parameter35_name, + "Parameter35.Value": parameter35_value, + "Parameter36.Name": parameter36_name, + "Parameter36.Value": parameter36_value, + "Parameter37.Name": parameter37_name, + "Parameter37.Value": parameter37_value, + "Parameter38.Name": parameter38_name, + "Parameter38.Value": parameter38_value, + "Parameter39.Name": parameter39_name, + "Parameter39.Value": parameter39_value, + "Parameter40.Name": parameter40_name, + "Parameter40.Value": parameter40_value, + "Parameter41.Name": parameter41_name, + "Parameter41.Value": parameter41_value, + "Parameter42.Name": parameter42_name, + "Parameter42.Value": parameter42_value, + "Parameter43.Name": parameter43_name, + "Parameter43.Value": parameter43_value, + "Parameter44.Name": parameter44_name, + "Parameter44.Value": parameter44_value, + "Parameter45.Name": parameter45_name, + "Parameter45.Value": parameter45_value, + "Parameter46.Name": parameter46_name, + "Parameter46.Value": parameter46_value, + "Parameter47.Name": parameter47_name, + "Parameter47.Value": parameter47_value, + "Parameter48.Name": parameter48_name, + "Parameter48.Value": parameter48_value, + "Parameter49.Name": parameter49_name, + "Parameter49.Value": parameter49_value, + "Parameter50.Name": parameter50_name, + "Parameter50.Value": parameter50_value, + "Parameter51.Name": parameter51_name, + "Parameter51.Value": parameter51_value, + "Parameter52.Name": parameter52_name, + "Parameter52.Value": parameter52_value, + "Parameter53.Name": parameter53_name, + "Parameter53.Value": parameter53_value, + "Parameter54.Name": parameter54_name, + "Parameter54.Value": parameter54_value, + "Parameter55.Name": parameter55_name, + "Parameter55.Value": parameter55_value, + "Parameter56.Name": parameter56_name, + "Parameter56.Value": parameter56_value, + "Parameter57.Name": parameter57_name, + "Parameter57.Value": parameter57_value, + "Parameter58.Name": parameter58_name, + "Parameter58.Value": parameter58_value, + "Parameter59.Name": parameter59_name, + "Parameter59.Value": parameter59_value, + "Parameter60.Name": parameter60_name, + "Parameter60.Value": parameter60_value, + "Parameter61.Name": parameter61_name, + "Parameter61.Value": parameter61_value, + "Parameter62.Name": parameter62_name, + "Parameter62.Value": parameter62_value, + "Parameter63.Name": parameter63_name, + "Parameter63.Value": parameter63_value, + "Parameter64.Name": parameter64_name, + "Parameter64.Value": parameter64_value, + "Parameter65.Name": parameter65_name, + "Parameter65.Value": parameter65_value, + "Parameter66.Name": parameter66_name, + "Parameter66.Value": parameter66_value, + "Parameter67.Name": parameter67_name, + "Parameter67.Value": parameter67_value, + "Parameter68.Name": parameter68_name, + "Parameter68.Value": parameter68_value, + "Parameter69.Name": parameter69_name, + "Parameter69.Value": parameter69_value, + "Parameter70.Name": parameter70_name, + "Parameter70.Value": parameter70_value, + "Parameter71.Name": parameter71_name, + "Parameter71.Value": parameter71_value, + "Parameter72.Name": parameter72_name, + "Parameter72.Value": parameter72_value, + "Parameter73.Name": parameter73_name, + "Parameter73.Value": parameter73_value, + "Parameter74.Name": parameter74_name, + "Parameter74.Value": parameter74_value, + "Parameter75.Name": parameter75_name, + "Parameter75.Value": parameter75_value, + "Parameter76.Name": parameter76_name, + "Parameter76.Value": parameter76_value, + "Parameter77.Name": parameter77_name, + "Parameter77.Value": parameter77_value, + "Parameter78.Name": parameter78_name, + "Parameter78.Value": parameter78_value, + "Parameter79.Name": parameter79_name, + "Parameter79.Value": parameter79_value, + "Parameter80.Name": parameter80_name, + "Parameter80.Value": parameter80_value, + "Parameter81.Name": parameter81_name, + "Parameter81.Value": parameter81_value, + "Parameter82.Name": parameter82_name, + "Parameter82.Value": parameter82_value, + "Parameter83.Name": parameter83_name, + "Parameter83.Value": parameter83_value, + "Parameter84.Name": parameter84_name, + "Parameter84.Value": parameter84_value, + "Parameter85.Name": parameter85_name, + "Parameter85.Value": parameter85_value, + "Parameter86.Name": parameter86_name, + "Parameter86.Value": parameter86_value, + "Parameter87.Name": parameter87_name, + "Parameter87.Value": parameter87_value, + "Parameter88.Name": parameter88_name, + "Parameter88.Value": parameter88_value, + "Parameter89.Name": parameter89_name, + "Parameter89.Value": parameter89_value, + "Parameter90.Name": parameter90_name, + "Parameter90.Value": parameter90_value, + "Parameter91.Name": parameter91_name, + "Parameter91.Value": parameter91_value, + "Parameter92.Name": parameter92_name, + "Parameter92.Value": parameter92_value, + "Parameter93.Name": parameter93_name, + "Parameter93.Value": parameter93_value, + "Parameter94.Name": parameter94_name, + "Parameter94.Value": parameter94_value, + "Parameter95.Name": parameter95_name, + "Parameter95.Value": parameter95_value, + "Parameter96.Name": parameter96_name, + "Parameter96.Value": parameter96_value, + "Parameter97.Name": parameter97_name, + "Parameter97.Value": parameter97_value, + "Parameter98.Name": parameter98_name, + "Parameter98.Value": parameter98_value, + "Parameter99.Name": parameter99_name, + "Parameter99.Value": parameter99_value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return StreamInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + def get(self, sid: str) -> StreamContext: + """ + Constructs a StreamContext + + :param sid: The SID or the `name` of the Stream resource to be stopped + """ + return StreamContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> StreamContext: + """ + Constructs a StreamContext + + :param sid: The SID or the `name` of the Stream resource to be stopped + """ + return StreamContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/transcription.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/transcription.py new file mode 100644 index 00000000..4f8f9125 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/transcription.py @@ -0,0 +1,439 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class TranscriptionInstance(InstanceResource): + + class Status(object): + IN_PROGRESS = "in-progress" + STOPPED = "stopped" + + class Track(object): + INBOUND_TRACK = "inbound_track" + OUTBOUND_TRACK = "outbound_track" + BOTH_TRACKS = "both_tracks" + + class UpdateStatus(object): + STOPPED = "stopped" + + """ + :ivar sid: The SID of the Transcription resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Transcription resource. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Transcription resource is associated with. + :ivar name: The user-specified name of this Transcription, if one was given when the Transcription was created. This may be used to stop the Transcription. + :ivar status: + :ivar date_updated: The date and time in GMT that this resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar uri: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + call_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.name: Optional[str] = payload.get("name") + self.status: Optional["TranscriptionInstance.Status"] = payload.get("status") + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid or self.sid, + } + self._context: Optional[TranscriptionContext] = None + + @property + def _proxy(self) -> "TranscriptionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: TranscriptionContext for this TranscriptionInstance + """ + if self._context is None: + self._context = TranscriptionContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + return self._context + + def update( + self, status: "TranscriptionInstance.UpdateStatus" + ) -> "TranscriptionInstance": + """ + Update the TranscriptionInstance + + :param status: + + :returns: The updated TranscriptionInstance + """ + return self._proxy.update( + status=status, + ) + + async def update_async( + self, status: "TranscriptionInstance.UpdateStatus" + ) -> "TranscriptionInstance": + """ + Asynchronous coroutine to update the TranscriptionInstance + + :param status: + + :returns: The updated TranscriptionInstance + """ + return await self._proxy.update_async( + status=status, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TranscriptionContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, call_sid: str, sid: str): + """ + Initialize the TranscriptionContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Transcription resource. + :param call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Transcription resource is associated with. + :param sid: The SID of the Transcription resource, or the `name` used when creating the resource + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid, + } + self._uri = ( + "/Accounts/{account_sid}/Calls/{call_sid}/Transcriptions/{sid}.json".format( + **self._solution + ) + ) + + def update( + self, status: "TranscriptionInstance.UpdateStatus" + ) -> TranscriptionInstance: + """ + Update the TranscriptionInstance + + :param status: + + :returns: The updated TranscriptionInstance + """ + + data = values.of( + { + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TranscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, status: "TranscriptionInstance.UpdateStatus" + ) -> TranscriptionInstance: + """ + Asynchronous coroutine to update the TranscriptionInstance + + :param status: + + :returns: The updated TranscriptionInstance + """ + + data = values.of( + { + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TranscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TranscriptionList(ListResource): + + def __init__(self, version: Version, account_sid: str, call_sid: str): + """ + Initialize the TranscriptionList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Transcription resource. + :param call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Transcription resource is associated with. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + self._uri = ( + "/Accounts/{account_sid}/Calls/{call_sid}/Transcriptions.json".format( + **self._solution + ) + ) + + def create( + self, + name: Union[str, object] = values.unset, + track: Union["TranscriptionInstance.Track", object] = values.unset, + status_callback_url: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + inbound_track_label: Union[str, object] = values.unset, + outbound_track_label: Union[str, object] = values.unset, + partial_results: Union[bool, object] = values.unset, + language_code: Union[str, object] = values.unset, + transcription_engine: Union[str, object] = values.unset, + profanity_filter: Union[bool, object] = values.unset, + speech_model: Union[str, object] = values.unset, + hints: Union[str, object] = values.unset, + enable_automatic_punctuation: Union[bool, object] = values.unset, + intelligence_service: Union[str, object] = values.unset, + ) -> TranscriptionInstance: + """ + Create the TranscriptionInstance + + :param name: The user-specified name of this Transcription, if one was given when the Transcription was created. This may be used to stop the Transcription. + :param track: + :param status_callback_url: Absolute URL of the status callback. + :param status_callback_method: The http method for the status_callback (one of GET, POST). + :param inbound_track_label: Friendly name given to the Inbound Track + :param outbound_track_label: Friendly name given to the Outbound Track + :param partial_results: Indicates if partial results are going to be sent to the customer + :param language_code: Language code used by the transcription engine, specified in [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) format + :param transcription_engine: Definition of the transcription engine to be used, among those supported by Twilio + :param profanity_filter: indicates if the server will attempt to filter out profanities, replacing all but the initial character in each filtered word with asterisks + :param speech_model: Recognition model used by the transcription engine, among those supported by the provider + :param hints: A Phrase contains words and phrase \\\"hints\\\" so that the speech recognition engine is more likely to recognize them. + :param enable_automatic_punctuation: The provider will add punctuation to recognition result + :param intelligence_service: The SID or unique name of the [Intelligence Service](https://www.twilio.com/docs/conversational-intelligence/api/service-resource) for persisting transcripts and running post-call Language Operators . + + :returns: The created TranscriptionInstance + """ + + data = values.of( + { + "Name": name, + "Track": track, + "StatusCallbackUrl": status_callback_url, + "StatusCallbackMethod": status_callback_method, + "InboundTrackLabel": inbound_track_label, + "OutboundTrackLabel": outbound_track_label, + "PartialResults": serialize.boolean_to_string(partial_results), + "LanguageCode": language_code, + "TranscriptionEngine": transcription_engine, + "ProfanityFilter": serialize.boolean_to_string(profanity_filter), + "SpeechModel": speech_model, + "Hints": hints, + "EnableAutomaticPunctuation": serialize.boolean_to_string( + enable_automatic_punctuation + ), + "IntelligenceService": intelligence_service, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TranscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + async def create_async( + self, + name: Union[str, object] = values.unset, + track: Union["TranscriptionInstance.Track", object] = values.unset, + status_callback_url: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + inbound_track_label: Union[str, object] = values.unset, + outbound_track_label: Union[str, object] = values.unset, + partial_results: Union[bool, object] = values.unset, + language_code: Union[str, object] = values.unset, + transcription_engine: Union[str, object] = values.unset, + profanity_filter: Union[bool, object] = values.unset, + speech_model: Union[str, object] = values.unset, + hints: Union[str, object] = values.unset, + enable_automatic_punctuation: Union[bool, object] = values.unset, + intelligence_service: Union[str, object] = values.unset, + ) -> TranscriptionInstance: + """ + Asynchronously create the TranscriptionInstance + + :param name: The user-specified name of this Transcription, if one was given when the Transcription was created. This may be used to stop the Transcription. + :param track: + :param status_callback_url: Absolute URL of the status callback. + :param status_callback_method: The http method for the status_callback (one of GET, POST). + :param inbound_track_label: Friendly name given to the Inbound Track + :param outbound_track_label: Friendly name given to the Outbound Track + :param partial_results: Indicates if partial results are going to be sent to the customer + :param language_code: Language code used by the transcription engine, specified in [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) format + :param transcription_engine: Definition of the transcription engine to be used, among those supported by Twilio + :param profanity_filter: indicates if the server will attempt to filter out profanities, replacing all but the initial character in each filtered word with asterisks + :param speech_model: Recognition model used by the transcription engine, among those supported by the provider + :param hints: A Phrase contains words and phrase \\\"hints\\\" so that the speech recognition engine is more likely to recognize them. + :param enable_automatic_punctuation: The provider will add punctuation to recognition result + :param intelligence_service: The SID or unique name of the [Intelligence Service](https://www.twilio.com/docs/conversational-intelligence/api/service-resource) for persisting transcripts and running post-call Language Operators . + + :returns: The created TranscriptionInstance + """ + + data = values.of( + { + "Name": name, + "Track": track, + "StatusCallbackUrl": status_callback_url, + "StatusCallbackMethod": status_callback_method, + "InboundTrackLabel": inbound_track_label, + "OutboundTrackLabel": outbound_track_label, + "PartialResults": serialize.boolean_to_string(partial_results), + "LanguageCode": language_code, + "TranscriptionEngine": transcription_engine, + "ProfanityFilter": serialize.boolean_to_string(profanity_filter), + "SpeechModel": speech_model, + "Hints": hints, + "EnableAutomaticPunctuation": serialize.boolean_to_string( + enable_automatic_punctuation + ), + "IntelligenceService": intelligence_service, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TranscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + def get(self, sid: str) -> TranscriptionContext: + """ + Constructs a TranscriptionContext + + :param sid: The SID of the Transcription resource, or the `name` used when creating the resource + """ + return TranscriptionContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> TranscriptionContext: + """ + Constructs a TranscriptionContext + + :param sid: The SID of the Transcription resource, or the `name` used when creating the resource + """ + return TranscriptionContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/user_defined_message.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/user_defined_message.py new file mode 100644 index 00000000..bc66f8b8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/user_defined_message.py @@ -0,0 +1,159 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class UserDefinedMessageInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created User Defined Message. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the User Defined Message is associated with. + :ivar sid: The SID that uniquely identifies this User Defined Message. + :ivar date_created: The date that this User Defined Message was created, given in RFC 2822 format. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], account_sid: str, call_sid: str + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.sid: Optional[str] = payload.get("sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserDefinedMessageList(ListResource): + + def __init__(self, version: Version, account_sid: str, call_sid: str): + """ + Initialize the UserDefinedMessageList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created User Defined Message. + :param call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the User Defined Message is associated with. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + self._uri = ( + "/Accounts/{account_sid}/Calls/{call_sid}/UserDefinedMessages.json".format( + **self._solution + ) + ) + + def create( + self, content: str, idempotency_key: Union[str, object] = values.unset + ) -> UserDefinedMessageInstance: + """ + Create the UserDefinedMessageInstance + + :param content: The User Defined Message in the form of URL-encoded JSON string. + :param idempotency_key: A unique string value to identify API call. This should be a unique string value per API call and can be a randomly generated. + + :returns: The created UserDefinedMessageInstance + """ + + data = values.of( + { + "Content": content, + "IdempotencyKey": idempotency_key, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserDefinedMessageInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + async def create_async( + self, content: str, idempotency_key: Union[str, object] = values.unset + ) -> UserDefinedMessageInstance: + """ + Asynchronously create the UserDefinedMessageInstance + + :param content: The User Defined Message in the form of URL-encoded JSON string. + :param idempotency_key: A unique string value to identify API call. This should be a unique string value per API call and can be a randomly generated. + + :returns: The created UserDefinedMessageInstance + """ + + data = values.of( + { + "Content": content, + "IdempotencyKey": idempotency_key, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserDefinedMessageInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/user_defined_message_subscription.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/user_defined_message_subscription.py new file mode 100644 index 00000000..66923d4b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/call/user_defined_message_subscription.py @@ -0,0 +1,300 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class UserDefinedMessageSubscriptionInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that subscribed to the User Defined Messages. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the User Defined Message Subscription is associated with. This refers to the Call SID that is producing the User Defined Messages. + :ivar sid: The SID that uniquely identifies this User Defined Message Subscription. + :ivar date_created: The date that this User Defined Message Subscription was created, given in RFC 2822 format. + :ivar uri: The URI of the User Defined Message Subscription Resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + call_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.sid: Optional[str] = payload.get("sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid or self.sid, + } + self._context: Optional[UserDefinedMessageSubscriptionContext] = None + + @property + def _proxy(self) -> "UserDefinedMessageSubscriptionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserDefinedMessageSubscriptionContext for this UserDefinedMessageSubscriptionInstance + """ + if self._context is None: + self._context = UserDefinedMessageSubscriptionContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserDefinedMessageSubscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserDefinedMessageSubscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class UserDefinedMessageSubscriptionContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, call_sid: str, sid: str): + """ + Initialize the UserDefinedMessageSubscriptionContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that subscribed to the User Defined Messages. + :param call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the User Defined Message Subscription is associated with. This refers to the Call SID that is producing the User Defined Messages. + :param sid: The SID that uniquely identifies this User Defined Message Subscription. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Calls/{call_sid}/UserDefinedMessageSubscriptions/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the UserDefinedMessageSubscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserDefinedMessageSubscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class UserDefinedMessageSubscriptionList(ListResource): + + def __init__(self, version: Version, account_sid: str, call_sid: str): + """ + Initialize the UserDefinedMessageSubscriptionList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that subscribed to the User Defined Messages. + :param call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the User Defined Messages subscription is associated with. This refers to the Call SID that is producing the user defined messages. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "call_sid": call_sid, + } + self._uri = "/Accounts/{account_sid}/Calls/{call_sid}/UserDefinedMessageSubscriptions.json".format( + **self._solution + ) + + def create( + self, + callback: str, + idempotency_key: Union[str, object] = values.unset, + method: Union[str, object] = values.unset, + ) -> UserDefinedMessageSubscriptionInstance: + """ + Create the UserDefinedMessageSubscriptionInstance + + :param callback: The URL we should call using the `method` to send user defined events to your application. URLs must contain a valid hostname (underscores are not permitted). + :param idempotency_key: A unique string value to identify API call. This should be a unique string value per API call and can be a randomly generated. + :param method: The HTTP method Twilio will use when requesting the above `Url`. Either `GET` or `POST`. Default is `POST`. + + :returns: The created UserDefinedMessageSubscriptionInstance + """ + + data = values.of( + { + "Callback": callback, + "IdempotencyKey": idempotency_key, + "Method": method, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserDefinedMessageSubscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + async def create_async( + self, + callback: str, + idempotency_key: Union[str, object] = values.unset, + method: Union[str, object] = values.unset, + ) -> UserDefinedMessageSubscriptionInstance: + """ + Asynchronously create the UserDefinedMessageSubscriptionInstance + + :param callback: The URL we should call using the `method` to send user defined events to your application. URLs must contain a valid hostname (underscores are not permitted). + :param idempotency_key: A unique string value to identify API call. This should be a unique string value per API call and can be a randomly generated. + :param method: The HTTP method Twilio will use when requesting the above `Url`. Either `GET` or `POST`. Default is `POST`. + + :returns: The created UserDefinedMessageSubscriptionInstance + """ + + data = values.of( + { + "Callback": callback, + "IdempotencyKey": idempotency_key, + "Method": method, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserDefinedMessageSubscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + ) + + def get(self, sid: str) -> UserDefinedMessageSubscriptionContext: + """ + Constructs a UserDefinedMessageSubscriptionContext + + :param sid: The SID that uniquely identifies this User Defined Message Subscription. + """ + return UserDefinedMessageSubscriptionContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> UserDefinedMessageSubscriptionContext: + """ + Constructs a UserDefinedMessageSubscriptionContext + + :param sid: The SID that uniquely identifies this User Defined Message Subscription. + """ + return UserDefinedMessageSubscriptionContext( + self._version, + account_sid=self._solution["account_sid"], + call_sid=self._solution["call_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__init__.py new file mode 100644 index 00000000..672d9d0f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__init__.py @@ -0,0 +1,791 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date, datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.conference.participant import ParticipantList +from twilio.rest.api.v2010.account.conference.recording import RecordingList + + +class ConferenceInstance(InstanceResource): + + class ReasonConferenceEnded(object): + CONFERENCE_ENDED_VIA_API = "conference-ended-via-api" + PARTICIPANT_WITH_END_CONFERENCE_ON_EXIT_LEFT = ( + "participant-with-end-conference-on-exit-left" + ) + PARTICIPANT_WITH_END_CONFERENCE_ON_EXIT_KICKED = ( + "participant-with-end-conference-on-exit-kicked" + ) + LAST_PARTICIPANT_KICKED = "last-participant-kicked" + LAST_PARTICIPANT_LEFT = "last-participant-left" + + class Status(object): + INIT = "init" + IN_PROGRESS = "in-progress" + COMPLETED = "completed" + + class UpdateStatus(object): + COMPLETED = "completed" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Conference resource. + :ivar date_created: The date and time in UTC that this resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in UTC that this resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar api_version: The API version used to create this conference. + :ivar friendly_name: A string that you assigned to describe this conference room. Maximum length is 128 characters. + :ivar region: A string that represents the Twilio Region where the conference audio was mixed. May be `us1`, `us2`, `ie1`, `de1`, `sg1`, `br1`, `au1`, and `jp1`. Basic conference audio will always be mixed in `us1`. Global Conference audio will be mixed nearest to the majority of participants. + :ivar sid: The unique, Twilio-provided string used to identify this Conference resource. + :ivar status: + :ivar uri: The URI of this resource, relative to `https://api.twilio.com`. + :ivar subresource_uris: A list of related resources identified by their URIs relative to `https://api.twilio.com`. + :ivar reason_conference_ended: + :ivar call_sid_ending_conference: The call SID that caused the conference to end. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.api_version: Optional[str] = payload.get("api_version") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.region: Optional[str] = payload.get("region") + self.sid: Optional[str] = payload.get("sid") + self.status: Optional["ConferenceInstance.Status"] = payload.get("status") + self.uri: Optional[str] = payload.get("uri") + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.reason_conference_ended: Optional[ + "ConferenceInstance.ReasonConferenceEnded" + ] = payload.get("reason_conference_ended") + self.call_sid_ending_conference: Optional[str] = payload.get( + "call_sid_ending_conference" + ) + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[ConferenceContext] = None + + @property + def _proxy(self) -> "ConferenceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ConferenceContext for this ConferenceInstance + """ + if self._context is None: + self._context = ConferenceContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "ConferenceInstance": + """ + Fetch the ConferenceInstance + + + :returns: The fetched ConferenceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ConferenceInstance": + """ + Asynchronous coroutine to fetch the ConferenceInstance + + + :returns: The fetched ConferenceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + status: Union["ConferenceInstance.UpdateStatus", object] = values.unset, + announce_url: Union[str, object] = values.unset, + announce_method: Union[str, object] = values.unset, + ) -> "ConferenceInstance": + """ + Update the ConferenceInstance + + :param status: + :param announce_url: The URL we should call to announce something into the conference. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param announce_method: The HTTP method used to call `announce_url`. Can be: `GET` or `POST` and the default is `POST` + + :returns: The updated ConferenceInstance + """ + return self._proxy.update( + status=status, + announce_url=announce_url, + announce_method=announce_method, + ) + + async def update_async( + self, + status: Union["ConferenceInstance.UpdateStatus", object] = values.unset, + announce_url: Union[str, object] = values.unset, + announce_method: Union[str, object] = values.unset, + ) -> "ConferenceInstance": + """ + Asynchronous coroutine to update the ConferenceInstance + + :param status: + :param announce_url: The URL we should call to announce something into the conference. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param announce_method: The HTTP method used to call `announce_url`. Can be: `GET` or `POST` and the default is `POST` + + :returns: The updated ConferenceInstance + """ + return await self._proxy.update_async( + status=status, + announce_url=announce_url, + announce_method=announce_method, + ) + + @property + def participants(self) -> ParticipantList: + """ + Access the participants + """ + return self._proxy.participants + + @property + def recordings(self) -> RecordingList: + """ + Access the recordings + """ + return self._proxy.recordings + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConferenceContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the ConferenceContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Conference resource(s) to update. + :param sid: The Twilio-provided string that uniquely identifies the Conference resource to update + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Conferences/{sid}.json".format( + **self._solution + ) + + self._participants: Optional[ParticipantList] = None + self._recordings: Optional[RecordingList] = None + + def fetch(self) -> ConferenceInstance: + """ + Fetch the ConferenceInstance + + + :returns: The fetched ConferenceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ConferenceInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ConferenceInstance: + """ + Asynchronous coroutine to fetch the ConferenceInstance + + + :returns: The fetched ConferenceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ConferenceInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + status: Union["ConferenceInstance.UpdateStatus", object] = values.unset, + announce_url: Union[str, object] = values.unset, + announce_method: Union[str, object] = values.unset, + ) -> ConferenceInstance: + """ + Update the ConferenceInstance + + :param status: + :param announce_url: The URL we should call to announce something into the conference. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param announce_method: The HTTP method used to call `announce_url`. Can be: `GET` or `POST` and the default is `POST` + + :returns: The updated ConferenceInstance + """ + + data = values.of( + { + "Status": status, + "AnnounceUrl": announce_url, + "AnnounceMethod": announce_method, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConferenceInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + status: Union["ConferenceInstance.UpdateStatus", object] = values.unset, + announce_url: Union[str, object] = values.unset, + announce_method: Union[str, object] = values.unset, + ) -> ConferenceInstance: + """ + Asynchronous coroutine to update the ConferenceInstance + + :param status: + :param announce_url: The URL we should call to announce something into the conference. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param announce_method: The HTTP method used to call `announce_url`. Can be: `GET` or `POST` and the default is `POST` + + :returns: The updated ConferenceInstance + """ + + data = values.of( + { + "Status": status, + "AnnounceUrl": announce_url, + "AnnounceMethod": announce_method, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConferenceInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + @property + def participants(self) -> ParticipantList: + """ + Access the participants + """ + if self._participants is None: + self._participants = ParticipantList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._participants + + @property + def recordings(self) -> RecordingList: + """ + Access the recordings + """ + if self._recordings is None: + self._recordings = RecordingList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._recordings + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConferencePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ConferenceInstance: + """ + Build an instance of ConferenceInstance + + :param payload: Payload response from the API + """ + return ConferenceInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ConferenceList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the ConferenceList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Conference resource(s) to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Conferences.json".format(**self._solution) + + def stream( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + date_updated: Union[date, object] = values.unset, + date_updated_before: Union[date, object] = values.unset, + date_updated_after: Union[date, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union["ConferenceInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ConferenceInstance]: + """ + Streams ConferenceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param date date_created: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_created_before: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_created_after: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_updated: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date date_updated_before: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date date_updated_after: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param str friendly_name: The string that identifies the Conference resources to read. + :param "ConferenceInstance.Status" status: The status of the resources to read. Can be: `init`, `in-progress`, or `completed`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + date_updated=date_updated, + date_updated_before=date_updated_before, + date_updated_after=date_updated_after, + friendly_name=friendly_name, + status=status, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + date_updated: Union[date, object] = values.unset, + date_updated_before: Union[date, object] = values.unset, + date_updated_after: Union[date, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union["ConferenceInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ConferenceInstance]: + """ + Asynchronously streams ConferenceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param date date_created: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_created_before: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_created_after: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_updated: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date date_updated_before: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date date_updated_after: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param str friendly_name: The string that identifies the Conference resources to read. + :param "ConferenceInstance.Status" status: The status of the resources to read. Can be: `init`, `in-progress`, or `completed`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + date_updated=date_updated, + date_updated_before=date_updated_before, + date_updated_after=date_updated_after, + friendly_name=friendly_name, + status=status, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + date_updated: Union[date, object] = values.unset, + date_updated_before: Union[date, object] = values.unset, + date_updated_after: Union[date, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union["ConferenceInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConferenceInstance]: + """ + Lists ConferenceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param date date_created: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_created_before: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_created_after: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_updated: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date date_updated_before: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date date_updated_after: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param str friendly_name: The string that identifies the Conference resources to read. + :param "ConferenceInstance.Status" status: The status of the resources to read. Can be: `init`, `in-progress`, or `completed`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + date_updated=date_updated, + date_updated_before=date_updated_before, + date_updated_after=date_updated_after, + friendly_name=friendly_name, + status=status, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + date_updated: Union[date, object] = values.unset, + date_updated_before: Union[date, object] = values.unset, + date_updated_after: Union[date, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union["ConferenceInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConferenceInstance]: + """ + Asynchronously lists ConferenceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param date date_created: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_created_before: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_created_after: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date date_updated: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date date_updated_before: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date date_updated_after: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param str friendly_name: The string that identifies the Conference resources to read. + :param "ConferenceInstance.Status" status: The status of the resources to read. Can be: `init`, `in-progress`, or `completed`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + date_updated=date_updated, + date_updated_before=date_updated_before, + date_updated_after=date_updated_after, + friendly_name=friendly_name, + status=status, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + date_updated: Union[date, object] = values.unset, + date_updated_before: Union[date, object] = values.unset, + date_updated_after: Union[date, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union["ConferenceInstance.Status", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConferencePage: + """ + Retrieve a single page of ConferenceInstance records from the API. + Request is executed immediately + + :param date_created: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date_created_before: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date_created_after: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date_updated: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date_updated_before: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date_updated_after: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param friendly_name: The string that identifies the Conference resources to read. + :param status: The status of the resources to read. Can be: `init`, `in-progress`, or `completed`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConferenceInstance + """ + data = values.of( + { + "DateCreated": serialize.iso8601_date(date_created), + "DateCreated<": serialize.iso8601_date(date_created_before), + "DateCreated>": serialize.iso8601_date(date_created_after), + "DateUpdated": serialize.iso8601_date(date_updated), + "DateUpdated<": serialize.iso8601_date(date_updated_before), + "DateUpdated>": serialize.iso8601_date(date_updated_after), + "FriendlyName": friendly_name, + "Status": status, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConferencePage(self._version, response, self._solution) + + async def page_async( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + date_updated: Union[date, object] = values.unset, + date_updated_before: Union[date, object] = values.unset, + date_updated_after: Union[date, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union["ConferenceInstance.Status", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConferencePage: + """ + Asynchronously retrieve a single page of ConferenceInstance records from the API. + Request is executed immediately + + :param date_created: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date_created_before: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date_created_after: Only include conferences that were created on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read conferences that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read conferences that were created on or after midnight of this date. + :param date_updated: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date_updated_before: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param date_updated_after: Only include conferences that were last updated on this date. Specify a date as `YYYY-MM-DD` in UTC, for example: `2009-07-06`, to read only conferences that were last updated on this date. You can also specify an inequality, such as `DateUpdated<=YYYY-MM-DD`, to read conferences that were last updated on or before midnight of this date, and `DateUpdated>=YYYY-MM-DD` to read conferences that were last updated on or after midnight of this date. + :param friendly_name: The string that identifies the Conference resources to read. + :param status: The status of the resources to read. Can be: `init`, `in-progress`, or `completed`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConferenceInstance + """ + data = values.of( + { + "DateCreated": serialize.iso8601_date(date_created), + "DateCreated<": serialize.iso8601_date(date_created_before), + "DateCreated>": serialize.iso8601_date(date_created_after), + "DateUpdated": serialize.iso8601_date(date_updated), + "DateUpdated<": serialize.iso8601_date(date_updated_before), + "DateUpdated>": serialize.iso8601_date(date_updated_after), + "FriendlyName": friendly_name, + "Status": status, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConferencePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ConferencePage: + """ + Retrieve a specific page of ConferenceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConferenceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ConferencePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ConferencePage: + """ + Asynchronously retrieve a specific page of ConferenceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConferenceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ConferencePage(self._version, response, self._solution) + + def get(self, sid: str) -> ConferenceContext: + """ + Constructs a ConferenceContext + + :param sid: The Twilio-provided string that uniquely identifies the Conference resource to update + """ + return ConferenceContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ConferenceContext: + """ + Constructs a ConferenceContext + + :param sid: The Twilio-provided string that uniquely identifies the Conference resource to update + """ + return ConferenceContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f47466dc17199f723720900bf45d0d3a4ac31662 GIT binary patch literal 49281 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 MlfM+`m(}S11B40rI{*Lx literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__pycache__/participant.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__pycache__/participant.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5829c95426212ad3cf29465fa9c1a4535243f2d GIT binary patch literal 75133 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__pycache__/recording.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/__pycache__/recording.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f707b0b228e60ad9064b713f1b2ebdc9bf6b4e6 GIT binary patch literal 34599 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/participant.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/participant.py new file mode 100644 index 00000000..3c49e538 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/participant.py @@ -0,0 +1,1201 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ParticipantInstance(InstanceResource): + + class Status(object): + QUEUED = "queued" + CONNECTING = "connecting" + RINGING = "ringing" + CONNECTED = "connected" + COMPLETE = "complete" + FAILED = "failed" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Participant resource. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Participant resource is associated with. + :ivar label: The user-specified label of this participant, if one was given when the participant was created. This may be used to fetch, update or delete the participant. + :ivar call_sid_to_coach: The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + :ivar coaching: Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + :ivar conference_sid: The SID of the conference the participant is in. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar end_conference_on_exit: Whether the conference ends when the participant leaves. Can be: `true` or `false` and the default is `false`. If `true`, the conference ends and all other participants drop out when the participant leaves. + :ivar muted: Whether the participant is muted. Can be `true` or `false`. + :ivar hold: Whether the participant is on hold. Can be `true` or `false`. + :ivar start_conference_on_enter: Whether the conference starts when the participant joins the conference, if it has not already started. Can be: `true` or `false` and the default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + :ivar status: + :ivar queue_time: The wait time in milliseconds before participant's call is placed. Only available in the response to a create participant request. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + conference_sid: str, + call_sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.label: Optional[str] = payload.get("label") + self.call_sid_to_coach: Optional[str] = payload.get("call_sid_to_coach") + self.coaching: Optional[bool] = payload.get("coaching") + self.conference_sid: Optional[str] = payload.get("conference_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.end_conference_on_exit: Optional[bool] = payload.get( + "end_conference_on_exit" + ) + self.muted: Optional[bool] = payload.get("muted") + self.hold: Optional[bool] = payload.get("hold") + self.start_conference_on_enter: Optional[bool] = payload.get( + "start_conference_on_enter" + ) + self.status: Optional["ParticipantInstance.Status"] = payload.get("status") + self.queue_time: Optional[str] = payload.get("queue_time") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "conference_sid": conference_sid, + "call_sid": call_sid or self.call_sid, + } + self._context: Optional[ParticipantContext] = None + + @property + def _proxy(self) -> "ParticipantContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ParticipantContext for this ParticipantInstance + """ + if self._context is None: + self._context = ParticipantContext( + self._version, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + call_sid=self._solution["call_sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ParticipantInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ParticipantInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ParticipantInstance": + """ + Fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ParticipantInstance": + """ + Asynchronous coroutine to fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + muted: Union[bool, object] = values.unset, + hold: Union[bool, object] = values.unset, + hold_url: Union[str, object] = values.unset, + hold_method: Union[str, object] = values.unset, + announce_url: Union[str, object] = values.unset, + announce_method: Union[str, object] = values.unset, + wait_url: Union[str, object] = values.unset, + wait_method: Union[str, object] = values.unset, + beep_on_exit: Union[bool, object] = values.unset, + end_conference_on_exit: Union[bool, object] = values.unset, + coaching: Union[bool, object] = values.unset, + call_sid_to_coach: Union[str, object] = values.unset, + ) -> "ParticipantInstance": + """ + Update the ParticipantInstance + + :param muted: Whether the participant should be muted. Can be `true` or `false`. `true` will mute the participant, and `false` will un-mute them. Anything value other than `true` or `false` is interpreted as `false`. + :param hold: Whether the participant should be on hold. Can be: `true` or `false`. `true` puts the participant on hold, and `false` lets them rejoin the conference. + :param hold_url: The URL we call using the `hold_method` for music that plays when the participant is on hold. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param hold_method: The HTTP method we should use to call `hold_url`. Can be: `GET` or `POST` and the default is `GET`. + :param announce_url: The URL we call using the `announce_method` for an announcement to the participant. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param announce_method: The HTTP method we should use to call `announce_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param wait_url: The URL that Twilio calls using the `wait_method` before the conference has started. The URL may return an MP3 file, a WAV file, or a TwiML document. The default value is the URL of our standard hold music. If you do not want anything to play while waiting for the conference to start, specify an empty string by setting `wait_url` to `''`. For more details on the allowable verbs within the `waitUrl`, see the `waitUrl` attribute in the [ TwiML instruction](https://www.twilio.com/docs/voice/twiml/conference#attributes-waiturl). + :param wait_method: The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + :param beep_on_exit: Whether to play a notification beep to the conference when the participant exits. Can be: `true` or `false`. + :param end_conference_on_exit: Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + :param coaching: Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + :param call_sid_to_coach: The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + + :returns: The updated ParticipantInstance + """ + return self._proxy.update( + muted=muted, + hold=hold, + hold_url=hold_url, + hold_method=hold_method, + announce_url=announce_url, + announce_method=announce_method, + wait_url=wait_url, + wait_method=wait_method, + beep_on_exit=beep_on_exit, + end_conference_on_exit=end_conference_on_exit, + coaching=coaching, + call_sid_to_coach=call_sid_to_coach, + ) + + async def update_async( + self, + muted: Union[bool, object] = values.unset, + hold: Union[bool, object] = values.unset, + hold_url: Union[str, object] = values.unset, + hold_method: Union[str, object] = values.unset, + announce_url: Union[str, object] = values.unset, + announce_method: Union[str, object] = values.unset, + wait_url: Union[str, object] = values.unset, + wait_method: Union[str, object] = values.unset, + beep_on_exit: Union[bool, object] = values.unset, + end_conference_on_exit: Union[bool, object] = values.unset, + coaching: Union[bool, object] = values.unset, + call_sid_to_coach: Union[str, object] = values.unset, + ) -> "ParticipantInstance": + """ + Asynchronous coroutine to update the ParticipantInstance + + :param muted: Whether the participant should be muted. Can be `true` or `false`. `true` will mute the participant, and `false` will un-mute them. Anything value other than `true` or `false` is interpreted as `false`. + :param hold: Whether the participant should be on hold. Can be: `true` or `false`. `true` puts the participant on hold, and `false` lets them rejoin the conference. + :param hold_url: The URL we call using the `hold_method` for music that plays when the participant is on hold. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param hold_method: The HTTP method we should use to call `hold_url`. Can be: `GET` or `POST` and the default is `GET`. + :param announce_url: The URL we call using the `announce_method` for an announcement to the participant. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param announce_method: The HTTP method we should use to call `announce_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param wait_url: The URL that Twilio calls using the `wait_method` before the conference has started. The URL may return an MP3 file, a WAV file, or a TwiML document. The default value is the URL of our standard hold music. If you do not want anything to play while waiting for the conference to start, specify an empty string by setting `wait_url` to `''`. For more details on the allowable verbs within the `waitUrl`, see the `waitUrl` attribute in the [ TwiML instruction](https://www.twilio.com/docs/voice/twiml/conference#attributes-waiturl). + :param wait_method: The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + :param beep_on_exit: Whether to play a notification beep to the conference when the participant exits. Can be: `true` or `false`. + :param end_conference_on_exit: Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + :param coaching: Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + :param call_sid_to_coach: The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + + :returns: The updated ParticipantInstance + """ + return await self._proxy.update_async( + muted=muted, + hold=hold, + hold_url=hold_url, + hold_method=hold_method, + announce_url=announce_url, + announce_method=announce_method, + wait_url=wait_url, + wait_method=wait_method, + beep_on_exit=beep_on_exit, + end_conference_on_exit=end_conference_on_exit, + coaching=coaching, + call_sid_to_coach=call_sid_to_coach, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ParticipantContext(InstanceContext): + + def __init__( + self, version: Version, account_sid: str, conference_sid: str, call_sid: str + ): + """ + Initialize the ParticipantContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Participant resources to update. + :param conference_sid: The SID of the conference with the participant to update. + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID or label of the participant to update. Non URL safe characters in a label must be percent encoded, for example, a space character is represented as %20. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "conference_sid": conference_sid, + "call_sid": call_sid, + } + self._uri = "/Accounts/{account_sid}/Conferences/{conference_sid}/Participants/{call_sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the ParticipantInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ParticipantInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ParticipantInstance: + """ + Fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ParticipantInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + call_sid=self._solution["call_sid"], + ) + + async def fetch_async(self) -> ParticipantInstance: + """ + Asynchronous coroutine to fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + call_sid=self._solution["call_sid"], + ) + + def update( + self, + muted: Union[bool, object] = values.unset, + hold: Union[bool, object] = values.unset, + hold_url: Union[str, object] = values.unset, + hold_method: Union[str, object] = values.unset, + announce_url: Union[str, object] = values.unset, + announce_method: Union[str, object] = values.unset, + wait_url: Union[str, object] = values.unset, + wait_method: Union[str, object] = values.unset, + beep_on_exit: Union[bool, object] = values.unset, + end_conference_on_exit: Union[bool, object] = values.unset, + coaching: Union[bool, object] = values.unset, + call_sid_to_coach: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Update the ParticipantInstance + + :param muted: Whether the participant should be muted. Can be `true` or `false`. `true` will mute the participant, and `false` will un-mute them. Anything value other than `true` or `false` is interpreted as `false`. + :param hold: Whether the participant should be on hold. Can be: `true` or `false`. `true` puts the participant on hold, and `false` lets them rejoin the conference. + :param hold_url: The URL we call using the `hold_method` for music that plays when the participant is on hold. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param hold_method: The HTTP method we should use to call `hold_url`. Can be: `GET` or `POST` and the default is `GET`. + :param announce_url: The URL we call using the `announce_method` for an announcement to the participant. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param announce_method: The HTTP method we should use to call `announce_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param wait_url: The URL that Twilio calls using the `wait_method` before the conference has started. The URL may return an MP3 file, a WAV file, or a TwiML document. The default value is the URL of our standard hold music. If you do not want anything to play while waiting for the conference to start, specify an empty string by setting `wait_url` to `''`. For more details on the allowable verbs within the `waitUrl`, see the `waitUrl` attribute in the [ TwiML instruction](https://www.twilio.com/docs/voice/twiml/conference#attributes-waiturl). + :param wait_method: The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + :param beep_on_exit: Whether to play a notification beep to the conference when the participant exits. Can be: `true` or `false`. + :param end_conference_on_exit: Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + :param coaching: Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + :param call_sid_to_coach: The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + + :returns: The updated ParticipantInstance + """ + + data = values.of( + { + "Muted": serialize.boolean_to_string(muted), + "Hold": serialize.boolean_to_string(hold), + "HoldUrl": hold_url, + "HoldMethod": hold_method, + "AnnounceUrl": announce_url, + "AnnounceMethod": announce_method, + "WaitUrl": wait_url, + "WaitMethod": wait_method, + "BeepOnExit": serialize.boolean_to_string(beep_on_exit), + "EndConferenceOnExit": serialize.boolean_to_string( + end_conference_on_exit + ), + "Coaching": serialize.boolean_to_string(coaching), + "CallSidToCoach": call_sid_to_coach, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + call_sid=self._solution["call_sid"], + ) + + async def update_async( + self, + muted: Union[bool, object] = values.unset, + hold: Union[bool, object] = values.unset, + hold_url: Union[str, object] = values.unset, + hold_method: Union[str, object] = values.unset, + announce_url: Union[str, object] = values.unset, + announce_method: Union[str, object] = values.unset, + wait_url: Union[str, object] = values.unset, + wait_method: Union[str, object] = values.unset, + beep_on_exit: Union[bool, object] = values.unset, + end_conference_on_exit: Union[bool, object] = values.unset, + coaching: Union[bool, object] = values.unset, + call_sid_to_coach: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Asynchronous coroutine to update the ParticipantInstance + + :param muted: Whether the participant should be muted. Can be `true` or `false`. `true` will mute the participant, and `false` will un-mute them. Anything value other than `true` or `false` is interpreted as `false`. + :param hold: Whether the participant should be on hold. Can be: `true` or `false`. `true` puts the participant on hold, and `false` lets them rejoin the conference. + :param hold_url: The URL we call using the `hold_method` for music that plays when the participant is on hold. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param hold_method: The HTTP method we should use to call `hold_url`. Can be: `GET` or `POST` and the default is `GET`. + :param announce_url: The URL we call using the `announce_method` for an announcement to the participant. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + :param announce_method: The HTTP method we should use to call `announce_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param wait_url: The URL that Twilio calls using the `wait_method` before the conference has started. The URL may return an MP3 file, a WAV file, or a TwiML document. The default value is the URL of our standard hold music. If you do not want anything to play while waiting for the conference to start, specify an empty string by setting `wait_url` to `''`. For more details on the allowable verbs within the `waitUrl`, see the `waitUrl` attribute in the [ TwiML instruction](https://www.twilio.com/docs/voice/twiml/conference#attributes-waiturl). + :param wait_method: The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + :param beep_on_exit: Whether to play a notification beep to the conference when the participant exits. Can be: `true` or `false`. + :param end_conference_on_exit: Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + :param coaching: Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + :param call_sid_to_coach: The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + + :returns: The updated ParticipantInstance + """ + + data = values.of( + { + "Muted": serialize.boolean_to_string(muted), + "Hold": serialize.boolean_to_string(hold), + "HoldUrl": hold_url, + "HoldMethod": hold_method, + "AnnounceUrl": announce_url, + "AnnounceMethod": announce_method, + "WaitUrl": wait_url, + "WaitMethod": wait_method, + "BeepOnExit": serialize.boolean_to_string(beep_on_exit), + "EndConferenceOnExit": serialize.boolean_to_string( + end_conference_on_exit + ), + "Coaching": serialize.boolean_to_string(coaching), + "CallSidToCoach": call_sid_to_coach, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + call_sid=self._solution["call_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ParticipantPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ParticipantInstance: + """ + Build an instance of ParticipantInstance + + :param payload: Payload response from the API + """ + return ParticipantInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ParticipantList(ListResource): + + def __init__(self, version: Version, account_sid: str, conference_sid: str): + """ + Initialize the ParticipantList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Participant resources to read. + :param conference_sid: The SID of the conference with the participants to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "conference_sid": conference_sid, + } + self._uri = "/Accounts/{account_sid}/Conferences/{conference_sid}/Participants.json".format( + **self._solution + ) + + def create( + self, + from_: str, + to: str, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + status_callback_event: Union[List[str], object] = values.unset, + label: Union[str, object] = values.unset, + timeout: Union[int, object] = values.unset, + record: Union[bool, object] = values.unset, + muted: Union[bool, object] = values.unset, + beep: Union[str, object] = values.unset, + start_conference_on_enter: Union[bool, object] = values.unset, + end_conference_on_exit: Union[bool, object] = values.unset, + wait_url: Union[str, object] = values.unset, + wait_method: Union[str, object] = values.unset, + early_media: Union[bool, object] = values.unset, + max_participants: Union[int, object] = values.unset, + conference_record: Union[str, object] = values.unset, + conference_trim: Union[str, object] = values.unset, + conference_status_callback: Union[str, object] = values.unset, + conference_status_callback_method: Union[str, object] = values.unset, + conference_status_callback_event: Union[List[str], object] = values.unset, + recording_channels: Union[str, object] = values.unset, + recording_status_callback: Union[str, object] = values.unset, + recording_status_callback_method: Union[str, object] = values.unset, + sip_auth_username: Union[str, object] = values.unset, + sip_auth_password: Union[str, object] = values.unset, + region: Union[str, object] = values.unset, + conference_recording_status_callback: Union[str, object] = values.unset, + conference_recording_status_callback_method: Union[str, object] = values.unset, + recording_status_callback_event: Union[List[str], object] = values.unset, + conference_recording_status_callback_event: Union[ + List[str], object + ] = values.unset, + coaching: Union[bool, object] = values.unset, + call_sid_to_coach: Union[str, object] = values.unset, + jitter_buffer_size: Union[str, object] = values.unset, + byoc: Union[str, object] = values.unset, + caller_id: Union[str, object] = values.unset, + call_reason: Union[str, object] = values.unset, + recording_track: Union[str, object] = values.unset, + time_limit: Union[int, object] = values.unset, + machine_detection: Union[str, object] = values.unset, + machine_detection_timeout: Union[int, object] = values.unset, + machine_detection_speech_threshold: Union[int, object] = values.unset, + machine_detection_speech_end_threshold: Union[int, object] = values.unset, + machine_detection_silence_timeout: Union[int, object] = values.unset, + amd_status_callback: Union[str, object] = values.unset, + amd_status_callback_method: Union[str, object] = values.unset, + trim: Union[str, object] = values.unset, + call_token: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Create the ParticipantInstance + + :param from_: The phone number, Client identifier, or username portion of SIP address that made this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). Client identifiers are formatted `client:name`. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `from` must also be a phone number. If `to` is sip address, this value of `from` should be a username portion to be used to populate the P-Asserted-Identity header that is passed to the SIP endpoint. + :param to: The phone number, SIP address, or Client identifier that received this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). SIP addresses are formatted as `sip:name@company.com`. Client identifiers are formatted `client:name`. [Custom parameters](https://www.twilio.com/docs/voice/api/conference-participant-resource#custom-parameters) may also be specified. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` and `POST` and defaults to `POST`. + :param status_callback_event: The conference state changes that should generate a call to `status_callback`. Can be: `initiated`, `ringing`, `answered`, and `completed`. Separate multiple values with a space. The default value is `completed`. + :param label: A label for this participant. If one is supplied, it may subsequently be used to fetch, update or delete the participant. + :param timeout: The number of seconds that we should allow the phone to ring before assuming there is no answer. Can be an integer between `5` and `600`, inclusive. The default value is `60`. We always add a 5-second timeout buffer to outgoing calls, so value of 10 would result in an actual timeout that was closer to 15 seconds. + :param record: Whether to record the participant and their conferences, including the time between conferences. Can be `true` or `false` and the default is `false`. + :param muted: Whether the agent is muted in the conference. Can be `true` or `false` and the default is `false`. + :param beep: Whether to play a notification beep to the conference when the participant joins. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + :param start_conference_on_enter: Whether to start the conference when the participant joins, if it has not already started. Can be: `true` or `false` and the default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + :param end_conference_on_exit: Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + :param wait_url: The URL that Twilio calls using the `wait_method` before the conference has started. The URL may return an MP3 file, a WAV file, or a TwiML document. The default value is the URL of our standard hold music. If you do not want anything to play while waiting for the conference to start, specify an empty string by setting `wait_url` to `''`. For more details on the allowable verbs within the `waitUrl`, see the `waitUrl` attribute in the [ TwiML instruction](https://www.twilio.com/docs/voice/twiml/conference#attributes-waiturl). + :param wait_method: The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + :param early_media: Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. Can be: `true` or `false` and defaults to `true`. + :param max_participants: The maximum number of participants in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + :param conference_record: Whether to record the conference the participant is joining. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + :param conference_trim: Whether to trim leading and trailing silence from the conference recording. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + :param conference_status_callback: The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + :param conference_status_callback_method: The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param conference_status_callback_event: The conference state changes that should generate a call to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `modify`, `speaker`, and `announcement`. Separate multiple values with a space. Defaults to `start end`. + :param recording_channels: The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + :param recording_status_callback: The URL that we should call using the `recording_status_callback_method` when the recording status changes. + :param recording_status_callback_method: The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param sip_auth_username: The SIP username used for authentication. + :param sip_auth_password: The SIP password for authentication. + :param region: The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `us2`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + :param conference_recording_status_callback: The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + :param conference_recording_status_callback_method: The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param recording_status_callback_event: The recording state changes that should generate a call to `recording_status_callback`. Can be: `started`, `in-progress`, `paused`, `resumed`, `stopped`, `completed`, `failed`, and `absent`. Separate multiple values with a space, ex: `'in-progress completed failed'`. + :param conference_recording_status_callback_event: The conference recording state changes that generate a call to `conference_recording_status_callback`. Can be: `in-progress`, `completed`, `failed`, and `absent`. Separate multiple values with a space, ex: `'in-progress completed failed'` + :param coaching: Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + :param call_sid_to_coach: The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + :param jitter_buffer_size: Jitter buffer size for the connecting participant. Twilio will use this setting to apply Jitter Buffer before participant's audio is mixed into the conference. Can be: `off`, `small`, `medium`, and `large`. Default to `large`. + :param byoc: The SID of a BYOC (Bring Your Own Carrier) trunk to route this call with. Note that `byoc` is only meaningful when `to` is a phone number; it will otherwise be ignored. (Beta) + :param caller_id: The phone number, Client identifier, or username portion of SIP address that made this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). Client identifiers are formatted `client:name`. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `callerId` must also be a phone number. If `to` is sip address, this value of `callerId` should be a username portion to be used to populate the From header that is passed to the SIP endpoint. + :param call_reason: The Reason for the outgoing call. Use it to specify the purpose of the call that is presented on the called party's phone. (Branded Calls Beta) + :param recording_track: The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is sent from Twilio. `both` records the audio that is received and sent by Twilio. + :param time_limit: The maximum duration of the call in seconds. Constraints depend on account and configuration. + :param machine_detection: Whether to detect if a human, answering machine, or fax has picked up the call. Can be: `Enable` or `DetectMessageEnd`. Use `Enable` if you would like us to return `AnsweredBy` as soon as the called party is identified. Use `DetectMessageEnd`, if you would like to leave a message on an answering machine. For more information, see [Answering Machine Detection](https://www.twilio.com/docs/voice/answering-machine-detection). + :param machine_detection_timeout: The number of seconds that we should attempt to detect an answering machine before timing out and sending a voice request with `AnsweredBy` of `unknown`. The default timeout is 30 seconds. + :param machine_detection_speech_threshold: The number of milliseconds that is used as the measuring stick for the length of the speech activity, where durations lower than this value will be interpreted as a human and longer than this value as a machine. Possible Values: 1000-6000. Default: 2400. + :param machine_detection_speech_end_threshold: The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Possible Values: 500-5000. Default: 1200. + :param machine_detection_silence_timeout: The number of milliseconds of initial silence after which an `unknown` AnsweredBy result will be returned. Possible Values: 2000-10000. Default: 5000. + :param amd_status_callback: The URL that we should call using the `amd_status_callback_method` to notify customer application whether the call was answered by human, machine or fax. + :param amd_status_callback_method: The HTTP method we should use when calling the `amd_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + :param trim: Whether to trim any leading and trailing silence from the participant recording. Can be: `trim-silence` or `do-not-trim` and the default is `trim-silence`. + :param call_token: A token string needed to invoke a forwarded call. A call_token is generated when an incoming call is received on a Twilio number. Pass an incoming call's call_token value to a forwarded call via the call_token parameter when creating a new call. A forwarded call should bear the same CallerID of the original incoming call. + + :returns: The created ParticipantInstance + """ + + data = values.of( + { + "From": from_, + "To": to, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "StatusCallbackEvent": serialize.map( + status_callback_event, lambda e: e + ), + "Label": label, + "Timeout": timeout, + "Record": serialize.boolean_to_string(record), + "Muted": serialize.boolean_to_string(muted), + "Beep": beep, + "StartConferenceOnEnter": serialize.boolean_to_string( + start_conference_on_enter + ), + "EndConferenceOnExit": serialize.boolean_to_string( + end_conference_on_exit + ), + "WaitUrl": wait_url, + "WaitMethod": wait_method, + "EarlyMedia": serialize.boolean_to_string(early_media), + "MaxParticipants": max_participants, + "ConferenceRecord": conference_record, + "ConferenceTrim": conference_trim, + "ConferenceStatusCallback": conference_status_callback, + "ConferenceStatusCallbackMethod": conference_status_callback_method, + "ConferenceStatusCallbackEvent": serialize.map( + conference_status_callback_event, lambda e: e + ), + "RecordingChannels": recording_channels, + "RecordingStatusCallback": recording_status_callback, + "RecordingStatusCallbackMethod": recording_status_callback_method, + "SipAuthUsername": sip_auth_username, + "SipAuthPassword": sip_auth_password, + "Region": region, + "ConferenceRecordingStatusCallback": conference_recording_status_callback, + "ConferenceRecordingStatusCallbackMethod": conference_recording_status_callback_method, + "RecordingStatusCallbackEvent": serialize.map( + recording_status_callback_event, lambda e: e + ), + "ConferenceRecordingStatusCallbackEvent": serialize.map( + conference_recording_status_callback_event, lambda e: e + ), + "Coaching": serialize.boolean_to_string(coaching), + "CallSidToCoach": call_sid_to_coach, + "JitterBufferSize": jitter_buffer_size, + "Byoc": byoc, + "CallerId": caller_id, + "CallReason": call_reason, + "RecordingTrack": recording_track, + "TimeLimit": time_limit, + "MachineDetection": machine_detection, + "MachineDetectionTimeout": machine_detection_timeout, + "MachineDetectionSpeechThreshold": machine_detection_speech_threshold, + "MachineDetectionSpeechEndThreshold": machine_detection_speech_end_threshold, + "MachineDetectionSilenceTimeout": machine_detection_silence_timeout, + "AmdStatusCallback": amd_status_callback, + "AmdStatusCallbackMethod": amd_status_callback_method, + "Trim": trim, + "CallToken": call_token, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + ) + + async def create_async( + self, + from_: str, + to: str, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + status_callback_event: Union[List[str], object] = values.unset, + label: Union[str, object] = values.unset, + timeout: Union[int, object] = values.unset, + record: Union[bool, object] = values.unset, + muted: Union[bool, object] = values.unset, + beep: Union[str, object] = values.unset, + start_conference_on_enter: Union[bool, object] = values.unset, + end_conference_on_exit: Union[bool, object] = values.unset, + wait_url: Union[str, object] = values.unset, + wait_method: Union[str, object] = values.unset, + early_media: Union[bool, object] = values.unset, + max_participants: Union[int, object] = values.unset, + conference_record: Union[str, object] = values.unset, + conference_trim: Union[str, object] = values.unset, + conference_status_callback: Union[str, object] = values.unset, + conference_status_callback_method: Union[str, object] = values.unset, + conference_status_callback_event: Union[List[str], object] = values.unset, + recording_channels: Union[str, object] = values.unset, + recording_status_callback: Union[str, object] = values.unset, + recording_status_callback_method: Union[str, object] = values.unset, + sip_auth_username: Union[str, object] = values.unset, + sip_auth_password: Union[str, object] = values.unset, + region: Union[str, object] = values.unset, + conference_recording_status_callback: Union[str, object] = values.unset, + conference_recording_status_callback_method: Union[str, object] = values.unset, + recording_status_callback_event: Union[List[str], object] = values.unset, + conference_recording_status_callback_event: Union[ + List[str], object + ] = values.unset, + coaching: Union[bool, object] = values.unset, + call_sid_to_coach: Union[str, object] = values.unset, + jitter_buffer_size: Union[str, object] = values.unset, + byoc: Union[str, object] = values.unset, + caller_id: Union[str, object] = values.unset, + call_reason: Union[str, object] = values.unset, + recording_track: Union[str, object] = values.unset, + time_limit: Union[int, object] = values.unset, + machine_detection: Union[str, object] = values.unset, + machine_detection_timeout: Union[int, object] = values.unset, + machine_detection_speech_threshold: Union[int, object] = values.unset, + machine_detection_speech_end_threshold: Union[int, object] = values.unset, + machine_detection_silence_timeout: Union[int, object] = values.unset, + amd_status_callback: Union[str, object] = values.unset, + amd_status_callback_method: Union[str, object] = values.unset, + trim: Union[str, object] = values.unset, + call_token: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Asynchronously create the ParticipantInstance + + :param from_: The phone number, Client identifier, or username portion of SIP address that made this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). Client identifiers are formatted `client:name`. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `from` must also be a phone number. If `to` is sip address, this value of `from` should be a username portion to be used to populate the P-Asserted-Identity header that is passed to the SIP endpoint. + :param to: The phone number, SIP address, or Client identifier that received this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). SIP addresses are formatted as `sip:name@company.com`. Client identifiers are formatted `client:name`. [Custom parameters](https://www.twilio.com/docs/voice/api/conference-participant-resource#custom-parameters) may also be specified. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` and `POST` and defaults to `POST`. + :param status_callback_event: The conference state changes that should generate a call to `status_callback`. Can be: `initiated`, `ringing`, `answered`, and `completed`. Separate multiple values with a space. The default value is `completed`. + :param label: A label for this participant. If one is supplied, it may subsequently be used to fetch, update or delete the participant. + :param timeout: The number of seconds that we should allow the phone to ring before assuming there is no answer. Can be an integer between `5` and `600`, inclusive. The default value is `60`. We always add a 5-second timeout buffer to outgoing calls, so value of 10 would result in an actual timeout that was closer to 15 seconds. + :param record: Whether to record the participant and their conferences, including the time between conferences. Can be `true` or `false` and the default is `false`. + :param muted: Whether the agent is muted in the conference. Can be `true` or `false` and the default is `false`. + :param beep: Whether to play a notification beep to the conference when the participant joins. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + :param start_conference_on_enter: Whether to start the conference when the participant joins, if it has not already started. Can be: `true` or `false` and the default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + :param end_conference_on_exit: Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + :param wait_url: The URL that Twilio calls using the `wait_method` before the conference has started. The URL may return an MP3 file, a WAV file, or a TwiML document. The default value is the URL of our standard hold music. If you do not want anything to play while waiting for the conference to start, specify an empty string by setting `wait_url` to `''`. For more details on the allowable verbs within the `waitUrl`, see the `waitUrl` attribute in the [ TwiML instruction](https://www.twilio.com/docs/voice/twiml/conference#attributes-waiturl). + :param wait_method: The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + :param early_media: Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. Can be: `true` or `false` and defaults to `true`. + :param max_participants: The maximum number of participants in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + :param conference_record: Whether to record the conference the participant is joining. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + :param conference_trim: Whether to trim leading and trailing silence from the conference recording. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + :param conference_status_callback: The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + :param conference_status_callback_method: The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param conference_status_callback_event: The conference state changes that should generate a call to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `modify`, `speaker`, and `announcement`. Separate multiple values with a space. Defaults to `start end`. + :param recording_channels: The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + :param recording_status_callback: The URL that we should call using the `recording_status_callback_method` when the recording status changes. + :param recording_status_callback_method: The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param sip_auth_username: The SIP username used for authentication. + :param sip_auth_password: The SIP password for authentication. + :param region: The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `us2`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + :param conference_recording_status_callback: The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + :param conference_recording_status_callback_method: The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param recording_status_callback_event: The recording state changes that should generate a call to `recording_status_callback`. Can be: `started`, `in-progress`, `paused`, `resumed`, `stopped`, `completed`, `failed`, and `absent`. Separate multiple values with a space, ex: `'in-progress completed failed'`. + :param conference_recording_status_callback_event: The conference recording state changes that generate a call to `conference_recording_status_callback`. Can be: `in-progress`, `completed`, `failed`, and `absent`. Separate multiple values with a space, ex: `'in-progress completed failed'` + :param coaching: Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + :param call_sid_to_coach: The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + :param jitter_buffer_size: Jitter buffer size for the connecting participant. Twilio will use this setting to apply Jitter Buffer before participant's audio is mixed into the conference. Can be: `off`, `small`, `medium`, and `large`. Default to `large`. + :param byoc: The SID of a BYOC (Bring Your Own Carrier) trunk to route this call with. Note that `byoc` is only meaningful when `to` is a phone number; it will otherwise be ignored. (Beta) + :param caller_id: The phone number, Client identifier, or username portion of SIP address that made this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). Client identifiers are formatted `client:name`. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `callerId` must also be a phone number. If `to` is sip address, this value of `callerId` should be a username portion to be used to populate the From header that is passed to the SIP endpoint. + :param call_reason: The Reason for the outgoing call. Use it to specify the purpose of the call that is presented on the called party's phone. (Branded Calls Beta) + :param recording_track: The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is sent from Twilio. `both` records the audio that is received and sent by Twilio. + :param time_limit: The maximum duration of the call in seconds. Constraints depend on account and configuration. + :param machine_detection: Whether to detect if a human, answering machine, or fax has picked up the call. Can be: `Enable` or `DetectMessageEnd`. Use `Enable` if you would like us to return `AnsweredBy` as soon as the called party is identified. Use `DetectMessageEnd`, if you would like to leave a message on an answering machine. For more information, see [Answering Machine Detection](https://www.twilio.com/docs/voice/answering-machine-detection). + :param machine_detection_timeout: The number of seconds that we should attempt to detect an answering machine before timing out and sending a voice request with `AnsweredBy` of `unknown`. The default timeout is 30 seconds. + :param machine_detection_speech_threshold: The number of milliseconds that is used as the measuring stick for the length of the speech activity, where durations lower than this value will be interpreted as a human and longer than this value as a machine. Possible Values: 1000-6000. Default: 2400. + :param machine_detection_speech_end_threshold: The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Possible Values: 500-5000. Default: 1200. + :param machine_detection_silence_timeout: The number of milliseconds of initial silence after which an `unknown` AnsweredBy result will be returned. Possible Values: 2000-10000. Default: 5000. + :param amd_status_callback: The URL that we should call using the `amd_status_callback_method` to notify customer application whether the call was answered by human, machine or fax. + :param amd_status_callback_method: The HTTP method we should use when calling the `amd_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + :param trim: Whether to trim any leading and trailing silence from the participant recording. Can be: `trim-silence` or `do-not-trim` and the default is `trim-silence`. + :param call_token: A token string needed to invoke a forwarded call. A call_token is generated when an incoming call is received on a Twilio number. Pass an incoming call's call_token value to a forwarded call via the call_token parameter when creating a new call. A forwarded call should bear the same CallerID of the original incoming call. + + :returns: The created ParticipantInstance + """ + + data = values.of( + { + "From": from_, + "To": to, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "StatusCallbackEvent": serialize.map( + status_callback_event, lambda e: e + ), + "Label": label, + "Timeout": timeout, + "Record": serialize.boolean_to_string(record), + "Muted": serialize.boolean_to_string(muted), + "Beep": beep, + "StartConferenceOnEnter": serialize.boolean_to_string( + start_conference_on_enter + ), + "EndConferenceOnExit": serialize.boolean_to_string( + end_conference_on_exit + ), + "WaitUrl": wait_url, + "WaitMethod": wait_method, + "EarlyMedia": serialize.boolean_to_string(early_media), + "MaxParticipants": max_participants, + "ConferenceRecord": conference_record, + "ConferenceTrim": conference_trim, + "ConferenceStatusCallback": conference_status_callback, + "ConferenceStatusCallbackMethod": conference_status_callback_method, + "ConferenceStatusCallbackEvent": serialize.map( + conference_status_callback_event, lambda e: e + ), + "RecordingChannels": recording_channels, + "RecordingStatusCallback": recording_status_callback, + "RecordingStatusCallbackMethod": recording_status_callback_method, + "SipAuthUsername": sip_auth_username, + "SipAuthPassword": sip_auth_password, + "Region": region, + "ConferenceRecordingStatusCallback": conference_recording_status_callback, + "ConferenceRecordingStatusCallbackMethod": conference_recording_status_callback_method, + "RecordingStatusCallbackEvent": serialize.map( + recording_status_callback_event, lambda e: e + ), + "ConferenceRecordingStatusCallbackEvent": serialize.map( + conference_recording_status_callback_event, lambda e: e + ), + "Coaching": serialize.boolean_to_string(coaching), + "CallSidToCoach": call_sid_to_coach, + "JitterBufferSize": jitter_buffer_size, + "Byoc": byoc, + "CallerId": caller_id, + "CallReason": call_reason, + "RecordingTrack": recording_track, + "TimeLimit": time_limit, + "MachineDetection": machine_detection, + "MachineDetectionTimeout": machine_detection_timeout, + "MachineDetectionSpeechThreshold": machine_detection_speech_threshold, + "MachineDetectionSpeechEndThreshold": machine_detection_speech_end_threshold, + "MachineDetectionSilenceTimeout": machine_detection_silence_timeout, + "AmdStatusCallback": amd_status_callback, + "AmdStatusCallbackMethod": amd_status_callback_method, + "Trim": trim, + "CallToken": call_token, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + ) + + def stream( + self, + muted: Union[bool, object] = values.unset, + hold: Union[bool, object] = values.unset, + coaching: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ParticipantInstance]: + """ + Streams ParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool muted: Whether to return only participants that are muted. Can be: `true` or `false`. + :param bool hold: Whether to return only participants that are on hold. Can be: `true` or `false`. + :param bool coaching: Whether to return only participants who are coaching another call. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + muted=muted, hold=hold, coaching=coaching, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + muted: Union[bool, object] = values.unset, + hold: Union[bool, object] = values.unset, + coaching: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ParticipantInstance]: + """ + Asynchronously streams ParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool muted: Whether to return only participants that are muted. Can be: `true` or `false`. + :param bool hold: Whether to return only participants that are on hold. Can be: `true` or `false`. + :param bool coaching: Whether to return only participants who are coaching another call. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + muted=muted, hold=hold, coaching=coaching, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + muted: Union[bool, object] = values.unset, + hold: Union[bool, object] = values.unset, + coaching: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantInstance]: + """ + Lists ParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool muted: Whether to return only participants that are muted. Can be: `true` or `false`. + :param bool hold: Whether to return only participants that are on hold. Can be: `true` or `false`. + :param bool coaching: Whether to return only participants who are coaching another call. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + muted=muted, + hold=hold, + coaching=coaching, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + muted: Union[bool, object] = values.unset, + hold: Union[bool, object] = values.unset, + coaching: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantInstance]: + """ + Asynchronously lists ParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool muted: Whether to return only participants that are muted. Can be: `true` or `false`. + :param bool hold: Whether to return only participants that are on hold. Can be: `true` or `false`. + :param bool coaching: Whether to return only participants who are coaching another call. Can be: `true` or `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + muted=muted, + hold=hold, + coaching=coaching, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + muted: Union[bool, object] = values.unset, + hold: Union[bool, object] = values.unset, + coaching: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantPage: + """ + Retrieve a single page of ParticipantInstance records from the API. + Request is executed immediately + + :param muted: Whether to return only participants that are muted. Can be: `true` or `false`. + :param hold: Whether to return only participants that are on hold. Can be: `true` or `false`. + :param coaching: Whether to return only participants who are coaching another call. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantInstance + """ + data = values.of( + { + "Muted": serialize.boolean_to_string(muted), + "Hold": serialize.boolean_to_string(hold), + "Coaching": serialize.boolean_to_string(coaching), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantPage(self._version, response, self._solution) + + async def page_async( + self, + muted: Union[bool, object] = values.unset, + hold: Union[bool, object] = values.unset, + coaching: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantPage: + """ + Asynchronously retrieve a single page of ParticipantInstance records from the API. + Request is executed immediately + + :param muted: Whether to return only participants that are muted. Can be: `true` or `false`. + :param hold: Whether to return only participants that are on hold. Can be: `true` or `false`. + :param coaching: Whether to return only participants who are coaching another call. Can be: `true` or `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantInstance + """ + data = values.of( + { + "Muted": serialize.boolean_to_string(muted), + "Hold": serialize.boolean_to_string(hold), + "Coaching": serialize.boolean_to_string(coaching), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ParticipantPage: + """ + Retrieve a specific page of ParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ParticipantPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ParticipantPage: + """ + Asynchronously retrieve a specific page of ParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ParticipantPage(self._version, response, self._solution) + + def get(self, call_sid: str) -> ParticipantContext: + """ + Constructs a ParticipantContext + + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID or label of the participant to update. Non URL safe characters in a label must be percent encoded, for example, a space character is represented as %20. + """ + return ParticipantContext( + self._version, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + call_sid=call_sid, + ) + + def __call__(self, call_sid: str) -> ParticipantContext: + """ + Constructs a ParticipantContext + + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID or label of the participant to update. Non URL safe characters in a label must be percent encoded, for example, a space character is represented as %20. + """ + return ParticipantContext( + self._version, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + call_sid=call_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/recording.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/recording.py new file mode 100644 index 00000000..12008ed3 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/conference/recording.py @@ -0,0 +1,718 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date, datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RecordingInstance(InstanceResource): + + class Source(object): + DIALVERB = "DialVerb" + CONFERENCE = "Conference" + OUTBOUNDAPI = "OutboundAPI" + TRUNKING = "Trunking" + RECORDVERB = "RecordVerb" + STARTCALLRECORDINGAPI = "StartCallRecordingAPI" + STARTCONFERENCERECORDINGAPI = "StartConferenceRecordingAPI" + + class Status(object): + IN_PROGRESS = "in-progress" + PAUSED = "paused" + STOPPED = "stopped" + PROCESSING = "processing" + COMPLETED = "completed" + ABSENT = "absent" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Conference Recording resource. + :ivar api_version: The API version used to create the recording. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Conference Recording resource is associated with. + :ivar conference_sid: The Conference SID that identifies the conference associated with the recording. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar start_time: The start time of the recording in GMT and in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar duration: The length of the recording in seconds. + :ivar sid: The unique string that that we created to identify the Conference Recording resource. + :ivar price: The one-time cost of creating the recording in the `price_unit` currency. + :ivar price_unit: The currency used in the `price` property. Example: `USD`. + :ivar status: + :ivar channels: The number of channels in the final recording file. Can be: `1`, or `2`. Separating a two leg call into two separate channels of the recording file is supported in [Dial](https://www.twilio.com/docs/voice/twiml/dial#attributes-record) and [Outbound Rest API](https://www.twilio.com/docs/voice/make-calls) record options. + :ivar source: + :ivar error_code: The error code that describes why the recording is `absent`. The error code is described in our [Error Dictionary](https://www.twilio.com/docs/api/errors). This value is null if the recording `status` is not `absent`. + :ivar encryption_details: How to decrypt the recording if it was encrypted using [Call Recording Encryption](https://www.twilio.com/docs/voice/tutorials/voice-recording-encryption) feature. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + conference_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.call_sid: Optional[str] = payload.get("call_sid") + self.conference_sid: Optional[str] = payload.get("conference_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.start_time: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("start_time") + ) + self.duration: Optional[str] = payload.get("duration") + self.sid: Optional[str] = payload.get("sid") + self.price: Optional[str] = payload.get("price") + self.price_unit: Optional[str] = payload.get("price_unit") + self.status: Optional["RecordingInstance.Status"] = payload.get("status") + self.channels: Optional[int] = deserialize.integer(payload.get("channels")) + self.source: Optional["RecordingInstance.Source"] = payload.get("source") + self.error_code: Optional[int] = deserialize.integer(payload.get("error_code")) + self.encryption_details: Optional[Dict[str, object]] = payload.get( + "encryption_details" + ) + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "conference_sid": conference_sid, + "sid": sid or self.sid, + } + self._context: Optional[RecordingContext] = None + + @property + def _proxy(self) -> "RecordingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RecordingContext for this RecordingInstance + """ + if self._context is None: + self._context = RecordingContext( + self._version, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "RecordingInstance": + """ + Fetch the RecordingInstance + + + :returns: The fetched RecordingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "RecordingInstance": + """ + Asynchronous coroutine to fetch the RecordingInstance + + + :returns: The fetched RecordingInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + status: "RecordingInstance.Status", + pause_behavior: Union[str, object] = values.unset, + ) -> "RecordingInstance": + """ + Update the RecordingInstance + + :param status: + :param pause_behavior: Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + + :returns: The updated RecordingInstance + """ + return self._proxy.update( + status=status, + pause_behavior=pause_behavior, + ) + + async def update_async( + self, + status: "RecordingInstance.Status", + pause_behavior: Union[str, object] = values.unset, + ) -> "RecordingInstance": + """ + Asynchronous coroutine to update the RecordingInstance + + :param status: + :param pause_behavior: Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + + :returns: The updated RecordingInstance + """ + return await self._proxy.update_async( + status=status, + pause_behavior=pause_behavior, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RecordingContext(InstanceContext): + + def __init__( + self, version: Version, account_sid: str, conference_sid: str, sid: str + ): + """ + Initialize the RecordingContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Conference Recording resource to update. + :param conference_sid: The Conference SID that identifies the conference associated with the recording to update. + :param sid: The Twilio-provided string that uniquely identifies the Conference Recording resource to update. Use `Twilio.CURRENT` to reference the current active recording. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "conference_sid": conference_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Conferences/{conference_sid}/Recordings/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> RecordingInstance: + """ + Fetch the RecordingInstance + + + :returns: The fetched RecordingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> RecordingInstance: + """ + Asynchronous coroutine to fetch the RecordingInstance + + + :returns: The fetched RecordingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + status: "RecordingInstance.Status", + pause_behavior: Union[str, object] = values.unset, + ) -> RecordingInstance: + """ + Update the RecordingInstance + + :param status: + :param pause_behavior: Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + + :returns: The updated RecordingInstance + """ + + data = values.of( + { + "Status": status, + "PauseBehavior": pause_behavior, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + status: "RecordingInstance.Status", + pause_behavior: Union[str, object] = values.unset, + ) -> RecordingInstance: + """ + Asynchronous coroutine to update the RecordingInstance + + :param status: + :param pause_behavior: Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + + :returns: The updated RecordingInstance + """ + + data = values.of( + { + "Status": status, + "PauseBehavior": pause_behavior, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RecordingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RecordingInstance: + """ + Build an instance of RecordingInstance + + :param payload: Payload response from the API + """ + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RecordingList(ListResource): + + def __init__(self, version: Version, account_sid: str, conference_sid: str): + """ + Initialize the RecordingList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Conference Recording resources to read. + :param conference_sid: The Conference SID that identifies the conference associated with the recording to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "conference_sid": conference_sid, + } + self._uri = "/Accounts/{account_sid}/Conferences/{conference_sid}/Recordings.json".format( + **self._solution + ) + + def stream( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RecordingInstance]: + """ + Streams RecordingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param date date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RecordingInstance]: + """ + Asynchronously streams RecordingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param date date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RecordingInstance]: + """ + Lists RecordingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param date date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RecordingInstance]: + """ + Asynchronously lists RecordingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param date date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RecordingPage: + """ + Retrieve a single page of RecordingInstance records from the API. + Request is executed immediately + + :param date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RecordingInstance + """ + data = values.of( + { + "DateCreated": serialize.iso8601_date(date_created), + "DateCreated<": serialize.iso8601_date(date_created_before), + "DateCreated>": serialize.iso8601_date(date_created_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RecordingPage(self._version, response, self._solution) + + async def page_async( + self, + date_created: Union[date, object] = values.unset, + date_created_before: Union[date, object] = values.unset, + date_created_after: Union[date, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RecordingPage: + """ + Asynchronously retrieve a single page of RecordingInstance records from the API. + Request is executed immediately + + :param date_created: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date_created_before: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param date_created_after: The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RecordingInstance + """ + data = values.of( + { + "DateCreated": serialize.iso8601_date(date_created), + "DateCreated<": serialize.iso8601_date(date_created_before), + "DateCreated>": serialize.iso8601_date(date_created_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RecordingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> RecordingPage: + """ + Retrieve a specific page of RecordingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RecordingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RecordingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> RecordingPage: + """ + Asynchronously retrieve a specific page of RecordingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RecordingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RecordingPage(self._version, response, self._solution) + + def get(self, sid: str) -> RecordingContext: + """ + Constructs a RecordingContext + + :param sid: The Twilio-provided string that uniquely identifies the Conference Recording resource to update. Use `Twilio.CURRENT` to reference the current active recording. + """ + return RecordingContext( + self._version, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> RecordingContext: + """ + Constructs a RecordingContext + + :param sid: The Twilio-provided string that uniquely identifies the Conference Recording resource to update. Use `Twilio.CURRENT` to reference the current active recording. + """ + return RecordingContext( + self._version, + account_sid=self._solution["account_sid"], + conference_sid=self._solution["conference_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/connect_app.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/connect_app.py new file mode 100644 index 00000000..689a2b18 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/connect_app.py @@ -0,0 +1,690 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ConnectAppInstance(InstanceResource): + + class Permission(object): + GET_ALL = "get-all" + POST_ALL = "post-all" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the ConnectApp resource. + :ivar authorize_redirect_url: The URL we redirect the user to after we authenticate the user and obtain authorization to access the Connect App. + :ivar company_name: The company name set for the Connect App. + :ivar deauthorize_callback_method: The HTTP method we use to call `deauthorize_callback_url`. + :ivar deauthorize_callback_url: The URL we call using the `deauthorize_callback_method` to de-authorize the Connect App. + :ivar description: The description of the Connect App. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar homepage_url: The public URL where users can obtain more information about this Connect App. + :ivar permissions: The set of permissions that your ConnectApp requests. + :ivar sid: The unique string that that we created to identify the ConnectApp resource. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.authorize_redirect_url: Optional[str] = payload.get( + "authorize_redirect_url" + ) + self.company_name: Optional[str] = payload.get("company_name") + self.deauthorize_callback_method: Optional[str] = payload.get( + "deauthorize_callback_method" + ) + self.deauthorize_callback_url: Optional[str] = payload.get( + "deauthorize_callback_url" + ) + self.description: Optional[str] = payload.get("description") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.homepage_url: Optional[str] = payload.get("homepage_url") + self.permissions: Optional[List["ConnectAppInstance.Permission"]] = payload.get( + "permissions" + ) + self.sid: Optional[str] = payload.get("sid") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[ConnectAppContext] = None + + @property + def _proxy(self) -> "ConnectAppContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ConnectAppContext for this ConnectAppInstance + """ + if self._context is None: + self._context = ConnectAppContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ConnectAppInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ConnectAppInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ConnectAppInstance": + """ + Fetch the ConnectAppInstance + + + :returns: The fetched ConnectAppInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ConnectAppInstance": + """ + Asynchronous coroutine to fetch the ConnectAppInstance + + + :returns: The fetched ConnectAppInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + authorize_redirect_url: Union[str, object] = values.unset, + company_name: Union[str, object] = values.unset, + deauthorize_callback_method: Union[str, object] = values.unset, + deauthorize_callback_url: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + homepage_url: Union[str, object] = values.unset, + permissions: Union[ + List["ConnectAppInstance.Permission"], object + ] = values.unset, + ) -> "ConnectAppInstance": + """ + Update the ConnectAppInstance + + :param authorize_redirect_url: The URL to redirect the user to after we authenticate the user and obtain authorization to access the Connect App. + :param company_name: The company name to set for the Connect App. + :param deauthorize_callback_method: The HTTP method to use when calling `deauthorize_callback_url`. + :param deauthorize_callback_url: The URL to call using the `deauthorize_callback_method` to de-authorize the Connect App. + :param description: A description of the Connect App. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param homepage_url: A public URL where users can obtain more information about this Connect App. + :param permissions: A comma-separated list of the permissions you will request from the users of this ConnectApp. Can include: `get-all` and `post-all`. + + :returns: The updated ConnectAppInstance + """ + return self._proxy.update( + authorize_redirect_url=authorize_redirect_url, + company_name=company_name, + deauthorize_callback_method=deauthorize_callback_method, + deauthorize_callback_url=deauthorize_callback_url, + description=description, + friendly_name=friendly_name, + homepage_url=homepage_url, + permissions=permissions, + ) + + async def update_async( + self, + authorize_redirect_url: Union[str, object] = values.unset, + company_name: Union[str, object] = values.unset, + deauthorize_callback_method: Union[str, object] = values.unset, + deauthorize_callback_url: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + homepage_url: Union[str, object] = values.unset, + permissions: Union[ + List["ConnectAppInstance.Permission"], object + ] = values.unset, + ) -> "ConnectAppInstance": + """ + Asynchronous coroutine to update the ConnectAppInstance + + :param authorize_redirect_url: The URL to redirect the user to after we authenticate the user and obtain authorization to access the Connect App. + :param company_name: The company name to set for the Connect App. + :param deauthorize_callback_method: The HTTP method to use when calling `deauthorize_callback_url`. + :param deauthorize_callback_url: The URL to call using the `deauthorize_callback_method` to de-authorize the Connect App. + :param description: A description of the Connect App. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param homepage_url: A public URL where users can obtain more information about this Connect App. + :param permissions: A comma-separated list of the permissions you will request from the users of this ConnectApp. Can include: `get-all` and `post-all`. + + :returns: The updated ConnectAppInstance + """ + return await self._proxy.update_async( + authorize_redirect_url=authorize_redirect_url, + company_name=company_name, + deauthorize_callback_method=deauthorize_callback_method, + deauthorize_callback_url=deauthorize_callback_url, + description=description, + friendly_name=friendly_name, + homepage_url=homepage_url, + permissions=permissions, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConnectAppContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the ConnectAppContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the ConnectApp resources to update. + :param sid: The Twilio-provided string that uniquely identifies the ConnectApp resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/ConnectApps/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the ConnectAppInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ConnectAppInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ConnectAppInstance: + """ + Fetch the ConnectAppInstance + + + :returns: The fetched ConnectAppInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ConnectAppInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ConnectAppInstance: + """ + Asynchronous coroutine to fetch the ConnectAppInstance + + + :returns: The fetched ConnectAppInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ConnectAppInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + authorize_redirect_url: Union[str, object] = values.unset, + company_name: Union[str, object] = values.unset, + deauthorize_callback_method: Union[str, object] = values.unset, + deauthorize_callback_url: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + homepage_url: Union[str, object] = values.unset, + permissions: Union[ + List["ConnectAppInstance.Permission"], object + ] = values.unset, + ) -> ConnectAppInstance: + """ + Update the ConnectAppInstance + + :param authorize_redirect_url: The URL to redirect the user to after we authenticate the user and obtain authorization to access the Connect App. + :param company_name: The company name to set for the Connect App. + :param deauthorize_callback_method: The HTTP method to use when calling `deauthorize_callback_url`. + :param deauthorize_callback_url: The URL to call using the `deauthorize_callback_method` to de-authorize the Connect App. + :param description: A description of the Connect App. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param homepage_url: A public URL where users can obtain more information about this Connect App. + :param permissions: A comma-separated list of the permissions you will request from the users of this ConnectApp. Can include: `get-all` and `post-all`. + + :returns: The updated ConnectAppInstance + """ + + data = values.of( + { + "AuthorizeRedirectUrl": authorize_redirect_url, + "CompanyName": company_name, + "DeauthorizeCallbackMethod": deauthorize_callback_method, + "DeauthorizeCallbackUrl": deauthorize_callback_url, + "Description": description, + "FriendlyName": friendly_name, + "HomepageUrl": homepage_url, + "Permissions": serialize.map(permissions, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConnectAppInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + authorize_redirect_url: Union[str, object] = values.unset, + company_name: Union[str, object] = values.unset, + deauthorize_callback_method: Union[str, object] = values.unset, + deauthorize_callback_url: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + homepage_url: Union[str, object] = values.unset, + permissions: Union[ + List["ConnectAppInstance.Permission"], object + ] = values.unset, + ) -> ConnectAppInstance: + """ + Asynchronous coroutine to update the ConnectAppInstance + + :param authorize_redirect_url: The URL to redirect the user to after we authenticate the user and obtain authorization to access the Connect App. + :param company_name: The company name to set for the Connect App. + :param deauthorize_callback_method: The HTTP method to use when calling `deauthorize_callback_url`. + :param deauthorize_callback_url: The URL to call using the `deauthorize_callback_method` to de-authorize the Connect App. + :param description: A description of the Connect App. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param homepage_url: A public URL where users can obtain more information about this Connect App. + :param permissions: A comma-separated list of the permissions you will request from the users of this ConnectApp. Can include: `get-all` and `post-all`. + + :returns: The updated ConnectAppInstance + """ + + data = values.of( + { + "AuthorizeRedirectUrl": authorize_redirect_url, + "CompanyName": company_name, + "DeauthorizeCallbackMethod": deauthorize_callback_method, + "DeauthorizeCallbackUrl": deauthorize_callback_url, + "Description": description, + "FriendlyName": friendly_name, + "HomepageUrl": homepage_url, + "Permissions": serialize.map(permissions, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConnectAppInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConnectAppPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ConnectAppInstance: + """ + Build an instance of ConnectAppInstance + + :param payload: Payload response from the API + """ + return ConnectAppInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ConnectAppList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the ConnectAppList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the ConnectApp resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/ConnectApps.json".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ConnectAppInstance]: + """ + Streams ConnectAppInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ConnectAppInstance]: + """ + Asynchronously streams ConnectAppInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConnectAppInstance]: + """ + Lists ConnectAppInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConnectAppInstance]: + """ + Asynchronously lists ConnectAppInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConnectAppPage: + """ + Retrieve a single page of ConnectAppInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConnectAppInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConnectAppPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConnectAppPage: + """ + Asynchronously retrieve a single page of ConnectAppInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConnectAppInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConnectAppPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ConnectAppPage: + """ + Retrieve a specific page of ConnectAppInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConnectAppInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ConnectAppPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ConnectAppPage: + """ + Asynchronously retrieve a specific page of ConnectAppInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConnectAppInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ConnectAppPage(self._version, response, self._solution) + + def get(self, sid: str) -> ConnectAppContext: + """ + Constructs a ConnectAppContext + + :param sid: The Twilio-provided string that uniquely identifies the ConnectApp resource to update. + """ + return ConnectAppContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ConnectAppContext: + """ + Constructs a ConnectAppContext + + :param sid: The Twilio-provided string that uniquely identifies the ConnectApp resource to update. + """ + return ConnectAppContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__init__.py new file mode 100644 index 00000000..c7c1eebc --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__init__.py @@ -0,0 +1,1310 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.incoming_phone_number.assigned_add_on import ( + AssignedAddOnList, +) +from twilio.rest.api.v2010.account.incoming_phone_number.local import LocalList +from twilio.rest.api.v2010.account.incoming_phone_number.mobile import MobileList +from twilio.rest.api.v2010.account.incoming_phone_number.toll_free import TollFreeList + + +class IncomingPhoneNumberInstance(InstanceResource): + + class AddressRequirement(object): + NONE = "none" + ANY = "any" + LOCAL = "local" + FOREIGN = "foreign" + + class EmergencyAddressStatus(object): + REGISTERED = "registered" + UNREGISTERED = "unregistered" + PENDING_REGISTRATION = "pending-registration" + REGISTRATION_FAILURE = "registration-failure" + PENDING_UNREGISTRATION = "pending-unregistration" + UNREGISTRATION_FAILURE = "unregistration-failure" + + class EmergencyStatus(object): + ACTIVE = "Active" + INACTIVE = "Inactive" + + class VoiceReceiveMode(object): + VOICE = "voice" + FAX = "fax" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this IncomingPhoneNumber resource. + :ivar address_sid: The SID of the Address resource associated with the phone number. + :ivar address_requirements: + :ivar api_version: The API version used to start a new TwiML session. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar identity_sid: The SID of the Identity resource that we associate with the phone number. Some regions require an Identity to meet local regulations. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar origin: The phone number's origin. `twilio` identifies Twilio-owned phone numbers and `hosted` identifies hosted phone numbers. + :ivar sid: The unique string that that we created to identify this IncomingPhoneNumber resource. + :ivar sms_application_sid: The SID of the application that handles SMS messages sent to the phone number. If an `sms_application_sid` is present, we ignore all `sms_*_url` values and use those of the application. + :ivar sms_fallback_method: The HTTP method we use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :ivar sms_fallback_url: The URL that we call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :ivar sms_method: The HTTP method we use to call `sms_url`. Can be: `GET` or `POST`. + :ivar sms_url: The URL we call when the phone number receives an incoming SMS message. + :ivar status_callback: The URL we call using the `status_callback_method` to send status information to your application. + :ivar status_callback_method: The HTTP method we use to call `status_callback`. Can be: `GET` or `POST`. + :ivar trunk_sid: The SID of the Trunk that handles calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar voice_receive_mode: + :ivar voice_application_sid: The SID of the application that handles calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :ivar voice_caller_id_lookup: Whether we look up the caller's caller-ID name from the CNAM database ($0.01 per look up). Can be: `true` or `false`. + :ivar voice_fallback_method: The HTTP method we use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :ivar voice_fallback_url: The URL that we call when an error occurs retrieving or executing the TwiML requested by `url`. + :ivar voice_method: The HTTP method we use to call `voice_url`. Can be: `GET` or `POST`. + :ivar voice_url: The URL we call when the phone number receives a call. The `voice_url` will not be used if a `voice_application_sid` or a `trunk_sid` is set. + :ivar emergency_status: + :ivar emergency_address_sid: The SID of the emergency address configuration that we use for emergency calling from this phone number. + :ivar emergency_address_status: + :ivar bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + :ivar status: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.address_sid: Optional[str] = payload.get("address_sid") + self.address_requirements: Optional[ + "IncomingPhoneNumberInstance.AddressRequirement" + ] = payload.get("address_requirements") + self.api_version: Optional[str] = payload.get("api_version") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.identity_sid: Optional[str] = payload.get("identity_sid") + self.phone_number: Optional[str] = payload.get("phone_number") + self.origin: Optional[str] = payload.get("origin") + self.sid: Optional[str] = payload.get("sid") + self.sms_application_sid: Optional[str] = payload.get("sms_application_sid") + self.sms_fallback_method: Optional[str] = payload.get("sms_fallback_method") + self.sms_fallback_url: Optional[str] = payload.get("sms_fallback_url") + self.sms_method: Optional[str] = payload.get("sms_method") + self.sms_url: Optional[str] = payload.get("sms_url") + self.status_callback: Optional[str] = payload.get("status_callback") + self.status_callback_method: Optional[str] = payload.get( + "status_callback_method" + ) + self.trunk_sid: Optional[str] = payload.get("trunk_sid") + self.uri: Optional[str] = payload.get("uri") + self.voice_receive_mode: Optional[ + "IncomingPhoneNumberInstance.VoiceReceiveMode" + ] = payload.get("voice_receive_mode") + self.voice_application_sid: Optional[str] = payload.get("voice_application_sid") + self.voice_caller_id_lookup: Optional[bool] = payload.get( + "voice_caller_id_lookup" + ) + self.voice_fallback_method: Optional[str] = payload.get("voice_fallback_method") + self.voice_fallback_url: Optional[str] = payload.get("voice_fallback_url") + self.voice_method: Optional[str] = payload.get("voice_method") + self.voice_url: Optional[str] = payload.get("voice_url") + self.emergency_status: Optional[ + "IncomingPhoneNumberInstance.EmergencyStatus" + ] = payload.get("emergency_status") + self.emergency_address_sid: Optional[str] = payload.get("emergency_address_sid") + self.emergency_address_status: Optional[ + "IncomingPhoneNumberInstance.EmergencyAddressStatus" + ] = payload.get("emergency_address_status") + self.bundle_sid: Optional[str] = payload.get("bundle_sid") + self.status: Optional[str] = payload.get("status") + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[IncomingPhoneNumberContext] = None + + @property + def _proxy(self) -> "IncomingPhoneNumberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: IncomingPhoneNumberContext for this IncomingPhoneNumberInstance + """ + if self._context is None: + self._context = IncomingPhoneNumberContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the IncomingPhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the IncomingPhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "IncomingPhoneNumberInstance": + """ + Fetch the IncomingPhoneNumberInstance + + + :returns: The fetched IncomingPhoneNumberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "IncomingPhoneNumberInstance": + """ + Asynchronous coroutine to fetch the IncomingPhoneNumberInstance + + + :returns: The fetched IncomingPhoneNumberInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + account_sid: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + emergency_status: Union[ + "IncomingPhoneNumberInstance.EmergencyStatus", object + ] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "IncomingPhoneNumberInstance.VoiceReceiveMode", object + ] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + bundle_sid: Union[str, object] = values.unset, + ) -> "IncomingPhoneNumberInstance": + """ + Update the IncomingPhoneNumberInstance + + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IncomingPhoneNumber resource to update. For more information, see [Exchanging Numbers Between Subaccounts](https://www.twilio.com/docs/iam/api/subaccounts#exchanging-numbers). + :param api_version: The API version to use for incoming calls made to the phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe this phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle phone calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from this phone number. + :param trunk_sid: The SID of the Trunk we should use to handle phone calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param voice_receive_mode: + :param identity_sid: The SID of the Identity resource that we should associate with the phone number. Some regions require an identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the phone number. Some regions require addresses to meet local regulations. + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + + :returns: The updated IncomingPhoneNumberInstance + """ + return self._proxy.update( + account_sid=account_sid, + api_version=api_version, + friendly_name=friendly_name, + sms_application_sid=sms_application_sid, + sms_fallback_method=sms_fallback_method, + sms_fallback_url=sms_fallback_url, + sms_method=sms_method, + sms_url=sms_url, + status_callback=status_callback, + status_callback_method=status_callback_method, + voice_application_sid=voice_application_sid, + voice_caller_id_lookup=voice_caller_id_lookup, + voice_fallback_method=voice_fallback_method, + voice_fallback_url=voice_fallback_url, + voice_method=voice_method, + voice_url=voice_url, + emergency_status=emergency_status, + emergency_address_sid=emergency_address_sid, + trunk_sid=trunk_sid, + voice_receive_mode=voice_receive_mode, + identity_sid=identity_sid, + address_sid=address_sid, + bundle_sid=bundle_sid, + ) + + async def update_async( + self, + account_sid: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + emergency_status: Union[ + "IncomingPhoneNumberInstance.EmergencyStatus", object + ] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "IncomingPhoneNumberInstance.VoiceReceiveMode", object + ] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + bundle_sid: Union[str, object] = values.unset, + ) -> "IncomingPhoneNumberInstance": + """ + Asynchronous coroutine to update the IncomingPhoneNumberInstance + + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IncomingPhoneNumber resource to update. For more information, see [Exchanging Numbers Between Subaccounts](https://www.twilio.com/docs/iam/api/subaccounts#exchanging-numbers). + :param api_version: The API version to use for incoming calls made to the phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe this phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle phone calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from this phone number. + :param trunk_sid: The SID of the Trunk we should use to handle phone calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param voice_receive_mode: + :param identity_sid: The SID of the Identity resource that we should associate with the phone number. Some regions require an identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the phone number. Some regions require addresses to meet local regulations. + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + + :returns: The updated IncomingPhoneNumberInstance + """ + return await self._proxy.update_async( + account_sid=account_sid, + api_version=api_version, + friendly_name=friendly_name, + sms_application_sid=sms_application_sid, + sms_fallback_method=sms_fallback_method, + sms_fallback_url=sms_fallback_url, + sms_method=sms_method, + sms_url=sms_url, + status_callback=status_callback, + status_callback_method=status_callback_method, + voice_application_sid=voice_application_sid, + voice_caller_id_lookup=voice_caller_id_lookup, + voice_fallback_method=voice_fallback_method, + voice_fallback_url=voice_fallback_url, + voice_method=voice_method, + voice_url=voice_url, + emergency_status=emergency_status, + emergency_address_sid=emergency_address_sid, + trunk_sid=trunk_sid, + voice_receive_mode=voice_receive_mode, + identity_sid=identity_sid, + address_sid=address_sid, + bundle_sid=bundle_sid, + ) + + @property + def assigned_add_ons(self) -> AssignedAddOnList: + """ + Access the assigned_add_ons + """ + return self._proxy.assigned_add_ons + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class IncomingPhoneNumberContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the IncomingPhoneNumberContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IncomingPhoneNumber resource to update. For more information, see [Exchanging Numbers Between Subaccounts](https://www.twilio.com/docs/iam/api/subaccounts#exchanging-numbers). + :param sid: The Twilio-provided string that uniquely identifies the IncomingPhoneNumber resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/IncomingPhoneNumbers/{sid}.json".format( + **self._solution + ) + + self._assigned_add_ons: Optional[AssignedAddOnList] = None + + def delete(self) -> bool: + """ + Deletes the IncomingPhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the IncomingPhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> IncomingPhoneNumberInstance: + """ + Fetch the IncomingPhoneNumberInstance + + + :returns: The fetched IncomingPhoneNumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return IncomingPhoneNumberInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> IncomingPhoneNumberInstance: + """ + Asynchronous coroutine to fetch the IncomingPhoneNumberInstance + + + :returns: The fetched IncomingPhoneNumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return IncomingPhoneNumberInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + account_sid: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + emergency_status: Union[ + "IncomingPhoneNumberInstance.EmergencyStatus", object + ] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "IncomingPhoneNumberInstance.VoiceReceiveMode", object + ] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + bundle_sid: Union[str, object] = values.unset, + ) -> IncomingPhoneNumberInstance: + """ + Update the IncomingPhoneNumberInstance + + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IncomingPhoneNumber resource to update. For more information, see [Exchanging Numbers Between Subaccounts](https://www.twilio.com/docs/iam/api/subaccounts#exchanging-numbers). + :param api_version: The API version to use for incoming calls made to the phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe this phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle phone calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from this phone number. + :param trunk_sid: The SID of the Trunk we should use to handle phone calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param voice_receive_mode: + :param identity_sid: The SID of the Identity resource that we should associate with the phone number. Some regions require an identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the phone number. Some regions require addresses to meet local regulations. + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + + :returns: The updated IncomingPhoneNumberInstance + """ + + data = values.of( + { + "AccountSid": account_sid, + "ApiVersion": api_version, + "FriendlyName": friendly_name, + "SmsApplicationSid": sms_application_sid, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceApplicationSid": voice_application_sid, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + "EmergencyStatus": emergency_status, + "EmergencyAddressSid": emergency_address_sid, + "TrunkSid": trunk_sid, + "VoiceReceiveMode": voice_receive_mode, + "IdentitySid": identity_sid, + "AddressSid": address_sid, + "BundleSid": bundle_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IncomingPhoneNumberInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + account_sid: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + emergency_status: Union[ + "IncomingPhoneNumberInstance.EmergencyStatus", object + ] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "IncomingPhoneNumberInstance.VoiceReceiveMode", object + ] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + bundle_sid: Union[str, object] = values.unset, + ) -> IncomingPhoneNumberInstance: + """ + Asynchronous coroutine to update the IncomingPhoneNumberInstance + + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IncomingPhoneNumber resource to update. For more information, see [Exchanging Numbers Between Subaccounts](https://www.twilio.com/docs/iam/api/subaccounts#exchanging-numbers). + :param api_version: The API version to use for incoming calls made to the phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe this phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle phone calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from this phone number. + :param trunk_sid: The SID of the Trunk we should use to handle phone calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param voice_receive_mode: + :param identity_sid: The SID of the Identity resource that we should associate with the phone number. Some regions require an identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the phone number. Some regions require addresses to meet local regulations. + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + + :returns: The updated IncomingPhoneNumberInstance + """ + + data = values.of( + { + "AccountSid": account_sid, + "ApiVersion": api_version, + "FriendlyName": friendly_name, + "SmsApplicationSid": sms_application_sid, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceApplicationSid": voice_application_sid, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + "EmergencyStatus": emergency_status, + "EmergencyAddressSid": emergency_address_sid, + "TrunkSid": trunk_sid, + "VoiceReceiveMode": voice_receive_mode, + "IdentitySid": identity_sid, + "AddressSid": address_sid, + "BundleSid": bundle_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IncomingPhoneNumberInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + @property + def assigned_add_ons(self) -> AssignedAddOnList: + """ + Access the assigned_add_ons + """ + if self._assigned_add_ons is None: + self._assigned_add_ons = AssignedAddOnList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._assigned_add_ons + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class IncomingPhoneNumberPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> IncomingPhoneNumberInstance: + """ + Build an instance of IncomingPhoneNumberInstance + + :param payload: Payload response from the API + """ + return IncomingPhoneNumberInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class IncomingPhoneNumberList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the IncomingPhoneNumberList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IncomingPhoneNumber resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/IncomingPhoneNumbers.json".format( + **self._solution + ) + + self._local: Optional[LocalList] = None + self._mobile: Optional[MobileList] = None + self._toll_free: Optional[TollFreeList] = None + + def create( + self, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + emergency_status: Union[ + "IncomingPhoneNumberInstance.EmergencyStatus", object + ] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "IncomingPhoneNumberInstance.VoiceReceiveMode", object + ] = values.unset, + bundle_sid: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + area_code: Union[str, object] = values.unset, + ) -> IncomingPhoneNumberInstance: + """ + Create the IncomingPhoneNumberInstance + + :param api_version: The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the new phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the new phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from the new phone number. + :param trunk_sid: The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param identity_sid: The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + :param voice_receive_mode: + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + :param phone_number: The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + :param area_code: The desired area code for your new incoming phone number. Can be any three-digit, US or Canada area code. We will provision an available phone number within this area code for you. **You must provide an `area_code` or a `phone_number`.** (US and Canada only). + + :returns: The created IncomingPhoneNumberInstance + """ + + data = values.of( + { + "ApiVersion": api_version, + "FriendlyName": friendly_name, + "SmsApplicationSid": sms_application_sid, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceApplicationSid": voice_application_sid, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + "EmergencyStatus": emergency_status, + "EmergencyAddressSid": emergency_address_sid, + "TrunkSid": trunk_sid, + "IdentitySid": identity_sid, + "AddressSid": address_sid, + "VoiceReceiveMode": voice_receive_mode, + "BundleSid": bundle_sid, + "PhoneNumber": phone_number, + "AreaCode": area_code, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IncomingPhoneNumberInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + emergency_status: Union[ + "IncomingPhoneNumberInstance.EmergencyStatus", object + ] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "IncomingPhoneNumberInstance.VoiceReceiveMode", object + ] = values.unset, + bundle_sid: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + area_code: Union[str, object] = values.unset, + ) -> IncomingPhoneNumberInstance: + """ + Asynchronously create the IncomingPhoneNumberInstance + + :param api_version: The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the new phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the new phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from the new phone number. + :param trunk_sid: The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param identity_sid: The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + :param voice_receive_mode: + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + :param phone_number: The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + :param area_code: The desired area code for your new incoming phone number. Can be any three-digit, US or Canada area code. We will provision an available phone number within this area code for you. **You must provide an `area_code` or a `phone_number`.** (US and Canada only). + + :returns: The created IncomingPhoneNumberInstance + """ + + data = values.of( + { + "ApiVersion": api_version, + "FriendlyName": friendly_name, + "SmsApplicationSid": sms_application_sid, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceApplicationSid": voice_application_sid, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + "EmergencyStatus": emergency_status, + "EmergencyAddressSid": emergency_address_sid, + "TrunkSid": trunk_sid, + "IdentitySid": identity_sid, + "AddressSid": address_sid, + "VoiceReceiveMode": voice_receive_mode, + "BundleSid": bundle_sid, + "PhoneNumber": phone_number, + "AreaCode": area_code, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IncomingPhoneNumberInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[IncomingPhoneNumberInstance]: + """ + Streams IncomingPhoneNumberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the IncomingPhoneNumber resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[IncomingPhoneNumberInstance]: + """ + Asynchronously streams IncomingPhoneNumberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the IncomingPhoneNumber resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[IncomingPhoneNumberInstance]: + """ + Lists IncomingPhoneNumberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the IncomingPhoneNumber resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[IncomingPhoneNumberInstance]: + """ + Asynchronously lists IncomingPhoneNumberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the IncomingPhoneNumber resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> IncomingPhoneNumberPage: + """ + Retrieve a single page of IncomingPhoneNumberInstance records from the API. + Request is executed immediately + + :param beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param friendly_name: A string that identifies the IncomingPhoneNumber resources to read. + :param phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of IncomingPhoneNumberInstance + """ + data = values.of( + { + "Beta": serialize.boolean_to_string(beta), + "FriendlyName": friendly_name, + "PhoneNumber": phone_number, + "Origin": origin, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return IncomingPhoneNumberPage(self._version, response, self._solution) + + async def page_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> IncomingPhoneNumberPage: + """ + Asynchronously retrieve a single page of IncomingPhoneNumberInstance records from the API. + Request is executed immediately + + :param beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param friendly_name: A string that identifies the IncomingPhoneNumber resources to read. + :param phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of IncomingPhoneNumberInstance + """ + data = values.of( + { + "Beta": serialize.boolean_to_string(beta), + "FriendlyName": friendly_name, + "PhoneNumber": phone_number, + "Origin": origin, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return IncomingPhoneNumberPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> IncomingPhoneNumberPage: + """ + Retrieve a specific page of IncomingPhoneNumberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of IncomingPhoneNumberInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return IncomingPhoneNumberPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> IncomingPhoneNumberPage: + """ + Asynchronously retrieve a specific page of IncomingPhoneNumberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of IncomingPhoneNumberInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return IncomingPhoneNumberPage(self._version, response, self._solution) + + @property + def local(self) -> LocalList: + """ + Access the local + """ + if self._local is None: + self._local = LocalList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._local + + @property + def mobile(self) -> MobileList: + """ + Access the mobile + """ + if self._mobile is None: + self._mobile = MobileList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._mobile + + @property + def toll_free(self) -> TollFreeList: + """ + Access the toll_free + """ + if self._toll_free is None: + self._toll_free = TollFreeList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._toll_free + + def get(self, sid: str) -> IncomingPhoneNumberContext: + """ + Constructs a IncomingPhoneNumberContext + + :param sid: The Twilio-provided string that uniquely identifies the IncomingPhoneNumber resource to update. + """ + return IncomingPhoneNumberContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> IncomingPhoneNumberContext: + """ + Constructs a IncomingPhoneNumberContext + + :param sid: The Twilio-provided string that uniquely identifies the IncomingPhoneNumber resource to update. + """ + return IncomingPhoneNumberContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8045f73b13d5af893aa684920a53d35061c59bbb GIT binary patch literal 65081 zcmeHw4RjmVb>`rgAPD~d{|`lx6h#uGD2cKu*$(yRD55D@l$?ZC0ztq~f&>E00F+D# zYJF^PD(xn<-Lw(2n>KVdt;O1{q_(GWw%aDo?zY)Ycb5p$5{u)UI@_L}w%hH2LuHd_ z&;ES(y_vxb2#}I2Cw797`0(DHJMX=@^ZxFA_uc!g;$o+O>oeazar(;}O~PMOLcMHC zWTng`2v-HaFd_I&esj8F^I2?zIU`FdjPVUDWcA#D0{#|fe;~>#<70(Pc|$YaU~ty${CjFS-KM0&kM9}{OiA4ZNy|uRHfh}(@I{l>(Lf}c zbR3$F2Erk4Fljp$LL})p5T%9?mXpOJk=c+>O?F$7MSdwF$pLRLa6w8IrlaNCB{L%N?lloR7;nGTb+Xiv3hT^6NvRT)y%hE$CqRclDq z8B+CzRD&VaXh<~~Qq6``3sPlT%~}ojL_@00klJ8KwM(`Bjan`phI^fcR2MKeX_(!H zdz%fZ9z&|cFH8>jdtb0k)cq{CmHfM{H6G-9l5P}vcRi^OJ*ghES&7tu*~_h)(Ha4B z0@jaNtLd`vjA^2ITd_oe#gB=rfw`KWGNCkB7JHmAWKtH2uq<5%1&CmSR2`bw8Tgj zOon9%>yI(4nH(NZ$U7x@JV~d=GZpsF1S#(Fcs_-NmU72Bc4%xLR##&mPufNg?HL(O z7VJNCWZ!|u#}Eq|Z0iQI2)m`-XIVp7R z_-Nqd@kk&l^-X(yXR#ED9FMZaWk2d1?Z-;6|J>lfmVth+&ljEvMf(E^`8?A^KTn7e zu;1eegaT2I$2~optXTcRasz7AhQCM+f)|8DY4v4mqNMV&B~ey;*_Nniyiy={;g;Nu zAp2+7h&#DIgWon$;I~gWW(&FVKSePeqMj6Lq*up=W!4;&gxR_Rlo{UZlPj~&^UtWj~* z92D#tV_L`c^lTy`Z|w=X)Hl(6mLMMq1b z?cunih3B~q*x5g774EG5sI!)C>z$sv`iRQcvyb?qfpZd=iIA7Y#=32pl(moSIeOr! zeZU#xvCOwF)!v%tDi5J{{rHQx5a4yo>o40AmCaWi{Izxhde5)byVh$xMV<4AWS+E{l@S|+{EWO*aoQ-==h!6>kQ>i5G5$PuGnJ2XK_Df zdQBNgO+w6kM*p;e>DMq~f`@WrR}NgWnj3Jf>)={+xLUb6^0n%4@h<$zfos#@g2h`C z*RI2LsJPKeHFkzNK*p7$)B-gp^%oQMwGnmd>smwJ6l#7O#Wr)Zvz_ zgIlD-EnNrKrNb>-2e(*UHW+p~Izl zm0daVt<>Sxu7g{p!>wBfw_1lwQU-SAs6&komlgzT;nwPK8`r_D)8W!$ja@nFP_M&n zUI({9hug9aZleyDW^{Jts6&$uS5#1Qjg8GZTv{KnD@VR9I@}HG;I`^;+t)>wC;nD(xT`^0{`iv>!!fYX&(cVJ63!zr~7tI)_XcfXPKkz)XXkpi^ z(7ka?-iJ75F23$&Ggp_Cm}Thz6uc(nXR?k586J zP_3k9rU~dz7Ej6nEDVFQY_Xnn1^if32comAJePiToV17Kz^On;-cR+aj7&v5-sx$` zaoI|e;WOYQ#Hc5+3inJ&(bHjnvWze_;EWthItilOEuc67OCbTp3f2QQf<2zB$pENN z6h`Hl&{;l{&&Yvf1zTKrWWL@YPD4sob695mYB-pRkYrE5?+J#(XJ@8Wbghy~-ISa) zFjdpVvrsS!d5Uh7fhXcCau2U~vN{b>zZ)$->au{9#rw$_d8S5 z1&1kkl7b@?&^MOHDL6{OF$$id;G-0LjDn9-FhRl76db4E6BK-s0uKczDDYBnk^)*~ z%6C@r)j0AsvmpHFS>bkxP*`%MAnvG}tNo6n?d{E5uJ`NPWT(*9u zFad;}3p;Q8!cxzE%Deupft||(qw#^!gsYNroGV#!b*)&;Tb%6nZM(2#*IEcDvv1q= zg9``WC|&CPFg??-s*Kfuj^07#mNsld+L0K1_*T!& zp2bJUmj;hgo?;eA|Iqb|3l|r6KC#q4MmWuh?t$x#3yn99FLm!mE~SaizE{t_a`r~| zQs*wDT?zO0>t`3vE)E}Da*xszO^NNhZasbT>4a+|-gt<;aXVfJ`4lY_-8i_k=|gy~ zB(rup>h~_W`V{K70*veq-aNSYp^q+Y`xq6lAu;sGt+O}J@&a~f1+2!~^3biun~jT) zJh`;x2tC=lnr55&4YktMV)K%#N2x_~wp!>=2bWx171R!Z(Xb2@%lIz9XzEH-*8Iw2 za~r?3=?k0Qu~{1M5}zqaIfTddm@ZpCTg*70q+OPxGjhnMuqkNUfYN%V%qfU-Y^jaRloCPL1{Ht*CMy?iTAxl22=Gyw)BF+8bdh>;VIk?p9r-CkqwGTyNBLm_QHlN znWzG_~wx-Zf_4?T{H$m#RutCmmOY{Iy(L->sKcP!^k-R3*LqP->Cz&2C7xBl^4z>c&b_&b{T zLH?SCt53iD^m27yyt;3xx_`N}f6>vuSlWMQg~SNYwRD;0O&!)(Y+a`Jpdm*zs_&Pg zzSC@wS>sKzH)9M;lk_ykskNR}M^=@pHulgeaz2ZI+@#lAAyMABpJM8gFmBx_7DCy`X62GA;Z&N**k^h0oyGihKw|lBys$}UaTlsK2MMEo1fUE>KvUv zf8Nb^o!r=)>-UF!k^X>pitRorId$Vv45A7vo~u40Hm#V>53M>lqwW^P{aEr$VS5eh z6k5hGuDe%^NRs&UzGr-=y&>@Cr$oLL7!h|%(esiN631u2i?g?g++9s0=?B^+E#E%A zLl)`gYF2FJqtGZVeBd-9tt@3Z!s?HSlvZm2WycLGvtTeHPI;k0r!1)h+?<)F8V+p}L0uV(LhLGt!Eor5TiiX1ELat3;fXBp-%GEF&qB(8 z>ia8g#ZZ9OD3wN*MUb+pvFQXE{Cy&)!!tp@h_4QTfjIuexHyH)S=#tSiwHrnjW1VK znjV;>RrHB0MV+9kPou%%sb29sTGy!%H8Ol8wWYJiHj|L%goprd8uE)X_^c4`AdE;+ zF­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 z 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 +-__SjmD*=NCIZ_q&oDz8qe$DJ= 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 "IpAddressContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: IpAddressContext for this IpAddressInstance + """ + if self._context is None: + self._context = IpAddressContext( + self._version, + account_sid=self._solution["account_sid"], + ip_access_control_list_sid=self._solution["ip_access_control_list_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the IpAddressInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the IpAddressInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "IpAddressInstance": + """ + Fetch the IpAddressInstance + + + :returns: The fetched IpAddressInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "IpAddressInstance": + """ + Asynchronous coroutine to fetch the IpAddressInstance + + + :returns: The fetched IpAddressInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + ip_address: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + cidr_prefix_length: Union[int, object] = values.unset, + ) -> "IpAddressInstance": + """ + Update the IpAddressInstance + + :param ip_address: An IP address in dotted decimal notation from which you want to accept traffic. Any SIP requests from this IP address will be allowed by Twilio. IPv4 only supported today. + :param friendly_name: A human readable descriptive text for this resource, up to 255 characters long. + :param cidr_prefix_length: An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + + :returns: The updated IpAddressInstance + """ + return self._proxy.update( + ip_address=ip_address, + friendly_name=friendly_name, + cidr_prefix_length=cidr_prefix_length, + ) + + async def update_async( + self, + ip_address: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + cidr_prefix_length: Union[int, object] = values.unset, + ) -> "IpAddressInstance": + """ + Asynchronous coroutine to update the IpAddressInstance + + :param ip_address: An IP address in dotted decimal notation from which you want to accept traffic. Any SIP requests from this IP address will be allowed by Twilio. IPv4 only supported today. + :param friendly_name: A human readable descriptive text for this resource, up to 255 characters long. + :param cidr_prefix_length: An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + + :returns: The updated IpAddressInstance + """ + return await self._proxy.update_async( + ip_address=ip_address, + friendly_name=friendly_name, + cidr_prefix_length=cidr_prefix_length, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class IpAddressContext(InstanceContext): + + def __init__( + self, + version: Version, + account_sid: str, + ip_access_control_list_sid: str, + sid: str, + ): + """ + Initialize the IpAddressContext + + :param version: Version that contains the resource + :param account_sid: The unique id of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this resource. + :param ip_access_control_list_sid: The IpAccessControlList Sid that identifies the IpAddress resources to update. + :param sid: A 34 character string that identifies the IpAddress resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "ip_access_control_list_sid": ip_access_control_list_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SIP/IpAccessControlLists/{ip_access_control_list_sid}/IpAddresses/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the IpAddressInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the IpAddressInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> IpAddressInstance: + """ + Fetch the IpAddressInstance + + + :returns: The fetched IpAddressInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return IpAddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + ip_access_control_list_sid=self._solution["ip_access_control_list_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> IpAddressInstance: + """ + Asynchronous coroutine to fetch the IpAddressInstance + + + :returns: The fetched IpAddressInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return IpAddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + ip_access_control_list_sid=self._solution["ip_access_control_list_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + ip_address: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + cidr_prefix_length: Union[int, object] = values.unset, + ) -> IpAddressInstance: + """ + Update the IpAddressInstance + + :param ip_address: An IP address in dotted decimal notation from which you want to accept traffic. Any SIP requests from this IP address will be allowed by Twilio. IPv4 only supported today. + :param friendly_name: A human readable descriptive text for this resource, up to 255 characters long. + :param cidr_prefix_length: An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + + :returns: The updated IpAddressInstance + """ + + data = values.of( + { + "IpAddress": ip_address, + "FriendlyName": friendly_name, + "CidrPrefixLength": cidr_prefix_length, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IpAddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + ip_access_control_list_sid=self._solution["ip_access_control_list_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + ip_address: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + cidr_prefix_length: Union[int, object] = values.unset, + ) -> IpAddressInstance: + """ + Asynchronous coroutine to update the IpAddressInstance + + :param ip_address: An IP address in dotted decimal notation from which you want to accept traffic. Any SIP requests from this IP address will be allowed by Twilio. IPv4 only supported today. + :param friendly_name: A human readable descriptive text for this resource, up to 255 characters long. + :param cidr_prefix_length: An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + + :returns: The updated IpAddressInstance + """ + + data = values.of( + { + "IpAddress": ip_address, + "FriendlyName": friendly_name, + "CidrPrefixLength": cidr_prefix_length, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IpAddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + ip_access_control_list_sid=self._solution["ip_access_control_list_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class IpAddressPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> IpAddressInstance: + """ + Build an instance of IpAddressInstance + + :param payload: Payload response from the API + """ + return IpAddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + ip_access_control_list_sid=self._solution["ip_access_control_list_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class IpAddressList(ListResource): + + def __init__( + self, version: Version, account_sid: str, ip_access_control_list_sid: str + ): + """ + Initialize the IpAddressList + + :param version: Version that contains the resource + :param account_sid: The unique id of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this resource. + :param ip_access_control_list_sid: The IpAccessControlList Sid that identifies the IpAddress resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "ip_access_control_list_sid": ip_access_control_list_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/IpAccessControlLists/{ip_access_control_list_sid}/IpAddresses.json".format( + **self._solution + ) + + def create( + self, + friendly_name: str, + ip_address: str, + cidr_prefix_length: Union[int, object] = values.unset, + ) -> IpAddressInstance: + """ + Create the IpAddressInstance + + :param friendly_name: A human readable descriptive text for this resource, up to 255 characters long. + :param ip_address: An IP address in dotted decimal notation from which you want to accept traffic. Any SIP requests from this IP address will be allowed by Twilio. IPv4 only supported today. + :param cidr_prefix_length: An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + + :returns: The created IpAddressInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "IpAddress": ip_address, + "CidrPrefixLength": cidr_prefix_length, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IpAddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + ip_access_control_list_sid=self._solution["ip_access_control_list_sid"], + ) + + async def create_async( + self, + friendly_name: str, + ip_address: str, + cidr_prefix_length: Union[int, object] = values.unset, + ) -> IpAddressInstance: + """ + Asynchronously create the IpAddressInstance + + :param friendly_name: A human readable descriptive text for this resource, up to 255 characters long. + :param ip_address: An IP address in dotted decimal notation from which you want to accept traffic. Any SIP requests from this IP address will be allowed by Twilio. IPv4 only supported today. + :param cidr_prefix_length: An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + + :returns: The created IpAddressInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "IpAddress": ip_address, + "CidrPrefixLength": cidr_prefix_length, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IpAddressInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + ip_access_control_list_sid=self._solution["ip_access_control_list_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[IpAddressInstance]: + """ + Streams IpAddressInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[IpAddressInstance]: + """ + Asynchronously streams IpAddressInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[IpAddressInstance]: + """ + Lists IpAddressInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[IpAddressInstance]: + """ + Asynchronously lists IpAddressInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> IpAddressPage: + """ + Retrieve a single page of IpAddressInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of IpAddressInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return IpAddressPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> IpAddressPage: + """ + Asynchronously retrieve a single page of IpAddressInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of IpAddressInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return IpAddressPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> IpAddressPage: + """ + Retrieve a specific page of IpAddressInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of IpAddressInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return IpAddressPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> IpAddressPage: + """ + Asynchronously retrieve a specific page of IpAddressInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of IpAddressInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return IpAddressPage(self._version, response, self._solution) + + def get(self, sid: str) -> IpAddressContext: + """ + Constructs a IpAddressContext + + :param sid: A 34 character string that identifies the IpAddress resource to update. + """ + return IpAddressContext( + self._version, + account_sid=self._solution["account_sid"], + ip_access_control_list_sid=self._solution["ip_access_control_list_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> IpAddressContext: + """ + Constructs a IpAddressContext + + :param sid: A 34 character string that identifies the IpAddress resource to update. + """ + return IpAddressContext( + self._version, + account_sid=self._solution["account_sid"], + ip_access_control_list_sid=self._solution["ip_access_control_list_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/token.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/token.py new file mode 100644 index 00000000..fa43360f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/token.py @@ -0,0 +1,146 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class TokenInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Token resource. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar ice_servers: An array representing the ephemeral credentials and the STUN and TURN server URIs. + :ivar password: The temporary password that the username will use when authenticating with Twilio. + :ivar ttl: The duration in seconds for which the username and password are valid. + :ivar username: The temporary username that uniquely identifies a Token. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.ice_servers: Optional[List[str]] = payload.get("ice_servers") + self.password: Optional[str] = payload.get("password") + self.ttl: Optional[str] = payload.get("ttl") + self.username: Optional[str] = payload.get("username") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TokenList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the TokenList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that will create the resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Tokens.json".format(**self._solution) + + def create(self, ttl: Union[int, object] = values.unset) -> TokenInstance: + """ + Create the TokenInstance + + :param ttl: The duration in seconds for which the generated credentials are valid. The default value is 86400 (24 hours). + + :returns: The created TokenInstance + """ + + data = values.of( + { + "Ttl": ttl, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TokenInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, ttl: Union[int, object] = values.unset + ) -> TokenInstance: + """ + Asynchronously create the TokenInstance + + :param ttl: The duration in seconds for which the generated credentials are valid. The default value is 86400 (24 hours). + + :returns: The created TokenInstance + """ + + data = values.of( + { + "Ttl": ttl, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TokenInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/transcription.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/transcription.py new file mode 100644 index 00000000..386ff9ee --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/transcription.py @@ -0,0 +1,504 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class TranscriptionInstance(InstanceResource): + + class Status(object): + IN_PROGRESS = "in-progress" + COMPLETED = "completed" + FAILED = "failed" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Transcription resource. + :ivar api_version: The API version used to create the transcription. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar duration: The duration of the transcribed audio in seconds. + :ivar price: The charge for the transcript in the currency associated with the account. This value is populated after the transcript is complete so it may not be available immediately. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g. `usd`, `eur`, `jpy`). + :ivar recording_sid: The SID of the [Recording](https://www.twilio.com/docs/voice/api/recording) from which the transcription was created. + :ivar sid: The unique string that that we created to identify the Transcription resource. + :ivar status: + :ivar transcription_text: The text content of the transcription. + :ivar type: The transcription type. Can only be: `fast`. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.duration: Optional[str] = payload.get("duration") + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.recording_sid: Optional[str] = payload.get("recording_sid") + self.sid: Optional[str] = payload.get("sid") + self.status: Optional["TranscriptionInstance.Status"] = payload.get("status") + self.transcription_text: Optional[str] = payload.get("transcription_text") + self.type: Optional[str] = payload.get("type") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[TranscriptionContext] = None + + @property + def _proxy(self) -> "TranscriptionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: TranscriptionContext for this TranscriptionInstance + """ + if self._context is None: + self._context = TranscriptionContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the TranscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the TranscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "TranscriptionInstance": + """ + Fetch the TranscriptionInstance + + + :returns: The fetched TranscriptionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "TranscriptionInstance": + """ + Asynchronous coroutine to fetch the TranscriptionInstance + + + :returns: The fetched TranscriptionInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TranscriptionContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the TranscriptionContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Transcription resource to fetch. + :param sid: The Twilio-provided string that uniquely identifies the Transcription resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Transcriptions/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the TranscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the TranscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> TranscriptionInstance: + """ + Fetch the TranscriptionInstance + + + :returns: The fetched TranscriptionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return TranscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> TranscriptionInstance: + """ + Asynchronous coroutine to fetch the TranscriptionInstance + + + :returns: The fetched TranscriptionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return TranscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TranscriptionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> TranscriptionInstance: + """ + Build an instance of TranscriptionInstance + + :param payload: Payload response from the API + """ + return TranscriptionInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class TranscriptionList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the TranscriptionList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Transcription resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Transcriptions.json".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[TranscriptionInstance]: + """ + Streams TranscriptionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[TranscriptionInstance]: + """ + Asynchronously streams TranscriptionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TranscriptionInstance]: + """ + Lists TranscriptionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TranscriptionInstance]: + """ + Asynchronously lists TranscriptionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TranscriptionPage: + """ + Retrieve a single page of TranscriptionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TranscriptionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TranscriptionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TranscriptionPage: + """ + Asynchronously retrieve a single page of TranscriptionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TranscriptionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TranscriptionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> TranscriptionPage: + """ + Retrieve a specific page of TranscriptionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TranscriptionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return TranscriptionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> TranscriptionPage: + """ + Asynchronously retrieve a specific page of TranscriptionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TranscriptionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return TranscriptionPage(self._version, response, self._solution) + + def get(self, sid: str) -> TranscriptionContext: + """ + Constructs a TranscriptionContext + + :param sid: The Twilio-provided string that uniquely identifies the Transcription resource to fetch. + """ + return TranscriptionContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> TranscriptionContext: + """ + Constructs a TranscriptionContext + + :param sid: The Twilio-provided string that uniquely identifies the Transcription resource to fetch. + """ + return TranscriptionContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/__init__.py new file mode 100644 index 00000000..8fe80f64 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/__init__.py @@ -0,0 +1,74 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.api.v2010.account.usage.record import RecordList +from twilio.rest.api.v2010.account.usage.trigger import TriggerList + + +class UsageList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the UsageList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageRecord resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage.json".format(**self._solution) + + self._records: Optional[RecordList] = None + self._triggers: Optional[TriggerList] = None + + @property + def records(self) -> RecordList: + """ + Access the records + """ + if self._records is None: + self._records = RecordList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._records + + @property + def triggers(self) -> TriggerList: + """ + Access the triggers + """ + if self._triggers is None: + self._triggers = TriggerList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._triggers + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e0912f38905f28f7a4faf54f9217652ad4ae41c GIT binary patch literal 3108 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__init__.py new file mode 100644 index 00000000..d60bde9b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__init__.py @@ -0,0 +1,1316 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.usage.record.all_time import AllTimeList +from twilio.rest.api.v2010.account.usage.record.daily import DailyList +from twilio.rest.api.v2010.account.usage.record.last_month import LastMonthList +from twilio.rest.api.v2010.account.usage.record.monthly import MonthlyList +from twilio.rest.api.v2010.account.usage.record.this_month import ThisMonthList +from twilio.rest.api.v2010.account.usage.record.today import TodayList +from twilio.rest.api.v2010.account.usage.record.yearly import YearlyList +from twilio.rest.api.v2010.account.usage.record.yesterday import YesterdayList + + +class RecordInstance(InstanceResource): + + class Category(object): + A2P_10DLC_REGISTRATIONFEES_BRANDREGISTRATION = ( + "a2p-10dlc-registrationfees-brandregistration" + ) + A2P_10DLC_REGISTRATIONFEES_BV = "a2p-10dlc-registrationfees-bv" + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNCHARGES = ( + "a2p-10dlc-registrationfees-campaigncharges" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNREGISTRATION = ( + "a2p-10dlc-registrationfees-campaignregistration" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNVETTING = ( + "a2p-10dlc-registrationfees-campaignvetting" + ) + A2P_10DLC_REGISTRATIONFEES_MONTHLY = "a2p-10dlc-registrationfees-monthly" + A2P_10DLC_REGISTRATIONFEES_ONETIME = "a2p-10dlc-registrationfees-onetime" + A2P_REGISTRATION_FEES = "a2p-registration-fees" + ACCOUNT_SECURITY = "account-security" + AGENT_CONFERENCE = "agent-conference" + AGENT_COPILOT = "agent-copilot" + AGENT_COPILOT_MESSAGES = "agent-copilot-messages" + AGENT_COPILOT_PARTICIPANT_MINUTES = "agent-copilot-participant-minutes" + AI_ASSISTANTS = "ai-assistants" + AI_ASSISTANTS_VOICE = "ai-assistants-voice" + AMAZON_POLLY = "amazon-polly" + ANSWERING_MACHINE_DETECTION = "answering-machine-detection" + ASSETS = "assets" + AUDIENCE_MINUTES = "audience-minutes" + AUDIENCE_MINUTES_AUDIO = "audience-minutes-audio" + AUTHY_AUTHENTICATIONS = "authy-authentications" + AUTHY_CALLS_OUTBOUND = "authy-calls-outbound" + AUTHY_EMAIL_AUTHENTICATIONS = "authy-email-authentications" + AUTHY_MONTHLY_FEES = "authy-monthly-fees" + AUTHY_OUTBOUND_EMAIL = "authy-outbound-email" + AUTHY_PHONE_INTELLIGENCE = "authy-phone-intelligence" + AUTHY_PHONE_VERIFICATIONS = "authy-phone-verifications" + AUTHY_SMS_OUTBOUND = "authy-sms-outbound" + AUTHY_VERIFY_EMAIL_VERIFICATIONS = "authy-verify-email-verifications" + AUTHY_VERIFY_OUTBOUND_EMAIL = "authy-verify-outbound-email" + AUTOPILOT = "autopilot" + AUTOPILOT_HOME_ASSISTANTS = "autopilot-home-assistants" + AUTOPILOT_MESSAGING = "autopilot-messaging" + AUTOPILOT_OTHER = "autopilot-other" + AUTOPILOT_VOICE = "autopilot-voice" + BASIC_PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "basic-peer-to-peer-rooms-participant-minutes" + ) + BRANDED_CALLING = "branded-calling" + BUNDLE_SMS_BUCKET = "bundle-sms-bucket" + BUNDLE_SUBSCRIPTION_FEES = "bundle-subscription-fees" + CALL_FORWARDING_LOOKUPS = "call-forwarding-lookups" + CALL_PROGESS_EVENTS = "call-progess-events" + CALLERIDLOOKUPS = "calleridlookups" + CALLS = "calls" + CALLS_CLIENT = "calls-client" + CALLS_EMERGENCY = "calls-emergency" + CALLS_GLOBALCONFERENCE = "calls-globalconference" + CALLS_INBOUND = "calls-inbound" + CALLS_INBOUND_LOCAL = "calls-inbound-local" + CALLS_INBOUND_MOBILE = "calls-inbound-mobile" + CALLS_INBOUND_TOLLFREE = "calls-inbound-tollfree" + CALLS_INBOUND_TOLLFREE_LOCAL = "calls-inbound-tollfree-local" + CALLS_INBOUND_TOLLFREE_MOBILE = "calls-inbound-tollfree-mobile" + CALLS_MEDIA_STREAM_MINUTES = "calls-media-stream-minutes" + CALLS_OUTBOUND = "calls-outbound" + CALLS_PAY_VERB_TRANSACTIONS = "calls-pay-verb-transactions" + CALLS_RECORDINGS = "calls-recordings" + CALLS_SIP = "calls-sip" + CALLS_SIP_INBOUND = "calls-sip-inbound" + CALLS_SIP_OUTBOUND = "calls-sip-outbound" + CALLS_TEXT_TO_SPEECH = "calls-text-to-speech" + CALLS_TRANSFERS = "calls-transfers" + CARRIER_LOOKUPS = "carrier-lookups" + CATEGORY = "category" + CHANNELS = "channels" + CHANNELS_MESSAGING = "channels-messaging" + CHANNELS_MESSAGING_INBOUND = "channels-messaging-inbound" + CHANNELS_MESSAGING_OUTBOUND = "channels-messaging-outbound" + CHANNELS_WHATSAPP = "channels-whatsapp" + CHANNELS_WHATSAPP_CONVERSATION_AUTHENTICATION = ( + "channels-whatsapp-conversation-authentication" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE = "channels-whatsapp-conversation-free" + CHANNELS_WHATSAPP_CONVERSATION_MARKETING = ( + "channels-whatsapp-conversation-marketing" + ) + CHANNELS_WHATSAPP_CONVERSATION_SERVICE = ( + "channels-whatsapp-conversation-service" + ) + CHANNELS_WHATSAPP_CONVERSATION_UTILITY = ( + "channels-whatsapp-conversation-utility" + ) + CHANNELS_WHATSAPP_INBOUND = "channels-whatsapp-inbound" + CHANNELS_WHATSAPP_OUTBOUND = "channels-whatsapp-outbound" + CHAT_VIRTUAL_AGENT = "chat-virtual-agent" + CONVERSATION_RELAY = "conversation-relay" + CONVERSATIONS = "conversations" + CONVERSATIONS_API_REQUESTS = "conversations-api-requests" + CONVERSATIONS_CONVERSATION_EVENTS = "conversations-conversation-events" + CONVERSATIONS_ENDPOINT_CONNECTIVITY = "conversations-endpoint-connectivity" + CONVERSATIONS_EVENTS = "conversations-events" + CONVERSATIONS_PARTICIPANT_EVENTS = "conversations-participant-events" + CONVERSATIONS_PARTICIPANTS = "conversations-participants" + CPS = "cps" + CREDIT_TRANSFER = "credit-transfer" + EMAIL = "email" + EMERGING_TECH = "emerging-tech" + ENGAGEMENT_SUITE_PACKAGED_PLANS = "engagement-suite-packaged-plans" + ENHANCED_LINE_TYPE_LOOKUPS = "enhanced-line-type-lookups" + ENTERPRISE = "enterprise" + EVENTS = "events" + EXPERIMENT_FRANCE_SMS = "experiment-france-sms" + EXPERIMENT_INDIA_SMS = "experiment-india-sms" + EXPERIMENT_UK_SMS = "experiment-uk-sms" + FAILED_MESSAGE_PROCESSING_FEE = "failed-message-processing-fee" + FLEX = "flex" + FLEX_ACTIVE_USER_HOURS = "flex-active-user-hours" + FLEX_CONCURRENT_USERS = "flex-concurrent-users" + FLEX_CONVERSATIONAL_INSIGHTS = "flex-conversational-insights" + FLEX_CONVERSATIONAL_INSIGHTS_MESSAGES = "flex-conversational-insights-messages" + FLEX_CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = ( + "flex-conversational-insights-voice-minutes" + ) + FLEX_EMAIL_USAGE = "flex-email-usage" + FLEX_MESSAGING_USAGE = "flex-messaging-usage" + FLEX_PARTNER_SPINSCI = "flex-partner-spinsci" + FLEX_PARTNER_XCELERATE = "flex-partner-xcelerate" + FLEX_RESELLER_ECOSYSTEM = "flex-reseller-ecosystem" + FLEX_UNIQUE_USER = "flex-unique-user" + FLEX_USAGE = "flex-usage" + FLEX_USERS = "flex-users" + FLEX_VOICE_MINUTE = "flex-voice-minute" + FLEX_YTICA = "flex-ytica" + FRAUD_LOOKUPS = "fraud-lookups" + FRONTLINE = "frontline" + FRONTLINE_USERS = "frontline-users" + FUNCTIONS = "functions" + GENERIC_PAY_TRANSACTIONS = "generic-pay-transactions" + GROUP_ROOMS = "group-rooms" + GROUP_ROOMS_DATA_TRACK = "group-rooms-data-track" + GROUP_ROOMS_ENCRYPTED_MEDIA_RECORDED = "group-rooms-encrypted-media-recorded" + GROUP_ROOMS_MEDIA_DOWNLOADED = "group-rooms-media-downloaded" + GROUP_ROOMS_MEDIA_RECORDED = "group-rooms-media-recorded" + GROUP_ROOMS_MEDIA_ROUTED = "group-rooms-media-routed" + GROUP_ROOMS_MEDIA_STORED = "group-rooms-media-stored" + GROUP_ROOMS_PARTICIPANT_MINUTES = "group-rooms-participant-minutes" + GROUP_ROOMS_RECORDED_MINUTES = "group-rooms-recorded-minutes" + IP_MESSAGING = "ip-messaging" + IP_MESSAGING_COMMANDS = "ip-messaging-commands" + IP_MESSAGING_DATA_STORAGE = "ip-messaging-data-storage" + IP_MESSAGING_DATA_TRANSFER = "ip-messaging-data-transfer" + IP_MESSAGING_ENDPOINT_CONNECTIVITY = "ip-messaging-endpoint-connectivity" + IVR_VIRTUAL_AGENT_CUSTOM_VOICES = "ivr-virtual-agent-custom-voices" + IVR_VIRTUAL_AGENT_GENAI = "ivr-virtual-agent-genai" + LINE_STATUS_LOOKUPS = "line-status-lookups" + LIVE_ACTIVITY_LOOKUPS = "live-activity-lookups" + LOOKUP_BUCKET_ADJUSTMENT = "lookup-bucket-adjustment" + LOOKUP_IDENTITY_MATCH = "lookup-identity-match" + LOOKUPS = "lookups" + MARKETPLACE = "marketplace" + MARKETPLACE_ALGORITHMIA_NAMED_ENTITY_RECOGNITION = ( + "marketplace-algorithmia-named-entity-recognition" + ) + MARKETPLACE_CADENCE_TRANSCRIPTION = "marketplace-cadence-transcription" + MARKETPLACE_CADENCE_TRANSLATION = "marketplace-cadence-translation" + MARKETPLACE_CAPIO_SPEECH_TO_TEXT = "marketplace-capio-speech-to-text" + MARKETPLACE_CONVRIZA_ABABA = "marketplace-convriza-ababa" + MARKETPLACE_DEEPGRAM_PHRASE_DETECTOR = "marketplace-deepgram-phrase-detector" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION = "marketplace-deepgram-transcription" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION_BASE = ( + "marketplace-deepgram-transcription-base" + ) + MARKETPLACE_DEEPGRAM_TRANSSCRIPTION_ENHANCED = ( + "marketplace-deepgram-transscription-enhanced" + ) + MARKETPLACE_DIGITAL_SEGMENT_BUSINESS_INFO = ( + "marketplace-digital-segment-business-info" + ) + MARKETPLACE_FACEBOOK_OFFLINE_CONVERSIONS = ( + "marketplace-facebook-offline-conversions" + ) + MARKETPLACE_GOOGLE_SPEECH_TO_TEXT = "marketplace-google-speech-to-text" + MARKETPLACE_IBM_WATSON_MESSAGE_INSIGHTS = ( + "marketplace-ibm-watson-message-insights" + ) + MARKETPLACE_IBM_WATSON_MESSAGE_SENTIMENT = ( + "marketplace-ibm-watson-message-sentiment" + ) + MARKETPLACE_IBM_WATSON_RECORDING_ANALYSIS = ( + "marketplace-ibm-watson-recording-analysis" + ) + MARKETPLACE_IBM_WATSON_TONE_ANALYZER = "marketplace-ibm-watson-tone-analyzer" + MARKETPLACE_ICEHOOK_SYSTEMS_SCOUT = "marketplace-icehook-systems-scout" + MARKETPLACE_INFOGROUP_DATAAXLE_BIZINFO = ( + "marketplace-infogroup-dataaxle-bizinfo" + ) + MARKETPLACE_KEEN_IO_CONTACT_CENTER_ANALYTICS = ( + "marketplace-keen-io-contact-center-analytics" + ) + MARKETPLACE_MARCHEX_CLEANCALL = "marketplace-marchex-cleancall" + MARKETPLACE_MARCHEX_RECORDING_ANALYSIS = ( + "marketplace-marchex-recording-analysis" + ) + MARKETPLACE_MARCHEX_SENTIMENT_ANALYSIS_FOR_SMS = ( + "marketplace-marchex-sentiment-analysis-for-sms" + ) + MARKETPLACE_MARKETPLACE_NEXTCALLER_SOCIAL_ID = ( + "marketplace-marketplace-nextcaller-social-id" + ) + MARKETPLACE_MOBILE_COMMONS_OPT_OUT_CLASSIFIER = ( + "marketplace-mobile-commons-opt-out-classifier" + ) + MARKETPLACE_NEXIWAVE_VOICEMAIL_TO_TEXT = ( + "marketplace-nexiwave-voicemail-to-text" + ) + MARKETPLACE_NEXTCALLER_ADVANCED_CALLER_IDENTIFICATION = ( + "marketplace-nextcaller-advanced-caller-identification" + ) + MARKETPLACE_NOMOROBO_SPAM_SCORE = "marketplace-nomorobo-spam-score" + MARKETPLACE_PAY_ADDONS = "marketplace-pay-addons" + MARKETPLACE_PAY_ADDONS_BASECOMMERCE_PAY_CONNECTOR = ( + "marketplace-pay-addons-basecommerce-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_BRAINTREE_PAY_CONNECTOR = ( + "marketplace-pay-addons-braintree-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CARDCONNECT_PAY_CONNECTOR = ( + "marketplace-pay-addons-cardconnect-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CHASE_PAY_CONNECTOR = ( + "marketplace-pay-addons-chase-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplace-pay-addons-shuttle-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplace-pay-addons-stripe-pay-connector" + ) + MARKETPLACE_PAYFONE_TCPA_COMPLIANCE = "marketplace-payfone-tcpa-compliance" + MARKETPLACE_POLY_AI_CONNECTOR = "marketplace-poly-ai-connector" + MARKETPLACE_REALPHONEVALIDATION = "marketplace-realphonevalidation" + MARKETPLACE_REMEETING_AUTOMATIC_SPEECH_RECOGNITION = ( + "marketplace-remeeting-automatic-speech-recognition" + ) + MARKETPLACE_SPOKE_PHONE_LICENSE_PRO = "marketplace-spoke-phone-license-pro" + MARKETPLACE_SPOKE_PHONE_LICENSE_STANDARD = ( + "marketplace-spoke-phone-license-standard" + ) + MARKETPLACE_TCPA_DEFENSE_SOLUTIONS_BLACKLIST_FEED = ( + "marketplace-tcpa-defense-solutions-blacklist-feed" + ) + MARKETPLACE_TELO_OPENCNAM = "marketplace-telo-opencnam" + MARKETPLACE_TRESTLE_SOLUTIONS_CALLER_IDENTIFICATION = ( + "marketplace-trestle-solutions-caller-identification" + ) + MARKETPLACE_TRUECNAM_TRUE_SPAM = "marketplace-truecnam-true-spam" + MARKETPLACE_TWILIO_CALLER_NAME_LOOKUP_US = ( + "marketplace-twilio-caller-name-lookup-us" + ) + MARKETPLACE_TWILIO_CARRIER_INFORMATION_LOOKUP = ( + "marketplace-twilio-carrier-information-lookup" + ) + MARKETPLACE_VOICEBASE_PCI = "marketplace-voicebase-pci" + MARKETPLACE_VOICEBASE_TRANSCRIPTION = "marketplace-voicebase-transcription" + MARKETPLACE_VOICEBASE_TRANSCRIPTION_CUSTOM_VOCABULARY = ( + "marketplace-voicebase-transcription-custom-vocabulary" + ) + MARKETPLACE_WEB_PURIFY_PROFANITY_FILTER = ( + "marketplace-web-purify-profanity-filter" + ) + MARKETPLACE_WHITEPAGES_PRO_CALLER_IDENTIFICATION = ( + "marketplace-whitepages-pro-caller-identification" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_INTELLIGENCE = ( + "marketplace-whitepages-pro-phone-intelligence" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_REPUTATION = ( + "marketplace-whitepages-pro-phone-reputation" + ) + MARKETPLACE_WOLFARM_SPOKEN_RESULTS = "marketplace-wolfarm-spoken-results" + MARKETPLACE_WOLFRAM_SHORT_ANSWER = "marketplace-wolfram-short-answer" + MARKETPLACE_YTICA_CONTACT_CENTER_REPORTING_ANALYTICS = ( + "marketplace-ytica-contact-center-reporting-analytics" + ) + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplay-pay-addons-shuttle-pay-connector" + ) + MEDIA_COMPOSER_MINUTES = "media-composer-minutes" + MEDIASTORAGE = "mediastorage" + MIN_SPEND_ADJUSTMENTS = "min-spend-adjustments" + MMS = "mms" + MMS_INBOUND = "mms-inbound" + MMS_INBOUND_LONGCODE = "mms-inbound-longcode" + MMS_INBOUND_SHORTCODE = "mms-inbound-shortcode" + MMS_INBOUND_TOLL_FREE = "mms-inbound-toll-free" + MMS_MESSAGES_CARRIERFEES = "mms-messages-carrierfees" + MMS_OUTBOUND = "mms-outbound" + MMS_OUTBOUND_LONGCODE = "mms-outbound-longcode" + MMS_OUTBOUND_SHORTCODE = "mms-outbound-shortcode" + MMS_OUTBOUND_TOLLFREE = "mms-outbound-tollfree" + MONITOR = "monitor" + MONITOR_READS = "monitor-reads" + MONITOR_STORAGE = "monitor-storage" + MONITOR_WRITES = "monitor-writes" + NOTIFY = "notify" + NOTIFY_ACTIONS_ATTEMPTS = "notify-actions-attempts" + NOTIFY_CHANNELS = "notify-channels" + NUMBER_FORMAT_LOOKUPS = "number-format-lookups" + PCHAT = "pchat" + PCHAT_ACTIONS = "pchat-actions" + PCHAT_APS = "pchat-aps" + PCHAT_CONV_MED_STORAGE = "pchat-conv-med-storage" + PCHAT_MESSAGES = "pchat-messages" + PCHAT_NOTIFICATIONS = "pchat-notifications" + PCHAT_READS = "pchat-reads" + PCHAT_USERS = "pchat-users" + PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "peer-to-peer-rooms-participant-minutes" + ) + PFAX = "pfax" + PFAX_MINUTES = "pfax-minutes" + PFAX_MINUTES_INBOUND = "pfax-minutes-inbound" + PFAX_MINUTES_OUTBOUND = "pfax-minutes-outbound" + PFAX_PAGES = "pfax-pages" + PHONE_QUALITY_SCORE_LOOKUPS = "phone-quality-score-lookups" + PHONENUMBERS = "phonenumbers" + PHONENUMBERS_CPS = "phonenumbers-cps" + PHONENUMBERS_EMERGENCY = "phonenumbers-emergency" + PHONENUMBERS_LOCAL = "phonenumbers-local" + PHONENUMBERS_MOBILE = "phonenumbers-mobile" + PHONENUMBERS_PORTING = "phonenumbers-porting" + PHONENUMBERS_SETUPS = "phonenumbers-setups" + PHONENUMBERS_TOLLFREE = "phonenumbers-tollfree" + PREMIUMSUPPORT = "premiumsupport" + PREMIUMSUPPORT_PERCENTAGE_SPEND = "premiumsupport-percentage-spend" + PROGRAMMABLEVOICE_PLATFORM = "programmablevoice-platform" + PROGRAMMABLEVOICECONN_CLIENTSDK = "programmablevoiceconn-clientsdk" + PROGRAMMABLEVOICECONN_CLIENTSDK_INBOUND = ( + "programmablevoiceconn-clientsdk-inbound" + ) + PROGRAMMABLEVOICECONN_CLIENTSDK_OUTBOUND = ( + "programmablevoiceconn-clientsdk-outbound" + ) + PROGRAMMABLEVOICECONN_ONNET = "programmablevoiceconn-onnet" + PROGRAMMABLEVOICECONN_ONNET_INBOUND = "programmablevoiceconn-onnet-inbound" + PROGRAMMABLEVOICECONN_ONNET_OUTBOUND = "programmablevoiceconn-onnet-outbound" + PROGRAMMABLEVOICECONN_SIP = "programmablevoiceconn-sip" + PROGRAMMABLEVOICECONN_SIP_INBOUND = "programmablevoiceconn-sip-inbound" + PROGRAMMABLEVOICECONN_SIP_OUTBOUND = "programmablevoiceconn-sip-outbound" + PROGRAMMABLEVOICECONNECTIVITY = "programmablevoiceconnectivity" + PROXY = "proxy" + PROXY_ACTIVE_SESSIONS = "proxy-active-sessions" + PROXY_BUCKET_ADJUSTMENT = "proxy-bucket-adjustment" + PROXY_LICENSES = "proxy-licenses" + PSTNCONNECTIVITY = "pstnconnectivity" + PSTNCONNECTIVITY_INBOUND = "pstnconnectivity-inbound" + PSTNCONNECTIVITY_OUTBOUND = "pstnconnectivity-outbound" + PV = "pv" + PV_BASIC_ROOMS = "pv-basic-rooms" + PV_COMPOSITION_MEDIA_DOWNLOADED = "pv-composition-media-downloaded" + PV_COMPOSITION_MEDIA_ENCRYPTED = "pv-composition-media-encrypted" + PV_COMPOSITION_MEDIA_STORED = "pv-composition-media-stored" + PV_COMPOSITION_MINUTES = "pv-composition-minutes" + PV_RECORDING_COMPOSITIONS = "pv-recording-compositions" + PV_ROOM_PARTICIPANTS = "pv-room-participants" + PV_ROOM_PARTICIPANTS_AU1 = "pv-room-participants-au1" + PV_ROOM_PARTICIPANTS_BR1 = "pv-room-participants-br1" + PV_ROOM_PARTICIPANTS_IE1 = "pv-room-participants-ie1" + PV_ROOM_PARTICIPANTS_JP1 = "pv-room-participants-jp1" + PV_ROOM_PARTICIPANTS_SG1 = "pv-room-participants-sg1" + PV_ROOM_PARTICIPANTS_US1 = "pv-room-participants-us1" + PV_ROOM_PARTICIPANTS_US2 = "pv-room-participants-us2" + PV_ROOMS = "pv-rooms" + PV_SIP_ENDPOINT_REGISTRATIONS = "pv-sip-endpoint-registrations" + RCS_MESSAGES = "rcs-messages" + REASSIGNED_NUMBER = "reassigned-number" + RECORDINGS = "recordings" + RECORDINGSTORAGE = "recordingstorage" + SHORTCODES = "shortcodes" + SHORTCODES_CUSTOMEROWNED = "shortcodes-customerowned" + SHORTCODES_MMS_ENABLEMENT = "shortcodes-mms-enablement" + SHORTCODES_MPS = "shortcodes-mps" + SHORTCODES_RANDOM = "shortcodes-random" + SHORTCODES_SETUP_FEES = "shortcodes-setup-fees" + SHORTCODES_UK = "shortcodes-uk" + SHORTCODES_VANITY = "shortcodes-vanity" + SIM_SWAP_LOOKUPS = "sim-swap-lookups" + SIP_SECURE_MEDIA = "sip-secure-media" + SMALL_GROUP_ROOMS = "small-group-rooms" + SMALL_GROUP_ROOMS_DATA_TRACK = "small-group-rooms-data-track" + SMALL_GROUP_ROOMS_PARTICIPANT_MINUTES = "small-group-rooms-participant-minutes" + SMS = "sms" + SMS_INBOUND = "sms-inbound" + SMS_INBOUND_LONGCODE = "sms-inbound-longcode" + SMS_INBOUND_SHORTCODE = "sms-inbound-shortcode" + SMS_INBOUND_TOLLFREE = "sms-inbound-tollfree" + SMS_MESSAGES_CARRIERFEES = "sms-messages-carrierfees" + SMS_MESSAGES_FEATURES = "sms-messages-features" + SMS_MESSAGES_FEATURES_ENGAGEMENT_SUITE = ( + "sms-messages-features-engagement-suite" + ) + SMS_MESSAGES_FEATURES_MESSAGE_REDACTION = ( + "sms-messages-features-message-redaction" + ) + SMS_MESSAGES_FEATURES_SENDERID = "sms-messages-features-senderid" + SMS_MPS = "sms-mps" + SMS_MPS_SHORTCODE = "sms-mps-shortcode" + SMS_MPS_TOLLFREE = "sms-mps-tollfree" + SMS_MPS_TOLLFREE_SETUP = "sms-mps-tollfree-setup" + SMS_NATIONAL_REGULATORY_PROTECTION = "sms-national-regulatory-protection" + SMS_OUTBOUND = "sms-outbound" + SMS_OUTBOUND_CONTENT_INSPECTION = "sms-outbound-content-inspection" + SMS_OUTBOUND_LONGCODE = "sms-outbound-longcode" + SMS_OUTBOUND_SHORTCODE = "sms-outbound-shortcode" + SMS_OUTBOUND_TOLLFREE = "sms-outbound-tollfree" + SMS_PUMPING_PROTECTION = "sms-pumping-protection" + SMS_PUMPING_RISK = "sms-pumping-risk" + SMSMESSAGES_BUCKET_ADJUSTMENTS = "smsmessages-bucket-adjustments" + SMSMESSAGES_OUTBOUND_DOMESTIC = "smsmessages-outbound-domestic" + SPEECH_RECOGNITION = "speech-recognition" + STUDIO_ENGAGEMENTS = "studio-engagements" + SYNC = "sync" + SYNC_ACTIONS = "sync-actions" + SYNC_ENDPOINT_HOURS = "sync-endpoint-hours" + SYNC_ENDPOINT_HOURS_ABOVE_DAILY_CAP = "sync-endpoint-hours-above-daily-cap" + TASKROUTER_TASKS = "taskrouter-tasks" + TOTALPRICE = "totalprice" + TRANSCRIPTIONS = "transcriptions" + TRUNKING_CPS = "trunking-cps" + TRUNKING_EMERGENCY_CALLS = "trunking-emergency-calls" + TRUNKING_ORIGINATION = "trunking-origination" + TRUNKING_ORIGINATION_LOCAL = "trunking-origination-local" + TRUNKING_ORIGINATION_MOBILE = "trunking-origination-mobile" + TRUNKING_ORIGINATION_TOLLFREE = "trunking-origination-tollfree" + TRUNKING_RECORDINGS = "trunking-recordings" + TRUNKING_SECURE = "trunking-secure" + TRUNKING_TERMINATION = "trunking-termination" + TTS_GOOGLE = "tts-google" + TURNMEGABYTES = "turnmegabytes" + TURNMEGABYTES_AUSTRALIA = "turnmegabytes-australia" + TURNMEGABYTES_BRASIL = "turnmegabytes-brasil" + TURNMEGABYTES_GERMANY = "turnmegabytes-germany" + TURNMEGABYTES_INDIA = "turnmegabytes-india" + TURNMEGABYTES_IRELAND = "turnmegabytes-ireland" + TURNMEGABYTES_JAPAN = "turnmegabytes-japan" + TURNMEGABYTES_SINGAPORE = "turnmegabytes-singapore" + TURNMEGABYTES_USEAST = "turnmegabytes-useast" + TURNMEGABYTES_USWEST = "turnmegabytes-uswest" + TWILIO_FOR_SALESFORCE = "twilio-for-salesforce" + TWILIO_FOR_SALESFORCE_LICENSES = "twilio-for-salesforce-licenses" + TWILIO_INTERCONNECT = "twilio-interconnect" + TWIML = "twiml" + USAGE_FLEX_VIDEO = "usage-flex-video" + USAGE_FUNCTIONS = "usage-functions" + USAGE_RCS_BASIC_MESSAGES_OUTBOUND = "usage-rcs-basic-messages-outbound" + USAGE_RCS_MESSAGES = "usage-rcs-messages" + USAGE_RCS_MESSAGES_INBOUND = "usage-rcs-messages-inbound" + USAGE_RCS_MESSAGING_CARRIER_FEES = "usage-rcs-messaging-carrier-fees" + USAGE_RCS_SINGLE_MESSAGES_OUTBOUND = "usage-rcs-single-messages-outbound" + VERIFY_PACKAGE_PLANS = "verify-package-plans" + VERIFY_PUSH = "verify-push" + VERIFY_SNA = "verify-sna" + VERIFY_TOTP = "verify-totp" + VERIFY_VOICE_SMS = "verify-voice-sms" + VERIFY_WHATSAPP_CONVERSATIONS_BUSINESS_INITIATED = ( + "verify-whatsapp-conversations-business-initiated" + ) + VIDEO_RECORDINGS = "video-recordings" + VIDEO_ROOMS_TURN_MEGABYTES = "video-rooms-turn-megabytes" + VIRTUAL_AGENT = "virtual-agent" + VOICE_INSIGHTS = "voice-insights" + VOICE_INSIGHTS_CLIENT_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-client-insights-on-demand-minute" + ) + VOICE_INSIGHTS_PTSN_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-ptsn-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_INTERFACE_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-interface-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_TRUNKING_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-trunking-insights-on-demand-minute" + ) + VOICE_INTELLIGENCE = "voice-intelligence" + VOICE_INTELLIGENCE_EIP_OPERATORS = "voice-intelligence-eip-operators" + VOICE_INTELLIGENCE_OPERATORS = "voice-intelligence-operators" + VOICE_INTELLIGENCE_TRANSCRIPTION = "voice-intelligence-transcription" + WDS = "wds" + WIRELESS = "wireless" + WIRELESS_DATA = "wireless-data" + WIRELESS_DATA_PAYG = "wireless-data-payg" + WIRELESS_DATA_PAYG_AFRICA = "wireless-data-payg-africa" + WIRELESS_DATA_PAYG_ASIA = "wireless-data-payg-asia" + WIRELESS_DATA_PAYG_CENTRALANDSOUTHAMERICA = ( + "wireless-data-payg-centralandsouthamerica" + ) + WIRELESS_DATA_PAYG_EUROPE = "wireless-data-payg-europe" + WIRELESS_DATA_PAYG_NORTHAMERICA = "wireless-data-payg-northamerica" + WIRELESS_DATA_PAYG_OCEANIA = "wireless-data-payg-oceania" + WIRELESS_DATA_QUOTA1 = "wireless-data-quota1" + WIRELESS_DATA_QUOTA1_AFRICA = "wireless-data-quota1-africa" + WIRELESS_DATA_QUOTA1_ASIA = "wireless-data-quota1-asia" + WIRELESS_DATA_QUOTA1_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota1-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA1_EUROPE = "wireless-data-quota1-europe" + WIRELESS_DATA_QUOTA1_NORTHAMERICA = "wireless-data-quota1-northamerica" + WIRELESS_DATA_QUOTA1_OCEANIA = "wireless-data-quota1-oceania" + WIRELESS_DATA_QUOTA10 = "wireless-data-quota10" + WIRELESS_DATA_QUOTA10_AFRICA = "wireless-data-quota10-africa" + WIRELESS_DATA_QUOTA10_ASIA = "wireless-data-quota10-asia" + WIRELESS_DATA_QUOTA10_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota10-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA10_EUROPE = "wireless-data-quota10-europe" + WIRELESS_DATA_QUOTA10_NORTHAMERICA = "wireless-data-quota10-northamerica" + WIRELESS_DATA_QUOTA10_OCEANIA = "wireless-data-quota10-oceania" + WIRELESS_DATA_QUOTA50 = "wireless-data-quota50" + WIRELESS_DATA_QUOTA50_AFRICA = "wireless-data-quota50-africa" + WIRELESS_DATA_QUOTA50_ASIA = "wireless-data-quota50-asia" + WIRELESS_DATA_QUOTA50_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota50-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA50_EUROPE = "wireless-data-quota50-europe" + WIRELESS_DATA_QUOTA50_NORTHAMERICA = "wireless-data-quota50-northamerica" + WIRELESS_DATA_QUOTA50_OCEANIA = "wireless-data-quota50-oceania" + WIRELESS_DATA_QUOTACUSTOM = "wireless-data-quotacustom" + WIRELESS_DATA_QUOTACUSTOM_AFRICA = "wireless-data-quotacustom-africa" + WIRELESS_DATA_QUOTACUSTOM_ASIA = "wireless-data-quotacustom-asia" + WIRELESS_DATA_QUOTACUSTOM_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quotacustom-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_EUROPE = "wireless-data-quotacustom-europe" + WIRELESS_DATA_QUOTACUSTOM_NORTHAMERICA = ( + "wireless-data-quotacustom-northamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_OCEANIA = "wireless-data-quotacustom-oceania" + WIRELESS_MRC_PAYG = "wireless-mrc-payg" + WIRELESS_MRC_QUOTA1 = "wireless-mrc-quota1" + WIRELESS_MRC_QUOTA10 = "wireless-mrc-quota10" + WIRELESS_MRC_QUOTA50 = "wireless-mrc-quota50" + WIRELESS_MRC_QUOTACUSTOM = "wireless-mrc-quotacustom" + WIRELESS_ORDERS = "wireless-orders" + WIRELESS_ORDERS_ARTWORK = "wireless-orders-artwork" + WIRELESS_ORDERS_BULK = "wireless-orders-bulk" + WIRELESS_ORDERS_ESIM = "wireless-orders-esim" + WIRELESS_ORDERS_STARTER = "wireless-orders-starter" + WIRELESS_QUOTAS = "wireless-quotas" + WIRELESS_SMS_AFRICA = "wireless-sms-africa" + WIRELESS_SMS_ASIA = "wireless-sms-asia" + WIRELESS_SMS_CENTRALANDSOUTHAMERICA = "wireless-sms-centralandsouthamerica" + WIRELESS_SMS_EUROPE = "wireless-sms-europe" + WIRELESS_SMS_NORTHAMERICA = "wireless-sms-northamerica" + WIRELESS_SMS_OCEANIA = "wireless-sms-oceania" + WIRELESS_SUPER_SIM = "wireless-super-sim" + WIRELESS_SUPER_SIM_DATA = "wireless-super-sim-data" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA_USA = ( + "wireless-super-sim-data-north-america-usa" + ) + WIRELESS_SUPER_SIM_DATA_PAYG = "wireless-super-sim-data-payg" + WIRELESS_SUPER_SIM_DATA_PAYG_EUROPE = "wireless-super-sim-data-payg-europe" + WIRELESS_SUPER_SIM_DATA_PAYG_NORTH_AMERICA = ( + "wireless-super-sim-data-payg-north-america" + ) + WIRELESS_SUPER_SIM_HARDWARE = "wireless-super-sim-hardware" + WIRELESS_SUPER_SIM_HARDWARE_BULK = "wireless-super-sim-hardware-bulk" + WIRELESS_SUPER_SIM_SMSCOMMANDS = "wireless-super-sim-smscommands" + WIRELESS_SUPER_SIM_SMSCOMMANDS_AFRICA = "wireless-super-sim-smscommands-africa" + WIRELESS_SUPER_SIM_SMSCOMMANDS_ASIA = "wireless-super-sim-smscommands-asia" + WIRELESS_SUPER_SIM_SMSCOMMANDS_CENT_AND_SOUTH_AMERICA = ( + "wireless-super-sim-smscommands-cent-and-south-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_EUROPE = "wireless-super-sim-smscommands-europe" + WIRELESS_SUPER_SIM_SMSCOMMANDS_NORTH_AMERICA = ( + "wireless-super-sim-smscommands-north-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_OCEANIA = ( + "wireless-super-sim-smscommands-oceania" + ) + WIRELESS_SUPER_SIM_SUBSCRIPTION = "wireless-super-sim-subscription" + WIRELESS_SUPER_SIM_SUBSCRIPTION_PAYG = "wireless-super-sim-subscription-payg" + WIRELESS_USAGE = "wireless-usage" + WIRELESS_USAGE_COMMANDS = "wireless-usage-commands" + WIRELESS_USAGE_COMMANDS_AFRICA = "wireless-usage-commands-africa" + WIRELESS_USAGE_COMMANDS_ASIA = "wireless-usage-commands-asia" + WIRELESS_USAGE_COMMANDS_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-commands-centralandsouthamerica" + ) + WIRELESS_USAGE_COMMANDS_EUROPE = "wireless-usage-commands-europe" + WIRELESS_USAGE_COMMANDS_HOME = "wireless-usage-commands-home" + WIRELESS_USAGE_COMMANDS_NORTHAMERICA = "wireless-usage-commands-northamerica" + WIRELESS_USAGE_COMMANDS_OCEANIA = "wireless-usage-commands-oceania" + WIRELESS_USAGE_COMMANDS_ROAMING = "wireless-usage-commands-roaming" + WIRELESS_USAGE_DATA = "wireless-usage-data" + WIRELESS_USAGE_DATA_AFRICA = "wireless-usage-data-africa" + WIRELESS_USAGE_DATA_ASIA = "wireless-usage-data-asia" + WIRELESS_USAGE_DATA_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-data-centralandsouthamerica" + ) + WIRELESS_USAGE_DATA_CUSTOM_ADDITIONALMB = ( + "wireless-usage-data-custom-additionalmb" + ) + WIRELESS_USAGE_DATA_CUSTOM_FIRST5MB = "wireless-usage-data-custom-first5mb" + WIRELESS_USAGE_DATA_DOMESTIC_ROAMING = "wireless-usage-data-domestic-roaming" + WIRELESS_USAGE_DATA_EUROPE = "wireless-usage-data-europe" + WIRELESS_USAGE_DATA_INDIVIDUAL_ADDITIONALGB = ( + "wireless-usage-data-individual-additionalgb" + ) + WIRELESS_USAGE_DATA_INDIVIDUAL_FIRSTGB = ( + "wireless-usage-data-individual-firstgb" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_CANADA = ( + "wireless-usage-data-international-roaming-canada" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_INDIA = ( + "wireless-usage-data-international-roaming-india" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_MEXICO = ( + "wireless-usage-data-international-roaming-mexico" + ) + WIRELESS_USAGE_DATA_NORTHAMERICA = "wireless-usage-data-northamerica" + WIRELESS_USAGE_DATA_OCEANIA = "wireless-usage-data-oceania" + WIRELESS_USAGE_DATA_POOLED = "wireless-usage-data-pooled" + WIRELESS_USAGE_DATA_POOLED_DOWNLINK = "wireless-usage-data-pooled-downlink" + WIRELESS_USAGE_DATA_POOLED_UPLINK = "wireless-usage-data-pooled-uplink" + WIRELESS_USAGE_MRC = "wireless-usage-mrc" + WIRELESS_USAGE_MRC_CUSTOM = "wireless-usage-mrc-custom" + WIRELESS_USAGE_MRC_INDIVIDUAL = "wireless-usage-mrc-individual" + WIRELESS_USAGE_MRC_POOLED = "wireless-usage-mrc-pooled" + WIRELESS_USAGE_MRC_SUSPENDED = "wireless-usage-mrc-suspended" + WIRELESS_USAGE_SMS = "wireless-usage-sms" + WIRELESS_USAGE_VOICE = "wireless-usage-voice" + A2P_FAST_TRACK_ONBOARDING = "a2p-fast-track-onboarding" + ADVISORY_SERVICES = "advisory-services" + ADVISORY_SERVICES_BILLED = "advisory-services-billed" + ADVISORY_SERVICES_CALL_TRACKING = "advisory-services-call-tracking" + ADVISORY_SERVICES_DATA_SERVICES = "advisory-services-data-services" + ADVISORY_SERVICES_EXPENSES = "advisory-services-expenses" + ADVISORY_SERVICES_SIP_TRUNKING = "advisory-services-sip-trunking" + ASSETS_REQUESTS = "assets-requests" + AUDIENCE_MINUTES_VIDEO = "audience-minutes-video" + AUTHY_BUCKET_ADJUSTMENT = "authy-bucket-adjustment" + AUTHY_SOFTWARE = "authy-software" + CALLERIDLOOKUPS_API = "calleridlookups-api" + CALLERIDLOOKUPS_PROGRAMMABLEVOICE = "calleridlookups-programmablevoice" + CALLERIDLOOKUPS_TRUNKING = "calleridlookups-trunking" + CALLS_TRUNKING_INBOUND_TOLLFREE_LOCAL = "calls-trunking-inbound-tollfree-local" + CALLS_TRUNKING_INBOUND_TOLLFREE_MOBILE = ( + "calls-trunking-inbound-tollfree-mobile" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE_1 = "channels-whatsapp-conversation-free-1" + CONFERENCE = "conference" + CONVERSATIONAL_INSIGHTS = "conversational-insights" + CONVERSATIONAL_INSIGHTS_MESSAGES = "conversational-insights-messages" + CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = "conversational-insights-voice-minutes" + DEMO = "demo" + DEMO_UC_SCRIPT_TEST = "demo-uc-script-test" + ELASTIC_SIP_TRUNKING = "elastic-sip-trunking" + ELASTIC_SIP_TRUNKING_CALL_TRANSFERS = "elastic-sip-trunking-call-transfers" + ENTERPRISE_HIPPA = "enterprise-hippa" + FLEX_NAMED_USERS = "flex-named-users" + FLEX_SPINSCI = "flex-spinsci" + FLEX_USERS_1 = "flex-users-1" + FLEX_WFO_PREMIUM_SPEECH_ANALYTICS = "flex-wfo-premium-speech-analytics" + FLEX_XCELERATE = "flex-xcelerate" + FUNCTIONS_ROLLUP = "functions-rollup" + IMP_V1_USAGE = "imp-v1-usage" + IP_MESSAGING_ADDONS = "ip-messaging-addons" + IVR = "ivr" + IVR_CONVERSATIONAL = "ivr-conversational" + IVR_DTMF = "ivr-dtmf" + IVR_VIRTUALAGENT = "ivr-virtualagent" + LIVE = "live" + LIVE_MEDIA_RECORDING_MINUTES = "live-media-recording-minutes" + LONGCODE_MPS = "longcode-mps" + MARKETPLACE_ANALYTICS_ADDONS = "marketplace-analytics-addons" + MARKETPLACE_ISV_ADDONS = "marketplace-isv-addons" + MARKETPLACE_MESSAGING_ADDONS = "marketplace-messaging-addons" + MARKETPLACE_PHONENUMBERS_ADDONS = "marketplace-phonenumbers-addons" + MARKETPLACE_RECORDING_ADDONS = "marketplace-recording-addons" + MARKETPLACE_VIRTUALAGENT_ADDONS = "marketplace-virtualagent-addons" + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR_1 = ( + "marketplay-pay-addons-shuttle-pay-connector-1" + ) + MARKETPLAY_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplay-pay-addons-stripe-pay-connector" + ) + MMS_INBOUND_LONGCODE_CANADA = "mms-inbound-longcode-canada" + MMS_INBOUND_LONGCODE_UNITEDSTATES = "mms-inbound-longcode-unitedstates" + MMS_OUTBOUND_LONGCODE_CANADA = "mms-outbound-longcode-canada" + MMS_OUTBOUND_LONGCODE_UNITEDSTATES = "mms-outbound-longcode-unitedstates" + MMS_OUTBOUND_TOLL_FREE = "mms-outbound-toll-free" + NOTIFY_CHATAPPSANDOTHERCHANNELS = "notify-chatappsandotherchannels" + NOTIFY_NOTIFYSERVICES = "notify-notifyservices" + NOTIFY_PUSHNOTIFICATIONS = "notify-pushnotifications" + PAYMENT_GATEWAY_CONNECTORS = "payment-gateway-connectors" + PAYMENT_SOLUTIONS = "payment-solutions" + PCHAT_BUCKET_ADJUSTMENT = "pchat-bucket-adjustment" + PHONENUMBERS_NUMBERS = "phonenumbers-numbers" + PROG_VOICE_CLIENT_ANDROID = "prog-voice-client-android" + PROG_VOICE_CLIENT_ANDROID_INBOUND = "prog-voice-client-android-inbound" + PROG_VOICE_CLIENT_ANDROID_OUTBOUND = "prog-voice-client-android-outbound" + PROG_VOICE_CLIENT_IOS = "prog-voice-client-ios" + PROG_VOICE_CLIENT_IOS_INBOUND = "prog-voice-client-ios-inbound" + PROG_VOICE_CLIENT_IOS_OUTBOUND = "prog-voice-client-ios-outbound" + PROG_VOICE_CLIENT_SDK = "prog-voice-client-sdk" + PROG_VOICE_CLIENT_WEB = "prog-voice-client-web" + PROG_VOICE_CLIENT_WEB_INBOUND = "prog-voice-client-web-inbound" + PROG_VOICE_CLIENT_WEB_OUTBOUND = "prog-voice-client-web-outbound" + PROGRAMMABLEVOICECONNECTIVITY_MEDIA_STREAMS = ( + "programmablevoiceconnectivity-media-streams" + ) + PSTNCONNECTIVITY_BYOC = "pstnconnectivity-byoc" + PSTNCONNECTIVITY_EMERGENCY = "pstnconnectivity-emergency" + PSTNCONNECTIVITY_MINUTES = "pstnconnectivity-minutes" + PSTNCONNECTIVITY_MINUTES_1 = "pstnconnectivity-minutes-1" + PSTNCONNECTIVITY_MINUTESINBOUNDLOCAL = "pstnconnectivity-minutesinboundlocal" + PSTNCONNECTIVITY_MINUTESINBOUNDMOBILE = "pstnconnectivity-minutesinboundmobile" + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREE = ( + "pstnconnectivity-minutesinboundtollfree" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREELOCAL = ( + "pstnconnectivity-minutesinboundtollfreelocal" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREEMOBILE = ( + "pstnconnectivity-minutesinboundtollfreemobile" + ) + PV_ROOM_HOURS = "pv-room-hours" + PV_ROOM_SIMULTANEOUS_PARTICIPANT_CONNECTIONS = ( + "pv-room-simultaneous-participant-connections" + ) + PVIDEO_ROOM_HOURS_AU1 = "pvideo-room-hours-au1" + PVIDEO_ROOM_HOURS_BR1 = "pvideo-room-hours-br1" + PVIDEO_ROOM_HOURS_IE1 = "pvideo-room-hours-ie1" + PVIDEO_ROOM_HOURS_JP1 = "pvideo-room-hours-jp1" + PVIDEO_ROOM_HOURS_SG1 = "pvideo-room-hours-sg1" + PVIDEO_ROOM_HOURS_US1 = "pvideo-room-hours-us1" + PVIDEO_ROOM_HOURS_US2 = "pvideo-room-hours-us2" + RECORDINGS_ENCRYPTED = "recordings-encrypted" + SHORT_CODE_SETUP_FEES = "short-code-setup-fees" + SHORTCODES_MESSAGES_INBOUND = "shortcodes-messages-inbound" + SHORTCODES_MESSAGES_OUTBOUND = "shortcodes-messages-outbound" + SMS_MESSAGES_REGISTRATIONFEES = "sms-messages-registrationfees" + SMS_MMS_PENALTY_FEES = "sms-mms-penalty-fees" + SMS_MMS_PENALTY_FEES_1 = "sms-mms-penalty-fees-1" + SMS_PUMPING_PROTECTION_NON_USCA = "sms-pumping-protection-non-usca" + SMS_PUMPING_PROTECTION_USCA = "sms-pumping-protection-usca" + STUDIO = "studio" + STUDIO_MONTHLY_FEES = "studio-monthly-fees" + SUPERSIM = "supersim" + TASK_ROUTER = "task-router" + TASK_ROUTER_WORKERS = "task-router-workers" + TEST_QUOTA_BUCKETS = "test-quota-buckets" + TEST_UC_SCRIPT_1 = "test-uc-script-1" + TEST_UC_SCRIPT_DEMO_2 = "test-uc-script-demo-2" + TEXT_TO_SPEECH = "text-to-speech" + TME = "tme" + TTS_BASIC = "tts-basic" + TWILIO_EDITIONS = "twilio-editions" + TWILIO_INTERCONNECT_CALIFORNIA = "twilio-interconnect-california" + TWILIO_INTERCONNECT_CALIFORNIA_MONTHLY = ( + "twilio-interconnect-california-monthly" + ) + TWILIO_INTERCONNECT_CALIFORNIA_SETUP = "twilio-interconnect-california-setup" + TWILIO_INTERCONNECT_FRANKFURT = "twilio-interconnect-frankfurt" + TWILIO_INTERCONNECT_FRANKFURT_MO = "twilio-interconnect-frankfurt-mo" + TWILIO_INTERCONNECT_FRANKFURT_SETUP = "twilio-interconnect-frankfurt-setup" + TWILIO_INTERCONNECT_LONDON = "twilio-interconnect-london" + TWILIO_INTERCONNECT_LONDON_MO = "twilio-interconnect-london-mo" + TWILIO_INTERCONNECT_LONDON_SETUP = "twilio-interconnect-london-setup" + TWILIO_INTERCONNECT_SAO_PAULO = "twilio-interconnect-sao-paulo" + TWILIO_INTERCONNECT_SAO_PAULO_MONTHLY = "twilio-interconnect-sao-paulo-monthly" + TWILIO_INTERCONNECT_SAO_PAULO_SETUP = "twilio-interconnect-sao-paulo-setup" + TWILIO_INTERCONNECT_SINGAPORE = "twilio-interconnect-singapore" + TWILIO_INTERCONNECT_SINGAPORE_MO = "twilio-interconnect-singapore-mo" + TWILIO_INTERCONNECT_SINGAPORE_SETUP = "twilio-interconnect-singapore-setup" + TWILIO_INTERCONNECT_SYDNEY = "twilio-interconnect-sydney" + TWILIO_INTERCONNECT_SYDNEY_MO = "twilio-interconnect-sydney-mo" + TWILIO_INTERCONNECT_SYDNEY_SETUP = "twilio-interconnect-sydney-setup" + TWILIO_INTERCONNECT_TOKYO = "twilio-interconnect-tokyo" + TWILIO_INTERCONNECT_TOKYO_MO = "twilio-interconnect-tokyo-mo" + TWILIO_INTERCONNECT_TOKYO_SETUP = "twilio-interconnect-tokyo-setup" + TWILIO_INTERCONNECT_VA = "twilio-interconnect-va" + TWILIO_INTERCONNECT_VA_MO = "twilio-interconnect-va-mo" + TWILIO_INTERCONNECT_VA_SETUP = "twilio-interconnect-va-setup" + TWIML_VERBS = "twiml-verbs" + TWIML_VERBS_SAY = "twiml-verbs-say" + USAGE_PROGRAMMABLE_MESSAGING_ENGAGEMENT_SUITE = ( + "usage-programmable-messaging-engagement-suite" + ) + USAGE_PROGRAMMABLE_MESSAGING_FEES_SERVICES = ( + "usage-programmable-messaging-fees-services" + ) + VERIFY_OUTBOUND_EMAIL = "verify-outbound-email" + VERIFY_PACKAGED_PLANS = "verify-packaged-plans" + VERIFY_SILENT_NETWORK_AUTH = "verify-silent-network-auth" + VERIFY_VOICE_AND_SMS = "verify-voice-and-sms" + VOICE_INSIGHTS_CLIENT_INSIGHTS_MONTHY_COMMIT = ( + "voice-insights-client-insights-monthy-commit" + ) + WIRELESS_DATA_PAYG_ASIA_AFG = "wireless-data-payg-asia-afg" + WIRELESS_MULTI_IMSI_SIM_COMMANDS = "wireless-multi-imsi-sim-commands" + WIRELESS_MULTI_IMSI_SIM_COMMANDS_USA = "wireless-multi-imsi-sim-commands-usa" + WIRELESS_MULTI_IMSI_SIM_DATA = "wireless-multi-imsi-sim-data" + WIRELESS_MULTI_IMSI_SIM_DATA_EU28 = "wireless-multi-imsi-sim-data-eu28" + WIRELESS_MULTI_IMSI_SIM_DATA_USA = "wireless-multi-imsi-sim-data-usa" + WIRELESS_MULTI_IMSI_SIM_MONTHLY_FEES = "wireless-multi-imsi-sim-monthly-fees" + WIRELESS_MULTI_IMSI_SIM_USAGE = "wireless-multi-imsi-sim-usage" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA = "wireless-super-sim-data-north-america" + WIRELESS_SUPER_SIM_USAGE = "wireless-super-sim-usage" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that accrued the usage. + :ivar api_version: The API version used to create the resource. + :ivar as_of: Usage records up to date as of this timestamp, formatted as YYYY-MM-DDTHH:MM:SS+00:00. All timestamps are in GMT + :ivar category: + :ivar count: The number of usage events, such as the number of calls. + :ivar count_unit: The units in which `count` is measured, such as `calls` for calls or `messages` for SMS. + :ivar description: A plain-language description of the usage category. + :ivar end_date: The last date for which usage is included in the UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar price: The total price of the usage in the currency specified in `price_unit` and associated with the account. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format, such as `usd`, `eur`, and `jpy`. + :ivar start_date: The first date for which usage is included in this UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar subresource_uris: A list of related resources identified by their URIs. For more information, see [List Subresources](https://www.twilio.com/docs/usage/api/usage-record#list-subresources). + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar usage: The amount used to bill usage and measured in units described in `usage_unit`. + :ivar usage_unit: The units in which `usage` is measured, such as `minutes` for calls or `messages` for SMS. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.as_of: Optional[str] = payload.get("as_of") + self.category: Optional["RecordInstance.Category"] = payload.get("category") + self.count: Optional[str] = payload.get("count") + self.count_unit: Optional[str] = payload.get("count_unit") + self.description: Optional[str] = payload.get("description") + self.end_date: Optional[date] = deserialize.iso8601_date( + payload.get("end_date") + ) + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.start_date: Optional[date] = deserialize.iso8601_date( + payload.get("start_date") + ) + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.uri: Optional[str] = payload.get("uri") + self.usage: Optional[str] = payload.get("usage") + self.usage_unit: Optional[str] = payload.get("usage_unit") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RecordPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RecordInstance: + """ + Build an instance of RecordInstance + + :param payload: Payload response from the API + """ + return RecordInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RecordList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the RecordList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageRecord resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Records.json".format( + **self._solution + ) + + self._all_time: Optional[AllTimeList] = None + self._daily: Optional[DailyList] = None + self._last_month: Optional[LastMonthList] = None + self._monthly: Optional[MonthlyList] = None + self._this_month: Optional[ThisMonthList] = None + self._today: Optional[TodayList] = None + self._yearly: Optional[YearlyList] = None + self._yesterday: Optional[YesterdayList] = None + + def stream( + self, + category: Union["RecordInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RecordInstance]: + """ + Streams RecordInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "RecordInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + category: Union["RecordInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RecordInstance]: + """ + Asynchronously streams RecordInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "RecordInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + category: Union["RecordInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RecordInstance]: + """ + Lists RecordInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "RecordInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + category: Union["RecordInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RecordInstance]: + """ + Asynchronously lists RecordInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "RecordInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + category: Union["RecordInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RecordPage: + """ + Retrieve a single page of RecordInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RecordInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RecordPage(self._version, response, self._solution) + + async def page_async( + self, + category: Union["RecordInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RecordPage: + """ + Asynchronously retrieve a single page of RecordInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RecordInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RecordPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> RecordPage: + """ + Retrieve a specific page of RecordInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RecordInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RecordPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> RecordPage: + """ + Asynchronously retrieve a specific page of RecordInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RecordInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RecordPage(self._version, response, self._solution) + + @property + def all_time(self) -> AllTimeList: + """ + Access the all_time + """ + if self._all_time is None: + self._all_time = AllTimeList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._all_time + + @property + def daily(self) -> DailyList: + """ + Access the daily + """ + if self._daily is None: + self._daily = DailyList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._daily + + @property + def last_month(self) -> LastMonthList: + """ + Access the last_month + """ + if self._last_month is None: + self._last_month = LastMonthList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._last_month + + @property + def monthly(self) -> MonthlyList: + """ + Access the monthly + """ + if self._monthly is None: + self._monthly = MonthlyList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._monthly + + @property + def this_month(self) -> ThisMonthList: + """ + Access the this_month + """ + if self._this_month is None: + self._this_month = ThisMonthList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._this_month + + @property + def today(self) -> TodayList: + """ + Access the today + """ + if self._today is None: + self._today = TodayList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._today + + @property + def yearly(self) -> YearlyList: + """ + Access the yearly + """ + if self._yearly is None: + self._yearly = YearlyList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._yearly + + @property + def yesterday(self) -> YesterdayList: + """ + Access the yesterday + """ + if self._yesterday is None: + self._yesterday = YesterdayList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._yesterday + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36a023be49b1e72df4f6961be9f08dd2dff58762 GIT binary patch literal 70500 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 BaH9YK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/all_time.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/all_time.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75630e79a0d242b0648309df129e2b51355f167d GIT binary patch literal 66444 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 ZZ0|E$U-2P%W!G#4ZuWf9N2#dy{{UJ>Cs+Ug literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/daily.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/daily.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..181ab2c5b7df10c1b909efd83ea4d02542551be8 GIT binary patch literal 66356 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 L@I@b`qTT-kWAy?y literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/last_month.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/last_month.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3f9dcfd47ebf0ee10be9e3a6742f0c9df2d7bc6 GIT binary patch literal 66539 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Π)%6Xx%WEi9 zsm2Ob^7QPy9Yxxn9XmM8u_?UG33z8T)jPA__wMS1HjB`+16EFj>9?uAQ2ie5U3Kuk zwBldQA<#Tk9mTawK<9nJD^ng1t42wYSB4mH*GBO?ofaoUcTcwNo@~*1hX(mdU>VTWyqFJxm3>dXOV$N3Z`i*dX+dhzLKS^B&U{k;aHoOU#f? z6}`RKCXx6a1R3R@z?0Hza@eB?0A8eBy4G4_i)bORs+NRo9e7M|f z@A*QxufFA$2K1M25&p|xpp09-+M3$02=FWUy{P2v-H(+0VA=kPAF6t!>_gh&iXW>u zRP_^O_td^neyHlFDh^ltblD?iKU;RF>gUT2SA5L>NSWy*DrCFp{Uj3Hz-- zlxq7}beKS@kHzctmkVVDJBG+BA`Wkcn1<9H=Nh&?5PU65>&X>Y$gDW|NboMFR8k{X`y^miD&#l9I_jMbF45&6pq4KQ4oF zAdT{=^gN;tC|)TsM=_f4q(dax0#GfE;$cd}4oM&R9xFOaL@XWLtB5s8fIvO!g@^pK zD}26Merup6N-=wbXp2!D&Ts)VM`XNNREgZJvDuO%>5rfIMFml`^wqindQUJ@2u?1} zCtuwZpP!#gL9QZFwg1T=;;e%dh!|YR%_TF5EKl-Rn^Y2tdN!&;i9~X~V3ZGqC!en{ zs?vyT%X0BLvQZ@@b>65xjhGxnh4T@qr#LikehfT&a7{nO7GSDF+ zl1D_~wbx=>7zQGsZ}cy0@UegqVWch>UsX0>HIA(at5 z6zSvk<3p{LJ-wIT zbTv4BwdeKMnkOz+-|XqTSpAG2-^se!vhLZ3-t*A)mTgNd+m>58F7x-N-j}*k@$p%F zHm!C0ZJ*X!d(n?Ko13~X-}C;5-uKXRJFg6WZ1kg}*BbFL$N?E1q}nHBKfD9~Zoe1y zj&vfeZjIcvoWL#oxh*F+)BLJ4?Z3j3f~#$taIDqDzfHBMiX3Z@3wI5y|LRcgy9U-> z1B(u!Ry~TlYheBVX<+5rU=rlI>C!`&^>o=lmyL7@;4*63GP$jUv5lGBHoB!iSU&_?Pu>H=3`St>^)(c}a+x|0q5wRkAt7Pnb70;&evZqlcU(YnE z&3Y6AzFZpcyJ&Ijq}4!!Y?R=~x7Uf#R^ z%!DgGn*FbsfVMSR9>=k*o8%YhrQX?wLyx`;8JJsdgnb$o%dYtJhIezn&3yXDDs;PL!EZhxddwl>K~JsHfs%+W~!}-!h@~B)?^n`wBW<@=GRS-C18U`8o70 z_bTy;K6Kc-zW56!;+sC=3nujGFuBLCT);#oaNKTvgf&r<7-Th)Z} z`><`VxIA;YZmD_Otr|kr`ZjF&z&+2kf8fET^?PrvAr!t{({Z`{(o?tU>8`=o+H-l} zJrCWYdhh~JZSynzOEsHsuch0Gve($cP}#~RhRRm95x5nN1a3tufm54_TeY3IMMKv; z^VX%B9n?_Vzs8nst*k9>C{V@iBver|302feLOG43JEx6whbA^$%r4bzxV@Hc$6qTi zSF~^&o?bE9D_TfYMJ*(h(?Ys)T1aaH1k62kPc>93^w|ta7_rPtD-s%u{d5OL977Hsr!GvIQ>k~{Q zltz2IjOthnAFsfNA^q@GCJU)_QVPkc!s0x6K_Rl_r_!V}B&jLosgRl^D~&bghcKq& z`1u?1Zpy8Q@UpH~^7^a~YvJ2e^4k|VIxI9gRT^=OZ0A$RyV0WNTc7bFac?xKIb@s( z-?EhDLRt&?OCQY=N<)4}&;MXL%NOSGHLXV>l<5FAe*%|VMwgNYMzUZS=)cbz`mxVFb literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/this_month.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/this_month.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86df194d503ff7f473fc91444efa8c030337f3d8 GIT binary patch literal 66539 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 mA{AG=B3>a#$=W!9AuLEiA^-*eCG$mU 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 RUfDiVfrp+i`Y09c{vQlH8lV6G literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/yesterday.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/__pycache__/yesterday.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d8c95670192b70fded0a9080bea5e8bb3e2e02a GIT binary patch literal 66538 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 h`zt;Hy)x3 str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AllTimePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AllTimeInstance: + """ + Build an instance of AllTimeInstance + + :param payload: Payload response from the API + """ + return AllTimeInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AllTimeList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the AllTimeList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageRecord resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Records/AllTime.json".format( + **self._solution + ) + + def stream( + self, + category: Union["AllTimeInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AllTimeInstance]: + """ + Streams AllTimeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "AllTimeInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + category: Union["AllTimeInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AllTimeInstance]: + """ + Asynchronously streams AllTimeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "AllTimeInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + category: Union["AllTimeInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AllTimeInstance]: + """ + Lists AllTimeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "AllTimeInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + category: Union["AllTimeInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AllTimeInstance]: + """ + Asynchronously lists AllTimeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "AllTimeInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + category: Union["AllTimeInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AllTimePage: + """ + Retrieve a single page of AllTimeInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AllTimeInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AllTimePage(self._version, response, self._solution) + + async def page_async( + self, + category: Union["AllTimeInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AllTimePage: + """ + Asynchronously retrieve a single page of AllTimeInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AllTimeInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AllTimePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AllTimePage: + """ + Retrieve a specific page of AllTimeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AllTimeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AllTimePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AllTimePage: + """ + Asynchronously retrieve a specific page of AllTimeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AllTimeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AllTimePage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/daily.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/daily.py new file mode 100644 index 00000000..e89c75cb --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/daily.py @@ -0,0 +1,1211 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class DailyInstance(InstanceResource): + + class Category(object): + A2P_10DLC_REGISTRATIONFEES_BRANDREGISTRATION = ( + "a2p-10dlc-registrationfees-brandregistration" + ) + A2P_10DLC_REGISTRATIONFEES_BV = "a2p-10dlc-registrationfees-bv" + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNCHARGES = ( + "a2p-10dlc-registrationfees-campaigncharges" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNREGISTRATION = ( + "a2p-10dlc-registrationfees-campaignregistration" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNVETTING = ( + "a2p-10dlc-registrationfees-campaignvetting" + ) + A2P_10DLC_REGISTRATIONFEES_MONTHLY = "a2p-10dlc-registrationfees-monthly" + A2P_10DLC_REGISTRATIONFEES_ONETIME = "a2p-10dlc-registrationfees-onetime" + A2P_REGISTRATION_FEES = "a2p-registration-fees" + ACCOUNT_SECURITY = "account-security" + AGENT_CONFERENCE = "agent-conference" + AGENT_COPILOT = "agent-copilot" + AGENT_COPILOT_MESSAGES = "agent-copilot-messages" + AGENT_COPILOT_PARTICIPANT_MINUTES = "agent-copilot-participant-minutes" + AI_ASSISTANTS = "ai-assistants" + AI_ASSISTANTS_VOICE = "ai-assistants-voice" + AMAZON_POLLY = "amazon-polly" + ANSWERING_MACHINE_DETECTION = "answering-machine-detection" + ASSETS = "assets" + AUDIENCE_MINUTES = "audience-minutes" + AUDIENCE_MINUTES_AUDIO = "audience-minutes-audio" + AUTHY_AUTHENTICATIONS = "authy-authentications" + AUTHY_CALLS_OUTBOUND = "authy-calls-outbound" + AUTHY_EMAIL_AUTHENTICATIONS = "authy-email-authentications" + AUTHY_MONTHLY_FEES = "authy-monthly-fees" + AUTHY_OUTBOUND_EMAIL = "authy-outbound-email" + AUTHY_PHONE_INTELLIGENCE = "authy-phone-intelligence" + AUTHY_PHONE_VERIFICATIONS = "authy-phone-verifications" + AUTHY_SMS_OUTBOUND = "authy-sms-outbound" + AUTHY_VERIFY_EMAIL_VERIFICATIONS = "authy-verify-email-verifications" + AUTHY_VERIFY_OUTBOUND_EMAIL = "authy-verify-outbound-email" + AUTOPILOT = "autopilot" + AUTOPILOT_HOME_ASSISTANTS = "autopilot-home-assistants" + AUTOPILOT_MESSAGING = "autopilot-messaging" + AUTOPILOT_OTHER = "autopilot-other" + AUTOPILOT_VOICE = "autopilot-voice" + BASIC_PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "basic-peer-to-peer-rooms-participant-minutes" + ) + BRANDED_CALLING = "branded-calling" + BUNDLE_SMS_BUCKET = "bundle-sms-bucket" + BUNDLE_SUBSCRIPTION_FEES = "bundle-subscription-fees" + CALL_FORWARDING_LOOKUPS = "call-forwarding-lookups" + CALL_PROGESS_EVENTS = "call-progess-events" + CALLERIDLOOKUPS = "calleridlookups" + CALLS = "calls" + CALLS_CLIENT = "calls-client" + CALLS_EMERGENCY = "calls-emergency" + CALLS_GLOBALCONFERENCE = "calls-globalconference" + CALLS_INBOUND = "calls-inbound" + CALLS_INBOUND_LOCAL = "calls-inbound-local" + CALLS_INBOUND_MOBILE = "calls-inbound-mobile" + CALLS_INBOUND_TOLLFREE = "calls-inbound-tollfree" + CALLS_INBOUND_TOLLFREE_LOCAL = "calls-inbound-tollfree-local" + CALLS_INBOUND_TOLLFREE_MOBILE = "calls-inbound-tollfree-mobile" + CALLS_MEDIA_STREAM_MINUTES = "calls-media-stream-minutes" + CALLS_OUTBOUND = "calls-outbound" + CALLS_PAY_VERB_TRANSACTIONS = "calls-pay-verb-transactions" + CALLS_RECORDINGS = "calls-recordings" + CALLS_SIP = "calls-sip" + CALLS_SIP_INBOUND = "calls-sip-inbound" + CALLS_SIP_OUTBOUND = "calls-sip-outbound" + CALLS_TEXT_TO_SPEECH = "calls-text-to-speech" + CALLS_TRANSFERS = "calls-transfers" + CARRIER_LOOKUPS = "carrier-lookups" + CATEGORY = "category" + CHANNELS = "channels" + CHANNELS_MESSAGING = "channels-messaging" + CHANNELS_MESSAGING_INBOUND = "channels-messaging-inbound" + CHANNELS_MESSAGING_OUTBOUND = "channels-messaging-outbound" + CHANNELS_WHATSAPP = "channels-whatsapp" + CHANNELS_WHATSAPP_CONVERSATION_AUTHENTICATION = ( + "channels-whatsapp-conversation-authentication" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE = "channels-whatsapp-conversation-free" + CHANNELS_WHATSAPP_CONVERSATION_MARKETING = ( + "channels-whatsapp-conversation-marketing" + ) + CHANNELS_WHATSAPP_CONVERSATION_SERVICE = ( + "channels-whatsapp-conversation-service" + ) + CHANNELS_WHATSAPP_CONVERSATION_UTILITY = ( + "channels-whatsapp-conversation-utility" + ) + CHANNELS_WHATSAPP_INBOUND = "channels-whatsapp-inbound" + CHANNELS_WHATSAPP_OUTBOUND = "channels-whatsapp-outbound" + CHAT_VIRTUAL_AGENT = "chat-virtual-agent" + CONVERSATION_RELAY = "conversation-relay" + CONVERSATIONS = "conversations" + CONVERSATIONS_API_REQUESTS = "conversations-api-requests" + CONVERSATIONS_CONVERSATION_EVENTS = "conversations-conversation-events" + CONVERSATIONS_ENDPOINT_CONNECTIVITY = "conversations-endpoint-connectivity" + CONVERSATIONS_EVENTS = "conversations-events" + CONVERSATIONS_PARTICIPANT_EVENTS = "conversations-participant-events" + CONVERSATIONS_PARTICIPANTS = "conversations-participants" + CPS = "cps" + CREDIT_TRANSFER = "credit-transfer" + EMAIL = "email" + EMERGING_TECH = "emerging-tech" + ENGAGEMENT_SUITE_PACKAGED_PLANS = "engagement-suite-packaged-plans" + ENHANCED_LINE_TYPE_LOOKUPS = "enhanced-line-type-lookups" + ENTERPRISE = "enterprise" + EVENTS = "events" + EXPERIMENT_FRANCE_SMS = "experiment-france-sms" + EXPERIMENT_INDIA_SMS = "experiment-india-sms" + EXPERIMENT_UK_SMS = "experiment-uk-sms" + FAILED_MESSAGE_PROCESSING_FEE = "failed-message-processing-fee" + FLEX = "flex" + FLEX_ACTIVE_USER_HOURS = "flex-active-user-hours" + FLEX_CONCURRENT_USERS = "flex-concurrent-users" + FLEX_CONVERSATIONAL_INSIGHTS = "flex-conversational-insights" + FLEX_CONVERSATIONAL_INSIGHTS_MESSAGES = "flex-conversational-insights-messages" + FLEX_CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = ( + "flex-conversational-insights-voice-minutes" + ) + FLEX_EMAIL_USAGE = "flex-email-usage" + FLEX_MESSAGING_USAGE = "flex-messaging-usage" + FLEX_PARTNER_SPINSCI = "flex-partner-spinsci" + FLEX_PARTNER_XCELERATE = "flex-partner-xcelerate" + FLEX_RESELLER_ECOSYSTEM = "flex-reseller-ecosystem" + FLEX_UNIQUE_USER = "flex-unique-user" + FLEX_USAGE = "flex-usage" + FLEX_USERS = "flex-users" + FLEX_VOICE_MINUTE = "flex-voice-minute" + FLEX_YTICA = "flex-ytica" + FRAUD_LOOKUPS = "fraud-lookups" + FRONTLINE = "frontline" + FRONTLINE_USERS = "frontline-users" + FUNCTIONS = "functions" + GENERIC_PAY_TRANSACTIONS = "generic-pay-transactions" + GROUP_ROOMS = "group-rooms" + GROUP_ROOMS_DATA_TRACK = "group-rooms-data-track" + GROUP_ROOMS_ENCRYPTED_MEDIA_RECORDED = "group-rooms-encrypted-media-recorded" + GROUP_ROOMS_MEDIA_DOWNLOADED = "group-rooms-media-downloaded" + GROUP_ROOMS_MEDIA_RECORDED = "group-rooms-media-recorded" + GROUP_ROOMS_MEDIA_ROUTED = "group-rooms-media-routed" + GROUP_ROOMS_MEDIA_STORED = "group-rooms-media-stored" + GROUP_ROOMS_PARTICIPANT_MINUTES = "group-rooms-participant-minutes" + GROUP_ROOMS_RECORDED_MINUTES = "group-rooms-recorded-minutes" + IP_MESSAGING = "ip-messaging" + IP_MESSAGING_COMMANDS = "ip-messaging-commands" + IP_MESSAGING_DATA_STORAGE = "ip-messaging-data-storage" + IP_MESSAGING_DATA_TRANSFER = "ip-messaging-data-transfer" + IP_MESSAGING_ENDPOINT_CONNECTIVITY = "ip-messaging-endpoint-connectivity" + IVR_VIRTUAL_AGENT_CUSTOM_VOICES = "ivr-virtual-agent-custom-voices" + IVR_VIRTUAL_AGENT_GENAI = "ivr-virtual-agent-genai" + LINE_STATUS_LOOKUPS = "line-status-lookups" + LIVE_ACTIVITY_LOOKUPS = "live-activity-lookups" + LOOKUP_BUCKET_ADJUSTMENT = "lookup-bucket-adjustment" + LOOKUP_IDENTITY_MATCH = "lookup-identity-match" + LOOKUPS = "lookups" + MARKETPLACE = "marketplace" + MARKETPLACE_ALGORITHMIA_NAMED_ENTITY_RECOGNITION = ( + "marketplace-algorithmia-named-entity-recognition" + ) + MARKETPLACE_CADENCE_TRANSCRIPTION = "marketplace-cadence-transcription" + MARKETPLACE_CADENCE_TRANSLATION = "marketplace-cadence-translation" + MARKETPLACE_CAPIO_SPEECH_TO_TEXT = "marketplace-capio-speech-to-text" + MARKETPLACE_CONVRIZA_ABABA = "marketplace-convriza-ababa" + MARKETPLACE_DEEPGRAM_PHRASE_DETECTOR = "marketplace-deepgram-phrase-detector" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION = "marketplace-deepgram-transcription" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION_BASE = ( + "marketplace-deepgram-transcription-base" + ) + MARKETPLACE_DEEPGRAM_TRANSSCRIPTION_ENHANCED = ( + "marketplace-deepgram-transscription-enhanced" + ) + MARKETPLACE_DIGITAL_SEGMENT_BUSINESS_INFO = ( + "marketplace-digital-segment-business-info" + ) + MARKETPLACE_FACEBOOK_OFFLINE_CONVERSIONS = ( + "marketplace-facebook-offline-conversions" + ) + MARKETPLACE_GOOGLE_SPEECH_TO_TEXT = "marketplace-google-speech-to-text" + MARKETPLACE_IBM_WATSON_MESSAGE_INSIGHTS = ( + "marketplace-ibm-watson-message-insights" + ) + MARKETPLACE_IBM_WATSON_MESSAGE_SENTIMENT = ( + "marketplace-ibm-watson-message-sentiment" + ) + MARKETPLACE_IBM_WATSON_RECORDING_ANALYSIS = ( + "marketplace-ibm-watson-recording-analysis" + ) + MARKETPLACE_IBM_WATSON_TONE_ANALYZER = "marketplace-ibm-watson-tone-analyzer" + MARKETPLACE_ICEHOOK_SYSTEMS_SCOUT = "marketplace-icehook-systems-scout" + MARKETPLACE_INFOGROUP_DATAAXLE_BIZINFO = ( + "marketplace-infogroup-dataaxle-bizinfo" + ) + MARKETPLACE_KEEN_IO_CONTACT_CENTER_ANALYTICS = ( + "marketplace-keen-io-contact-center-analytics" + ) + MARKETPLACE_MARCHEX_CLEANCALL = "marketplace-marchex-cleancall" + MARKETPLACE_MARCHEX_RECORDING_ANALYSIS = ( + "marketplace-marchex-recording-analysis" + ) + MARKETPLACE_MARCHEX_SENTIMENT_ANALYSIS_FOR_SMS = ( + "marketplace-marchex-sentiment-analysis-for-sms" + ) + MARKETPLACE_MARKETPLACE_NEXTCALLER_SOCIAL_ID = ( + "marketplace-marketplace-nextcaller-social-id" + ) + MARKETPLACE_MOBILE_COMMONS_OPT_OUT_CLASSIFIER = ( + "marketplace-mobile-commons-opt-out-classifier" + ) + MARKETPLACE_NEXIWAVE_VOICEMAIL_TO_TEXT = ( + "marketplace-nexiwave-voicemail-to-text" + ) + MARKETPLACE_NEXTCALLER_ADVANCED_CALLER_IDENTIFICATION = ( + "marketplace-nextcaller-advanced-caller-identification" + ) + MARKETPLACE_NOMOROBO_SPAM_SCORE = "marketplace-nomorobo-spam-score" + MARKETPLACE_PAY_ADDONS = "marketplace-pay-addons" + MARKETPLACE_PAY_ADDONS_BASECOMMERCE_PAY_CONNECTOR = ( + "marketplace-pay-addons-basecommerce-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_BRAINTREE_PAY_CONNECTOR = ( + "marketplace-pay-addons-braintree-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CARDCONNECT_PAY_CONNECTOR = ( + "marketplace-pay-addons-cardconnect-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CHASE_PAY_CONNECTOR = ( + "marketplace-pay-addons-chase-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplace-pay-addons-shuttle-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplace-pay-addons-stripe-pay-connector" + ) + MARKETPLACE_PAYFONE_TCPA_COMPLIANCE = "marketplace-payfone-tcpa-compliance" + MARKETPLACE_POLY_AI_CONNECTOR = "marketplace-poly-ai-connector" + MARKETPLACE_REALPHONEVALIDATION = "marketplace-realphonevalidation" + MARKETPLACE_REMEETING_AUTOMATIC_SPEECH_RECOGNITION = ( + "marketplace-remeeting-automatic-speech-recognition" + ) + MARKETPLACE_SPOKE_PHONE_LICENSE_PRO = "marketplace-spoke-phone-license-pro" + MARKETPLACE_SPOKE_PHONE_LICENSE_STANDARD = ( + "marketplace-spoke-phone-license-standard" + ) + MARKETPLACE_TCPA_DEFENSE_SOLUTIONS_BLACKLIST_FEED = ( + "marketplace-tcpa-defense-solutions-blacklist-feed" + ) + MARKETPLACE_TELO_OPENCNAM = "marketplace-telo-opencnam" + MARKETPLACE_TRESTLE_SOLUTIONS_CALLER_IDENTIFICATION = ( + "marketplace-trestle-solutions-caller-identification" + ) + MARKETPLACE_TRUECNAM_TRUE_SPAM = "marketplace-truecnam-true-spam" + MARKETPLACE_TWILIO_CALLER_NAME_LOOKUP_US = ( + "marketplace-twilio-caller-name-lookup-us" + ) + MARKETPLACE_TWILIO_CARRIER_INFORMATION_LOOKUP = ( + "marketplace-twilio-carrier-information-lookup" + ) + MARKETPLACE_VOICEBASE_PCI = "marketplace-voicebase-pci" + MARKETPLACE_VOICEBASE_TRANSCRIPTION = "marketplace-voicebase-transcription" + MARKETPLACE_VOICEBASE_TRANSCRIPTION_CUSTOM_VOCABULARY = ( + "marketplace-voicebase-transcription-custom-vocabulary" + ) + MARKETPLACE_WEB_PURIFY_PROFANITY_FILTER = ( + "marketplace-web-purify-profanity-filter" + ) + MARKETPLACE_WHITEPAGES_PRO_CALLER_IDENTIFICATION = ( + "marketplace-whitepages-pro-caller-identification" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_INTELLIGENCE = ( + "marketplace-whitepages-pro-phone-intelligence" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_REPUTATION = ( + "marketplace-whitepages-pro-phone-reputation" + ) + MARKETPLACE_WOLFARM_SPOKEN_RESULTS = "marketplace-wolfarm-spoken-results" + MARKETPLACE_WOLFRAM_SHORT_ANSWER = "marketplace-wolfram-short-answer" + MARKETPLACE_YTICA_CONTACT_CENTER_REPORTING_ANALYTICS = ( + "marketplace-ytica-contact-center-reporting-analytics" + ) + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplay-pay-addons-shuttle-pay-connector" + ) + MEDIA_COMPOSER_MINUTES = "media-composer-minutes" + MEDIASTORAGE = "mediastorage" + MIN_SPEND_ADJUSTMENTS = "min-spend-adjustments" + MMS = "mms" + MMS_INBOUND = "mms-inbound" + MMS_INBOUND_LONGCODE = "mms-inbound-longcode" + MMS_INBOUND_SHORTCODE = "mms-inbound-shortcode" + MMS_INBOUND_TOLL_FREE = "mms-inbound-toll-free" + MMS_MESSAGES_CARRIERFEES = "mms-messages-carrierfees" + MMS_OUTBOUND = "mms-outbound" + MMS_OUTBOUND_LONGCODE = "mms-outbound-longcode" + MMS_OUTBOUND_SHORTCODE = "mms-outbound-shortcode" + MMS_OUTBOUND_TOLLFREE = "mms-outbound-tollfree" + MONITOR = "monitor" + MONITOR_READS = "monitor-reads" + MONITOR_STORAGE = "monitor-storage" + MONITOR_WRITES = "monitor-writes" + NOTIFY = "notify" + NOTIFY_ACTIONS_ATTEMPTS = "notify-actions-attempts" + NOTIFY_CHANNELS = "notify-channels" + NUMBER_FORMAT_LOOKUPS = "number-format-lookups" + PCHAT = "pchat" + PCHAT_ACTIONS = "pchat-actions" + PCHAT_APS = "pchat-aps" + PCHAT_CONV_MED_STORAGE = "pchat-conv-med-storage" + PCHAT_MESSAGES = "pchat-messages" + PCHAT_NOTIFICATIONS = "pchat-notifications" + PCHAT_READS = "pchat-reads" + PCHAT_USERS = "pchat-users" + PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "peer-to-peer-rooms-participant-minutes" + ) + PFAX = "pfax" + PFAX_MINUTES = "pfax-minutes" + PFAX_MINUTES_INBOUND = "pfax-minutes-inbound" + PFAX_MINUTES_OUTBOUND = "pfax-minutes-outbound" + PFAX_PAGES = "pfax-pages" + PHONE_QUALITY_SCORE_LOOKUPS = "phone-quality-score-lookups" + PHONENUMBERS = "phonenumbers" + PHONENUMBERS_CPS = "phonenumbers-cps" + PHONENUMBERS_EMERGENCY = "phonenumbers-emergency" + PHONENUMBERS_LOCAL = "phonenumbers-local" + PHONENUMBERS_MOBILE = "phonenumbers-mobile" + PHONENUMBERS_PORTING = "phonenumbers-porting" + PHONENUMBERS_SETUPS = "phonenumbers-setups" + PHONENUMBERS_TOLLFREE = "phonenumbers-tollfree" + PREMIUMSUPPORT = "premiumsupport" + PREMIUMSUPPORT_PERCENTAGE_SPEND = "premiumsupport-percentage-spend" + PROGRAMMABLEVOICE_PLATFORM = "programmablevoice-platform" + PROGRAMMABLEVOICECONN_CLIENTSDK = "programmablevoiceconn-clientsdk" + PROGRAMMABLEVOICECONN_CLIENTSDK_INBOUND = ( + "programmablevoiceconn-clientsdk-inbound" + ) + PROGRAMMABLEVOICECONN_CLIENTSDK_OUTBOUND = ( + "programmablevoiceconn-clientsdk-outbound" + ) + PROGRAMMABLEVOICECONN_ONNET = "programmablevoiceconn-onnet" + PROGRAMMABLEVOICECONN_ONNET_INBOUND = "programmablevoiceconn-onnet-inbound" + PROGRAMMABLEVOICECONN_ONNET_OUTBOUND = "programmablevoiceconn-onnet-outbound" + PROGRAMMABLEVOICECONN_SIP = "programmablevoiceconn-sip" + PROGRAMMABLEVOICECONN_SIP_INBOUND = "programmablevoiceconn-sip-inbound" + PROGRAMMABLEVOICECONN_SIP_OUTBOUND = "programmablevoiceconn-sip-outbound" + PROGRAMMABLEVOICECONNECTIVITY = "programmablevoiceconnectivity" + PROXY = "proxy" + PROXY_ACTIVE_SESSIONS = "proxy-active-sessions" + PROXY_BUCKET_ADJUSTMENT = "proxy-bucket-adjustment" + PROXY_LICENSES = "proxy-licenses" + PSTNCONNECTIVITY = "pstnconnectivity" + PSTNCONNECTIVITY_INBOUND = "pstnconnectivity-inbound" + PSTNCONNECTIVITY_OUTBOUND = "pstnconnectivity-outbound" + PV = "pv" + PV_BASIC_ROOMS = "pv-basic-rooms" + PV_COMPOSITION_MEDIA_DOWNLOADED = "pv-composition-media-downloaded" + PV_COMPOSITION_MEDIA_ENCRYPTED = "pv-composition-media-encrypted" + PV_COMPOSITION_MEDIA_STORED = "pv-composition-media-stored" + PV_COMPOSITION_MINUTES = "pv-composition-minutes" + PV_RECORDING_COMPOSITIONS = "pv-recording-compositions" + PV_ROOM_PARTICIPANTS = "pv-room-participants" + PV_ROOM_PARTICIPANTS_AU1 = "pv-room-participants-au1" + PV_ROOM_PARTICIPANTS_BR1 = "pv-room-participants-br1" + PV_ROOM_PARTICIPANTS_IE1 = "pv-room-participants-ie1" + PV_ROOM_PARTICIPANTS_JP1 = "pv-room-participants-jp1" + PV_ROOM_PARTICIPANTS_SG1 = "pv-room-participants-sg1" + PV_ROOM_PARTICIPANTS_US1 = "pv-room-participants-us1" + PV_ROOM_PARTICIPANTS_US2 = "pv-room-participants-us2" + PV_ROOMS = "pv-rooms" + PV_SIP_ENDPOINT_REGISTRATIONS = "pv-sip-endpoint-registrations" + RCS_MESSAGES = "rcs-messages" + REASSIGNED_NUMBER = "reassigned-number" + RECORDINGS = "recordings" + RECORDINGSTORAGE = "recordingstorage" + SHORTCODES = "shortcodes" + SHORTCODES_CUSTOMEROWNED = "shortcodes-customerowned" + SHORTCODES_MMS_ENABLEMENT = "shortcodes-mms-enablement" + SHORTCODES_MPS = "shortcodes-mps" + SHORTCODES_RANDOM = "shortcodes-random" + SHORTCODES_SETUP_FEES = "shortcodes-setup-fees" + SHORTCODES_UK = "shortcodes-uk" + SHORTCODES_VANITY = "shortcodes-vanity" + SIM_SWAP_LOOKUPS = "sim-swap-lookups" + SIP_SECURE_MEDIA = "sip-secure-media" + SMALL_GROUP_ROOMS = "small-group-rooms" + SMALL_GROUP_ROOMS_DATA_TRACK = "small-group-rooms-data-track" + SMALL_GROUP_ROOMS_PARTICIPANT_MINUTES = "small-group-rooms-participant-minutes" + SMS = "sms" + SMS_INBOUND = "sms-inbound" + SMS_INBOUND_LONGCODE = "sms-inbound-longcode" + SMS_INBOUND_SHORTCODE = "sms-inbound-shortcode" + SMS_INBOUND_TOLLFREE = "sms-inbound-tollfree" + SMS_MESSAGES_CARRIERFEES = "sms-messages-carrierfees" + SMS_MESSAGES_FEATURES = "sms-messages-features" + SMS_MESSAGES_FEATURES_ENGAGEMENT_SUITE = ( + "sms-messages-features-engagement-suite" + ) + SMS_MESSAGES_FEATURES_MESSAGE_REDACTION = ( + "sms-messages-features-message-redaction" + ) + SMS_MESSAGES_FEATURES_SENDERID = "sms-messages-features-senderid" + SMS_MPS = "sms-mps" + SMS_MPS_SHORTCODE = "sms-mps-shortcode" + SMS_MPS_TOLLFREE = "sms-mps-tollfree" + SMS_MPS_TOLLFREE_SETUP = "sms-mps-tollfree-setup" + SMS_NATIONAL_REGULATORY_PROTECTION = "sms-national-regulatory-protection" + SMS_OUTBOUND = "sms-outbound" + SMS_OUTBOUND_CONTENT_INSPECTION = "sms-outbound-content-inspection" + SMS_OUTBOUND_LONGCODE = "sms-outbound-longcode" + SMS_OUTBOUND_SHORTCODE = "sms-outbound-shortcode" + SMS_OUTBOUND_TOLLFREE = "sms-outbound-tollfree" + SMS_PUMPING_PROTECTION = "sms-pumping-protection" + SMS_PUMPING_RISK = "sms-pumping-risk" + SMSMESSAGES_BUCKET_ADJUSTMENTS = "smsmessages-bucket-adjustments" + SMSMESSAGES_OUTBOUND_DOMESTIC = "smsmessages-outbound-domestic" + SPEECH_RECOGNITION = "speech-recognition" + STUDIO_ENGAGEMENTS = "studio-engagements" + SYNC = "sync" + SYNC_ACTIONS = "sync-actions" + SYNC_ENDPOINT_HOURS = "sync-endpoint-hours" + SYNC_ENDPOINT_HOURS_ABOVE_DAILY_CAP = "sync-endpoint-hours-above-daily-cap" + TASKROUTER_TASKS = "taskrouter-tasks" + TOTALPRICE = "totalprice" + TRANSCRIPTIONS = "transcriptions" + TRUNKING_CPS = "trunking-cps" + TRUNKING_EMERGENCY_CALLS = "trunking-emergency-calls" + TRUNKING_ORIGINATION = "trunking-origination" + TRUNKING_ORIGINATION_LOCAL = "trunking-origination-local" + TRUNKING_ORIGINATION_MOBILE = "trunking-origination-mobile" + TRUNKING_ORIGINATION_TOLLFREE = "trunking-origination-tollfree" + TRUNKING_RECORDINGS = "trunking-recordings" + TRUNKING_SECURE = "trunking-secure" + TRUNKING_TERMINATION = "trunking-termination" + TTS_GOOGLE = "tts-google" + TURNMEGABYTES = "turnmegabytes" + TURNMEGABYTES_AUSTRALIA = "turnmegabytes-australia" + TURNMEGABYTES_BRASIL = "turnmegabytes-brasil" + TURNMEGABYTES_GERMANY = "turnmegabytes-germany" + TURNMEGABYTES_INDIA = "turnmegabytes-india" + TURNMEGABYTES_IRELAND = "turnmegabytes-ireland" + TURNMEGABYTES_JAPAN = "turnmegabytes-japan" + TURNMEGABYTES_SINGAPORE = "turnmegabytes-singapore" + TURNMEGABYTES_USEAST = "turnmegabytes-useast" + TURNMEGABYTES_USWEST = "turnmegabytes-uswest" + TWILIO_FOR_SALESFORCE = "twilio-for-salesforce" + TWILIO_FOR_SALESFORCE_LICENSES = "twilio-for-salesforce-licenses" + TWILIO_INTERCONNECT = "twilio-interconnect" + TWIML = "twiml" + USAGE_FLEX_VIDEO = "usage-flex-video" + USAGE_FUNCTIONS = "usage-functions" + USAGE_RCS_BASIC_MESSAGES_OUTBOUND = "usage-rcs-basic-messages-outbound" + USAGE_RCS_MESSAGES = "usage-rcs-messages" + USAGE_RCS_MESSAGES_INBOUND = "usage-rcs-messages-inbound" + USAGE_RCS_MESSAGING_CARRIER_FEES = "usage-rcs-messaging-carrier-fees" + USAGE_RCS_SINGLE_MESSAGES_OUTBOUND = "usage-rcs-single-messages-outbound" + VERIFY_PACKAGE_PLANS = "verify-package-plans" + VERIFY_PUSH = "verify-push" + VERIFY_SNA = "verify-sna" + VERIFY_TOTP = "verify-totp" + VERIFY_VOICE_SMS = "verify-voice-sms" + VERIFY_WHATSAPP_CONVERSATIONS_BUSINESS_INITIATED = ( + "verify-whatsapp-conversations-business-initiated" + ) + VIDEO_RECORDINGS = "video-recordings" + VIDEO_ROOMS_TURN_MEGABYTES = "video-rooms-turn-megabytes" + VIRTUAL_AGENT = "virtual-agent" + VOICE_INSIGHTS = "voice-insights" + VOICE_INSIGHTS_CLIENT_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-client-insights-on-demand-minute" + ) + VOICE_INSIGHTS_PTSN_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-ptsn-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_INTERFACE_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-interface-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_TRUNKING_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-trunking-insights-on-demand-minute" + ) + VOICE_INTELLIGENCE = "voice-intelligence" + VOICE_INTELLIGENCE_EIP_OPERATORS = "voice-intelligence-eip-operators" + VOICE_INTELLIGENCE_OPERATORS = "voice-intelligence-operators" + VOICE_INTELLIGENCE_TRANSCRIPTION = "voice-intelligence-transcription" + WDS = "wds" + WIRELESS = "wireless" + WIRELESS_DATA = "wireless-data" + WIRELESS_DATA_PAYG = "wireless-data-payg" + WIRELESS_DATA_PAYG_AFRICA = "wireless-data-payg-africa" + WIRELESS_DATA_PAYG_ASIA = "wireless-data-payg-asia" + WIRELESS_DATA_PAYG_CENTRALANDSOUTHAMERICA = ( + "wireless-data-payg-centralandsouthamerica" + ) + WIRELESS_DATA_PAYG_EUROPE = "wireless-data-payg-europe" + WIRELESS_DATA_PAYG_NORTHAMERICA = "wireless-data-payg-northamerica" + WIRELESS_DATA_PAYG_OCEANIA = "wireless-data-payg-oceania" + WIRELESS_DATA_QUOTA1 = "wireless-data-quota1" + WIRELESS_DATA_QUOTA1_AFRICA = "wireless-data-quota1-africa" + WIRELESS_DATA_QUOTA1_ASIA = "wireless-data-quota1-asia" + WIRELESS_DATA_QUOTA1_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota1-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA1_EUROPE = "wireless-data-quota1-europe" + WIRELESS_DATA_QUOTA1_NORTHAMERICA = "wireless-data-quota1-northamerica" + WIRELESS_DATA_QUOTA1_OCEANIA = "wireless-data-quota1-oceania" + WIRELESS_DATA_QUOTA10 = "wireless-data-quota10" + WIRELESS_DATA_QUOTA10_AFRICA = "wireless-data-quota10-africa" + WIRELESS_DATA_QUOTA10_ASIA = "wireless-data-quota10-asia" + WIRELESS_DATA_QUOTA10_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota10-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA10_EUROPE = "wireless-data-quota10-europe" + WIRELESS_DATA_QUOTA10_NORTHAMERICA = "wireless-data-quota10-northamerica" + WIRELESS_DATA_QUOTA10_OCEANIA = "wireless-data-quota10-oceania" + WIRELESS_DATA_QUOTA50 = "wireless-data-quota50" + WIRELESS_DATA_QUOTA50_AFRICA = "wireless-data-quota50-africa" + WIRELESS_DATA_QUOTA50_ASIA = "wireless-data-quota50-asia" + WIRELESS_DATA_QUOTA50_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota50-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA50_EUROPE = "wireless-data-quota50-europe" + WIRELESS_DATA_QUOTA50_NORTHAMERICA = "wireless-data-quota50-northamerica" + WIRELESS_DATA_QUOTA50_OCEANIA = "wireless-data-quota50-oceania" + WIRELESS_DATA_QUOTACUSTOM = "wireless-data-quotacustom" + WIRELESS_DATA_QUOTACUSTOM_AFRICA = "wireless-data-quotacustom-africa" + WIRELESS_DATA_QUOTACUSTOM_ASIA = "wireless-data-quotacustom-asia" + WIRELESS_DATA_QUOTACUSTOM_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quotacustom-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_EUROPE = "wireless-data-quotacustom-europe" + WIRELESS_DATA_QUOTACUSTOM_NORTHAMERICA = ( + "wireless-data-quotacustom-northamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_OCEANIA = "wireless-data-quotacustom-oceania" + WIRELESS_MRC_PAYG = "wireless-mrc-payg" + WIRELESS_MRC_QUOTA1 = "wireless-mrc-quota1" + WIRELESS_MRC_QUOTA10 = "wireless-mrc-quota10" + WIRELESS_MRC_QUOTA50 = "wireless-mrc-quota50" + WIRELESS_MRC_QUOTACUSTOM = "wireless-mrc-quotacustom" + WIRELESS_ORDERS = "wireless-orders" + WIRELESS_ORDERS_ARTWORK = "wireless-orders-artwork" + WIRELESS_ORDERS_BULK = "wireless-orders-bulk" + WIRELESS_ORDERS_ESIM = "wireless-orders-esim" + WIRELESS_ORDERS_STARTER = "wireless-orders-starter" + WIRELESS_QUOTAS = "wireless-quotas" + WIRELESS_SMS_AFRICA = "wireless-sms-africa" + WIRELESS_SMS_ASIA = "wireless-sms-asia" + WIRELESS_SMS_CENTRALANDSOUTHAMERICA = "wireless-sms-centralandsouthamerica" + WIRELESS_SMS_EUROPE = "wireless-sms-europe" + WIRELESS_SMS_NORTHAMERICA = "wireless-sms-northamerica" + WIRELESS_SMS_OCEANIA = "wireless-sms-oceania" + WIRELESS_SUPER_SIM = "wireless-super-sim" + WIRELESS_SUPER_SIM_DATA = "wireless-super-sim-data" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA_USA = ( + "wireless-super-sim-data-north-america-usa" + ) + WIRELESS_SUPER_SIM_DATA_PAYG = "wireless-super-sim-data-payg" + WIRELESS_SUPER_SIM_DATA_PAYG_EUROPE = "wireless-super-sim-data-payg-europe" + WIRELESS_SUPER_SIM_DATA_PAYG_NORTH_AMERICA = ( + "wireless-super-sim-data-payg-north-america" + ) + WIRELESS_SUPER_SIM_HARDWARE = "wireless-super-sim-hardware" + WIRELESS_SUPER_SIM_HARDWARE_BULK = "wireless-super-sim-hardware-bulk" + WIRELESS_SUPER_SIM_SMSCOMMANDS = "wireless-super-sim-smscommands" + WIRELESS_SUPER_SIM_SMSCOMMANDS_AFRICA = "wireless-super-sim-smscommands-africa" + WIRELESS_SUPER_SIM_SMSCOMMANDS_ASIA = "wireless-super-sim-smscommands-asia" + WIRELESS_SUPER_SIM_SMSCOMMANDS_CENT_AND_SOUTH_AMERICA = ( + "wireless-super-sim-smscommands-cent-and-south-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_EUROPE = "wireless-super-sim-smscommands-europe" + WIRELESS_SUPER_SIM_SMSCOMMANDS_NORTH_AMERICA = ( + "wireless-super-sim-smscommands-north-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_OCEANIA = ( + "wireless-super-sim-smscommands-oceania" + ) + WIRELESS_SUPER_SIM_SUBSCRIPTION = "wireless-super-sim-subscription" + WIRELESS_SUPER_SIM_SUBSCRIPTION_PAYG = "wireless-super-sim-subscription-payg" + WIRELESS_USAGE = "wireless-usage" + WIRELESS_USAGE_COMMANDS = "wireless-usage-commands" + WIRELESS_USAGE_COMMANDS_AFRICA = "wireless-usage-commands-africa" + WIRELESS_USAGE_COMMANDS_ASIA = "wireless-usage-commands-asia" + WIRELESS_USAGE_COMMANDS_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-commands-centralandsouthamerica" + ) + WIRELESS_USAGE_COMMANDS_EUROPE = "wireless-usage-commands-europe" + WIRELESS_USAGE_COMMANDS_HOME = "wireless-usage-commands-home" + WIRELESS_USAGE_COMMANDS_NORTHAMERICA = "wireless-usage-commands-northamerica" + WIRELESS_USAGE_COMMANDS_OCEANIA = "wireless-usage-commands-oceania" + WIRELESS_USAGE_COMMANDS_ROAMING = "wireless-usage-commands-roaming" + WIRELESS_USAGE_DATA = "wireless-usage-data" + WIRELESS_USAGE_DATA_AFRICA = "wireless-usage-data-africa" + WIRELESS_USAGE_DATA_ASIA = "wireless-usage-data-asia" + WIRELESS_USAGE_DATA_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-data-centralandsouthamerica" + ) + WIRELESS_USAGE_DATA_CUSTOM_ADDITIONALMB = ( + "wireless-usage-data-custom-additionalmb" + ) + WIRELESS_USAGE_DATA_CUSTOM_FIRST5MB = "wireless-usage-data-custom-first5mb" + WIRELESS_USAGE_DATA_DOMESTIC_ROAMING = "wireless-usage-data-domestic-roaming" + WIRELESS_USAGE_DATA_EUROPE = "wireless-usage-data-europe" + WIRELESS_USAGE_DATA_INDIVIDUAL_ADDITIONALGB = ( + "wireless-usage-data-individual-additionalgb" + ) + WIRELESS_USAGE_DATA_INDIVIDUAL_FIRSTGB = ( + "wireless-usage-data-individual-firstgb" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_CANADA = ( + "wireless-usage-data-international-roaming-canada" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_INDIA = ( + "wireless-usage-data-international-roaming-india" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_MEXICO = ( + "wireless-usage-data-international-roaming-mexico" + ) + WIRELESS_USAGE_DATA_NORTHAMERICA = "wireless-usage-data-northamerica" + WIRELESS_USAGE_DATA_OCEANIA = "wireless-usage-data-oceania" + WIRELESS_USAGE_DATA_POOLED = "wireless-usage-data-pooled" + WIRELESS_USAGE_DATA_POOLED_DOWNLINK = "wireless-usage-data-pooled-downlink" + WIRELESS_USAGE_DATA_POOLED_UPLINK = "wireless-usage-data-pooled-uplink" + WIRELESS_USAGE_MRC = "wireless-usage-mrc" + WIRELESS_USAGE_MRC_CUSTOM = "wireless-usage-mrc-custom" + WIRELESS_USAGE_MRC_INDIVIDUAL = "wireless-usage-mrc-individual" + WIRELESS_USAGE_MRC_POOLED = "wireless-usage-mrc-pooled" + WIRELESS_USAGE_MRC_SUSPENDED = "wireless-usage-mrc-suspended" + WIRELESS_USAGE_SMS = "wireless-usage-sms" + WIRELESS_USAGE_VOICE = "wireless-usage-voice" + A2P_FAST_TRACK_ONBOARDING = "a2p-fast-track-onboarding" + ADVISORY_SERVICES = "advisory-services" + ADVISORY_SERVICES_BILLED = "advisory-services-billed" + ADVISORY_SERVICES_CALL_TRACKING = "advisory-services-call-tracking" + ADVISORY_SERVICES_DATA_SERVICES = "advisory-services-data-services" + ADVISORY_SERVICES_EXPENSES = "advisory-services-expenses" + ADVISORY_SERVICES_SIP_TRUNKING = "advisory-services-sip-trunking" + ASSETS_REQUESTS = "assets-requests" + AUDIENCE_MINUTES_VIDEO = "audience-minutes-video" + AUTHY_BUCKET_ADJUSTMENT = "authy-bucket-adjustment" + AUTHY_SOFTWARE = "authy-software" + CALLERIDLOOKUPS_API = "calleridlookups-api" + CALLERIDLOOKUPS_PROGRAMMABLEVOICE = "calleridlookups-programmablevoice" + CALLERIDLOOKUPS_TRUNKING = "calleridlookups-trunking" + CALLS_TRUNKING_INBOUND_TOLLFREE_LOCAL = "calls-trunking-inbound-tollfree-local" + CALLS_TRUNKING_INBOUND_TOLLFREE_MOBILE = ( + "calls-trunking-inbound-tollfree-mobile" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE_1 = "channels-whatsapp-conversation-free-1" + CONFERENCE = "conference" + CONVERSATIONAL_INSIGHTS = "conversational-insights" + CONVERSATIONAL_INSIGHTS_MESSAGES = "conversational-insights-messages" + CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = "conversational-insights-voice-minutes" + DEMO = "demo" + DEMO_UC_SCRIPT_TEST = "demo-uc-script-test" + ELASTIC_SIP_TRUNKING = "elastic-sip-trunking" + ELASTIC_SIP_TRUNKING_CALL_TRANSFERS = "elastic-sip-trunking-call-transfers" + ENTERPRISE_HIPPA = "enterprise-hippa" + FLEX_NAMED_USERS = "flex-named-users" + FLEX_SPINSCI = "flex-spinsci" + FLEX_USERS_1 = "flex-users-1" + FLEX_WFO_PREMIUM_SPEECH_ANALYTICS = "flex-wfo-premium-speech-analytics" + FLEX_XCELERATE = "flex-xcelerate" + FUNCTIONS_ROLLUP = "functions-rollup" + IMP_V1_USAGE = "imp-v1-usage" + IP_MESSAGING_ADDONS = "ip-messaging-addons" + IVR = "ivr" + IVR_CONVERSATIONAL = "ivr-conversational" + IVR_DTMF = "ivr-dtmf" + IVR_VIRTUALAGENT = "ivr-virtualagent" + LIVE = "live" + LIVE_MEDIA_RECORDING_MINUTES = "live-media-recording-minutes" + LONGCODE_MPS = "longcode-mps" + MARKETPLACE_ANALYTICS_ADDONS = "marketplace-analytics-addons" + MARKETPLACE_ISV_ADDONS = "marketplace-isv-addons" + MARKETPLACE_MESSAGING_ADDONS = "marketplace-messaging-addons" + MARKETPLACE_PHONENUMBERS_ADDONS = "marketplace-phonenumbers-addons" + MARKETPLACE_RECORDING_ADDONS = "marketplace-recording-addons" + MARKETPLACE_VIRTUALAGENT_ADDONS = "marketplace-virtualagent-addons" + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR_1 = ( + "marketplay-pay-addons-shuttle-pay-connector-1" + ) + MARKETPLAY_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplay-pay-addons-stripe-pay-connector" + ) + MMS_INBOUND_LONGCODE_CANADA = "mms-inbound-longcode-canada" + MMS_INBOUND_LONGCODE_UNITEDSTATES = "mms-inbound-longcode-unitedstates" + MMS_OUTBOUND_LONGCODE_CANADA = "mms-outbound-longcode-canada" + MMS_OUTBOUND_LONGCODE_UNITEDSTATES = "mms-outbound-longcode-unitedstates" + MMS_OUTBOUND_TOLL_FREE = "mms-outbound-toll-free" + NOTIFY_CHATAPPSANDOTHERCHANNELS = "notify-chatappsandotherchannels" + NOTIFY_NOTIFYSERVICES = "notify-notifyservices" + NOTIFY_PUSHNOTIFICATIONS = "notify-pushnotifications" + PAYMENT_GATEWAY_CONNECTORS = "payment-gateway-connectors" + PAYMENT_SOLUTIONS = "payment-solutions" + PCHAT_BUCKET_ADJUSTMENT = "pchat-bucket-adjustment" + PHONENUMBERS_NUMBERS = "phonenumbers-numbers" + PROG_VOICE_CLIENT_ANDROID = "prog-voice-client-android" + PROG_VOICE_CLIENT_ANDROID_INBOUND = "prog-voice-client-android-inbound" + PROG_VOICE_CLIENT_ANDROID_OUTBOUND = "prog-voice-client-android-outbound" + PROG_VOICE_CLIENT_IOS = "prog-voice-client-ios" + PROG_VOICE_CLIENT_IOS_INBOUND = "prog-voice-client-ios-inbound" + PROG_VOICE_CLIENT_IOS_OUTBOUND = "prog-voice-client-ios-outbound" + PROG_VOICE_CLIENT_SDK = "prog-voice-client-sdk" + PROG_VOICE_CLIENT_WEB = "prog-voice-client-web" + PROG_VOICE_CLIENT_WEB_INBOUND = "prog-voice-client-web-inbound" + PROG_VOICE_CLIENT_WEB_OUTBOUND = "prog-voice-client-web-outbound" + PROGRAMMABLEVOICECONNECTIVITY_MEDIA_STREAMS = ( + "programmablevoiceconnectivity-media-streams" + ) + PSTNCONNECTIVITY_BYOC = "pstnconnectivity-byoc" + PSTNCONNECTIVITY_EMERGENCY = "pstnconnectivity-emergency" + PSTNCONNECTIVITY_MINUTES = "pstnconnectivity-minutes" + PSTNCONNECTIVITY_MINUTES_1 = "pstnconnectivity-minutes-1" + PSTNCONNECTIVITY_MINUTESINBOUNDLOCAL = "pstnconnectivity-minutesinboundlocal" + PSTNCONNECTIVITY_MINUTESINBOUNDMOBILE = "pstnconnectivity-minutesinboundmobile" + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREE = ( + "pstnconnectivity-minutesinboundtollfree" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREELOCAL = ( + "pstnconnectivity-minutesinboundtollfreelocal" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREEMOBILE = ( + "pstnconnectivity-minutesinboundtollfreemobile" + ) + PV_ROOM_HOURS = "pv-room-hours" + PV_ROOM_SIMULTANEOUS_PARTICIPANT_CONNECTIONS = ( + "pv-room-simultaneous-participant-connections" + ) + PVIDEO_ROOM_HOURS_AU1 = "pvideo-room-hours-au1" + PVIDEO_ROOM_HOURS_BR1 = "pvideo-room-hours-br1" + PVIDEO_ROOM_HOURS_IE1 = "pvideo-room-hours-ie1" + PVIDEO_ROOM_HOURS_JP1 = "pvideo-room-hours-jp1" + PVIDEO_ROOM_HOURS_SG1 = "pvideo-room-hours-sg1" + PVIDEO_ROOM_HOURS_US1 = "pvideo-room-hours-us1" + PVIDEO_ROOM_HOURS_US2 = "pvideo-room-hours-us2" + RECORDINGS_ENCRYPTED = "recordings-encrypted" + SHORT_CODE_SETUP_FEES = "short-code-setup-fees" + SHORTCODES_MESSAGES_INBOUND = "shortcodes-messages-inbound" + SHORTCODES_MESSAGES_OUTBOUND = "shortcodes-messages-outbound" + SMS_MESSAGES_REGISTRATIONFEES = "sms-messages-registrationfees" + SMS_MMS_PENALTY_FEES = "sms-mms-penalty-fees" + SMS_MMS_PENALTY_FEES_1 = "sms-mms-penalty-fees-1" + SMS_PUMPING_PROTECTION_NON_USCA = "sms-pumping-protection-non-usca" + SMS_PUMPING_PROTECTION_USCA = "sms-pumping-protection-usca" + STUDIO = "studio" + STUDIO_MONTHLY_FEES = "studio-monthly-fees" + SUPERSIM = "supersim" + TASK_ROUTER = "task-router" + TASK_ROUTER_WORKERS = "task-router-workers" + TEST_QUOTA_BUCKETS = "test-quota-buckets" + TEST_UC_SCRIPT_1 = "test-uc-script-1" + TEST_UC_SCRIPT_DEMO_2 = "test-uc-script-demo-2" + TEXT_TO_SPEECH = "text-to-speech" + TME = "tme" + TTS_BASIC = "tts-basic" + TWILIO_EDITIONS = "twilio-editions" + TWILIO_INTERCONNECT_CALIFORNIA = "twilio-interconnect-california" + TWILIO_INTERCONNECT_CALIFORNIA_MONTHLY = ( + "twilio-interconnect-california-monthly" + ) + TWILIO_INTERCONNECT_CALIFORNIA_SETUP = "twilio-interconnect-california-setup" + TWILIO_INTERCONNECT_FRANKFURT = "twilio-interconnect-frankfurt" + TWILIO_INTERCONNECT_FRANKFURT_MO = "twilio-interconnect-frankfurt-mo" + TWILIO_INTERCONNECT_FRANKFURT_SETUP = "twilio-interconnect-frankfurt-setup" + TWILIO_INTERCONNECT_LONDON = "twilio-interconnect-london" + TWILIO_INTERCONNECT_LONDON_MO = "twilio-interconnect-london-mo" + TWILIO_INTERCONNECT_LONDON_SETUP = "twilio-interconnect-london-setup" + TWILIO_INTERCONNECT_SAO_PAULO = "twilio-interconnect-sao-paulo" + TWILIO_INTERCONNECT_SAO_PAULO_MONTHLY = "twilio-interconnect-sao-paulo-monthly" + TWILIO_INTERCONNECT_SAO_PAULO_SETUP = "twilio-interconnect-sao-paulo-setup" + TWILIO_INTERCONNECT_SINGAPORE = "twilio-interconnect-singapore" + TWILIO_INTERCONNECT_SINGAPORE_MO = "twilio-interconnect-singapore-mo" + TWILIO_INTERCONNECT_SINGAPORE_SETUP = "twilio-interconnect-singapore-setup" + TWILIO_INTERCONNECT_SYDNEY = "twilio-interconnect-sydney" + TWILIO_INTERCONNECT_SYDNEY_MO = "twilio-interconnect-sydney-mo" + TWILIO_INTERCONNECT_SYDNEY_SETUP = "twilio-interconnect-sydney-setup" + TWILIO_INTERCONNECT_TOKYO = "twilio-interconnect-tokyo" + TWILIO_INTERCONNECT_TOKYO_MO = "twilio-interconnect-tokyo-mo" + TWILIO_INTERCONNECT_TOKYO_SETUP = "twilio-interconnect-tokyo-setup" + TWILIO_INTERCONNECT_VA = "twilio-interconnect-va" + TWILIO_INTERCONNECT_VA_MO = "twilio-interconnect-va-mo" + TWILIO_INTERCONNECT_VA_SETUP = "twilio-interconnect-va-setup" + TWIML_VERBS = "twiml-verbs" + TWIML_VERBS_SAY = "twiml-verbs-say" + USAGE_PROGRAMMABLE_MESSAGING_ENGAGEMENT_SUITE = ( + "usage-programmable-messaging-engagement-suite" + ) + USAGE_PROGRAMMABLE_MESSAGING_FEES_SERVICES = ( + "usage-programmable-messaging-fees-services" + ) + VERIFY_OUTBOUND_EMAIL = "verify-outbound-email" + VERIFY_PACKAGED_PLANS = "verify-packaged-plans" + VERIFY_SILENT_NETWORK_AUTH = "verify-silent-network-auth" + VERIFY_VOICE_AND_SMS = "verify-voice-and-sms" + VOICE_INSIGHTS_CLIENT_INSIGHTS_MONTHY_COMMIT = ( + "voice-insights-client-insights-monthy-commit" + ) + WIRELESS_DATA_PAYG_ASIA_AFG = "wireless-data-payg-asia-afg" + WIRELESS_MULTI_IMSI_SIM_COMMANDS = "wireless-multi-imsi-sim-commands" + WIRELESS_MULTI_IMSI_SIM_COMMANDS_USA = "wireless-multi-imsi-sim-commands-usa" + WIRELESS_MULTI_IMSI_SIM_DATA = "wireless-multi-imsi-sim-data" + WIRELESS_MULTI_IMSI_SIM_DATA_EU28 = "wireless-multi-imsi-sim-data-eu28" + WIRELESS_MULTI_IMSI_SIM_DATA_USA = "wireless-multi-imsi-sim-data-usa" + WIRELESS_MULTI_IMSI_SIM_MONTHLY_FEES = "wireless-multi-imsi-sim-monthly-fees" + WIRELESS_MULTI_IMSI_SIM_USAGE = "wireless-multi-imsi-sim-usage" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA = "wireless-super-sim-data-north-america" + WIRELESS_SUPER_SIM_USAGE = "wireless-super-sim-usage" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that accrued the usage. + :ivar api_version: The API version used to create the resource. + :ivar as_of: Usage records up to date as of this timestamp, formatted as YYYY-MM-DDTHH:MM:SS+00:00. All timestamps are in GMT + :ivar category: + :ivar count: The number of usage events, such as the number of calls. + :ivar count_unit: The units in which `count` is measured, such as `calls` for calls or `messages` for SMS. + :ivar description: A plain-language description of the usage category. + :ivar end_date: The last date for which usage is included in the UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar price: The total price of the usage in the currency specified in `price_unit` and associated with the account. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format, such as `usd`, `eur`, and `jpy`. + :ivar start_date: The first date for which usage is included in this UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar subresource_uris: A list of related resources identified by their URIs. For more information, see [List Subresources](https://www.twilio.com/docs/usage/api/usage-record#list-subresources). + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar usage: The amount used to bill usage and measured in units described in `usage_unit`. + :ivar usage_unit: The units in which `usage` is measured, such as `minutes` for calls or `messages` for SMS. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.as_of: Optional[str] = payload.get("as_of") + self.category: Optional["DailyInstance.Category"] = payload.get("category") + self.count: Optional[str] = payload.get("count") + self.count_unit: Optional[str] = payload.get("count_unit") + self.description: Optional[str] = payload.get("description") + self.end_date: Optional[date] = deserialize.iso8601_date( + payload.get("end_date") + ) + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.start_date: Optional[date] = deserialize.iso8601_date( + payload.get("start_date") + ) + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.uri: Optional[str] = payload.get("uri") + self.usage: Optional[str] = payload.get("usage") + self.usage_unit: Optional[str] = payload.get("usage_unit") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DailyPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> DailyInstance: + """ + Build an instance of DailyInstance + + :param payload: Payload response from the API + """ + return DailyInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DailyList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the DailyList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageRecord resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Records/Daily.json".format( + **self._solution + ) + + def stream( + self, + category: Union["DailyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DailyInstance]: + """ + Streams DailyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "DailyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + category: Union["DailyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DailyInstance]: + """ + Asynchronously streams DailyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "DailyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + category: Union["DailyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DailyInstance]: + """ + Lists DailyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "DailyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + category: Union["DailyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DailyInstance]: + """ + Asynchronously lists DailyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "DailyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + category: Union["DailyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DailyPage: + """ + Retrieve a single page of DailyInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DailyInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DailyPage(self._version, response, self._solution) + + async def page_async( + self, + category: Union["DailyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DailyPage: + """ + Asynchronously retrieve a single page of DailyInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DailyInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DailyPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DailyPage: + """ + Retrieve a specific page of DailyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DailyInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DailyPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DailyPage: + """ + Asynchronously retrieve a specific page of DailyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DailyInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DailyPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/last_month.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/last_month.py new file mode 100644 index 00000000..4057283e --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/last_month.py @@ -0,0 +1,1211 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class LastMonthInstance(InstanceResource): + + class Category(object): + A2P_10DLC_REGISTRATIONFEES_BRANDREGISTRATION = ( + "a2p-10dlc-registrationfees-brandregistration" + ) + A2P_10DLC_REGISTRATIONFEES_BV = "a2p-10dlc-registrationfees-bv" + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNCHARGES = ( + "a2p-10dlc-registrationfees-campaigncharges" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNREGISTRATION = ( + "a2p-10dlc-registrationfees-campaignregistration" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNVETTING = ( + "a2p-10dlc-registrationfees-campaignvetting" + ) + A2P_10DLC_REGISTRATIONFEES_MONTHLY = "a2p-10dlc-registrationfees-monthly" + A2P_10DLC_REGISTRATIONFEES_ONETIME = "a2p-10dlc-registrationfees-onetime" + A2P_REGISTRATION_FEES = "a2p-registration-fees" + ACCOUNT_SECURITY = "account-security" + AGENT_CONFERENCE = "agent-conference" + AGENT_COPILOT = "agent-copilot" + AGENT_COPILOT_MESSAGES = "agent-copilot-messages" + AGENT_COPILOT_PARTICIPANT_MINUTES = "agent-copilot-participant-minutes" + AI_ASSISTANTS = "ai-assistants" + AI_ASSISTANTS_VOICE = "ai-assistants-voice" + AMAZON_POLLY = "amazon-polly" + ANSWERING_MACHINE_DETECTION = "answering-machine-detection" + ASSETS = "assets" + AUDIENCE_MINUTES = "audience-minutes" + AUDIENCE_MINUTES_AUDIO = "audience-minutes-audio" + AUTHY_AUTHENTICATIONS = "authy-authentications" + AUTHY_CALLS_OUTBOUND = "authy-calls-outbound" + AUTHY_EMAIL_AUTHENTICATIONS = "authy-email-authentications" + AUTHY_MONTHLY_FEES = "authy-monthly-fees" + AUTHY_OUTBOUND_EMAIL = "authy-outbound-email" + AUTHY_PHONE_INTELLIGENCE = "authy-phone-intelligence" + AUTHY_PHONE_VERIFICATIONS = "authy-phone-verifications" + AUTHY_SMS_OUTBOUND = "authy-sms-outbound" + AUTHY_VERIFY_EMAIL_VERIFICATIONS = "authy-verify-email-verifications" + AUTHY_VERIFY_OUTBOUND_EMAIL = "authy-verify-outbound-email" + AUTOPILOT = "autopilot" + AUTOPILOT_HOME_ASSISTANTS = "autopilot-home-assistants" + AUTOPILOT_MESSAGING = "autopilot-messaging" + AUTOPILOT_OTHER = "autopilot-other" + AUTOPILOT_VOICE = "autopilot-voice" + BASIC_PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "basic-peer-to-peer-rooms-participant-minutes" + ) + BRANDED_CALLING = "branded-calling" + BUNDLE_SMS_BUCKET = "bundle-sms-bucket" + BUNDLE_SUBSCRIPTION_FEES = "bundle-subscription-fees" + CALL_FORWARDING_LOOKUPS = "call-forwarding-lookups" + CALL_PROGESS_EVENTS = "call-progess-events" + CALLERIDLOOKUPS = "calleridlookups" + CALLS = "calls" + CALLS_CLIENT = "calls-client" + CALLS_EMERGENCY = "calls-emergency" + CALLS_GLOBALCONFERENCE = "calls-globalconference" + CALLS_INBOUND = "calls-inbound" + CALLS_INBOUND_LOCAL = "calls-inbound-local" + CALLS_INBOUND_MOBILE = "calls-inbound-mobile" + CALLS_INBOUND_TOLLFREE = "calls-inbound-tollfree" + CALLS_INBOUND_TOLLFREE_LOCAL = "calls-inbound-tollfree-local" + CALLS_INBOUND_TOLLFREE_MOBILE = "calls-inbound-tollfree-mobile" + CALLS_MEDIA_STREAM_MINUTES = "calls-media-stream-minutes" + CALLS_OUTBOUND = "calls-outbound" + CALLS_PAY_VERB_TRANSACTIONS = "calls-pay-verb-transactions" + CALLS_RECORDINGS = "calls-recordings" + CALLS_SIP = "calls-sip" + CALLS_SIP_INBOUND = "calls-sip-inbound" + CALLS_SIP_OUTBOUND = "calls-sip-outbound" + CALLS_TEXT_TO_SPEECH = "calls-text-to-speech" + CALLS_TRANSFERS = "calls-transfers" + CARRIER_LOOKUPS = "carrier-lookups" + CATEGORY = "category" + CHANNELS = "channels" + CHANNELS_MESSAGING = "channels-messaging" + CHANNELS_MESSAGING_INBOUND = "channels-messaging-inbound" + CHANNELS_MESSAGING_OUTBOUND = "channels-messaging-outbound" + CHANNELS_WHATSAPP = "channels-whatsapp" + CHANNELS_WHATSAPP_CONVERSATION_AUTHENTICATION = ( + "channels-whatsapp-conversation-authentication" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE = "channels-whatsapp-conversation-free" + CHANNELS_WHATSAPP_CONVERSATION_MARKETING = ( + "channels-whatsapp-conversation-marketing" + ) + CHANNELS_WHATSAPP_CONVERSATION_SERVICE = ( + "channels-whatsapp-conversation-service" + ) + CHANNELS_WHATSAPP_CONVERSATION_UTILITY = ( + "channels-whatsapp-conversation-utility" + ) + CHANNELS_WHATSAPP_INBOUND = "channels-whatsapp-inbound" + CHANNELS_WHATSAPP_OUTBOUND = "channels-whatsapp-outbound" + CHAT_VIRTUAL_AGENT = "chat-virtual-agent" + CONVERSATION_RELAY = "conversation-relay" + CONVERSATIONS = "conversations" + CONVERSATIONS_API_REQUESTS = "conversations-api-requests" + CONVERSATIONS_CONVERSATION_EVENTS = "conversations-conversation-events" + CONVERSATIONS_ENDPOINT_CONNECTIVITY = "conversations-endpoint-connectivity" + CONVERSATIONS_EVENTS = "conversations-events" + CONVERSATIONS_PARTICIPANT_EVENTS = "conversations-participant-events" + CONVERSATIONS_PARTICIPANTS = "conversations-participants" + CPS = "cps" + CREDIT_TRANSFER = "credit-transfer" + EMAIL = "email" + EMERGING_TECH = "emerging-tech" + ENGAGEMENT_SUITE_PACKAGED_PLANS = "engagement-suite-packaged-plans" + ENHANCED_LINE_TYPE_LOOKUPS = "enhanced-line-type-lookups" + ENTERPRISE = "enterprise" + EVENTS = "events" + EXPERIMENT_FRANCE_SMS = "experiment-france-sms" + EXPERIMENT_INDIA_SMS = "experiment-india-sms" + EXPERIMENT_UK_SMS = "experiment-uk-sms" + FAILED_MESSAGE_PROCESSING_FEE = "failed-message-processing-fee" + FLEX = "flex" + FLEX_ACTIVE_USER_HOURS = "flex-active-user-hours" + FLEX_CONCURRENT_USERS = "flex-concurrent-users" + FLEX_CONVERSATIONAL_INSIGHTS = "flex-conversational-insights" + FLEX_CONVERSATIONAL_INSIGHTS_MESSAGES = "flex-conversational-insights-messages" + FLEX_CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = ( + "flex-conversational-insights-voice-minutes" + ) + FLEX_EMAIL_USAGE = "flex-email-usage" + FLEX_MESSAGING_USAGE = "flex-messaging-usage" + FLEX_PARTNER_SPINSCI = "flex-partner-spinsci" + FLEX_PARTNER_XCELERATE = "flex-partner-xcelerate" + FLEX_RESELLER_ECOSYSTEM = "flex-reseller-ecosystem" + FLEX_UNIQUE_USER = "flex-unique-user" + FLEX_USAGE = "flex-usage" + FLEX_USERS = "flex-users" + FLEX_VOICE_MINUTE = "flex-voice-minute" + FLEX_YTICA = "flex-ytica" + FRAUD_LOOKUPS = "fraud-lookups" + FRONTLINE = "frontline" + FRONTLINE_USERS = "frontline-users" + FUNCTIONS = "functions" + GENERIC_PAY_TRANSACTIONS = "generic-pay-transactions" + GROUP_ROOMS = "group-rooms" + GROUP_ROOMS_DATA_TRACK = "group-rooms-data-track" + GROUP_ROOMS_ENCRYPTED_MEDIA_RECORDED = "group-rooms-encrypted-media-recorded" + GROUP_ROOMS_MEDIA_DOWNLOADED = "group-rooms-media-downloaded" + GROUP_ROOMS_MEDIA_RECORDED = "group-rooms-media-recorded" + GROUP_ROOMS_MEDIA_ROUTED = "group-rooms-media-routed" + GROUP_ROOMS_MEDIA_STORED = "group-rooms-media-stored" + GROUP_ROOMS_PARTICIPANT_MINUTES = "group-rooms-participant-minutes" + GROUP_ROOMS_RECORDED_MINUTES = "group-rooms-recorded-minutes" + IP_MESSAGING = "ip-messaging" + IP_MESSAGING_COMMANDS = "ip-messaging-commands" + IP_MESSAGING_DATA_STORAGE = "ip-messaging-data-storage" + IP_MESSAGING_DATA_TRANSFER = "ip-messaging-data-transfer" + IP_MESSAGING_ENDPOINT_CONNECTIVITY = "ip-messaging-endpoint-connectivity" + IVR_VIRTUAL_AGENT_CUSTOM_VOICES = "ivr-virtual-agent-custom-voices" + IVR_VIRTUAL_AGENT_GENAI = "ivr-virtual-agent-genai" + LINE_STATUS_LOOKUPS = "line-status-lookups" + LIVE_ACTIVITY_LOOKUPS = "live-activity-lookups" + LOOKUP_BUCKET_ADJUSTMENT = "lookup-bucket-adjustment" + LOOKUP_IDENTITY_MATCH = "lookup-identity-match" + LOOKUPS = "lookups" + MARKETPLACE = "marketplace" + MARKETPLACE_ALGORITHMIA_NAMED_ENTITY_RECOGNITION = ( + "marketplace-algorithmia-named-entity-recognition" + ) + MARKETPLACE_CADENCE_TRANSCRIPTION = "marketplace-cadence-transcription" + MARKETPLACE_CADENCE_TRANSLATION = "marketplace-cadence-translation" + MARKETPLACE_CAPIO_SPEECH_TO_TEXT = "marketplace-capio-speech-to-text" + MARKETPLACE_CONVRIZA_ABABA = "marketplace-convriza-ababa" + MARKETPLACE_DEEPGRAM_PHRASE_DETECTOR = "marketplace-deepgram-phrase-detector" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION = "marketplace-deepgram-transcription" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION_BASE = ( + "marketplace-deepgram-transcription-base" + ) + MARKETPLACE_DEEPGRAM_TRANSSCRIPTION_ENHANCED = ( + "marketplace-deepgram-transscription-enhanced" + ) + MARKETPLACE_DIGITAL_SEGMENT_BUSINESS_INFO = ( + "marketplace-digital-segment-business-info" + ) + MARKETPLACE_FACEBOOK_OFFLINE_CONVERSIONS = ( + "marketplace-facebook-offline-conversions" + ) + MARKETPLACE_GOOGLE_SPEECH_TO_TEXT = "marketplace-google-speech-to-text" + MARKETPLACE_IBM_WATSON_MESSAGE_INSIGHTS = ( + "marketplace-ibm-watson-message-insights" + ) + MARKETPLACE_IBM_WATSON_MESSAGE_SENTIMENT = ( + "marketplace-ibm-watson-message-sentiment" + ) + MARKETPLACE_IBM_WATSON_RECORDING_ANALYSIS = ( + "marketplace-ibm-watson-recording-analysis" + ) + MARKETPLACE_IBM_WATSON_TONE_ANALYZER = "marketplace-ibm-watson-tone-analyzer" + MARKETPLACE_ICEHOOK_SYSTEMS_SCOUT = "marketplace-icehook-systems-scout" + MARKETPLACE_INFOGROUP_DATAAXLE_BIZINFO = ( + "marketplace-infogroup-dataaxle-bizinfo" + ) + MARKETPLACE_KEEN_IO_CONTACT_CENTER_ANALYTICS = ( + "marketplace-keen-io-contact-center-analytics" + ) + MARKETPLACE_MARCHEX_CLEANCALL = "marketplace-marchex-cleancall" + MARKETPLACE_MARCHEX_RECORDING_ANALYSIS = ( + "marketplace-marchex-recording-analysis" + ) + MARKETPLACE_MARCHEX_SENTIMENT_ANALYSIS_FOR_SMS = ( + "marketplace-marchex-sentiment-analysis-for-sms" + ) + MARKETPLACE_MARKETPLACE_NEXTCALLER_SOCIAL_ID = ( + "marketplace-marketplace-nextcaller-social-id" + ) + MARKETPLACE_MOBILE_COMMONS_OPT_OUT_CLASSIFIER = ( + "marketplace-mobile-commons-opt-out-classifier" + ) + MARKETPLACE_NEXIWAVE_VOICEMAIL_TO_TEXT = ( + "marketplace-nexiwave-voicemail-to-text" + ) + MARKETPLACE_NEXTCALLER_ADVANCED_CALLER_IDENTIFICATION = ( + "marketplace-nextcaller-advanced-caller-identification" + ) + MARKETPLACE_NOMOROBO_SPAM_SCORE = "marketplace-nomorobo-spam-score" + MARKETPLACE_PAY_ADDONS = "marketplace-pay-addons" + MARKETPLACE_PAY_ADDONS_BASECOMMERCE_PAY_CONNECTOR = ( + "marketplace-pay-addons-basecommerce-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_BRAINTREE_PAY_CONNECTOR = ( + "marketplace-pay-addons-braintree-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CARDCONNECT_PAY_CONNECTOR = ( + "marketplace-pay-addons-cardconnect-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CHASE_PAY_CONNECTOR = ( + "marketplace-pay-addons-chase-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplace-pay-addons-shuttle-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplace-pay-addons-stripe-pay-connector" + ) + MARKETPLACE_PAYFONE_TCPA_COMPLIANCE = "marketplace-payfone-tcpa-compliance" + MARKETPLACE_POLY_AI_CONNECTOR = "marketplace-poly-ai-connector" + MARKETPLACE_REALPHONEVALIDATION = "marketplace-realphonevalidation" + MARKETPLACE_REMEETING_AUTOMATIC_SPEECH_RECOGNITION = ( + "marketplace-remeeting-automatic-speech-recognition" + ) + MARKETPLACE_SPOKE_PHONE_LICENSE_PRO = "marketplace-spoke-phone-license-pro" + MARKETPLACE_SPOKE_PHONE_LICENSE_STANDARD = ( + "marketplace-spoke-phone-license-standard" + ) + MARKETPLACE_TCPA_DEFENSE_SOLUTIONS_BLACKLIST_FEED = ( + "marketplace-tcpa-defense-solutions-blacklist-feed" + ) + MARKETPLACE_TELO_OPENCNAM = "marketplace-telo-opencnam" + MARKETPLACE_TRESTLE_SOLUTIONS_CALLER_IDENTIFICATION = ( + "marketplace-trestle-solutions-caller-identification" + ) + MARKETPLACE_TRUECNAM_TRUE_SPAM = "marketplace-truecnam-true-spam" + MARKETPLACE_TWILIO_CALLER_NAME_LOOKUP_US = ( + "marketplace-twilio-caller-name-lookup-us" + ) + MARKETPLACE_TWILIO_CARRIER_INFORMATION_LOOKUP = ( + "marketplace-twilio-carrier-information-lookup" + ) + MARKETPLACE_VOICEBASE_PCI = "marketplace-voicebase-pci" + MARKETPLACE_VOICEBASE_TRANSCRIPTION = "marketplace-voicebase-transcription" + MARKETPLACE_VOICEBASE_TRANSCRIPTION_CUSTOM_VOCABULARY = ( + "marketplace-voicebase-transcription-custom-vocabulary" + ) + MARKETPLACE_WEB_PURIFY_PROFANITY_FILTER = ( + "marketplace-web-purify-profanity-filter" + ) + MARKETPLACE_WHITEPAGES_PRO_CALLER_IDENTIFICATION = ( + "marketplace-whitepages-pro-caller-identification" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_INTELLIGENCE = ( + "marketplace-whitepages-pro-phone-intelligence" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_REPUTATION = ( + "marketplace-whitepages-pro-phone-reputation" + ) + MARKETPLACE_WOLFARM_SPOKEN_RESULTS = "marketplace-wolfarm-spoken-results" + MARKETPLACE_WOLFRAM_SHORT_ANSWER = "marketplace-wolfram-short-answer" + MARKETPLACE_YTICA_CONTACT_CENTER_REPORTING_ANALYTICS = ( + "marketplace-ytica-contact-center-reporting-analytics" + ) + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplay-pay-addons-shuttle-pay-connector" + ) + MEDIA_COMPOSER_MINUTES = "media-composer-minutes" + MEDIASTORAGE = "mediastorage" + MIN_SPEND_ADJUSTMENTS = "min-spend-adjustments" + MMS = "mms" + MMS_INBOUND = "mms-inbound" + MMS_INBOUND_LONGCODE = "mms-inbound-longcode" + MMS_INBOUND_SHORTCODE = "mms-inbound-shortcode" + MMS_INBOUND_TOLL_FREE = "mms-inbound-toll-free" + MMS_MESSAGES_CARRIERFEES = "mms-messages-carrierfees" + MMS_OUTBOUND = "mms-outbound" + MMS_OUTBOUND_LONGCODE = "mms-outbound-longcode" + MMS_OUTBOUND_SHORTCODE = "mms-outbound-shortcode" + MMS_OUTBOUND_TOLLFREE = "mms-outbound-tollfree" + MONITOR = "monitor" + MONITOR_READS = "monitor-reads" + MONITOR_STORAGE = "monitor-storage" + MONITOR_WRITES = "monitor-writes" + NOTIFY = "notify" + NOTIFY_ACTIONS_ATTEMPTS = "notify-actions-attempts" + NOTIFY_CHANNELS = "notify-channels" + NUMBER_FORMAT_LOOKUPS = "number-format-lookups" + PCHAT = "pchat" + PCHAT_ACTIONS = "pchat-actions" + PCHAT_APS = "pchat-aps" + PCHAT_CONV_MED_STORAGE = "pchat-conv-med-storage" + PCHAT_MESSAGES = "pchat-messages" + PCHAT_NOTIFICATIONS = "pchat-notifications" + PCHAT_READS = "pchat-reads" + PCHAT_USERS = "pchat-users" + PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "peer-to-peer-rooms-participant-minutes" + ) + PFAX = "pfax" + PFAX_MINUTES = "pfax-minutes" + PFAX_MINUTES_INBOUND = "pfax-minutes-inbound" + PFAX_MINUTES_OUTBOUND = "pfax-minutes-outbound" + PFAX_PAGES = "pfax-pages" + PHONE_QUALITY_SCORE_LOOKUPS = "phone-quality-score-lookups" + PHONENUMBERS = "phonenumbers" + PHONENUMBERS_CPS = "phonenumbers-cps" + PHONENUMBERS_EMERGENCY = "phonenumbers-emergency" + PHONENUMBERS_LOCAL = "phonenumbers-local" + PHONENUMBERS_MOBILE = "phonenumbers-mobile" + PHONENUMBERS_PORTING = "phonenumbers-porting" + PHONENUMBERS_SETUPS = "phonenumbers-setups" + PHONENUMBERS_TOLLFREE = "phonenumbers-tollfree" + PREMIUMSUPPORT = "premiumsupport" + PREMIUMSUPPORT_PERCENTAGE_SPEND = "premiumsupport-percentage-spend" + PROGRAMMABLEVOICE_PLATFORM = "programmablevoice-platform" + PROGRAMMABLEVOICECONN_CLIENTSDK = "programmablevoiceconn-clientsdk" + PROGRAMMABLEVOICECONN_CLIENTSDK_INBOUND = ( + "programmablevoiceconn-clientsdk-inbound" + ) + PROGRAMMABLEVOICECONN_CLIENTSDK_OUTBOUND = ( + "programmablevoiceconn-clientsdk-outbound" + ) + PROGRAMMABLEVOICECONN_ONNET = "programmablevoiceconn-onnet" + PROGRAMMABLEVOICECONN_ONNET_INBOUND = "programmablevoiceconn-onnet-inbound" + PROGRAMMABLEVOICECONN_ONNET_OUTBOUND = "programmablevoiceconn-onnet-outbound" + PROGRAMMABLEVOICECONN_SIP = "programmablevoiceconn-sip" + PROGRAMMABLEVOICECONN_SIP_INBOUND = "programmablevoiceconn-sip-inbound" + PROGRAMMABLEVOICECONN_SIP_OUTBOUND = "programmablevoiceconn-sip-outbound" + PROGRAMMABLEVOICECONNECTIVITY = "programmablevoiceconnectivity" + PROXY = "proxy" + PROXY_ACTIVE_SESSIONS = "proxy-active-sessions" + PROXY_BUCKET_ADJUSTMENT = "proxy-bucket-adjustment" + PROXY_LICENSES = "proxy-licenses" + PSTNCONNECTIVITY = "pstnconnectivity" + PSTNCONNECTIVITY_INBOUND = "pstnconnectivity-inbound" + PSTNCONNECTIVITY_OUTBOUND = "pstnconnectivity-outbound" + PV = "pv" + PV_BASIC_ROOMS = "pv-basic-rooms" + PV_COMPOSITION_MEDIA_DOWNLOADED = "pv-composition-media-downloaded" + PV_COMPOSITION_MEDIA_ENCRYPTED = "pv-composition-media-encrypted" + PV_COMPOSITION_MEDIA_STORED = "pv-composition-media-stored" + PV_COMPOSITION_MINUTES = "pv-composition-minutes" + PV_RECORDING_COMPOSITIONS = "pv-recording-compositions" + PV_ROOM_PARTICIPANTS = "pv-room-participants" + PV_ROOM_PARTICIPANTS_AU1 = "pv-room-participants-au1" + PV_ROOM_PARTICIPANTS_BR1 = "pv-room-participants-br1" + PV_ROOM_PARTICIPANTS_IE1 = "pv-room-participants-ie1" + PV_ROOM_PARTICIPANTS_JP1 = "pv-room-participants-jp1" + PV_ROOM_PARTICIPANTS_SG1 = "pv-room-participants-sg1" + PV_ROOM_PARTICIPANTS_US1 = "pv-room-participants-us1" + PV_ROOM_PARTICIPANTS_US2 = "pv-room-participants-us2" + PV_ROOMS = "pv-rooms" + PV_SIP_ENDPOINT_REGISTRATIONS = "pv-sip-endpoint-registrations" + RCS_MESSAGES = "rcs-messages" + REASSIGNED_NUMBER = "reassigned-number" + RECORDINGS = "recordings" + RECORDINGSTORAGE = "recordingstorage" + SHORTCODES = "shortcodes" + SHORTCODES_CUSTOMEROWNED = "shortcodes-customerowned" + SHORTCODES_MMS_ENABLEMENT = "shortcodes-mms-enablement" + SHORTCODES_MPS = "shortcodes-mps" + SHORTCODES_RANDOM = "shortcodes-random" + SHORTCODES_SETUP_FEES = "shortcodes-setup-fees" + SHORTCODES_UK = "shortcodes-uk" + SHORTCODES_VANITY = "shortcodes-vanity" + SIM_SWAP_LOOKUPS = "sim-swap-lookups" + SIP_SECURE_MEDIA = "sip-secure-media" + SMALL_GROUP_ROOMS = "small-group-rooms" + SMALL_GROUP_ROOMS_DATA_TRACK = "small-group-rooms-data-track" + SMALL_GROUP_ROOMS_PARTICIPANT_MINUTES = "small-group-rooms-participant-minutes" + SMS = "sms" + SMS_INBOUND = "sms-inbound" + SMS_INBOUND_LONGCODE = "sms-inbound-longcode" + SMS_INBOUND_SHORTCODE = "sms-inbound-shortcode" + SMS_INBOUND_TOLLFREE = "sms-inbound-tollfree" + SMS_MESSAGES_CARRIERFEES = "sms-messages-carrierfees" + SMS_MESSAGES_FEATURES = "sms-messages-features" + SMS_MESSAGES_FEATURES_ENGAGEMENT_SUITE = ( + "sms-messages-features-engagement-suite" + ) + SMS_MESSAGES_FEATURES_MESSAGE_REDACTION = ( + "sms-messages-features-message-redaction" + ) + SMS_MESSAGES_FEATURES_SENDERID = "sms-messages-features-senderid" + SMS_MPS = "sms-mps" + SMS_MPS_SHORTCODE = "sms-mps-shortcode" + SMS_MPS_TOLLFREE = "sms-mps-tollfree" + SMS_MPS_TOLLFREE_SETUP = "sms-mps-tollfree-setup" + SMS_NATIONAL_REGULATORY_PROTECTION = "sms-national-regulatory-protection" + SMS_OUTBOUND = "sms-outbound" + SMS_OUTBOUND_CONTENT_INSPECTION = "sms-outbound-content-inspection" + SMS_OUTBOUND_LONGCODE = "sms-outbound-longcode" + SMS_OUTBOUND_SHORTCODE = "sms-outbound-shortcode" + SMS_OUTBOUND_TOLLFREE = "sms-outbound-tollfree" + SMS_PUMPING_PROTECTION = "sms-pumping-protection" + SMS_PUMPING_RISK = "sms-pumping-risk" + SMSMESSAGES_BUCKET_ADJUSTMENTS = "smsmessages-bucket-adjustments" + SMSMESSAGES_OUTBOUND_DOMESTIC = "smsmessages-outbound-domestic" + SPEECH_RECOGNITION = "speech-recognition" + STUDIO_ENGAGEMENTS = "studio-engagements" + SYNC = "sync" + SYNC_ACTIONS = "sync-actions" + SYNC_ENDPOINT_HOURS = "sync-endpoint-hours" + SYNC_ENDPOINT_HOURS_ABOVE_DAILY_CAP = "sync-endpoint-hours-above-daily-cap" + TASKROUTER_TASKS = "taskrouter-tasks" + TOTALPRICE = "totalprice" + TRANSCRIPTIONS = "transcriptions" + TRUNKING_CPS = "trunking-cps" + TRUNKING_EMERGENCY_CALLS = "trunking-emergency-calls" + TRUNKING_ORIGINATION = "trunking-origination" + TRUNKING_ORIGINATION_LOCAL = "trunking-origination-local" + TRUNKING_ORIGINATION_MOBILE = "trunking-origination-mobile" + TRUNKING_ORIGINATION_TOLLFREE = "trunking-origination-tollfree" + TRUNKING_RECORDINGS = "trunking-recordings" + TRUNKING_SECURE = "trunking-secure" + TRUNKING_TERMINATION = "trunking-termination" + TTS_GOOGLE = "tts-google" + TURNMEGABYTES = "turnmegabytes" + TURNMEGABYTES_AUSTRALIA = "turnmegabytes-australia" + TURNMEGABYTES_BRASIL = "turnmegabytes-brasil" + TURNMEGABYTES_GERMANY = "turnmegabytes-germany" + TURNMEGABYTES_INDIA = "turnmegabytes-india" + TURNMEGABYTES_IRELAND = "turnmegabytes-ireland" + TURNMEGABYTES_JAPAN = "turnmegabytes-japan" + TURNMEGABYTES_SINGAPORE = "turnmegabytes-singapore" + TURNMEGABYTES_USEAST = "turnmegabytes-useast" + TURNMEGABYTES_USWEST = "turnmegabytes-uswest" + TWILIO_FOR_SALESFORCE = "twilio-for-salesforce" + TWILIO_FOR_SALESFORCE_LICENSES = "twilio-for-salesforce-licenses" + TWILIO_INTERCONNECT = "twilio-interconnect" + TWIML = "twiml" + USAGE_FLEX_VIDEO = "usage-flex-video" + USAGE_FUNCTIONS = "usage-functions" + USAGE_RCS_BASIC_MESSAGES_OUTBOUND = "usage-rcs-basic-messages-outbound" + USAGE_RCS_MESSAGES = "usage-rcs-messages" + USAGE_RCS_MESSAGES_INBOUND = "usage-rcs-messages-inbound" + USAGE_RCS_MESSAGING_CARRIER_FEES = "usage-rcs-messaging-carrier-fees" + USAGE_RCS_SINGLE_MESSAGES_OUTBOUND = "usage-rcs-single-messages-outbound" + VERIFY_PACKAGE_PLANS = "verify-package-plans" + VERIFY_PUSH = "verify-push" + VERIFY_SNA = "verify-sna" + VERIFY_TOTP = "verify-totp" + VERIFY_VOICE_SMS = "verify-voice-sms" + VERIFY_WHATSAPP_CONVERSATIONS_BUSINESS_INITIATED = ( + "verify-whatsapp-conversations-business-initiated" + ) + VIDEO_RECORDINGS = "video-recordings" + VIDEO_ROOMS_TURN_MEGABYTES = "video-rooms-turn-megabytes" + VIRTUAL_AGENT = "virtual-agent" + VOICE_INSIGHTS = "voice-insights" + VOICE_INSIGHTS_CLIENT_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-client-insights-on-demand-minute" + ) + VOICE_INSIGHTS_PTSN_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-ptsn-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_INTERFACE_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-interface-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_TRUNKING_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-trunking-insights-on-demand-minute" + ) + VOICE_INTELLIGENCE = "voice-intelligence" + VOICE_INTELLIGENCE_EIP_OPERATORS = "voice-intelligence-eip-operators" + VOICE_INTELLIGENCE_OPERATORS = "voice-intelligence-operators" + VOICE_INTELLIGENCE_TRANSCRIPTION = "voice-intelligence-transcription" + WDS = "wds" + WIRELESS = "wireless" + WIRELESS_DATA = "wireless-data" + WIRELESS_DATA_PAYG = "wireless-data-payg" + WIRELESS_DATA_PAYG_AFRICA = "wireless-data-payg-africa" + WIRELESS_DATA_PAYG_ASIA = "wireless-data-payg-asia" + WIRELESS_DATA_PAYG_CENTRALANDSOUTHAMERICA = ( + "wireless-data-payg-centralandsouthamerica" + ) + WIRELESS_DATA_PAYG_EUROPE = "wireless-data-payg-europe" + WIRELESS_DATA_PAYG_NORTHAMERICA = "wireless-data-payg-northamerica" + WIRELESS_DATA_PAYG_OCEANIA = "wireless-data-payg-oceania" + WIRELESS_DATA_QUOTA1 = "wireless-data-quota1" + WIRELESS_DATA_QUOTA1_AFRICA = "wireless-data-quota1-africa" + WIRELESS_DATA_QUOTA1_ASIA = "wireless-data-quota1-asia" + WIRELESS_DATA_QUOTA1_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota1-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA1_EUROPE = "wireless-data-quota1-europe" + WIRELESS_DATA_QUOTA1_NORTHAMERICA = "wireless-data-quota1-northamerica" + WIRELESS_DATA_QUOTA1_OCEANIA = "wireless-data-quota1-oceania" + WIRELESS_DATA_QUOTA10 = "wireless-data-quota10" + WIRELESS_DATA_QUOTA10_AFRICA = "wireless-data-quota10-africa" + WIRELESS_DATA_QUOTA10_ASIA = "wireless-data-quota10-asia" + WIRELESS_DATA_QUOTA10_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota10-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA10_EUROPE = "wireless-data-quota10-europe" + WIRELESS_DATA_QUOTA10_NORTHAMERICA = "wireless-data-quota10-northamerica" + WIRELESS_DATA_QUOTA10_OCEANIA = "wireless-data-quota10-oceania" + WIRELESS_DATA_QUOTA50 = "wireless-data-quota50" + WIRELESS_DATA_QUOTA50_AFRICA = "wireless-data-quota50-africa" + WIRELESS_DATA_QUOTA50_ASIA = "wireless-data-quota50-asia" + WIRELESS_DATA_QUOTA50_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota50-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA50_EUROPE = "wireless-data-quota50-europe" + WIRELESS_DATA_QUOTA50_NORTHAMERICA = "wireless-data-quota50-northamerica" + WIRELESS_DATA_QUOTA50_OCEANIA = "wireless-data-quota50-oceania" + WIRELESS_DATA_QUOTACUSTOM = "wireless-data-quotacustom" + WIRELESS_DATA_QUOTACUSTOM_AFRICA = "wireless-data-quotacustom-africa" + WIRELESS_DATA_QUOTACUSTOM_ASIA = "wireless-data-quotacustom-asia" + WIRELESS_DATA_QUOTACUSTOM_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quotacustom-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_EUROPE = "wireless-data-quotacustom-europe" + WIRELESS_DATA_QUOTACUSTOM_NORTHAMERICA = ( + "wireless-data-quotacustom-northamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_OCEANIA = "wireless-data-quotacustom-oceania" + WIRELESS_MRC_PAYG = "wireless-mrc-payg" + WIRELESS_MRC_QUOTA1 = "wireless-mrc-quota1" + WIRELESS_MRC_QUOTA10 = "wireless-mrc-quota10" + WIRELESS_MRC_QUOTA50 = "wireless-mrc-quota50" + WIRELESS_MRC_QUOTACUSTOM = "wireless-mrc-quotacustom" + WIRELESS_ORDERS = "wireless-orders" + WIRELESS_ORDERS_ARTWORK = "wireless-orders-artwork" + WIRELESS_ORDERS_BULK = "wireless-orders-bulk" + WIRELESS_ORDERS_ESIM = "wireless-orders-esim" + WIRELESS_ORDERS_STARTER = "wireless-orders-starter" + WIRELESS_QUOTAS = "wireless-quotas" + WIRELESS_SMS_AFRICA = "wireless-sms-africa" + WIRELESS_SMS_ASIA = "wireless-sms-asia" + WIRELESS_SMS_CENTRALANDSOUTHAMERICA = "wireless-sms-centralandsouthamerica" + WIRELESS_SMS_EUROPE = "wireless-sms-europe" + WIRELESS_SMS_NORTHAMERICA = "wireless-sms-northamerica" + WIRELESS_SMS_OCEANIA = "wireless-sms-oceania" + WIRELESS_SUPER_SIM = "wireless-super-sim" + WIRELESS_SUPER_SIM_DATA = "wireless-super-sim-data" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA_USA = ( + "wireless-super-sim-data-north-america-usa" + ) + WIRELESS_SUPER_SIM_DATA_PAYG = "wireless-super-sim-data-payg" + WIRELESS_SUPER_SIM_DATA_PAYG_EUROPE = "wireless-super-sim-data-payg-europe" + WIRELESS_SUPER_SIM_DATA_PAYG_NORTH_AMERICA = ( + "wireless-super-sim-data-payg-north-america" + ) + WIRELESS_SUPER_SIM_HARDWARE = "wireless-super-sim-hardware" + WIRELESS_SUPER_SIM_HARDWARE_BULK = "wireless-super-sim-hardware-bulk" + WIRELESS_SUPER_SIM_SMSCOMMANDS = "wireless-super-sim-smscommands" + WIRELESS_SUPER_SIM_SMSCOMMANDS_AFRICA = "wireless-super-sim-smscommands-africa" + WIRELESS_SUPER_SIM_SMSCOMMANDS_ASIA = "wireless-super-sim-smscommands-asia" + WIRELESS_SUPER_SIM_SMSCOMMANDS_CENT_AND_SOUTH_AMERICA = ( + "wireless-super-sim-smscommands-cent-and-south-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_EUROPE = "wireless-super-sim-smscommands-europe" + WIRELESS_SUPER_SIM_SMSCOMMANDS_NORTH_AMERICA = ( + "wireless-super-sim-smscommands-north-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_OCEANIA = ( + "wireless-super-sim-smscommands-oceania" + ) + WIRELESS_SUPER_SIM_SUBSCRIPTION = "wireless-super-sim-subscription" + WIRELESS_SUPER_SIM_SUBSCRIPTION_PAYG = "wireless-super-sim-subscription-payg" + WIRELESS_USAGE = "wireless-usage" + WIRELESS_USAGE_COMMANDS = "wireless-usage-commands" + WIRELESS_USAGE_COMMANDS_AFRICA = "wireless-usage-commands-africa" + WIRELESS_USAGE_COMMANDS_ASIA = "wireless-usage-commands-asia" + WIRELESS_USAGE_COMMANDS_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-commands-centralandsouthamerica" + ) + WIRELESS_USAGE_COMMANDS_EUROPE = "wireless-usage-commands-europe" + WIRELESS_USAGE_COMMANDS_HOME = "wireless-usage-commands-home" + WIRELESS_USAGE_COMMANDS_NORTHAMERICA = "wireless-usage-commands-northamerica" + WIRELESS_USAGE_COMMANDS_OCEANIA = "wireless-usage-commands-oceania" + WIRELESS_USAGE_COMMANDS_ROAMING = "wireless-usage-commands-roaming" + WIRELESS_USAGE_DATA = "wireless-usage-data" + WIRELESS_USAGE_DATA_AFRICA = "wireless-usage-data-africa" + WIRELESS_USAGE_DATA_ASIA = "wireless-usage-data-asia" + WIRELESS_USAGE_DATA_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-data-centralandsouthamerica" + ) + WIRELESS_USAGE_DATA_CUSTOM_ADDITIONALMB = ( + "wireless-usage-data-custom-additionalmb" + ) + WIRELESS_USAGE_DATA_CUSTOM_FIRST5MB = "wireless-usage-data-custom-first5mb" + WIRELESS_USAGE_DATA_DOMESTIC_ROAMING = "wireless-usage-data-domestic-roaming" + WIRELESS_USAGE_DATA_EUROPE = "wireless-usage-data-europe" + WIRELESS_USAGE_DATA_INDIVIDUAL_ADDITIONALGB = ( + "wireless-usage-data-individual-additionalgb" + ) + WIRELESS_USAGE_DATA_INDIVIDUAL_FIRSTGB = ( + "wireless-usage-data-individual-firstgb" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_CANADA = ( + "wireless-usage-data-international-roaming-canada" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_INDIA = ( + "wireless-usage-data-international-roaming-india" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_MEXICO = ( + "wireless-usage-data-international-roaming-mexico" + ) + WIRELESS_USAGE_DATA_NORTHAMERICA = "wireless-usage-data-northamerica" + WIRELESS_USAGE_DATA_OCEANIA = "wireless-usage-data-oceania" + WIRELESS_USAGE_DATA_POOLED = "wireless-usage-data-pooled" + WIRELESS_USAGE_DATA_POOLED_DOWNLINK = "wireless-usage-data-pooled-downlink" + WIRELESS_USAGE_DATA_POOLED_UPLINK = "wireless-usage-data-pooled-uplink" + WIRELESS_USAGE_MRC = "wireless-usage-mrc" + WIRELESS_USAGE_MRC_CUSTOM = "wireless-usage-mrc-custom" + WIRELESS_USAGE_MRC_INDIVIDUAL = "wireless-usage-mrc-individual" + WIRELESS_USAGE_MRC_POOLED = "wireless-usage-mrc-pooled" + WIRELESS_USAGE_MRC_SUSPENDED = "wireless-usage-mrc-suspended" + WIRELESS_USAGE_SMS = "wireless-usage-sms" + WIRELESS_USAGE_VOICE = "wireless-usage-voice" + A2P_FAST_TRACK_ONBOARDING = "a2p-fast-track-onboarding" + ADVISORY_SERVICES = "advisory-services" + ADVISORY_SERVICES_BILLED = "advisory-services-billed" + ADVISORY_SERVICES_CALL_TRACKING = "advisory-services-call-tracking" + ADVISORY_SERVICES_DATA_SERVICES = "advisory-services-data-services" + ADVISORY_SERVICES_EXPENSES = "advisory-services-expenses" + ADVISORY_SERVICES_SIP_TRUNKING = "advisory-services-sip-trunking" + ASSETS_REQUESTS = "assets-requests" + AUDIENCE_MINUTES_VIDEO = "audience-minutes-video" + AUTHY_BUCKET_ADJUSTMENT = "authy-bucket-adjustment" + AUTHY_SOFTWARE = "authy-software" + CALLERIDLOOKUPS_API = "calleridlookups-api" + CALLERIDLOOKUPS_PROGRAMMABLEVOICE = "calleridlookups-programmablevoice" + CALLERIDLOOKUPS_TRUNKING = "calleridlookups-trunking" + CALLS_TRUNKING_INBOUND_TOLLFREE_LOCAL = "calls-trunking-inbound-tollfree-local" + CALLS_TRUNKING_INBOUND_TOLLFREE_MOBILE = ( + "calls-trunking-inbound-tollfree-mobile" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE_1 = "channels-whatsapp-conversation-free-1" + CONFERENCE = "conference" + CONVERSATIONAL_INSIGHTS = "conversational-insights" + CONVERSATIONAL_INSIGHTS_MESSAGES = "conversational-insights-messages" + CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = "conversational-insights-voice-minutes" + DEMO = "demo" + DEMO_UC_SCRIPT_TEST = "demo-uc-script-test" + ELASTIC_SIP_TRUNKING = "elastic-sip-trunking" + ELASTIC_SIP_TRUNKING_CALL_TRANSFERS = "elastic-sip-trunking-call-transfers" + ENTERPRISE_HIPPA = "enterprise-hippa" + FLEX_NAMED_USERS = "flex-named-users" + FLEX_SPINSCI = "flex-spinsci" + FLEX_USERS_1 = "flex-users-1" + FLEX_WFO_PREMIUM_SPEECH_ANALYTICS = "flex-wfo-premium-speech-analytics" + FLEX_XCELERATE = "flex-xcelerate" + FUNCTIONS_ROLLUP = "functions-rollup" + IMP_V1_USAGE = "imp-v1-usage" + IP_MESSAGING_ADDONS = "ip-messaging-addons" + IVR = "ivr" + IVR_CONVERSATIONAL = "ivr-conversational" + IVR_DTMF = "ivr-dtmf" + IVR_VIRTUALAGENT = "ivr-virtualagent" + LIVE = "live" + LIVE_MEDIA_RECORDING_MINUTES = "live-media-recording-minutes" + LONGCODE_MPS = "longcode-mps" + MARKETPLACE_ANALYTICS_ADDONS = "marketplace-analytics-addons" + MARKETPLACE_ISV_ADDONS = "marketplace-isv-addons" + MARKETPLACE_MESSAGING_ADDONS = "marketplace-messaging-addons" + MARKETPLACE_PHONENUMBERS_ADDONS = "marketplace-phonenumbers-addons" + MARKETPLACE_RECORDING_ADDONS = "marketplace-recording-addons" + MARKETPLACE_VIRTUALAGENT_ADDONS = "marketplace-virtualagent-addons" + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR_1 = ( + "marketplay-pay-addons-shuttle-pay-connector-1" + ) + MARKETPLAY_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplay-pay-addons-stripe-pay-connector" + ) + MMS_INBOUND_LONGCODE_CANADA = "mms-inbound-longcode-canada" + MMS_INBOUND_LONGCODE_UNITEDSTATES = "mms-inbound-longcode-unitedstates" + MMS_OUTBOUND_LONGCODE_CANADA = "mms-outbound-longcode-canada" + MMS_OUTBOUND_LONGCODE_UNITEDSTATES = "mms-outbound-longcode-unitedstates" + MMS_OUTBOUND_TOLL_FREE = "mms-outbound-toll-free" + NOTIFY_CHATAPPSANDOTHERCHANNELS = "notify-chatappsandotherchannels" + NOTIFY_NOTIFYSERVICES = "notify-notifyservices" + NOTIFY_PUSHNOTIFICATIONS = "notify-pushnotifications" + PAYMENT_GATEWAY_CONNECTORS = "payment-gateway-connectors" + PAYMENT_SOLUTIONS = "payment-solutions" + PCHAT_BUCKET_ADJUSTMENT = "pchat-bucket-adjustment" + PHONENUMBERS_NUMBERS = "phonenumbers-numbers" + PROG_VOICE_CLIENT_ANDROID = "prog-voice-client-android" + PROG_VOICE_CLIENT_ANDROID_INBOUND = "prog-voice-client-android-inbound" + PROG_VOICE_CLIENT_ANDROID_OUTBOUND = "prog-voice-client-android-outbound" + PROG_VOICE_CLIENT_IOS = "prog-voice-client-ios" + PROG_VOICE_CLIENT_IOS_INBOUND = "prog-voice-client-ios-inbound" + PROG_VOICE_CLIENT_IOS_OUTBOUND = "prog-voice-client-ios-outbound" + PROG_VOICE_CLIENT_SDK = "prog-voice-client-sdk" + PROG_VOICE_CLIENT_WEB = "prog-voice-client-web" + PROG_VOICE_CLIENT_WEB_INBOUND = "prog-voice-client-web-inbound" + PROG_VOICE_CLIENT_WEB_OUTBOUND = "prog-voice-client-web-outbound" + PROGRAMMABLEVOICECONNECTIVITY_MEDIA_STREAMS = ( + "programmablevoiceconnectivity-media-streams" + ) + PSTNCONNECTIVITY_BYOC = "pstnconnectivity-byoc" + PSTNCONNECTIVITY_EMERGENCY = "pstnconnectivity-emergency" + PSTNCONNECTIVITY_MINUTES = "pstnconnectivity-minutes" + PSTNCONNECTIVITY_MINUTES_1 = "pstnconnectivity-minutes-1" + PSTNCONNECTIVITY_MINUTESINBOUNDLOCAL = "pstnconnectivity-minutesinboundlocal" + PSTNCONNECTIVITY_MINUTESINBOUNDMOBILE = "pstnconnectivity-minutesinboundmobile" + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREE = ( + "pstnconnectivity-minutesinboundtollfree" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREELOCAL = ( + "pstnconnectivity-minutesinboundtollfreelocal" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREEMOBILE = ( + "pstnconnectivity-minutesinboundtollfreemobile" + ) + PV_ROOM_HOURS = "pv-room-hours" + PV_ROOM_SIMULTANEOUS_PARTICIPANT_CONNECTIONS = ( + "pv-room-simultaneous-participant-connections" + ) + PVIDEO_ROOM_HOURS_AU1 = "pvideo-room-hours-au1" + PVIDEO_ROOM_HOURS_BR1 = "pvideo-room-hours-br1" + PVIDEO_ROOM_HOURS_IE1 = "pvideo-room-hours-ie1" + PVIDEO_ROOM_HOURS_JP1 = "pvideo-room-hours-jp1" + PVIDEO_ROOM_HOURS_SG1 = "pvideo-room-hours-sg1" + PVIDEO_ROOM_HOURS_US1 = "pvideo-room-hours-us1" + PVIDEO_ROOM_HOURS_US2 = "pvideo-room-hours-us2" + RECORDINGS_ENCRYPTED = "recordings-encrypted" + SHORT_CODE_SETUP_FEES = "short-code-setup-fees" + SHORTCODES_MESSAGES_INBOUND = "shortcodes-messages-inbound" + SHORTCODES_MESSAGES_OUTBOUND = "shortcodes-messages-outbound" + SMS_MESSAGES_REGISTRATIONFEES = "sms-messages-registrationfees" + SMS_MMS_PENALTY_FEES = "sms-mms-penalty-fees" + SMS_MMS_PENALTY_FEES_1 = "sms-mms-penalty-fees-1" + SMS_PUMPING_PROTECTION_NON_USCA = "sms-pumping-protection-non-usca" + SMS_PUMPING_PROTECTION_USCA = "sms-pumping-protection-usca" + STUDIO = "studio" + STUDIO_MONTHLY_FEES = "studio-monthly-fees" + SUPERSIM = "supersim" + TASK_ROUTER = "task-router" + TASK_ROUTER_WORKERS = "task-router-workers" + TEST_QUOTA_BUCKETS = "test-quota-buckets" + TEST_UC_SCRIPT_1 = "test-uc-script-1" + TEST_UC_SCRIPT_DEMO_2 = "test-uc-script-demo-2" + TEXT_TO_SPEECH = "text-to-speech" + TME = "tme" + TTS_BASIC = "tts-basic" + TWILIO_EDITIONS = "twilio-editions" + TWILIO_INTERCONNECT_CALIFORNIA = "twilio-interconnect-california" + TWILIO_INTERCONNECT_CALIFORNIA_MONTHLY = ( + "twilio-interconnect-california-monthly" + ) + TWILIO_INTERCONNECT_CALIFORNIA_SETUP = "twilio-interconnect-california-setup" + TWILIO_INTERCONNECT_FRANKFURT = "twilio-interconnect-frankfurt" + TWILIO_INTERCONNECT_FRANKFURT_MO = "twilio-interconnect-frankfurt-mo" + TWILIO_INTERCONNECT_FRANKFURT_SETUP = "twilio-interconnect-frankfurt-setup" + TWILIO_INTERCONNECT_LONDON = "twilio-interconnect-london" + TWILIO_INTERCONNECT_LONDON_MO = "twilio-interconnect-london-mo" + TWILIO_INTERCONNECT_LONDON_SETUP = "twilio-interconnect-london-setup" + TWILIO_INTERCONNECT_SAO_PAULO = "twilio-interconnect-sao-paulo" + TWILIO_INTERCONNECT_SAO_PAULO_MONTHLY = "twilio-interconnect-sao-paulo-monthly" + TWILIO_INTERCONNECT_SAO_PAULO_SETUP = "twilio-interconnect-sao-paulo-setup" + TWILIO_INTERCONNECT_SINGAPORE = "twilio-interconnect-singapore" + TWILIO_INTERCONNECT_SINGAPORE_MO = "twilio-interconnect-singapore-mo" + TWILIO_INTERCONNECT_SINGAPORE_SETUP = "twilio-interconnect-singapore-setup" + TWILIO_INTERCONNECT_SYDNEY = "twilio-interconnect-sydney" + TWILIO_INTERCONNECT_SYDNEY_MO = "twilio-interconnect-sydney-mo" + TWILIO_INTERCONNECT_SYDNEY_SETUP = "twilio-interconnect-sydney-setup" + TWILIO_INTERCONNECT_TOKYO = "twilio-interconnect-tokyo" + TWILIO_INTERCONNECT_TOKYO_MO = "twilio-interconnect-tokyo-mo" + TWILIO_INTERCONNECT_TOKYO_SETUP = "twilio-interconnect-tokyo-setup" + TWILIO_INTERCONNECT_VA = "twilio-interconnect-va" + TWILIO_INTERCONNECT_VA_MO = "twilio-interconnect-va-mo" + TWILIO_INTERCONNECT_VA_SETUP = "twilio-interconnect-va-setup" + TWIML_VERBS = "twiml-verbs" + TWIML_VERBS_SAY = "twiml-verbs-say" + USAGE_PROGRAMMABLE_MESSAGING_ENGAGEMENT_SUITE = ( + "usage-programmable-messaging-engagement-suite" + ) + USAGE_PROGRAMMABLE_MESSAGING_FEES_SERVICES = ( + "usage-programmable-messaging-fees-services" + ) + VERIFY_OUTBOUND_EMAIL = "verify-outbound-email" + VERIFY_PACKAGED_PLANS = "verify-packaged-plans" + VERIFY_SILENT_NETWORK_AUTH = "verify-silent-network-auth" + VERIFY_VOICE_AND_SMS = "verify-voice-and-sms" + VOICE_INSIGHTS_CLIENT_INSIGHTS_MONTHY_COMMIT = ( + "voice-insights-client-insights-monthy-commit" + ) + WIRELESS_DATA_PAYG_ASIA_AFG = "wireless-data-payg-asia-afg" + WIRELESS_MULTI_IMSI_SIM_COMMANDS = "wireless-multi-imsi-sim-commands" + WIRELESS_MULTI_IMSI_SIM_COMMANDS_USA = "wireless-multi-imsi-sim-commands-usa" + WIRELESS_MULTI_IMSI_SIM_DATA = "wireless-multi-imsi-sim-data" + WIRELESS_MULTI_IMSI_SIM_DATA_EU28 = "wireless-multi-imsi-sim-data-eu28" + WIRELESS_MULTI_IMSI_SIM_DATA_USA = "wireless-multi-imsi-sim-data-usa" + WIRELESS_MULTI_IMSI_SIM_MONTHLY_FEES = "wireless-multi-imsi-sim-monthly-fees" + WIRELESS_MULTI_IMSI_SIM_USAGE = "wireless-multi-imsi-sim-usage" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA = "wireless-super-sim-data-north-america" + WIRELESS_SUPER_SIM_USAGE = "wireless-super-sim-usage" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that accrued the usage. + :ivar api_version: The API version used to create the resource. + :ivar as_of: Usage records up to date as of this timestamp, formatted as YYYY-MM-DDTHH:MM:SS+00:00. All timestamps are in GMT + :ivar category: + :ivar count: The number of usage events, such as the number of calls. + :ivar count_unit: The units in which `count` is measured, such as `calls` for calls or `messages` for SMS. + :ivar description: A plain-language description of the usage category. + :ivar end_date: The last date for which usage is included in the UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar price: The total price of the usage in the currency specified in `price_unit` and associated with the account. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format, such as `usd`, `eur`, and `jpy`. + :ivar start_date: The first date for which usage is included in this UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar subresource_uris: A list of related resources identified by their URIs. For more information, see [List Subresources](https://www.twilio.com/docs/usage/api/usage-record#list-subresources). + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar usage: The amount used to bill usage and measured in units described in `usage_unit`. + :ivar usage_unit: The units in which `usage` is measured, such as `minutes` for calls or `messages` for SMS. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.as_of: Optional[str] = payload.get("as_of") + self.category: Optional["LastMonthInstance.Category"] = payload.get("category") + self.count: Optional[str] = payload.get("count") + self.count_unit: Optional[str] = payload.get("count_unit") + self.description: Optional[str] = payload.get("description") + self.end_date: Optional[date] = deserialize.iso8601_date( + payload.get("end_date") + ) + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.start_date: Optional[date] = deserialize.iso8601_date( + payload.get("start_date") + ) + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.uri: Optional[str] = payload.get("uri") + self.usage: Optional[str] = payload.get("usage") + self.usage_unit: Optional[str] = payload.get("usage_unit") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class LastMonthPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> LastMonthInstance: + """ + Build an instance of LastMonthInstance + + :param payload: Payload response from the API + """ + return LastMonthInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class LastMonthList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the LastMonthList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageRecord resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Records/LastMonth.json".format( + **self._solution + ) + + def stream( + self, + category: Union["LastMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[LastMonthInstance]: + """ + Streams LastMonthInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "LastMonthInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + category: Union["LastMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[LastMonthInstance]: + """ + Asynchronously streams LastMonthInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "LastMonthInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + category: Union["LastMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[LastMonthInstance]: + """ + Lists LastMonthInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "LastMonthInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + category: Union["LastMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[LastMonthInstance]: + """ + Asynchronously lists LastMonthInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "LastMonthInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + category: Union["LastMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> LastMonthPage: + """ + Retrieve a single page of LastMonthInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of LastMonthInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return LastMonthPage(self._version, response, self._solution) + + async def page_async( + self, + category: Union["LastMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> LastMonthPage: + """ + Asynchronously retrieve a single page of LastMonthInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of LastMonthInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return LastMonthPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> LastMonthPage: + """ + Retrieve a specific page of LastMonthInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of LastMonthInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return LastMonthPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> LastMonthPage: + """ + Asynchronously retrieve a specific page of LastMonthInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of LastMonthInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return LastMonthPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/monthly.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/monthly.py new file mode 100644 index 00000000..117db692 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/monthly.py @@ -0,0 +1,1211 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MonthlyInstance(InstanceResource): + + class Category(object): + A2P_10DLC_REGISTRATIONFEES_BRANDREGISTRATION = ( + "a2p-10dlc-registrationfees-brandregistration" + ) + A2P_10DLC_REGISTRATIONFEES_BV = "a2p-10dlc-registrationfees-bv" + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNCHARGES = ( + "a2p-10dlc-registrationfees-campaigncharges" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNREGISTRATION = ( + "a2p-10dlc-registrationfees-campaignregistration" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNVETTING = ( + "a2p-10dlc-registrationfees-campaignvetting" + ) + A2P_10DLC_REGISTRATIONFEES_MONTHLY = "a2p-10dlc-registrationfees-monthly" + A2P_10DLC_REGISTRATIONFEES_ONETIME = "a2p-10dlc-registrationfees-onetime" + A2P_REGISTRATION_FEES = "a2p-registration-fees" + ACCOUNT_SECURITY = "account-security" + AGENT_CONFERENCE = "agent-conference" + AGENT_COPILOT = "agent-copilot" + AGENT_COPILOT_MESSAGES = "agent-copilot-messages" + AGENT_COPILOT_PARTICIPANT_MINUTES = "agent-copilot-participant-minutes" + AI_ASSISTANTS = "ai-assistants" + AI_ASSISTANTS_VOICE = "ai-assistants-voice" + AMAZON_POLLY = "amazon-polly" + ANSWERING_MACHINE_DETECTION = "answering-machine-detection" + ASSETS = "assets" + AUDIENCE_MINUTES = "audience-minutes" + AUDIENCE_MINUTES_AUDIO = "audience-minutes-audio" + AUTHY_AUTHENTICATIONS = "authy-authentications" + AUTHY_CALLS_OUTBOUND = "authy-calls-outbound" + AUTHY_EMAIL_AUTHENTICATIONS = "authy-email-authentications" + AUTHY_MONTHLY_FEES = "authy-monthly-fees" + AUTHY_OUTBOUND_EMAIL = "authy-outbound-email" + AUTHY_PHONE_INTELLIGENCE = "authy-phone-intelligence" + AUTHY_PHONE_VERIFICATIONS = "authy-phone-verifications" + AUTHY_SMS_OUTBOUND = "authy-sms-outbound" + AUTHY_VERIFY_EMAIL_VERIFICATIONS = "authy-verify-email-verifications" + AUTHY_VERIFY_OUTBOUND_EMAIL = "authy-verify-outbound-email" + AUTOPILOT = "autopilot" + AUTOPILOT_HOME_ASSISTANTS = "autopilot-home-assistants" + AUTOPILOT_MESSAGING = "autopilot-messaging" + AUTOPILOT_OTHER = "autopilot-other" + AUTOPILOT_VOICE = "autopilot-voice" + BASIC_PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "basic-peer-to-peer-rooms-participant-minutes" + ) + BRANDED_CALLING = "branded-calling" + BUNDLE_SMS_BUCKET = "bundle-sms-bucket" + BUNDLE_SUBSCRIPTION_FEES = "bundle-subscription-fees" + CALL_FORWARDING_LOOKUPS = "call-forwarding-lookups" + CALL_PROGESS_EVENTS = "call-progess-events" + CALLERIDLOOKUPS = "calleridlookups" + CALLS = "calls" + CALLS_CLIENT = "calls-client" + CALLS_EMERGENCY = "calls-emergency" + CALLS_GLOBALCONFERENCE = "calls-globalconference" + CALLS_INBOUND = "calls-inbound" + CALLS_INBOUND_LOCAL = "calls-inbound-local" + CALLS_INBOUND_MOBILE = "calls-inbound-mobile" + CALLS_INBOUND_TOLLFREE = "calls-inbound-tollfree" + CALLS_INBOUND_TOLLFREE_LOCAL = "calls-inbound-tollfree-local" + CALLS_INBOUND_TOLLFREE_MOBILE = "calls-inbound-tollfree-mobile" + CALLS_MEDIA_STREAM_MINUTES = "calls-media-stream-minutes" + CALLS_OUTBOUND = "calls-outbound" + CALLS_PAY_VERB_TRANSACTIONS = "calls-pay-verb-transactions" + CALLS_RECORDINGS = "calls-recordings" + CALLS_SIP = "calls-sip" + CALLS_SIP_INBOUND = "calls-sip-inbound" + CALLS_SIP_OUTBOUND = "calls-sip-outbound" + CALLS_TEXT_TO_SPEECH = "calls-text-to-speech" + CALLS_TRANSFERS = "calls-transfers" + CARRIER_LOOKUPS = "carrier-lookups" + CATEGORY = "category" + CHANNELS = "channels" + CHANNELS_MESSAGING = "channels-messaging" + CHANNELS_MESSAGING_INBOUND = "channels-messaging-inbound" + CHANNELS_MESSAGING_OUTBOUND = "channels-messaging-outbound" + CHANNELS_WHATSAPP = "channels-whatsapp" + CHANNELS_WHATSAPP_CONVERSATION_AUTHENTICATION = ( + "channels-whatsapp-conversation-authentication" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE = "channels-whatsapp-conversation-free" + CHANNELS_WHATSAPP_CONVERSATION_MARKETING = ( + "channels-whatsapp-conversation-marketing" + ) + CHANNELS_WHATSAPP_CONVERSATION_SERVICE = ( + "channels-whatsapp-conversation-service" + ) + CHANNELS_WHATSAPP_CONVERSATION_UTILITY = ( + "channels-whatsapp-conversation-utility" + ) + CHANNELS_WHATSAPP_INBOUND = "channels-whatsapp-inbound" + CHANNELS_WHATSAPP_OUTBOUND = "channels-whatsapp-outbound" + CHAT_VIRTUAL_AGENT = "chat-virtual-agent" + CONVERSATION_RELAY = "conversation-relay" + CONVERSATIONS = "conversations" + CONVERSATIONS_API_REQUESTS = "conversations-api-requests" + CONVERSATIONS_CONVERSATION_EVENTS = "conversations-conversation-events" + CONVERSATIONS_ENDPOINT_CONNECTIVITY = "conversations-endpoint-connectivity" + CONVERSATIONS_EVENTS = "conversations-events" + CONVERSATIONS_PARTICIPANT_EVENTS = "conversations-participant-events" + CONVERSATIONS_PARTICIPANTS = "conversations-participants" + CPS = "cps" + CREDIT_TRANSFER = "credit-transfer" + EMAIL = "email" + EMERGING_TECH = "emerging-tech" + ENGAGEMENT_SUITE_PACKAGED_PLANS = "engagement-suite-packaged-plans" + ENHANCED_LINE_TYPE_LOOKUPS = "enhanced-line-type-lookups" + ENTERPRISE = "enterprise" + EVENTS = "events" + EXPERIMENT_FRANCE_SMS = "experiment-france-sms" + EXPERIMENT_INDIA_SMS = "experiment-india-sms" + EXPERIMENT_UK_SMS = "experiment-uk-sms" + FAILED_MESSAGE_PROCESSING_FEE = "failed-message-processing-fee" + FLEX = "flex" + FLEX_ACTIVE_USER_HOURS = "flex-active-user-hours" + FLEX_CONCURRENT_USERS = "flex-concurrent-users" + FLEX_CONVERSATIONAL_INSIGHTS = "flex-conversational-insights" + FLEX_CONVERSATIONAL_INSIGHTS_MESSAGES = "flex-conversational-insights-messages" + FLEX_CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = ( + "flex-conversational-insights-voice-minutes" + ) + FLEX_EMAIL_USAGE = "flex-email-usage" + FLEX_MESSAGING_USAGE = "flex-messaging-usage" + FLEX_PARTNER_SPINSCI = "flex-partner-spinsci" + FLEX_PARTNER_XCELERATE = "flex-partner-xcelerate" + FLEX_RESELLER_ECOSYSTEM = "flex-reseller-ecosystem" + FLEX_UNIQUE_USER = "flex-unique-user" + FLEX_USAGE = "flex-usage" + FLEX_USERS = "flex-users" + FLEX_VOICE_MINUTE = "flex-voice-minute" + FLEX_YTICA = "flex-ytica" + FRAUD_LOOKUPS = "fraud-lookups" + FRONTLINE = "frontline" + FRONTLINE_USERS = "frontline-users" + FUNCTIONS = "functions" + GENERIC_PAY_TRANSACTIONS = "generic-pay-transactions" + GROUP_ROOMS = "group-rooms" + GROUP_ROOMS_DATA_TRACK = "group-rooms-data-track" + GROUP_ROOMS_ENCRYPTED_MEDIA_RECORDED = "group-rooms-encrypted-media-recorded" + GROUP_ROOMS_MEDIA_DOWNLOADED = "group-rooms-media-downloaded" + GROUP_ROOMS_MEDIA_RECORDED = "group-rooms-media-recorded" + GROUP_ROOMS_MEDIA_ROUTED = "group-rooms-media-routed" + GROUP_ROOMS_MEDIA_STORED = "group-rooms-media-stored" + GROUP_ROOMS_PARTICIPANT_MINUTES = "group-rooms-participant-minutes" + GROUP_ROOMS_RECORDED_MINUTES = "group-rooms-recorded-minutes" + IP_MESSAGING = "ip-messaging" + IP_MESSAGING_COMMANDS = "ip-messaging-commands" + IP_MESSAGING_DATA_STORAGE = "ip-messaging-data-storage" + IP_MESSAGING_DATA_TRANSFER = "ip-messaging-data-transfer" + IP_MESSAGING_ENDPOINT_CONNECTIVITY = "ip-messaging-endpoint-connectivity" + IVR_VIRTUAL_AGENT_CUSTOM_VOICES = "ivr-virtual-agent-custom-voices" + IVR_VIRTUAL_AGENT_GENAI = "ivr-virtual-agent-genai" + LINE_STATUS_LOOKUPS = "line-status-lookups" + LIVE_ACTIVITY_LOOKUPS = "live-activity-lookups" + LOOKUP_BUCKET_ADJUSTMENT = "lookup-bucket-adjustment" + LOOKUP_IDENTITY_MATCH = "lookup-identity-match" + LOOKUPS = "lookups" + MARKETPLACE = "marketplace" + MARKETPLACE_ALGORITHMIA_NAMED_ENTITY_RECOGNITION = ( + "marketplace-algorithmia-named-entity-recognition" + ) + MARKETPLACE_CADENCE_TRANSCRIPTION = "marketplace-cadence-transcription" + MARKETPLACE_CADENCE_TRANSLATION = "marketplace-cadence-translation" + MARKETPLACE_CAPIO_SPEECH_TO_TEXT = "marketplace-capio-speech-to-text" + MARKETPLACE_CONVRIZA_ABABA = "marketplace-convriza-ababa" + MARKETPLACE_DEEPGRAM_PHRASE_DETECTOR = "marketplace-deepgram-phrase-detector" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION = "marketplace-deepgram-transcription" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION_BASE = ( + "marketplace-deepgram-transcription-base" + ) + MARKETPLACE_DEEPGRAM_TRANSSCRIPTION_ENHANCED = ( + "marketplace-deepgram-transscription-enhanced" + ) + MARKETPLACE_DIGITAL_SEGMENT_BUSINESS_INFO = ( + "marketplace-digital-segment-business-info" + ) + MARKETPLACE_FACEBOOK_OFFLINE_CONVERSIONS = ( + "marketplace-facebook-offline-conversions" + ) + MARKETPLACE_GOOGLE_SPEECH_TO_TEXT = "marketplace-google-speech-to-text" + MARKETPLACE_IBM_WATSON_MESSAGE_INSIGHTS = ( + "marketplace-ibm-watson-message-insights" + ) + MARKETPLACE_IBM_WATSON_MESSAGE_SENTIMENT = ( + "marketplace-ibm-watson-message-sentiment" + ) + MARKETPLACE_IBM_WATSON_RECORDING_ANALYSIS = ( + "marketplace-ibm-watson-recording-analysis" + ) + MARKETPLACE_IBM_WATSON_TONE_ANALYZER = "marketplace-ibm-watson-tone-analyzer" + MARKETPLACE_ICEHOOK_SYSTEMS_SCOUT = "marketplace-icehook-systems-scout" + MARKETPLACE_INFOGROUP_DATAAXLE_BIZINFO = ( + "marketplace-infogroup-dataaxle-bizinfo" + ) + MARKETPLACE_KEEN_IO_CONTACT_CENTER_ANALYTICS = ( + "marketplace-keen-io-contact-center-analytics" + ) + MARKETPLACE_MARCHEX_CLEANCALL = "marketplace-marchex-cleancall" + MARKETPLACE_MARCHEX_RECORDING_ANALYSIS = ( + "marketplace-marchex-recording-analysis" + ) + MARKETPLACE_MARCHEX_SENTIMENT_ANALYSIS_FOR_SMS = ( + "marketplace-marchex-sentiment-analysis-for-sms" + ) + MARKETPLACE_MARKETPLACE_NEXTCALLER_SOCIAL_ID = ( + "marketplace-marketplace-nextcaller-social-id" + ) + MARKETPLACE_MOBILE_COMMONS_OPT_OUT_CLASSIFIER = ( + "marketplace-mobile-commons-opt-out-classifier" + ) + MARKETPLACE_NEXIWAVE_VOICEMAIL_TO_TEXT = ( + "marketplace-nexiwave-voicemail-to-text" + ) + MARKETPLACE_NEXTCALLER_ADVANCED_CALLER_IDENTIFICATION = ( + "marketplace-nextcaller-advanced-caller-identification" + ) + MARKETPLACE_NOMOROBO_SPAM_SCORE = "marketplace-nomorobo-spam-score" + MARKETPLACE_PAY_ADDONS = "marketplace-pay-addons" + MARKETPLACE_PAY_ADDONS_BASECOMMERCE_PAY_CONNECTOR = ( + "marketplace-pay-addons-basecommerce-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_BRAINTREE_PAY_CONNECTOR = ( + "marketplace-pay-addons-braintree-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CARDCONNECT_PAY_CONNECTOR = ( + "marketplace-pay-addons-cardconnect-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CHASE_PAY_CONNECTOR = ( + "marketplace-pay-addons-chase-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplace-pay-addons-shuttle-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplace-pay-addons-stripe-pay-connector" + ) + MARKETPLACE_PAYFONE_TCPA_COMPLIANCE = "marketplace-payfone-tcpa-compliance" + MARKETPLACE_POLY_AI_CONNECTOR = "marketplace-poly-ai-connector" + MARKETPLACE_REALPHONEVALIDATION = "marketplace-realphonevalidation" + MARKETPLACE_REMEETING_AUTOMATIC_SPEECH_RECOGNITION = ( + "marketplace-remeeting-automatic-speech-recognition" + ) + MARKETPLACE_SPOKE_PHONE_LICENSE_PRO = "marketplace-spoke-phone-license-pro" + MARKETPLACE_SPOKE_PHONE_LICENSE_STANDARD = ( + "marketplace-spoke-phone-license-standard" + ) + MARKETPLACE_TCPA_DEFENSE_SOLUTIONS_BLACKLIST_FEED = ( + "marketplace-tcpa-defense-solutions-blacklist-feed" + ) + MARKETPLACE_TELO_OPENCNAM = "marketplace-telo-opencnam" + MARKETPLACE_TRESTLE_SOLUTIONS_CALLER_IDENTIFICATION = ( + "marketplace-trestle-solutions-caller-identification" + ) + MARKETPLACE_TRUECNAM_TRUE_SPAM = "marketplace-truecnam-true-spam" + MARKETPLACE_TWILIO_CALLER_NAME_LOOKUP_US = ( + "marketplace-twilio-caller-name-lookup-us" + ) + MARKETPLACE_TWILIO_CARRIER_INFORMATION_LOOKUP = ( + "marketplace-twilio-carrier-information-lookup" + ) + MARKETPLACE_VOICEBASE_PCI = "marketplace-voicebase-pci" + MARKETPLACE_VOICEBASE_TRANSCRIPTION = "marketplace-voicebase-transcription" + MARKETPLACE_VOICEBASE_TRANSCRIPTION_CUSTOM_VOCABULARY = ( + "marketplace-voicebase-transcription-custom-vocabulary" + ) + MARKETPLACE_WEB_PURIFY_PROFANITY_FILTER = ( + "marketplace-web-purify-profanity-filter" + ) + MARKETPLACE_WHITEPAGES_PRO_CALLER_IDENTIFICATION = ( + "marketplace-whitepages-pro-caller-identification" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_INTELLIGENCE = ( + "marketplace-whitepages-pro-phone-intelligence" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_REPUTATION = ( + "marketplace-whitepages-pro-phone-reputation" + ) + MARKETPLACE_WOLFARM_SPOKEN_RESULTS = "marketplace-wolfarm-spoken-results" + MARKETPLACE_WOLFRAM_SHORT_ANSWER = "marketplace-wolfram-short-answer" + MARKETPLACE_YTICA_CONTACT_CENTER_REPORTING_ANALYTICS = ( + "marketplace-ytica-contact-center-reporting-analytics" + ) + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplay-pay-addons-shuttle-pay-connector" + ) + MEDIA_COMPOSER_MINUTES = "media-composer-minutes" + MEDIASTORAGE = "mediastorage" + MIN_SPEND_ADJUSTMENTS = "min-spend-adjustments" + MMS = "mms" + MMS_INBOUND = "mms-inbound" + MMS_INBOUND_LONGCODE = "mms-inbound-longcode" + MMS_INBOUND_SHORTCODE = "mms-inbound-shortcode" + MMS_INBOUND_TOLL_FREE = "mms-inbound-toll-free" + MMS_MESSAGES_CARRIERFEES = "mms-messages-carrierfees" + MMS_OUTBOUND = "mms-outbound" + MMS_OUTBOUND_LONGCODE = "mms-outbound-longcode" + MMS_OUTBOUND_SHORTCODE = "mms-outbound-shortcode" + MMS_OUTBOUND_TOLLFREE = "mms-outbound-tollfree" + MONITOR = "monitor" + MONITOR_READS = "monitor-reads" + MONITOR_STORAGE = "monitor-storage" + MONITOR_WRITES = "monitor-writes" + NOTIFY = "notify" + NOTIFY_ACTIONS_ATTEMPTS = "notify-actions-attempts" + NOTIFY_CHANNELS = "notify-channels" + NUMBER_FORMAT_LOOKUPS = "number-format-lookups" + PCHAT = "pchat" + PCHAT_ACTIONS = "pchat-actions" + PCHAT_APS = "pchat-aps" + PCHAT_CONV_MED_STORAGE = "pchat-conv-med-storage" + PCHAT_MESSAGES = "pchat-messages" + PCHAT_NOTIFICATIONS = "pchat-notifications" + PCHAT_READS = "pchat-reads" + PCHAT_USERS = "pchat-users" + PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "peer-to-peer-rooms-participant-minutes" + ) + PFAX = "pfax" + PFAX_MINUTES = "pfax-minutes" + PFAX_MINUTES_INBOUND = "pfax-minutes-inbound" + PFAX_MINUTES_OUTBOUND = "pfax-minutes-outbound" + PFAX_PAGES = "pfax-pages" + PHONE_QUALITY_SCORE_LOOKUPS = "phone-quality-score-lookups" + PHONENUMBERS = "phonenumbers" + PHONENUMBERS_CPS = "phonenumbers-cps" + PHONENUMBERS_EMERGENCY = "phonenumbers-emergency" + PHONENUMBERS_LOCAL = "phonenumbers-local" + PHONENUMBERS_MOBILE = "phonenumbers-mobile" + PHONENUMBERS_PORTING = "phonenumbers-porting" + PHONENUMBERS_SETUPS = "phonenumbers-setups" + PHONENUMBERS_TOLLFREE = "phonenumbers-tollfree" + PREMIUMSUPPORT = "premiumsupport" + PREMIUMSUPPORT_PERCENTAGE_SPEND = "premiumsupport-percentage-spend" + PROGRAMMABLEVOICE_PLATFORM = "programmablevoice-platform" + PROGRAMMABLEVOICECONN_CLIENTSDK = "programmablevoiceconn-clientsdk" + PROGRAMMABLEVOICECONN_CLIENTSDK_INBOUND = ( + "programmablevoiceconn-clientsdk-inbound" + ) + PROGRAMMABLEVOICECONN_CLIENTSDK_OUTBOUND = ( + "programmablevoiceconn-clientsdk-outbound" + ) + PROGRAMMABLEVOICECONN_ONNET = "programmablevoiceconn-onnet" + PROGRAMMABLEVOICECONN_ONNET_INBOUND = "programmablevoiceconn-onnet-inbound" + PROGRAMMABLEVOICECONN_ONNET_OUTBOUND = "programmablevoiceconn-onnet-outbound" + PROGRAMMABLEVOICECONN_SIP = "programmablevoiceconn-sip" + PROGRAMMABLEVOICECONN_SIP_INBOUND = "programmablevoiceconn-sip-inbound" + PROGRAMMABLEVOICECONN_SIP_OUTBOUND = "programmablevoiceconn-sip-outbound" + PROGRAMMABLEVOICECONNECTIVITY = "programmablevoiceconnectivity" + PROXY = "proxy" + PROXY_ACTIVE_SESSIONS = "proxy-active-sessions" + PROXY_BUCKET_ADJUSTMENT = "proxy-bucket-adjustment" + PROXY_LICENSES = "proxy-licenses" + PSTNCONNECTIVITY = "pstnconnectivity" + PSTNCONNECTIVITY_INBOUND = "pstnconnectivity-inbound" + PSTNCONNECTIVITY_OUTBOUND = "pstnconnectivity-outbound" + PV = "pv" + PV_BASIC_ROOMS = "pv-basic-rooms" + PV_COMPOSITION_MEDIA_DOWNLOADED = "pv-composition-media-downloaded" + PV_COMPOSITION_MEDIA_ENCRYPTED = "pv-composition-media-encrypted" + PV_COMPOSITION_MEDIA_STORED = "pv-composition-media-stored" + PV_COMPOSITION_MINUTES = "pv-composition-minutes" + PV_RECORDING_COMPOSITIONS = "pv-recording-compositions" + PV_ROOM_PARTICIPANTS = "pv-room-participants" + PV_ROOM_PARTICIPANTS_AU1 = "pv-room-participants-au1" + PV_ROOM_PARTICIPANTS_BR1 = "pv-room-participants-br1" + PV_ROOM_PARTICIPANTS_IE1 = "pv-room-participants-ie1" + PV_ROOM_PARTICIPANTS_JP1 = "pv-room-participants-jp1" + PV_ROOM_PARTICIPANTS_SG1 = "pv-room-participants-sg1" + PV_ROOM_PARTICIPANTS_US1 = "pv-room-participants-us1" + PV_ROOM_PARTICIPANTS_US2 = "pv-room-participants-us2" + PV_ROOMS = "pv-rooms" + PV_SIP_ENDPOINT_REGISTRATIONS = "pv-sip-endpoint-registrations" + RCS_MESSAGES = "rcs-messages" + REASSIGNED_NUMBER = "reassigned-number" + RECORDINGS = "recordings" + RECORDINGSTORAGE = "recordingstorage" + SHORTCODES = "shortcodes" + SHORTCODES_CUSTOMEROWNED = "shortcodes-customerowned" + SHORTCODES_MMS_ENABLEMENT = "shortcodes-mms-enablement" + SHORTCODES_MPS = "shortcodes-mps" + SHORTCODES_RANDOM = "shortcodes-random" + SHORTCODES_SETUP_FEES = "shortcodes-setup-fees" + SHORTCODES_UK = "shortcodes-uk" + SHORTCODES_VANITY = "shortcodes-vanity" + SIM_SWAP_LOOKUPS = "sim-swap-lookups" + SIP_SECURE_MEDIA = "sip-secure-media" + SMALL_GROUP_ROOMS = "small-group-rooms" + SMALL_GROUP_ROOMS_DATA_TRACK = "small-group-rooms-data-track" + SMALL_GROUP_ROOMS_PARTICIPANT_MINUTES = "small-group-rooms-participant-minutes" + SMS = "sms" + SMS_INBOUND = "sms-inbound" + SMS_INBOUND_LONGCODE = "sms-inbound-longcode" + SMS_INBOUND_SHORTCODE = "sms-inbound-shortcode" + SMS_INBOUND_TOLLFREE = "sms-inbound-tollfree" + SMS_MESSAGES_CARRIERFEES = "sms-messages-carrierfees" + SMS_MESSAGES_FEATURES = "sms-messages-features" + SMS_MESSAGES_FEATURES_ENGAGEMENT_SUITE = ( + "sms-messages-features-engagement-suite" + ) + SMS_MESSAGES_FEATURES_MESSAGE_REDACTION = ( + "sms-messages-features-message-redaction" + ) + SMS_MESSAGES_FEATURES_SENDERID = "sms-messages-features-senderid" + SMS_MPS = "sms-mps" + SMS_MPS_SHORTCODE = "sms-mps-shortcode" + SMS_MPS_TOLLFREE = "sms-mps-tollfree" + SMS_MPS_TOLLFREE_SETUP = "sms-mps-tollfree-setup" + SMS_NATIONAL_REGULATORY_PROTECTION = "sms-national-regulatory-protection" + SMS_OUTBOUND = "sms-outbound" + SMS_OUTBOUND_CONTENT_INSPECTION = "sms-outbound-content-inspection" + SMS_OUTBOUND_LONGCODE = "sms-outbound-longcode" + SMS_OUTBOUND_SHORTCODE = "sms-outbound-shortcode" + SMS_OUTBOUND_TOLLFREE = "sms-outbound-tollfree" + SMS_PUMPING_PROTECTION = "sms-pumping-protection" + SMS_PUMPING_RISK = "sms-pumping-risk" + SMSMESSAGES_BUCKET_ADJUSTMENTS = "smsmessages-bucket-adjustments" + SMSMESSAGES_OUTBOUND_DOMESTIC = "smsmessages-outbound-domestic" + SPEECH_RECOGNITION = "speech-recognition" + STUDIO_ENGAGEMENTS = "studio-engagements" + SYNC = "sync" + SYNC_ACTIONS = "sync-actions" + SYNC_ENDPOINT_HOURS = "sync-endpoint-hours" + SYNC_ENDPOINT_HOURS_ABOVE_DAILY_CAP = "sync-endpoint-hours-above-daily-cap" + TASKROUTER_TASKS = "taskrouter-tasks" + TOTALPRICE = "totalprice" + TRANSCRIPTIONS = "transcriptions" + TRUNKING_CPS = "trunking-cps" + TRUNKING_EMERGENCY_CALLS = "trunking-emergency-calls" + TRUNKING_ORIGINATION = "trunking-origination" + TRUNKING_ORIGINATION_LOCAL = "trunking-origination-local" + TRUNKING_ORIGINATION_MOBILE = "trunking-origination-mobile" + TRUNKING_ORIGINATION_TOLLFREE = "trunking-origination-tollfree" + TRUNKING_RECORDINGS = "trunking-recordings" + TRUNKING_SECURE = "trunking-secure" + TRUNKING_TERMINATION = "trunking-termination" + TTS_GOOGLE = "tts-google" + TURNMEGABYTES = "turnmegabytes" + TURNMEGABYTES_AUSTRALIA = "turnmegabytes-australia" + TURNMEGABYTES_BRASIL = "turnmegabytes-brasil" + TURNMEGABYTES_GERMANY = "turnmegabytes-germany" + TURNMEGABYTES_INDIA = "turnmegabytes-india" + TURNMEGABYTES_IRELAND = "turnmegabytes-ireland" + TURNMEGABYTES_JAPAN = "turnmegabytes-japan" + TURNMEGABYTES_SINGAPORE = "turnmegabytes-singapore" + TURNMEGABYTES_USEAST = "turnmegabytes-useast" + TURNMEGABYTES_USWEST = "turnmegabytes-uswest" + TWILIO_FOR_SALESFORCE = "twilio-for-salesforce" + TWILIO_FOR_SALESFORCE_LICENSES = "twilio-for-salesforce-licenses" + TWILIO_INTERCONNECT = "twilio-interconnect" + TWIML = "twiml" + USAGE_FLEX_VIDEO = "usage-flex-video" + USAGE_FUNCTIONS = "usage-functions" + USAGE_RCS_BASIC_MESSAGES_OUTBOUND = "usage-rcs-basic-messages-outbound" + USAGE_RCS_MESSAGES = "usage-rcs-messages" + USAGE_RCS_MESSAGES_INBOUND = "usage-rcs-messages-inbound" + USAGE_RCS_MESSAGING_CARRIER_FEES = "usage-rcs-messaging-carrier-fees" + USAGE_RCS_SINGLE_MESSAGES_OUTBOUND = "usage-rcs-single-messages-outbound" + VERIFY_PACKAGE_PLANS = "verify-package-plans" + VERIFY_PUSH = "verify-push" + VERIFY_SNA = "verify-sna" + VERIFY_TOTP = "verify-totp" + VERIFY_VOICE_SMS = "verify-voice-sms" + VERIFY_WHATSAPP_CONVERSATIONS_BUSINESS_INITIATED = ( + "verify-whatsapp-conversations-business-initiated" + ) + VIDEO_RECORDINGS = "video-recordings" + VIDEO_ROOMS_TURN_MEGABYTES = "video-rooms-turn-megabytes" + VIRTUAL_AGENT = "virtual-agent" + VOICE_INSIGHTS = "voice-insights" + VOICE_INSIGHTS_CLIENT_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-client-insights-on-demand-minute" + ) + VOICE_INSIGHTS_PTSN_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-ptsn-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_INTERFACE_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-interface-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_TRUNKING_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-trunking-insights-on-demand-minute" + ) + VOICE_INTELLIGENCE = "voice-intelligence" + VOICE_INTELLIGENCE_EIP_OPERATORS = "voice-intelligence-eip-operators" + VOICE_INTELLIGENCE_OPERATORS = "voice-intelligence-operators" + VOICE_INTELLIGENCE_TRANSCRIPTION = "voice-intelligence-transcription" + WDS = "wds" + WIRELESS = "wireless" + WIRELESS_DATA = "wireless-data" + WIRELESS_DATA_PAYG = "wireless-data-payg" + WIRELESS_DATA_PAYG_AFRICA = "wireless-data-payg-africa" + WIRELESS_DATA_PAYG_ASIA = "wireless-data-payg-asia" + WIRELESS_DATA_PAYG_CENTRALANDSOUTHAMERICA = ( + "wireless-data-payg-centralandsouthamerica" + ) + WIRELESS_DATA_PAYG_EUROPE = "wireless-data-payg-europe" + WIRELESS_DATA_PAYG_NORTHAMERICA = "wireless-data-payg-northamerica" + WIRELESS_DATA_PAYG_OCEANIA = "wireless-data-payg-oceania" + WIRELESS_DATA_QUOTA1 = "wireless-data-quota1" + WIRELESS_DATA_QUOTA1_AFRICA = "wireless-data-quota1-africa" + WIRELESS_DATA_QUOTA1_ASIA = "wireless-data-quota1-asia" + WIRELESS_DATA_QUOTA1_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota1-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA1_EUROPE = "wireless-data-quota1-europe" + WIRELESS_DATA_QUOTA1_NORTHAMERICA = "wireless-data-quota1-northamerica" + WIRELESS_DATA_QUOTA1_OCEANIA = "wireless-data-quota1-oceania" + WIRELESS_DATA_QUOTA10 = "wireless-data-quota10" + WIRELESS_DATA_QUOTA10_AFRICA = "wireless-data-quota10-africa" + WIRELESS_DATA_QUOTA10_ASIA = "wireless-data-quota10-asia" + WIRELESS_DATA_QUOTA10_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota10-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA10_EUROPE = "wireless-data-quota10-europe" + WIRELESS_DATA_QUOTA10_NORTHAMERICA = "wireless-data-quota10-northamerica" + WIRELESS_DATA_QUOTA10_OCEANIA = "wireless-data-quota10-oceania" + WIRELESS_DATA_QUOTA50 = "wireless-data-quota50" + WIRELESS_DATA_QUOTA50_AFRICA = "wireless-data-quota50-africa" + WIRELESS_DATA_QUOTA50_ASIA = "wireless-data-quota50-asia" + WIRELESS_DATA_QUOTA50_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota50-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA50_EUROPE = "wireless-data-quota50-europe" + WIRELESS_DATA_QUOTA50_NORTHAMERICA = "wireless-data-quota50-northamerica" + WIRELESS_DATA_QUOTA50_OCEANIA = "wireless-data-quota50-oceania" + WIRELESS_DATA_QUOTACUSTOM = "wireless-data-quotacustom" + WIRELESS_DATA_QUOTACUSTOM_AFRICA = "wireless-data-quotacustom-africa" + WIRELESS_DATA_QUOTACUSTOM_ASIA = "wireless-data-quotacustom-asia" + WIRELESS_DATA_QUOTACUSTOM_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quotacustom-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_EUROPE = "wireless-data-quotacustom-europe" + WIRELESS_DATA_QUOTACUSTOM_NORTHAMERICA = ( + "wireless-data-quotacustom-northamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_OCEANIA = "wireless-data-quotacustom-oceania" + WIRELESS_MRC_PAYG = "wireless-mrc-payg" + WIRELESS_MRC_QUOTA1 = "wireless-mrc-quota1" + WIRELESS_MRC_QUOTA10 = "wireless-mrc-quota10" + WIRELESS_MRC_QUOTA50 = "wireless-mrc-quota50" + WIRELESS_MRC_QUOTACUSTOM = "wireless-mrc-quotacustom" + WIRELESS_ORDERS = "wireless-orders" + WIRELESS_ORDERS_ARTWORK = "wireless-orders-artwork" + WIRELESS_ORDERS_BULK = "wireless-orders-bulk" + WIRELESS_ORDERS_ESIM = "wireless-orders-esim" + WIRELESS_ORDERS_STARTER = "wireless-orders-starter" + WIRELESS_QUOTAS = "wireless-quotas" + WIRELESS_SMS_AFRICA = "wireless-sms-africa" + WIRELESS_SMS_ASIA = "wireless-sms-asia" + WIRELESS_SMS_CENTRALANDSOUTHAMERICA = "wireless-sms-centralandsouthamerica" + WIRELESS_SMS_EUROPE = "wireless-sms-europe" + WIRELESS_SMS_NORTHAMERICA = "wireless-sms-northamerica" + WIRELESS_SMS_OCEANIA = "wireless-sms-oceania" + WIRELESS_SUPER_SIM = "wireless-super-sim" + WIRELESS_SUPER_SIM_DATA = "wireless-super-sim-data" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA_USA = ( + "wireless-super-sim-data-north-america-usa" + ) + WIRELESS_SUPER_SIM_DATA_PAYG = "wireless-super-sim-data-payg" + WIRELESS_SUPER_SIM_DATA_PAYG_EUROPE = "wireless-super-sim-data-payg-europe" + WIRELESS_SUPER_SIM_DATA_PAYG_NORTH_AMERICA = ( + "wireless-super-sim-data-payg-north-america" + ) + WIRELESS_SUPER_SIM_HARDWARE = "wireless-super-sim-hardware" + WIRELESS_SUPER_SIM_HARDWARE_BULK = "wireless-super-sim-hardware-bulk" + WIRELESS_SUPER_SIM_SMSCOMMANDS = "wireless-super-sim-smscommands" + WIRELESS_SUPER_SIM_SMSCOMMANDS_AFRICA = "wireless-super-sim-smscommands-africa" + WIRELESS_SUPER_SIM_SMSCOMMANDS_ASIA = "wireless-super-sim-smscommands-asia" + WIRELESS_SUPER_SIM_SMSCOMMANDS_CENT_AND_SOUTH_AMERICA = ( + "wireless-super-sim-smscommands-cent-and-south-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_EUROPE = "wireless-super-sim-smscommands-europe" + WIRELESS_SUPER_SIM_SMSCOMMANDS_NORTH_AMERICA = ( + "wireless-super-sim-smscommands-north-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_OCEANIA = ( + "wireless-super-sim-smscommands-oceania" + ) + WIRELESS_SUPER_SIM_SUBSCRIPTION = "wireless-super-sim-subscription" + WIRELESS_SUPER_SIM_SUBSCRIPTION_PAYG = "wireless-super-sim-subscription-payg" + WIRELESS_USAGE = "wireless-usage" + WIRELESS_USAGE_COMMANDS = "wireless-usage-commands" + WIRELESS_USAGE_COMMANDS_AFRICA = "wireless-usage-commands-africa" + WIRELESS_USAGE_COMMANDS_ASIA = "wireless-usage-commands-asia" + WIRELESS_USAGE_COMMANDS_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-commands-centralandsouthamerica" + ) + WIRELESS_USAGE_COMMANDS_EUROPE = "wireless-usage-commands-europe" + WIRELESS_USAGE_COMMANDS_HOME = "wireless-usage-commands-home" + WIRELESS_USAGE_COMMANDS_NORTHAMERICA = "wireless-usage-commands-northamerica" + WIRELESS_USAGE_COMMANDS_OCEANIA = "wireless-usage-commands-oceania" + WIRELESS_USAGE_COMMANDS_ROAMING = "wireless-usage-commands-roaming" + WIRELESS_USAGE_DATA = "wireless-usage-data" + WIRELESS_USAGE_DATA_AFRICA = "wireless-usage-data-africa" + WIRELESS_USAGE_DATA_ASIA = "wireless-usage-data-asia" + WIRELESS_USAGE_DATA_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-data-centralandsouthamerica" + ) + WIRELESS_USAGE_DATA_CUSTOM_ADDITIONALMB = ( + "wireless-usage-data-custom-additionalmb" + ) + WIRELESS_USAGE_DATA_CUSTOM_FIRST5MB = "wireless-usage-data-custom-first5mb" + WIRELESS_USAGE_DATA_DOMESTIC_ROAMING = "wireless-usage-data-domestic-roaming" + WIRELESS_USAGE_DATA_EUROPE = "wireless-usage-data-europe" + WIRELESS_USAGE_DATA_INDIVIDUAL_ADDITIONALGB = ( + "wireless-usage-data-individual-additionalgb" + ) + WIRELESS_USAGE_DATA_INDIVIDUAL_FIRSTGB = ( + "wireless-usage-data-individual-firstgb" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_CANADA = ( + "wireless-usage-data-international-roaming-canada" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_INDIA = ( + "wireless-usage-data-international-roaming-india" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_MEXICO = ( + "wireless-usage-data-international-roaming-mexico" + ) + WIRELESS_USAGE_DATA_NORTHAMERICA = "wireless-usage-data-northamerica" + WIRELESS_USAGE_DATA_OCEANIA = "wireless-usage-data-oceania" + WIRELESS_USAGE_DATA_POOLED = "wireless-usage-data-pooled" + WIRELESS_USAGE_DATA_POOLED_DOWNLINK = "wireless-usage-data-pooled-downlink" + WIRELESS_USAGE_DATA_POOLED_UPLINK = "wireless-usage-data-pooled-uplink" + WIRELESS_USAGE_MRC = "wireless-usage-mrc" + WIRELESS_USAGE_MRC_CUSTOM = "wireless-usage-mrc-custom" + WIRELESS_USAGE_MRC_INDIVIDUAL = "wireless-usage-mrc-individual" + WIRELESS_USAGE_MRC_POOLED = "wireless-usage-mrc-pooled" + WIRELESS_USAGE_MRC_SUSPENDED = "wireless-usage-mrc-suspended" + WIRELESS_USAGE_SMS = "wireless-usage-sms" + WIRELESS_USAGE_VOICE = "wireless-usage-voice" + A2P_FAST_TRACK_ONBOARDING = "a2p-fast-track-onboarding" + ADVISORY_SERVICES = "advisory-services" + ADVISORY_SERVICES_BILLED = "advisory-services-billed" + ADVISORY_SERVICES_CALL_TRACKING = "advisory-services-call-tracking" + ADVISORY_SERVICES_DATA_SERVICES = "advisory-services-data-services" + ADVISORY_SERVICES_EXPENSES = "advisory-services-expenses" + ADVISORY_SERVICES_SIP_TRUNKING = "advisory-services-sip-trunking" + ASSETS_REQUESTS = "assets-requests" + AUDIENCE_MINUTES_VIDEO = "audience-minutes-video" + AUTHY_BUCKET_ADJUSTMENT = "authy-bucket-adjustment" + AUTHY_SOFTWARE = "authy-software" + CALLERIDLOOKUPS_API = "calleridlookups-api" + CALLERIDLOOKUPS_PROGRAMMABLEVOICE = "calleridlookups-programmablevoice" + CALLERIDLOOKUPS_TRUNKING = "calleridlookups-trunking" + CALLS_TRUNKING_INBOUND_TOLLFREE_LOCAL = "calls-trunking-inbound-tollfree-local" + CALLS_TRUNKING_INBOUND_TOLLFREE_MOBILE = ( + "calls-trunking-inbound-tollfree-mobile" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE_1 = "channels-whatsapp-conversation-free-1" + CONFERENCE = "conference" + CONVERSATIONAL_INSIGHTS = "conversational-insights" + CONVERSATIONAL_INSIGHTS_MESSAGES = "conversational-insights-messages" + CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = "conversational-insights-voice-minutes" + DEMO = "demo" + DEMO_UC_SCRIPT_TEST = "demo-uc-script-test" + ELASTIC_SIP_TRUNKING = "elastic-sip-trunking" + ELASTIC_SIP_TRUNKING_CALL_TRANSFERS = "elastic-sip-trunking-call-transfers" + ENTERPRISE_HIPPA = "enterprise-hippa" + FLEX_NAMED_USERS = "flex-named-users" + FLEX_SPINSCI = "flex-spinsci" + FLEX_USERS_1 = "flex-users-1" + FLEX_WFO_PREMIUM_SPEECH_ANALYTICS = "flex-wfo-premium-speech-analytics" + FLEX_XCELERATE = "flex-xcelerate" + FUNCTIONS_ROLLUP = "functions-rollup" + IMP_V1_USAGE = "imp-v1-usage" + IP_MESSAGING_ADDONS = "ip-messaging-addons" + IVR = "ivr" + IVR_CONVERSATIONAL = "ivr-conversational" + IVR_DTMF = "ivr-dtmf" + IVR_VIRTUALAGENT = "ivr-virtualagent" + LIVE = "live" + LIVE_MEDIA_RECORDING_MINUTES = "live-media-recording-minutes" + LONGCODE_MPS = "longcode-mps" + MARKETPLACE_ANALYTICS_ADDONS = "marketplace-analytics-addons" + MARKETPLACE_ISV_ADDONS = "marketplace-isv-addons" + MARKETPLACE_MESSAGING_ADDONS = "marketplace-messaging-addons" + MARKETPLACE_PHONENUMBERS_ADDONS = "marketplace-phonenumbers-addons" + MARKETPLACE_RECORDING_ADDONS = "marketplace-recording-addons" + MARKETPLACE_VIRTUALAGENT_ADDONS = "marketplace-virtualagent-addons" + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR_1 = ( + "marketplay-pay-addons-shuttle-pay-connector-1" + ) + MARKETPLAY_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplay-pay-addons-stripe-pay-connector" + ) + MMS_INBOUND_LONGCODE_CANADA = "mms-inbound-longcode-canada" + MMS_INBOUND_LONGCODE_UNITEDSTATES = "mms-inbound-longcode-unitedstates" + MMS_OUTBOUND_LONGCODE_CANADA = "mms-outbound-longcode-canada" + MMS_OUTBOUND_LONGCODE_UNITEDSTATES = "mms-outbound-longcode-unitedstates" + MMS_OUTBOUND_TOLL_FREE = "mms-outbound-toll-free" + NOTIFY_CHATAPPSANDOTHERCHANNELS = "notify-chatappsandotherchannels" + NOTIFY_NOTIFYSERVICES = "notify-notifyservices" + NOTIFY_PUSHNOTIFICATIONS = "notify-pushnotifications" + PAYMENT_GATEWAY_CONNECTORS = "payment-gateway-connectors" + PAYMENT_SOLUTIONS = "payment-solutions" + PCHAT_BUCKET_ADJUSTMENT = "pchat-bucket-adjustment" + PHONENUMBERS_NUMBERS = "phonenumbers-numbers" + PROG_VOICE_CLIENT_ANDROID = "prog-voice-client-android" + PROG_VOICE_CLIENT_ANDROID_INBOUND = "prog-voice-client-android-inbound" + PROG_VOICE_CLIENT_ANDROID_OUTBOUND = "prog-voice-client-android-outbound" + PROG_VOICE_CLIENT_IOS = "prog-voice-client-ios" + PROG_VOICE_CLIENT_IOS_INBOUND = "prog-voice-client-ios-inbound" + PROG_VOICE_CLIENT_IOS_OUTBOUND = "prog-voice-client-ios-outbound" + PROG_VOICE_CLIENT_SDK = "prog-voice-client-sdk" + PROG_VOICE_CLIENT_WEB = "prog-voice-client-web" + PROG_VOICE_CLIENT_WEB_INBOUND = "prog-voice-client-web-inbound" + PROG_VOICE_CLIENT_WEB_OUTBOUND = "prog-voice-client-web-outbound" + PROGRAMMABLEVOICECONNECTIVITY_MEDIA_STREAMS = ( + "programmablevoiceconnectivity-media-streams" + ) + PSTNCONNECTIVITY_BYOC = "pstnconnectivity-byoc" + PSTNCONNECTIVITY_EMERGENCY = "pstnconnectivity-emergency" + PSTNCONNECTIVITY_MINUTES = "pstnconnectivity-minutes" + PSTNCONNECTIVITY_MINUTES_1 = "pstnconnectivity-minutes-1" + PSTNCONNECTIVITY_MINUTESINBOUNDLOCAL = "pstnconnectivity-minutesinboundlocal" + PSTNCONNECTIVITY_MINUTESINBOUNDMOBILE = "pstnconnectivity-minutesinboundmobile" + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREE = ( + "pstnconnectivity-minutesinboundtollfree" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREELOCAL = ( + "pstnconnectivity-minutesinboundtollfreelocal" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREEMOBILE = ( + "pstnconnectivity-minutesinboundtollfreemobile" + ) + PV_ROOM_HOURS = "pv-room-hours" + PV_ROOM_SIMULTANEOUS_PARTICIPANT_CONNECTIONS = ( + "pv-room-simultaneous-participant-connections" + ) + PVIDEO_ROOM_HOURS_AU1 = "pvideo-room-hours-au1" + PVIDEO_ROOM_HOURS_BR1 = "pvideo-room-hours-br1" + PVIDEO_ROOM_HOURS_IE1 = "pvideo-room-hours-ie1" + PVIDEO_ROOM_HOURS_JP1 = "pvideo-room-hours-jp1" + PVIDEO_ROOM_HOURS_SG1 = "pvideo-room-hours-sg1" + PVIDEO_ROOM_HOURS_US1 = "pvideo-room-hours-us1" + PVIDEO_ROOM_HOURS_US2 = "pvideo-room-hours-us2" + RECORDINGS_ENCRYPTED = "recordings-encrypted" + SHORT_CODE_SETUP_FEES = "short-code-setup-fees" + SHORTCODES_MESSAGES_INBOUND = "shortcodes-messages-inbound" + SHORTCODES_MESSAGES_OUTBOUND = "shortcodes-messages-outbound" + SMS_MESSAGES_REGISTRATIONFEES = "sms-messages-registrationfees" + SMS_MMS_PENALTY_FEES = "sms-mms-penalty-fees" + SMS_MMS_PENALTY_FEES_1 = "sms-mms-penalty-fees-1" + SMS_PUMPING_PROTECTION_NON_USCA = "sms-pumping-protection-non-usca" + SMS_PUMPING_PROTECTION_USCA = "sms-pumping-protection-usca" + STUDIO = "studio" + STUDIO_MONTHLY_FEES = "studio-monthly-fees" + SUPERSIM = "supersim" + TASK_ROUTER = "task-router" + TASK_ROUTER_WORKERS = "task-router-workers" + TEST_QUOTA_BUCKETS = "test-quota-buckets" + TEST_UC_SCRIPT_1 = "test-uc-script-1" + TEST_UC_SCRIPT_DEMO_2 = "test-uc-script-demo-2" + TEXT_TO_SPEECH = "text-to-speech" + TME = "tme" + TTS_BASIC = "tts-basic" + TWILIO_EDITIONS = "twilio-editions" + TWILIO_INTERCONNECT_CALIFORNIA = "twilio-interconnect-california" + TWILIO_INTERCONNECT_CALIFORNIA_MONTHLY = ( + "twilio-interconnect-california-monthly" + ) + TWILIO_INTERCONNECT_CALIFORNIA_SETUP = "twilio-interconnect-california-setup" + TWILIO_INTERCONNECT_FRANKFURT = "twilio-interconnect-frankfurt" + TWILIO_INTERCONNECT_FRANKFURT_MO = "twilio-interconnect-frankfurt-mo" + TWILIO_INTERCONNECT_FRANKFURT_SETUP = "twilio-interconnect-frankfurt-setup" + TWILIO_INTERCONNECT_LONDON = "twilio-interconnect-london" + TWILIO_INTERCONNECT_LONDON_MO = "twilio-interconnect-london-mo" + TWILIO_INTERCONNECT_LONDON_SETUP = "twilio-interconnect-london-setup" + TWILIO_INTERCONNECT_SAO_PAULO = "twilio-interconnect-sao-paulo" + TWILIO_INTERCONNECT_SAO_PAULO_MONTHLY = "twilio-interconnect-sao-paulo-monthly" + TWILIO_INTERCONNECT_SAO_PAULO_SETUP = "twilio-interconnect-sao-paulo-setup" + TWILIO_INTERCONNECT_SINGAPORE = "twilio-interconnect-singapore" + TWILIO_INTERCONNECT_SINGAPORE_MO = "twilio-interconnect-singapore-mo" + TWILIO_INTERCONNECT_SINGAPORE_SETUP = "twilio-interconnect-singapore-setup" + TWILIO_INTERCONNECT_SYDNEY = "twilio-interconnect-sydney" + TWILIO_INTERCONNECT_SYDNEY_MO = "twilio-interconnect-sydney-mo" + TWILIO_INTERCONNECT_SYDNEY_SETUP = "twilio-interconnect-sydney-setup" + TWILIO_INTERCONNECT_TOKYO = "twilio-interconnect-tokyo" + TWILIO_INTERCONNECT_TOKYO_MO = "twilio-interconnect-tokyo-mo" + TWILIO_INTERCONNECT_TOKYO_SETUP = "twilio-interconnect-tokyo-setup" + TWILIO_INTERCONNECT_VA = "twilio-interconnect-va" + TWILIO_INTERCONNECT_VA_MO = "twilio-interconnect-va-mo" + TWILIO_INTERCONNECT_VA_SETUP = "twilio-interconnect-va-setup" + TWIML_VERBS = "twiml-verbs" + TWIML_VERBS_SAY = "twiml-verbs-say" + USAGE_PROGRAMMABLE_MESSAGING_ENGAGEMENT_SUITE = ( + "usage-programmable-messaging-engagement-suite" + ) + USAGE_PROGRAMMABLE_MESSAGING_FEES_SERVICES = ( + "usage-programmable-messaging-fees-services" + ) + VERIFY_OUTBOUND_EMAIL = "verify-outbound-email" + VERIFY_PACKAGED_PLANS = "verify-packaged-plans" + VERIFY_SILENT_NETWORK_AUTH = "verify-silent-network-auth" + VERIFY_VOICE_AND_SMS = "verify-voice-and-sms" + VOICE_INSIGHTS_CLIENT_INSIGHTS_MONTHY_COMMIT = ( + "voice-insights-client-insights-monthy-commit" + ) + WIRELESS_DATA_PAYG_ASIA_AFG = "wireless-data-payg-asia-afg" + WIRELESS_MULTI_IMSI_SIM_COMMANDS = "wireless-multi-imsi-sim-commands" + WIRELESS_MULTI_IMSI_SIM_COMMANDS_USA = "wireless-multi-imsi-sim-commands-usa" + WIRELESS_MULTI_IMSI_SIM_DATA = "wireless-multi-imsi-sim-data" + WIRELESS_MULTI_IMSI_SIM_DATA_EU28 = "wireless-multi-imsi-sim-data-eu28" + WIRELESS_MULTI_IMSI_SIM_DATA_USA = "wireless-multi-imsi-sim-data-usa" + WIRELESS_MULTI_IMSI_SIM_MONTHLY_FEES = "wireless-multi-imsi-sim-monthly-fees" + WIRELESS_MULTI_IMSI_SIM_USAGE = "wireless-multi-imsi-sim-usage" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA = "wireless-super-sim-data-north-america" + WIRELESS_SUPER_SIM_USAGE = "wireless-super-sim-usage" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that accrued the usage. + :ivar api_version: The API version used to create the resource. + :ivar as_of: Usage records up to date as of this timestamp, formatted as YYYY-MM-DDTHH:MM:SS+00:00. All timestamps are in GMT + :ivar category: + :ivar count: The number of usage events, such as the number of calls. + :ivar count_unit: The units in which `count` is measured, such as `calls` for calls or `messages` for SMS. + :ivar description: A plain-language description of the usage category. + :ivar end_date: The last date for which usage is included in the UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar price: The total price of the usage in the currency specified in `price_unit` and associated with the account. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format, such as `usd`, `eur`, and `jpy`. + :ivar start_date: The first date for which usage is included in this UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar subresource_uris: A list of related resources identified by their URIs. For more information, see [List Subresources](https://www.twilio.com/docs/usage/api/usage-record#list-subresources). + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar usage: The amount used to bill usage and measured in units described in `usage_unit`. + :ivar usage_unit: The units in which `usage` is measured, such as `minutes` for calls or `messages` for SMS. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.as_of: Optional[str] = payload.get("as_of") + self.category: Optional["MonthlyInstance.Category"] = payload.get("category") + self.count: Optional[str] = payload.get("count") + self.count_unit: Optional[str] = payload.get("count_unit") + self.description: Optional[str] = payload.get("description") + self.end_date: Optional[date] = deserialize.iso8601_date( + payload.get("end_date") + ) + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.start_date: Optional[date] = deserialize.iso8601_date( + payload.get("start_date") + ) + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.uri: Optional[str] = payload.get("uri") + self.usage: Optional[str] = payload.get("usage") + self.usage_unit: Optional[str] = payload.get("usage_unit") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MonthlyPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MonthlyInstance: + """ + Build an instance of MonthlyInstance + + :param payload: Payload response from the API + """ + return MonthlyInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MonthlyList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the MonthlyList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageRecord resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Records/Monthly.json".format( + **self._solution + ) + + def stream( + self, + category: Union["MonthlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MonthlyInstance]: + """ + Streams MonthlyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MonthlyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + category: Union["MonthlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MonthlyInstance]: + """ + Asynchronously streams MonthlyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MonthlyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + category: Union["MonthlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MonthlyInstance]: + """ + Lists MonthlyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MonthlyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + category: Union["MonthlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MonthlyInstance]: + """ + Asynchronously lists MonthlyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MonthlyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + category: Union["MonthlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MonthlyPage: + """ + Retrieve a single page of MonthlyInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MonthlyInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MonthlyPage(self._version, response, self._solution) + + async def page_async( + self, + category: Union["MonthlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MonthlyPage: + """ + Asynchronously retrieve a single page of MonthlyInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MonthlyInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MonthlyPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MonthlyPage: + """ + Retrieve a specific page of MonthlyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MonthlyInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MonthlyPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MonthlyPage: + """ + Asynchronously retrieve a specific page of MonthlyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MonthlyInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MonthlyPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/this_month.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/this_month.py new file mode 100644 index 00000000..ab65a177 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/this_month.py @@ -0,0 +1,1211 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ThisMonthInstance(InstanceResource): + + class Category(object): + A2P_10DLC_REGISTRATIONFEES_BRANDREGISTRATION = ( + "a2p-10dlc-registrationfees-brandregistration" + ) + A2P_10DLC_REGISTRATIONFEES_BV = "a2p-10dlc-registrationfees-bv" + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNCHARGES = ( + "a2p-10dlc-registrationfees-campaigncharges" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNREGISTRATION = ( + "a2p-10dlc-registrationfees-campaignregistration" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNVETTING = ( + "a2p-10dlc-registrationfees-campaignvetting" + ) + A2P_10DLC_REGISTRATIONFEES_MONTHLY = "a2p-10dlc-registrationfees-monthly" + A2P_10DLC_REGISTRATIONFEES_ONETIME = "a2p-10dlc-registrationfees-onetime" + A2P_REGISTRATION_FEES = "a2p-registration-fees" + ACCOUNT_SECURITY = "account-security" + AGENT_CONFERENCE = "agent-conference" + AGENT_COPILOT = "agent-copilot" + AGENT_COPILOT_MESSAGES = "agent-copilot-messages" + AGENT_COPILOT_PARTICIPANT_MINUTES = "agent-copilot-participant-minutes" + AI_ASSISTANTS = "ai-assistants" + AI_ASSISTANTS_VOICE = "ai-assistants-voice" + AMAZON_POLLY = "amazon-polly" + ANSWERING_MACHINE_DETECTION = "answering-machine-detection" + ASSETS = "assets" + AUDIENCE_MINUTES = "audience-minutes" + AUDIENCE_MINUTES_AUDIO = "audience-minutes-audio" + AUTHY_AUTHENTICATIONS = "authy-authentications" + AUTHY_CALLS_OUTBOUND = "authy-calls-outbound" + AUTHY_EMAIL_AUTHENTICATIONS = "authy-email-authentications" + AUTHY_MONTHLY_FEES = "authy-monthly-fees" + AUTHY_OUTBOUND_EMAIL = "authy-outbound-email" + AUTHY_PHONE_INTELLIGENCE = "authy-phone-intelligence" + AUTHY_PHONE_VERIFICATIONS = "authy-phone-verifications" + AUTHY_SMS_OUTBOUND = "authy-sms-outbound" + AUTHY_VERIFY_EMAIL_VERIFICATIONS = "authy-verify-email-verifications" + AUTHY_VERIFY_OUTBOUND_EMAIL = "authy-verify-outbound-email" + AUTOPILOT = "autopilot" + AUTOPILOT_HOME_ASSISTANTS = "autopilot-home-assistants" + AUTOPILOT_MESSAGING = "autopilot-messaging" + AUTOPILOT_OTHER = "autopilot-other" + AUTOPILOT_VOICE = "autopilot-voice" + BASIC_PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "basic-peer-to-peer-rooms-participant-minutes" + ) + BRANDED_CALLING = "branded-calling" + BUNDLE_SMS_BUCKET = "bundle-sms-bucket" + BUNDLE_SUBSCRIPTION_FEES = "bundle-subscription-fees" + CALL_FORWARDING_LOOKUPS = "call-forwarding-lookups" + CALL_PROGESS_EVENTS = "call-progess-events" + CALLERIDLOOKUPS = "calleridlookups" + CALLS = "calls" + CALLS_CLIENT = "calls-client" + CALLS_EMERGENCY = "calls-emergency" + CALLS_GLOBALCONFERENCE = "calls-globalconference" + CALLS_INBOUND = "calls-inbound" + CALLS_INBOUND_LOCAL = "calls-inbound-local" + CALLS_INBOUND_MOBILE = "calls-inbound-mobile" + CALLS_INBOUND_TOLLFREE = "calls-inbound-tollfree" + CALLS_INBOUND_TOLLFREE_LOCAL = "calls-inbound-tollfree-local" + CALLS_INBOUND_TOLLFREE_MOBILE = "calls-inbound-tollfree-mobile" + CALLS_MEDIA_STREAM_MINUTES = "calls-media-stream-minutes" + CALLS_OUTBOUND = "calls-outbound" + CALLS_PAY_VERB_TRANSACTIONS = "calls-pay-verb-transactions" + CALLS_RECORDINGS = "calls-recordings" + CALLS_SIP = "calls-sip" + CALLS_SIP_INBOUND = "calls-sip-inbound" + CALLS_SIP_OUTBOUND = "calls-sip-outbound" + CALLS_TEXT_TO_SPEECH = "calls-text-to-speech" + CALLS_TRANSFERS = "calls-transfers" + CARRIER_LOOKUPS = "carrier-lookups" + CATEGORY = "category" + CHANNELS = "channels" + CHANNELS_MESSAGING = "channels-messaging" + CHANNELS_MESSAGING_INBOUND = "channels-messaging-inbound" + CHANNELS_MESSAGING_OUTBOUND = "channels-messaging-outbound" + CHANNELS_WHATSAPP = "channels-whatsapp" + CHANNELS_WHATSAPP_CONVERSATION_AUTHENTICATION = ( + "channels-whatsapp-conversation-authentication" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE = "channels-whatsapp-conversation-free" + CHANNELS_WHATSAPP_CONVERSATION_MARKETING = ( + "channels-whatsapp-conversation-marketing" + ) + CHANNELS_WHATSAPP_CONVERSATION_SERVICE = ( + "channels-whatsapp-conversation-service" + ) + CHANNELS_WHATSAPP_CONVERSATION_UTILITY = ( + "channels-whatsapp-conversation-utility" + ) + CHANNELS_WHATSAPP_INBOUND = "channels-whatsapp-inbound" + CHANNELS_WHATSAPP_OUTBOUND = "channels-whatsapp-outbound" + CHAT_VIRTUAL_AGENT = "chat-virtual-agent" + CONVERSATION_RELAY = "conversation-relay" + CONVERSATIONS = "conversations" + CONVERSATIONS_API_REQUESTS = "conversations-api-requests" + CONVERSATIONS_CONVERSATION_EVENTS = "conversations-conversation-events" + CONVERSATIONS_ENDPOINT_CONNECTIVITY = "conversations-endpoint-connectivity" + CONVERSATIONS_EVENTS = "conversations-events" + CONVERSATIONS_PARTICIPANT_EVENTS = "conversations-participant-events" + CONVERSATIONS_PARTICIPANTS = "conversations-participants" + CPS = "cps" + CREDIT_TRANSFER = "credit-transfer" + EMAIL = "email" + EMERGING_TECH = "emerging-tech" + ENGAGEMENT_SUITE_PACKAGED_PLANS = "engagement-suite-packaged-plans" + ENHANCED_LINE_TYPE_LOOKUPS = "enhanced-line-type-lookups" + ENTERPRISE = "enterprise" + EVENTS = "events" + EXPERIMENT_FRANCE_SMS = "experiment-france-sms" + EXPERIMENT_INDIA_SMS = "experiment-india-sms" + EXPERIMENT_UK_SMS = "experiment-uk-sms" + FAILED_MESSAGE_PROCESSING_FEE = "failed-message-processing-fee" + FLEX = "flex" + FLEX_ACTIVE_USER_HOURS = "flex-active-user-hours" + FLEX_CONCURRENT_USERS = "flex-concurrent-users" + FLEX_CONVERSATIONAL_INSIGHTS = "flex-conversational-insights" + FLEX_CONVERSATIONAL_INSIGHTS_MESSAGES = "flex-conversational-insights-messages" + FLEX_CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = ( + "flex-conversational-insights-voice-minutes" + ) + FLEX_EMAIL_USAGE = "flex-email-usage" + FLEX_MESSAGING_USAGE = "flex-messaging-usage" + FLEX_PARTNER_SPINSCI = "flex-partner-spinsci" + FLEX_PARTNER_XCELERATE = "flex-partner-xcelerate" + FLEX_RESELLER_ECOSYSTEM = "flex-reseller-ecosystem" + FLEX_UNIQUE_USER = "flex-unique-user" + FLEX_USAGE = "flex-usage" + FLEX_USERS = "flex-users" + FLEX_VOICE_MINUTE = "flex-voice-minute" + FLEX_YTICA = "flex-ytica" + FRAUD_LOOKUPS = "fraud-lookups" + FRONTLINE = "frontline" + FRONTLINE_USERS = "frontline-users" + FUNCTIONS = "functions" + GENERIC_PAY_TRANSACTIONS = "generic-pay-transactions" + GROUP_ROOMS = "group-rooms" + GROUP_ROOMS_DATA_TRACK = "group-rooms-data-track" + GROUP_ROOMS_ENCRYPTED_MEDIA_RECORDED = "group-rooms-encrypted-media-recorded" + GROUP_ROOMS_MEDIA_DOWNLOADED = "group-rooms-media-downloaded" + GROUP_ROOMS_MEDIA_RECORDED = "group-rooms-media-recorded" + GROUP_ROOMS_MEDIA_ROUTED = "group-rooms-media-routed" + GROUP_ROOMS_MEDIA_STORED = "group-rooms-media-stored" + GROUP_ROOMS_PARTICIPANT_MINUTES = "group-rooms-participant-minutes" + GROUP_ROOMS_RECORDED_MINUTES = "group-rooms-recorded-minutes" + IP_MESSAGING = "ip-messaging" + IP_MESSAGING_COMMANDS = "ip-messaging-commands" + IP_MESSAGING_DATA_STORAGE = "ip-messaging-data-storage" + IP_MESSAGING_DATA_TRANSFER = "ip-messaging-data-transfer" + IP_MESSAGING_ENDPOINT_CONNECTIVITY = "ip-messaging-endpoint-connectivity" + IVR_VIRTUAL_AGENT_CUSTOM_VOICES = "ivr-virtual-agent-custom-voices" + IVR_VIRTUAL_AGENT_GENAI = "ivr-virtual-agent-genai" + LINE_STATUS_LOOKUPS = "line-status-lookups" + LIVE_ACTIVITY_LOOKUPS = "live-activity-lookups" + LOOKUP_BUCKET_ADJUSTMENT = "lookup-bucket-adjustment" + LOOKUP_IDENTITY_MATCH = "lookup-identity-match" + LOOKUPS = "lookups" + MARKETPLACE = "marketplace" + MARKETPLACE_ALGORITHMIA_NAMED_ENTITY_RECOGNITION = ( + "marketplace-algorithmia-named-entity-recognition" + ) + MARKETPLACE_CADENCE_TRANSCRIPTION = "marketplace-cadence-transcription" + MARKETPLACE_CADENCE_TRANSLATION = "marketplace-cadence-translation" + MARKETPLACE_CAPIO_SPEECH_TO_TEXT = "marketplace-capio-speech-to-text" + MARKETPLACE_CONVRIZA_ABABA = "marketplace-convriza-ababa" + MARKETPLACE_DEEPGRAM_PHRASE_DETECTOR = "marketplace-deepgram-phrase-detector" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION = "marketplace-deepgram-transcription" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION_BASE = ( + "marketplace-deepgram-transcription-base" + ) + MARKETPLACE_DEEPGRAM_TRANSSCRIPTION_ENHANCED = ( + "marketplace-deepgram-transscription-enhanced" + ) + MARKETPLACE_DIGITAL_SEGMENT_BUSINESS_INFO = ( + "marketplace-digital-segment-business-info" + ) + MARKETPLACE_FACEBOOK_OFFLINE_CONVERSIONS = ( + "marketplace-facebook-offline-conversions" + ) + MARKETPLACE_GOOGLE_SPEECH_TO_TEXT = "marketplace-google-speech-to-text" + MARKETPLACE_IBM_WATSON_MESSAGE_INSIGHTS = ( + "marketplace-ibm-watson-message-insights" + ) + MARKETPLACE_IBM_WATSON_MESSAGE_SENTIMENT = ( + "marketplace-ibm-watson-message-sentiment" + ) + MARKETPLACE_IBM_WATSON_RECORDING_ANALYSIS = ( + "marketplace-ibm-watson-recording-analysis" + ) + MARKETPLACE_IBM_WATSON_TONE_ANALYZER = "marketplace-ibm-watson-tone-analyzer" + MARKETPLACE_ICEHOOK_SYSTEMS_SCOUT = "marketplace-icehook-systems-scout" + MARKETPLACE_INFOGROUP_DATAAXLE_BIZINFO = ( + "marketplace-infogroup-dataaxle-bizinfo" + ) + MARKETPLACE_KEEN_IO_CONTACT_CENTER_ANALYTICS = ( + "marketplace-keen-io-contact-center-analytics" + ) + MARKETPLACE_MARCHEX_CLEANCALL = "marketplace-marchex-cleancall" + MARKETPLACE_MARCHEX_RECORDING_ANALYSIS = ( + "marketplace-marchex-recording-analysis" + ) + MARKETPLACE_MARCHEX_SENTIMENT_ANALYSIS_FOR_SMS = ( + "marketplace-marchex-sentiment-analysis-for-sms" + ) + MARKETPLACE_MARKETPLACE_NEXTCALLER_SOCIAL_ID = ( + "marketplace-marketplace-nextcaller-social-id" + ) + MARKETPLACE_MOBILE_COMMONS_OPT_OUT_CLASSIFIER = ( + "marketplace-mobile-commons-opt-out-classifier" + ) + MARKETPLACE_NEXIWAVE_VOICEMAIL_TO_TEXT = ( + "marketplace-nexiwave-voicemail-to-text" + ) + MARKETPLACE_NEXTCALLER_ADVANCED_CALLER_IDENTIFICATION = ( + "marketplace-nextcaller-advanced-caller-identification" + ) + MARKETPLACE_NOMOROBO_SPAM_SCORE = "marketplace-nomorobo-spam-score" + MARKETPLACE_PAY_ADDONS = "marketplace-pay-addons" + MARKETPLACE_PAY_ADDONS_BASECOMMERCE_PAY_CONNECTOR = ( + "marketplace-pay-addons-basecommerce-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_BRAINTREE_PAY_CONNECTOR = ( + "marketplace-pay-addons-braintree-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CARDCONNECT_PAY_CONNECTOR = ( + "marketplace-pay-addons-cardconnect-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CHASE_PAY_CONNECTOR = ( + "marketplace-pay-addons-chase-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplace-pay-addons-shuttle-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplace-pay-addons-stripe-pay-connector" + ) + MARKETPLACE_PAYFONE_TCPA_COMPLIANCE = "marketplace-payfone-tcpa-compliance" + MARKETPLACE_POLY_AI_CONNECTOR = "marketplace-poly-ai-connector" + MARKETPLACE_REALPHONEVALIDATION = "marketplace-realphonevalidation" + MARKETPLACE_REMEETING_AUTOMATIC_SPEECH_RECOGNITION = ( + "marketplace-remeeting-automatic-speech-recognition" + ) + MARKETPLACE_SPOKE_PHONE_LICENSE_PRO = "marketplace-spoke-phone-license-pro" + MARKETPLACE_SPOKE_PHONE_LICENSE_STANDARD = ( + "marketplace-spoke-phone-license-standard" + ) + MARKETPLACE_TCPA_DEFENSE_SOLUTIONS_BLACKLIST_FEED = ( + "marketplace-tcpa-defense-solutions-blacklist-feed" + ) + MARKETPLACE_TELO_OPENCNAM = "marketplace-telo-opencnam" + MARKETPLACE_TRESTLE_SOLUTIONS_CALLER_IDENTIFICATION = ( + "marketplace-trestle-solutions-caller-identification" + ) + MARKETPLACE_TRUECNAM_TRUE_SPAM = "marketplace-truecnam-true-spam" + MARKETPLACE_TWILIO_CALLER_NAME_LOOKUP_US = ( + "marketplace-twilio-caller-name-lookup-us" + ) + MARKETPLACE_TWILIO_CARRIER_INFORMATION_LOOKUP = ( + "marketplace-twilio-carrier-information-lookup" + ) + MARKETPLACE_VOICEBASE_PCI = "marketplace-voicebase-pci" + MARKETPLACE_VOICEBASE_TRANSCRIPTION = "marketplace-voicebase-transcription" + MARKETPLACE_VOICEBASE_TRANSCRIPTION_CUSTOM_VOCABULARY = ( + "marketplace-voicebase-transcription-custom-vocabulary" + ) + MARKETPLACE_WEB_PURIFY_PROFANITY_FILTER = ( + "marketplace-web-purify-profanity-filter" + ) + MARKETPLACE_WHITEPAGES_PRO_CALLER_IDENTIFICATION = ( + "marketplace-whitepages-pro-caller-identification" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_INTELLIGENCE = ( + "marketplace-whitepages-pro-phone-intelligence" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_REPUTATION = ( + "marketplace-whitepages-pro-phone-reputation" + ) + MARKETPLACE_WOLFARM_SPOKEN_RESULTS = "marketplace-wolfarm-spoken-results" + MARKETPLACE_WOLFRAM_SHORT_ANSWER = "marketplace-wolfram-short-answer" + MARKETPLACE_YTICA_CONTACT_CENTER_REPORTING_ANALYTICS = ( + "marketplace-ytica-contact-center-reporting-analytics" + ) + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplay-pay-addons-shuttle-pay-connector" + ) + MEDIA_COMPOSER_MINUTES = "media-composer-minutes" + MEDIASTORAGE = "mediastorage" + MIN_SPEND_ADJUSTMENTS = "min-spend-adjustments" + MMS = "mms" + MMS_INBOUND = "mms-inbound" + MMS_INBOUND_LONGCODE = "mms-inbound-longcode" + MMS_INBOUND_SHORTCODE = "mms-inbound-shortcode" + MMS_INBOUND_TOLL_FREE = "mms-inbound-toll-free" + MMS_MESSAGES_CARRIERFEES = "mms-messages-carrierfees" + MMS_OUTBOUND = "mms-outbound" + MMS_OUTBOUND_LONGCODE = "mms-outbound-longcode" + MMS_OUTBOUND_SHORTCODE = "mms-outbound-shortcode" + MMS_OUTBOUND_TOLLFREE = "mms-outbound-tollfree" + MONITOR = "monitor" + MONITOR_READS = "monitor-reads" + MONITOR_STORAGE = "monitor-storage" + MONITOR_WRITES = "monitor-writes" + NOTIFY = "notify" + NOTIFY_ACTIONS_ATTEMPTS = "notify-actions-attempts" + NOTIFY_CHANNELS = "notify-channels" + NUMBER_FORMAT_LOOKUPS = "number-format-lookups" + PCHAT = "pchat" + PCHAT_ACTIONS = "pchat-actions" + PCHAT_APS = "pchat-aps" + PCHAT_CONV_MED_STORAGE = "pchat-conv-med-storage" + PCHAT_MESSAGES = "pchat-messages" + PCHAT_NOTIFICATIONS = "pchat-notifications" + PCHAT_READS = "pchat-reads" + PCHAT_USERS = "pchat-users" + PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "peer-to-peer-rooms-participant-minutes" + ) + PFAX = "pfax" + PFAX_MINUTES = "pfax-minutes" + PFAX_MINUTES_INBOUND = "pfax-minutes-inbound" + PFAX_MINUTES_OUTBOUND = "pfax-minutes-outbound" + PFAX_PAGES = "pfax-pages" + PHONE_QUALITY_SCORE_LOOKUPS = "phone-quality-score-lookups" + PHONENUMBERS = "phonenumbers" + PHONENUMBERS_CPS = "phonenumbers-cps" + PHONENUMBERS_EMERGENCY = "phonenumbers-emergency" + PHONENUMBERS_LOCAL = "phonenumbers-local" + PHONENUMBERS_MOBILE = "phonenumbers-mobile" + PHONENUMBERS_PORTING = "phonenumbers-porting" + PHONENUMBERS_SETUPS = "phonenumbers-setups" + PHONENUMBERS_TOLLFREE = "phonenumbers-tollfree" + PREMIUMSUPPORT = "premiumsupport" + PREMIUMSUPPORT_PERCENTAGE_SPEND = "premiumsupport-percentage-spend" + PROGRAMMABLEVOICE_PLATFORM = "programmablevoice-platform" + PROGRAMMABLEVOICECONN_CLIENTSDK = "programmablevoiceconn-clientsdk" + PROGRAMMABLEVOICECONN_CLIENTSDK_INBOUND = ( + "programmablevoiceconn-clientsdk-inbound" + ) + PROGRAMMABLEVOICECONN_CLIENTSDK_OUTBOUND = ( + "programmablevoiceconn-clientsdk-outbound" + ) + PROGRAMMABLEVOICECONN_ONNET = "programmablevoiceconn-onnet" + PROGRAMMABLEVOICECONN_ONNET_INBOUND = "programmablevoiceconn-onnet-inbound" + PROGRAMMABLEVOICECONN_ONNET_OUTBOUND = "programmablevoiceconn-onnet-outbound" + PROGRAMMABLEVOICECONN_SIP = "programmablevoiceconn-sip" + PROGRAMMABLEVOICECONN_SIP_INBOUND = "programmablevoiceconn-sip-inbound" + PROGRAMMABLEVOICECONN_SIP_OUTBOUND = "programmablevoiceconn-sip-outbound" + PROGRAMMABLEVOICECONNECTIVITY = "programmablevoiceconnectivity" + PROXY = "proxy" + PROXY_ACTIVE_SESSIONS = "proxy-active-sessions" + PROXY_BUCKET_ADJUSTMENT = "proxy-bucket-adjustment" + PROXY_LICENSES = "proxy-licenses" + PSTNCONNECTIVITY = "pstnconnectivity" + PSTNCONNECTIVITY_INBOUND = "pstnconnectivity-inbound" + PSTNCONNECTIVITY_OUTBOUND = "pstnconnectivity-outbound" + PV = "pv" + PV_BASIC_ROOMS = "pv-basic-rooms" + PV_COMPOSITION_MEDIA_DOWNLOADED = "pv-composition-media-downloaded" + PV_COMPOSITION_MEDIA_ENCRYPTED = "pv-composition-media-encrypted" + PV_COMPOSITION_MEDIA_STORED = "pv-composition-media-stored" + PV_COMPOSITION_MINUTES = "pv-composition-minutes" + PV_RECORDING_COMPOSITIONS = "pv-recording-compositions" + PV_ROOM_PARTICIPANTS = "pv-room-participants" + PV_ROOM_PARTICIPANTS_AU1 = "pv-room-participants-au1" + PV_ROOM_PARTICIPANTS_BR1 = "pv-room-participants-br1" + PV_ROOM_PARTICIPANTS_IE1 = "pv-room-participants-ie1" + PV_ROOM_PARTICIPANTS_JP1 = "pv-room-participants-jp1" + PV_ROOM_PARTICIPANTS_SG1 = "pv-room-participants-sg1" + PV_ROOM_PARTICIPANTS_US1 = "pv-room-participants-us1" + PV_ROOM_PARTICIPANTS_US2 = "pv-room-participants-us2" + PV_ROOMS = "pv-rooms" + PV_SIP_ENDPOINT_REGISTRATIONS = "pv-sip-endpoint-registrations" + RCS_MESSAGES = "rcs-messages" + REASSIGNED_NUMBER = "reassigned-number" + RECORDINGS = "recordings" + RECORDINGSTORAGE = "recordingstorage" + SHORTCODES = "shortcodes" + SHORTCODES_CUSTOMEROWNED = "shortcodes-customerowned" + SHORTCODES_MMS_ENABLEMENT = "shortcodes-mms-enablement" + SHORTCODES_MPS = "shortcodes-mps" + SHORTCODES_RANDOM = "shortcodes-random" + SHORTCODES_SETUP_FEES = "shortcodes-setup-fees" + SHORTCODES_UK = "shortcodes-uk" + SHORTCODES_VANITY = "shortcodes-vanity" + SIM_SWAP_LOOKUPS = "sim-swap-lookups" + SIP_SECURE_MEDIA = "sip-secure-media" + SMALL_GROUP_ROOMS = "small-group-rooms" + SMALL_GROUP_ROOMS_DATA_TRACK = "small-group-rooms-data-track" + SMALL_GROUP_ROOMS_PARTICIPANT_MINUTES = "small-group-rooms-participant-minutes" + SMS = "sms" + SMS_INBOUND = "sms-inbound" + SMS_INBOUND_LONGCODE = "sms-inbound-longcode" + SMS_INBOUND_SHORTCODE = "sms-inbound-shortcode" + SMS_INBOUND_TOLLFREE = "sms-inbound-tollfree" + SMS_MESSAGES_CARRIERFEES = "sms-messages-carrierfees" + SMS_MESSAGES_FEATURES = "sms-messages-features" + SMS_MESSAGES_FEATURES_ENGAGEMENT_SUITE = ( + "sms-messages-features-engagement-suite" + ) + SMS_MESSAGES_FEATURES_MESSAGE_REDACTION = ( + "sms-messages-features-message-redaction" + ) + SMS_MESSAGES_FEATURES_SENDERID = "sms-messages-features-senderid" + SMS_MPS = "sms-mps" + SMS_MPS_SHORTCODE = "sms-mps-shortcode" + SMS_MPS_TOLLFREE = "sms-mps-tollfree" + SMS_MPS_TOLLFREE_SETUP = "sms-mps-tollfree-setup" + SMS_NATIONAL_REGULATORY_PROTECTION = "sms-national-regulatory-protection" + SMS_OUTBOUND = "sms-outbound" + SMS_OUTBOUND_CONTENT_INSPECTION = "sms-outbound-content-inspection" + SMS_OUTBOUND_LONGCODE = "sms-outbound-longcode" + SMS_OUTBOUND_SHORTCODE = "sms-outbound-shortcode" + SMS_OUTBOUND_TOLLFREE = "sms-outbound-tollfree" + SMS_PUMPING_PROTECTION = "sms-pumping-protection" + SMS_PUMPING_RISK = "sms-pumping-risk" + SMSMESSAGES_BUCKET_ADJUSTMENTS = "smsmessages-bucket-adjustments" + SMSMESSAGES_OUTBOUND_DOMESTIC = "smsmessages-outbound-domestic" + SPEECH_RECOGNITION = "speech-recognition" + STUDIO_ENGAGEMENTS = "studio-engagements" + SYNC = "sync" + SYNC_ACTIONS = "sync-actions" + SYNC_ENDPOINT_HOURS = "sync-endpoint-hours" + SYNC_ENDPOINT_HOURS_ABOVE_DAILY_CAP = "sync-endpoint-hours-above-daily-cap" + TASKROUTER_TASKS = "taskrouter-tasks" + TOTALPRICE = "totalprice" + TRANSCRIPTIONS = "transcriptions" + TRUNKING_CPS = "trunking-cps" + TRUNKING_EMERGENCY_CALLS = "trunking-emergency-calls" + TRUNKING_ORIGINATION = "trunking-origination" + TRUNKING_ORIGINATION_LOCAL = "trunking-origination-local" + TRUNKING_ORIGINATION_MOBILE = "trunking-origination-mobile" + TRUNKING_ORIGINATION_TOLLFREE = "trunking-origination-tollfree" + TRUNKING_RECORDINGS = "trunking-recordings" + TRUNKING_SECURE = "trunking-secure" + TRUNKING_TERMINATION = "trunking-termination" + TTS_GOOGLE = "tts-google" + TURNMEGABYTES = "turnmegabytes" + TURNMEGABYTES_AUSTRALIA = "turnmegabytes-australia" + TURNMEGABYTES_BRASIL = "turnmegabytes-brasil" + TURNMEGABYTES_GERMANY = "turnmegabytes-germany" + TURNMEGABYTES_INDIA = "turnmegabytes-india" + TURNMEGABYTES_IRELAND = "turnmegabytes-ireland" + TURNMEGABYTES_JAPAN = "turnmegabytes-japan" + TURNMEGABYTES_SINGAPORE = "turnmegabytes-singapore" + TURNMEGABYTES_USEAST = "turnmegabytes-useast" + TURNMEGABYTES_USWEST = "turnmegabytes-uswest" + TWILIO_FOR_SALESFORCE = "twilio-for-salesforce" + TWILIO_FOR_SALESFORCE_LICENSES = "twilio-for-salesforce-licenses" + TWILIO_INTERCONNECT = "twilio-interconnect" + TWIML = "twiml" + USAGE_FLEX_VIDEO = "usage-flex-video" + USAGE_FUNCTIONS = "usage-functions" + USAGE_RCS_BASIC_MESSAGES_OUTBOUND = "usage-rcs-basic-messages-outbound" + USAGE_RCS_MESSAGES = "usage-rcs-messages" + USAGE_RCS_MESSAGES_INBOUND = "usage-rcs-messages-inbound" + USAGE_RCS_MESSAGING_CARRIER_FEES = "usage-rcs-messaging-carrier-fees" + USAGE_RCS_SINGLE_MESSAGES_OUTBOUND = "usage-rcs-single-messages-outbound" + VERIFY_PACKAGE_PLANS = "verify-package-plans" + VERIFY_PUSH = "verify-push" + VERIFY_SNA = "verify-sna" + VERIFY_TOTP = "verify-totp" + VERIFY_VOICE_SMS = "verify-voice-sms" + VERIFY_WHATSAPP_CONVERSATIONS_BUSINESS_INITIATED = ( + "verify-whatsapp-conversations-business-initiated" + ) + VIDEO_RECORDINGS = "video-recordings" + VIDEO_ROOMS_TURN_MEGABYTES = "video-rooms-turn-megabytes" + VIRTUAL_AGENT = "virtual-agent" + VOICE_INSIGHTS = "voice-insights" + VOICE_INSIGHTS_CLIENT_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-client-insights-on-demand-minute" + ) + VOICE_INSIGHTS_PTSN_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-ptsn-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_INTERFACE_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-interface-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_TRUNKING_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-trunking-insights-on-demand-minute" + ) + VOICE_INTELLIGENCE = "voice-intelligence" + VOICE_INTELLIGENCE_EIP_OPERATORS = "voice-intelligence-eip-operators" + VOICE_INTELLIGENCE_OPERATORS = "voice-intelligence-operators" + VOICE_INTELLIGENCE_TRANSCRIPTION = "voice-intelligence-transcription" + WDS = "wds" + WIRELESS = "wireless" + WIRELESS_DATA = "wireless-data" + WIRELESS_DATA_PAYG = "wireless-data-payg" + WIRELESS_DATA_PAYG_AFRICA = "wireless-data-payg-africa" + WIRELESS_DATA_PAYG_ASIA = "wireless-data-payg-asia" + WIRELESS_DATA_PAYG_CENTRALANDSOUTHAMERICA = ( + "wireless-data-payg-centralandsouthamerica" + ) + WIRELESS_DATA_PAYG_EUROPE = "wireless-data-payg-europe" + WIRELESS_DATA_PAYG_NORTHAMERICA = "wireless-data-payg-northamerica" + WIRELESS_DATA_PAYG_OCEANIA = "wireless-data-payg-oceania" + WIRELESS_DATA_QUOTA1 = "wireless-data-quota1" + WIRELESS_DATA_QUOTA1_AFRICA = "wireless-data-quota1-africa" + WIRELESS_DATA_QUOTA1_ASIA = "wireless-data-quota1-asia" + WIRELESS_DATA_QUOTA1_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota1-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA1_EUROPE = "wireless-data-quota1-europe" + WIRELESS_DATA_QUOTA1_NORTHAMERICA = "wireless-data-quota1-northamerica" + WIRELESS_DATA_QUOTA1_OCEANIA = "wireless-data-quota1-oceania" + WIRELESS_DATA_QUOTA10 = "wireless-data-quota10" + WIRELESS_DATA_QUOTA10_AFRICA = "wireless-data-quota10-africa" + WIRELESS_DATA_QUOTA10_ASIA = "wireless-data-quota10-asia" + WIRELESS_DATA_QUOTA10_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota10-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA10_EUROPE = "wireless-data-quota10-europe" + WIRELESS_DATA_QUOTA10_NORTHAMERICA = "wireless-data-quota10-northamerica" + WIRELESS_DATA_QUOTA10_OCEANIA = "wireless-data-quota10-oceania" + WIRELESS_DATA_QUOTA50 = "wireless-data-quota50" + WIRELESS_DATA_QUOTA50_AFRICA = "wireless-data-quota50-africa" + WIRELESS_DATA_QUOTA50_ASIA = "wireless-data-quota50-asia" + WIRELESS_DATA_QUOTA50_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota50-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA50_EUROPE = "wireless-data-quota50-europe" + WIRELESS_DATA_QUOTA50_NORTHAMERICA = "wireless-data-quota50-northamerica" + WIRELESS_DATA_QUOTA50_OCEANIA = "wireless-data-quota50-oceania" + WIRELESS_DATA_QUOTACUSTOM = "wireless-data-quotacustom" + WIRELESS_DATA_QUOTACUSTOM_AFRICA = "wireless-data-quotacustom-africa" + WIRELESS_DATA_QUOTACUSTOM_ASIA = "wireless-data-quotacustom-asia" + WIRELESS_DATA_QUOTACUSTOM_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quotacustom-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_EUROPE = "wireless-data-quotacustom-europe" + WIRELESS_DATA_QUOTACUSTOM_NORTHAMERICA = ( + "wireless-data-quotacustom-northamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_OCEANIA = "wireless-data-quotacustom-oceania" + WIRELESS_MRC_PAYG = "wireless-mrc-payg" + WIRELESS_MRC_QUOTA1 = "wireless-mrc-quota1" + WIRELESS_MRC_QUOTA10 = "wireless-mrc-quota10" + WIRELESS_MRC_QUOTA50 = "wireless-mrc-quota50" + WIRELESS_MRC_QUOTACUSTOM = "wireless-mrc-quotacustom" + WIRELESS_ORDERS = "wireless-orders" + WIRELESS_ORDERS_ARTWORK = "wireless-orders-artwork" + WIRELESS_ORDERS_BULK = "wireless-orders-bulk" + WIRELESS_ORDERS_ESIM = "wireless-orders-esim" + WIRELESS_ORDERS_STARTER = "wireless-orders-starter" + WIRELESS_QUOTAS = "wireless-quotas" + WIRELESS_SMS_AFRICA = "wireless-sms-africa" + WIRELESS_SMS_ASIA = "wireless-sms-asia" + WIRELESS_SMS_CENTRALANDSOUTHAMERICA = "wireless-sms-centralandsouthamerica" + WIRELESS_SMS_EUROPE = "wireless-sms-europe" + WIRELESS_SMS_NORTHAMERICA = "wireless-sms-northamerica" + WIRELESS_SMS_OCEANIA = "wireless-sms-oceania" + WIRELESS_SUPER_SIM = "wireless-super-sim" + WIRELESS_SUPER_SIM_DATA = "wireless-super-sim-data" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA_USA = ( + "wireless-super-sim-data-north-america-usa" + ) + WIRELESS_SUPER_SIM_DATA_PAYG = "wireless-super-sim-data-payg" + WIRELESS_SUPER_SIM_DATA_PAYG_EUROPE = "wireless-super-sim-data-payg-europe" + WIRELESS_SUPER_SIM_DATA_PAYG_NORTH_AMERICA = ( + "wireless-super-sim-data-payg-north-america" + ) + WIRELESS_SUPER_SIM_HARDWARE = "wireless-super-sim-hardware" + WIRELESS_SUPER_SIM_HARDWARE_BULK = "wireless-super-sim-hardware-bulk" + WIRELESS_SUPER_SIM_SMSCOMMANDS = "wireless-super-sim-smscommands" + WIRELESS_SUPER_SIM_SMSCOMMANDS_AFRICA = "wireless-super-sim-smscommands-africa" + WIRELESS_SUPER_SIM_SMSCOMMANDS_ASIA = "wireless-super-sim-smscommands-asia" + WIRELESS_SUPER_SIM_SMSCOMMANDS_CENT_AND_SOUTH_AMERICA = ( + "wireless-super-sim-smscommands-cent-and-south-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_EUROPE = "wireless-super-sim-smscommands-europe" + WIRELESS_SUPER_SIM_SMSCOMMANDS_NORTH_AMERICA = ( + "wireless-super-sim-smscommands-north-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_OCEANIA = ( + "wireless-super-sim-smscommands-oceania" + ) + WIRELESS_SUPER_SIM_SUBSCRIPTION = "wireless-super-sim-subscription" + WIRELESS_SUPER_SIM_SUBSCRIPTION_PAYG = "wireless-super-sim-subscription-payg" + WIRELESS_USAGE = "wireless-usage" + WIRELESS_USAGE_COMMANDS = "wireless-usage-commands" + WIRELESS_USAGE_COMMANDS_AFRICA = "wireless-usage-commands-africa" + WIRELESS_USAGE_COMMANDS_ASIA = "wireless-usage-commands-asia" + WIRELESS_USAGE_COMMANDS_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-commands-centralandsouthamerica" + ) + WIRELESS_USAGE_COMMANDS_EUROPE = "wireless-usage-commands-europe" + WIRELESS_USAGE_COMMANDS_HOME = "wireless-usage-commands-home" + WIRELESS_USAGE_COMMANDS_NORTHAMERICA = "wireless-usage-commands-northamerica" + WIRELESS_USAGE_COMMANDS_OCEANIA = "wireless-usage-commands-oceania" + WIRELESS_USAGE_COMMANDS_ROAMING = "wireless-usage-commands-roaming" + WIRELESS_USAGE_DATA = "wireless-usage-data" + WIRELESS_USAGE_DATA_AFRICA = "wireless-usage-data-africa" + WIRELESS_USAGE_DATA_ASIA = "wireless-usage-data-asia" + WIRELESS_USAGE_DATA_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-data-centralandsouthamerica" + ) + WIRELESS_USAGE_DATA_CUSTOM_ADDITIONALMB = ( + "wireless-usage-data-custom-additionalmb" + ) + WIRELESS_USAGE_DATA_CUSTOM_FIRST5MB = "wireless-usage-data-custom-first5mb" + WIRELESS_USAGE_DATA_DOMESTIC_ROAMING = "wireless-usage-data-domestic-roaming" + WIRELESS_USAGE_DATA_EUROPE = "wireless-usage-data-europe" + WIRELESS_USAGE_DATA_INDIVIDUAL_ADDITIONALGB = ( + "wireless-usage-data-individual-additionalgb" + ) + WIRELESS_USAGE_DATA_INDIVIDUAL_FIRSTGB = ( + "wireless-usage-data-individual-firstgb" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_CANADA = ( + "wireless-usage-data-international-roaming-canada" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_INDIA = ( + "wireless-usage-data-international-roaming-india" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_MEXICO = ( + "wireless-usage-data-international-roaming-mexico" + ) + WIRELESS_USAGE_DATA_NORTHAMERICA = "wireless-usage-data-northamerica" + WIRELESS_USAGE_DATA_OCEANIA = "wireless-usage-data-oceania" + WIRELESS_USAGE_DATA_POOLED = "wireless-usage-data-pooled" + WIRELESS_USAGE_DATA_POOLED_DOWNLINK = "wireless-usage-data-pooled-downlink" + WIRELESS_USAGE_DATA_POOLED_UPLINK = "wireless-usage-data-pooled-uplink" + WIRELESS_USAGE_MRC = "wireless-usage-mrc" + WIRELESS_USAGE_MRC_CUSTOM = "wireless-usage-mrc-custom" + WIRELESS_USAGE_MRC_INDIVIDUAL = "wireless-usage-mrc-individual" + WIRELESS_USAGE_MRC_POOLED = "wireless-usage-mrc-pooled" + WIRELESS_USAGE_MRC_SUSPENDED = "wireless-usage-mrc-suspended" + WIRELESS_USAGE_SMS = "wireless-usage-sms" + WIRELESS_USAGE_VOICE = "wireless-usage-voice" + A2P_FAST_TRACK_ONBOARDING = "a2p-fast-track-onboarding" + ADVISORY_SERVICES = "advisory-services" + ADVISORY_SERVICES_BILLED = "advisory-services-billed" + ADVISORY_SERVICES_CALL_TRACKING = "advisory-services-call-tracking" + ADVISORY_SERVICES_DATA_SERVICES = "advisory-services-data-services" + ADVISORY_SERVICES_EXPENSES = "advisory-services-expenses" + ADVISORY_SERVICES_SIP_TRUNKING = "advisory-services-sip-trunking" + ASSETS_REQUESTS = "assets-requests" + AUDIENCE_MINUTES_VIDEO = "audience-minutes-video" + AUTHY_BUCKET_ADJUSTMENT = "authy-bucket-adjustment" + AUTHY_SOFTWARE = "authy-software" + CALLERIDLOOKUPS_API = "calleridlookups-api" + CALLERIDLOOKUPS_PROGRAMMABLEVOICE = "calleridlookups-programmablevoice" + CALLERIDLOOKUPS_TRUNKING = "calleridlookups-trunking" + CALLS_TRUNKING_INBOUND_TOLLFREE_LOCAL = "calls-trunking-inbound-tollfree-local" + CALLS_TRUNKING_INBOUND_TOLLFREE_MOBILE = ( + "calls-trunking-inbound-tollfree-mobile" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE_1 = "channels-whatsapp-conversation-free-1" + CONFERENCE = "conference" + CONVERSATIONAL_INSIGHTS = "conversational-insights" + CONVERSATIONAL_INSIGHTS_MESSAGES = "conversational-insights-messages" + CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = "conversational-insights-voice-minutes" + DEMO = "demo" + DEMO_UC_SCRIPT_TEST = "demo-uc-script-test" + ELASTIC_SIP_TRUNKING = "elastic-sip-trunking" + ELASTIC_SIP_TRUNKING_CALL_TRANSFERS = "elastic-sip-trunking-call-transfers" + ENTERPRISE_HIPPA = "enterprise-hippa" + FLEX_NAMED_USERS = "flex-named-users" + FLEX_SPINSCI = "flex-spinsci" + FLEX_USERS_1 = "flex-users-1" + FLEX_WFO_PREMIUM_SPEECH_ANALYTICS = "flex-wfo-premium-speech-analytics" + FLEX_XCELERATE = "flex-xcelerate" + FUNCTIONS_ROLLUP = "functions-rollup" + IMP_V1_USAGE = "imp-v1-usage" + IP_MESSAGING_ADDONS = "ip-messaging-addons" + IVR = "ivr" + IVR_CONVERSATIONAL = "ivr-conversational" + IVR_DTMF = "ivr-dtmf" + IVR_VIRTUALAGENT = "ivr-virtualagent" + LIVE = "live" + LIVE_MEDIA_RECORDING_MINUTES = "live-media-recording-minutes" + LONGCODE_MPS = "longcode-mps" + MARKETPLACE_ANALYTICS_ADDONS = "marketplace-analytics-addons" + MARKETPLACE_ISV_ADDONS = "marketplace-isv-addons" + MARKETPLACE_MESSAGING_ADDONS = "marketplace-messaging-addons" + MARKETPLACE_PHONENUMBERS_ADDONS = "marketplace-phonenumbers-addons" + MARKETPLACE_RECORDING_ADDONS = "marketplace-recording-addons" + MARKETPLACE_VIRTUALAGENT_ADDONS = "marketplace-virtualagent-addons" + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR_1 = ( + "marketplay-pay-addons-shuttle-pay-connector-1" + ) + MARKETPLAY_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplay-pay-addons-stripe-pay-connector" + ) + MMS_INBOUND_LONGCODE_CANADA = "mms-inbound-longcode-canada" + MMS_INBOUND_LONGCODE_UNITEDSTATES = "mms-inbound-longcode-unitedstates" + MMS_OUTBOUND_LONGCODE_CANADA = "mms-outbound-longcode-canada" + MMS_OUTBOUND_LONGCODE_UNITEDSTATES = "mms-outbound-longcode-unitedstates" + MMS_OUTBOUND_TOLL_FREE = "mms-outbound-toll-free" + NOTIFY_CHATAPPSANDOTHERCHANNELS = "notify-chatappsandotherchannels" + NOTIFY_NOTIFYSERVICES = "notify-notifyservices" + NOTIFY_PUSHNOTIFICATIONS = "notify-pushnotifications" + PAYMENT_GATEWAY_CONNECTORS = "payment-gateway-connectors" + PAYMENT_SOLUTIONS = "payment-solutions" + PCHAT_BUCKET_ADJUSTMENT = "pchat-bucket-adjustment" + PHONENUMBERS_NUMBERS = "phonenumbers-numbers" + PROG_VOICE_CLIENT_ANDROID = "prog-voice-client-android" + PROG_VOICE_CLIENT_ANDROID_INBOUND = "prog-voice-client-android-inbound" + PROG_VOICE_CLIENT_ANDROID_OUTBOUND = "prog-voice-client-android-outbound" + PROG_VOICE_CLIENT_IOS = "prog-voice-client-ios" + PROG_VOICE_CLIENT_IOS_INBOUND = "prog-voice-client-ios-inbound" + PROG_VOICE_CLIENT_IOS_OUTBOUND = "prog-voice-client-ios-outbound" + PROG_VOICE_CLIENT_SDK = "prog-voice-client-sdk" + PROG_VOICE_CLIENT_WEB = "prog-voice-client-web" + PROG_VOICE_CLIENT_WEB_INBOUND = "prog-voice-client-web-inbound" + PROG_VOICE_CLIENT_WEB_OUTBOUND = "prog-voice-client-web-outbound" + PROGRAMMABLEVOICECONNECTIVITY_MEDIA_STREAMS = ( + "programmablevoiceconnectivity-media-streams" + ) + PSTNCONNECTIVITY_BYOC = "pstnconnectivity-byoc" + PSTNCONNECTIVITY_EMERGENCY = "pstnconnectivity-emergency" + PSTNCONNECTIVITY_MINUTES = "pstnconnectivity-minutes" + PSTNCONNECTIVITY_MINUTES_1 = "pstnconnectivity-minutes-1" + PSTNCONNECTIVITY_MINUTESINBOUNDLOCAL = "pstnconnectivity-minutesinboundlocal" + PSTNCONNECTIVITY_MINUTESINBOUNDMOBILE = "pstnconnectivity-minutesinboundmobile" + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREE = ( + "pstnconnectivity-minutesinboundtollfree" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREELOCAL = ( + "pstnconnectivity-minutesinboundtollfreelocal" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREEMOBILE = ( + "pstnconnectivity-minutesinboundtollfreemobile" + ) + PV_ROOM_HOURS = "pv-room-hours" + PV_ROOM_SIMULTANEOUS_PARTICIPANT_CONNECTIONS = ( + "pv-room-simultaneous-participant-connections" + ) + PVIDEO_ROOM_HOURS_AU1 = "pvideo-room-hours-au1" + PVIDEO_ROOM_HOURS_BR1 = "pvideo-room-hours-br1" + PVIDEO_ROOM_HOURS_IE1 = "pvideo-room-hours-ie1" + PVIDEO_ROOM_HOURS_JP1 = "pvideo-room-hours-jp1" + PVIDEO_ROOM_HOURS_SG1 = "pvideo-room-hours-sg1" + PVIDEO_ROOM_HOURS_US1 = "pvideo-room-hours-us1" + PVIDEO_ROOM_HOURS_US2 = "pvideo-room-hours-us2" + RECORDINGS_ENCRYPTED = "recordings-encrypted" + SHORT_CODE_SETUP_FEES = "short-code-setup-fees" + SHORTCODES_MESSAGES_INBOUND = "shortcodes-messages-inbound" + SHORTCODES_MESSAGES_OUTBOUND = "shortcodes-messages-outbound" + SMS_MESSAGES_REGISTRATIONFEES = "sms-messages-registrationfees" + SMS_MMS_PENALTY_FEES = "sms-mms-penalty-fees" + SMS_MMS_PENALTY_FEES_1 = "sms-mms-penalty-fees-1" + SMS_PUMPING_PROTECTION_NON_USCA = "sms-pumping-protection-non-usca" + SMS_PUMPING_PROTECTION_USCA = "sms-pumping-protection-usca" + STUDIO = "studio" + STUDIO_MONTHLY_FEES = "studio-monthly-fees" + SUPERSIM = "supersim" + TASK_ROUTER = "task-router" + TASK_ROUTER_WORKERS = "task-router-workers" + TEST_QUOTA_BUCKETS = "test-quota-buckets" + TEST_UC_SCRIPT_1 = "test-uc-script-1" + TEST_UC_SCRIPT_DEMO_2 = "test-uc-script-demo-2" + TEXT_TO_SPEECH = "text-to-speech" + TME = "tme" + TTS_BASIC = "tts-basic" + TWILIO_EDITIONS = "twilio-editions" + TWILIO_INTERCONNECT_CALIFORNIA = "twilio-interconnect-california" + TWILIO_INTERCONNECT_CALIFORNIA_MONTHLY = ( + "twilio-interconnect-california-monthly" + ) + TWILIO_INTERCONNECT_CALIFORNIA_SETUP = "twilio-interconnect-california-setup" + TWILIO_INTERCONNECT_FRANKFURT = "twilio-interconnect-frankfurt" + TWILIO_INTERCONNECT_FRANKFURT_MO = "twilio-interconnect-frankfurt-mo" + TWILIO_INTERCONNECT_FRANKFURT_SETUP = "twilio-interconnect-frankfurt-setup" + TWILIO_INTERCONNECT_LONDON = "twilio-interconnect-london" + TWILIO_INTERCONNECT_LONDON_MO = "twilio-interconnect-london-mo" + TWILIO_INTERCONNECT_LONDON_SETUP = "twilio-interconnect-london-setup" + TWILIO_INTERCONNECT_SAO_PAULO = "twilio-interconnect-sao-paulo" + TWILIO_INTERCONNECT_SAO_PAULO_MONTHLY = "twilio-interconnect-sao-paulo-monthly" + TWILIO_INTERCONNECT_SAO_PAULO_SETUP = "twilio-interconnect-sao-paulo-setup" + TWILIO_INTERCONNECT_SINGAPORE = "twilio-interconnect-singapore" + TWILIO_INTERCONNECT_SINGAPORE_MO = "twilio-interconnect-singapore-mo" + TWILIO_INTERCONNECT_SINGAPORE_SETUP = "twilio-interconnect-singapore-setup" + TWILIO_INTERCONNECT_SYDNEY = "twilio-interconnect-sydney" + TWILIO_INTERCONNECT_SYDNEY_MO = "twilio-interconnect-sydney-mo" + TWILIO_INTERCONNECT_SYDNEY_SETUP = "twilio-interconnect-sydney-setup" + TWILIO_INTERCONNECT_TOKYO = "twilio-interconnect-tokyo" + TWILIO_INTERCONNECT_TOKYO_MO = "twilio-interconnect-tokyo-mo" + TWILIO_INTERCONNECT_TOKYO_SETUP = "twilio-interconnect-tokyo-setup" + TWILIO_INTERCONNECT_VA = "twilio-interconnect-va" + TWILIO_INTERCONNECT_VA_MO = "twilio-interconnect-va-mo" + TWILIO_INTERCONNECT_VA_SETUP = "twilio-interconnect-va-setup" + TWIML_VERBS = "twiml-verbs" + TWIML_VERBS_SAY = "twiml-verbs-say" + USAGE_PROGRAMMABLE_MESSAGING_ENGAGEMENT_SUITE = ( + "usage-programmable-messaging-engagement-suite" + ) + USAGE_PROGRAMMABLE_MESSAGING_FEES_SERVICES = ( + "usage-programmable-messaging-fees-services" + ) + VERIFY_OUTBOUND_EMAIL = "verify-outbound-email" + VERIFY_PACKAGED_PLANS = "verify-packaged-plans" + VERIFY_SILENT_NETWORK_AUTH = "verify-silent-network-auth" + VERIFY_VOICE_AND_SMS = "verify-voice-and-sms" + VOICE_INSIGHTS_CLIENT_INSIGHTS_MONTHY_COMMIT = ( + "voice-insights-client-insights-monthy-commit" + ) + WIRELESS_DATA_PAYG_ASIA_AFG = "wireless-data-payg-asia-afg" + WIRELESS_MULTI_IMSI_SIM_COMMANDS = "wireless-multi-imsi-sim-commands" + WIRELESS_MULTI_IMSI_SIM_COMMANDS_USA = "wireless-multi-imsi-sim-commands-usa" + WIRELESS_MULTI_IMSI_SIM_DATA = "wireless-multi-imsi-sim-data" + WIRELESS_MULTI_IMSI_SIM_DATA_EU28 = "wireless-multi-imsi-sim-data-eu28" + WIRELESS_MULTI_IMSI_SIM_DATA_USA = "wireless-multi-imsi-sim-data-usa" + WIRELESS_MULTI_IMSI_SIM_MONTHLY_FEES = "wireless-multi-imsi-sim-monthly-fees" + WIRELESS_MULTI_IMSI_SIM_USAGE = "wireless-multi-imsi-sim-usage" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA = "wireless-super-sim-data-north-america" + WIRELESS_SUPER_SIM_USAGE = "wireless-super-sim-usage" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that accrued the usage. + :ivar api_version: The API version used to create the resource. + :ivar as_of: Usage records up to date as of this timestamp, formatted as YYYY-MM-DDTHH:MM:SS+00:00. All timestamps are in GMT + :ivar category: + :ivar count: The number of usage events, such as the number of calls. + :ivar count_unit: The units in which `count` is measured, such as `calls` for calls or `messages` for SMS. + :ivar description: A plain-language description of the usage category. + :ivar end_date: The last date for which usage is included in the UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar price: The total price of the usage in the currency specified in `price_unit` and associated with the account. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format, such as `usd`, `eur`, and `jpy`. + :ivar start_date: The first date for which usage is included in this UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar subresource_uris: A list of related resources identified by their URIs. For more information, see [List Subresources](https://www.twilio.com/docs/usage/api/usage-record#list-subresources). + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar usage: The amount used to bill usage and measured in units described in `usage_unit`. + :ivar usage_unit: The units in which `usage` is measured, such as `minutes` for calls or `messages` for SMS. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.as_of: Optional[str] = payload.get("as_of") + self.category: Optional["ThisMonthInstance.Category"] = payload.get("category") + self.count: Optional[str] = payload.get("count") + self.count_unit: Optional[str] = payload.get("count_unit") + self.description: Optional[str] = payload.get("description") + self.end_date: Optional[date] = deserialize.iso8601_date( + payload.get("end_date") + ) + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.start_date: Optional[date] = deserialize.iso8601_date( + payload.get("start_date") + ) + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.uri: Optional[str] = payload.get("uri") + self.usage: Optional[str] = payload.get("usage") + self.usage_unit: Optional[str] = payload.get("usage_unit") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ThisMonthPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ThisMonthInstance: + """ + Build an instance of ThisMonthInstance + + :param payload: Payload response from the API + """ + return ThisMonthInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ThisMonthList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the ThisMonthList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageRecord resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Records/ThisMonth.json".format( + **self._solution + ) + + def stream( + self, + category: Union["ThisMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ThisMonthInstance]: + """ + Streams ThisMonthInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "ThisMonthInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + category: Union["ThisMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ThisMonthInstance]: + """ + Asynchronously streams ThisMonthInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "ThisMonthInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + category: Union["ThisMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ThisMonthInstance]: + """ + Lists ThisMonthInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "ThisMonthInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + category: Union["ThisMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ThisMonthInstance]: + """ + Asynchronously lists ThisMonthInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "ThisMonthInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + category: Union["ThisMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ThisMonthPage: + """ + Retrieve a single page of ThisMonthInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ThisMonthInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ThisMonthPage(self._version, response, self._solution) + + async def page_async( + self, + category: Union["ThisMonthInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ThisMonthPage: + """ + Asynchronously retrieve a single page of ThisMonthInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ThisMonthInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ThisMonthPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ThisMonthPage: + """ + Retrieve a specific page of ThisMonthInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ThisMonthInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ThisMonthPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ThisMonthPage: + """ + Asynchronously retrieve a specific page of ThisMonthInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ThisMonthInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ThisMonthPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/today.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/today.py new file mode 100644 index 00000000..393238e7 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/today.py @@ -0,0 +1,1211 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class TodayInstance(InstanceResource): + + class Category(object): + A2P_10DLC_REGISTRATIONFEES_BRANDREGISTRATION = ( + "a2p-10dlc-registrationfees-brandregistration" + ) + A2P_10DLC_REGISTRATIONFEES_BV = "a2p-10dlc-registrationfees-bv" + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNCHARGES = ( + "a2p-10dlc-registrationfees-campaigncharges" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNREGISTRATION = ( + "a2p-10dlc-registrationfees-campaignregistration" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNVETTING = ( + "a2p-10dlc-registrationfees-campaignvetting" + ) + A2P_10DLC_REGISTRATIONFEES_MONTHLY = "a2p-10dlc-registrationfees-monthly" + A2P_10DLC_REGISTRATIONFEES_ONETIME = "a2p-10dlc-registrationfees-onetime" + A2P_REGISTRATION_FEES = "a2p-registration-fees" + ACCOUNT_SECURITY = "account-security" + AGENT_CONFERENCE = "agent-conference" + AGENT_COPILOT = "agent-copilot" + AGENT_COPILOT_MESSAGES = "agent-copilot-messages" + AGENT_COPILOT_PARTICIPANT_MINUTES = "agent-copilot-participant-minutes" + AI_ASSISTANTS = "ai-assistants" + AI_ASSISTANTS_VOICE = "ai-assistants-voice" + AMAZON_POLLY = "amazon-polly" + ANSWERING_MACHINE_DETECTION = "answering-machine-detection" + ASSETS = "assets" + AUDIENCE_MINUTES = "audience-minutes" + AUDIENCE_MINUTES_AUDIO = "audience-minutes-audio" + AUTHY_AUTHENTICATIONS = "authy-authentications" + AUTHY_CALLS_OUTBOUND = "authy-calls-outbound" + AUTHY_EMAIL_AUTHENTICATIONS = "authy-email-authentications" + AUTHY_MONTHLY_FEES = "authy-monthly-fees" + AUTHY_OUTBOUND_EMAIL = "authy-outbound-email" + AUTHY_PHONE_INTELLIGENCE = "authy-phone-intelligence" + AUTHY_PHONE_VERIFICATIONS = "authy-phone-verifications" + AUTHY_SMS_OUTBOUND = "authy-sms-outbound" + AUTHY_VERIFY_EMAIL_VERIFICATIONS = "authy-verify-email-verifications" + AUTHY_VERIFY_OUTBOUND_EMAIL = "authy-verify-outbound-email" + AUTOPILOT = "autopilot" + AUTOPILOT_HOME_ASSISTANTS = "autopilot-home-assistants" + AUTOPILOT_MESSAGING = "autopilot-messaging" + AUTOPILOT_OTHER = "autopilot-other" + AUTOPILOT_VOICE = "autopilot-voice" + BASIC_PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "basic-peer-to-peer-rooms-participant-minutes" + ) + BRANDED_CALLING = "branded-calling" + BUNDLE_SMS_BUCKET = "bundle-sms-bucket" + BUNDLE_SUBSCRIPTION_FEES = "bundle-subscription-fees" + CALL_FORWARDING_LOOKUPS = "call-forwarding-lookups" + CALL_PROGESS_EVENTS = "call-progess-events" + CALLERIDLOOKUPS = "calleridlookups" + CALLS = "calls" + CALLS_CLIENT = "calls-client" + CALLS_EMERGENCY = "calls-emergency" + CALLS_GLOBALCONFERENCE = "calls-globalconference" + CALLS_INBOUND = "calls-inbound" + CALLS_INBOUND_LOCAL = "calls-inbound-local" + CALLS_INBOUND_MOBILE = "calls-inbound-mobile" + CALLS_INBOUND_TOLLFREE = "calls-inbound-tollfree" + CALLS_INBOUND_TOLLFREE_LOCAL = "calls-inbound-tollfree-local" + CALLS_INBOUND_TOLLFREE_MOBILE = "calls-inbound-tollfree-mobile" + CALLS_MEDIA_STREAM_MINUTES = "calls-media-stream-minutes" + CALLS_OUTBOUND = "calls-outbound" + CALLS_PAY_VERB_TRANSACTIONS = "calls-pay-verb-transactions" + CALLS_RECORDINGS = "calls-recordings" + CALLS_SIP = "calls-sip" + CALLS_SIP_INBOUND = "calls-sip-inbound" + CALLS_SIP_OUTBOUND = "calls-sip-outbound" + CALLS_TEXT_TO_SPEECH = "calls-text-to-speech" + CALLS_TRANSFERS = "calls-transfers" + CARRIER_LOOKUPS = "carrier-lookups" + CATEGORY = "category" + CHANNELS = "channels" + CHANNELS_MESSAGING = "channels-messaging" + CHANNELS_MESSAGING_INBOUND = "channels-messaging-inbound" + CHANNELS_MESSAGING_OUTBOUND = "channels-messaging-outbound" + CHANNELS_WHATSAPP = "channels-whatsapp" + CHANNELS_WHATSAPP_CONVERSATION_AUTHENTICATION = ( + "channels-whatsapp-conversation-authentication" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE = "channels-whatsapp-conversation-free" + CHANNELS_WHATSAPP_CONVERSATION_MARKETING = ( + "channels-whatsapp-conversation-marketing" + ) + CHANNELS_WHATSAPP_CONVERSATION_SERVICE = ( + "channels-whatsapp-conversation-service" + ) + CHANNELS_WHATSAPP_CONVERSATION_UTILITY = ( + "channels-whatsapp-conversation-utility" + ) + CHANNELS_WHATSAPP_INBOUND = "channels-whatsapp-inbound" + CHANNELS_WHATSAPP_OUTBOUND = "channels-whatsapp-outbound" + CHAT_VIRTUAL_AGENT = "chat-virtual-agent" + CONVERSATION_RELAY = "conversation-relay" + CONVERSATIONS = "conversations" + CONVERSATIONS_API_REQUESTS = "conversations-api-requests" + CONVERSATIONS_CONVERSATION_EVENTS = "conversations-conversation-events" + CONVERSATIONS_ENDPOINT_CONNECTIVITY = "conversations-endpoint-connectivity" + CONVERSATIONS_EVENTS = "conversations-events" + CONVERSATIONS_PARTICIPANT_EVENTS = "conversations-participant-events" + CONVERSATIONS_PARTICIPANTS = "conversations-participants" + CPS = "cps" + CREDIT_TRANSFER = "credit-transfer" + EMAIL = "email" + EMERGING_TECH = "emerging-tech" + ENGAGEMENT_SUITE_PACKAGED_PLANS = "engagement-suite-packaged-plans" + ENHANCED_LINE_TYPE_LOOKUPS = "enhanced-line-type-lookups" + ENTERPRISE = "enterprise" + EVENTS = "events" + EXPERIMENT_FRANCE_SMS = "experiment-france-sms" + EXPERIMENT_INDIA_SMS = "experiment-india-sms" + EXPERIMENT_UK_SMS = "experiment-uk-sms" + FAILED_MESSAGE_PROCESSING_FEE = "failed-message-processing-fee" + FLEX = "flex" + FLEX_ACTIVE_USER_HOURS = "flex-active-user-hours" + FLEX_CONCURRENT_USERS = "flex-concurrent-users" + FLEX_CONVERSATIONAL_INSIGHTS = "flex-conversational-insights" + FLEX_CONVERSATIONAL_INSIGHTS_MESSAGES = "flex-conversational-insights-messages" + FLEX_CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = ( + "flex-conversational-insights-voice-minutes" + ) + FLEX_EMAIL_USAGE = "flex-email-usage" + FLEX_MESSAGING_USAGE = "flex-messaging-usage" + FLEX_PARTNER_SPINSCI = "flex-partner-spinsci" + FLEX_PARTNER_XCELERATE = "flex-partner-xcelerate" + FLEX_RESELLER_ECOSYSTEM = "flex-reseller-ecosystem" + FLEX_UNIQUE_USER = "flex-unique-user" + FLEX_USAGE = "flex-usage" + FLEX_USERS = "flex-users" + FLEX_VOICE_MINUTE = "flex-voice-minute" + FLEX_YTICA = "flex-ytica" + FRAUD_LOOKUPS = "fraud-lookups" + FRONTLINE = "frontline" + FRONTLINE_USERS = "frontline-users" + FUNCTIONS = "functions" + GENERIC_PAY_TRANSACTIONS = "generic-pay-transactions" + GROUP_ROOMS = "group-rooms" + GROUP_ROOMS_DATA_TRACK = "group-rooms-data-track" + GROUP_ROOMS_ENCRYPTED_MEDIA_RECORDED = "group-rooms-encrypted-media-recorded" + GROUP_ROOMS_MEDIA_DOWNLOADED = "group-rooms-media-downloaded" + GROUP_ROOMS_MEDIA_RECORDED = "group-rooms-media-recorded" + GROUP_ROOMS_MEDIA_ROUTED = "group-rooms-media-routed" + GROUP_ROOMS_MEDIA_STORED = "group-rooms-media-stored" + GROUP_ROOMS_PARTICIPANT_MINUTES = "group-rooms-participant-minutes" + GROUP_ROOMS_RECORDED_MINUTES = "group-rooms-recorded-minutes" + IP_MESSAGING = "ip-messaging" + IP_MESSAGING_COMMANDS = "ip-messaging-commands" + IP_MESSAGING_DATA_STORAGE = "ip-messaging-data-storage" + IP_MESSAGING_DATA_TRANSFER = "ip-messaging-data-transfer" + IP_MESSAGING_ENDPOINT_CONNECTIVITY = "ip-messaging-endpoint-connectivity" + IVR_VIRTUAL_AGENT_CUSTOM_VOICES = "ivr-virtual-agent-custom-voices" + IVR_VIRTUAL_AGENT_GENAI = "ivr-virtual-agent-genai" + LINE_STATUS_LOOKUPS = "line-status-lookups" + LIVE_ACTIVITY_LOOKUPS = "live-activity-lookups" + LOOKUP_BUCKET_ADJUSTMENT = "lookup-bucket-adjustment" + LOOKUP_IDENTITY_MATCH = "lookup-identity-match" + LOOKUPS = "lookups" + MARKETPLACE = "marketplace" + MARKETPLACE_ALGORITHMIA_NAMED_ENTITY_RECOGNITION = ( + "marketplace-algorithmia-named-entity-recognition" + ) + MARKETPLACE_CADENCE_TRANSCRIPTION = "marketplace-cadence-transcription" + MARKETPLACE_CADENCE_TRANSLATION = "marketplace-cadence-translation" + MARKETPLACE_CAPIO_SPEECH_TO_TEXT = "marketplace-capio-speech-to-text" + MARKETPLACE_CONVRIZA_ABABA = "marketplace-convriza-ababa" + MARKETPLACE_DEEPGRAM_PHRASE_DETECTOR = "marketplace-deepgram-phrase-detector" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION = "marketplace-deepgram-transcription" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION_BASE = ( + "marketplace-deepgram-transcription-base" + ) + MARKETPLACE_DEEPGRAM_TRANSSCRIPTION_ENHANCED = ( + "marketplace-deepgram-transscription-enhanced" + ) + MARKETPLACE_DIGITAL_SEGMENT_BUSINESS_INFO = ( + "marketplace-digital-segment-business-info" + ) + MARKETPLACE_FACEBOOK_OFFLINE_CONVERSIONS = ( + "marketplace-facebook-offline-conversions" + ) + MARKETPLACE_GOOGLE_SPEECH_TO_TEXT = "marketplace-google-speech-to-text" + MARKETPLACE_IBM_WATSON_MESSAGE_INSIGHTS = ( + "marketplace-ibm-watson-message-insights" + ) + MARKETPLACE_IBM_WATSON_MESSAGE_SENTIMENT = ( + "marketplace-ibm-watson-message-sentiment" + ) + MARKETPLACE_IBM_WATSON_RECORDING_ANALYSIS = ( + "marketplace-ibm-watson-recording-analysis" + ) + MARKETPLACE_IBM_WATSON_TONE_ANALYZER = "marketplace-ibm-watson-tone-analyzer" + MARKETPLACE_ICEHOOK_SYSTEMS_SCOUT = "marketplace-icehook-systems-scout" + MARKETPLACE_INFOGROUP_DATAAXLE_BIZINFO = ( + "marketplace-infogroup-dataaxle-bizinfo" + ) + MARKETPLACE_KEEN_IO_CONTACT_CENTER_ANALYTICS = ( + "marketplace-keen-io-contact-center-analytics" + ) + MARKETPLACE_MARCHEX_CLEANCALL = "marketplace-marchex-cleancall" + MARKETPLACE_MARCHEX_RECORDING_ANALYSIS = ( + "marketplace-marchex-recording-analysis" + ) + MARKETPLACE_MARCHEX_SENTIMENT_ANALYSIS_FOR_SMS = ( + "marketplace-marchex-sentiment-analysis-for-sms" + ) + MARKETPLACE_MARKETPLACE_NEXTCALLER_SOCIAL_ID = ( + "marketplace-marketplace-nextcaller-social-id" + ) + MARKETPLACE_MOBILE_COMMONS_OPT_OUT_CLASSIFIER = ( + "marketplace-mobile-commons-opt-out-classifier" + ) + MARKETPLACE_NEXIWAVE_VOICEMAIL_TO_TEXT = ( + "marketplace-nexiwave-voicemail-to-text" + ) + MARKETPLACE_NEXTCALLER_ADVANCED_CALLER_IDENTIFICATION = ( + "marketplace-nextcaller-advanced-caller-identification" + ) + MARKETPLACE_NOMOROBO_SPAM_SCORE = "marketplace-nomorobo-spam-score" + MARKETPLACE_PAY_ADDONS = "marketplace-pay-addons" + MARKETPLACE_PAY_ADDONS_BASECOMMERCE_PAY_CONNECTOR = ( + "marketplace-pay-addons-basecommerce-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_BRAINTREE_PAY_CONNECTOR = ( + "marketplace-pay-addons-braintree-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CARDCONNECT_PAY_CONNECTOR = ( + "marketplace-pay-addons-cardconnect-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CHASE_PAY_CONNECTOR = ( + "marketplace-pay-addons-chase-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplace-pay-addons-shuttle-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplace-pay-addons-stripe-pay-connector" + ) + MARKETPLACE_PAYFONE_TCPA_COMPLIANCE = "marketplace-payfone-tcpa-compliance" + MARKETPLACE_POLY_AI_CONNECTOR = "marketplace-poly-ai-connector" + MARKETPLACE_REALPHONEVALIDATION = "marketplace-realphonevalidation" + MARKETPLACE_REMEETING_AUTOMATIC_SPEECH_RECOGNITION = ( + "marketplace-remeeting-automatic-speech-recognition" + ) + MARKETPLACE_SPOKE_PHONE_LICENSE_PRO = "marketplace-spoke-phone-license-pro" + MARKETPLACE_SPOKE_PHONE_LICENSE_STANDARD = ( + "marketplace-spoke-phone-license-standard" + ) + MARKETPLACE_TCPA_DEFENSE_SOLUTIONS_BLACKLIST_FEED = ( + "marketplace-tcpa-defense-solutions-blacklist-feed" + ) + MARKETPLACE_TELO_OPENCNAM = "marketplace-telo-opencnam" + MARKETPLACE_TRESTLE_SOLUTIONS_CALLER_IDENTIFICATION = ( + "marketplace-trestle-solutions-caller-identification" + ) + MARKETPLACE_TRUECNAM_TRUE_SPAM = "marketplace-truecnam-true-spam" + MARKETPLACE_TWILIO_CALLER_NAME_LOOKUP_US = ( + "marketplace-twilio-caller-name-lookup-us" + ) + MARKETPLACE_TWILIO_CARRIER_INFORMATION_LOOKUP = ( + "marketplace-twilio-carrier-information-lookup" + ) + MARKETPLACE_VOICEBASE_PCI = "marketplace-voicebase-pci" + MARKETPLACE_VOICEBASE_TRANSCRIPTION = "marketplace-voicebase-transcription" + MARKETPLACE_VOICEBASE_TRANSCRIPTION_CUSTOM_VOCABULARY = ( + "marketplace-voicebase-transcription-custom-vocabulary" + ) + MARKETPLACE_WEB_PURIFY_PROFANITY_FILTER = ( + "marketplace-web-purify-profanity-filter" + ) + MARKETPLACE_WHITEPAGES_PRO_CALLER_IDENTIFICATION = ( + "marketplace-whitepages-pro-caller-identification" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_INTELLIGENCE = ( + "marketplace-whitepages-pro-phone-intelligence" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_REPUTATION = ( + "marketplace-whitepages-pro-phone-reputation" + ) + MARKETPLACE_WOLFARM_SPOKEN_RESULTS = "marketplace-wolfarm-spoken-results" + MARKETPLACE_WOLFRAM_SHORT_ANSWER = "marketplace-wolfram-short-answer" + MARKETPLACE_YTICA_CONTACT_CENTER_REPORTING_ANALYTICS = ( + "marketplace-ytica-contact-center-reporting-analytics" + ) + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplay-pay-addons-shuttle-pay-connector" + ) + MEDIA_COMPOSER_MINUTES = "media-composer-minutes" + MEDIASTORAGE = "mediastorage" + MIN_SPEND_ADJUSTMENTS = "min-spend-adjustments" + MMS = "mms" + MMS_INBOUND = "mms-inbound" + MMS_INBOUND_LONGCODE = "mms-inbound-longcode" + MMS_INBOUND_SHORTCODE = "mms-inbound-shortcode" + MMS_INBOUND_TOLL_FREE = "mms-inbound-toll-free" + MMS_MESSAGES_CARRIERFEES = "mms-messages-carrierfees" + MMS_OUTBOUND = "mms-outbound" + MMS_OUTBOUND_LONGCODE = "mms-outbound-longcode" + MMS_OUTBOUND_SHORTCODE = "mms-outbound-shortcode" + MMS_OUTBOUND_TOLLFREE = "mms-outbound-tollfree" + MONITOR = "monitor" + MONITOR_READS = "monitor-reads" + MONITOR_STORAGE = "monitor-storage" + MONITOR_WRITES = "monitor-writes" + NOTIFY = "notify" + NOTIFY_ACTIONS_ATTEMPTS = "notify-actions-attempts" + NOTIFY_CHANNELS = "notify-channels" + NUMBER_FORMAT_LOOKUPS = "number-format-lookups" + PCHAT = "pchat" + PCHAT_ACTIONS = "pchat-actions" + PCHAT_APS = "pchat-aps" + PCHAT_CONV_MED_STORAGE = "pchat-conv-med-storage" + PCHAT_MESSAGES = "pchat-messages" + PCHAT_NOTIFICATIONS = "pchat-notifications" + PCHAT_READS = "pchat-reads" + PCHAT_USERS = "pchat-users" + PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "peer-to-peer-rooms-participant-minutes" + ) + PFAX = "pfax" + PFAX_MINUTES = "pfax-minutes" + PFAX_MINUTES_INBOUND = "pfax-minutes-inbound" + PFAX_MINUTES_OUTBOUND = "pfax-minutes-outbound" + PFAX_PAGES = "pfax-pages" + PHONE_QUALITY_SCORE_LOOKUPS = "phone-quality-score-lookups" + PHONENUMBERS = "phonenumbers" + PHONENUMBERS_CPS = "phonenumbers-cps" + PHONENUMBERS_EMERGENCY = "phonenumbers-emergency" + PHONENUMBERS_LOCAL = "phonenumbers-local" + PHONENUMBERS_MOBILE = "phonenumbers-mobile" + PHONENUMBERS_PORTING = "phonenumbers-porting" + PHONENUMBERS_SETUPS = "phonenumbers-setups" + PHONENUMBERS_TOLLFREE = "phonenumbers-tollfree" + PREMIUMSUPPORT = "premiumsupport" + PREMIUMSUPPORT_PERCENTAGE_SPEND = "premiumsupport-percentage-spend" + PROGRAMMABLEVOICE_PLATFORM = "programmablevoice-platform" + PROGRAMMABLEVOICECONN_CLIENTSDK = "programmablevoiceconn-clientsdk" + PROGRAMMABLEVOICECONN_CLIENTSDK_INBOUND = ( + "programmablevoiceconn-clientsdk-inbound" + ) + PROGRAMMABLEVOICECONN_CLIENTSDK_OUTBOUND = ( + "programmablevoiceconn-clientsdk-outbound" + ) + PROGRAMMABLEVOICECONN_ONNET = "programmablevoiceconn-onnet" + PROGRAMMABLEVOICECONN_ONNET_INBOUND = "programmablevoiceconn-onnet-inbound" + PROGRAMMABLEVOICECONN_ONNET_OUTBOUND = "programmablevoiceconn-onnet-outbound" + PROGRAMMABLEVOICECONN_SIP = "programmablevoiceconn-sip" + PROGRAMMABLEVOICECONN_SIP_INBOUND = "programmablevoiceconn-sip-inbound" + PROGRAMMABLEVOICECONN_SIP_OUTBOUND = "programmablevoiceconn-sip-outbound" + PROGRAMMABLEVOICECONNECTIVITY = "programmablevoiceconnectivity" + PROXY = "proxy" + PROXY_ACTIVE_SESSIONS = "proxy-active-sessions" + PROXY_BUCKET_ADJUSTMENT = "proxy-bucket-adjustment" + PROXY_LICENSES = "proxy-licenses" + PSTNCONNECTIVITY = "pstnconnectivity" + PSTNCONNECTIVITY_INBOUND = "pstnconnectivity-inbound" + PSTNCONNECTIVITY_OUTBOUND = "pstnconnectivity-outbound" + PV = "pv" + PV_BASIC_ROOMS = "pv-basic-rooms" + PV_COMPOSITION_MEDIA_DOWNLOADED = "pv-composition-media-downloaded" + PV_COMPOSITION_MEDIA_ENCRYPTED = "pv-composition-media-encrypted" + PV_COMPOSITION_MEDIA_STORED = "pv-composition-media-stored" + PV_COMPOSITION_MINUTES = "pv-composition-minutes" + PV_RECORDING_COMPOSITIONS = "pv-recording-compositions" + PV_ROOM_PARTICIPANTS = "pv-room-participants" + PV_ROOM_PARTICIPANTS_AU1 = "pv-room-participants-au1" + PV_ROOM_PARTICIPANTS_BR1 = "pv-room-participants-br1" + PV_ROOM_PARTICIPANTS_IE1 = "pv-room-participants-ie1" + PV_ROOM_PARTICIPANTS_JP1 = "pv-room-participants-jp1" + PV_ROOM_PARTICIPANTS_SG1 = "pv-room-participants-sg1" + PV_ROOM_PARTICIPANTS_US1 = "pv-room-participants-us1" + PV_ROOM_PARTICIPANTS_US2 = "pv-room-participants-us2" + PV_ROOMS = "pv-rooms" + PV_SIP_ENDPOINT_REGISTRATIONS = "pv-sip-endpoint-registrations" + RCS_MESSAGES = "rcs-messages" + REASSIGNED_NUMBER = "reassigned-number" + RECORDINGS = "recordings" + RECORDINGSTORAGE = "recordingstorage" + SHORTCODES = "shortcodes" + SHORTCODES_CUSTOMEROWNED = "shortcodes-customerowned" + SHORTCODES_MMS_ENABLEMENT = "shortcodes-mms-enablement" + SHORTCODES_MPS = "shortcodes-mps" + SHORTCODES_RANDOM = "shortcodes-random" + SHORTCODES_SETUP_FEES = "shortcodes-setup-fees" + SHORTCODES_UK = "shortcodes-uk" + SHORTCODES_VANITY = "shortcodes-vanity" + SIM_SWAP_LOOKUPS = "sim-swap-lookups" + SIP_SECURE_MEDIA = "sip-secure-media" + SMALL_GROUP_ROOMS = "small-group-rooms" + SMALL_GROUP_ROOMS_DATA_TRACK = "small-group-rooms-data-track" + SMALL_GROUP_ROOMS_PARTICIPANT_MINUTES = "small-group-rooms-participant-minutes" + SMS = "sms" + SMS_INBOUND = "sms-inbound" + SMS_INBOUND_LONGCODE = "sms-inbound-longcode" + SMS_INBOUND_SHORTCODE = "sms-inbound-shortcode" + SMS_INBOUND_TOLLFREE = "sms-inbound-tollfree" + SMS_MESSAGES_CARRIERFEES = "sms-messages-carrierfees" + SMS_MESSAGES_FEATURES = "sms-messages-features" + SMS_MESSAGES_FEATURES_ENGAGEMENT_SUITE = ( + "sms-messages-features-engagement-suite" + ) + SMS_MESSAGES_FEATURES_MESSAGE_REDACTION = ( + "sms-messages-features-message-redaction" + ) + SMS_MESSAGES_FEATURES_SENDERID = "sms-messages-features-senderid" + SMS_MPS = "sms-mps" + SMS_MPS_SHORTCODE = "sms-mps-shortcode" + SMS_MPS_TOLLFREE = "sms-mps-tollfree" + SMS_MPS_TOLLFREE_SETUP = "sms-mps-tollfree-setup" + SMS_NATIONAL_REGULATORY_PROTECTION = "sms-national-regulatory-protection" + SMS_OUTBOUND = "sms-outbound" + SMS_OUTBOUND_CONTENT_INSPECTION = "sms-outbound-content-inspection" + SMS_OUTBOUND_LONGCODE = "sms-outbound-longcode" + SMS_OUTBOUND_SHORTCODE = "sms-outbound-shortcode" + SMS_OUTBOUND_TOLLFREE = "sms-outbound-tollfree" + SMS_PUMPING_PROTECTION = "sms-pumping-protection" + SMS_PUMPING_RISK = "sms-pumping-risk" + SMSMESSAGES_BUCKET_ADJUSTMENTS = "smsmessages-bucket-adjustments" + SMSMESSAGES_OUTBOUND_DOMESTIC = "smsmessages-outbound-domestic" + SPEECH_RECOGNITION = "speech-recognition" + STUDIO_ENGAGEMENTS = "studio-engagements" + SYNC = "sync" + SYNC_ACTIONS = "sync-actions" + SYNC_ENDPOINT_HOURS = "sync-endpoint-hours" + SYNC_ENDPOINT_HOURS_ABOVE_DAILY_CAP = "sync-endpoint-hours-above-daily-cap" + TASKROUTER_TASKS = "taskrouter-tasks" + TOTALPRICE = "totalprice" + TRANSCRIPTIONS = "transcriptions" + TRUNKING_CPS = "trunking-cps" + TRUNKING_EMERGENCY_CALLS = "trunking-emergency-calls" + TRUNKING_ORIGINATION = "trunking-origination" + TRUNKING_ORIGINATION_LOCAL = "trunking-origination-local" + TRUNKING_ORIGINATION_MOBILE = "trunking-origination-mobile" + TRUNKING_ORIGINATION_TOLLFREE = "trunking-origination-tollfree" + TRUNKING_RECORDINGS = "trunking-recordings" + TRUNKING_SECURE = "trunking-secure" + TRUNKING_TERMINATION = "trunking-termination" + TTS_GOOGLE = "tts-google" + TURNMEGABYTES = "turnmegabytes" + TURNMEGABYTES_AUSTRALIA = "turnmegabytes-australia" + TURNMEGABYTES_BRASIL = "turnmegabytes-brasil" + TURNMEGABYTES_GERMANY = "turnmegabytes-germany" + TURNMEGABYTES_INDIA = "turnmegabytes-india" + TURNMEGABYTES_IRELAND = "turnmegabytes-ireland" + TURNMEGABYTES_JAPAN = "turnmegabytes-japan" + TURNMEGABYTES_SINGAPORE = "turnmegabytes-singapore" + TURNMEGABYTES_USEAST = "turnmegabytes-useast" + TURNMEGABYTES_USWEST = "turnmegabytes-uswest" + TWILIO_FOR_SALESFORCE = "twilio-for-salesforce" + TWILIO_FOR_SALESFORCE_LICENSES = "twilio-for-salesforce-licenses" + TWILIO_INTERCONNECT = "twilio-interconnect" + TWIML = "twiml" + USAGE_FLEX_VIDEO = "usage-flex-video" + USAGE_FUNCTIONS = "usage-functions" + USAGE_RCS_BASIC_MESSAGES_OUTBOUND = "usage-rcs-basic-messages-outbound" + USAGE_RCS_MESSAGES = "usage-rcs-messages" + USAGE_RCS_MESSAGES_INBOUND = "usage-rcs-messages-inbound" + USAGE_RCS_MESSAGING_CARRIER_FEES = "usage-rcs-messaging-carrier-fees" + USAGE_RCS_SINGLE_MESSAGES_OUTBOUND = "usage-rcs-single-messages-outbound" + VERIFY_PACKAGE_PLANS = "verify-package-plans" + VERIFY_PUSH = "verify-push" + VERIFY_SNA = "verify-sna" + VERIFY_TOTP = "verify-totp" + VERIFY_VOICE_SMS = "verify-voice-sms" + VERIFY_WHATSAPP_CONVERSATIONS_BUSINESS_INITIATED = ( + "verify-whatsapp-conversations-business-initiated" + ) + VIDEO_RECORDINGS = "video-recordings" + VIDEO_ROOMS_TURN_MEGABYTES = "video-rooms-turn-megabytes" + VIRTUAL_AGENT = "virtual-agent" + VOICE_INSIGHTS = "voice-insights" + VOICE_INSIGHTS_CLIENT_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-client-insights-on-demand-minute" + ) + VOICE_INSIGHTS_PTSN_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-ptsn-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_INTERFACE_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-interface-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_TRUNKING_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-trunking-insights-on-demand-minute" + ) + VOICE_INTELLIGENCE = "voice-intelligence" + VOICE_INTELLIGENCE_EIP_OPERATORS = "voice-intelligence-eip-operators" + VOICE_INTELLIGENCE_OPERATORS = "voice-intelligence-operators" + VOICE_INTELLIGENCE_TRANSCRIPTION = "voice-intelligence-transcription" + WDS = "wds" + WIRELESS = "wireless" + WIRELESS_DATA = "wireless-data" + WIRELESS_DATA_PAYG = "wireless-data-payg" + WIRELESS_DATA_PAYG_AFRICA = "wireless-data-payg-africa" + WIRELESS_DATA_PAYG_ASIA = "wireless-data-payg-asia" + WIRELESS_DATA_PAYG_CENTRALANDSOUTHAMERICA = ( + "wireless-data-payg-centralandsouthamerica" + ) + WIRELESS_DATA_PAYG_EUROPE = "wireless-data-payg-europe" + WIRELESS_DATA_PAYG_NORTHAMERICA = "wireless-data-payg-northamerica" + WIRELESS_DATA_PAYG_OCEANIA = "wireless-data-payg-oceania" + WIRELESS_DATA_QUOTA1 = "wireless-data-quota1" + WIRELESS_DATA_QUOTA1_AFRICA = "wireless-data-quota1-africa" + WIRELESS_DATA_QUOTA1_ASIA = "wireless-data-quota1-asia" + WIRELESS_DATA_QUOTA1_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota1-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA1_EUROPE = "wireless-data-quota1-europe" + WIRELESS_DATA_QUOTA1_NORTHAMERICA = "wireless-data-quota1-northamerica" + WIRELESS_DATA_QUOTA1_OCEANIA = "wireless-data-quota1-oceania" + WIRELESS_DATA_QUOTA10 = "wireless-data-quota10" + WIRELESS_DATA_QUOTA10_AFRICA = "wireless-data-quota10-africa" + WIRELESS_DATA_QUOTA10_ASIA = "wireless-data-quota10-asia" + WIRELESS_DATA_QUOTA10_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota10-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA10_EUROPE = "wireless-data-quota10-europe" + WIRELESS_DATA_QUOTA10_NORTHAMERICA = "wireless-data-quota10-northamerica" + WIRELESS_DATA_QUOTA10_OCEANIA = "wireless-data-quota10-oceania" + WIRELESS_DATA_QUOTA50 = "wireless-data-quota50" + WIRELESS_DATA_QUOTA50_AFRICA = "wireless-data-quota50-africa" + WIRELESS_DATA_QUOTA50_ASIA = "wireless-data-quota50-asia" + WIRELESS_DATA_QUOTA50_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota50-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA50_EUROPE = "wireless-data-quota50-europe" + WIRELESS_DATA_QUOTA50_NORTHAMERICA = "wireless-data-quota50-northamerica" + WIRELESS_DATA_QUOTA50_OCEANIA = "wireless-data-quota50-oceania" + WIRELESS_DATA_QUOTACUSTOM = "wireless-data-quotacustom" + WIRELESS_DATA_QUOTACUSTOM_AFRICA = "wireless-data-quotacustom-africa" + WIRELESS_DATA_QUOTACUSTOM_ASIA = "wireless-data-quotacustom-asia" + WIRELESS_DATA_QUOTACUSTOM_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quotacustom-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_EUROPE = "wireless-data-quotacustom-europe" + WIRELESS_DATA_QUOTACUSTOM_NORTHAMERICA = ( + "wireless-data-quotacustom-northamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_OCEANIA = "wireless-data-quotacustom-oceania" + WIRELESS_MRC_PAYG = "wireless-mrc-payg" + WIRELESS_MRC_QUOTA1 = "wireless-mrc-quota1" + WIRELESS_MRC_QUOTA10 = "wireless-mrc-quota10" + WIRELESS_MRC_QUOTA50 = "wireless-mrc-quota50" + WIRELESS_MRC_QUOTACUSTOM = "wireless-mrc-quotacustom" + WIRELESS_ORDERS = "wireless-orders" + WIRELESS_ORDERS_ARTWORK = "wireless-orders-artwork" + WIRELESS_ORDERS_BULK = "wireless-orders-bulk" + WIRELESS_ORDERS_ESIM = "wireless-orders-esim" + WIRELESS_ORDERS_STARTER = "wireless-orders-starter" + WIRELESS_QUOTAS = "wireless-quotas" + WIRELESS_SMS_AFRICA = "wireless-sms-africa" + WIRELESS_SMS_ASIA = "wireless-sms-asia" + WIRELESS_SMS_CENTRALANDSOUTHAMERICA = "wireless-sms-centralandsouthamerica" + WIRELESS_SMS_EUROPE = "wireless-sms-europe" + WIRELESS_SMS_NORTHAMERICA = "wireless-sms-northamerica" + WIRELESS_SMS_OCEANIA = "wireless-sms-oceania" + WIRELESS_SUPER_SIM = "wireless-super-sim" + WIRELESS_SUPER_SIM_DATA = "wireless-super-sim-data" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA_USA = ( + "wireless-super-sim-data-north-america-usa" + ) + WIRELESS_SUPER_SIM_DATA_PAYG = "wireless-super-sim-data-payg" + WIRELESS_SUPER_SIM_DATA_PAYG_EUROPE = "wireless-super-sim-data-payg-europe" + WIRELESS_SUPER_SIM_DATA_PAYG_NORTH_AMERICA = ( + "wireless-super-sim-data-payg-north-america" + ) + WIRELESS_SUPER_SIM_HARDWARE = "wireless-super-sim-hardware" + WIRELESS_SUPER_SIM_HARDWARE_BULK = "wireless-super-sim-hardware-bulk" + WIRELESS_SUPER_SIM_SMSCOMMANDS = "wireless-super-sim-smscommands" + WIRELESS_SUPER_SIM_SMSCOMMANDS_AFRICA = "wireless-super-sim-smscommands-africa" + WIRELESS_SUPER_SIM_SMSCOMMANDS_ASIA = "wireless-super-sim-smscommands-asia" + WIRELESS_SUPER_SIM_SMSCOMMANDS_CENT_AND_SOUTH_AMERICA = ( + "wireless-super-sim-smscommands-cent-and-south-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_EUROPE = "wireless-super-sim-smscommands-europe" + WIRELESS_SUPER_SIM_SMSCOMMANDS_NORTH_AMERICA = ( + "wireless-super-sim-smscommands-north-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_OCEANIA = ( + "wireless-super-sim-smscommands-oceania" + ) + WIRELESS_SUPER_SIM_SUBSCRIPTION = "wireless-super-sim-subscription" + WIRELESS_SUPER_SIM_SUBSCRIPTION_PAYG = "wireless-super-sim-subscription-payg" + WIRELESS_USAGE = "wireless-usage" + WIRELESS_USAGE_COMMANDS = "wireless-usage-commands" + WIRELESS_USAGE_COMMANDS_AFRICA = "wireless-usage-commands-africa" + WIRELESS_USAGE_COMMANDS_ASIA = "wireless-usage-commands-asia" + WIRELESS_USAGE_COMMANDS_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-commands-centralandsouthamerica" + ) + WIRELESS_USAGE_COMMANDS_EUROPE = "wireless-usage-commands-europe" + WIRELESS_USAGE_COMMANDS_HOME = "wireless-usage-commands-home" + WIRELESS_USAGE_COMMANDS_NORTHAMERICA = "wireless-usage-commands-northamerica" + WIRELESS_USAGE_COMMANDS_OCEANIA = "wireless-usage-commands-oceania" + WIRELESS_USAGE_COMMANDS_ROAMING = "wireless-usage-commands-roaming" + WIRELESS_USAGE_DATA = "wireless-usage-data" + WIRELESS_USAGE_DATA_AFRICA = "wireless-usage-data-africa" + WIRELESS_USAGE_DATA_ASIA = "wireless-usage-data-asia" + WIRELESS_USAGE_DATA_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-data-centralandsouthamerica" + ) + WIRELESS_USAGE_DATA_CUSTOM_ADDITIONALMB = ( + "wireless-usage-data-custom-additionalmb" + ) + WIRELESS_USAGE_DATA_CUSTOM_FIRST5MB = "wireless-usage-data-custom-first5mb" + WIRELESS_USAGE_DATA_DOMESTIC_ROAMING = "wireless-usage-data-domestic-roaming" + WIRELESS_USAGE_DATA_EUROPE = "wireless-usage-data-europe" + WIRELESS_USAGE_DATA_INDIVIDUAL_ADDITIONALGB = ( + "wireless-usage-data-individual-additionalgb" + ) + WIRELESS_USAGE_DATA_INDIVIDUAL_FIRSTGB = ( + "wireless-usage-data-individual-firstgb" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_CANADA = ( + "wireless-usage-data-international-roaming-canada" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_INDIA = ( + "wireless-usage-data-international-roaming-india" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_MEXICO = ( + "wireless-usage-data-international-roaming-mexico" + ) + WIRELESS_USAGE_DATA_NORTHAMERICA = "wireless-usage-data-northamerica" + WIRELESS_USAGE_DATA_OCEANIA = "wireless-usage-data-oceania" + WIRELESS_USAGE_DATA_POOLED = "wireless-usage-data-pooled" + WIRELESS_USAGE_DATA_POOLED_DOWNLINK = "wireless-usage-data-pooled-downlink" + WIRELESS_USAGE_DATA_POOLED_UPLINK = "wireless-usage-data-pooled-uplink" + WIRELESS_USAGE_MRC = "wireless-usage-mrc" + WIRELESS_USAGE_MRC_CUSTOM = "wireless-usage-mrc-custom" + WIRELESS_USAGE_MRC_INDIVIDUAL = "wireless-usage-mrc-individual" + WIRELESS_USAGE_MRC_POOLED = "wireless-usage-mrc-pooled" + WIRELESS_USAGE_MRC_SUSPENDED = "wireless-usage-mrc-suspended" + WIRELESS_USAGE_SMS = "wireless-usage-sms" + WIRELESS_USAGE_VOICE = "wireless-usage-voice" + A2P_FAST_TRACK_ONBOARDING = "a2p-fast-track-onboarding" + ADVISORY_SERVICES = "advisory-services" + ADVISORY_SERVICES_BILLED = "advisory-services-billed" + ADVISORY_SERVICES_CALL_TRACKING = "advisory-services-call-tracking" + ADVISORY_SERVICES_DATA_SERVICES = "advisory-services-data-services" + ADVISORY_SERVICES_EXPENSES = "advisory-services-expenses" + ADVISORY_SERVICES_SIP_TRUNKING = "advisory-services-sip-trunking" + ASSETS_REQUESTS = "assets-requests" + AUDIENCE_MINUTES_VIDEO = "audience-minutes-video" + AUTHY_BUCKET_ADJUSTMENT = "authy-bucket-adjustment" + AUTHY_SOFTWARE = "authy-software" + CALLERIDLOOKUPS_API = "calleridlookups-api" + CALLERIDLOOKUPS_PROGRAMMABLEVOICE = "calleridlookups-programmablevoice" + CALLERIDLOOKUPS_TRUNKING = "calleridlookups-trunking" + CALLS_TRUNKING_INBOUND_TOLLFREE_LOCAL = "calls-trunking-inbound-tollfree-local" + CALLS_TRUNKING_INBOUND_TOLLFREE_MOBILE = ( + "calls-trunking-inbound-tollfree-mobile" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE_1 = "channels-whatsapp-conversation-free-1" + CONFERENCE = "conference" + CONVERSATIONAL_INSIGHTS = "conversational-insights" + CONVERSATIONAL_INSIGHTS_MESSAGES = "conversational-insights-messages" + CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = "conversational-insights-voice-minutes" + DEMO = "demo" + DEMO_UC_SCRIPT_TEST = "demo-uc-script-test" + ELASTIC_SIP_TRUNKING = "elastic-sip-trunking" + ELASTIC_SIP_TRUNKING_CALL_TRANSFERS = "elastic-sip-trunking-call-transfers" + ENTERPRISE_HIPPA = "enterprise-hippa" + FLEX_NAMED_USERS = "flex-named-users" + FLEX_SPINSCI = "flex-spinsci" + FLEX_USERS_1 = "flex-users-1" + FLEX_WFO_PREMIUM_SPEECH_ANALYTICS = "flex-wfo-premium-speech-analytics" + FLEX_XCELERATE = "flex-xcelerate" + FUNCTIONS_ROLLUP = "functions-rollup" + IMP_V1_USAGE = "imp-v1-usage" + IP_MESSAGING_ADDONS = "ip-messaging-addons" + IVR = "ivr" + IVR_CONVERSATIONAL = "ivr-conversational" + IVR_DTMF = "ivr-dtmf" + IVR_VIRTUALAGENT = "ivr-virtualagent" + LIVE = "live" + LIVE_MEDIA_RECORDING_MINUTES = "live-media-recording-minutes" + LONGCODE_MPS = "longcode-mps" + MARKETPLACE_ANALYTICS_ADDONS = "marketplace-analytics-addons" + MARKETPLACE_ISV_ADDONS = "marketplace-isv-addons" + MARKETPLACE_MESSAGING_ADDONS = "marketplace-messaging-addons" + MARKETPLACE_PHONENUMBERS_ADDONS = "marketplace-phonenumbers-addons" + MARKETPLACE_RECORDING_ADDONS = "marketplace-recording-addons" + MARKETPLACE_VIRTUALAGENT_ADDONS = "marketplace-virtualagent-addons" + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR_1 = ( + "marketplay-pay-addons-shuttle-pay-connector-1" + ) + MARKETPLAY_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplay-pay-addons-stripe-pay-connector" + ) + MMS_INBOUND_LONGCODE_CANADA = "mms-inbound-longcode-canada" + MMS_INBOUND_LONGCODE_UNITEDSTATES = "mms-inbound-longcode-unitedstates" + MMS_OUTBOUND_LONGCODE_CANADA = "mms-outbound-longcode-canada" + MMS_OUTBOUND_LONGCODE_UNITEDSTATES = "mms-outbound-longcode-unitedstates" + MMS_OUTBOUND_TOLL_FREE = "mms-outbound-toll-free" + NOTIFY_CHATAPPSANDOTHERCHANNELS = "notify-chatappsandotherchannels" + NOTIFY_NOTIFYSERVICES = "notify-notifyservices" + NOTIFY_PUSHNOTIFICATIONS = "notify-pushnotifications" + PAYMENT_GATEWAY_CONNECTORS = "payment-gateway-connectors" + PAYMENT_SOLUTIONS = "payment-solutions" + PCHAT_BUCKET_ADJUSTMENT = "pchat-bucket-adjustment" + PHONENUMBERS_NUMBERS = "phonenumbers-numbers" + PROG_VOICE_CLIENT_ANDROID = "prog-voice-client-android" + PROG_VOICE_CLIENT_ANDROID_INBOUND = "prog-voice-client-android-inbound" + PROG_VOICE_CLIENT_ANDROID_OUTBOUND = "prog-voice-client-android-outbound" + PROG_VOICE_CLIENT_IOS = "prog-voice-client-ios" + PROG_VOICE_CLIENT_IOS_INBOUND = "prog-voice-client-ios-inbound" + PROG_VOICE_CLIENT_IOS_OUTBOUND = "prog-voice-client-ios-outbound" + PROG_VOICE_CLIENT_SDK = "prog-voice-client-sdk" + PROG_VOICE_CLIENT_WEB = "prog-voice-client-web" + PROG_VOICE_CLIENT_WEB_INBOUND = "prog-voice-client-web-inbound" + PROG_VOICE_CLIENT_WEB_OUTBOUND = "prog-voice-client-web-outbound" + PROGRAMMABLEVOICECONNECTIVITY_MEDIA_STREAMS = ( + "programmablevoiceconnectivity-media-streams" + ) + PSTNCONNECTIVITY_BYOC = "pstnconnectivity-byoc" + PSTNCONNECTIVITY_EMERGENCY = "pstnconnectivity-emergency" + PSTNCONNECTIVITY_MINUTES = "pstnconnectivity-minutes" + PSTNCONNECTIVITY_MINUTES_1 = "pstnconnectivity-minutes-1" + PSTNCONNECTIVITY_MINUTESINBOUNDLOCAL = "pstnconnectivity-minutesinboundlocal" + PSTNCONNECTIVITY_MINUTESINBOUNDMOBILE = "pstnconnectivity-minutesinboundmobile" + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREE = ( + "pstnconnectivity-minutesinboundtollfree" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREELOCAL = ( + "pstnconnectivity-minutesinboundtollfreelocal" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREEMOBILE = ( + "pstnconnectivity-minutesinboundtollfreemobile" + ) + PV_ROOM_HOURS = "pv-room-hours" + PV_ROOM_SIMULTANEOUS_PARTICIPANT_CONNECTIONS = ( + "pv-room-simultaneous-participant-connections" + ) + PVIDEO_ROOM_HOURS_AU1 = "pvideo-room-hours-au1" + PVIDEO_ROOM_HOURS_BR1 = "pvideo-room-hours-br1" + PVIDEO_ROOM_HOURS_IE1 = "pvideo-room-hours-ie1" + PVIDEO_ROOM_HOURS_JP1 = "pvideo-room-hours-jp1" + PVIDEO_ROOM_HOURS_SG1 = "pvideo-room-hours-sg1" + PVIDEO_ROOM_HOURS_US1 = "pvideo-room-hours-us1" + PVIDEO_ROOM_HOURS_US2 = "pvideo-room-hours-us2" + RECORDINGS_ENCRYPTED = "recordings-encrypted" + SHORT_CODE_SETUP_FEES = "short-code-setup-fees" + SHORTCODES_MESSAGES_INBOUND = "shortcodes-messages-inbound" + SHORTCODES_MESSAGES_OUTBOUND = "shortcodes-messages-outbound" + SMS_MESSAGES_REGISTRATIONFEES = "sms-messages-registrationfees" + SMS_MMS_PENALTY_FEES = "sms-mms-penalty-fees" + SMS_MMS_PENALTY_FEES_1 = "sms-mms-penalty-fees-1" + SMS_PUMPING_PROTECTION_NON_USCA = "sms-pumping-protection-non-usca" + SMS_PUMPING_PROTECTION_USCA = "sms-pumping-protection-usca" + STUDIO = "studio" + STUDIO_MONTHLY_FEES = "studio-monthly-fees" + SUPERSIM = "supersim" + TASK_ROUTER = "task-router" + TASK_ROUTER_WORKERS = "task-router-workers" + TEST_QUOTA_BUCKETS = "test-quota-buckets" + TEST_UC_SCRIPT_1 = "test-uc-script-1" + TEST_UC_SCRIPT_DEMO_2 = "test-uc-script-demo-2" + TEXT_TO_SPEECH = "text-to-speech" + TME = "tme" + TTS_BASIC = "tts-basic" + TWILIO_EDITIONS = "twilio-editions" + TWILIO_INTERCONNECT_CALIFORNIA = "twilio-interconnect-california" + TWILIO_INTERCONNECT_CALIFORNIA_MONTHLY = ( + "twilio-interconnect-california-monthly" + ) + TWILIO_INTERCONNECT_CALIFORNIA_SETUP = "twilio-interconnect-california-setup" + TWILIO_INTERCONNECT_FRANKFURT = "twilio-interconnect-frankfurt" + TWILIO_INTERCONNECT_FRANKFURT_MO = "twilio-interconnect-frankfurt-mo" + TWILIO_INTERCONNECT_FRANKFURT_SETUP = "twilio-interconnect-frankfurt-setup" + TWILIO_INTERCONNECT_LONDON = "twilio-interconnect-london" + TWILIO_INTERCONNECT_LONDON_MO = "twilio-interconnect-london-mo" + TWILIO_INTERCONNECT_LONDON_SETUP = "twilio-interconnect-london-setup" + TWILIO_INTERCONNECT_SAO_PAULO = "twilio-interconnect-sao-paulo" + TWILIO_INTERCONNECT_SAO_PAULO_MONTHLY = "twilio-interconnect-sao-paulo-monthly" + TWILIO_INTERCONNECT_SAO_PAULO_SETUP = "twilio-interconnect-sao-paulo-setup" + TWILIO_INTERCONNECT_SINGAPORE = "twilio-interconnect-singapore" + TWILIO_INTERCONNECT_SINGAPORE_MO = "twilio-interconnect-singapore-mo" + TWILIO_INTERCONNECT_SINGAPORE_SETUP = "twilio-interconnect-singapore-setup" + TWILIO_INTERCONNECT_SYDNEY = "twilio-interconnect-sydney" + TWILIO_INTERCONNECT_SYDNEY_MO = "twilio-interconnect-sydney-mo" + TWILIO_INTERCONNECT_SYDNEY_SETUP = "twilio-interconnect-sydney-setup" + TWILIO_INTERCONNECT_TOKYO = "twilio-interconnect-tokyo" + TWILIO_INTERCONNECT_TOKYO_MO = "twilio-interconnect-tokyo-mo" + TWILIO_INTERCONNECT_TOKYO_SETUP = "twilio-interconnect-tokyo-setup" + TWILIO_INTERCONNECT_VA = "twilio-interconnect-va" + TWILIO_INTERCONNECT_VA_MO = "twilio-interconnect-va-mo" + TWILIO_INTERCONNECT_VA_SETUP = "twilio-interconnect-va-setup" + TWIML_VERBS = "twiml-verbs" + TWIML_VERBS_SAY = "twiml-verbs-say" + USAGE_PROGRAMMABLE_MESSAGING_ENGAGEMENT_SUITE = ( + "usage-programmable-messaging-engagement-suite" + ) + USAGE_PROGRAMMABLE_MESSAGING_FEES_SERVICES = ( + "usage-programmable-messaging-fees-services" + ) + VERIFY_OUTBOUND_EMAIL = "verify-outbound-email" + VERIFY_PACKAGED_PLANS = "verify-packaged-plans" + VERIFY_SILENT_NETWORK_AUTH = "verify-silent-network-auth" + VERIFY_VOICE_AND_SMS = "verify-voice-and-sms" + VOICE_INSIGHTS_CLIENT_INSIGHTS_MONTHY_COMMIT = ( + "voice-insights-client-insights-monthy-commit" + ) + WIRELESS_DATA_PAYG_ASIA_AFG = "wireless-data-payg-asia-afg" + WIRELESS_MULTI_IMSI_SIM_COMMANDS = "wireless-multi-imsi-sim-commands" + WIRELESS_MULTI_IMSI_SIM_COMMANDS_USA = "wireless-multi-imsi-sim-commands-usa" + WIRELESS_MULTI_IMSI_SIM_DATA = "wireless-multi-imsi-sim-data" + WIRELESS_MULTI_IMSI_SIM_DATA_EU28 = "wireless-multi-imsi-sim-data-eu28" + WIRELESS_MULTI_IMSI_SIM_DATA_USA = "wireless-multi-imsi-sim-data-usa" + WIRELESS_MULTI_IMSI_SIM_MONTHLY_FEES = "wireless-multi-imsi-sim-monthly-fees" + WIRELESS_MULTI_IMSI_SIM_USAGE = "wireless-multi-imsi-sim-usage" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA = "wireless-super-sim-data-north-america" + WIRELESS_SUPER_SIM_USAGE = "wireless-super-sim-usage" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that accrued the usage. + :ivar api_version: The API version used to create the resource. + :ivar as_of: Usage records up to date as of this timestamp, formatted as YYYY-MM-DDTHH:MM:SS+00:00. All timestamps are in GMT + :ivar category: + :ivar count: The number of usage events, such as the number of calls. + :ivar count_unit: The units in which `count` is measured, such as `calls` for calls or `messages` for SMS. + :ivar description: A plain-language description of the usage category. + :ivar end_date: The last date for which usage is included in the UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar price: The total price of the usage in the currency specified in `price_unit` and associated with the account. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format, such as `usd`, `eur`, and `jpy`. + :ivar start_date: The first date for which usage is included in this UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar subresource_uris: A list of related resources identified by their URIs. For more information, see [List Subresources](https://www.twilio.com/docs/usage/api/usage-record#list-subresources). + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar usage: The amount used to bill usage and measured in units described in `usage_unit`. + :ivar usage_unit: The units in which `usage` is measured, such as `minutes` for calls or `messages` for SMS. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.as_of: Optional[str] = payload.get("as_of") + self.category: Optional["TodayInstance.Category"] = payload.get("category") + self.count: Optional[str] = payload.get("count") + self.count_unit: Optional[str] = payload.get("count_unit") + self.description: Optional[str] = payload.get("description") + self.end_date: Optional[date] = deserialize.iso8601_date( + payload.get("end_date") + ) + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.start_date: Optional[date] = deserialize.iso8601_date( + payload.get("start_date") + ) + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.uri: Optional[str] = payload.get("uri") + self.usage: Optional[str] = payload.get("usage") + self.usage_unit: Optional[str] = payload.get("usage_unit") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TodayPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> TodayInstance: + """ + Build an instance of TodayInstance + + :param payload: Payload response from the API + """ + return TodayInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class TodayList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the TodayList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageRecord resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Records/Today.json".format( + **self._solution + ) + + def stream( + self, + category: Union["TodayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[TodayInstance]: + """ + Streams TodayInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "TodayInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + category: Union["TodayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[TodayInstance]: + """ + Asynchronously streams TodayInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "TodayInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + category: Union["TodayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TodayInstance]: + """ + Lists TodayInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "TodayInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + category: Union["TodayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TodayInstance]: + """ + Asynchronously lists TodayInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "TodayInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + category: Union["TodayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TodayPage: + """ + Retrieve a single page of TodayInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TodayInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TodayPage(self._version, response, self._solution) + + async def page_async( + self, + category: Union["TodayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TodayPage: + """ + Asynchronously retrieve a single page of TodayInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TodayInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TodayPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> TodayPage: + """ + Retrieve a specific page of TodayInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TodayInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return TodayPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> TodayPage: + """ + Asynchronously retrieve a specific page of TodayInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TodayInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return TodayPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/yearly.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/yearly.py new file mode 100644 index 00000000..ad9e5a36 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/yearly.py @@ -0,0 +1,1211 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class YearlyInstance(InstanceResource): + + class Category(object): + A2P_10DLC_REGISTRATIONFEES_BRANDREGISTRATION = ( + "a2p-10dlc-registrationfees-brandregistration" + ) + A2P_10DLC_REGISTRATIONFEES_BV = "a2p-10dlc-registrationfees-bv" + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNCHARGES = ( + "a2p-10dlc-registrationfees-campaigncharges" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNREGISTRATION = ( + "a2p-10dlc-registrationfees-campaignregistration" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNVETTING = ( + "a2p-10dlc-registrationfees-campaignvetting" + ) + A2P_10DLC_REGISTRATIONFEES_MONTHLY = "a2p-10dlc-registrationfees-monthly" + A2P_10DLC_REGISTRATIONFEES_ONETIME = "a2p-10dlc-registrationfees-onetime" + A2P_REGISTRATION_FEES = "a2p-registration-fees" + ACCOUNT_SECURITY = "account-security" + AGENT_CONFERENCE = "agent-conference" + AGENT_COPILOT = "agent-copilot" + AGENT_COPILOT_MESSAGES = "agent-copilot-messages" + AGENT_COPILOT_PARTICIPANT_MINUTES = "agent-copilot-participant-minutes" + AI_ASSISTANTS = "ai-assistants" + AI_ASSISTANTS_VOICE = "ai-assistants-voice" + AMAZON_POLLY = "amazon-polly" + ANSWERING_MACHINE_DETECTION = "answering-machine-detection" + ASSETS = "assets" + AUDIENCE_MINUTES = "audience-minutes" + AUDIENCE_MINUTES_AUDIO = "audience-minutes-audio" + AUTHY_AUTHENTICATIONS = "authy-authentications" + AUTHY_CALLS_OUTBOUND = "authy-calls-outbound" + AUTHY_EMAIL_AUTHENTICATIONS = "authy-email-authentications" + AUTHY_MONTHLY_FEES = "authy-monthly-fees" + AUTHY_OUTBOUND_EMAIL = "authy-outbound-email" + AUTHY_PHONE_INTELLIGENCE = "authy-phone-intelligence" + AUTHY_PHONE_VERIFICATIONS = "authy-phone-verifications" + AUTHY_SMS_OUTBOUND = "authy-sms-outbound" + AUTHY_VERIFY_EMAIL_VERIFICATIONS = "authy-verify-email-verifications" + AUTHY_VERIFY_OUTBOUND_EMAIL = "authy-verify-outbound-email" + AUTOPILOT = "autopilot" + AUTOPILOT_HOME_ASSISTANTS = "autopilot-home-assistants" + AUTOPILOT_MESSAGING = "autopilot-messaging" + AUTOPILOT_OTHER = "autopilot-other" + AUTOPILOT_VOICE = "autopilot-voice" + BASIC_PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "basic-peer-to-peer-rooms-participant-minutes" + ) + BRANDED_CALLING = "branded-calling" + BUNDLE_SMS_BUCKET = "bundle-sms-bucket" + BUNDLE_SUBSCRIPTION_FEES = "bundle-subscription-fees" + CALL_FORWARDING_LOOKUPS = "call-forwarding-lookups" + CALL_PROGESS_EVENTS = "call-progess-events" + CALLERIDLOOKUPS = "calleridlookups" + CALLS = "calls" + CALLS_CLIENT = "calls-client" + CALLS_EMERGENCY = "calls-emergency" + CALLS_GLOBALCONFERENCE = "calls-globalconference" + CALLS_INBOUND = "calls-inbound" + CALLS_INBOUND_LOCAL = "calls-inbound-local" + CALLS_INBOUND_MOBILE = "calls-inbound-mobile" + CALLS_INBOUND_TOLLFREE = "calls-inbound-tollfree" + CALLS_INBOUND_TOLLFREE_LOCAL = "calls-inbound-tollfree-local" + CALLS_INBOUND_TOLLFREE_MOBILE = "calls-inbound-tollfree-mobile" + CALLS_MEDIA_STREAM_MINUTES = "calls-media-stream-minutes" + CALLS_OUTBOUND = "calls-outbound" + CALLS_PAY_VERB_TRANSACTIONS = "calls-pay-verb-transactions" + CALLS_RECORDINGS = "calls-recordings" + CALLS_SIP = "calls-sip" + CALLS_SIP_INBOUND = "calls-sip-inbound" + CALLS_SIP_OUTBOUND = "calls-sip-outbound" + CALLS_TEXT_TO_SPEECH = "calls-text-to-speech" + CALLS_TRANSFERS = "calls-transfers" + CARRIER_LOOKUPS = "carrier-lookups" + CATEGORY = "category" + CHANNELS = "channels" + CHANNELS_MESSAGING = "channels-messaging" + CHANNELS_MESSAGING_INBOUND = "channels-messaging-inbound" + CHANNELS_MESSAGING_OUTBOUND = "channels-messaging-outbound" + CHANNELS_WHATSAPP = "channels-whatsapp" + CHANNELS_WHATSAPP_CONVERSATION_AUTHENTICATION = ( + "channels-whatsapp-conversation-authentication" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE = "channels-whatsapp-conversation-free" + CHANNELS_WHATSAPP_CONVERSATION_MARKETING = ( + "channels-whatsapp-conversation-marketing" + ) + CHANNELS_WHATSAPP_CONVERSATION_SERVICE = ( + "channels-whatsapp-conversation-service" + ) + CHANNELS_WHATSAPP_CONVERSATION_UTILITY = ( + "channels-whatsapp-conversation-utility" + ) + CHANNELS_WHATSAPP_INBOUND = "channels-whatsapp-inbound" + CHANNELS_WHATSAPP_OUTBOUND = "channels-whatsapp-outbound" + CHAT_VIRTUAL_AGENT = "chat-virtual-agent" + CONVERSATION_RELAY = "conversation-relay" + CONVERSATIONS = "conversations" + CONVERSATIONS_API_REQUESTS = "conversations-api-requests" + CONVERSATIONS_CONVERSATION_EVENTS = "conversations-conversation-events" + CONVERSATIONS_ENDPOINT_CONNECTIVITY = "conversations-endpoint-connectivity" + CONVERSATIONS_EVENTS = "conversations-events" + CONVERSATIONS_PARTICIPANT_EVENTS = "conversations-participant-events" + CONVERSATIONS_PARTICIPANTS = "conversations-participants" + CPS = "cps" + CREDIT_TRANSFER = "credit-transfer" + EMAIL = "email" + EMERGING_TECH = "emerging-tech" + ENGAGEMENT_SUITE_PACKAGED_PLANS = "engagement-suite-packaged-plans" + ENHANCED_LINE_TYPE_LOOKUPS = "enhanced-line-type-lookups" + ENTERPRISE = "enterprise" + EVENTS = "events" + EXPERIMENT_FRANCE_SMS = "experiment-france-sms" + EXPERIMENT_INDIA_SMS = "experiment-india-sms" + EXPERIMENT_UK_SMS = "experiment-uk-sms" + FAILED_MESSAGE_PROCESSING_FEE = "failed-message-processing-fee" + FLEX = "flex" + FLEX_ACTIVE_USER_HOURS = "flex-active-user-hours" + FLEX_CONCURRENT_USERS = "flex-concurrent-users" + FLEX_CONVERSATIONAL_INSIGHTS = "flex-conversational-insights" + FLEX_CONVERSATIONAL_INSIGHTS_MESSAGES = "flex-conversational-insights-messages" + FLEX_CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = ( + "flex-conversational-insights-voice-minutes" + ) + FLEX_EMAIL_USAGE = "flex-email-usage" + FLEX_MESSAGING_USAGE = "flex-messaging-usage" + FLEX_PARTNER_SPINSCI = "flex-partner-spinsci" + FLEX_PARTNER_XCELERATE = "flex-partner-xcelerate" + FLEX_RESELLER_ECOSYSTEM = "flex-reseller-ecosystem" + FLEX_UNIQUE_USER = "flex-unique-user" + FLEX_USAGE = "flex-usage" + FLEX_USERS = "flex-users" + FLEX_VOICE_MINUTE = "flex-voice-minute" + FLEX_YTICA = "flex-ytica" + FRAUD_LOOKUPS = "fraud-lookups" + FRONTLINE = "frontline" + FRONTLINE_USERS = "frontline-users" + FUNCTIONS = "functions" + GENERIC_PAY_TRANSACTIONS = "generic-pay-transactions" + GROUP_ROOMS = "group-rooms" + GROUP_ROOMS_DATA_TRACK = "group-rooms-data-track" + GROUP_ROOMS_ENCRYPTED_MEDIA_RECORDED = "group-rooms-encrypted-media-recorded" + GROUP_ROOMS_MEDIA_DOWNLOADED = "group-rooms-media-downloaded" + GROUP_ROOMS_MEDIA_RECORDED = "group-rooms-media-recorded" + GROUP_ROOMS_MEDIA_ROUTED = "group-rooms-media-routed" + GROUP_ROOMS_MEDIA_STORED = "group-rooms-media-stored" + GROUP_ROOMS_PARTICIPANT_MINUTES = "group-rooms-participant-minutes" + GROUP_ROOMS_RECORDED_MINUTES = "group-rooms-recorded-minutes" + IP_MESSAGING = "ip-messaging" + IP_MESSAGING_COMMANDS = "ip-messaging-commands" + IP_MESSAGING_DATA_STORAGE = "ip-messaging-data-storage" + IP_MESSAGING_DATA_TRANSFER = "ip-messaging-data-transfer" + IP_MESSAGING_ENDPOINT_CONNECTIVITY = "ip-messaging-endpoint-connectivity" + IVR_VIRTUAL_AGENT_CUSTOM_VOICES = "ivr-virtual-agent-custom-voices" + IVR_VIRTUAL_AGENT_GENAI = "ivr-virtual-agent-genai" + LINE_STATUS_LOOKUPS = "line-status-lookups" + LIVE_ACTIVITY_LOOKUPS = "live-activity-lookups" + LOOKUP_BUCKET_ADJUSTMENT = "lookup-bucket-adjustment" + LOOKUP_IDENTITY_MATCH = "lookup-identity-match" + LOOKUPS = "lookups" + MARKETPLACE = "marketplace" + MARKETPLACE_ALGORITHMIA_NAMED_ENTITY_RECOGNITION = ( + "marketplace-algorithmia-named-entity-recognition" + ) + MARKETPLACE_CADENCE_TRANSCRIPTION = "marketplace-cadence-transcription" + MARKETPLACE_CADENCE_TRANSLATION = "marketplace-cadence-translation" + MARKETPLACE_CAPIO_SPEECH_TO_TEXT = "marketplace-capio-speech-to-text" + MARKETPLACE_CONVRIZA_ABABA = "marketplace-convriza-ababa" + MARKETPLACE_DEEPGRAM_PHRASE_DETECTOR = "marketplace-deepgram-phrase-detector" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION = "marketplace-deepgram-transcription" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION_BASE = ( + "marketplace-deepgram-transcription-base" + ) + MARKETPLACE_DEEPGRAM_TRANSSCRIPTION_ENHANCED = ( + "marketplace-deepgram-transscription-enhanced" + ) + MARKETPLACE_DIGITAL_SEGMENT_BUSINESS_INFO = ( + "marketplace-digital-segment-business-info" + ) + MARKETPLACE_FACEBOOK_OFFLINE_CONVERSIONS = ( + "marketplace-facebook-offline-conversions" + ) + MARKETPLACE_GOOGLE_SPEECH_TO_TEXT = "marketplace-google-speech-to-text" + MARKETPLACE_IBM_WATSON_MESSAGE_INSIGHTS = ( + "marketplace-ibm-watson-message-insights" + ) + MARKETPLACE_IBM_WATSON_MESSAGE_SENTIMENT = ( + "marketplace-ibm-watson-message-sentiment" + ) + MARKETPLACE_IBM_WATSON_RECORDING_ANALYSIS = ( + "marketplace-ibm-watson-recording-analysis" + ) + MARKETPLACE_IBM_WATSON_TONE_ANALYZER = "marketplace-ibm-watson-tone-analyzer" + MARKETPLACE_ICEHOOK_SYSTEMS_SCOUT = "marketplace-icehook-systems-scout" + MARKETPLACE_INFOGROUP_DATAAXLE_BIZINFO = ( + "marketplace-infogroup-dataaxle-bizinfo" + ) + MARKETPLACE_KEEN_IO_CONTACT_CENTER_ANALYTICS = ( + "marketplace-keen-io-contact-center-analytics" + ) + MARKETPLACE_MARCHEX_CLEANCALL = "marketplace-marchex-cleancall" + MARKETPLACE_MARCHEX_RECORDING_ANALYSIS = ( + "marketplace-marchex-recording-analysis" + ) + MARKETPLACE_MARCHEX_SENTIMENT_ANALYSIS_FOR_SMS = ( + "marketplace-marchex-sentiment-analysis-for-sms" + ) + MARKETPLACE_MARKETPLACE_NEXTCALLER_SOCIAL_ID = ( + "marketplace-marketplace-nextcaller-social-id" + ) + MARKETPLACE_MOBILE_COMMONS_OPT_OUT_CLASSIFIER = ( + "marketplace-mobile-commons-opt-out-classifier" + ) + MARKETPLACE_NEXIWAVE_VOICEMAIL_TO_TEXT = ( + "marketplace-nexiwave-voicemail-to-text" + ) + MARKETPLACE_NEXTCALLER_ADVANCED_CALLER_IDENTIFICATION = ( + "marketplace-nextcaller-advanced-caller-identification" + ) + MARKETPLACE_NOMOROBO_SPAM_SCORE = "marketplace-nomorobo-spam-score" + MARKETPLACE_PAY_ADDONS = "marketplace-pay-addons" + MARKETPLACE_PAY_ADDONS_BASECOMMERCE_PAY_CONNECTOR = ( + "marketplace-pay-addons-basecommerce-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_BRAINTREE_PAY_CONNECTOR = ( + "marketplace-pay-addons-braintree-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CARDCONNECT_PAY_CONNECTOR = ( + "marketplace-pay-addons-cardconnect-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CHASE_PAY_CONNECTOR = ( + "marketplace-pay-addons-chase-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplace-pay-addons-shuttle-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplace-pay-addons-stripe-pay-connector" + ) + MARKETPLACE_PAYFONE_TCPA_COMPLIANCE = "marketplace-payfone-tcpa-compliance" + MARKETPLACE_POLY_AI_CONNECTOR = "marketplace-poly-ai-connector" + MARKETPLACE_REALPHONEVALIDATION = "marketplace-realphonevalidation" + MARKETPLACE_REMEETING_AUTOMATIC_SPEECH_RECOGNITION = ( + "marketplace-remeeting-automatic-speech-recognition" + ) + MARKETPLACE_SPOKE_PHONE_LICENSE_PRO = "marketplace-spoke-phone-license-pro" + MARKETPLACE_SPOKE_PHONE_LICENSE_STANDARD = ( + "marketplace-spoke-phone-license-standard" + ) + MARKETPLACE_TCPA_DEFENSE_SOLUTIONS_BLACKLIST_FEED = ( + "marketplace-tcpa-defense-solutions-blacklist-feed" + ) + MARKETPLACE_TELO_OPENCNAM = "marketplace-telo-opencnam" + MARKETPLACE_TRESTLE_SOLUTIONS_CALLER_IDENTIFICATION = ( + "marketplace-trestle-solutions-caller-identification" + ) + MARKETPLACE_TRUECNAM_TRUE_SPAM = "marketplace-truecnam-true-spam" + MARKETPLACE_TWILIO_CALLER_NAME_LOOKUP_US = ( + "marketplace-twilio-caller-name-lookup-us" + ) + MARKETPLACE_TWILIO_CARRIER_INFORMATION_LOOKUP = ( + "marketplace-twilio-carrier-information-lookup" + ) + MARKETPLACE_VOICEBASE_PCI = "marketplace-voicebase-pci" + MARKETPLACE_VOICEBASE_TRANSCRIPTION = "marketplace-voicebase-transcription" + MARKETPLACE_VOICEBASE_TRANSCRIPTION_CUSTOM_VOCABULARY = ( + "marketplace-voicebase-transcription-custom-vocabulary" + ) + MARKETPLACE_WEB_PURIFY_PROFANITY_FILTER = ( + "marketplace-web-purify-profanity-filter" + ) + MARKETPLACE_WHITEPAGES_PRO_CALLER_IDENTIFICATION = ( + "marketplace-whitepages-pro-caller-identification" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_INTELLIGENCE = ( + "marketplace-whitepages-pro-phone-intelligence" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_REPUTATION = ( + "marketplace-whitepages-pro-phone-reputation" + ) + MARKETPLACE_WOLFARM_SPOKEN_RESULTS = "marketplace-wolfarm-spoken-results" + MARKETPLACE_WOLFRAM_SHORT_ANSWER = "marketplace-wolfram-short-answer" + MARKETPLACE_YTICA_CONTACT_CENTER_REPORTING_ANALYTICS = ( + "marketplace-ytica-contact-center-reporting-analytics" + ) + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplay-pay-addons-shuttle-pay-connector" + ) + MEDIA_COMPOSER_MINUTES = "media-composer-minutes" + MEDIASTORAGE = "mediastorage" + MIN_SPEND_ADJUSTMENTS = "min-spend-adjustments" + MMS = "mms" + MMS_INBOUND = "mms-inbound" + MMS_INBOUND_LONGCODE = "mms-inbound-longcode" + MMS_INBOUND_SHORTCODE = "mms-inbound-shortcode" + MMS_INBOUND_TOLL_FREE = "mms-inbound-toll-free" + MMS_MESSAGES_CARRIERFEES = "mms-messages-carrierfees" + MMS_OUTBOUND = "mms-outbound" + MMS_OUTBOUND_LONGCODE = "mms-outbound-longcode" + MMS_OUTBOUND_SHORTCODE = "mms-outbound-shortcode" + MMS_OUTBOUND_TOLLFREE = "mms-outbound-tollfree" + MONITOR = "monitor" + MONITOR_READS = "monitor-reads" + MONITOR_STORAGE = "monitor-storage" + MONITOR_WRITES = "monitor-writes" + NOTIFY = "notify" + NOTIFY_ACTIONS_ATTEMPTS = "notify-actions-attempts" + NOTIFY_CHANNELS = "notify-channels" + NUMBER_FORMAT_LOOKUPS = "number-format-lookups" + PCHAT = "pchat" + PCHAT_ACTIONS = "pchat-actions" + PCHAT_APS = "pchat-aps" + PCHAT_CONV_MED_STORAGE = "pchat-conv-med-storage" + PCHAT_MESSAGES = "pchat-messages" + PCHAT_NOTIFICATIONS = "pchat-notifications" + PCHAT_READS = "pchat-reads" + PCHAT_USERS = "pchat-users" + PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "peer-to-peer-rooms-participant-minutes" + ) + PFAX = "pfax" + PFAX_MINUTES = "pfax-minutes" + PFAX_MINUTES_INBOUND = "pfax-minutes-inbound" + PFAX_MINUTES_OUTBOUND = "pfax-minutes-outbound" + PFAX_PAGES = "pfax-pages" + PHONE_QUALITY_SCORE_LOOKUPS = "phone-quality-score-lookups" + PHONENUMBERS = "phonenumbers" + PHONENUMBERS_CPS = "phonenumbers-cps" + PHONENUMBERS_EMERGENCY = "phonenumbers-emergency" + PHONENUMBERS_LOCAL = "phonenumbers-local" + PHONENUMBERS_MOBILE = "phonenumbers-mobile" + PHONENUMBERS_PORTING = "phonenumbers-porting" + PHONENUMBERS_SETUPS = "phonenumbers-setups" + PHONENUMBERS_TOLLFREE = "phonenumbers-tollfree" + PREMIUMSUPPORT = "premiumsupport" + PREMIUMSUPPORT_PERCENTAGE_SPEND = "premiumsupport-percentage-spend" + PROGRAMMABLEVOICE_PLATFORM = "programmablevoice-platform" + PROGRAMMABLEVOICECONN_CLIENTSDK = "programmablevoiceconn-clientsdk" + PROGRAMMABLEVOICECONN_CLIENTSDK_INBOUND = ( + "programmablevoiceconn-clientsdk-inbound" + ) + PROGRAMMABLEVOICECONN_CLIENTSDK_OUTBOUND = ( + "programmablevoiceconn-clientsdk-outbound" + ) + PROGRAMMABLEVOICECONN_ONNET = "programmablevoiceconn-onnet" + PROGRAMMABLEVOICECONN_ONNET_INBOUND = "programmablevoiceconn-onnet-inbound" + PROGRAMMABLEVOICECONN_ONNET_OUTBOUND = "programmablevoiceconn-onnet-outbound" + PROGRAMMABLEVOICECONN_SIP = "programmablevoiceconn-sip" + PROGRAMMABLEVOICECONN_SIP_INBOUND = "programmablevoiceconn-sip-inbound" + PROGRAMMABLEVOICECONN_SIP_OUTBOUND = "programmablevoiceconn-sip-outbound" + PROGRAMMABLEVOICECONNECTIVITY = "programmablevoiceconnectivity" + PROXY = "proxy" + PROXY_ACTIVE_SESSIONS = "proxy-active-sessions" + PROXY_BUCKET_ADJUSTMENT = "proxy-bucket-adjustment" + PROXY_LICENSES = "proxy-licenses" + PSTNCONNECTIVITY = "pstnconnectivity" + PSTNCONNECTIVITY_INBOUND = "pstnconnectivity-inbound" + PSTNCONNECTIVITY_OUTBOUND = "pstnconnectivity-outbound" + PV = "pv" + PV_BASIC_ROOMS = "pv-basic-rooms" + PV_COMPOSITION_MEDIA_DOWNLOADED = "pv-composition-media-downloaded" + PV_COMPOSITION_MEDIA_ENCRYPTED = "pv-composition-media-encrypted" + PV_COMPOSITION_MEDIA_STORED = "pv-composition-media-stored" + PV_COMPOSITION_MINUTES = "pv-composition-minutes" + PV_RECORDING_COMPOSITIONS = "pv-recording-compositions" + PV_ROOM_PARTICIPANTS = "pv-room-participants" + PV_ROOM_PARTICIPANTS_AU1 = "pv-room-participants-au1" + PV_ROOM_PARTICIPANTS_BR1 = "pv-room-participants-br1" + PV_ROOM_PARTICIPANTS_IE1 = "pv-room-participants-ie1" + PV_ROOM_PARTICIPANTS_JP1 = "pv-room-participants-jp1" + PV_ROOM_PARTICIPANTS_SG1 = "pv-room-participants-sg1" + PV_ROOM_PARTICIPANTS_US1 = "pv-room-participants-us1" + PV_ROOM_PARTICIPANTS_US2 = "pv-room-participants-us2" + PV_ROOMS = "pv-rooms" + PV_SIP_ENDPOINT_REGISTRATIONS = "pv-sip-endpoint-registrations" + RCS_MESSAGES = "rcs-messages" + REASSIGNED_NUMBER = "reassigned-number" + RECORDINGS = "recordings" + RECORDINGSTORAGE = "recordingstorage" + SHORTCODES = "shortcodes" + SHORTCODES_CUSTOMEROWNED = "shortcodes-customerowned" + SHORTCODES_MMS_ENABLEMENT = "shortcodes-mms-enablement" + SHORTCODES_MPS = "shortcodes-mps" + SHORTCODES_RANDOM = "shortcodes-random" + SHORTCODES_SETUP_FEES = "shortcodes-setup-fees" + SHORTCODES_UK = "shortcodes-uk" + SHORTCODES_VANITY = "shortcodes-vanity" + SIM_SWAP_LOOKUPS = "sim-swap-lookups" + SIP_SECURE_MEDIA = "sip-secure-media" + SMALL_GROUP_ROOMS = "small-group-rooms" + SMALL_GROUP_ROOMS_DATA_TRACK = "small-group-rooms-data-track" + SMALL_GROUP_ROOMS_PARTICIPANT_MINUTES = "small-group-rooms-participant-minutes" + SMS = "sms" + SMS_INBOUND = "sms-inbound" + SMS_INBOUND_LONGCODE = "sms-inbound-longcode" + SMS_INBOUND_SHORTCODE = "sms-inbound-shortcode" + SMS_INBOUND_TOLLFREE = "sms-inbound-tollfree" + SMS_MESSAGES_CARRIERFEES = "sms-messages-carrierfees" + SMS_MESSAGES_FEATURES = "sms-messages-features" + SMS_MESSAGES_FEATURES_ENGAGEMENT_SUITE = ( + "sms-messages-features-engagement-suite" + ) + SMS_MESSAGES_FEATURES_MESSAGE_REDACTION = ( + "sms-messages-features-message-redaction" + ) + SMS_MESSAGES_FEATURES_SENDERID = "sms-messages-features-senderid" + SMS_MPS = "sms-mps" + SMS_MPS_SHORTCODE = "sms-mps-shortcode" + SMS_MPS_TOLLFREE = "sms-mps-tollfree" + SMS_MPS_TOLLFREE_SETUP = "sms-mps-tollfree-setup" + SMS_NATIONAL_REGULATORY_PROTECTION = "sms-national-regulatory-protection" + SMS_OUTBOUND = "sms-outbound" + SMS_OUTBOUND_CONTENT_INSPECTION = "sms-outbound-content-inspection" + SMS_OUTBOUND_LONGCODE = "sms-outbound-longcode" + SMS_OUTBOUND_SHORTCODE = "sms-outbound-shortcode" + SMS_OUTBOUND_TOLLFREE = "sms-outbound-tollfree" + SMS_PUMPING_PROTECTION = "sms-pumping-protection" + SMS_PUMPING_RISK = "sms-pumping-risk" + SMSMESSAGES_BUCKET_ADJUSTMENTS = "smsmessages-bucket-adjustments" + SMSMESSAGES_OUTBOUND_DOMESTIC = "smsmessages-outbound-domestic" + SPEECH_RECOGNITION = "speech-recognition" + STUDIO_ENGAGEMENTS = "studio-engagements" + SYNC = "sync" + SYNC_ACTIONS = "sync-actions" + SYNC_ENDPOINT_HOURS = "sync-endpoint-hours" + SYNC_ENDPOINT_HOURS_ABOVE_DAILY_CAP = "sync-endpoint-hours-above-daily-cap" + TASKROUTER_TASKS = "taskrouter-tasks" + TOTALPRICE = "totalprice" + TRANSCRIPTIONS = "transcriptions" + TRUNKING_CPS = "trunking-cps" + TRUNKING_EMERGENCY_CALLS = "trunking-emergency-calls" + TRUNKING_ORIGINATION = "trunking-origination" + TRUNKING_ORIGINATION_LOCAL = "trunking-origination-local" + TRUNKING_ORIGINATION_MOBILE = "trunking-origination-mobile" + TRUNKING_ORIGINATION_TOLLFREE = "trunking-origination-tollfree" + TRUNKING_RECORDINGS = "trunking-recordings" + TRUNKING_SECURE = "trunking-secure" + TRUNKING_TERMINATION = "trunking-termination" + TTS_GOOGLE = "tts-google" + TURNMEGABYTES = "turnmegabytes" + TURNMEGABYTES_AUSTRALIA = "turnmegabytes-australia" + TURNMEGABYTES_BRASIL = "turnmegabytes-brasil" + TURNMEGABYTES_GERMANY = "turnmegabytes-germany" + TURNMEGABYTES_INDIA = "turnmegabytes-india" + TURNMEGABYTES_IRELAND = "turnmegabytes-ireland" + TURNMEGABYTES_JAPAN = "turnmegabytes-japan" + TURNMEGABYTES_SINGAPORE = "turnmegabytes-singapore" + TURNMEGABYTES_USEAST = "turnmegabytes-useast" + TURNMEGABYTES_USWEST = "turnmegabytes-uswest" + TWILIO_FOR_SALESFORCE = "twilio-for-salesforce" + TWILIO_FOR_SALESFORCE_LICENSES = "twilio-for-salesforce-licenses" + TWILIO_INTERCONNECT = "twilio-interconnect" + TWIML = "twiml" + USAGE_FLEX_VIDEO = "usage-flex-video" + USAGE_FUNCTIONS = "usage-functions" + USAGE_RCS_BASIC_MESSAGES_OUTBOUND = "usage-rcs-basic-messages-outbound" + USAGE_RCS_MESSAGES = "usage-rcs-messages" + USAGE_RCS_MESSAGES_INBOUND = "usage-rcs-messages-inbound" + USAGE_RCS_MESSAGING_CARRIER_FEES = "usage-rcs-messaging-carrier-fees" + USAGE_RCS_SINGLE_MESSAGES_OUTBOUND = "usage-rcs-single-messages-outbound" + VERIFY_PACKAGE_PLANS = "verify-package-plans" + VERIFY_PUSH = "verify-push" + VERIFY_SNA = "verify-sna" + VERIFY_TOTP = "verify-totp" + VERIFY_VOICE_SMS = "verify-voice-sms" + VERIFY_WHATSAPP_CONVERSATIONS_BUSINESS_INITIATED = ( + "verify-whatsapp-conversations-business-initiated" + ) + VIDEO_RECORDINGS = "video-recordings" + VIDEO_ROOMS_TURN_MEGABYTES = "video-rooms-turn-megabytes" + VIRTUAL_AGENT = "virtual-agent" + VOICE_INSIGHTS = "voice-insights" + VOICE_INSIGHTS_CLIENT_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-client-insights-on-demand-minute" + ) + VOICE_INSIGHTS_PTSN_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-ptsn-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_INTERFACE_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-interface-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_TRUNKING_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-trunking-insights-on-demand-minute" + ) + VOICE_INTELLIGENCE = "voice-intelligence" + VOICE_INTELLIGENCE_EIP_OPERATORS = "voice-intelligence-eip-operators" + VOICE_INTELLIGENCE_OPERATORS = "voice-intelligence-operators" + VOICE_INTELLIGENCE_TRANSCRIPTION = "voice-intelligence-transcription" + WDS = "wds" + WIRELESS = "wireless" + WIRELESS_DATA = "wireless-data" + WIRELESS_DATA_PAYG = "wireless-data-payg" + WIRELESS_DATA_PAYG_AFRICA = "wireless-data-payg-africa" + WIRELESS_DATA_PAYG_ASIA = "wireless-data-payg-asia" + WIRELESS_DATA_PAYG_CENTRALANDSOUTHAMERICA = ( + "wireless-data-payg-centralandsouthamerica" + ) + WIRELESS_DATA_PAYG_EUROPE = "wireless-data-payg-europe" + WIRELESS_DATA_PAYG_NORTHAMERICA = "wireless-data-payg-northamerica" + WIRELESS_DATA_PAYG_OCEANIA = "wireless-data-payg-oceania" + WIRELESS_DATA_QUOTA1 = "wireless-data-quota1" + WIRELESS_DATA_QUOTA1_AFRICA = "wireless-data-quota1-africa" + WIRELESS_DATA_QUOTA1_ASIA = "wireless-data-quota1-asia" + WIRELESS_DATA_QUOTA1_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota1-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA1_EUROPE = "wireless-data-quota1-europe" + WIRELESS_DATA_QUOTA1_NORTHAMERICA = "wireless-data-quota1-northamerica" + WIRELESS_DATA_QUOTA1_OCEANIA = "wireless-data-quota1-oceania" + WIRELESS_DATA_QUOTA10 = "wireless-data-quota10" + WIRELESS_DATA_QUOTA10_AFRICA = "wireless-data-quota10-africa" + WIRELESS_DATA_QUOTA10_ASIA = "wireless-data-quota10-asia" + WIRELESS_DATA_QUOTA10_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota10-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA10_EUROPE = "wireless-data-quota10-europe" + WIRELESS_DATA_QUOTA10_NORTHAMERICA = "wireless-data-quota10-northamerica" + WIRELESS_DATA_QUOTA10_OCEANIA = "wireless-data-quota10-oceania" + WIRELESS_DATA_QUOTA50 = "wireless-data-quota50" + WIRELESS_DATA_QUOTA50_AFRICA = "wireless-data-quota50-africa" + WIRELESS_DATA_QUOTA50_ASIA = "wireless-data-quota50-asia" + WIRELESS_DATA_QUOTA50_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota50-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA50_EUROPE = "wireless-data-quota50-europe" + WIRELESS_DATA_QUOTA50_NORTHAMERICA = "wireless-data-quota50-northamerica" + WIRELESS_DATA_QUOTA50_OCEANIA = "wireless-data-quota50-oceania" + WIRELESS_DATA_QUOTACUSTOM = "wireless-data-quotacustom" + WIRELESS_DATA_QUOTACUSTOM_AFRICA = "wireless-data-quotacustom-africa" + WIRELESS_DATA_QUOTACUSTOM_ASIA = "wireless-data-quotacustom-asia" + WIRELESS_DATA_QUOTACUSTOM_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quotacustom-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_EUROPE = "wireless-data-quotacustom-europe" + WIRELESS_DATA_QUOTACUSTOM_NORTHAMERICA = ( + "wireless-data-quotacustom-northamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_OCEANIA = "wireless-data-quotacustom-oceania" + WIRELESS_MRC_PAYG = "wireless-mrc-payg" + WIRELESS_MRC_QUOTA1 = "wireless-mrc-quota1" + WIRELESS_MRC_QUOTA10 = "wireless-mrc-quota10" + WIRELESS_MRC_QUOTA50 = "wireless-mrc-quota50" + WIRELESS_MRC_QUOTACUSTOM = "wireless-mrc-quotacustom" + WIRELESS_ORDERS = "wireless-orders" + WIRELESS_ORDERS_ARTWORK = "wireless-orders-artwork" + WIRELESS_ORDERS_BULK = "wireless-orders-bulk" + WIRELESS_ORDERS_ESIM = "wireless-orders-esim" + WIRELESS_ORDERS_STARTER = "wireless-orders-starter" + WIRELESS_QUOTAS = "wireless-quotas" + WIRELESS_SMS_AFRICA = "wireless-sms-africa" + WIRELESS_SMS_ASIA = "wireless-sms-asia" + WIRELESS_SMS_CENTRALANDSOUTHAMERICA = "wireless-sms-centralandsouthamerica" + WIRELESS_SMS_EUROPE = "wireless-sms-europe" + WIRELESS_SMS_NORTHAMERICA = "wireless-sms-northamerica" + WIRELESS_SMS_OCEANIA = "wireless-sms-oceania" + WIRELESS_SUPER_SIM = "wireless-super-sim" + WIRELESS_SUPER_SIM_DATA = "wireless-super-sim-data" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA_USA = ( + "wireless-super-sim-data-north-america-usa" + ) + WIRELESS_SUPER_SIM_DATA_PAYG = "wireless-super-sim-data-payg" + WIRELESS_SUPER_SIM_DATA_PAYG_EUROPE = "wireless-super-sim-data-payg-europe" + WIRELESS_SUPER_SIM_DATA_PAYG_NORTH_AMERICA = ( + "wireless-super-sim-data-payg-north-america" + ) + WIRELESS_SUPER_SIM_HARDWARE = "wireless-super-sim-hardware" + WIRELESS_SUPER_SIM_HARDWARE_BULK = "wireless-super-sim-hardware-bulk" + WIRELESS_SUPER_SIM_SMSCOMMANDS = "wireless-super-sim-smscommands" + WIRELESS_SUPER_SIM_SMSCOMMANDS_AFRICA = "wireless-super-sim-smscommands-africa" + WIRELESS_SUPER_SIM_SMSCOMMANDS_ASIA = "wireless-super-sim-smscommands-asia" + WIRELESS_SUPER_SIM_SMSCOMMANDS_CENT_AND_SOUTH_AMERICA = ( + "wireless-super-sim-smscommands-cent-and-south-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_EUROPE = "wireless-super-sim-smscommands-europe" + WIRELESS_SUPER_SIM_SMSCOMMANDS_NORTH_AMERICA = ( + "wireless-super-sim-smscommands-north-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_OCEANIA = ( + "wireless-super-sim-smscommands-oceania" + ) + WIRELESS_SUPER_SIM_SUBSCRIPTION = "wireless-super-sim-subscription" + WIRELESS_SUPER_SIM_SUBSCRIPTION_PAYG = "wireless-super-sim-subscription-payg" + WIRELESS_USAGE = "wireless-usage" + WIRELESS_USAGE_COMMANDS = "wireless-usage-commands" + WIRELESS_USAGE_COMMANDS_AFRICA = "wireless-usage-commands-africa" + WIRELESS_USAGE_COMMANDS_ASIA = "wireless-usage-commands-asia" + WIRELESS_USAGE_COMMANDS_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-commands-centralandsouthamerica" + ) + WIRELESS_USAGE_COMMANDS_EUROPE = "wireless-usage-commands-europe" + WIRELESS_USAGE_COMMANDS_HOME = "wireless-usage-commands-home" + WIRELESS_USAGE_COMMANDS_NORTHAMERICA = "wireless-usage-commands-northamerica" + WIRELESS_USAGE_COMMANDS_OCEANIA = "wireless-usage-commands-oceania" + WIRELESS_USAGE_COMMANDS_ROAMING = "wireless-usage-commands-roaming" + WIRELESS_USAGE_DATA = "wireless-usage-data" + WIRELESS_USAGE_DATA_AFRICA = "wireless-usage-data-africa" + WIRELESS_USAGE_DATA_ASIA = "wireless-usage-data-asia" + WIRELESS_USAGE_DATA_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-data-centralandsouthamerica" + ) + WIRELESS_USAGE_DATA_CUSTOM_ADDITIONALMB = ( + "wireless-usage-data-custom-additionalmb" + ) + WIRELESS_USAGE_DATA_CUSTOM_FIRST5MB = "wireless-usage-data-custom-first5mb" + WIRELESS_USAGE_DATA_DOMESTIC_ROAMING = "wireless-usage-data-domestic-roaming" + WIRELESS_USAGE_DATA_EUROPE = "wireless-usage-data-europe" + WIRELESS_USAGE_DATA_INDIVIDUAL_ADDITIONALGB = ( + "wireless-usage-data-individual-additionalgb" + ) + WIRELESS_USAGE_DATA_INDIVIDUAL_FIRSTGB = ( + "wireless-usage-data-individual-firstgb" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_CANADA = ( + "wireless-usage-data-international-roaming-canada" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_INDIA = ( + "wireless-usage-data-international-roaming-india" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_MEXICO = ( + "wireless-usage-data-international-roaming-mexico" + ) + WIRELESS_USAGE_DATA_NORTHAMERICA = "wireless-usage-data-northamerica" + WIRELESS_USAGE_DATA_OCEANIA = "wireless-usage-data-oceania" + WIRELESS_USAGE_DATA_POOLED = "wireless-usage-data-pooled" + WIRELESS_USAGE_DATA_POOLED_DOWNLINK = "wireless-usage-data-pooled-downlink" + WIRELESS_USAGE_DATA_POOLED_UPLINK = "wireless-usage-data-pooled-uplink" + WIRELESS_USAGE_MRC = "wireless-usage-mrc" + WIRELESS_USAGE_MRC_CUSTOM = "wireless-usage-mrc-custom" + WIRELESS_USAGE_MRC_INDIVIDUAL = "wireless-usage-mrc-individual" + WIRELESS_USAGE_MRC_POOLED = "wireless-usage-mrc-pooled" + WIRELESS_USAGE_MRC_SUSPENDED = "wireless-usage-mrc-suspended" + WIRELESS_USAGE_SMS = "wireless-usage-sms" + WIRELESS_USAGE_VOICE = "wireless-usage-voice" + A2P_FAST_TRACK_ONBOARDING = "a2p-fast-track-onboarding" + ADVISORY_SERVICES = "advisory-services" + ADVISORY_SERVICES_BILLED = "advisory-services-billed" + ADVISORY_SERVICES_CALL_TRACKING = "advisory-services-call-tracking" + ADVISORY_SERVICES_DATA_SERVICES = "advisory-services-data-services" + ADVISORY_SERVICES_EXPENSES = "advisory-services-expenses" + ADVISORY_SERVICES_SIP_TRUNKING = "advisory-services-sip-trunking" + ASSETS_REQUESTS = "assets-requests" + AUDIENCE_MINUTES_VIDEO = "audience-minutes-video" + AUTHY_BUCKET_ADJUSTMENT = "authy-bucket-adjustment" + AUTHY_SOFTWARE = "authy-software" + CALLERIDLOOKUPS_API = "calleridlookups-api" + CALLERIDLOOKUPS_PROGRAMMABLEVOICE = "calleridlookups-programmablevoice" + CALLERIDLOOKUPS_TRUNKING = "calleridlookups-trunking" + CALLS_TRUNKING_INBOUND_TOLLFREE_LOCAL = "calls-trunking-inbound-tollfree-local" + CALLS_TRUNKING_INBOUND_TOLLFREE_MOBILE = ( + "calls-trunking-inbound-tollfree-mobile" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE_1 = "channels-whatsapp-conversation-free-1" + CONFERENCE = "conference" + CONVERSATIONAL_INSIGHTS = "conversational-insights" + CONVERSATIONAL_INSIGHTS_MESSAGES = "conversational-insights-messages" + CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = "conversational-insights-voice-minutes" + DEMO = "demo" + DEMO_UC_SCRIPT_TEST = "demo-uc-script-test" + ELASTIC_SIP_TRUNKING = "elastic-sip-trunking" + ELASTIC_SIP_TRUNKING_CALL_TRANSFERS = "elastic-sip-trunking-call-transfers" + ENTERPRISE_HIPPA = "enterprise-hippa" + FLEX_NAMED_USERS = "flex-named-users" + FLEX_SPINSCI = "flex-spinsci" + FLEX_USERS_1 = "flex-users-1" + FLEX_WFO_PREMIUM_SPEECH_ANALYTICS = "flex-wfo-premium-speech-analytics" + FLEX_XCELERATE = "flex-xcelerate" + FUNCTIONS_ROLLUP = "functions-rollup" + IMP_V1_USAGE = "imp-v1-usage" + IP_MESSAGING_ADDONS = "ip-messaging-addons" + IVR = "ivr" + IVR_CONVERSATIONAL = "ivr-conversational" + IVR_DTMF = "ivr-dtmf" + IVR_VIRTUALAGENT = "ivr-virtualagent" + LIVE = "live" + LIVE_MEDIA_RECORDING_MINUTES = "live-media-recording-minutes" + LONGCODE_MPS = "longcode-mps" + MARKETPLACE_ANALYTICS_ADDONS = "marketplace-analytics-addons" + MARKETPLACE_ISV_ADDONS = "marketplace-isv-addons" + MARKETPLACE_MESSAGING_ADDONS = "marketplace-messaging-addons" + MARKETPLACE_PHONENUMBERS_ADDONS = "marketplace-phonenumbers-addons" + MARKETPLACE_RECORDING_ADDONS = "marketplace-recording-addons" + MARKETPLACE_VIRTUALAGENT_ADDONS = "marketplace-virtualagent-addons" + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR_1 = ( + "marketplay-pay-addons-shuttle-pay-connector-1" + ) + MARKETPLAY_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplay-pay-addons-stripe-pay-connector" + ) + MMS_INBOUND_LONGCODE_CANADA = "mms-inbound-longcode-canada" + MMS_INBOUND_LONGCODE_UNITEDSTATES = "mms-inbound-longcode-unitedstates" + MMS_OUTBOUND_LONGCODE_CANADA = "mms-outbound-longcode-canada" + MMS_OUTBOUND_LONGCODE_UNITEDSTATES = "mms-outbound-longcode-unitedstates" + MMS_OUTBOUND_TOLL_FREE = "mms-outbound-toll-free" + NOTIFY_CHATAPPSANDOTHERCHANNELS = "notify-chatappsandotherchannels" + NOTIFY_NOTIFYSERVICES = "notify-notifyservices" + NOTIFY_PUSHNOTIFICATIONS = "notify-pushnotifications" + PAYMENT_GATEWAY_CONNECTORS = "payment-gateway-connectors" + PAYMENT_SOLUTIONS = "payment-solutions" + PCHAT_BUCKET_ADJUSTMENT = "pchat-bucket-adjustment" + PHONENUMBERS_NUMBERS = "phonenumbers-numbers" + PROG_VOICE_CLIENT_ANDROID = "prog-voice-client-android" + PROG_VOICE_CLIENT_ANDROID_INBOUND = "prog-voice-client-android-inbound" + PROG_VOICE_CLIENT_ANDROID_OUTBOUND = "prog-voice-client-android-outbound" + PROG_VOICE_CLIENT_IOS = "prog-voice-client-ios" + PROG_VOICE_CLIENT_IOS_INBOUND = "prog-voice-client-ios-inbound" + PROG_VOICE_CLIENT_IOS_OUTBOUND = "prog-voice-client-ios-outbound" + PROG_VOICE_CLIENT_SDK = "prog-voice-client-sdk" + PROG_VOICE_CLIENT_WEB = "prog-voice-client-web" + PROG_VOICE_CLIENT_WEB_INBOUND = "prog-voice-client-web-inbound" + PROG_VOICE_CLIENT_WEB_OUTBOUND = "prog-voice-client-web-outbound" + PROGRAMMABLEVOICECONNECTIVITY_MEDIA_STREAMS = ( + "programmablevoiceconnectivity-media-streams" + ) + PSTNCONNECTIVITY_BYOC = "pstnconnectivity-byoc" + PSTNCONNECTIVITY_EMERGENCY = "pstnconnectivity-emergency" + PSTNCONNECTIVITY_MINUTES = "pstnconnectivity-minutes" + PSTNCONNECTIVITY_MINUTES_1 = "pstnconnectivity-minutes-1" + PSTNCONNECTIVITY_MINUTESINBOUNDLOCAL = "pstnconnectivity-minutesinboundlocal" + PSTNCONNECTIVITY_MINUTESINBOUNDMOBILE = "pstnconnectivity-minutesinboundmobile" + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREE = ( + "pstnconnectivity-minutesinboundtollfree" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREELOCAL = ( + "pstnconnectivity-minutesinboundtollfreelocal" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREEMOBILE = ( + "pstnconnectivity-minutesinboundtollfreemobile" + ) + PV_ROOM_HOURS = "pv-room-hours" + PV_ROOM_SIMULTANEOUS_PARTICIPANT_CONNECTIONS = ( + "pv-room-simultaneous-participant-connections" + ) + PVIDEO_ROOM_HOURS_AU1 = "pvideo-room-hours-au1" + PVIDEO_ROOM_HOURS_BR1 = "pvideo-room-hours-br1" + PVIDEO_ROOM_HOURS_IE1 = "pvideo-room-hours-ie1" + PVIDEO_ROOM_HOURS_JP1 = "pvideo-room-hours-jp1" + PVIDEO_ROOM_HOURS_SG1 = "pvideo-room-hours-sg1" + PVIDEO_ROOM_HOURS_US1 = "pvideo-room-hours-us1" + PVIDEO_ROOM_HOURS_US2 = "pvideo-room-hours-us2" + RECORDINGS_ENCRYPTED = "recordings-encrypted" + SHORT_CODE_SETUP_FEES = "short-code-setup-fees" + SHORTCODES_MESSAGES_INBOUND = "shortcodes-messages-inbound" + SHORTCODES_MESSAGES_OUTBOUND = "shortcodes-messages-outbound" + SMS_MESSAGES_REGISTRATIONFEES = "sms-messages-registrationfees" + SMS_MMS_PENALTY_FEES = "sms-mms-penalty-fees" + SMS_MMS_PENALTY_FEES_1 = "sms-mms-penalty-fees-1" + SMS_PUMPING_PROTECTION_NON_USCA = "sms-pumping-protection-non-usca" + SMS_PUMPING_PROTECTION_USCA = "sms-pumping-protection-usca" + STUDIO = "studio" + STUDIO_MONTHLY_FEES = "studio-monthly-fees" + SUPERSIM = "supersim" + TASK_ROUTER = "task-router" + TASK_ROUTER_WORKERS = "task-router-workers" + TEST_QUOTA_BUCKETS = "test-quota-buckets" + TEST_UC_SCRIPT_1 = "test-uc-script-1" + TEST_UC_SCRIPT_DEMO_2 = "test-uc-script-demo-2" + TEXT_TO_SPEECH = "text-to-speech" + TME = "tme" + TTS_BASIC = "tts-basic" + TWILIO_EDITIONS = "twilio-editions" + TWILIO_INTERCONNECT_CALIFORNIA = "twilio-interconnect-california" + TWILIO_INTERCONNECT_CALIFORNIA_MONTHLY = ( + "twilio-interconnect-california-monthly" + ) + TWILIO_INTERCONNECT_CALIFORNIA_SETUP = "twilio-interconnect-california-setup" + TWILIO_INTERCONNECT_FRANKFURT = "twilio-interconnect-frankfurt" + TWILIO_INTERCONNECT_FRANKFURT_MO = "twilio-interconnect-frankfurt-mo" + TWILIO_INTERCONNECT_FRANKFURT_SETUP = "twilio-interconnect-frankfurt-setup" + TWILIO_INTERCONNECT_LONDON = "twilio-interconnect-london" + TWILIO_INTERCONNECT_LONDON_MO = "twilio-interconnect-london-mo" + TWILIO_INTERCONNECT_LONDON_SETUP = "twilio-interconnect-london-setup" + TWILIO_INTERCONNECT_SAO_PAULO = "twilio-interconnect-sao-paulo" + TWILIO_INTERCONNECT_SAO_PAULO_MONTHLY = "twilio-interconnect-sao-paulo-monthly" + TWILIO_INTERCONNECT_SAO_PAULO_SETUP = "twilio-interconnect-sao-paulo-setup" + TWILIO_INTERCONNECT_SINGAPORE = "twilio-interconnect-singapore" + TWILIO_INTERCONNECT_SINGAPORE_MO = "twilio-interconnect-singapore-mo" + TWILIO_INTERCONNECT_SINGAPORE_SETUP = "twilio-interconnect-singapore-setup" + TWILIO_INTERCONNECT_SYDNEY = "twilio-interconnect-sydney" + TWILIO_INTERCONNECT_SYDNEY_MO = "twilio-interconnect-sydney-mo" + TWILIO_INTERCONNECT_SYDNEY_SETUP = "twilio-interconnect-sydney-setup" + TWILIO_INTERCONNECT_TOKYO = "twilio-interconnect-tokyo" + TWILIO_INTERCONNECT_TOKYO_MO = "twilio-interconnect-tokyo-mo" + TWILIO_INTERCONNECT_TOKYO_SETUP = "twilio-interconnect-tokyo-setup" + TWILIO_INTERCONNECT_VA = "twilio-interconnect-va" + TWILIO_INTERCONNECT_VA_MO = "twilio-interconnect-va-mo" + TWILIO_INTERCONNECT_VA_SETUP = "twilio-interconnect-va-setup" + TWIML_VERBS = "twiml-verbs" + TWIML_VERBS_SAY = "twiml-verbs-say" + USAGE_PROGRAMMABLE_MESSAGING_ENGAGEMENT_SUITE = ( + "usage-programmable-messaging-engagement-suite" + ) + USAGE_PROGRAMMABLE_MESSAGING_FEES_SERVICES = ( + "usage-programmable-messaging-fees-services" + ) + VERIFY_OUTBOUND_EMAIL = "verify-outbound-email" + VERIFY_PACKAGED_PLANS = "verify-packaged-plans" + VERIFY_SILENT_NETWORK_AUTH = "verify-silent-network-auth" + VERIFY_VOICE_AND_SMS = "verify-voice-and-sms" + VOICE_INSIGHTS_CLIENT_INSIGHTS_MONTHY_COMMIT = ( + "voice-insights-client-insights-monthy-commit" + ) + WIRELESS_DATA_PAYG_ASIA_AFG = "wireless-data-payg-asia-afg" + WIRELESS_MULTI_IMSI_SIM_COMMANDS = "wireless-multi-imsi-sim-commands" + WIRELESS_MULTI_IMSI_SIM_COMMANDS_USA = "wireless-multi-imsi-sim-commands-usa" + WIRELESS_MULTI_IMSI_SIM_DATA = "wireless-multi-imsi-sim-data" + WIRELESS_MULTI_IMSI_SIM_DATA_EU28 = "wireless-multi-imsi-sim-data-eu28" + WIRELESS_MULTI_IMSI_SIM_DATA_USA = "wireless-multi-imsi-sim-data-usa" + WIRELESS_MULTI_IMSI_SIM_MONTHLY_FEES = "wireless-multi-imsi-sim-monthly-fees" + WIRELESS_MULTI_IMSI_SIM_USAGE = "wireless-multi-imsi-sim-usage" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA = "wireless-super-sim-data-north-america" + WIRELESS_SUPER_SIM_USAGE = "wireless-super-sim-usage" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that accrued the usage. + :ivar api_version: The API version used to create the resource. + :ivar as_of: Usage records up to date as of this timestamp, formatted as YYYY-MM-DDTHH:MM:SS+00:00. All timestamps are in GMT + :ivar category: + :ivar count: The number of usage events, such as the number of calls. + :ivar count_unit: The units in which `count` is measured, such as `calls` for calls or `messages` for SMS. + :ivar description: A plain-language description of the usage category. + :ivar end_date: The last date for which usage is included in the UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar price: The total price of the usage in the currency specified in `price_unit` and associated with the account. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format, such as `usd`, `eur`, and `jpy`. + :ivar start_date: The first date for which usage is included in this UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar subresource_uris: A list of related resources identified by their URIs. For more information, see [List Subresources](https://www.twilio.com/docs/usage/api/usage-record#list-subresources). + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar usage: The amount used to bill usage and measured in units described in `usage_unit`. + :ivar usage_unit: The units in which `usage` is measured, such as `minutes` for calls or `messages` for SMS. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.as_of: Optional[str] = payload.get("as_of") + self.category: Optional["YearlyInstance.Category"] = payload.get("category") + self.count: Optional[str] = payload.get("count") + self.count_unit: Optional[str] = payload.get("count_unit") + self.description: Optional[str] = payload.get("description") + self.end_date: Optional[date] = deserialize.iso8601_date( + payload.get("end_date") + ) + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.start_date: Optional[date] = deserialize.iso8601_date( + payload.get("start_date") + ) + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.uri: Optional[str] = payload.get("uri") + self.usage: Optional[str] = payload.get("usage") + self.usage_unit: Optional[str] = payload.get("usage_unit") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class YearlyPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> YearlyInstance: + """ + Build an instance of YearlyInstance + + :param payload: Payload response from the API + """ + return YearlyInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class YearlyList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the YearlyList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageRecord resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Records/Yearly.json".format( + **self._solution + ) + + def stream( + self, + category: Union["YearlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[YearlyInstance]: + """ + Streams YearlyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "YearlyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + category: Union["YearlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[YearlyInstance]: + """ + Asynchronously streams YearlyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "YearlyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + category: Union["YearlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[YearlyInstance]: + """ + Lists YearlyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "YearlyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + category: Union["YearlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[YearlyInstance]: + """ + Asynchronously lists YearlyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "YearlyInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + category: Union["YearlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> YearlyPage: + """ + Retrieve a single page of YearlyInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of YearlyInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return YearlyPage(self._version, response, self._solution) + + async def page_async( + self, + category: Union["YearlyInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> YearlyPage: + """ + Asynchronously retrieve a single page of YearlyInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of YearlyInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return YearlyPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> YearlyPage: + """ + Retrieve a specific page of YearlyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of YearlyInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return YearlyPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> YearlyPage: + """ + Asynchronously retrieve a specific page of YearlyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of YearlyInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return YearlyPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/yesterday.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/yesterday.py new file mode 100644 index 00000000..f3aacda8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/record/yesterday.py @@ -0,0 +1,1211 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class YesterdayInstance(InstanceResource): + + class Category(object): + A2P_10DLC_REGISTRATIONFEES_BRANDREGISTRATION = ( + "a2p-10dlc-registrationfees-brandregistration" + ) + A2P_10DLC_REGISTRATIONFEES_BV = "a2p-10dlc-registrationfees-bv" + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNCHARGES = ( + "a2p-10dlc-registrationfees-campaigncharges" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNREGISTRATION = ( + "a2p-10dlc-registrationfees-campaignregistration" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNVETTING = ( + "a2p-10dlc-registrationfees-campaignvetting" + ) + A2P_10DLC_REGISTRATIONFEES_MONTHLY = "a2p-10dlc-registrationfees-monthly" + A2P_10DLC_REGISTRATIONFEES_ONETIME = "a2p-10dlc-registrationfees-onetime" + A2P_REGISTRATION_FEES = "a2p-registration-fees" + ACCOUNT_SECURITY = "account-security" + AGENT_CONFERENCE = "agent-conference" + AGENT_COPILOT = "agent-copilot" + AGENT_COPILOT_MESSAGES = "agent-copilot-messages" + AGENT_COPILOT_PARTICIPANT_MINUTES = "agent-copilot-participant-minutes" + AI_ASSISTANTS = "ai-assistants" + AI_ASSISTANTS_VOICE = "ai-assistants-voice" + AMAZON_POLLY = "amazon-polly" + ANSWERING_MACHINE_DETECTION = "answering-machine-detection" + ASSETS = "assets" + AUDIENCE_MINUTES = "audience-minutes" + AUDIENCE_MINUTES_AUDIO = "audience-minutes-audio" + AUTHY_AUTHENTICATIONS = "authy-authentications" + AUTHY_CALLS_OUTBOUND = "authy-calls-outbound" + AUTHY_EMAIL_AUTHENTICATIONS = "authy-email-authentications" + AUTHY_MONTHLY_FEES = "authy-monthly-fees" + AUTHY_OUTBOUND_EMAIL = "authy-outbound-email" + AUTHY_PHONE_INTELLIGENCE = "authy-phone-intelligence" + AUTHY_PHONE_VERIFICATIONS = "authy-phone-verifications" + AUTHY_SMS_OUTBOUND = "authy-sms-outbound" + AUTHY_VERIFY_EMAIL_VERIFICATIONS = "authy-verify-email-verifications" + AUTHY_VERIFY_OUTBOUND_EMAIL = "authy-verify-outbound-email" + AUTOPILOT = "autopilot" + AUTOPILOT_HOME_ASSISTANTS = "autopilot-home-assistants" + AUTOPILOT_MESSAGING = "autopilot-messaging" + AUTOPILOT_OTHER = "autopilot-other" + AUTOPILOT_VOICE = "autopilot-voice" + BASIC_PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "basic-peer-to-peer-rooms-participant-minutes" + ) + BRANDED_CALLING = "branded-calling" + BUNDLE_SMS_BUCKET = "bundle-sms-bucket" + BUNDLE_SUBSCRIPTION_FEES = "bundle-subscription-fees" + CALL_FORWARDING_LOOKUPS = "call-forwarding-lookups" + CALL_PROGESS_EVENTS = "call-progess-events" + CALLERIDLOOKUPS = "calleridlookups" + CALLS = "calls" + CALLS_CLIENT = "calls-client" + CALLS_EMERGENCY = "calls-emergency" + CALLS_GLOBALCONFERENCE = "calls-globalconference" + CALLS_INBOUND = "calls-inbound" + CALLS_INBOUND_LOCAL = "calls-inbound-local" + CALLS_INBOUND_MOBILE = "calls-inbound-mobile" + CALLS_INBOUND_TOLLFREE = "calls-inbound-tollfree" + CALLS_INBOUND_TOLLFREE_LOCAL = "calls-inbound-tollfree-local" + CALLS_INBOUND_TOLLFREE_MOBILE = "calls-inbound-tollfree-mobile" + CALLS_MEDIA_STREAM_MINUTES = "calls-media-stream-minutes" + CALLS_OUTBOUND = "calls-outbound" + CALLS_PAY_VERB_TRANSACTIONS = "calls-pay-verb-transactions" + CALLS_RECORDINGS = "calls-recordings" + CALLS_SIP = "calls-sip" + CALLS_SIP_INBOUND = "calls-sip-inbound" + CALLS_SIP_OUTBOUND = "calls-sip-outbound" + CALLS_TEXT_TO_SPEECH = "calls-text-to-speech" + CALLS_TRANSFERS = "calls-transfers" + CARRIER_LOOKUPS = "carrier-lookups" + CATEGORY = "category" + CHANNELS = "channels" + CHANNELS_MESSAGING = "channels-messaging" + CHANNELS_MESSAGING_INBOUND = "channels-messaging-inbound" + CHANNELS_MESSAGING_OUTBOUND = "channels-messaging-outbound" + CHANNELS_WHATSAPP = "channels-whatsapp" + CHANNELS_WHATSAPP_CONVERSATION_AUTHENTICATION = ( + "channels-whatsapp-conversation-authentication" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE = "channels-whatsapp-conversation-free" + CHANNELS_WHATSAPP_CONVERSATION_MARKETING = ( + "channels-whatsapp-conversation-marketing" + ) + CHANNELS_WHATSAPP_CONVERSATION_SERVICE = ( + "channels-whatsapp-conversation-service" + ) + CHANNELS_WHATSAPP_CONVERSATION_UTILITY = ( + "channels-whatsapp-conversation-utility" + ) + CHANNELS_WHATSAPP_INBOUND = "channels-whatsapp-inbound" + CHANNELS_WHATSAPP_OUTBOUND = "channels-whatsapp-outbound" + CHAT_VIRTUAL_AGENT = "chat-virtual-agent" + CONVERSATION_RELAY = "conversation-relay" + CONVERSATIONS = "conversations" + CONVERSATIONS_API_REQUESTS = "conversations-api-requests" + CONVERSATIONS_CONVERSATION_EVENTS = "conversations-conversation-events" + CONVERSATIONS_ENDPOINT_CONNECTIVITY = "conversations-endpoint-connectivity" + CONVERSATIONS_EVENTS = "conversations-events" + CONVERSATIONS_PARTICIPANT_EVENTS = "conversations-participant-events" + CONVERSATIONS_PARTICIPANTS = "conversations-participants" + CPS = "cps" + CREDIT_TRANSFER = "credit-transfer" + EMAIL = "email" + EMERGING_TECH = "emerging-tech" + ENGAGEMENT_SUITE_PACKAGED_PLANS = "engagement-suite-packaged-plans" + ENHANCED_LINE_TYPE_LOOKUPS = "enhanced-line-type-lookups" + ENTERPRISE = "enterprise" + EVENTS = "events" + EXPERIMENT_FRANCE_SMS = "experiment-france-sms" + EXPERIMENT_INDIA_SMS = "experiment-india-sms" + EXPERIMENT_UK_SMS = "experiment-uk-sms" + FAILED_MESSAGE_PROCESSING_FEE = "failed-message-processing-fee" + FLEX = "flex" + FLEX_ACTIVE_USER_HOURS = "flex-active-user-hours" + FLEX_CONCURRENT_USERS = "flex-concurrent-users" + FLEX_CONVERSATIONAL_INSIGHTS = "flex-conversational-insights" + FLEX_CONVERSATIONAL_INSIGHTS_MESSAGES = "flex-conversational-insights-messages" + FLEX_CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = ( + "flex-conversational-insights-voice-minutes" + ) + FLEX_EMAIL_USAGE = "flex-email-usage" + FLEX_MESSAGING_USAGE = "flex-messaging-usage" + FLEX_PARTNER_SPINSCI = "flex-partner-spinsci" + FLEX_PARTNER_XCELERATE = "flex-partner-xcelerate" + FLEX_RESELLER_ECOSYSTEM = "flex-reseller-ecosystem" + FLEX_UNIQUE_USER = "flex-unique-user" + FLEX_USAGE = "flex-usage" + FLEX_USERS = "flex-users" + FLEX_VOICE_MINUTE = "flex-voice-minute" + FLEX_YTICA = "flex-ytica" + FRAUD_LOOKUPS = "fraud-lookups" + FRONTLINE = "frontline" + FRONTLINE_USERS = "frontline-users" + FUNCTIONS = "functions" + GENERIC_PAY_TRANSACTIONS = "generic-pay-transactions" + GROUP_ROOMS = "group-rooms" + GROUP_ROOMS_DATA_TRACK = "group-rooms-data-track" + GROUP_ROOMS_ENCRYPTED_MEDIA_RECORDED = "group-rooms-encrypted-media-recorded" + GROUP_ROOMS_MEDIA_DOWNLOADED = "group-rooms-media-downloaded" + GROUP_ROOMS_MEDIA_RECORDED = "group-rooms-media-recorded" + GROUP_ROOMS_MEDIA_ROUTED = "group-rooms-media-routed" + GROUP_ROOMS_MEDIA_STORED = "group-rooms-media-stored" + GROUP_ROOMS_PARTICIPANT_MINUTES = "group-rooms-participant-minutes" + GROUP_ROOMS_RECORDED_MINUTES = "group-rooms-recorded-minutes" + IP_MESSAGING = "ip-messaging" + IP_MESSAGING_COMMANDS = "ip-messaging-commands" + IP_MESSAGING_DATA_STORAGE = "ip-messaging-data-storage" + IP_MESSAGING_DATA_TRANSFER = "ip-messaging-data-transfer" + IP_MESSAGING_ENDPOINT_CONNECTIVITY = "ip-messaging-endpoint-connectivity" + IVR_VIRTUAL_AGENT_CUSTOM_VOICES = "ivr-virtual-agent-custom-voices" + IVR_VIRTUAL_AGENT_GENAI = "ivr-virtual-agent-genai" + LINE_STATUS_LOOKUPS = "line-status-lookups" + LIVE_ACTIVITY_LOOKUPS = "live-activity-lookups" + LOOKUP_BUCKET_ADJUSTMENT = "lookup-bucket-adjustment" + LOOKUP_IDENTITY_MATCH = "lookup-identity-match" + LOOKUPS = "lookups" + MARKETPLACE = "marketplace" + MARKETPLACE_ALGORITHMIA_NAMED_ENTITY_RECOGNITION = ( + "marketplace-algorithmia-named-entity-recognition" + ) + MARKETPLACE_CADENCE_TRANSCRIPTION = "marketplace-cadence-transcription" + MARKETPLACE_CADENCE_TRANSLATION = "marketplace-cadence-translation" + MARKETPLACE_CAPIO_SPEECH_TO_TEXT = "marketplace-capio-speech-to-text" + MARKETPLACE_CONVRIZA_ABABA = "marketplace-convriza-ababa" + MARKETPLACE_DEEPGRAM_PHRASE_DETECTOR = "marketplace-deepgram-phrase-detector" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION = "marketplace-deepgram-transcription" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION_BASE = ( + "marketplace-deepgram-transcription-base" + ) + MARKETPLACE_DEEPGRAM_TRANSSCRIPTION_ENHANCED = ( + "marketplace-deepgram-transscription-enhanced" + ) + MARKETPLACE_DIGITAL_SEGMENT_BUSINESS_INFO = ( + "marketplace-digital-segment-business-info" + ) + MARKETPLACE_FACEBOOK_OFFLINE_CONVERSIONS = ( + "marketplace-facebook-offline-conversions" + ) + MARKETPLACE_GOOGLE_SPEECH_TO_TEXT = "marketplace-google-speech-to-text" + MARKETPLACE_IBM_WATSON_MESSAGE_INSIGHTS = ( + "marketplace-ibm-watson-message-insights" + ) + MARKETPLACE_IBM_WATSON_MESSAGE_SENTIMENT = ( + "marketplace-ibm-watson-message-sentiment" + ) + MARKETPLACE_IBM_WATSON_RECORDING_ANALYSIS = ( + "marketplace-ibm-watson-recording-analysis" + ) + MARKETPLACE_IBM_WATSON_TONE_ANALYZER = "marketplace-ibm-watson-tone-analyzer" + MARKETPLACE_ICEHOOK_SYSTEMS_SCOUT = "marketplace-icehook-systems-scout" + MARKETPLACE_INFOGROUP_DATAAXLE_BIZINFO = ( + "marketplace-infogroup-dataaxle-bizinfo" + ) + MARKETPLACE_KEEN_IO_CONTACT_CENTER_ANALYTICS = ( + "marketplace-keen-io-contact-center-analytics" + ) + MARKETPLACE_MARCHEX_CLEANCALL = "marketplace-marchex-cleancall" + MARKETPLACE_MARCHEX_RECORDING_ANALYSIS = ( + "marketplace-marchex-recording-analysis" + ) + MARKETPLACE_MARCHEX_SENTIMENT_ANALYSIS_FOR_SMS = ( + "marketplace-marchex-sentiment-analysis-for-sms" + ) + MARKETPLACE_MARKETPLACE_NEXTCALLER_SOCIAL_ID = ( + "marketplace-marketplace-nextcaller-social-id" + ) + MARKETPLACE_MOBILE_COMMONS_OPT_OUT_CLASSIFIER = ( + "marketplace-mobile-commons-opt-out-classifier" + ) + MARKETPLACE_NEXIWAVE_VOICEMAIL_TO_TEXT = ( + "marketplace-nexiwave-voicemail-to-text" + ) + MARKETPLACE_NEXTCALLER_ADVANCED_CALLER_IDENTIFICATION = ( + "marketplace-nextcaller-advanced-caller-identification" + ) + MARKETPLACE_NOMOROBO_SPAM_SCORE = "marketplace-nomorobo-spam-score" + MARKETPLACE_PAY_ADDONS = "marketplace-pay-addons" + MARKETPLACE_PAY_ADDONS_BASECOMMERCE_PAY_CONNECTOR = ( + "marketplace-pay-addons-basecommerce-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_BRAINTREE_PAY_CONNECTOR = ( + "marketplace-pay-addons-braintree-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CARDCONNECT_PAY_CONNECTOR = ( + "marketplace-pay-addons-cardconnect-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CHASE_PAY_CONNECTOR = ( + "marketplace-pay-addons-chase-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplace-pay-addons-shuttle-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplace-pay-addons-stripe-pay-connector" + ) + MARKETPLACE_PAYFONE_TCPA_COMPLIANCE = "marketplace-payfone-tcpa-compliance" + MARKETPLACE_POLY_AI_CONNECTOR = "marketplace-poly-ai-connector" + MARKETPLACE_REALPHONEVALIDATION = "marketplace-realphonevalidation" + MARKETPLACE_REMEETING_AUTOMATIC_SPEECH_RECOGNITION = ( + "marketplace-remeeting-automatic-speech-recognition" + ) + MARKETPLACE_SPOKE_PHONE_LICENSE_PRO = "marketplace-spoke-phone-license-pro" + MARKETPLACE_SPOKE_PHONE_LICENSE_STANDARD = ( + "marketplace-spoke-phone-license-standard" + ) + MARKETPLACE_TCPA_DEFENSE_SOLUTIONS_BLACKLIST_FEED = ( + "marketplace-tcpa-defense-solutions-blacklist-feed" + ) + MARKETPLACE_TELO_OPENCNAM = "marketplace-telo-opencnam" + MARKETPLACE_TRESTLE_SOLUTIONS_CALLER_IDENTIFICATION = ( + "marketplace-trestle-solutions-caller-identification" + ) + MARKETPLACE_TRUECNAM_TRUE_SPAM = "marketplace-truecnam-true-spam" + MARKETPLACE_TWILIO_CALLER_NAME_LOOKUP_US = ( + "marketplace-twilio-caller-name-lookup-us" + ) + MARKETPLACE_TWILIO_CARRIER_INFORMATION_LOOKUP = ( + "marketplace-twilio-carrier-information-lookup" + ) + MARKETPLACE_VOICEBASE_PCI = "marketplace-voicebase-pci" + MARKETPLACE_VOICEBASE_TRANSCRIPTION = "marketplace-voicebase-transcription" + MARKETPLACE_VOICEBASE_TRANSCRIPTION_CUSTOM_VOCABULARY = ( + "marketplace-voicebase-transcription-custom-vocabulary" + ) + MARKETPLACE_WEB_PURIFY_PROFANITY_FILTER = ( + "marketplace-web-purify-profanity-filter" + ) + MARKETPLACE_WHITEPAGES_PRO_CALLER_IDENTIFICATION = ( + "marketplace-whitepages-pro-caller-identification" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_INTELLIGENCE = ( + "marketplace-whitepages-pro-phone-intelligence" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_REPUTATION = ( + "marketplace-whitepages-pro-phone-reputation" + ) + MARKETPLACE_WOLFARM_SPOKEN_RESULTS = "marketplace-wolfarm-spoken-results" + MARKETPLACE_WOLFRAM_SHORT_ANSWER = "marketplace-wolfram-short-answer" + MARKETPLACE_YTICA_CONTACT_CENTER_REPORTING_ANALYTICS = ( + "marketplace-ytica-contact-center-reporting-analytics" + ) + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplay-pay-addons-shuttle-pay-connector" + ) + MEDIA_COMPOSER_MINUTES = "media-composer-minutes" + MEDIASTORAGE = "mediastorage" + MIN_SPEND_ADJUSTMENTS = "min-spend-adjustments" + MMS = "mms" + MMS_INBOUND = "mms-inbound" + MMS_INBOUND_LONGCODE = "mms-inbound-longcode" + MMS_INBOUND_SHORTCODE = "mms-inbound-shortcode" + MMS_INBOUND_TOLL_FREE = "mms-inbound-toll-free" + MMS_MESSAGES_CARRIERFEES = "mms-messages-carrierfees" + MMS_OUTBOUND = "mms-outbound" + MMS_OUTBOUND_LONGCODE = "mms-outbound-longcode" + MMS_OUTBOUND_SHORTCODE = "mms-outbound-shortcode" + MMS_OUTBOUND_TOLLFREE = "mms-outbound-tollfree" + MONITOR = "monitor" + MONITOR_READS = "monitor-reads" + MONITOR_STORAGE = "monitor-storage" + MONITOR_WRITES = "monitor-writes" + NOTIFY = "notify" + NOTIFY_ACTIONS_ATTEMPTS = "notify-actions-attempts" + NOTIFY_CHANNELS = "notify-channels" + NUMBER_FORMAT_LOOKUPS = "number-format-lookups" + PCHAT = "pchat" + PCHAT_ACTIONS = "pchat-actions" + PCHAT_APS = "pchat-aps" + PCHAT_CONV_MED_STORAGE = "pchat-conv-med-storage" + PCHAT_MESSAGES = "pchat-messages" + PCHAT_NOTIFICATIONS = "pchat-notifications" + PCHAT_READS = "pchat-reads" + PCHAT_USERS = "pchat-users" + PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "peer-to-peer-rooms-participant-minutes" + ) + PFAX = "pfax" + PFAX_MINUTES = "pfax-minutes" + PFAX_MINUTES_INBOUND = "pfax-minutes-inbound" + PFAX_MINUTES_OUTBOUND = "pfax-minutes-outbound" + PFAX_PAGES = "pfax-pages" + PHONE_QUALITY_SCORE_LOOKUPS = "phone-quality-score-lookups" + PHONENUMBERS = "phonenumbers" + PHONENUMBERS_CPS = "phonenumbers-cps" + PHONENUMBERS_EMERGENCY = "phonenumbers-emergency" + PHONENUMBERS_LOCAL = "phonenumbers-local" + PHONENUMBERS_MOBILE = "phonenumbers-mobile" + PHONENUMBERS_PORTING = "phonenumbers-porting" + PHONENUMBERS_SETUPS = "phonenumbers-setups" + PHONENUMBERS_TOLLFREE = "phonenumbers-tollfree" + PREMIUMSUPPORT = "premiumsupport" + PREMIUMSUPPORT_PERCENTAGE_SPEND = "premiumsupport-percentage-spend" + PROGRAMMABLEVOICE_PLATFORM = "programmablevoice-platform" + PROGRAMMABLEVOICECONN_CLIENTSDK = "programmablevoiceconn-clientsdk" + PROGRAMMABLEVOICECONN_CLIENTSDK_INBOUND = ( + "programmablevoiceconn-clientsdk-inbound" + ) + PROGRAMMABLEVOICECONN_CLIENTSDK_OUTBOUND = ( + "programmablevoiceconn-clientsdk-outbound" + ) + PROGRAMMABLEVOICECONN_ONNET = "programmablevoiceconn-onnet" + PROGRAMMABLEVOICECONN_ONNET_INBOUND = "programmablevoiceconn-onnet-inbound" + PROGRAMMABLEVOICECONN_ONNET_OUTBOUND = "programmablevoiceconn-onnet-outbound" + PROGRAMMABLEVOICECONN_SIP = "programmablevoiceconn-sip" + PROGRAMMABLEVOICECONN_SIP_INBOUND = "programmablevoiceconn-sip-inbound" + PROGRAMMABLEVOICECONN_SIP_OUTBOUND = "programmablevoiceconn-sip-outbound" + PROGRAMMABLEVOICECONNECTIVITY = "programmablevoiceconnectivity" + PROXY = "proxy" + PROXY_ACTIVE_SESSIONS = "proxy-active-sessions" + PROXY_BUCKET_ADJUSTMENT = "proxy-bucket-adjustment" + PROXY_LICENSES = "proxy-licenses" + PSTNCONNECTIVITY = "pstnconnectivity" + PSTNCONNECTIVITY_INBOUND = "pstnconnectivity-inbound" + PSTNCONNECTIVITY_OUTBOUND = "pstnconnectivity-outbound" + PV = "pv" + PV_BASIC_ROOMS = "pv-basic-rooms" + PV_COMPOSITION_MEDIA_DOWNLOADED = "pv-composition-media-downloaded" + PV_COMPOSITION_MEDIA_ENCRYPTED = "pv-composition-media-encrypted" + PV_COMPOSITION_MEDIA_STORED = "pv-composition-media-stored" + PV_COMPOSITION_MINUTES = "pv-composition-minutes" + PV_RECORDING_COMPOSITIONS = "pv-recording-compositions" + PV_ROOM_PARTICIPANTS = "pv-room-participants" + PV_ROOM_PARTICIPANTS_AU1 = "pv-room-participants-au1" + PV_ROOM_PARTICIPANTS_BR1 = "pv-room-participants-br1" + PV_ROOM_PARTICIPANTS_IE1 = "pv-room-participants-ie1" + PV_ROOM_PARTICIPANTS_JP1 = "pv-room-participants-jp1" + PV_ROOM_PARTICIPANTS_SG1 = "pv-room-participants-sg1" + PV_ROOM_PARTICIPANTS_US1 = "pv-room-participants-us1" + PV_ROOM_PARTICIPANTS_US2 = "pv-room-participants-us2" + PV_ROOMS = "pv-rooms" + PV_SIP_ENDPOINT_REGISTRATIONS = "pv-sip-endpoint-registrations" + RCS_MESSAGES = "rcs-messages" + REASSIGNED_NUMBER = "reassigned-number" + RECORDINGS = "recordings" + RECORDINGSTORAGE = "recordingstorage" + SHORTCODES = "shortcodes" + SHORTCODES_CUSTOMEROWNED = "shortcodes-customerowned" + SHORTCODES_MMS_ENABLEMENT = "shortcodes-mms-enablement" + SHORTCODES_MPS = "shortcodes-mps" + SHORTCODES_RANDOM = "shortcodes-random" + SHORTCODES_SETUP_FEES = "shortcodes-setup-fees" + SHORTCODES_UK = "shortcodes-uk" + SHORTCODES_VANITY = "shortcodes-vanity" + SIM_SWAP_LOOKUPS = "sim-swap-lookups" + SIP_SECURE_MEDIA = "sip-secure-media" + SMALL_GROUP_ROOMS = "small-group-rooms" + SMALL_GROUP_ROOMS_DATA_TRACK = "small-group-rooms-data-track" + SMALL_GROUP_ROOMS_PARTICIPANT_MINUTES = "small-group-rooms-participant-minutes" + SMS = "sms" + SMS_INBOUND = "sms-inbound" + SMS_INBOUND_LONGCODE = "sms-inbound-longcode" + SMS_INBOUND_SHORTCODE = "sms-inbound-shortcode" + SMS_INBOUND_TOLLFREE = "sms-inbound-tollfree" + SMS_MESSAGES_CARRIERFEES = "sms-messages-carrierfees" + SMS_MESSAGES_FEATURES = "sms-messages-features" + SMS_MESSAGES_FEATURES_ENGAGEMENT_SUITE = ( + "sms-messages-features-engagement-suite" + ) + SMS_MESSAGES_FEATURES_MESSAGE_REDACTION = ( + "sms-messages-features-message-redaction" + ) + SMS_MESSAGES_FEATURES_SENDERID = "sms-messages-features-senderid" + SMS_MPS = "sms-mps" + SMS_MPS_SHORTCODE = "sms-mps-shortcode" + SMS_MPS_TOLLFREE = "sms-mps-tollfree" + SMS_MPS_TOLLFREE_SETUP = "sms-mps-tollfree-setup" + SMS_NATIONAL_REGULATORY_PROTECTION = "sms-national-regulatory-protection" + SMS_OUTBOUND = "sms-outbound" + SMS_OUTBOUND_CONTENT_INSPECTION = "sms-outbound-content-inspection" + SMS_OUTBOUND_LONGCODE = "sms-outbound-longcode" + SMS_OUTBOUND_SHORTCODE = "sms-outbound-shortcode" + SMS_OUTBOUND_TOLLFREE = "sms-outbound-tollfree" + SMS_PUMPING_PROTECTION = "sms-pumping-protection" + SMS_PUMPING_RISK = "sms-pumping-risk" + SMSMESSAGES_BUCKET_ADJUSTMENTS = "smsmessages-bucket-adjustments" + SMSMESSAGES_OUTBOUND_DOMESTIC = "smsmessages-outbound-domestic" + SPEECH_RECOGNITION = "speech-recognition" + STUDIO_ENGAGEMENTS = "studio-engagements" + SYNC = "sync" + SYNC_ACTIONS = "sync-actions" + SYNC_ENDPOINT_HOURS = "sync-endpoint-hours" + SYNC_ENDPOINT_HOURS_ABOVE_DAILY_CAP = "sync-endpoint-hours-above-daily-cap" + TASKROUTER_TASKS = "taskrouter-tasks" + TOTALPRICE = "totalprice" + TRANSCRIPTIONS = "transcriptions" + TRUNKING_CPS = "trunking-cps" + TRUNKING_EMERGENCY_CALLS = "trunking-emergency-calls" + TRUNKING_ORIGINATION = "trunking-origination" + TRUNKING_ORIGINATION_LOCAL = "trunking-origination-local" + TRUNKING_ORIGINATION_MOBILE = "trunking-origination-mobile" + TRUNKING_ORIGINATION_TOLLFREE = "trunking-origination-tollfree" + TRUNKING_RECORDINGS = "trunking-recordings" + TRUNKING_SECURE = "trunking-secure" + TRUNKING_TERMINATION = "trunking-termination" + TTS_GOOGLE = "tts-google" + TURNMEGABYTES = "turnmegabytes" + TURNMEGABYTES_AUSTRALIA = "turnmegabytes-australia" + TURNMEGABYTES_BRASIL = "turnmegabytes-brasil" + TURNMEGABYTES_GERMANY = "turnmegabytes-germany" + TURNMEGABYTES_INDIA = "turnmegabytes-india" + TURNMEGABYTES_IRELAND = "turnmegabytes-ireland" + TURNMEGABYTES_JAPAN = "turnmegabytes-japan" + TURNMEGABYTES_SINGAPORE = "turnmegabytes-singapore" + TURNMEGABYTES_USEAST = "turnmegabytes-useast" + TURNMEGABYTES_USWEST = "turnmegabytes-uswest" + TWILIO_FOR_SALESFORCE = "twilio-for-salesforce" + TWILIO_FOR_SALESFORCE_LICENSES = "twilio-for-salesforce-licenses" + TWILIO_INTERCONNECT = "twilio-interconnect" + TWIML = "twiml" + USAGE_FLEX_VIDEO = "usage-flex-video" + USAGE_FUNCTIONS = "usage-functions" + USAGE_RCS_BASIC_MESSAGES_OUTBOUND = "usage-rcs-basic-messages-outbound" + USAGE_RCS_MESSAGES = "usage-rcs-messages" + USAGE_RCS_MESSAGES_INBOUND = "usage-rcs-messages-inbound" + USAGE_RCS_MESSAGING_CARRIER_FEES = "usage-rcs-messaging-carrier-fees" + USAGE_RCS_SINGLE_MESSAGES_OUTBOUND = "usage-rcs-single-messages-outbound" + VERIFY_PACKAGE_PLANS = "verify-package-plans" + VERIFY_PUSH = "verify-push" + VERIFY_SNA = "verify-sna" + VERIFY_TOTP = "verify-totp" + VERIFY_VOICE_SMS = "verify-voice-sms" + VERIFY_WHATSAPP_CONVERSATIONS_BUSINESS_INITIATED = ( + "verify-whatsapp-conversations-business-initiated" + ) + VIDEO_RECORDINGS = "video-recordings" + VIDEO_ROOMS_TURN_MEGABYTES = "video-rooms-turn-megabytes" + VIRTUAL_AGENT = "virtual-agent" + VOICE_INSIGHTS = "voice-insights" + VOICE_INSIGHTS_CLIENT_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-client-insights-on-demand-minute" + ) + VOICE_INSIGHTS_PTSN_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-ptsn-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_INTERFACE_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-interface-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_TRUNKING_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-trunking-insights-on-demand-minute" + ) + VOICE_INTELLIGENCE = "voice-intelligence" + VOICE_INTELLIGENCE_EIP_OPERATORS = "voice-intelligence-eip-operators" + VOICE_INTELLIGENCE_OPERATORS = "voice-intelligence-operators" + VOICE_INTELLIGENCE_TRANSCRIPTION = "voice-intelligence-transcription" + WDS = "wds" + WIRELESS = "wireless" + WIRELESS_DATA = "wireless-data" + WIRELESS_DATA_PAYG = "wireless-data-payg" + WIRELESS_DATA_PAYG_AFRICA = "wireless-data-payg-africa" + WIRELESS_DATA_PAYG_ASIA = "wireless-data-payg-asia" + WIRELESS_DATA_PAYG_CENTRALANDSOUTHAMERICA = ( + "wireless-data-payg-centralandsouthamerica" + ) + WIRELESS_DATA_PAYG_EUROPE = "wireless-data-payg-europe" + WIRELESS_DATA_PAYG_NORTHAMERICA = "wireless-data-payg-northamerica" + WIRELESS_DATA_PAYG_OCEANIA = "wireless-data-payg-oceania" + WIRELESS_DATA_QUOTA1 = "wireless-data-quota1" + WIRELESS_DATA_QUOTA1_AFRICA = "wireless-data-quota1-africa" + WIRELESS_DATA_QUOTA1_ASIA = "wireless-data-quota1-asia" + WIRELESS_DATA_QUOTA1_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota1-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA1_EUROPE = "wireless-data-quota1-europe" + WIRELESS_DATA_QUOTA1_NORTHAMERICA = "wireless-data-quota1-northamerica" + WIRELESS_DATA_QUOTA1_OCEANIA = "wireless-data-quota1-oceania" + WIRELESS_DATA_QUOTA10 = "wireless-data-quota10" + WIRELESS_DATA_QUOTA10_AFRICA = "wireless-data-quota10-africa" + WIRELESS_DATA_QUOTA10_ASIA = "wireless-data-quota10-asia" + WIRELESS_DATA_QUOTA10_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota10-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA10_EUROPE = "wireless-data-quota10-europe" + WIRELESS_DATA_QUOTA10_NORTHAMERICA = "wireless-data-quota10-northamerica" + WIRELESS_DATA_QUOTA10_OCEANIA = "wireless-data-quota10-oceania" + WIRELESS_DATA_QUOTA50 = "wireless-data-quota50" + WIRELESS_DATA_QUOTA50_AFRICA = "wireless-data-quota50-africa" + WIRELESS_DATA_QUOTA50_ASIA = "wireless-data-quota50-asia" + WIRELESS_DATA_QUOTA50_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota50-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA50_EUROPE = "wireless-data-quota50-europe" + WIRELESS_DATA_QUOTA50_NORTHAMERICA = "wireless-data-quota50-northamerica" + WIRELESS_DATA_QUOTA50_OCEANIA = "wireless-data-quota50-oceania" + WIRELESS_DATA_QUOTACUSTOM = "wireless-data-quotacustom" + WIRELESS_DATA_QUOTACUSTOM_AFRICA = "wireless-data-quotacustom-africa" + WIRELESS_DATA_QUOTACUSTOM_ASIA = "wireless-data-quotacustom-asia" + WIRELESS_DATA_QUOTACUSTOM_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quotacustom-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_EUROPE = "wireless-data-quotacustom-europe" + WIRELESS_DATA_QUOTACUSTOM_NORTHAMERICA = ( + "wireless-data-quotacustom-northamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_OCEANIA = "wireless-data-quotacustom-oceania" + WIRELESS_MRC_PAYG = "wireless-mrc-payg" + WIRELESS_MRC_QUOTA1 = "wireless-mrc-quota1" + WIRELESS_MRC_QUOTA10 = "wireless-mrc-quota10" + WIRELESS_MRC_QUOTA50 = "wireless-mrc-quota50" + WIRELESS_MRC_QUOTACUSTOM = "wireless-mrc-quotacustom" + WIRELESS_ORDERS = "wireless-orders" + WIRELESS_ORDERS_ARTWORK = "wireless-orders-artwork" + WIRELESS_ORDERS_BULK = "wireless-orders-bulk" + WIRELESS_ORDERS_ESIM = "wireless-orders-esim" + WIRELESS_ORDERS_STARTER = "wireless-orders-starter" + WIRELESS_QUOTAS = "wireless-quotas" + WIRELESS_SMS_AFRICA = "wireless-sms-africa" + WIRELESS_SMS_ASIA = "wireless-sms-asia" + WIRELESS_SMS_CENTRALANDSOUTHAMERICA = "wireless-sms-centralandsouthamerica" + WIRELESS_SMS_EUROPE = "wireless-sms-europe" + WIRELESS_SMS_NORTHAMERICA = "wireless-sms-northamerica" + WIRELESS_SMS_OCEANIA = "wireless-sms-oceania" + WIRELESS_SUPER_SIM = "wireless-super-sim" + WIRELESS_SUPER_SIM_DATA = "wireless-super-sim-data" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA_USA = ( + "wireless-super-sim-data-north-america-usa" + ) + WIRELESS_SUPER_SIM_DATA_PAYG = "wireless-super-sim-data-payg" + WIRELESS_SUPER_SIM_DATA_PAYG_EUROPE = "wireless-super-sim-data-payg-europe" + WIRELESS_SUPER_SIM_DATA_PAYG_NORTH_AMERICA = ( + "wireless-super-sim-data-payg-north-america" + ) + WIRELESS_SUPER_SIM_HARDWARE = "wireless-super-sim-hardware" + WIRELESS_SUPER_SIM_HARDWARE_BULK = "wireless-super-sim-hardware-bulk" + WIRELESS_SUPER_SIM_SMSCOMMANDS = "wireless-super-sim-smscommands" + WIRELESS_SUPER_SIM_SMSCOMMANDS_AFRICA = "wireless-super-sim-smscommands-africa" + WIRELESS_SUPER_SIM_SMSCOMMANDS_ASIA = "wireless-super-sim-smscommands-asia" + WIRELESS_SUPER_SIM_SMSCOMMANDS_CENT_AND_SOUTH_AMERICA = ( + "wireless-super-sim-smscommands-cent-and-south-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_EUROPE = "wireless-super-sim-smscommands-europe" + WIRELESS_SUPER_SIM_SMSCOMMANDS_NORTH_AMERICA = ( + "wireless-super-sim-smscommands-north-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_OCEANIA = ( + "wireless-super-sim-smscommands-oceania" + ) + WIRELESS_SUPER_SIM_SUBSCRIPTION = "wireless-super-sim-subscription" + WIRELESS_SUPER_SIM_SUBSCRIPTION_PAYG = "wireless-super-sim-subscription-payg" + WIRELESS_USAGE = "wireless-usage" + WIRELESS_USAGE_COMMANDS = "wireless-usage-commands" + WIRELESS_USAGE_COMMANDS_AFRICA = "wireless-usage-commands-africa" + WIRELESS_USAGE_COMMANDS_ASIA = "wireless-usage-commands-asia" + WIRELESS_USAGE_COMMANDS_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-commands-centralandsouthamerica" + ) + WIRELESS_USAGE_COMMANDS_EUROPE = "wireless-usage-commands-europe" + WIRELESS_USAGE_COMMANDS_HOME = "wireless-usage-commands-home" + WIRELESS_USAGE_COMMANDS_NORTHAMERICA = "wireless-usage-commands-northamerica" + WIRELESS_USAGE_COMMANDS_OCEANIA = "wireless-usage-commands-oceania" + WIRELESS_USAGE_COMMANDS_ROAMING = "wireless-usage-commands-roaming" + WIRELESS_USAGE_DATA = "wireless-usage-data" + WIRELESS_USAGE_DATA_AFRICA = "wireless-usage-data-africa" + WIRELESS_USAGE_DATA_ASIA = "wireless-usage-data-asia" + WIRELESS_USAGE_DATA_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-data-centralandsouthamerica" + ) + WIRELESS_USAGE_DATA_CUSTOM_ADDITIONALMB = ( + "wireless-usage-data-custom-additionalmb" + ) + WIRELESS_USAGE_DATA_CUSTOM_FIRST5MB = "wireless-usage-data-custom-first5mb" + WIRELESS_USAGE_DATA_DOMESTIC_ROAMING = "wireless-usage-data-domestic-roaming" + WIRELESS_USAGE_DATA_EUROPE = "wireless-usage-data-europe" + WIRELESS_USAGE_DATA_INDIVIDUAL_ADDITIONALGB = ( + "wireless-usage-data-individual-additionalgb" + ) + WIRELESS_USAGE_DATA_INDIVIDUAL_FIRSTGB = ( + "wireless-usage-data-individual-firstgb" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_CANADA = ( + "wireless-usage-data-international-roaming-canada" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_INDIA = ( + "wireless-usage-data-international-roaming-india" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_MEXICO = ( + "wireless-usage-data-international-roaming-mexico" + ) + WIRELESS_USAGE_DATA_NORTHAMERICA = "wireless-usage-data-northamerica" + WIRELESS_USAGE_DATA_OCEANIA = "wireless-usage-data-oceania" + WIRELESS_USAGE_DATA_POOLED = "wireless-usage-data-pooled" + WIRELESS_USAGE_DATA_POOLED_DOWNLINK = "wireless-usage-data-pooled-downlink" + WIRELESS_USAGE_DATA_POOLED_UPLINK = "wireless-usage-data-pooled-uplink" + WIRELESS_USAGE_MRC = "wireless-usage-mrc" + WIRELESS_USAGE_MRC_CUSTOM = "wireless-usage-mrc-custom" + WIRELESS_USAGE_MRC_INDIVIDUAL = "wireless-usage-mrc-individual" + WIRELESS_USAGE_MRC_POOLED = "wireless-usage-mrc-pooled" + WIRELESS_USAGE_MRC_SUSPENDED = "wireless-usage-mrc-suspended" + WIRELESS_USAGE_SMS = "wireless-usage-sms" + WIRELESS_USAGE_VOICE = "wireless-usage-voice" + A2P_FAST_TRACK_ONBOARDING = "a2p-fast-track-onboarding" + ADVISORY_SERVICES = "advisory-services" + ADVISORY_SERVICES_BILLED = "advisory-services-billed" + ADVISORY_SERVICES_CALL_TRACKING = "advisory-services-call-tracking" + ADVISORY_SERVICES_DATA_SERVICES = "advisory-services-data-services" + ADVISORY_SERVICES_EXPENSES = "advisory-services-expenses" + ADVISORY_SERVICES_SIP_TRUNKING = "advisory-services-sip-trunking" + ASSETS_REQUESTS = "assets-requests" + AUDIENCE_MINUTES_VIDEO = "audience-minutes-video" + AUTHY_BUCKET_ADJUSTMENT = "authy-bucket-adjustment" + AUTHY_SOFTWARE = "authy-software" + CALLERIDLOOKUPS_API = "calleridlookups-api" + CALLERIDLOOKUPS_PROGRAMMABLEVOICE = "calleridlookups-programmablevoice" + CALLERIDLOOKUPS_TRUNKING = "calleridlookups-trunking" + CALLS_TRUNKING_INBOUND_TOLLFREE_LOCAL = "calls-trunking-inbound-tollfree-local" + CALLS_TRUNKING_INBOUND_TOLLFREE_MOBILE = ( + "calls-trunking-inbound-tollfree-mobile" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE_1 = "channels-whatsapp-conversation-free-1" + CONFERENCE = "conference" + CONVERSATIONAL_INSIGHTS = "conversational-insights" + CONVERSATIONAL_INSIGHTS_MESSAGES = "conversational-insights-messages" + CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = "conversational-insights-voice-minutes" + DEMO = "demo" + DEMO_UC_SCRIPT_TEST = "demo-uc-script-test" + ELASTIC_SIP_TRUNKING = "elastic-sip-trunking" + ELASTIC_SIP_TRUNKING_CALL_TRANSFERS = "elastic-sip-trunking-call-transfers" + ENTERPRISE_HIPPA = "enterprise-hippa" + FLEX_NAMED_USERS = "flex-named-users" + FLEX_SPINSCI = "flex-spinsci" + FLEX_USERS_1 = "flex-users-1" + FLEX_WFO_PREMIUM_SPEECH_ANALYTICS = "flex-wfo-premium-speech-analytics" + FLEX_XCELERATE = "flex-xcelerate" + FUNCTIONS_ROLLUP = "functions-rollup" + IMP_V1_USAGE = "imp-v1-usage" + IP_MESSAGING_ADDONS = "ip-messaging-addons" + IVR = "ivr" + IVR_CONVERSATIONAL = "ivr-conversational" + IVR_DTMF = "ivr-dtmf" + IVR_VIRTUALAGENT = "ivr-virtualagent" + LIVE = "live" + LIVE_MEDIA_RECORDING_MINUTES = "live-media-recording-minutes" + LONGCODE_MPS = "longcode-mps" + MARKETPLACE_ANALYTICS_ADDONS = "marketplace-analytics-addons" + MARKETPLACE_ISV_ADDONS = "marketplace-isv-addons" + MARKETPLACE_MESSAGING_ADDONS = "marketplace-messaging-addons" + MARKETPLACE_PHONENUMBERS_ADDONS = "marketplace-phonenumbers-addons" + MARKETPLACE_RECORDING_ADDONS = "marketplace-recording-addons" + MARKETPLACE_VIRTUALAGENT_ADDONS = "marketplace-virtualagent-addons" + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR_1 = ( + "marketplay-pay-addons-shuttle-pay-connector-1" + ) + MARKETPLAY_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplay-pay-addons-stripe-pay-connector" + ) + MMS_INBOUND_LONGCODE_CANADA = "mms-inbound-longcode-canada" + MMS_INBOUND_LONGCODE_UNITEDSTATES = "mms-inbound-longcode-unitedstates" + MMS_OUTBOUND_LONGCODE_CANADA = "mms-outbound-longcode-canada" + MMS_OUTBOUND_LONGCODE_UNITEDSTATES = "mms-outbound-longcode-unitedstates" + MMS_OUTBOUND_TOLL_FREE = "mms-outbound-toll-free" + NOTIFY_CHATAPPSANDOTHERCHANNELS = "notify-chatappsandotherchannels" + NOTIFY_NOTIFYSERVICES = "notify-notifyservices" + NOTIFY_PUSHNOTIFICATIONS = "notify-pushnotifications" + PAYMENT_GATEWAY_CONNECTORS = "payment-gateway-connectors" + PAYMENT_SOLUTIONS = "payment-solutions" + PCHAT_BUCKET_ADJUSTMENT = "pchat-bucket-adjustment" + PHONENUMBERS_NUMBERS = "phonenumbers-numbers" + PROG_VOICE_CLIENT_ANDROID = "prog-voice-client-android" + PROG_VOICE_CLIENT_ANDROID_INBOUND = "prog-voice-client-android-inbound" + PROG_VOICE_CLIENT_ANDROID_OUTBOUND = "prog-voice-client-android-outbound" + PROG_VOICE_CLIENT_IOS = "prog-voice-client-ios" + PROG_VOICE_CLIENT_IOS_INBOUND = "prog-voice-client-ios-inbound" + PROG_VOICE_CLIENT_IOS_OUTBOUND = "prog-voice-client-ios-outbound" + PROG_VOICE_CLIENT_SDK = "prog-voice-client-sdk" + PROG_VOICE_CLIENT_WEB = "prog-voice-client-web" + PROG_VOICE_CLIENT_WEB_INBOUND = "prog-voice-client-web-inbound" + PROG_VOICE_CLIENT_WEB_OUTBOUND = "prog-voice-client-web-outbound" + PROGRAMMABLEVOICECONNECTIVITY_MEDIA_STREAMS = ( + "programmablevoiceconnectivity-media-streams" + ) + PSTNCONNECTIVITY_BYOC = "pstnconnectivity-byoc" + PSTNCONNECTIVITY_EMERGENCY = "pstnconnectivity-emergency" + PSTNCONNECTIVITY_MINUTES = "pstnconnectivity-minutes" + PSTNCONNECTIVITY_MINUTES_1 = "pstnconnectivity-minutes-1" + PSTNCONNECTIVITY_MINUTESINBOUNDLOCAL = "pstnconnectivity-minutesinboundlocal" + PSTNCONNECTIVITY_MINUTESINBOUNDMOBILE = "pstnconnectivity-minutesinboundmobile" + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREE = ( + "pstnconnectivity-minutesinboundtollfree" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREELOCAL = ( + "pstnconnectivity-minutesinboundtollfreelocal" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREEMOBILE = ( + "pstnconnectivity-minutesinboundtollfreemobile" + ) + PV_ROOM_HOURS = "pv-room-hours" + PV_ROOM_SIMULTANEOUS_PARTICIPANT_CONNECTIONS = ( + "pv-room-simultaneous-participant-connections" + ) + PVIDEO_ROOM_HOURS_AU1 = "pvideo-room-hours-au1" + PVIDEO_ROOM_HOURS_BR1 = "pvideo-room-hours-br1" + PVIDEO_ROOM_HOURS_IE1 = "pvideo-room-hours-ie1" + PVIDEO_ROOM_HOURS_JP1 = "pvideo-room-hours-jp1" + PVIDEO_ROOM_HOURS_SG1 = "pvideo-room-hours-sg1" + PVIDEO_ROOM_HOURS_US1 = "pvideo-room-hours-us1" + PVIDEO_ROOM_HOURS_US2 = "pvideo-room-hours-us2" + RECORDINGS_ENCRYPTED = "recordings-encrypted" + SHORT_CODE_SETUP_FEES = "short-code-setup-fees" + SHORTCODES_MESSAGES_INBOUND = "shortcodes-messages-inbound" + SHORTCODES_MESSAGES_OUTBOUND = "shortcodes-messages-outbound" + SMS_MESSAGES_REGISTRATIONFEES = "sms-messages-registrationfees" + SMS_MMS_PENALTY_FEES = "sms-mms-penalty-fees" + SMS_MMS_PENALTY_FEES_1 = "sms-mms-penalty-fees-1" + SMS_PUMPING_PROTECTION_NON_USCA = "sms-pumping-protection-non-usca" + SMS_PUMPING_PROTECTION_USCA = "sms-pumping-protection-usca" + STUDIO = "studio" + STUDIO_MONTHLY_FEES = "studio-monthly-fees" + SUPERSIM = "supersim" + TASK_ROUTER = "task-router" + TASK_ROUTER_WORKERS = "task-router-workers" + TEST_QUOTA_BUCKETS = "test-quota-buckets" + TEST_UC_SCRIPT_1 = "test-uc-script-1" + TEST_UC_SCRIPT_DEMO_2 = "test-uc-script-demo-2" + TEXT_TO_SPEECH = "text-to-speech" + TME = "tme" + TTS_BASIC = "tts-basic" + TWILIO_EDITIONS = "twilio-editions" + TWILIO_INTERCONNECT_CALIFORNIA = "twilio-interconnect-california" + TWILIO_INTERCONNECT_CALIFORNIA_MONTHLY = ( + "twilio-interconnect-california-monthly" + ) + TWILIO_INTERCONNECT_CALIFORNIA_SETUP = "twilio-interconnect-california-setup" + TWILIO_INTERCONNECT_FRANKFURT = "twilio-interconnect-frankfurt" + TWILIO_INTERCONNECT_FRANKFURT_MO = "twilio-interconnect-frankfurt-mo" + TWILIO_INTERCONNECT_FRANKFURT_SETUP = "twilio-interconnect-frankfurt-setup" + TWILIO_INTERCONNECT_LONDON = "twilio-interconnect-london" + TWILIO_INTERCONNECT_LONDON_MO = "twilio-interconnect-london-mo" + TWILIO_INTERCONNECT_LONDON_SETUP = "twilio-interconnect-london-setup" + TWILIO_INTERCONNECT_SAO_PAULO = "twilio-interconnect-sao-paulo" + TWILIO_INTERCONNECT_SAO_PAULO_MONTHLY = "twilio-interconnect-sao-paulo-monthly" + TWILIO_INTERCONNECT_SAO_PAULO_SETUP = "twilio-interconnect-sao-paulo-setup" + TWILIO_INTERCONNECT_SINGAPORE = "twilio-interconnect-singapore" + TWILIO_INTERCONNECT_SINGAPORE_MO = "twilio-interconnect-singapore-mo" + TWILIO_INTERCONNECT_SINGAPORE_SETUP = "twilio-interconnect-singapore-setup" + TWILIO_INTERCONNECT_SYDNEY = "twilio-interconnect-sydney" + TWILIO_INTERCONNECT_SYDNEY_MO = "twilio-interconnect-sydney-mo" + TWILIO_INTERCONNECT_SYDNEY_SETUP = "twilio-interconnect-sydney-setup" + TWILIO_INTERCONNECT_TOKYO = "twilio-interconnect-tokyo" + TWILIO_INTERCONNECT_TOKYO_MO = "twilio-interconnect-tokyo-mo" + TWILIO_INTERCONNECT_TOKYO_SETUP = "twilio-interconnect-tokyo-setup" + TWILIO_INTERCONNECT_VA = "twilio-interconnect-va" + TWILIO_INTERCONNECT_VA_MO = "twilio-interconnect-va-mo" + TWILIO_INTERCONNECT_VA_SETUP = "twilio-interconnect-va-setup" + TWIML_VERBS = "twiml-verbs" + TWIML_VERBS_SAY = "twiml-verbs-say" + USAGE_PROGRAMMABLE_MESSAGING_ENGAGEMENT_SUITE = ( + "usage-programmable-messaging-engagement-suite" + ) + USAGE_PROGRAMMABLE_MESSAGING_FEES_SERVICES = ( + "usage-programmable-messaging-fees-services" + ) + VERIFY_OUTBOUND_EMAIL = "verify-outbound-email" + VERIFY_PACKAGED_PLANS = "verify-packaged-plans" + VERIFY_SILENT_NETWORK_AUTH = "verify-silent-network-auth" + VERIFY_VOICE_AND_SMS = "verify-voice-and-sms" + VOICE_INSIGHTS_CLIENT_INSIGHTS_MONTHY_COMMIT = ( + "voice-insights-client-insights-monthy-commit" + ) + WIRELESS_DATA_PAYG_ASIA_AFG = "wireless-data-payg-asia-afg" + WIRELESS_MULTI_IMSI_SIM_COMMANDS = "wireless-multi-imsi-sim-commands" + WIRELESS_MULTI_IMSI_SIM_COMMANDS_USA = "wireless-multi-imsi-sim-commands-usa" + WIRELESS_MULTI_IMSI_SIM_DATA = "wireless-multi-imsi-sim-data" + WIRELESS_MULTI_IMSI_SIM_DATA_EU28 = "wireless-multi-imsi-sim-data-eu28" + WIRELESS_MULTI_IMSI_SIM_DATA_USA = "wireless-multi-imsi-sim-data-usa" + WIRELESS_MULTI_IMSI_SIM_MONTHLY_FEES = "wireless-multi-imsi-sim-monthly-fees" + WIRELESS_MULTI_IMSI_SIM_USAGE = "wireless-multi-imsi-sim-usage" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA = "wireless-super-sim-data-north-america" + WIRELESS_SUPER_SIM_USAGE = "wireless-super-sim-usage" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that accrued the usage. + :ivar api_version: The API version used to create the resource. + :ivar as_of: Usage records up to date as of this timestamp, formatted as YYYY-MM-DDTHH:MM:SS+00:00. All timestamps are in GMT + :ivar category: + :ivar count: The number of usage events, such as the number of calls. + :ivar count_unit: The units in which `count` is measured, such as `calls` for calls or `messages` for SMS. + :ivar description: A plain-language description of the usage category. + :ivar end_date: The last date for which usage is included in the UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar price: The total price of the usage in the currency specified in `price_unit` and associated with the account. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format, such as `usd`, `eur`, and `jpy`. + :ivar start_date: The first date for which usage is included in this UsageRecord. The date is specified in GMT and formatted as `YYYY-MM-DD`. + :ivar subresource_uris: A list of related resources identified by their URIs. For more information, see [List Subresources](https://www.twilio.com/docs/usage/api/usage-record#list-subresources). + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar usage: The amount used to bill usage and measured in units described in `usage_unit`. + :ivar usage_unit: The units in which `usage` is measured, such as `minutes` for calls or `messages` for SMS. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.as_of: Optional[str] = payload.get("as_of") + self.category: Optional["YesterdayInstance.Category"] = payload.get("category") + self.count: Optional[str] = payload.get("count") + self.count_unit: Optional[str] = payload.get("count_unit") + self.description: Optional[str] = payload.get("description") + self.end_date: Optional[date] = deserialize.iso8601_date( + payload.get("end_date") + ) + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.start_date: Optional[date] = deserialize.iso8601_date( + payload.get("start_date") + ) + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.uri: Optional[str] = payload.get("uri") + self.usage: Optional[str] = payload.get("usage") + self.usage_unit: Optional[str] = payload.get("usage_unit") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class YesterdayPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> YesterdayInstance: + """ + Build an instance of YesterdayInstance + + :param payload: Payload response from the API + """ + return YesterdayInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class YesterdayList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the YesterdayList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageRecord resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Records/Yesterday.json".format( + **self._solution + ) + + def stream( + self, + category: Union["YesterdayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[YesterdayInstance]: + """ + Streams YesterdayInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "YesterdayInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + category: Union["YesterdayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[YesterdayInstance]: + """ + Asynchronously streams YesterdayInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "YesterdayInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + category: Union["YesterdayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[YesterdayInstance]: + """ + Lists YesterdayInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "YesterdayInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + category: Union["YesterdayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[YesterdayInstance]: + """ + Asynchronously lists YesterdayInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "YesterdayInstance.Category" category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param bool include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + category=category, + start_date=start_date, + end_date=end_date, + include_subaccounts=include_subaccounts, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + category: Union["YesterdayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> YesterdayPage: + """ + Retrieve a single page of YesterdayInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of YesterdayInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return YesterdayPage(self._version, response, self._solution) + + async def page_async( + self, + category: Union["YesterdayInstance.Category", object] = values.unset, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + include_subaccounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> YesterdayPage: + """ + Asynchronously retrieve a single page of YesterdayInstance records from the API. + Request is executed immediately + + :param category: The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + :param include_subaccounts: Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of YesterdayInstance + """ + data = values.of( + { + "Category": category, + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "IncludeSubaccounts": serialize.boolean_to_string(include_subaccounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return YesterdayPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> YesterdayPage: + """ + Retrieve a specific page of YesterdayInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of YesterdayInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return YesterdayPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> YesterdayPage: + """ + Asynchronously retrieve a specific page of YesterdayInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of YesterdayInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return YesterdayPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/trigger.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/trigger.py new file mode 100644 index 00000000..7f182a01 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/usage/trigger.py @@ -0,0 +1,1611 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class TriggerInstance(InstanceResource): + + class Recurring(object): + DAILY = "daily" + MONTHLY = "monthly" + YEARLY = "yearly" + ALLTIME = "alltime" + + class TriggerField(object): + COUNT = "count" + USAGE = "usage" + PRICE = "price" + + class UsageCategory(object): + A2P_10DLC_REGISTRATIONFEES_BRANDREGISTRATION = ( + "a2p-10dlc-registrationfees-brandregistration" + ) + A2P_10DLC_REGISTRATIONFEES_BV = "a2p-10dlc-registrationfees-bv" + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNCHARGES = ( + "a2p-10dlc-registrationfees-campaigncharges" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNREGISTRATION = ( + "a2p-10dlc-registrationfees-campaignregistration" + ) + A2P_10DLC_REGISTRATIONFEES_CAMPAIGNVETTING = ( + "a2p-10dlc-registrationfees-campaignvetting" + ) + A2P_10DLC_REGISTRATIONFEES_MONTHLY = "a2p-10dlc-registrationfees-monthly" + A2P_10DLC_REGISTRATIONFEES_ONETIME = "a2p-10dlc-registrationfees-onetime" + A2P_REGISTRATION_FEES = "a2p-registration-fees" + ACCOUNT_SECURITY = "account-security" + AGENT_CONFERENCE = "agent-conference" + AGENT_COPILOT = "agent-copilot" + AGENT_COPILOT_MESSAGES = "agent-copilot-messages" + AGENT_COPILOT_PARTICIPANT_MINUTES = "agent-copilot-participant-minutes" + AI_ASSISTANTS = "ai-assistants" + AI_ASSISTANTS_VOICE = "ai-assistants-voice" + AMAZON_POLLY = "amazon-polly" + ANSWERING_MACHINE_DETECTION = "answering-machine-detection" + ASSETS = "assets" + AUDIENCE_MINUTES = "audience-minutes" + AUDIENCE_MINUTES_AUDIO = "audience-minutes-audio" + AUTHY_AUTHENTICATIONS = "authy-authentications" + AUTHY_CALLS_OUTBOUND = "authy-calls-outbound" + AUTHY_EMAIL_AUTHENTICATIONS = "authy-email-authentications" + AUTHY_MONTHLY_FEES = "authy-monthly-fees" + AUTHY_OUTBOUND_EMAIL = "authy-outbound-email" + AUTHY_PHONE_INTELLIGENCE = "authy-phone-intelligence" + AUTHY_PHONE_VERIFICATIONS = "authy-phone-verifications" + AUTHY_SMS_OUTBOUND = "authy-sms-outbound" + AUTHY_VERIFY_EMAIL_VERIFICATIONS = "authy-verify-email-verifications" + AUTHY_VERIFY_OUTBOUND_EMAIL = "authy-verify-outbound-email" + AUTOPILOT = "autopilot" + AUTOPILOT_HOME_ASSISTANTS = "autopilot-home-assistants" + AUTOPILOT_MESSAGING = "autopilot-messaging" + AUTOPILOT_OTHER = "autopilot-other" + AUTOPILOT_VOICE = "autopilot-voice" + BASIC_PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "basic-peer-to-peer-rooms-participant-minutes" + ) + BRANDED_CALLING = "branded-calling" + BUNDLE_SMS_BUCKET = "bundle-sms-bucket" + BUNDLE_SUBSCRIPTION_FEES = "bundle-subscription-fees" + CALL_FORWARDING_LOOKUPS = "call-forwarding-lookups" + CALL_PROGESS_EVENTS = "call-progess-events" + CALLERIDLOOKUPS = "calleridlookups" + CALLS = "calls" + CALLS_CLIENT = "calls-client" + CALLS_EMERGENCY = "calls-emergency" + CALLS_GLOBALCONFERENCE = "calls-globalconference" + CALLS_INBOUND = "calls-inbound" + CALLS_INBOUND_LOCAL = "calls-inbound-local" + CALLS_INBOUND_MOBILE = "calls-inbound-mobile" + CALLS_INBOUND_TOLLFREE = "calls-inbound-tollfree" + CALLS_INBOUND_TOLLFREE_LOCAL = "calls-inbound-tollfree-local" + CALLS_INBOUND_TOLLFREE_MOBILE = "calls-inbound-tollfree-mobile" + CALLS_MEDIA_STREAM_MINUTES = "calls-media-stream-minutes" + CALLS_OUTBOUND = "calls-outbound" + CALLS_PAY_VERB_TRANSACTIONS = "calls-pay-verb-transactions" + CALLS_RECORDINGS = "calls-recordings" + CALLS_SIP = "calls-sip" + CALLS_SIP_INBOUND = "calls-sip-inbound" + CALLS_SIP_OUTBOUND = "calls-sip-outbound" + CALLS_TEXT_TO_SPEECH = "calls-text-to-speech" + CALLS_TRANSFERS = "calls-transfers" + CARRIER_LOOKUPS = "carrier-lookups" + CATEGORY = "category" + CHANNELS = "channels" + CHANNELS_MESSAGING = "channels-messaging" + CHANNELS_MESSAGING_INBOUND = "channels-messaging-inbound" + CHANNELS_MESSAGING_OUTBOUND = "channels-messaging-outbound" + CHANNELS_WHATSAPP = "channels-whatsapp" + CHANNELS_WHATSAPP_CONVERSATION_AUTHENTICATION = ( + "channels-whatsapp-conversation-authentication" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE = "channels-whatsapp-conversation-free" + CHANNELS_WHATSAPP_CONVERSATION_MARKETING = ( + "channels-whatsapp-conversation-marketing" + ) + CHANNELS_WHATSAPP_CONVERSATION_SERVICE = ( + "channels-whatsapp-conversation-service" + ) + CHANNELS_WHATSAPP_CONVERSATION_UTILITY = ( + "channels-whatsapp-conversation-utility" + ) + CHANNELS_WHATSAPP_INBOUND = "channels-whatsapp-inbound" + CHANNELS_WHATSAPP_OUTBOUND = "channels-whatsapp-outbound" + CHAT_VIRTUAL_AGENT = "chat-virtual-agent" + CONVERSATION_RELAY = "conversation-relay" + CONVERSATIONS = "conversations" + CONVERSATIONS_API_REQUESTS = "conversations-api-requests" + CONVERSATIONS_CONVERSATION_EVENTS = "conversations-conversation-events" + CONVERSATIONS_ENDPOINT_CONNECTIVITY = "conversations-endpoint-connectivity" + CONVERSATIONS_EVENTS = "conversations-events" + CONVERSATIONS_PARTICIPANT_EVENTS = "conversations-participant-events" + CONVERSATIONS_PARTICIPANTS = "conversations-participants" + CPS = "cps" + CREDIT_TRANSFER = "credit-transfer" + EMAIL = "email" + EMERGING_TECH = "emerging-tech" + ENGAGEMENT_SUITE_PACKAGED_PLANS = "engagement-suite-packaged-plans" + ENHANCED_LINE_TYPE_LOOKUPS = "enhanced-line-type-lookups" + ENTERPRISE = "enterprise" + EVENTS = "events" + EXPERIMENT_FRANCE_SMS = "experiment-france-sms" + EXPERIMENT_INDIA_SMS = "experiment-india-sms" + EXPERIMENT_UK_SMS = "experiment-uk-sms" + FAILED_MESSAGE_PROCESSING_FEE = "failed-message-processing-fee" + FLEX = "flex" + FLEX_ACTIVE_USER_HOURS = "flex-active-user-hours" + FLEX_CONCURRENT_USERS = "flex-concurrent-users" + FLEX_CONVERSATIONAL_INSIGHTS = "flex-conversational-insights" + FLEX_CONVERSATIONAL_INSIGHTS_MESSAGES = "flex-conversational-insights-messages" + FLEX_CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = ( + "flex-conversational-insights-voice-minutes" + ) + FLEX_EMAIL_USAGE = "flex-email-usage" + FLEX_MESSAGING_USAGE = "flex-messaging-usage" + FLEX_PARTNER_SPINSCI = "flex-partner-spinsci" + FLEX_PARTNER_XCELERATE = "flex-partner-xcelerate" + FLEX_RESELLER_ECOSYSTEM = "flex-reseller-ecosystem" + FLEX_UNIQUE_USER = "flex-unique-user" + FLEX_USAGE = "flex-usage" + FLEX_USERS = "flex-users" + FLEX_VOICE_MINUTE = "flex-voice-minute" + FLEX_YTICA = "flex-ytica" + FRAUD_LOOKUPS = "fraud-lookups" + FRONTLINE = "frontline" + FRONTLINE_USERS = "frontline-users" + FUNCTIONS = "functions" + GENERIC_PAY_TRANSACTIONS = "generic-pay-transactions" + GROUP_ROOMS = "group-rooms" + GROUP_ROOMS_DATA_TRACK = "group-rooms-data-track" + GROUP_ROOMS_ENCRYPTED_MEDIA_RECORDED = "group-rooms-encrypted-media-recorded" + GROUP_ROOMS_MEDIA_DOWNLOADED = "group-rooms-media-downloaded" + GROUP_ROOMS_MEDIA_RECORDED = "group-rooms-media-recorded" + GROUP_ROOMS_MEDIA_ROUTED = "group-rooms-media-routed" + GROUP_ROOMS_MEDIA_STORED = "group-rooms-media-stored" + GROUP_ROOMS_PARTICIPANT_MINUTES = "group-rooms-participant-minutes" + GROUP_ROOMS_RECORDED_MINUTES = "group-rooms-recorded-minutes" + IP_MESSAGING = "ip-messaging" + IP_MESSAGING_COMMANDS = "ip-messaging-commands" + IP_MESSAGING_DATA_STORAGE = "ip-messaging-data-storage" + IP_MESSAGING_DATA_TRANSFER = "ip-messaging-data-transfer" + IP_MESSAGING_ENDPOINT_CONNECTIVITY = "ip-messaging-endpoint-connectivity" + IVR_VIRTUAL_AGENT_CUSTOM_VOICES = "ivr-virtual-agent-custom-voices" + IVR_VIRTUAL_AGENT_GENAI = "ivr-virtual-agent-genai" + LINE_STATUS_LOOKUPS = "line-status-lookups" + LIVE_ACTIVITY_LOOKUPS = "live-activity-lookups" + LOOKUP_BUCKET_ADJUSTMENT = "lookup-bucket-adjustment" + LOOKUP_IDENTITY_MATCH = "lookup-identity-match" + LOOKUPS = "lookups" + MARKETPLACE = "marketplace" + MARKETPLACE_ALGORITHMIA_NAMED_ENTITY_RECOGNITION = ( + "marketplace-algorithmia-named-entity-recognition" + ) + MARKETPLACE_CADENCE_TRANSCRIPTION = "marketplace-cadence-transcription" + MARKETPLACE_CADENCE_TRANSLATION = "marketplace-cadence-translation" + MARKETPLACE_CAPIO_SPEECH_TO_TEXT = "marketplace-capio-speech-to-text" + MARKETPLACE_CONVRIZA_ABABA = "marketplace-convriza-ababa" + MARKETPLACE_DEEPGRAM_PHRASE_DETECTOR = "marketplace-deepgram-phrase-detector" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION = "marketplace-deepgram-transcription" + MARKETPLACE_DEEPGRAM_TRANSCRIPTION_BASE = ( + "marketplace-deepgram-transcription-base" + ) + MARKETPLACE_DEEPGRAM_TRANSSCRIPTION_ENHANCED = ( + "marketplace-deepgram-transscription-enhanced" + ) + MARKETPLACE_DIGITAL_SEGMENT_BUSINESS_INFO = ( + "marketplace-digital-segment-business-info" + ) + MARKETPLACE_FACEBOOK_OFFLINE_CONVERSIONS = ( + "marketplace-facebook-offline-conversions" + ) + MARKETPLACE_GOOGLE_SPEECH_TO_TEXT = "marketplace-google-speech-to-text" + MARKETPLACE_IBM_WATSON_MESSAGE_INSIGHTS = ( + "marketplace-ibm-watson-message-insights" + ) + MARKETPLACE_IBM_WATSON_MESSAGE_SENTIMENT = ( + "marketplace-ibm-watson-message-sentiment" + ) + MARKETPLACE_IBM_WATSON_RECORDING_ANALYSIS = ( + "marketplace-ibm-watson-recording-analysis" + ) + MARKETPLACE_IBM_WATSON_TONE_ANALYZER = "marketplace-ibm-watson-tone-analyzer" + MARKETPLACE_ICEHOOK_SYSTEMS_SCOUT = "marketplace-icehook-systems-scout" + MARKETPLACE_INFOGROUP_DATAAXLE_BIZINFO = ( + "marketplace-infogroup-dataaxle-bizinfo" + ) + MARKETPLACE_KEEN_IO_CONTACT_CENTER_ANALYTICS = ( + "marketplace-keen-io-contact-center-analytics" + ) + MARKETPLACE_MARCHEX_CLEANCALL = "marketplace-marchex-cleancall" + MARKETPLACE_MARCHEX_RECORDING_ANALYSIS = ( + "marketplace-marchex-recording-analysis" + ) + MARKETPLACE_MARCHEX_SENTIMENT_ANALYSIS_FOR_SMS = ( + "marketplace-marchex-sentiment-analysis-for-sms" + ) + MARKETPLACE_MARKETPLACE_NEXTCALLER_SOCIAL_ID = ( + "marketplace-marketplace-nextcaller-social-id" + ) + MARKETPLACE_MOBILE_COMMONS_OPT_OUT_CLASSIFIER = ( + "marketplace-mobile-commons-opt-out-classifier" + ) + MARKETPLACE_NEXIWAVE_VOICEMAIL_TO_TEXT = ( + "marketplace-nexiwave-voicemail-to-text" + ) + MARKETPLACE_NEXTCALLER_ADVANCED_CALLER_IDENTIFICATION = ( + "marketplace-nextcaller-advanced-caller-identification" + ) + MARKETPLACE_NOMOROBO_SPAM_SCORE = "marketplace-nomorobo-spam-score" + MARKETPLACE_PAY_ADDONS = "marketplace-pay-addons" + MARKETPLACE_PAY_ADDONS_BASECOMMERCE_PAY_CONNECTOR = ( + "marketplace-pay-addons-basecommerce-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_BRAINTREE_PAY_CONNECTOR = ( + "marketplace-pay-addons-braintree-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CARDCONNECT_PAY_CONNECTOR = ( + "marketplace-pay-addons-cardconnect-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_CHASE_PAY_CONNECTOR = ( + "marketplace-pay-addons-chase-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplace-pay-addons-shuttle-pay-connector" + ) + MARKETPLACE_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplace-pay-addons-stripe-pay-connector" + ) + MARKETPLACE_PAYFONE_TCPA_COMPLIANCE = "marketplace-payfone-tcpa-compliance" + MARKETPLACE_POLY_AI_CONNECTOR = "marketplace-poly-ai-connector" + MARKETPLACE_REALPHONEVALIDATION = "marketplace-realphonevalidation" + MARKETPLACE_REMEETING_AUTOMATIC_SPEECH_RECOGNITION = ( + "marketplace-remeeting-automatic-speech-recognition" + ) + MARKETPLACE_SPOKE_PHONE_LICENSE_PRO = "marketplace-spoke-phone-license-pro" + MARKETPLACE_SPOKE_PHONE_LICENSE_STANDARD = ( + "marketplace-spoke-phone-license-standard" + ) + MARKETPLACE_TCPA_DEFENSE_SOLUTIONS_BLACKLIST_FEED = ( + "marketplace-tcpa-defense-solutions-blacklist-feed" + ) + MARKETPLACE_TELO_OPENCNAM = "marketplace-telo-opencnam" + MARKETPLACE_TRESTLE_SOLUTIONS_CALLER_IDENTIFICATION = ( + "marketplace-trestle-solutions-caller-identification" + ) + MARKETPLACE_TRUECNAM_TRUE_SPAM = "marketplace-truecnam-true-spam" + MARKETPLACE_TWILIO_CALLER_NAME_LOOKUP_US = ( + "marketplace-twilio-caller-name-lookup-us" + ) + MARKETPLACE_TWILIO_CARRIER_INFORMATION_LOOKUP = ( + "marketplace-twilio-carrier-information-lookup" + ) + MARKETPLACE_VOICEBASE_PCI = "marketplace-voicebase-pci" + MARKETPLACE_VOICEBASE_TRANSCRIPTION = "marketplace-voicebase-transcription" + MARKETPLACE_VOICEBASE_TRANSCRIPTION_CUSTOM_VOCABULARY = ( + "marketplace-voicebase-transcription-custom-vocabulary" + ) + MARKETPLACE_WEB_PURIFY_PROFANITY_FILTER = ( + "marketplace-web-purify-profanity-filter" + ) + MARKETPLACE_WHITEPAGES_PRO_CALLER_IDENTIFICATION = ( + "marketplace-whitepages-pro-caller-identification" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_INTELLIGENCE = ( + "marketplace-whitepages-pro-phone-intelligence" + ) + MARKETPLACE_WHITEPAGES_PRO_PHONE_REPUTATION = ( + "marketplace-whitepages-pro-phone-reputation" + ) + MARKETPLACE_WOLFARM_SPOKEN_RESULTS = "marketplace-wolfarm-spoken-results" + MARKETPLACE_WOLFRAM_SHORT_ANSWER = "marketplace-wolfram-short-answer" + MARKETPLACE_YTICA_CONTACT_CENTER_REPORTING_ANALYTICS = ( + "marketplace-ytica-contact-center-reporting-analytics" + ) + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR = ( + "marketplay-pay-addons-shuttle-pay-connector" + ) + MEDIA_COMPOSER_MINUTES = "media-composer-minutes" + MEDIASTORAGE = "mediastorage" + MIN_SPEND_ADJUSTMENTS = "min-spend-adjustments" + MMS = "mms" + MMS_INBOUND = "mms-inbound" + MMS_INBOUND_LONGCODE = "mms-inbound-longcode" + MMS_INBOUND_SHORTCODE = "mms-inbound-shortcode" + MMS_INBOUND_TOLL_FREE = "mms-inbound-toll-free" + MMS_MESSAGES_CARRIERFEES = "mms-messages-carrierfees" + MMS_OUTBOUND = "mms-outbound" + MMS_OUTBOUND_LONGCODE = "mms-outbound-longcode" + MMS_OUTBOUND_SHORTCODE = "mms-outbound-shortcode" + MMS_OUTBOUND_TOLLFREE = "mms-outbound-tollfree" + MONITOR = "monitor" + MONITOR_READS = "monitor-reads" + MONITOR_STORAGE = "monitor-storage" + MONITOR_WRITES = "monitor-writes" + NOTIFY = "notify" + NOTIFY_ACTIONS_ATTEMPTS = "notify-actions-attempts" + NOTIFY_CHANNELS = "notify-channels" + NUMBER_FORMAT_LOOKUPS = "number-format-lookups" + PCHAT = "pchat" + PCHAT_ACTIONS = "pchat-actions" + PCHAT_APS = "pchat-aps" + PCHAT_CONV_MED_STORAGE = "pchat-conv-med-storage" + PCHAT_MESSAGES = "pchat-messages" + PCHAT_NOTIFICATIONS = "pchat-notifications" + PCHAT_READS = "pchat-reads" + PCHAT_USERS = "pchat-users" + PEER_TO_PEER_ROOMS_PARTICIPANT_MINUTES = ( + "peer-to-peer-rooms-participant-minutes" + ) + PFAX = "pfax" + PFAX_MINUTES = "pfax-minutes" + PFAX_MINUTES_INBOUND = "pfax-minutes-inbound" + PFAX_MINUTES_OUTBOUND = "pfax-minutes-outbound" + PFAX_PAGES = "pfax-pages" + PHONE_QUALITY_SCORE_LOOKUPS = "phone-quality-score-lookups" + PHONENUMBERS = "phonenumbers" + PHONENUMBERS_CPS = "phonenumbers-cps" + PHONENUMBERS_EMERGENCY = "phonenumbers-emergency" + PHONENUMBERS_LOCAL = "phonenumbers-local" + PHONENUMBERS_MOBILE = "phonenumbers-mobile" + PHONENUMBERS_PORTING = "phonenumbers-porting" + PHONENUMBERS_SETUPS = "phonenumbers-setups" + PHONENUMBERS_TOLLFREE = "phonenumbers-tollfree" + PREMIUMSUPPORT = "premiumsupport" + PREMIUMSUPPORT_PERCENTAGE_SPEND = "premiumsupport-percentage-spend" + PROGRAMMABLEVOICE_PLATFORM = "programmablevoice-platform" + PROGRAMMABLEVOICECONN_CLIENTSDK = "programmablevoiceconn-clientsdk" + PROGRAMMABLEVOICECONN_CLIENTSDK_INBOUND = ( + "programmablevoiceconn-clientsdk-inbound" + ) + PROGRAMMABLEVOICECONN_CLIENTSDK_OUTBOUND = ( + "programmablevoiceconn-clientsdk-outbound" + ) + PROGRAMMABLEVOICECONN_ONNET = "programmablevoiceconn-onnet" + PROGRAMMABLEVOICECONN_ONNET_INBOUND = "programmablevoiceconn-onnet-inbound" + PROGRAMMABLEVOICECONN_ONNET_OUTBOUND = "programmablevoiceconn-onnet-outbound" + PROGRAMMABLEVOICECONN_SIP = "programmablevoiceconn-sip" + PROGRAMMABLEVOICECONN_SIP_INBOUND = "programmablevoiceconn-sip-inbound" + PROGRAMMABLEVOICECONN_SIP_OUTBOUND = "programmablevoiceconn-sip-outbound" + PROGRAMMABLEVOICECONNECTIVITY = "programmablevoiceconnectivity" + PROXY = "proxy" + PROXY_ACTIVE_SESSIONS = "proxy-active-sessions" + PROXY_BUCKET_ADJUSTMENT = "proxy-bucket-adjustment" + PROXY_LICENSES = "proxy-licenses" + PSTNCONNECTIVITY = "pstnconnectivity" + PSTNCONNECTIVITY_INBOUND = "pstnconnectivity-inbound" + PSTNCONNECTIVITY_OUTBOUND = "pstnconnectivity-outbound" + PV = "pv" + PV_BASIC_ROOMS = "pv-basic-rooms" + PV_COMPOSITION_MEDIA_DOWNLOADED = "pv-composition-media-downloaded" + PV_COMPOSITION_MEDIA_ENCRYPTED = "pv-composition-media-encrypted" + PV_COMPOSITION_MEDIA_STORED = "pv-composition-media-stored" + PV_COMPOSITION_MINUTES = "pv-composition-minutes" + PV_RECORDING_COMPOSITIONS = "pv-recording-compositions" + PV_ROOM_PARTICIPANTS = "pv-room-participants" + PV_ROOM_PARTICIPANTS_AU1 = "pv-room-participants-au1" + PV_ROOM_PARTICIPANTS_BR1 = "pv-room-participants-br1" + PV_ROOM_PARTICIPANTS_IE1 = "pv-room-participants-ie1" + PV_ROOM_PARTICIPANTS_JP1 = "pv-room-participants-jp1" + PV_ROOM_PARTICIPANTS_SG1 = "pv-room-participants-sg1" + PV_ROOM_PARTICIPANTS_US1 = "pv-room-participants-us1" + PV_ROOM_PARTICIPANTS_US2 = "pv-room-participants-us2" + PV_ROOMS = "pv-rooms" + PV_SIP_ENDPOINT_REGISTRATIONS = "pv-sip-endpoint-registrations" + RCS_MESSAGES = "rcs-messages" + REASSIGNED_NUMBER = "reassigned-number" + RECORDINGS = "recordings" + RECORDINGSTORAGE = "recordingstorage" + SHORTCODES = "shortcodes" + SHORTCODES_CUSTOMEROWNED = "shortcodes-customerowned" + SHORTCODES_MMS_ENABLEMENT = "shortcodes-mms-enablement" + SHORTCODES_MPS = "shortcodes-mps" + SHORTCODES_RANDOM = "shortcodes-random" + SHORTCODES_SETUP_FEES = "shortcodes-setup-fees" + SHORTCODES_UK = "shortcodes-uk" + SHORTCODES_VANITY = "shortcodes-vanity" + SIM_SWAP_LOOKUPS = "sim-swap-lookups" + SIP_SECURE_MEDIA = "sip-secure-media" + SMALL_GROUP_ROOMS = "small-group-rooms" + SMALL_GROUP_ROOMS_DATA_TRACK = "small-group-rooms-data-track" + SMALL_GROUP_ROOMS_PARTICIPANT_MINUTES = "small-group-rooms-participant-minutes" + SMS = "sms" + SMS_INBOUND = "sms-inbound" + SMS_INBOUND_LONGCODE = "sms-inbound-longcode" + SMS_INBOUND_SHORTCODE = "sms-inbound-shortcode" + SMS_INBOUND_TOLLFREE = "sms-inbound-tollfree" + SMS_MESSAGES_CARRIERFEES = "sms-messages-carrierfees" + SMS_MESSAGES_FEATURES = "sms-messages-features" + SMS_MESSAGES_FEATURES_ENGAGEMENT_SUITE = ( + "sms-messages-features-engagement-suite" + ) + SMS_MESSAGES_FEATURES_MESSAGE_REDACTION = ( + "sms-messages-features-message-redaction" + ) + SMS_MESSAGES_FEATURES_SENDERID = "sms-messages-features-senderid" + SMS_MPS = "sms-mps" + SMS_MPS_SHORTCODE = "sms-mps-shortcode" + SMS_MPS_TOLLFREE = "sms-mps-tollfree" + SMS_MPS_TOLLFREE_SETUP = "sms-mps-tollfree-setup" + SMS_NATIONAL_REGULATORY_PROTECTION = "sms-national-regulatory-protection" + SMS_OUTBOUND = "sms-outbound" + SMS_OUTBOUND_CONTENT_INSPECTION = "sms-outbound-content-inspection" + SMS_OUTBOUND_LONGCODE = "sms-outbound-longcode" + SMS_OUTBOUND_SHORTCODE = "sms-outbound-shortcode" + SMS_OUTBOUND_TOLLFREE = "sms-outbound-tollfree" + SMS_PUMPING_PROTECTION = "sms-pumping-protection" + SMS_PUMPING_RISK = "sms-pumping-risk" + SMSMESSAGES_BUCKET_ADJUSTMENTS = "smsmessages-bucket-adjustments" + SMSMESSAGES_OUTBOUND_DOMESTIC = "smsmessages-outbound-domestic" + SPEECH_RECOGNITION = "speech-recognition" + STUDIO_ENGAGEMENTS = "studio-engagements" + SYNC = "sync" + SYNC_ACTIONS = "sync-actions" + SYNC_ENDPOINT_HOURS = "sync-endpoint-hours" + SYNC_ENDPOINT_HOURS_ABOVE_DAILY_CAP = "sync-endpoint-hours-above-daily-cap" + TASKROUTER_TASKS = "taskrouter-tasks" + TOTALPRICE = "totalprice" + TRANSCRIPTIONS = "transcriptions" + TRUNKING_CPS = "trunking-cps" + TRUNKING_EMERGENCY_CALLS = "trunking-emergency-calls" + TRUNKING_ORIGINATION = "trunking-origination" + TRUNKING_ORIGINATION_LOCAL = "trunking-origination-local" + TRUNKING_ORIGINATION_MOBILE = "trunking-origination-mobile" + TRUNKING_ORIGINATION_TOLLFREE = "trunking-origination-tollfree" + TRUNKING_RECORDINGS = "trunking-recordings" + TRUNKING_SECURE = "trunking-secure" + TRUNKING_TERMINATION = "trunking-termination" + TTS_GOOGLE = "tts-google" + TURNMEGABYTES = "turnmegabytes" + TURNMEGABYTES_AUSTRALIA = "turnmegabytes-australia" + TURNMEGABYTES_BRASIL = "turnmegabytes-brasil" + TURNMEGABYTES_GERMANY = "turnmegabytes-germany" + TURNMEGABYTES_INDIA = "turnmegabytes-india" + TURNMEGABYTES_IRELAND = "turnmegabytes-ireland" + TURNMEGABYTES_JAPAN = "turnmegabytes-japan" + TURNMEGABYTES_SINGAPORE = "turnmegabytes-singapore" + TURNMEGABYTES_USEAST = "turnmegabytes-useast" + TURNMEGABYTES_USWEST = "turnmegabytes-uswest" + TWILIO_FOR_SALESFORCE = "twilio-for-salesforce" + TWILIO_FOR_SALESFORCE_LICENSES = "twilio-for-salesforce-licenses" + TWILIO_INTERCONNECT = "twilio-interconnect" + TWIML = "twiml" + USAGE_FLEX_VIDEO = "usage-flex-video" + USAGE_FUNCTIONS = "usage-functions" + USAGE_RCS_BASIC_MESSAGES_OUTBOUND = "usage-rcs-basic-messages-outbound" + USAGE_RCS_MESSAGES = "usage-rcs-messages" + USAGE_RCS_MESSAGES_INBOUND = "usage-rcs-messages-inbound" + USAGE_RCS_MESSAGING_CARRIER_FEES = "usage-rcs-messaging-carrier-fees" + USAGE_RCS_SINGLE_MESSAGES_OUTBOUND = "usage-rcs-single-messages-outbound" + VERIFY_PACKAGE_PLANS = "verify-package-plans" + VERIFY_PUSH = "verify-push" + VERIFY_SNA = "verify-sna" + VERIFY_TOTP = "verify-totp" + VERIFY_VOICE_SMS = "verify-voice-sms" + VERIFY_WHATSAPP_CONVERSATIONS_BUSINESS_INITIATED = ( + "verify-whatsapp-conversations-business-initiated" + ) + VIDEO_RECORDINGS = "video-recordings" + VIDEO_ROOMS_TURN_MEGABYTES = "video-rooms-turn-megabytes" + VIRTUAL_AGENT = "virtual-agent" + VOICE_INSIGHTS = "voice-insights" + VOICE_INSIGHTS_CLIENT_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-client-insights-on-demand-minute" + ) + VOICE_INSIGHTS_PTSN_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-ptsn-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_INTERFACE_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-interface-insights-on-demand-minute" + ) + VOICE_INSIGHTS_SIP_TRUNKING_INSIGHTS_ON_DEMAND_MINUTE = ( + "voice-insights-sip-trunking-insights-on-demand-minute" + ) + VOICE_INTELLIGENCE = "voice-intelligence" + VOICE_INTELLIGENCE_EIP_OPERATORS = "voice-intelligence-eip-operators" + VOICE_INTELLIGENCE_OPERATORS = "voice-intelligence-operators" + VOICE_INTELLIGENCE_TRANSCRIPTION = "voice-intelligence-transcription" + WDS = "wds" + WIRELESS = "wireless" + WIRELESS_DATA = "wireless-data" + WIRELESS_DATA_PAYG = "wireless-data-payg" + WIRELESS_DATA_PAYG_AFRICA = "wireless-data-payg-africa" + WIRELESS_DATA_PAYG_ASIA = "wireless-data-payg-asia" + WIRELESS_DATA_PAYG_CENTRALANDSOUTHAMERICA = ( + "wireless-data-payg-centralandsouthamerica" + ) + WIRELESS_DATA_PAYG_EUROPE = "wireless-data-payg-europe" + WIRELESS_DATA_PAYG_NORTHAMERICA = "wireless-data-payg-northamerica" + WIRELESS_DATA_PAYG_OCEANIA = "wireless-data-payg-oceania" + WIRELESS_DATA_QUOTA1 = "wireless-data-quota1" + WIRELESS_DATA_QUOTA1_AFRICA = "wireless-data-quota1-africa" + WIRELESS_DATA_QUOTA1_ASIA = "wireless-data-quota1-asia" + WIRELESS_DATA_QUOTA1_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota1-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA1_EUROPE = "wireless-data-quota1-europe" + WIRELESS_DATA_QUOTA1_NORTHAMERICA = "wireless-data-quota1-northamerica" + WIRELESS_DATA_QUOTA1_OCEANIA = "wireless-data-quota1-oceania" + WIRELESS_DATA_QUOTA10 = "wireless-data-quota10" + WIRELESS_DATA_QUOTA10_AFRICA = "wireless-data-quota10-africa" + WIRELESS_DATA_QUOTA10_ASIA = "wireless-data-quota10-asia" + WIRELESS_DATA_QUOTA10_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota10-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA10_EUROPE = "wireless-data-quota10-europe" + WIRELESS_DATA_QUOTA10_NORTHAMERICA = "wireless-data-quota10-northamerica" + WIRELESS_DATA_QUOTA10_OCEANIA = "wireless-data-quota10-oceania" + WIRELESS_DATA_QUOTA50 = "wireless-data-quota50" + WIRELESS_DATA_QUOTA50_AFRICA = "wireless-data-quota50-africa" + WIRELESS_DATA_QUOTA50_ASIA = "wireless-data-quota50-asia" + WIRELESS_DATA_QUOTA50_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quota50-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTA50_EUROPE = "wireless-data-quota50-europe" + WIRELESS_DATA_QUOTA50_NORTHAMERICA = "wireless-data-quota50-northamerica" + WIRELESS_DATA_QUOTA50_OCEANIA = "wireless-data-quota50-oceania" + WIRELESS_DATA_QUOTACUSTOM = "wireless-data-quotacustom" + WIRELESS_DATA_QUOTACUSTOM_AFRICA = "wireless-data-quotacustom-africa" + WIRELESS_DATA_QUOTACUSTOM_ASIA = "wireless-data-quotacustom-asia" + WIRELESS_DATA_QUOTACUSTOM_CENTRALANDSOUTHAMERICA = ( + "wireless-data-quotacustom-centralandsouthamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_EUROPE = "wireless-data-quotacustom-europe" + WIRELESS_DATA_QUOTACUSTOM_NORTHAMERICA = ( + "wireless-data-quotacustom-northamerica" + ) + WIRELESS_DATA_QUOTACUSTOM_OCEANIA = "wireless-data-quotacustom-oceania" + WIRELESS_MRC_PAYG = "wireless-mrc-payg" + WIRELESS_MRC_QUOTA1 = "wireless-mrc-quota1" + WIRELESS_MRC_QUOTA10 = "wireless-mrc-quota10" + WIRELESS_MRC_QUOTA50 = "wireless-mrc-quota50" + WIRELESS_MRC_QUOTACUSTOM = "wireless-mrc-quotacustom" + WIRELESS_ORDERS = "wireless-orders" + WIRELESS_ORDERS_ARTWORK = "wireless-orders-artwork" + WIRELESS_ORDERS_BULK = "wireless-orders-bulk" + WIRELESS_ORDERS_ESIM = "wireless-orders-esim" + WIRELESS_ORDERS_STARTER = "wireless-orders-starter" + WIRELESS_QUOTAS = "wireless-quotas" + WIRELESS_SMS_AFRICA = "wireless-sms-africa" + WIRELESS_SMS_ASIA = "wireless-sms-asia" + WIRELESS_SMS_CENTRALANDSOUTHAMERICA = "wireless-sms-centralandsouthamerica" + WIRELESS_SMS_EUROPE = "wireless-sms-europe" + WIRELESS_SMS_NORTHAMERICA = "wireless-sms-northamerica" + WIRELESS_SMS_OCEANIA = "wireless-sms-oceania" + WIRELESS_SUPER_SIM = "wireless-super-sim" + WIRELESS_SUPER_SIM_DATA = "wireless-super-sim-data" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA_USA = ( + "wireless-super-sim-data-north-america-usa" + ) + WIRELESS_SUPER_SIM_DATA_PAYG = "wireless-super-sim-data-payg" + WIRELESS_SUPER_SIM_DATA_PAYG_EUROPE = "wireless-super-sim-data-payg-europe" + WIRELESS_SUPER_SIM_DATA_PAYG_NORTH_AMERICA = ( + "wireless-super-sim-data-payg-north-america" + ) + WIRELESS_SUPER_SIM_HARDWARE = "wireless-super-sim-hardware" + WIRELESS_SUPER_SIM_HARDWARE_BULK = "wireless-super-sim-hardware-bulk" + WIRELESS_SUPER_SIM_SMSCOMMANDS = "wireless-super-sim-smscommands" + WIRELESS_SUPER_SIM_SMSCOMMANDS_AFRICA = "wireless-super-sim-smscommands-africa" + WIRELESS_SUPER_SIM_SMSCOMMANDS_ASIA = "wireless-super-sim-smscommands-asia" + WIRELESS_SUPER_SIM_SMSCOMMANDS_CENT_AND_SOUTH_AMERICA = ( + "wireless-super-sim-smscommands-cent-and-south-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_EUROPE = "wireless-super-sim-smscommands-europe" + WIRELESS_SUPER_SIM_SMSCOMMANDS_NORTH_AMERICA = ( + "wireless-super-sim-smscommands-north-america" + ) + WIRELESS_SUPER_SIM_SMSCOMMANDS_OCEANIA = ( + "wireless-super-sim-smscommands-oceania" + ) + WIRELESS_SUPER_SIM_SUBSCRIPTION = "wireless-super-sim-subscription" + WIRELESS_SUPER_SIM_SUBSCRIPTION_PAYG = "wireless-super-sim-subscription-payg" + WIRELESS_USAGE = "wireless-usage" + WIRELESS_USAGE_COMMANDS = "wireless-usage-commands" + WIRELESS_USAGE_COMMANDS_AFRICA = "wireless-usage-commands-africa" + WIRELESS_USAGE_COMMANDS_ASIA = "wireless-usage-commands-asia" + WIRELESS_USAGE_COMMANDS_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-commands-centralandsouthamerica" + ) + WIRELESS_USAGE_COMMANDS_EUROPE = "wireless-usage-commands-europe" + WIRELESS_USAGE_COMMANDS_HOME = "wireless-usage-commands-home" + WIRELESS_USAGE_COMMANDS_NORTHAMERICA = "wireless-usage-commands-northamerica" + WIRELESS_USAGE_COMMANDS_OCEANIA = "wireless-usage-commands-oceania" + WIRELESS_USAGE_COMMANDS_ROAMING = "wireless-usage-commands-roaming" + WIRELESS_USAGE_DATA = "wireless-usage-data" + WIRELESS_USAGE_DATA_AFRICA = "wireless-usage-data-africa" + WIRELESS_USAGE_DATA_ASIA = "wireless-usage-data-asia" + WIRELESS_USAGE_DATA_CENTRALANDSOUTHAMERICA = ( + "wireless-usage-data-centralandsouthamerica" + ) + WIRELESS_USAGE_DATA_CUSTOM_ADDITIONALMB = ( + "wireless-usage-data-custom-additionalmb" + ) + WIRELESS_USAGE_DATA_CUSTOM_FIRST5MB = "wireless-usage-data-custom-first5mb" + WIRELESS_USAGE_DATA_DOMESTIC_ROAMING = "wireless-usage-data-domestic-roaming" + WIRELESS_USAGE_DATA_EUROPE = "wireless-usage-data-europe" + WIRELESS_USAGE_DATA_INDIVIDUAL_ADDITIONALGB = ( + "wireless-usage-data-individual-additionalgb" + ) + WIRELESS_USAGE_DATA_INDIVIDUAL_FIRSTGB = ( + "wireless-usage-data-individual-firstgb" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_CANADA = ( + "wireless-usage-data-international-roaming-canada" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_INDIA = ( + "wireless-usage-data-international-roaming-india" + ) + WIRELESS_USAGE_DATA_INTERNATIONAL_ROAMING_MEXICO = ( + "wireless-usage-data-international-roaming-mexico" + ) + WIRELESS_USAGE_DATA_NORTHAMERICA = "wireless-usage-data-northamerica" + WIRELESS_USAGE_DATA_OCEANIA = "wireless-usage-data-oceania" + WIRELESS_USAGE_DATA_POOLED = "wireless-usage-data-pooled" + WIRELESS_USAGE_DATA_POOLED_DOWNLINK = "wireless-usage-data-pooled-downlink" + WIRELESS_USAGE_DATA_POOLED_UPLINK = "wireless-usage-data-pooled-uplink" + WIRELESS_USAGE_MRC = "wireless-usage-mrc" + WIRELESS_USAGE_MRC_CUSTOM = "wireless-usage-mrc-custom" + WIRELESS_USAGE_MRC_INDIVIDUAL = "wireless-usage-mrc-individual" + WIRELESS_USAGE_MRC_POOLED = "wireless-usage-mrc-pooled" + WIRELESS_USAGE_MRC_SUSPENDED = "wireless-usage-mrc-suspended" + WIRELESS_USAGE_SMS = "wireless-usage-sms" + WIRELESS_USAGE_VOICE = "wireless-usage-voice" + A2P_FAST_TRACK_ONBOARDING = "a2p-fast-track-onboarding" + ADVISORY_SERVICES = "advisory-services" + ADVISORY_SERVICES_BILLED = "advisory-services-billed" + ADVISORY_SERVICES_CALL_TRACKING = "advisory-services-call-tracking" + ADVISORY_SERVICES_DATA_SERVICES = "advisory-services-data-services" + ADVISORY_SERVICES_EXPENSES = "advisory-services-expenses" + ADVISORY_SERVICES_SIP_TRUNKING = "advisory-services-sip-trunking" + ASSETS_REQUESTS = "assets-requests" + AUDIENCE_MINUTES_VIDEO = "audience-minutes-video" + AUTHY_BUCKET_ADJUSTMENT = "authy-bucket-adjustment" + AUTHY_SOFTWARE = "authy-software" + CALLERIDLOOKUPS_API = "calleridlookups-api" + CALLERIDLOOKUPS_PROGRAMMABLEVOICE = "calleridlookups-programmablevoice" + CALLERIDLOOKUPS_TRUNKING = "calleridlookups-trunking" + CALLS_TRUNKING_INBOUND_TOLLFREE_LOCAL = "calls-trunking-inbound-tollfree-local" + CALLS_TRUNKING_INBOUND_TOLLFREE_MOBILE = ( + "calls-trunking-inbound-tollfree-mobile" + ) + CHANNELS_WHATSAPP_CONVERSATION_FREE_1 = "channels-whatsapp-conversation-free-1" + CONFERENCE = "conference" + CONVERSATIONAL_INSIGHTS = "conversational-insights" + CONVERSATIONAL_INSIGHTS_MESSAGES = "conversational-insights-messages" + CONVERSATIONAL_INSIGHTS_VOICE_MINUTES = "conversational-insights-voice-minutes" + DEMO = "demo" + DEMO_UC_SCRIPT_TEST = "demo-uc-script-test" + ELASTIC_SIP_TRUNKING = "elastic-sip-trunking" + ELASTIC_SIP_TRUNKING_CALL_TRANSFERS = "elastic-sip-trunking-call-transfers" + ENTERPRISE_HIPPA = "enterprise-hippa" + FLEX_NAMED_USERS = "flex-named-users" + FLEX_SPINSCI = "flex-spinsci" + FLEX_USERS_1 = "flex-users-1" + FLEX_WFO_PREMIUM_SPEECH_ANALYTICS = "flex-wfo-premium-speech-analytics" + FLEX_XCELERATE = "flex-xcelerate" + FUNCTIONS_ROLLUP = "functions-rollup" + IMP_V1_USAGE = "imp-v1-usage" + IP_MESSAGING_ADDONS = "ip-messaging-addons" + IVR = "ivr" + IVR_CONVERSATIONAL = "ivr-conversational" + IVR_DTMF = "ivr-dtmf" + IVR_VIRTUALAGENT = "ivr-virtualagent" + LIVE = "live" + LIVE_MEDIA_RECORDING_MINUTES = "live-media-recording-minutes" + LONGCODE_MPS = "longcode-mps" + MARKETPLACE_ANALYTICS_ADDONS = "marketplace-analytics-addons" + MARKETPLACE_ISV_ADDONS = "marketplace-isv-addons" + MARKETPLACE_MESSAGING_ADDONS = "marketplace-messaging-addons" + MARKETPLACE_PHONENUMBERS_ADDONS = "marketplace-phonenumbers-addons" + MARKETPLACE_RECORDING_ADDONS = "marketplace-recording-addons" + MARKETPLACE_VIRTUALAGENT_ADDONS = "marketplace-virtualagent-addons" + MARKETPLAY_PAY_ADDONS_SHUTTLE_PAY_CONNECTOR_1 = ( + "marketplay-pay-addons-shuttle-pay-connector-1" + ) + MARKETPLAY_PAY_ADDONS_STRIPE_PAY_CONNECTOR = ( + "marketplay-pay-addons-stripe-pay-connector" + ) + MMS_INBOUND_LONGCODE_CANADA = "mms-inbound-longcode-canada" + MMS_INBOUND_LONGCODE_UNITEDSTATES = "mms-inbound-longcode-unitedstates" + MMS_OUTBOUND_LONGCODE_CANADA = "mms-outbound-longcode-canada" + MMS_OUTBOUND_LONGCODE_UNITEDSTATES = "mms-outbound-longcode-unitedstates" + MMS_OUTBOUND_TOLL_FREE = "mms-outbound-toll-free" + NOTIFY_CHATAPPSANDOTHERCHANNELS = "notify-chatappsandotherchannels" + NOTIFY_NOTIFYSERVICES = "notify-notifyservices" + NOTIFY_PUSHNOTIFICATIONS = "notify-pushnotifications" + PAYMENT_GATEWAY_CONNECTORS = "payment-gateway-connectors" + PAYMENT_SOLUTIONS = "payment-solutions" + PCHAT_BUCKET_ADJUSTMENT = "pchat-bucket-adjustment" + PHONENUMBERS_NUMBERS = "phonenumbers-numbers" + PROG_VOICE_CLIENT_ANDROID = "prog-voice-client-android" + PROG_VOICE_CLIENT_ANDROID_INBOUND = "prog-voice-client-android-inbound" + PROG_VOICE_CLIENT_ANDROID_OUTBOUND = "prog-voice-client-android-outbound" + PROG_VOICE_CLIENT_IOS = "prog-voice-client-ios" + PROG_VOICE_CLIENT_IOS_INBOUND = "prog-voice-client-ios-inbound" + PROG_VOICE_CLIENT_IOS_OUTBOUND = "prog-voice-client-ios-outbound" + PROG_VOICE_CLIENT_SDK = "prog-voice-client-sdk" + PROG_VOICE_CLIENT_WEB = "prog-voice-client-web" + PROG_VOICE_CLIENT_WEB_INBOUND = "prog-voice-client-web-inbound" + PROG_VOICE_CLIENT_WEB_OUTBOUND = "prog-voice-client-web-outbound" + PROGRAMMABLEVOICECONNECTIVITY_MEDIA_STREAMS = ( + "programmablevoiceconnectivity-media-streams" + ) + PSTNCONNECTIVITY_BYOC = "pstnconnectivity-byoc" + PSTNCONNECTIVITY_EMERGENCY = "pstnconnectivity-emergency" + PSTNCONNECTIVITY_MINUTES = "pstnconnectivity-minutes" + PSTNCONNECTIVITY_MINUTES_1 = "pstnconnectivity-minutes-1" + PSTNCONNECTIVITY_MINUTESINBOUNDLOCAL = "pstnconnectivity-minutesinboundlocal" + PSTNCONNECTIVITY_MINUTESINBOUNDMOBILE = "pstnconnectivity-minutesinboundmobile" + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREE = ( + "pstnconnectivity-minutesinboundtollfree" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREELOCAL = ( + "pstnconnectivity-minutesinboundtollfreelocal" + ) + PSTNCONNECTIVITY_MINUTESINBOUNDTOLLFREEMOBILE = ( + "pstnconnectivity-minutesinboundtollfreemobile" + ) + PV_ROOM_HOURS = "pv-room-hours" + PV_ROOM_SIMULTANEOUS_PARTICIPANT_CONNECTIONS = ( + "pv-room-simultaneous-participant-connections" + ) + PVIDEO_ROOM_HOURS_AU1 = "pvideo-room-hours-au1" + PVIDEO_ROOM_HOURS_BR1 = "pvideo-room-hours-br1" + PVIDEO_ROOM_HOURS_IE1 = "pvideo-room-hours-ie1" + PVIDEO_ROOM_HOURS_JP1 = "pvideo-room-hours-jp1" + PVIDEO_ROOM_HOURS_SG1 = "pvideo-room-hours-sg1" + PVIDEO_ROOM_HOURS_US1 = "pvideo-room-hours-us1" + PVIDEO_ROOM_HOURS_US2 = "pvideo-room-hours-us2" + RECORDINGS_ENCRYPTED = "recordings-encrypted" + SHORT_CODE_SETUP_FEES = "short-code-setup-fees" + SHORTCODES_MESSAGES_INBOUND = "shortcodes-messages-inbound" + SHORTCODES_MESSAGES_OUTBOUND = "shortcodes-messages-outbound" + SMS_MESSAGES_REGISTRATIONFEES = "sms-messages-registrationfees" + SMS_MMS_PENALTY_FEES = "sms-mms-penalty-fees" + SMS_MMS_PENALTY_FEES_1 = "sms-mms-penalty-fees-1" + SMS_PUMPING_PROTECTION_NON_USCA = "sms-pumping-protection-non-usca" + SMS_PUMPING_PROTECTION_USCA = "sms-pumping-protection-usca" + STUDIO = "studio" + STUDIO_MONTHLY_FEES = "studio-monthly-fees" + SUPERSIM = "supersim" + TASK_ROUTER = "task-router" + TASK_ROUTER_WORKERS = "task-router-workers" + TEST_QUOTA_BUCKETS = "test-quota-buckets" + TEST_UC_SCRIPT_1 = "test-uc-script-1" + TEST_UC_SCRIPT_DEMO_2 = "test-uc-script-demo-2" + TEXT_TO_SPEECH = "text-to-speech" + TME = "tme" + TTS_BASIC = "tts-basic" + TWILIO_EDITIONS = "twilio-editions" + TWILIO_INTERCONNECT_CALIFORNIA = "twilio-interconnect-california" + TWILIO_INTERCONNECT_CALIFORNIA_MONTHLY = ( + "twilio-interconnect-california-monthly" + ) + TWILIO_INTERCONNECT_CALIFORNIA_SETUP = "twilio-interconnect-california-setup" + TWILIO_INTERCONNECT_FRANKFURT = "twilio-interconnect-frankfurt" + TWILIO_INTERCONNECT_FRANKFURT_MO = "twilio-interconnect-frankfurt-mo" + TWILIO_INTERCONNECT_FRANKFURT_SETUP = "twilio-interconnect-frankfurt-setup" + TWILIO_INTERCONNECT_LONDON = "twilio-interconnect-london" + TWILIO_INTERCONNECT_LONDON_MO = "twilio-interconnect-london-mo" + TWILIO_INTERCONNECT_LONDON_SETUP = "twilio-interconnect-london-setup" + TWILIO_INTERCONNECT_SAO_PAULO = "twilio-interconnect-sao-paulo" + TWILIO_INTERCONNECT_SAO_PAULO_MONTHLY = "twilio-interconnect-sao-paulo-monthly" + TWILIO_INTERCONNECT_SAO_PAULO_SETUP = "twilio-interconnect-sao-paulo-setup" + TWILIO_INTERCONNECT_SINGAPORE = "twilio-interconnect-singapore" + TWILIO_INTERCONNECT_SINGAPORE_MO = "twilio-interconnect-singapore-mo" + TWILIO_INTERCONNECT_SINGAPORE_SETUP = "twilio-interconnect-singapore-setup" + TWILIO_INTERCONNECT_SYDNEY = "twilio-interconnect-sydney" + TWILIO_INTERCONNECT_SYDNEY_MO = "twilio-interconnect-sydney-mo" + TWILIO_INTERCONNECT_SYDNEY_SETUP = "twilio-interconnect-sydney-setup" + TWILIO_INTERCONNECT_TOKYO = "twilio-interconnect-tokyo" + TWILIO_INTERCONNECT_TOKYO_MO = "twilio-interconnect-tokyo-mo" + TWILIO_INTERCONNECT_TOKYO_SETUP = "twilio-interconnect-tokyo-setup" + TWILIO_INTERCONNECT_VA = "twilio-interconnect-va" + TWILIO_INTERCONNECT_VA_MO = "twilio-interconnect-va-mo" + TWILIO_INTERCONNECT_VA_SETUP = "twilio-interconnect-va-setup" + TWIML_VERBS = "twiml-verbs" + TWIML_VERBS_SAY = "twiml-verbs-say" + USAGE_PROGRAMMABLE_MESSAGING_ENGAGEMENT_SUITE = ( + "usage-programmable-messaging-engagement-suite" + ) + USAGE_PROGRAMMABLE_MESSAGING_FEES_SERVICES = ( + "usage-programmable-messaging-fees-services" + ) + VERIFY_OUTBOUND_EMAIL = "verify-outbound-email" + VERIFY_PACKAGED_PLANS = "verify-packaged-plans" + VERIFY_SILENT_NETWORK_AUTH = "verify-silent-network-auth" + VERIFY_VOICE_AND_SMS = "verify-voice-and-sms" + VOICE_INSIGHTS_CLIENT_INSIGHTS_MONTHY_COMMIT = ( + "voice-insights-client-insights-monthy-commit" + ) + WIRELESS_DATA_PAYG_ASIA_AFG = "wireless-data-payg-asia-afg" + WIRELESS_MULTI_IMSI_SIM_COMMANDS = "wireless-multi-imsi-sim-commands" + WIRELESS_MULTI_IMSI_SIM_COMMANDS_USA = "wireless-multi-imsi-sim-commands-usa" + WIRELESS_MULTI_IMSI_SIM_DATA = "wireless-multi-imsi-sim-data" + WIRELESS_MULTI_IMSI_SIM_DATA_EU28 = "wireless-multi-imsi-sim-data-eu28" + WIRELESS_MULTI_IMSI_SIM_DATA_USA = "wireless-multi-imsi-sim-data-usa" + WIRELESS_MULTI_IMSI_SIM_MONTHLY_FEES = "wireless-multi-imsi-sim-monthly-fees" + WIRELESS_MULTI_IMSI_SIM_USAGE = "wireless-multi-imsi-sim-usage" + WIRELESS_SUPER_SIM_DATA_NORTH_AMERICA = "wireless-super-sim-data-north-america" + WIRELESS_SUPER_SIM_USAGE = "wireless-super-sim-usage" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that the trigger monitors. + :ivar api_version: The API version used to create the resource. + :ivar callback_method: The HTTP method we use to call `callback_url`. Can be: `GET` or `POST`. + :ivar callback_url: The URL we call using the `callback_method` when the trigger fires. + :ivar current_value: The current value of the field the trigger is watching. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_fired: The date and time in GMT that the trigger was last fired specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: The string that you assigned to describe the trigger. + :ivar recurring: + :ivar sid: The unique string that that we created to identify the UsageTrigger resource. + :ivar trigger_by: + :ivar trigger_value: The value at which the trigger will fire. Must be a positive, numeric value. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar usage_category: + :ivar usage_record_uri: The URI of the [UsageRecord](https://www.twilio.com/docs/usage/api/usage-record) resource this trigger watches, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.callback_method: Optional[str] = payload.get("callback_method") + self.callback_url: Optional[str] = payload.get("callback_url") + self.current_value: Optional[str] = payload.get("current_value") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_fired: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_fired") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.recurring: Optional["TriggerInstance.Recurring"] = payload.get("recurring") + self.sid: Optional[str] = payload.get("sid") + self.trigger_by: Optional["TriggerInstance.TriggerField"] = payload.get( + "trigger_by" + ) + self.trigger_value: Optional[str] = payload.get("trigger_value") + self.uri: Optional[str] = payload.get("uri") + self.usage_category: Optional["TriggerInstance.UsageCategory"] = payload.get( + "usage_category" + ) + self.usage_record_uri: Optional[str] = payload.get("usage_record_uri") + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[TriggerContext] = None + + @property + def _proxy(self) -> "TriggerContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: TriggerContext for this TriggerInstance + """ + if self._context is None: + self._context = TriggerContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the TriggerInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the TriggerInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "TriggerInstance": + """ + Fetch the TriggerInstance + + + :returns: The fetched TriggerInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "TriggerInstance": + """ + Asynchronous coroutine to fetch the TriggerInstance + + + :returns: The fetched TriggerInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + callback_method: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "TriggerInstance": + """ + Update the TriggerInstance + + :param callback_method: The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + :param callback_url: The URL we should call using `callback_method` when the trigger fires. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated TriggerInstance + """ + return self._proxy.update( + callback_method=callback_method, + callback_url=callback_url, + friendly_name=friendly_name, + ) + + async def update_async( + self, + callback_method: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "TriggerInstance": + """ + Asynchronous coroutine to update the TriggerInstance + + :param callback_method: The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + :param callback_url: The URL we should call using `callback_method` when the trigger fires. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated TriggerInstance + """ + return await self._proxy.update_async( + callback_method=callback_method, + callback_url=callback_url, + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TriggerContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the TriggerContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageTrigger resources to update. + :param sid: The Twilio-provided string that uniquely identifies the UsageTrigger resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Triggers/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the TriggerInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the TriggerInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> TriggerInstance: + """ + Fetch the TriggerInstance + + + :returns: The fetched TriggerInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return TriggerInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> TriggerInstance: + """ + Asynchronous coroutine to fetch the TriggerInstance + + + :returns: The fetched TriggerInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return TriggerInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + callback_method: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> TriggerInstance: + """ + Update the TriggerInstance + + :param callback_method: The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + :param callback_url: The URL we should call using `callback_method` when the trigger fires. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated TriggerInstance + """ + + data = values.of( + { + "CallbackMethod": callback_method, + "CallbackUrl": callback_url, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TriggerInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + callback_method: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> TriggerInstance: + """ + Asynchronous coroutine to update the TriggerInstance + + :param callback_method: The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + :param callback_url: The URL we should call using `callback_method` when the trigger fires. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated TriggerInstance + """ + + data = values.of( + { + "CallbackMethod": callback_method, + "CallbackUrl": callback_url, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TriggerInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TriggerPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> TriggerInstance: + """ + Build an instance of TriggerInstance + + :param payload: Payload response from the API + """ + return TriggerInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class TriggerList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the TriggerList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the UsageTrigger resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Usage/Triggers.json".format( + **self._solution + ) + + def create( + self, + callback_url: str, + trigger_value: str, + usage_category: "TriggerInstance.UsageCategory", + callback_method: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + recurring: Union["TriggerInstance.Recurring", object] = values.unset, + trigger_by: Union["TriggerInstance.TriggerField", object] = values.unset, + ) -> TriggerInstance: + """ + Create the TriggerInstance + + :param callback_url: The URL we should call using `callback_method` when the trigger fires. + :param trigger_value: The usage value at which the trigger should fire. For convenience, you can use an offset value such as `+30` to specify a trigger_value that is 30 units more than the current usage value. Be sure to urlencode a `+` as `%2B`. + :param usage_category: + :param callback_method: The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param recurring: + :param trigger_by: + + :returns: The created TriggerInstance + """ + + data = values.of( + { + "CallbackUrl": callback_url, + "TriggerValue": trigger_value, + "UsageCategory": usage_category, + "CallbackMethod": callback_method, + "FriendlyName": friendly_name, + "Recurring": recurring, + "TriggerBy": trigger_by, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TriggerInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + callback_url: str, + trigger_value: str, + usage_category: "TriggerInstance.UsageCategory", + callback_method: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + recurring: Union["TriggerInstance.Recurring", object] = values.unset, + trigger_by: Union["TriggerInstance.TriggerField", object] = values.unset, + ) -> TriggerInstance: + """ + Asynchronously create the TriggerInstance + + :param callback_url: The URL we should call using `callback_method` when the trigger fires. + :param trigger_value: The usage value at which the trigger should fire. For convenience, you can use an offset value such as `+30` to specify a trigger_value that is 30 units more than the current usage value. Be sure to urlencode a `+` as `%2B`. + :param usage_category: + :param callback_method: The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param recurring: + :param trigger_by: + + :returns: The created TriggerInstance + """ + + data = values.of( + { + "CallbackUrl": callback_url, + "TriggerValue": trigger_value, + "UsageCategory": usage_category, + "CallbackMethod": callback_method, + "FriendlyName": friendly_name, + "Recurring": recurring, + "TriggerBy": trigger_by, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TriggerInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + recurring: Union["TriggerInstance.Recurring", object] = values.unset, + trigger_by: Union["TriggerInstance.TriggerField", object] = values.unset, + usage_category: Union["TriggerInstance.UsageCategory", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[TriggerInstance]: + """ + Streams TriggerInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "TriggerInstance.Recurring" recurring: The frequency of recurring UsageTriggers to read. Can be: `daily`, `monthly`, or `yearly` to read recurring UsageTriggers. An empty value or a value of `alltime` reads non-recurring UsageTriggers. + :param "TriggerInstance.TriggerField" trigger_by: The trigger field of the UsageTriggers to read. Can be: `count`, `usage`, or `price` as described in the [UsageRecords documentation](https://www.twilio.com/docs/usage/api/usage-record#usage-count-price). + :param "TriggerInstance.UsageCategory" usage_category: The usage category of the UsageTriggers to read. Must be a supported [usage categories](https://www.twilio.com/docs/usage/api/usage-record#usage-categories). + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + recurring=recurring, + trigger_by=trigger_by, + usage_category=usage_category, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + recurring: Union["TriggerInstance.Recurring", object] = values.unset, + trigger_by: Union["TriggerInstance.TriggerField", object] = values.unset, + usage_category: Union["TriggerInstance.UsageCategory", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[TriggerInstance]: + """ + Asynchronously streams TriggerInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "TriggerInstance.Recurring" recurring: The frequency of recurring UsageTriggers to read. Can be: `daily`, `monthly`, or `yearly` to read recurring UsageTriggers. An empty value or a value of `alltime` reads non-recurring UsageTriggers. + :param "TriggerInstance.TriggerField" trigger_by: The trigger field of the UsageTriggers to read. Can be: `count`, `usage`, or `price` as described in the [UsageRecords documentation](https://www.twilio.com/docs/usage/api/usage-record#usage-count-price). + :param "TriggerInstance.UsageCategory" usage_category: The usage category of the UsageTriggers to read. Must be a supported [usage categories](https://www.twilio.com/docs/usage/api/usage-record#usage-categories). + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + recurring=recurring, + trigger_by=trigger_by, + usage_category=usage_category, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + recurring: Union["TriggerInstance.Recurring", object] = values.unset, + trigger_by: Union["TriggerInstance.TriggerField", object] = values.unset, + usage_category: Union["TriggerInstance.UsageCategory", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TriggerInstance]: + """ + Lists TriggerInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "TriggerInstance.Recurring" recurring: The frequency of recurring UsageTriggers to read. Can be: `daily`, `monthly`, or `yearly` to read recurring UsageTriggers. An empty value or a value of `alltime` reads non-recurring UsageTriggers. + :param "TriggerInstance.TriggerField" trigger_by: The trigger field of the UsageTriggers to read. Can be: `count`, `usage`, or `price` as described in the [UsageRecords documentation](https://www.twilio.com/docs/usage/api/usage-record#usage-count-price). + :param "TriggerInstance.UsageCategory" usage_category: The usage category of the UsageTriggers to read. Must be a supported [usage categories](https://www.twilio.com/docs/usage/api/usage-record#usage-categories). + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + recurring=recurring, + trigger_by=trigger_by, + usage_category=usage_category, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + recurring: Union["TriggerInstance.Recurring", object] = values.unset, + trigger_by: Union["TriggerInstance.TriggerField", object] = values.unset, + usage_category: Union["TriggerInstance.UsageCategory", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TriggerInstance]: + """ + Asynchronously lists TriggerInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "TriggerInstance.Recurring" recurring: The frequency of recurring UsageTriggers to read. Can be: `daily`, `monthly`, or `yearly` to read recurring UsageTriggers. An empty value or a value of `alltime` reads non-recurring UsageTriggers. + :param "TriggerInstance.TriggerField" trigger_by: The trigger field of the UsageTriggers to read. Can be: `count`, `usage`, or `price` as described in the [UsageRecords documentation](https://www.twilio.com/docs/usage/api/usage-record#usage-count-price). + :param "TriggerInstance.UsageCategory" usage_category: The usage category of the UsageTriggers to read. Must be a supported [usage categories](https://www.twilio.com/docs/usage/api/usage-record#usage-categories). + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + recurring=recurring, + trigger_by=trigger_by, + usage_category=usage_category, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + recurring: Union["TriggerInstance.Recurring", object] = values.unset, + trigger_by: Union["TriggerInstance.TriggerField", object] = values.unset, + usage_category: Union["TriggerInstance.UsageCategory", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TriggerPage: + """ + Retrieve a single page of TriggerInstance records from the API. + Request is executed immediately + + :param recurring: The frequency of recurring UsageTriggers to read. Can be: `daily`, `monthly`, or `yearly` to read recurring UsageTriggers. An empty value or a value of `alltime` reads non-recurring UsageTriggers. + :param trigger_by: The trigger field of the UsageTriggers to read. Can be: `count`, `usage`, or `price` as described in the [UsageRecords documentation](https://www.twilio.com/docs/usage/api/usage-record#usage-count-price). + :param usage_category: The usage category of the UsageTriggers to read. Must be a supported [usage categories](https://www.twilio.com/docs/usage/api/usage-record#usage-categories). + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TriggerInstance + """ + data = values.of( + { + "Recurring": recurring, + "TriggerBy": trigger_by, + "UsageCategory": usage_category, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TriggerPage(self._version, response, self._solution) + + async def page_async( + self, + recurring: Union["TriggerInstance.Recurring", object] = values.unset, + trigger_by: Union["TriggerInstance.TriggerField", object] = values.unset, + usage_category: Union["TriggerInstance.UsageCategory", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TriggerPage: + """ + Asynchronously retrieve a single page of TriggerInstance records from the API. + Request is executed immediately + + :param recurring: The frequency of recurring UsageTriggers to read. Can be: `daily`, `monthly`, or `yearly` to read recurring UsageTriggers. An empty value or a value of `alltime` reads non-recurring UsageTriggers. + :param trigger_by: The trigger field of the UsageTriggers to read. Can be: `count`, `usage`, or `price` as described in the [UsageRecords documentation](https://www.twilio.com/docs/usage/api/usage-record#usage-count-price). + :param usage_category: The usage category of the UsageTriggers to read. Must be a supported [usage categories](https://www.twilio.com/docs/usage/api/usage-record#usage-categories). + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TriggerInstance + """ + data = values.of( + { + "Recurring": recurring, + "TriggerBy": trigger_by, + "UsageCategory": usage_category, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TriggerPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> TriggerPage: + """ + Retrieve a specific page of TriggerInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TriggerInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return TriggerPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> TriggerPage: + """ + Asynchronously retrieve a specific page of TriggerInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TriggerInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return TriggerPage(self._version, response, self._solution) + + def get(self, sid: str) -> TriggerContext: + """ + Constructs a TriggerContext + + :param sid: The Twilio-provided string that uniquely identifies the UsageTrigger resource to update. + """ + return TriggerContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> TriggerContext: + """ + Constructs a TriggerContext + + :param sid: The Twilio-provided string that uniquely identifies the UsageTrigger resource to update. + """ + return TriggerContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/validation_request.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/validation_request.py new file mode 100644 index 00000000..d92f840e --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/validation_request.py @@ -0,0 +1,173 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ValidationRequestInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for the Caller ID. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Caller ID is associated with. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar phone_number: The phone number to verify in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar validation_code: The 6 digit validation code that someone must enter to validate the Caller ID when `phone_number` is called. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.phone_number: Optional[str] = payload.get("phone_number") + self.validation_code: Optional[str] = payload.get("validation_code") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ValidationRequestList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the ValidationRequestList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for the new caller ID resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/OutgoingCallerIds.json".format( + **self._solution + ) + + def create( + self, + phone_number: str, + friendly_name: Union[str, object] = values.unset, + call_delay: Union[int, object] = values.unset, + extension: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + ) -> ValidationRequestInstance: + """ + Create the ValidationRequestInstance + + :param phone_number: The phone number to verify in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :param friendly_name: A descriptive string that you create to describe the new caller ID resource. It can be up to 64 characters long. The default value is a formatted version of the phone number. + :param call_delay: The number of seconds to delay before initiating the verification call. Can be an integer between `0` and `60`, inclusive. The default is `0`. + :param extension: The digits to dial after connecting the verification call. + :param status_callback: The URL we should call using the `status_callback_method` to send status information about the verification process to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`, and the default is `POST`. + + :returns: The created ValidationRequestInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "FriendlyName": friendly_name, + "CallDelay": call_delay, + "Extension": extension, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ValidationRequestInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + phone_number: str, + friendly_name: Union[str, object] = values.unset, + call_delay: Union[int, object] = values.unset, + extension: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + ) -> ValidationRequestInstance: + """ + Asynchronously create the ValidationRequestInstance + + :param phone_number: The phone number to verify in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :param friendly_name: A descriptive string that you create to describe the new caller ID resource. It can be up to 64 characters long. The default value is a formatted version of the phone number. + :param call_delay: The number of seconds to delay before initiating the verification call. Can be an integer between `0` and `60`, inclusive. The default is `0`. + :param extension: The digits to dial after connecting the verification call. + :param status_callback: The URL we should call using the `status_callback_method` to send status information about the verification process to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`, and the default is `POST`. + + :returns: The created ValidationRequestInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "FriendlyName": friendly_name, + "CallDelay": call_delay, + "Extension": extension, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ValidationRequestInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/AssistantsBase.py b/venv/Lib/site-packages/twilio/rest/assistants/AssistantsBase.py new file mode 100644 index 00000000..a9c9e9af --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/AssistantsBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.assistants.v1 import V1 + + +class AssistantsBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Assistants Domain + + :returns: Domain for Assistants + """ + super().__init__(twilio, "https://assistants.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Assistants + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/__init__.py b/venv/Lib/site-packages/twilio/rest/assistants/__init__.py new file mode 100644 index 00000000..889daf9d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/__init__.py @@ -0,0 +1,56 @@ +from warnings import warn + +from twilio.rest.assistants.AssistantsBase import AssistantsBase +from twilio.rest.assistants.v1.assistant import AssistantList +from twilio.rest.assistants.v1.knowledge import KnowledgeList +from twilio.rest.assistants.v1.policy import PolicyList +from twilio.rest.assistants.v1.session import SessionList +from twilio.rest.assistants.v1.tool import ToolList + + +class Assistants(AssistantsBase): + + @property + def assistants(self) -> AssistantList: + warn( + "assistants is deprecated. Use v1.assistants instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.assistants + + @property + def knowledge(self) -> KnowledgeList: + warn( + "knowledge is deprecated. Use v1.knowledge instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.knowledge + + @property + def policies(self) -> PolicyList: + warn( + "policies is deprecated. Use v1.policies instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.policies + + @property + def sessions(self) -> SessionList: + warn( + "sessions is deprecated. Use v1.sessions instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.sessions + + @property + def tools(self) -> ToolList: + warn( + "tools is deprecated. Use v1.tools instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.tools diff --git a/venv/Lib/site-packages/twilio/rest/assistants/__pycache__/AssistantsBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/assistants/__pycache__/AssistantsBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2ed9f3ede0256dc1c70f1aa9c5f6f859965ba74 GIT binary patch literal 2023 zcmahKO>Y}TbauU7ubs~}&?KT%Q>XzSYReL!Dypic4U`C)R1k77M$^siI9|HmH8T@8 zwtUDT5{cBRl@Lm<9IN~i#HAn()ry`F2X2NmqUwn^vuisoMU3q?@B7XBnDLKeV>txt z&d)dNKNtx8CW-z^C&=LvAbZF~736BJ?rRObqH7XQ`Kg9cF%)k2>4sS`6`uAp4Xa{l zNJrO@Yi=VqLydz}?5~n-TZOFsy@pT@c>B21zvGie)}IqD-I~e5<;X6oX+8z=E;jZ3AcVVcznyVcoHZZQhB?Av_y^!jBA-k#8 zV&DnS_Pq{OLM>(*T}sp(mp#JHDIw$(q?e_3-TFU#$5@XY)J8UF#6!C^F+xIq(1smdrx6 z?NdPZP#1kQ5Dk&7Ng;LA>Y{_h9@^Ju{)Zh5kJfo_(1KyBR-s%l)*QFWIIO*_T?L(u zfp=yCc%ZRy*tm>~*(AV7Z$X$(0{XueovDi}>OvKV8C`mS*eh_5<4MC{%9w<_WEf(>+tMNfKowvz zud*zR$dL~028EH%5z+|V4PWA;gnSL}O)O#ZUq_8vWHlK)Tuii8^_iToD8&V1GZGt1 zu7E>*pOAvaCV;Dsd0F*_S<;aNQ&R9gfT!E2XJpcE?YE8)Y`v4n9PjC7dglI>zYuJP zsXn7OnNH{T-~1cFrVg(hEfsQ6h7dP&;MAsQH@#q;$%%|kCO3FZUKLk84NUeg8c785 zcB#~&*<+ldJ$wUN}jx#GmcIn?ey;` W{}`QljNW--&T9Glt49bn<>enkgAWD( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/assistants/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/assistants/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fc55a399347e12d47bc9b3386da442a9342e23e GIT binary patch literal 2583 zcmc&$-EZ4e6u)+y#BsjLRu~g&>o5&1otjcW;zMj&$0RguREP~BS&_UfzAIk+5$<&p zQZb2#N@x<&_SXIj)A&z#X?bC?sDuPO?5z;?vM0{Db{uQ1QJ*#|IX?IIJH8*kbA7IV zu2wYy*N?y4{Cd7X$RF4kU-{S>dEjgji&&CFT*;6m^kqkOb4E`1IY)8xMqc=eQ*et$ zQTTaBbxTG`_ytFE%SKuFMW^CcjjBXs@+q;@O=6X3?olop&!`QxX88#=no_6?I?RK6 zZJBeM2OTfqmpYsRQcaL+Kp=3{^9K&KR%r}qpZkv89mcKlbqZbhUffh~_`ZXFHySpw z@f^r#1KL}J5<{|xA=8{CQRTL5$(zcfINrz$v;b%>g%$;>0;;4?SReGD0h&*tWr0=z zEu_%uu-H^XEm^=0EGdx3ahCj3qN_x{BX^WBGr8Y^ zygz?kCrxE#`{Yy^u{!%L);PHTVtkx48{Gk+TkgV>SL;KWe zDhy{D9=ja(09p77(rSCFq1;~zwMjSdpu(who8xlyXT~QVwP7g6+gGn#xzWB%`C8!j z+I`>d(&bg^1?@id`t57>tv0sBjS&Qr z7oD4T*2bGXBQ+^L&J3%;JXsw~oDlX30>{9Fr6in9Lpze6y@vcrFdNe;osv+b(=uH= zTqb?DuJ5QiI|1P@TBf&qSORRyGgO+;M-WLJM<3AW4b=c@pu|ehoI0mwo9&<-ncV2`ZShS9d zo=WWt5w-*FCQGXDem9BcXvlUB}7?i)K@?}KP;Gh2hW|RD$ukOo* z{F~dK{X^h3%8^1%0Q*z1*VsOfR3o7p38in(Bc&&lo}$iWQ8N#|MQTPo^*0PYBh(Nx zTWQuq6~7JO5aH4BawaPJEiC$}V&0m_k6#W9kHGMBMr`^_6C(a!WKsx)$f2Iyrzi(Q zk%6$09TvY5B0u45b{y`aD0L!JSYIM#up&QGKaRG?1-1Z9JV^OlVD@v8B<+!tf02uO b6aD-L AssistantList: + if self._assistants is None: + self._assistants = AssistantList(self) + return self._assistants + + @property + def knowledge(self) -> KnowledgeList: + if self._knowledge is None: + self._knowledge = KnowledgeList(self) + return self._knowledge + + @property + def policies(self) -> PolicyList: + if self._policies is None: + self._policies = PolicyList(self) + return self._policies + + @property + def sessions(self) -> SessionList: + if self._sessions is None: + self._sessions = SessionList(self) + return self._sessions + + @property + def tools(self) -> ToolList: + if self._tools is None: + self._tools = ToolList(self) + return self._tools + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/assistants/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b20174e4c2ed6ba0dacabe1ba58921244a2a3ecc GIT binary patch literal 3529 zcmd5;-A@!(6u+~d!+rpYRV%VPO02BbT~QJ(ey3PNR5VI?*sQr7b}le=c4s>?tS%De zfuxXV>`Nm_lg9K(!=KU@EGCi(Bu)C%hbFXWYJBQB_s$M$k@l^2c609eymx;0oO|y4 zm`uh9JokV4Vr;aDkY7-!KVgqqy9>-CqLDn&BrRY_r9eI)As;k?rBFV^`H&GVMe-5O zhmB}S&dZ#S7)_;EKF0Z|5ice33C_z#vecY!=6sXUQfke&N+duo5G^)Mv^WdR2gUmN zEww}@ss1Jr5>wzA9Mf&3XlhKkrP|6UD>F-Vn5GQZ&`c>+)_2~wr5n1b98%8Nwr)FW*|CKlw-5f#7*i_a!-if|28HXj z^VbKJb65MbVuFDygXep_-8NL42dU$Z`PP;zS1POwG0Fvz2h+;(RmL2rV)y29CYaTV ze#lD`m>pIe<1T%sQZ^lhX}ZH-rpOm5spWCiFlyP@ubBRf%S;o@s zFYAu38u|p|i5}`!sv?bwInr33en4+UwbYU#0AUR>uST;_hh8yzRzJoKRJ#Wl@!JDKAe- zZQKq;nR;{M)84}8HsB~+?C&2e^fCLUV^#`PQ!lb}Q0`8l%F5NkC4IPH>kd0qQHwX# zQDzq$e%f*tvz^@fo8_wAx%w+-D>Z8iEHe=w>dw}c?Vzxa19?3~UM5IW^KA5)ymM~* z<89C7kCu9l&xD@KJC}|gn+e@-S;`%Sp?T?W4<8O>XF?C+YYOTmH zSIISC9+64%rEgkirdl1p5+=#K7Z26qySzK@I(aG$WCGS!@UyT&o=VmZ7;KzDu|5Rq z#@6>?A_z=8m;4F)TUBn6}qT$5jM6A8fPOIh^W3xq>^cxLv@LVWLX>fn>U#Z>o9 z-~B6q>*2lGdkb>vy`kEMfMg_pMQ%x)ZY}7UHSpU3(w*e1~8zVuJ3>-dT`$ZA=hEi9Ugsz#~$VGJy%^H{h$5S=HgI zOjSlKos~7CrdX^3Z4P>&iZ{6L*(-XG-K$(yi(`73{cFU;_LJfxC40`l0J1~fr=M;F z42>U`rPS-5Lih~c*v8{IMOI^^wTpwxwBa>TR!a=7i5R6NQyVvsPf+?5e1!;$g_j)f z$F5wl;Dg3;YP^wIX*BRNj~gn^Nhfl=y7nQ*bAtWL4cd-n9Y8MWT_#0l7?frtYbR)V z$2iN|p_RZ$B-kA7AAr1`Caa-%I5$^)MPOLnMIz0sfnZpfyZi@%VJ%o!06Jkx&z(Y3 z+BcN`R*{15m|2VPfCNCq==Xwy?$Eb!Z<3vKo{m r>GwcF3ccD*q}?lI{|ec+LQe7ju@&;k3OV{RazyHy+3||Nz-Rmmy~spB literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/__pycache__/policy.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/assistants/v1/__pycache__/policy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e7537f9cb3c13c43ca4ecd27d31296b15c1e57e GIT binary patch literal 15451 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 "AssistantContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AssistantContext for this AssistantInstance + """ + if self._context is None: + self._context = AssistantContext( + self._version, + id=self._solution["id"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AssistantInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AssistantInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AssistantInstance": + """ + Fetch the AssistantInstance + + + :returns: The fetched AssistantInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AssistantInstance": + """ + Asynchronous coroutine to fetch the AssistantInstance + + + :returns: The fetched AssistantInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + assistants_v1_service_update_assistant_request: Union[ + AssistantsV1ServiceUpdateAssistantRequest, object + ] = values.unset, + ) -> "AssistantInstance": + """ + Update the AssistantInstance + + :param assistants_v1_service_update_assistant_request: + + :returns: The updated AssistantInstance + """ + return self._proxy.update( + assistants_v1_service_update_assistant_request=assistants_v1_service_update_assistant_request, + ) + + async def update_async( + self, + assistants_v1_service_update_assistant_request: Union[ + AssistantsV1ServiceUpdateAssistantRequest, object + ] = values.unset, + ) -> "AssistantInstance": + """ + Asynchronous coroutine to update the AssistantInstance + + :param assistants_v1_service_update_assistant_request: + + :returns: The updated AssistantInstance + """ + return await self._proxy.update_async( + assistants_v1_service_update_assistant_request=assistants_v1_service_update_assistant_request, + ) + + @property + def assistants_knowledge(self) -> AssistantsKnowledgeList: + """ + Access the assistants_knowledge + """ + return self._proxy.assistants_knowledge + + @property + def assistants_tools(self) -> AssistantsToolList: + """ + Access the assistants_tools + """ + return self._proxy.assistants_tools + + @property + def feedbacks(self) -> FeedbackList: + """ + Access the feedbacks + """ + return self._proxy.feedbacks + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + return self._proxy.messages + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssistantContext(InstanceContext): + + class AssistantsV1ServiceCreateAssistantRequest(object): + """ + :ivar customer_ai: + :ivar name: The name of the assistant. + :ivar owner: The owner/company of the assistant. + :ivar personality_prompt: The personality prompt to be used for assistant. + :ivar segment_credential: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.customer_ai: Optional[AssistantList.AssistantsV1ServiceCustomerAi] = ( + payload.get("customer_ai") + ) + self.name: Optional[str] = payload.get("name") + self.owner: Optional[str] = payload.get("owner") + self.personality_prompt: Optional[str] = payload.get("personality_prompt") + self.segment_credential: Optional[ + AssistantList.AssistantsV1ServiceSegmentCredential + ] = payload.get("segment_credential") + + def to_dict(self): + return { + "customer_ai": ( + self.customer_ai.to_dict() if self.customer_ai is not None else None + ), + "name": self.name, + "owner": self.owner, + "personality_prompt": self.personality_prompt, + "segment_credential": ( + self.segment_credential.to_dict() + if self.segment_credential is not None + else None + ), + } + + class AssistantsV1ServiceCustomerAi(object): + """ + :ivar perception_engine_enabled: True if the perception engine is enabled. + :ivar personalization_engine_enabled: True if the personalization engine is enabled. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.perception_engine_enabled: Optional[bool] = payload.get( + "perception_engine_enabled" + ) + self.personalization_engine_enabled: Optional[bool] = payload.get( + "personalization_engine_enabled" + ) + + def to_dict(self): + return { + "perception_engine_enabled": self.perception_engine_enabled, + "personalization_engine_enabled": self.personalization_engine_enabled, + } + + class AssistantsV1ServiceSegmentCredential(object): + """ + :ivar profile_api_key: The profile API key. + :ivar space_id: The space ID. + :ivar write_key: The write key. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.profile_api_key: Optional[str] = payload.get("profile_api_key") + self.space_id: Optional[str] = payload.get("space_id") + self.write_key: Optional[str] = payload.get("write_key") + + def to_dict(self): + return { + "profile_api_key": self.profile_api_key, + "space_id": self.space_id, + "write_key": self.write_key, + } + + class AssistantsV1ServiceUpdateAssistantRequest(object): + """ + :ivar customer_ai: + :ivar name: The name of the assistant. + :ivar owner: The owner/company of the assistant. + :ivar personality_prompt: The personality prompt to be used for assistant. + :ivar segment_credential: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.customer_ai: Optional[AssistantList.AssistantsV1ServiceCustomerAi] = ( + payload.get("customer_ai") + ) + self.name: Optional[str] = payload.get("name") + self.owner: Optional[str] = payload.get("owner") + self.personality_prompt: Optional[str] = payload.get("personality_prompt") + self.segment_credential: Optional[ + AssistantList.AssistantsV1ServiceSegmentCredential + ] = payload.get("segment_credential") + + def to_dict(self): + return { + "customer_ai": ( + self.customer_ai.to_dict() if self.customer_ai is not None else None + ), + "name": self.name, + "owner": self.owner, + "personality_prompt": self.personality_prompt, + "segment_credential": ( + self.segment_credential.to_dict() + if self.segment_credential is not None + else None + ), + } + + def __init__(self, version: Version, id: str): + """ + Initialize the AssistantContext + + :param version: Version that contains the resource + :param id: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + self._uri = "/Assistants/{id}".format(**self._solution) + + self._assistants_knowledge: Optional[AssistantsKnowledgeList] = None + self._assistants_tools: Optional[AssistantsToolList] = None + self._feedbacks: Optional[FeedbackList] = None + self._messages: Optional[MessageList] = None + + def delete(self) -> bool: + """ + Deletes the AssistantInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AssistantInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AssistantInstance: + """ + Fetch the AssistantInstance + + + :returns: The fetched AssistantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AssistantInstance( + self._version, + payload, + id=self._solution["id"], + ) + + async def fetch_async(self) -> AssistantInstance: + """ + Asynchronous coroutine to fetch the AssistantInstance + + + :returns: The fetched AssistantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AssistantInstance( + self._version, + payload, + id=self._solution["id"], + ) + + def update( + self, + assistants_v1_service_update_assistant_request: Union[ + AssistantsV1ServiceUpdateAssistantRequest, object + ] = values.unset, + ) -> AssistantInstance: + """ + Update the AssistantInstance + + :param assistants_v1_service_update_assistant_request: + + :returns: The updated AssistantInstance + """ + data = assistants_v1_service_update_assistant_request.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="PUT", uri=self._uri, data=data, headers=headers + ) + + return AssistantInstance(self._version, payload, id=self._solution["id"]) + + async def update_async( + self, + assistants_v1_service_update_assistant_request: Union[ + AssistantsV1ServiceUpdateAssistantRequest, object + ] = values.unset, + ) -> AssistantInstance: + """ + Asynchronous coroutine to update the AssistantInstance + + :param assistants_v1_service_update_assistant_request: + + :returns: The updated AssistantInstance + """ + data = assistants_v1_service_update_assistant_request.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="PUT", uri=self._uri, data=data, headers=headers + ) + + return AssistantInstance(self._version, payload, id=self._solution["id"]) + + @property + def assistants_knowledge(self) -> AssistantsKnowledgeList: + """ + Access the assistants_knowledge + """ + if self._assistants_knowledge is None: + self._assistants_knowledge = AssistantsKnowledgeList( + self._version, + self._solution["id"], + ) + return self._assistants_knowledge + + @property + def assistants_tools(self) -> AssistantsToolList: + """ + Access the assistants_tools + """ + if self._assistants_tools is None: + self._assistants_tools = AssistantsToolList( + self._version, + self._solution["id"], + ) + return self._assistants_tools + + @property + def feedbacks(self) -> FeedbackList: + """ + Access the feedbacks + """ + if self._feedbacks is None: + self._feedbacks = FeedbackList( + self._version, + self._solution["id"], + ) + return self._feedbacks + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + if self._messages is None: + self._messages = MessageList( + self._version, + self._solution["id"], + ) + return self._messages + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssistantPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AssistantInstance: + """ + Build an instance of AssistantInstance + + :param payload: Payload response from the API + """ + return AssistantInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AssistantList(ListResource): + + class AssistantsV1ServiceCreateAssistantRequest(object): + """ + :ivar customer_ai: + :ivar name: The name of the assistant. + :ivar owner: The owner/company of the assistant. + :ivar personality_prompt: The personality prompt to be used for assistant. + :ivar segment_credential: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.customer_ai: Optional[AssistantList.AssistantsV1ServiceCustomerAi] = ( + payload.get("customer_ai") + ) + self.name: Optional[str] = payload.get("name") + self.owner: Optional[str] = payload.get("owner") + self.personality_prompt: Optional[str] = payload.get("personality_prompt") + self.segment_credential: Optional[ + AssistantList.AssistantsV1ServiceSegmentCredential + ] = payload.get("segment_credential") + + def to_dict(self): + return { + "customer_ai": ( + self.customer_ai.to_dict() if self.customer_ai is not None else None + ), + "name": self.name, + "owner": self.owner, + "personality_prompt": self.personality_prompt, + "segment_credential": ( + self.segment_credential.to_dict() + if self.segment_credential is not None + else None + ), + } + + class AssistantsV1ServiceCustomerAi(object): + """ + :ivar perception_engine_enabled: True if the perception engine is enabled. + :ivar personalization_engine_enabled: True if the personalization engine is enabled. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.perception_engine_enabled: Optional[bool] = payload.get( + "perception_engine_enabled" + ) + self.personalization_engine_enabled: Optional[bool] = payload.get( + "personalization_engine_enabled" + ) + + def to_dict(self): + return { + "perception_engine_enabled": self.perception_engine_enabled, + "personalization_engine_enabled": self.personalization_engine_enabled, + } + + class AssistantsV1ServiceSegmentCredential(object): + """ + :ivar profile_api_key: The profile API key. + :ivar space_id: The space ID. + :ivar write_key: The write key. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.profile_api_key: Optional[str] = payload.get("profile_api_key") + self.space_id: Optional[str] = payload.get("space_id") + self.write_key: Optional[str] = payload.get("write_key") + + def to_dict(self): + return { + "profile_api_key": self.profile_api_key, + "space_id": self.space_id, + "write_key": self.write_key, + } + + class AssistantsV1ServiceUpdateAssistantRequest(object): + """ + :ivar customer_ai: + :ivar name: The name of the assistant. + :ivar owner: The owner/company of the assistant. + :ivar personality_prompt: The personality prompt to be used for assistant. + :ivar segment_credential: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.customer_ai: Optional[AssistantList.AssistantsV1ServiceCustomerAi] = ( + payload.get("customer_ai") + ) + self.name: Optional[str] = payload.get("name") + self.owner: Optional[str] = payload.get("owner") + self.personality_prompt: Optional[str] = payload.get("personality_prompt") + self.segment_credential: Optional[ + AssistantList.AssistantsV1ServiceSegmentCredential + ] = payload.get("segment_credential") + + def to_dict(self): + return { + "customer_ai": ( + self.customer_ai.to_dict() if self.customer_ai is not None else None + ), + "name": self.name, + "owner": self.owner, + "personality_prompt": self.personality_prompt, + "segment_credential": ( + self.segment_credential.to_dict() + if self.segment_credential is not None + else None + ), + } + + def __init__(self, version: Version): + """ + Initialize the AssistantList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Assistants" + + def create( + self, + assistants_v1_service_create_assistant_request: AssistantsV1ServiceCreateAssistantRequest, + ) -> AssistantInstance: + """ + Create the AssistantInstance + + :param assistants_v1_service_create_assistant_request: + + :returns: The created AssistantInstance + """ + data = assistants_v1_service_create_assistant_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AssistantInstance(self._version, payload) + + async def create_async( + self, + assistants_v1_service_create_assistant_request: AssistantsV1ServiceCreateAssistantRequest, + ) -> AssistantInstance: + """ + Asynchronously create the AssistantInstance + + :param assistants_v1_service_create_assistant_request: + + :returns: The created AssistantInstance + """ + data = assistants_v1_service_create_assistant_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AssistantInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AssistantInstance]: + """ + Streams AssistantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AssistantInstance]: + """ + Asynchronously streams AssistantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssistantInstance]: + """ + Lists AssistantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssistantInstance]: + """ + Asynchronously lists AssistantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssistantPage: + """ + Retrieve a single page of AssistantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssistantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssistantPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssistantPage: + """ + Asynchronously retrieve a single page of AssistantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssistantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssistantPage(self._version, response) + + def get_page(self, target_url: str) -> AssistantPage: + """ + Retrieve a specific page of AssistantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssistantInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AssistantPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AssistantPage: + """ + Asynchronously retrieve a specific page of AssistantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssistantInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AssistantPage(self._version, response) + + def get(self, id: str) -> AssistantContext: + """ + Constructs a AssistantContext + + :param id: + """ + return AssistantContext(self._version, id=id) + + def __call__(self, id: str) -> AssistantContext: + """ + Constructs a AssistantContext + + :param id: + """ + return AssistantContext(self._version, id=id) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..491c5085cccee75cb129110b9a1134ccaccca479 GIT binary patch literal 38466 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 L9}4u#TK4||_lONz literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/assistants_knowledge.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/assistants_knowledge.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cb85e672b6350501f9aed9648fdab0ae3de3d39 GIT binary patch literal 23386 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/assistants_tool.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/__pycache__/assistants_tool.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fd2f5f26e464bdddde73f381527fd858b2a1d52 GIT binary patch literal 22828 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 R=D3#kcYO`-L!5OA{{)WZHTVDk literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/assistants_knowledge.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/assistants_knowledge.py new file mode 100644 index 00000000..681d7178 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/assistants_knowledge.py @@ -0,0 +1,520 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AssistantsKnowledgeInstance(InstanceResource): + """ + :ivar description: The type of knowledge source. + :ivar id: The description of knowledge. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Knowledge resource. + :ivar knowledge_source_details: The details of the knowledge source based on the type. + :ivar name: The name of the knowledge source. + :ivar status: The status of processing the knowledge source ('QUEUED', 'PROCESSING', 'COMPLETED', 'FAILED') + :ivar type: The type of knowledge source ('Web', 'Database', 'Text', 'File') + :ivar url: The url of the knowledge resource. + :ivar embedding_model: The embedding model to be used for the knowledge source. + :ivar date_created: The date and time in GMT when the Knowledge was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Knowledge was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + assistant_id: str, + id: Optional[str] = None, + ): + super().__init__(version) + + self.description: Optional[str] = payload.get("description") + self.id: Optional[str] = payload.get("id") + self.account_sid: Optional[str] = payload.get("account_sid") + self.knowledge_source_details: Optional[Dict[str, object]] = payload.get( + "knowledge_source_details" + ) + self.name: Optional[str] = payload.get("name") + self.status: Optional[str] = payload.get("status") + self.type: Optional[str] = payload.get("type") + self.url: Optional[str] = payload.get("url") + self.embedding_model: Optional[str] = payload.get("embedding_model") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "assistant_id": assistant_id, + "id": id or self.id, + } + self._context: Optional[AssistantsKnowledgeContext] = None + + @property + def _proxy(self) -> "AssistantsKnowledgeContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AssistantsKnowledgeContext for this AssistantsKnowledgeInstance + """ + if self._context is None: + self._context = AssistantsKnowledgeContext( + self._version, + assistant_id=self._solution["assistant_id"], + id=self._solution["id"], + ) + return self._context + + def create(self) -> "AssistantsKnowledgeInstance": + """ + Create the AssistantsKnowledgeInstance + + + :returns: The created AssistantsKnowledgeInstance + """ + return self._proxy.create() + + async def create_async(self) -> "AssistantsKnowledgeInstance": + """ + Asynchronous coroutine to create the AssistantsKnowledgeInstance + + + :returns: The created AssistantsKnowledgeInstance + """ + return await self._proxy.create_async() + + def delete(self) -> bool: + """ + Deletes the AssistantsKnowledgeInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AssistantsKnowledgeInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssistantsKnowledgeContext(InstanceContext): + + def __init__(self, version: Version, assistant_id: str, id: str): + """ + Initialize the AssistantsKnowledgeContext + + :param version: Version that contains the resource + :param assistant_id: The assistant ID. + :param id: The knowledge ID. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "assistant_id": assistant_id, + "id": id, + } + self._uri = "/Assistants/{assistant_id}/Knowledge/{id}".format(**self._solution) + + def create(self) -> AssistantsKnowledgeInstance: + """ + Create the AssistantsKnowledgeInstance + + + :returns: The created AssistantsKnowledgeInstance + """ + data = values.of({}) + + payload = self._version.create(method="POST", uri=self._uri, data=data) + + return AssistantsKnowledgeInstance( + self._version, + payload, + assistant_id=self._solution["assistant_id"], + id=self._solution["id"], + ) + + async def create_async(self) -> AssistantsKnowledgeInstance: + """ + Asynchronous coroutine to create the AssistantsKnowledgeInstance + + + :returns: The created AssistantsKnowledgeInstance + """ + data = values.of({}) + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data + ) + + return AssistantsKnowledgeInstance( + self._version, + payload, + assistant_id=self._solution["assistant_id"], + id=self._solution["id"], + ) + + def delete(self) -> bool: + """ + Deletes the AssistantsKnowledgeInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AssistantsKnowledgeInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssistantsKnowledgePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AssistantsKnowledgeInstance: + """ + Build an instance of AssistantsKnowledgeInstance + + :param payload: Payload response from the API + """ + return AssistantsKnowledgeInstance( + self._version, payload, assistant_id=self._solution["assistant_id"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AssistantsKnowledgeList(ListResource): + + def __init__(self, version: Version, assistant_id: str): + """ + Initialize the AssistantsKnowledgeList + + :param version: Version that contains the resource + :param assistant_id: The assistant ID. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "assistant_id": assistant_id, + } + self._uri = "/Assistants/{assistant_id}/Knowledge".format(**self._solution) + + def create(self) -> AssistantsKnowledgeInstance: + """ + Create the AssistantsKnowledgeInstance + + + :returns: The created AssistantsKnowledgeInstance + """ + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + payload = self._version.create(method="POST", uri=self._uri, headers=headers) + + return AssistantsKnowledgeInstance( + self._version, payload, assistant_id=self._solution["assistant_id"] + ) + + async def create_async(self) -> AssistantsKnowledgeInstance: + """ + Asynchronously create the AssistantsKnowledgeInstance + + + :returns: The created AssistantsKnowledgeInstance + """ + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + payload = await self._version.create_async( + method="POST", uri=self._uri, headers=headers + ) + + return AssistantsKnowledgeInstance( + self._version, payload, assistant_id=self._solution["assistant_id"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AssistantsKnowledgeInstance]: + """ + Streams AssistantsKnowledgeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AssistantsKnowledgeInstance]: + """ + Asynchronously streams AssistantsKnowledgeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssistantsKnowledgeInstance]: + """ + Lists AssistantsKnowledgeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssistantsKnowledgeInstance]: + """ + Asynchronously lists AssistantsKnowledgeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssistantsKnowledgePage: + """ + Retrieve a single page of AssistantsKnowledgeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssistantsKnowledgeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssistantsKnowledgePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssistantsKnowledgePage: + """ + Asynchronously retrieve a single page of AssistantsKnowledgeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssistantsKnowledgeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssistantsKnowledgePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AssistantsKnowledgePage: + """ + Retrieve a specific page of AssistantsKnowledgeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssistantsKnowledgeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AssistantsKnowledgePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AssistantsKnowledgePage: + """ + Asynchronously retrieve a specific page of AssistantsKnowledgeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssistantsKnowledgeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AssistantsKnowledgePage(self._version, response, self._solution) + + def get(self, id: str) -> AssistantsKnowledgeContext: + """ + Constructs a AssistantsKnowledgeContext + + :param id: The knowledge ID. + """ + return AssistantsKnowledgeContext( + self._version, assistant_id=self._solution["assistant_id"], id=id + ) + + def __call__(self, id: str) -> AssistantsKnowledgeContext: + """ + Constructs a AssistantsKnowledgeContext + + :param id: The knowledge ID. + """ + return AssistantsKnowledgeContext( + self._version, assistant_id=self._solution["assistant_id"], id=id + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/assistants_tool.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/assistants_tool.py new file mode 100644 index 00000000..ed02410d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/assistants_tool.py @@ -0,0 +1,518 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AssistantsToolInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Tool resource. + :ivar description: The description of the tool. + :ivar enabled: True if the tool is enabled. + :ivar id: The tool ID. + :ivar meta: The metadata related to method, url, input_schema to used with the Tool. + :ivar name: The name of the tool. + :ivar requires_auth: The authentication requirement for the tool. + :ivar type: The type of the tool. ('WEBHOOK') + :ivar url: The url of the tool resource. + :ivar date_created: The date and time in GMT when the Tool was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Tool was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + assistant_id: str, + id: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.description: Optional[str] = payload.get("description") + self.enabled: Optional[bool] = payload.get("enabled") + self.id: Optional[str] = payload.get("id") + self.meta: Optional[Dict[str, object]] = payload.get("meta") + self.name: Optional[str] = payload.get("name") + self.requires_auth: Optional[bool] = payload.get("requires_auth") + self.type: Optional[str] = payload.get("type") + self.url: Optional[str] = payload.get("url") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "assistant_id": assistant_id, + "id": id or self.id, + } + self._context: Optional[AssistantsToolContext] = None + + @property + def _proxy(self) -> "AssistantsToolContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AssistantsToolContext for this AssistantsToolInstance + """ + if self._context is None: + self._context = AssistantsToolContext( + self._version, + assistant_id=self._solution["assistant_id"], + id=self._solution["id"], + ) + return self._context + + def create(self) -> "AssistantsToolInstance": + """ + Create the AssistantsToolInstance + + + :returns: The created AssistantsToolInstance + """ + return self._proxy.create() + + async def create_async(self) -> "AssistantsToolInstance": + """ + Asynchronous coroutine to create the AssistantsToolInstance + + + :returns: The created AssistantsToolInstance + """ + return await self._proxy.create_async() + + def delete(self) -> bool: + """ + Deletes the AssistantsToolInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AssistantsToolInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssistantsToolContext(InstanceContext): + + def __init__(self, version: Version, assistant_id: str, id: str): + """ + Initialize the AssistantsToolContext + + :param version: Version that contains the resource + :param assistant_id: The assistant ID. + :param id: The tool ID. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "assistant_id": assistant_id, + "id": id, + } + self._uri = "/Assistants/{assistant_id}/Tools/{id}".format(**self._solution) + + def create(self) -> AssistantsToolInstance: + """ + Create the AssistantsToolInstance + + + :returns: The created AssistantsToolInstance + """ + data = values.of({}) + + payload = self._version.create(method="POST", uri=self._uri, data=data) + + return AssistantsToolInstance( + self._version, + payload, + assistant_id=self._solution["assistant_id"], + id=self._solution["id"], + ) + + async def create_async(self) -> AssistantsToolInstance: + """ + Asynchronous coroutine to create the AssistantsToolInstance + + + :returns: The created AssistantsToolInstance + """ + data = values.of({}) + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data + ) + + return AssistantsToolInstance( + self._version, + payload, + assistant_id=self._solution["assistant_id"], + id=self._solution["id"], + ) + + def delete(self) -> bool: + """ + Deletes the AssistantsToolInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AssistantsToolInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssistantsToolPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AssistantsToolInstance: + """ + Build an instance of AssistantsToolInstance + + :param payload: Payload response from the API + """ + return AssistantsToolInstance( + self._version, payload, assistant_id=self._solution["assistant_id"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AssistantsToolList(ListResource): + + def __init__(self, version: Version, assistant_id: str): + """ + Initialize the AssistantsToolList + + :param version: Version that contains the resource + :param assistant_id: The assistant ID. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "assistant_id": assistant_id, + } + self._uri = "/Assistants/{assistant_id}/Tools".format(**self._solution) + + def create(self) -> AssistantsToolInstance: + """ + Create the AssistantsToolInstance + + + :returns: The created AssistantsToolInstance + """ + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + payload = self._version.create(method="POST", uri=self._uri, headers=headers) + + return AssistantsToolInstance( + self._version, payload, assistant_id=self._solution["assistant_id"] + ) + + async def create_async(self) -> AssistantsToolInstance: + """ + Asynchronously create the AssistantsToolInstance + + + :returns: The created AssistantsToolInstance + """ + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + payload = await self._version.create_async( + method="POST", uri=self._uri, headers=headers + ) + + return AssistantsToolInstance( + self._version, payload, assistant_id=self._solution["assistant_id"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AssistantsToolInstance]: + """ + Streams AssistantsToolInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AssistantsToolInstance]: + """ + Asynchronously streams AssistantsToolInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssistantsToolInstance]: + """ + Lists AssistantsToolInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssistantsToolInstance]: + """ + Asynchronously lists AssistantsToolInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssistantsToolPage: + """ + Retrieve a single page of AssistantsToolInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssistantsToolInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssistantsToolPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssistantsToolPage: + """ + Asynchronously retrieve a single page of AssistantsToolInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssistantsToolInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssistantsToolPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AssistantsToolPage: + """ + Retrieve a specific page of AssistantsToolInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssistantsToolInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AssistantsToolPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AssistantsToolPage: + """ + Asynchronously retrieve a specific page of AssistantsToolInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssistantsToolInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AssistantsToolPage(self._version, response, self._solution) + + def get(self, id: str) -> AssistantsToolContext: + """ + Constructs a AssistantsToolContext + + :param id: The tool ID. + """ + return AssistantsToolContext( + self._version, assistant_id=self._solution["assistant_id"], id=id + ) + + def __call__(self, id: str) -> AssistantsToolContext: + """ + Constructs a AssistantsToolContext + + :param id: The tool ID. + """ + return AssistantsToolContext( + self._version, assistant_id=self._solution["assistant_id"], id=id + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/feedback.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/feedback.py new file mode 100644 index 00000000..77c6d405 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/feedback.py @@ -0,0 +1,404 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class FeedbackInstance(InstanceResource): + + class AssistantsV1ServiceCreateFeedbackRequest(object): + """ + :ivar message_id: The message ID. + :ivar score: The score to be given(0-1). + :ivar session_id: The Session ID. + :ivar text: The text to be given as feedback. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.message_id: Optional[str] = payload.get("message_id") + self.score: Optional[float] = payload.get("score") + self.session_id: Optional[str] = payload.get("session_id") + self.text: Optional[str] = payload.get("text") + + def to_dict(self): + return { + "message_id": self.message_id, + "score": self.score, + "session_id": self.session_id, + "text": self.text, + } + + """ + :ivar assistant_id: The Assistant ID. + :ivar id: The Feedback ID. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Feedback. + :ivar user_sid: The SID of the User created the Feedback. + :ivar message_id: The Message ID. + :ivar score: The Score to provide as Feedback (0-1) + :ivar session_id: The Session ID. + :ivar text: The text to be given as feedback. + :ivar date_created: The date and time in GMT when the Feedback was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Feedback was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], id: str): + super().__init__(version) + + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.id: Optional[str] = payload.get("id") + self.account_sid: Optional[str] = payload.get("account_sid") + self.user_sid: Optional[str] = payload.get("user_sid") + self.message_id: Optional[str] = payload.get("message_id") + self.score: Optional[float] = payload.get("score") + self.session_id: Optional[str] = payload.get("session_id") + self.text: Optional[str] = payload.get("text") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "id": id, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class FeedbackPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> FeedbackInstance: + """ + Build an instance of FeedbackInstance + + :param payload: Payload response from the API + """ + return FeedbackInstance(self._version, payload, id=self._solution["id"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class FeedbackList(ListResource): + + class AssistantsV1ServiceCreateFeedbackRequest(object): + """ + :ivar message_id: The message ID. + :ivar score: The score to be given(0-1). + :ivar session_id: The Session ID. + :ivar text: The text to be given as feedback. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.message_id: Optional[str] = payload.get("message_id") + self.score: Optional[float] = payload.get("score") + self.session_id: Optional[str] = payload.get("session_id") + self.text: Optional[str] = payload.get("text") + + def to_dict(self): + return { + "message_id": self.message_id, + "score": self.score, + "session_id": self.session_id, + "text": self.text, + } + + def __init__(self, version: Version, id: str): + """ + Initialize the FeedbackList + + :param version: Version that contains the resource + :param id: The assistant ID. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + self._uri = "/Assistants/{id}/Feedbacks".format(**self._solution) + + def create( + self, + assistants_v1_service_create_feedback_request: AssistantsV1ServiceCreateFeedbackRequest, + ) -> FeedbackInstance: + """ + Create the FeedbackInstance + + :param assistants_v1_service_create_feedback_request: + + :returns: The created FeedbackInstance + """ + data = assistants_v1_service_create_feedback_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return FeedbackInstance(self._version, payload, id=self._solution["id"]) + + async def create_async( + self, + assistants_v1_service_create_feedback_request: AssistantsV1ServiceCreateFeedbackRequest, + ) -> FeedbackInstance: + """ + Asynchronously create the FeedbackInstance + + :param assistants_v1_service_create_feedback_request: + + :returns: The created FeedbackInstance + """ + data = assistants_v1_service_create_feedback_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return FeedbackInstance(self._version, payload, id=self._solution["id"]) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[FeedbackInstance]: + """ + Streams FeedbackInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[FeedbackInstance]: + """ + Asynchronously streams FeedbackInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[FeedbackInstance]: + """ + Lists FeedbackInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[FeedbackInstance]: + """ + Asynchronously lists FeedbackInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> FeedbackPage: + """ + Retrieve a single page of FeedbackInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of FeedbackInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return FeedbackPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> FeedbackPage: + """ + Asynchronously retrieve a single page of FeedbackInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of FeedbackInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return FeedbackPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> FeedbackPage: + """ + Retrieve a specific page of FeedbackInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of FeedbackInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return FeedbackPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> FeedbackPage: + """ + Asynchronously retrieve a specific page of FeedbackInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of FeedbackInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return FeedbackPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/message.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/message.py new file mode 100644 index 00000000..11d73776 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/assistant/message.py @@ -0,0 +1,186 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class MessageInstance(InstanceResource): + + class AssistantsV1ServiceAssistantSendMessageRequest(object): + """ + :ivar identity: The unique identity of user for the session. + :ivar session_id: The unique name for the session. + :ivar body: The query to ask the assistant. + :ivar webhook: The webhook url to call after the assistant has generated a response or report an error. + :ivar mode: one of the modes 'chat', 'email' or 'voice' + """ + + def __init__(self, payload: Dict[str, Any]): + + self.identity: Optional[str] = payload.get("identity") + self.session_id: Optional[str] = payload.get("session_id") + self.body: Optional[str] = payload.get("body") + self.webhook: Optional[str] = payload.get("webhook") + self.mode: Optional[str] = payload.get("mode") + + def to_dict(self): + return { + "identity": self.identity, + "session_id": self.session_id, + "body": self.body, + "webhook": self.webhook, + "mode": self.mode, + } + + """ + :ivar status: success or failure based on whether the request successfully generated a response. + :ivar flagged: If successful, this property will denote whether the response was flagged or not. + :ivar aborted: This property will denote whether the request was aborted or not. + :ivar session_id: The unique name for the session. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that sent the Message. + :ivar body: If successful, the body of the generated response + :ivar error: The error message if generation was not successful + """ + + def __init__(self, version: Version, payload: Dict[str, Any], id: str): + super().__init__(version) + + self.status: Optional[str] = payload.get("status") + self.flagged: Optional[bool] = payload.get("flagged") + self.aborted: Optional[bool] = payload.get("aborted") + self.session_id: Optional[str] = payload.get("session_id") + self.account_sid: Optional[str] = payload.get("account_sid") + self.body: Optional[str] = payload.get("body") + self.error: Optional[str] = payload.get("error") + + self._solution = { + "id": id, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessageList(ListResource): + + class AssistantsV1ServiceAssistantSendMessageRequest(object): + """ + :ivar identity: The unique identity of user for the session. + :ivar session_id: The unique name for the session. + :ivar body: The query to ask the assistant. + :ivar webhook: The webhook url to call after the assistant has generated a response or report an error. + :ivar mode: one of the modes 'chat', 'email' or 'voice' + """ + + def __init__(self, payload: Dict[str, Any]): + + self.identity: Optional[str] = payload.get("identity") + self.session_id: Optional[str] = payload.get("session_id") + self.body: Optional[str] = payload.get("body") + self.webhook: Optional[str] = payload.get("webhook") + self.mode: Optional[str] = payload.get("mode") + + def to_dict(self): + return { + "identity": self.identity, + "session_id": self.session_id, + "body": self.body, + "webhook": self.webhook, + "mode": self.mode, + } + + def __init__(self, version: Version, id: str): + """ + Initialize the MessageList + + :param version: Version that contains the resource + :param id: the Assistant ID. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + self._uri = "/Assistants/{id}/Messages".format(**self._solution) + + def create( + self, + assistants_v1_service_assistant_send_message_request: AssistantsV1ServiceAssistantSendMessageRequest, + ) -> MessageInstance: + """ + Create the MessageInstance + + :param assistants_v1_service_assistant_send_message_request: + + :returns: The created MessageInstance + """ + data = assistants_v1_service_assistant_send_message_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance(self._version, payload, id=self._solution["id"]) + + async def create_async( + self, + assistants_v1_service_assistant_send_message_request: AssistantsV1ServiceAssistantSendMessageRequest, + ) -> MessageInstance: + """ + Asynchronously create the MessageInstance + + :param assistants_v1_service_assistant_send_message_request: + + :returns: The created MessageInstance + """ + data = assistants_v1_service_assistant_send_message_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance(self._version, payload, id=self._solution["id"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__init__.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__init__.py new file mode 100644 index 00000000..7d616f86 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__init__.py @@ -0,0 +1,962 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.assistants.v1.knowledge.chunk import ChunkList +from twilio.rest.assistants.v1.knowledge.knowledge_status import KnowledgeStatusList + + +class KnowledgeInstance(InstanceResource): + + class AssistantsV1ServiceCreateKnowledgeRequest(object): + """ + :ivar assistant_id: The Assistant ID. + :ivar description: The description of the knowledge source. + :ivar knowledge_source_details: The details of the knowledge source based on the type. + :ivar name: The name of the tool. + :ivar policy: + :ivar type: The type of the knowledge source. + :ivar embedding_model: The embedding model to be used for the knowledge source. It's required for 'Database' type but disallowed for other types. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.description: Optional[str] = payload.get("description") + self.knowledge_source_details: Optional[Dict[str, object]] = payload.get( + "knowledge_source_details" + ) + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ + KnowledgeList.AssistantsV1ServiceCreatePolicyRequest + ] = payload.get("policy") + self.type: Optional[str] = payload.get("type") + self.embedding_model: Optional[str] = payload.get("embedding_model") + + def to_dict(self): + return { + "assistant_id": self.assistant_id, + "description": self.description, + "knowledge_source_details": self.knowledge_source_details, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + "embedding_model": self.embedding_model, + } + + class AssistantsV1ServiceCreatePolicyRequest(object): + """ + :ivar description: The description of the policy. + :ivar id: The Policy ID. + :ivar name: The name of the policy. + :ivar policy_details: + :ivar type: The description of the policy. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.description: Optional[str] = payload.get("description") + self.id: Optional[str] = payload.get("id") + self.name: Optional[str] = payload.get("name") + self.policy_details: Optional[Dict[str, object]] = payload.get( + "policy_details" + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "description": self.description, + "id": self.id, + "name": self.name, + "policy_details": self.policy_details, + "type": self.type, + } + + class AssistantsV1ServiceUpdateKnowledgeRequest(object): + """ + :ivar description: The description of the knowledge source. + :ivar knowledge_source_details: The details of the knowledge source based on the type. + :ivar name: The name of the knowledge source. + :ivar policy: + :ivar type: The description of the knowledge source. + :ivar embedding_model: The embedding model to be used for the knowledge source. It's only applicable to 'Database' type. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.description: Optional[str] = payload.get("description") + self.knowledge_source_details: Optional[Dict[str, object]] = payload.get( + "knowledge_source_details" + ) + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ + KnowledgeList.AssistantsV1ServiceCreatePolicyRequest + ] = payload.get("policy") + self.type: Optional[str] = payload.get("type") + self.embedding_model: Optional[str] = payload.get("embedding_model") + + def to_dict(self): + return { + "description": self.description, + "knowledge_source_details": self.knowledge_source_details, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + "embedding_model": self.embedding_model, + } + + """ + :ivar description: The type of knowledge source. + :ivar id: The description of knowledge. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Knowledge resource. + :ivar knowledge_source_details: The details of the knowledge source based on the type. + :ivar name: The name of the knowledge source. + :ivar status: The status of processing the knowledge source ('QUEUED', 'PROCESSING', 'COMPLETED', 'FAILED') + :ivar type: The type of knowledge source ('Web', 'Database', 'Text', 'File') + :ivar url: The url of the knowledge resource. + :ivar embedding_model: The embedding model to be used for the knowledge source. + :ivar date_created: The date and time in GMT when the Knowledge was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Knowledge was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], id: Optional[str] = None + ): + super().__init__(version) + + self.description: Optional[str] = payload.get("description") + self.id: Optional[str] = payload.get("id") + self.account_sid: Optional[str] = payload.get("account_sid") + self.knowledge_source_details: Optional[Dict[str, object]] = payload.get( + "knowledge_source_details" + ) + self.name: Optional[str] = payload.get("name") + self.status: Optional[str] = payload.get("status") + self.type: Optional[str] = payload.get("type") + self.url: Optional[str] = payload.get("url") + self.embedding_model: Optional[str] = payload.get("embedding_model") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "id": id or self.id, + } + self._context: Optional[KnowledgeContext] = None + + @property + def _proxy(self) -> "KnowledgeContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: KnowledgeContext for this KnowledgeInstance + """ + if self._context is None: + self._context = KnowledgeContext( + self._version, + id=self._solution["id"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the KnowledgeInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the KnowledgeInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "KnowledgeInstance": + """ + Fetch the KnowledgeInstance + + + :returns: The fetched KnowledgeInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "KnowledgeInstance": + """ + Asynchronous coroutine to fetch the KnowledgeInstance + + + :returns: The fetched KnowledgeInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + assistants_v1_service_update_knowledge_request: Union[ + AssistantsV1ServiceUpdateKnowledgeRequest, object + ] = values.unset, + ) -> "KnowledgeInstance": + """ + Update the KnowledgeInstance + + :param assistants_v1_service_update_knowledge_request: + + :returns: The updated KnowledgeInstance + """ + return self._proxy.update( + assistants_v1_service_update_knowledge_request=assistants_v1_service_update_knowledge_request, + ) + + async def update_async( + self, + assistants_v1_service_update_knowledge_request: Union[ + AssistantsV1ServiceUpdateKnowledgeRequest, object + ] = values.unset, + ) -> "KnowledgeInstance": + """ + Asynchronous coroutine to update the KnowledgeInstance + + :param assistants_v1_service_update_knowledge_request: + + :returns: The updated KnowledgeInstance + """ + return await self._proxy.update_async( + assistants_v1_service_update_knowledge_request=assistants_v1_service_update_knowledge_request, + ) + + @property + def chunks(self) -> ChunkList: + """ + Access the chunks + """ + return self._proxy.chunks + + @property + def knowledge_status(self) -> KnowledgeStatusList: + """ + Access the knowledge_status + """ + return self._proxy.knowledge_status + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class KnowledgeContext(InstanceContext): + + class AssistantsV1ServiceCreateKnowledgeRequest(object): + """ + :ivar assistant_id: The Assistant ID. + :ivar description: The description of the knowledge source. + :ivar knowledge_source_details: The details of the knowledge source based on the type. + :ivar name: The name of the tool. + :ivar policy: + :ivar type: The type of the knowledge source. + :ivar embedding_model: The embedding model to be used for the knowledge source. It's required for 'Database' type but disallowed for other types. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.description: Optional[str] = payload.get("description") + self.knowledge_source_details: Optional[Dict[str, object]] = payload.get( + "knowledge_source_details" + ) + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ + KnowledgeList.AssistantsV1ServiceCreatePolicyRequest + ] = payload.get("policy") + self.type: Optional[str] = payload.get("type") + self.embedding_model: Optional[str] = payload.get("embedding_model") + + def to_dict(self): + return { + "assistant_id": self.assistant_id, + "description": self.description, + "knowledge_source_details": self.knowledge_source_details, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + "embedding_model": self.embedding_model, + } + + class AssistantsV1ServiceCreatePolicyRequest(object): + """ + :ivar description: The description of the policy. + :ivar id: The Policy ID. + :ivar name: The name of the policy. + :ivar policy_details: + :ivar type: The description of the policy. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.description: Optional[str] = payload.get("description") + self.id: Optional[str] = payload.get("id") + self.name: Optional[str] = payload.get("name") + self.policy_details: Optional[Dict[str, object]] = payload.get( + "policy_details" + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "description": self.description, + "id": self.id, + "name": self.name, + "policy_details": self.policy_details, + "type": self.type, + } + + class AssistantsV1ServiceUpdateKnowledgeRequest(object): + """ + :ivar description: The description of the knowledge source. + :ivar knowledge_source_details: The details of the knowledge source based on the type. + :ivar name: The name of the knowledge source. + :ivar policy: + :ivar type: The description of the knowledge source. + :ivar embedding_model: The embedding model to be used for the knowledge source. It's only applicable to 'Database' type. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.description: Optional[str] = payload.get("description") + self.knowledge_source_details: Optional[Dict[str, object]] = payload.get( + "knowledge_source_details" + ) + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ + KnowledgeList.AssistantsV1ServiceCreatePolicyRequest + ] = payload.get("policy") + self.type: Optional[str] = payload.get("type") + self.embedding_model: Optional[str] = payload.get("embedding_model") + + def to_dict(self): + return { + "description": self.description, + "knowledge_source_details": self.knowledge_source_details, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + "embedding_model": self.embedding_model, + } + + def __init__(self, version: Version, id: str): + """ + Initialize the KnowledgeContext + + :param version: Version that contains the resource + :param id: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + self._uri = "/Knowledge/{id}".format(**self._solution) + + self._chunks: Optional[ChunkList] = None + self._knowledge_status: Optional[KnowledgeStatusList] = None + + def delete(self) -> bool: + """ + Deletes the KnowledgeInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the KnowledgeInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> KnowledgeInstance: + """ + Fetch the KnowledgeInstance + + + :returns: The fetched KnowledgeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return KnowledgeInstance( + self._version, + payload, + id=self._solution["id"], + ) + + async def fetch_async(self) -> KnowledgeInstance: + """ + Asynchronous coroutine to fetch the KnowledgeInstance + + + :returns: The fetched KnowledgeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return KnowledgeInstance( + self._version, + payload, + id=self._solution["id"], + ) + + def update( + self, + assistants_v1_service_update_knowledge_request: Union[ + AssistantsV1ServiceUpdateKnowledgeRequest, object + ] = values.unset, + ) -> KnowledgeInstance: + """ + Update the KnowledgeInstance + + :param assistants_v1_service_update_knowledge_request: + + :returns: The updated KnowledgeInstance + """ + data = assistants_v1_service_update_knowledge_request.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="PUT", uri=self._uri, data=data, headers=headers + ) + + return KnowledgeInstance(self._version, payload, id=self._solution["id"]) + + async def update_async( + self, + assistants_v1_service_update_knowledge_request: Union[ + AssistantsV1ServiceUpdateKnowledgeRequest, object + ] = values.unset, + ) -> KnowledgeInstance: + """ + Asynchronous coroutine to update the KnowledgeInstance + + :param assistants_v1_service_update_knowledge_request: + + :returns: The updated KnowledgeInstance + """ + data = assistants_v1_service_update_knowledge_request.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="PUT", uri=self._uri, data=data, headers=headers + ) + + return KnowledgeInstance(self._version, payload, id=self._solution["id"]) + + @property + def chunks(self) -> ChunkList: + """ + Access the chunks + """ + if self._chunks is None: + self._chunks = ChunkList( + self._version, + self._solution["id"], + ) + return self._chunks + + @property + def knowledge_status(self) -> KnowledgeStatusList: + """ + Access the knowledge_status + """ + if self._knowledge_status is None: + self._knowledge_status = KnowledgeStatusList( + self._version, + self._solution["id"], + ) + return self._knowledge_status + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class KnowledgePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> KnowledgeInstance: + """ + Build an instance of KnowledgeInstance + + :param payload: Payload response from the API + """ + return KnowledgeInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class KnowledgeList(ListResource): + + class AssistantsV1ServiceCreateKnowledgeRequest(object): + """ + :ivar assistant_id: The Assistant ID. + :ivar description: The description of the knowledge source. + :ivar knowledge_source_details: The details of the knowledge source based on the type. + :ivar name: The name of the tool. + :ivar policy: + :ivar type: The type of the knowledge source. + :ivar embedding_model: The embedding model to be used for the knowledge source. It's required for 'Database' type but disallowed for other types. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.description: Optional[str] = payload.get("description") + self.knowledge_source_details: Optional[Dict[str, object]] = payload.get( + "knowledge_source_details" + ) + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ + KnowledgeList.AssistantsV1ServiceCreatePolicyRequest + ] = payload.get("policy") + self.type: Optional[str] = payload.get("type") + self.embedding_model: Optional[str] = payload.get("embedding_model") + + def to_dict(self): + return { + "assistant_id": self.assistant_id, + "description": self.description, + "knowledge_source_details": self.knowledge_source_details, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + "embedding_model": self.embedding_model, + } + + class AssistantsV1ServiceCreatePolicyRequest(object): + """ + :ivar description: The description of the policy. + :ivar id: The Policy ID. + :ivar name: The name of the policy. + :ivar policy_details: + :ivar type: The description of the policy. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.description: Optional[str] = payload.get("description") + self.id: Optional[str] = payload.get("id") + self.name: Optional[str] = payload.get("name") + self.policy_details: Optional[Dict[str, object]] = payload.get( + "policy_details" + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "description": self.description, + "id": self.id, + "name": self.name, + "policy_details": self.policy_details, + "type": self.type, + } + + class AssistantsV1ServiceUpdateKnowledgeRequest(object): + """ + :ivar description: The description of the knowledge source. + :ivar knowledge_source_details: The details of the knowledge source based on the type. + :ivar name: The name of the knowledge source. + :ivar policy: + :ivar type: The description of the knowledge source. + :ivar embedding_model: The embedding model to be used for the knowledge source. It's only applicable to 'Database' type. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.description: Optional[str] = payload.get("description") + self.knowledge_source_details: Optional[Dict[str, object]] = payload.get( + "knowledge_source_details" + ) + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ + KnowledgeList.AssistantsV1ServiceCreatePolicyRequest + ] = payload.get("policy") + self.type: Optional[str] = payload.get("type") + self.embedding_model: Optional[str] = payload.get("embedding_model") + + def to_dict(self): + return { + "description": self.description, + "knowledge_source_details": self.knowledge_source_details, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + "embedding_model": self.embedding_model, + } + + def __init__(self, version: Version): + """ + Initialize the KnowledgeList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Knowledge" + + def create( + self, + assistants_v1_service_create_knowledge_request: AssistantsV1ServiceCreateKnowledgeRequest, + ) -> KnowledgeInstance: + """ + Create the KnowledgeInstance + + :param assistants_v1_service_create_knowledge_request: + + :returns: The created KnowledgeInstance + """ + data = assistants_v1_service_create_knowledge_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return KnowledgeInstance(self._version, payload) + + async def create_async( + self, + assistants_v1_service_create_knowledge_request: AssistantsV1ServiceCreateKnowledgeRequest, + ) -> KnowledgeInstance: + """ + Asynchronously create the KnowledgeInstance + + :param assistants_v1_service_create_knowledge_request: + + :returns: The created KnowledgeInstance + """ + data = assistants_v1_service_create_knowledge_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return KnowledgeInstance(self._version, payload) + + def stream( + self, + assistant_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[KnowledgeInstance]: + """ + Streams KnowledgeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str assistant_id: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(assistant_id=assistant_id, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + assistant_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[KnowledgeInstance]: + """ + Asynchronously streams KnowledgeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str assistant_id: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + assistant_id=assistant_id, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + assistant_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[KnowledgeInstance]: + """ + Lists KnowledgeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str assistant_id: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + assistant_id=assistant_id, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + assistant_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[KnowledgeInstance]: + """ + Asynchronously lists KnowledgeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str assistant_id: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + assistant_id=assistant_id, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + assistant_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> KnowledgePage: + """ + Retrieve a single page of KnowledgeInstance records from the API. + Request is executed immediately + + :param assistant_id: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of KnowledgeInstance + """ + data = values.of( + { + "AssistantId": assistant_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return KnowledgePage(self._version, response) + + async def page_async( + self, + assistant_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> KnowledgePage: + """ + Asynchronously retrieve a single page of KnowledgeInstance records from the API. + Request is executed immediately + + :param assistant_id: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of KnowledgeInstance + """ + data = values.of( + { + "AssistantId": assistant_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return KnowledgePage(self._version, response) + + def get_page(self, target_url: str) -> KnowledgePage: + """ + Retrieve a specific page of KnowledgeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of KnowledgeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return KnowledgePage(self._version, response) + + async def get_page_async(self, target_url: str) -> KnowledgePage: + """ + Asynchronously retrieve a specific page of KnowledgeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of KnowledgeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return KnowledgePage(self._version, response) + + def get(self, id: str) -> KnowledgeContext: + """ + Constructs a KnowledgeContext + + :param id: + """ + return KnowledgeContext(self._version, id=id) + + def __call__(self, id: str) -> KnowledgeContext: + """ + Constructs a KnowledgeContext + + :param id: + """ + return KnowledgeContext(self._version, id=id) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c691b0ccbd759940b5fe15a60fd441d550dc105 GIT binary patch literal 37069 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 lB=(B0{lg5fQdOxxRCRME3gM5c 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 J41P(M{{!D9Az%Oi literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__pycache__/knowledge_status.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/__pycache__/knowledge_status.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d571d63215aad90b2b309740fdbc19beab5cb33a GIT binary patch literal 8639 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 WUgv0G{cFMzzH`3)a}HiqnEwTsYwL#q literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/chunk.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/chunk.py new file mode 100644 index 00000000..be90a762 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/chunk.py @@ -0,0 +1,297 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ChunkInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Knowledge resource. + :ivar content: The chunk content. + :ivar metadata: The metadata of the chunk. + :ivar date_created: The date and time in GMT when the Chunk was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Chunk was updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], id: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.content: Optional[str] = payload.get("content") + self.metadata: Optional[Dict[str, object]] = payload.get("metadata") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "id": id, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChunkPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ChunkInstance: + """ + Build an instance of ChunkInstance + + :param payload: Payload response from the API + """ + return ChunkInstance(self._version, payload, id=self._solution["id"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ChunkList(ListResource): + + def __init__(self, version: Version, id: str): + """ + Initialize the ChunkList + + :param version: Version that contains the resource + :param id: The knowledge ID. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + self._uri = "/Knowledge/{id}/Chunks".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ChunkInstance]: + """ + Streams ChunkInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ChunkInstance]: + """ + Asynchronously streams ChunkInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChunkInstance]: + """ + Lists ChunkInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChunkInstance]: + """ + Asynchronously lists ChunkInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChunkPage: + """ + Retrieve a single page of ChunkInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChunkInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChunkPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChunkPage: + """ + Asynchronously retrieve a single page of ChunkInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChunkInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChunkPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ChunkPage: + """ + Retrieve a specific page of ChunkInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChunkInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ChunkPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ChunkPage: + """ + Asynchronously retrieve a specific page of ChunkInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChunkInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ChunkPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/knowledge_status.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/knowledge_status.py new file mode 100644 index 00000000..fedbcaad --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/knowledge/knowledge_status.py @@ -0,0 +1,196 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class KnowledgeStatusInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Knowledge resource. + :ivar status: The status of processing the knowledge source ('QUEUED', 'PROCESSING', 'COMPLETED', 'FAILED') + :ivar last_status: The last status of processing the knowledge source ('QUEUED', 'PROCESSING', 'COMPLETED', 'FAILED') + :ivar date_updated: The date and time in GMT when the Knowledge was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], id: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.status: Optional[str] = payload.get("status") + self.last_status: Optional[str] = payload.get("last_status") + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "id": id, + } + self._context: Optional[KnowledgeStatusContext] = None + + @property + def _proxy(self) -> "KnowledgeStatusContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: KnowledgeStatusContext for this KnowledgeStatusInstance + """ + if self._context is None: + self._context = KnowledgeStatusContext( + self._version, + id=self._solution["id"], + ) + return self._context + + def fetch(self) -> "KnowledgeStatusInstance": + """ + Fetch the KnowledgeStatusInstance + + + :returns: The fetched KnowledgeStatusInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "KnowledgeStatusInstance": + """ + Asynchronous coroutine to fetch the KnowledgeStatusInstance + + + :returns: The fetched KnowledgeStatusInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class KnowledgeStatusContext(InstanceContext): + + def __init__(self, version: Version, id: str): + """ + Initialize the KnowledgeStatusContext + + :param version: Version that contains the resource + :param id: the Knowledge ID. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + self._uri = "/Knowledge/{id}/Status".format(**self._solution) + + def fetch(self) -> KnowledgeStatusInstance: + """ + Fetch the KnowledgeStatusInstance + + + :returns: The fetched KnowledgeStatusInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return KnowledgeStatusInstance( + self._version, + payload, + id=self._solution["id"], + ) + + async def fetch_async(self) -> KnowledgeStatusInstance: + """ + Asynchronous coroutine to fetch the KnowledgeStatusInstance + + + :returns: The fetched KnowledgeStatusInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return KnowledgeStatusInstance( + self._version, + payload, + id=self._solution["id"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class KnowledgeStatusList(ListResource): + + def __init__(self, version: Version, id: str): + """ + Initialize the KnowledgeStatusList + + :param version: Version that contains the resource + :param id: the Knowledge ID. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + + def get(self) -> KnowledgeStatusContext: + """ + Constructs a KnowledgeStatusContext + + """ + return KnowledgeStatusContext(self._version, id=self._solution["id"]) + + def __call__(self) -> KnowledgeStatusContext: + """ + Constructs a KnowledgeStatusContext + + """ + return KnowledgeStatusContext(self._version, id=self._solution["id"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/policy.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/policy.py new file mode 100644 index 00000000..63854fb8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/policy.py @@ -0,0 +1,332 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class PolicyInstance(InstanceResource): + """ + :ivar id: The Policy ID. + :ivar name: The name of the policy. + :ivar description: The description of the policy. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Policy resource. + :ivar user_sid: The SID of the User that created the Policy resource. + :ivar type: The type of the policy. + :ivar policy_details: The details of the policy based on the type. + :ivar date_created: The date and time in GMT when the Policy was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Policy was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.id: Optional[str] = payload.get("id") + self.name: Optional[str] = payload.get("name") + self.description: Optional[str] = payload.get("description") + self.account_sid: Optional[str] = payload.get("account_sid") + self.user_sid: Optional[str] = payload.get("user_sid") + self.type: Optional[str] = payload.get("type") + self.policy_details: Optional[Dict[str, object]] = payload.get("policy_details") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class PolicyPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> PolicyInstance: + """ + Build an instance of PolicyInstance + + :param payload: Payload response from the API + """ + return PolicyInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class PolicyList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PolicyList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Policies" + + def stream( + self, + tool_id: Union[str, object] = values.unset, + knowledge_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[PolicyInstance]: + """ + Streams PolicyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str tool_id: The tool ID. + :param str knowledge_id: The knowledge ID. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + tool_id=tool_id, knowledge_id=knowledge_id, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + tool_id: Union[str, object] = values.unset, + knowledge_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[PolicyInstance]: + """ + Asynchronously streams PolicyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str tool_id: The tool ID. + :param str knowledge_id: The knowledge ID. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + tool_id=tool_id, knowledge_id=knowledge_id, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + tool_id: Union[str, object] = values.unset, + knowledge_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PolicyInstance]: + """ + Lists PolicyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str tool_id: The tool ID. + :param str knowledge_id: The knowledge ID. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + tool_id=tool_id, + knowledge_id=knowledge_id, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + tool_id: Union[str, object] = values.unset, + knowledge_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PolicyInstance]: + """ + Asynchronously lists PolicyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str tool_id: The tool ID. + :param str knowledge_id: The knowledge ID. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + tool_id=tool_id, + knowledge_id=knowledge_id, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + tool_id: Union[str, object] = values.unset, + knowledge_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PolicyPage: + """ + Retrieve a single page of PolicyInstance records from the API. + Request is executed immediately + + :param tool_id: The tool ID. + :param knowledge_id: The knowledge ID. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PolicyInstance + """ + data = values.of( + { + "ToolId": tool_id, + "KnowledgeId": knowledge_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PolicyPage(self._version, response) + + async def page_async( + self, + tool_id: Union[str, object] = values.unset, + knowledge_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PolicyPage: + """ + Asynchronously retrieve a single page of PolicyInstance records from the API. + Request is executed immediately + + :param tool_id: The tool ID. + :param knowledge_id: The knowledge ID. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PolicyInstance + """ + data = values.of( + { + "ToolId": tool_id, + "KnowledgeId": knowledge_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PolicyPage(self._version, response) + + def get_page(self, target_url: str) -> PolicyPage: + """ + Retrieve a specific page of PolicyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PolicyInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return PolicyPage(self._version, response) + + async def get_page_async(self, target_url: str) -> PolicyPage: + """ + Asynchronously retrieve a specific page of PolicyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PolicyInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return PolicyPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/session/__init__.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/session/__init__.py new file mode 100644 index 00000000..3f0054ea --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/session/__init__.py @@ -0,0 +1,439 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.assistants.v1.session.message import MessageList + + +class SessionInstance(InstanceResource): + """ + :ivar id: The Session ID. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Session resource. + :ivar assistant_id: The Assistant ID. + :ivar verified: True if the session is verified. + :ivar identity: The unique identity of user for the session. + :ivar date_created: The date and time in GMT when the Session was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Session was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], id: Optional[str] = None + ): + super().__init__(version) + + self.id: Optional[str] = payload.get("id") + self.account_sid: Optional[str] = payload.get("account_sid") + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.verified: Optional[bool] = payload.get("verified") + self.identity: Optional[str] = payload.get("identity") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "id": id or self.id, + } + self._context: Optional[SessionContext] = None + + @property + def _proxy(self) -> "SessionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SessionContext for this SessionInstance + """ + if self._context is None: + self._context = SessionContext( + self._version, + id=self._solution["id"], + ) + return self._context + + def fetch(self) -> "SessionInstance": + """ + Fetch the SessionInstance + + + :returns: The fetched SessionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SessionInstance": + """ + Asynchronous coroutine to fetch the SessionInstance + + + :returns: The fetched SessionInstance + """ + return await self._proxy.fetch_async() + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + return self._proxy.messages + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SessionContext(InstanceContext): + + def __init__(self, version: Version, id: str): + """ + Initialize the SessionContext + + :param version: Version that contains the resource + :param id: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + self._uri = "/Sessions/{id}".format(**self._solution) + + self._messages: Optional[MessageList] = None + + def fetch(self) -> SessionInstance: + """ + Fetch the SessionInstance + + + :returns: The fetched SessionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SessionInstance( + self._version, + payload, + id=self._solution["id"], + ) + + async def fetch_async(self) -> SessionInstance: + """ + Asynchronous coroutine to fetch the SessionInstance + + + :returns: The fetched SessionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SessionInstance( + self._version, + payload, + id=self._solution["id"], + ) + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + if self._messages is None: + self._messages = MessageList( + self._version, + self._solution["id"], + ) + return self._messages + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SessionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SessionInstance: + """ + Build an instance of SessionInstance + + :param payload: Payload response from the API + """ + return SessionInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SessionList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SessionList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Sessions" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SessionInstance]: + """ + Streams SessionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SessionInstance]: + """ + Asynchronously streams SessionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SessionInstance]: + """ + Lists SessionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SessionInstance]: + """ + Asynchronously lists SessionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SessionPage: + """ + Retrieve a single page of SessionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SessionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SessionPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SessionPage: + """ + Asynchronously retrieve a single page of SessionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SessionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SessionPage(self._version, response) + + def get_page(self, target_url: str) -> SessionPage: + """ + Retrieve a specific page of SessionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SessionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SessionPage(self._version, response) + + async def get_page_async(self, target_url: str) -> SessionPage: + """ + Asynchronously retrieve a specific page of SessionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SessionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SessionPage(self._version, response) + + def get(self, id: str) -> SessionContext: + """ + Constructs a SessionContext + + :param id: + """ + return SessionContext(self._version, id=id) + + def __call__(self, id: str) -> SessionContext: + """ + Constructs a SessionContext + + :param id: + """ + return SessionContext(self._version, id=id) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/session/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/assistants/v1/session/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..224b28a3fd5218fdee4afea4445ba86a083ba6cd GIT binary patch literal 19334 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 M#Lmwce3LH!2ivXO?*IS* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/session/message.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/session/message.py new file mode 100644 index 00000000..a7ea5ca2 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/session/message.py @@ -0,0 +1,309 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MessageInstance(InstanceResource): + """ + :ivar id: The message ID. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Message resource. + :ivar assistant_id: The Assistant ID. + :ivar session_id: The Session ID. + :ivar identity: The identity of the user. + :ivar role: The role of the user associated with the message. + :ivar content: The content of the message. + :ivar meta: The metadata of the message. + :ivar date_created: The date and time in GMT when the Message was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Message was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], session_id: str): + super().__init__(version) + + self.id: Optional[str] = payload.get("id") + self.account_sid: Optional[str] = payload.get("account_sid") + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.session_id: Optional[str] = payload.get("session_id") + self.identity: Optional[str] = payload.get("identity") + self.role: Optional[str] = payload.get("role") + self.content: Optional[Dict[str, object]] = payload.get("content") + self.meta: Optional[Dict[str, object]] = payload.get("meta") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "session_id": session_id, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessagePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MessageInstance: + """ + Build an instance of MessageInstance + + :param payload: Payload response from the API + """ + return MessageInstance( + self._version, payload, session_id=self._solution["session_id"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MessageList(ListResource): + + def __init__(self, version: Version, session_id: str): + """ + Initialize the MessageList + + :param version: Version that contains the resource + :param session_id: Session id or name + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "session_id": session_id, + } + self._uri = "/Sessions/{session_id}/Messages".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MessageInstance]: + """ + Streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MessageInstance]: + """ + Asynchronously streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Asynchronously lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Asynchronously retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MessagePage: + """ + Retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MessagePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MessagePage: + """ + Asynchronously retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MessagePage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/assistants/v1/tool.py b/venv/Lib/site-packages/twilio/rest/assistants/v1/tool.py new file mode 100644 index 00000000..648faca5 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/assistants/v1/tool.py @@ -0,0 +1,916 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Assistants + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ToolInstance(InstanceResource): + + class AssistantsV1ServiceCreatePolicyRequest(object): + """ + :ivar description: The description of the policy. + :ivar id: The Policy ID. + :ivar name: The name of the policy. + :ivar policy_details: + :ivar type: The description of the policy. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.description: Optional[str] = payload.get("description") + self.id: Optional[str] = payload.get("id") + self.name: Optional[str] = payload.get("name") + self.policy_details: Optional[Dict[str, object]] = payload.get( + "policy_details" + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "description": self.description, + "id": self.id, + "name": self.name, + "policy_details": self.policy_details, + "type": self.type, + } + + class AssistantsV1ServiceCreateToolRequest(object): + """ + :ivar assistant_id: The Assistant ID. + :ivar description: The description of the tool. + :ivar enabled: True if the tool is enabled. + :ivar meta: The metadata related to method, url, input_schema to used with the Tool. + :ivar name: The name of the tool. + :ivar policy: + :ivar type: The description of the tool. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.description: Optional[str] = payload.get("description") + self.enabled: Optional[bool] = payload.get("enabled") + self.meta: Optional[Dict[str, object]] = payload.get("meta") + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ToolList.AssistantsV1ServiceCreatePolicyRequest] = ( + payload.get("policy") + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "assistant_id": self.assistant_id, + "description": self.description, + "enabled": self.enabled, + "meta": self.meta, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + } + + class AssistantsV1ServiceUpdateToolRequest(object): + """ + :ivar assistant_id: The Assistant ID. + :ivar description: The description of the tool. + :ivar enabled: True if the tool is enabled. + :ivar meta: The metadata related to method, url, input_schema to used with the Tool. + :ivar name: The name of the tool. + :ivar policy: + :ivar type: The type of the tool. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.description: Optional[str] = payload.get("description") + self.enabled: Optional[bool] = payload.get("enabled") + self.meta: Optional[Dict[str, object]] = payload.get("meta") + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ToolList.AssistantsV1ServiceCreatePolicyRequest] = ( + payload.get("policy") + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "assistant_id": self.assistant_id, + "description": self.description, + "enabled": self.enabled, + "meta": self.meta, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + } + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Tool resource. + :ivar description: The description of the tool. + :ivar enabled: True if the tool is enabled. + :ivar id: The tool ID. + :ivar meta: The metadata related to method, url, input_schema to used with the Tool. + :ivar name: The name of the tool. + :ivar requires_auth: The authentication requirement for the tool. + :ivar type: The type of the tool. ('WEBHOOK') + :ivar url: The url of the tool resource. + :ivar date_created: The date and time in GMT when the Tool was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Tool was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar policies: The Policies associated with the tool. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], id: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.description: Optional[str] = payload.get("description") + self.enabled: Optional[bool] = payload.get("enabled") + self.id: Optional[str] = payload.get("id") + self.meta: Optional[Dict[str, object]] = payload.get("meta") + self.name: Optional[str] = payload.get("name") + self.requires_auth: Optional[bool] = payload.get("requires_auth") + self.type: Optional[str] = payload.get("type") + self.url: Optional[str] = payload.get("url") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.policies: Optional[List[str]] = payload.get("policies") + + self._solution = { + "id": id or self.id, + } + self._context: Optional[ToolContext] = None + + @property + def _proxy(self) -> "ToolContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ToolContext for this ToolInstance + """ + if self._context is None: + self._context = ToolContext( + self._version, + id=self._solution["id"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ToolInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ToolInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ToolInstance": + """ + Fetch the ToolInstance + + + :returns: The fetched ToolInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ToolInstance": + """ + Asynchronous coroutine to fetch the ToolInstance + + + :returns: The fetched ToolInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + assistants_v1_service_update_tool_request: Union[ + AssistantsV1ServiceUpdateToolRequest, object + ] = values.unset, + ) -> "ToolInstance": + """ + Update the ToolInstance + + :param assistants_v1_service_update_tool_request: + + :returns: The updated ToolInstance + """ + return self._proxy.update( + assistants_v1_service_update_tool_request=assistants_v1_service_update_tool_request, + ) + + async def update_async( + self, + assistants_v1_service_update_tool_request: Union[ + AssistantsV1ServiceUpdateToolRequest, object + ] = values.unset, + ) -> "ToolInstance": + """ + Asynchronous coroutine to update the ToolInstance + + :param assistants_v1_service_update_tool_request: + + :returns: The updated ToolInstance + """ + return await self._proxy.update_async( + assistants_v1_service_update_tool_request=assistants_v1_service_update_tool_request, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ToolContext(InstanceContext): + + class AssistantsV1ServiceCreatePolicyRequest(object): + """ + :ivar description: The description of the policy. + :ivar id: The Policy ID. + :ivar name: The name of the policy. + :ivar policy_details: + :ivar type: The description of the policy. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.description: Optional[str] = payload.get("description") + self.id: Optional[str] = payload.get("id") + self.name: Optional[str] = payload.get("name") + self.policy_details: Optional[Dict[str, object]] = payload.get( + "policy_details" + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "description": self.description, + "id": self.id, + "name": self.name, + "policy_details": self.policy_details, + "type": self.type, + } + + class AssistantsV1ServiceCreateToolRequest(object): + """ + :ivar assistant_id: The Assistant ID. + :ivar description: The description of the tool. + :ivar enabled: True if the tool is enabled. + :ivar meta: The metadata related to method, url, input_schema to used with the Tool. + :ivar name: The name of the tool. + :ivar policy: + :ivar type: The description of the tool. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.description: Optional[str] = payload.get("description") + self.enabled: Optional[bool] = payload.get("enabled") + self.meta: Optional[Dict[str, object]] = payload.get("meta") + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ToolList.AssistantsV1ServiceCreatePolicyRequest] = ( + payload.get("policy") + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "assistant_id": self.assistant_id, + "description": self.description, + "enabled": self.enabled, + "meta": self.meta, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + } + + class AssistantsV1ServiceUpdateToolRequest(object): + """ + :ivar assistant_id: The Assistant ID. + :ivar description: The description of the tool. + :ivar enabled: True if the tool is enabled. + :ivar meta: The metadata related to method, url, input_schema to used with the Tool. + :ivar name: The name of the tool. + :ivar policy: + :ivar type: The type of the tool. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.description: Optional[str] = payload.get("description") + self.enabled: Optional[bool] = payload.get("enabled") + self.meta: Optional[Dict[str, object]] = payload.get("meta") + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ToolList.AssistantsV1ServiceCreatePolicyRequest] = ( + payload.get("policy") + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "assistant_id": self.assistant_id, + "description": self.description, + "enabled": self.enabled, + "meta": self.meta, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + } + + def __init__(self, version: Version, id: str): + """ + Initialize the ToolContext + + :param version: Version that contains the resource + :param id: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + self._uri = "/Tools/{id}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the ToolInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ToolInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ToolInstance: + """ + Fetch the ToolInstance + + + :returns: The fetched ToolInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ToolInstance( + self._version, + payload, + id=self._solution["id"], + ) + + async def fetch_async(self) -> ToolInstance: + """ + Asynchronous coroutine to fetch the ToolInstance + + + :returns: The fetched ToolInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ToolInstance( + self._version, + payload, + id=self._solution["id"], + ) + + def update( + self, + assistants_v1_service_update_tool_request: Union[ + AssistantsV1ServiceUpdateToolRequest, object + ] = values.unset, + ) -> ToolInstance: + """ + Update the ToolInstance + + :param assistants_v1_service_update_tool_request: + + :returns: The updated ToolInstance + """ + data = assistants_v1_service_update_tool_request.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="PUT", uri=self._uri, data=data, headers=headers + ) + + return ToolInstance(self._version, payload, id=self._solution["id"]) + + async def update_async( + self, + assistants_v1_service_update_tool_request: Union[ + AssistantsV1ServiceUpdateToolRequest, object + ] = values.unset, + ) -> ToolInstance: + """ + Asynchronous coroutine to update the ToolInstance + + :param assistants_v1_service_update_tool_request: + + :returns: The updated ToolInstance + """ + data = assistants_v1_service_update_tool_request.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="PUT", uri=self._uri, data=data, headers=headers + ) + + return ToolInstance(self._version, payload, id=self._solution["id"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ToolPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ToolInstance: + """ + Build an instance of ToolInstance + + :param payload: Payload response from the API + """ + return ToolInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ToolList(ListResource): + + class AssistantsV1ServiceCreatePolicyRequest(object): + """ + :ivar description: The description of the policy. + :ivar id: The Policy ID. + :ivar name: The name of the policy. + :ivar policy_details: + :ivar type: The description of the policy. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.description: Optional[str] = payload.get("description") + self.id: Optional[str] = payload.get("id") + self.name: Optional[str] = payload.get("name") + self.policy_details: Optional[Dict[str, object]] = payload.get( + "policy_details" + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "description": self.description, + "id": self.id, + "name": self.name, + "policy_details": self.policy_details, + "type": self.type, + } + + class AssistantsV1ServiceCreateToolRequest(object): + """ + :ivar assistant_id: The Assistant ID. + :ivar description: The description of the tool. + :ivar enabled: True if the tool is enabled. + :ivar meta: The metadata related to method, url, input_schema to used with the Tool. + :ivar name: The name of the tool. + :ivar policy: + :ivar type: The description of the tool. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.description: Optional[str] = payload.get("description") + self.enabled: Optional[bool] = payload.get("enabled") + self.meta: Optional[Dict[str, object]] = payload.get("meta") + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ToolList.AssistantsV1ServiceCreatePolicyRequest] = ( + payload.get("policy") + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "assistant_id": self.assistant_id, + "description": self.description, + "enabled": self.enabled, + "meta": self.meta, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + } + + class AssistantsV1ServiceUpdateToolRequest(object): + """ + :ivar assistant_id: The Assistant ID. + :ivar description: The description of the tool. + :ivar enabled: True if the tool is enabled. + :ivar meta: The metadata related to method, url, input_schema to used with the Tool. + :ivar name: The name of the tool. + :ivar policy: + :ivar type: The type of the tool. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.assistant_id: Optional[str] = payload.get("assistant_id") + self.description: Optional[str] = payload.get("description") + self.enabled: Optional[bool] = payload.get("enabled") + self.meta: Optional[Dict[str, object]] = payload.get("meta") + self.name: Optional[str] = payload.get("name") + self.policy: Optional[ToolList.AssistantsV1ServiceCreatePolicyRequest] = ( + payload.get("policy") + ) + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "assistant_id": self.assistant_id, + "description": self.description, + "enabled": self.enabled, + "meta": self.meta, + "name": self.name, + "policy": self.policy.to_dict() if self.policy is not None else None, + "type": self.type, + } + + def __init__(self, version: Version): + """ + Initialize the ToolList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Tools" + + def create( + self, + assistants_v1_service_create_tool_request: AssistantsV1ServiceCreateToolRequest, + ) -> ToolInstance: + """ + Create the ToolInstance + + :param assistants_v1_service_create_tool_request: + + :returns: The created ToolInstance + """ + data = assistants_v1_service_create_tool_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ToolInstance(self._version, payload) + + async def create_async( + self, + assistants_v1_service_create_tool_request: AssistantsV1ServiceCreateToolRequest, + ) -> ToolInstance: + """ + Asynchronously create the ToolInstance + + :param assistants_v1_service_create_tool_request: + + :returns: The created ToolInstance + """ + data = assistants_v1_service_create_tool_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ToolInstance(self._version, payload) + + def stream( + self, + assistant_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ToolInstance]: + """ + Streams ToolInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str assistant_id: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(assistant_id=assistant_id, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + assistant_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ToolInstance]: + """ + Asynchronously streams ToolInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str assistant_id: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + assistant_id=assistant_id, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + assistant_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ToolInstance]: + """ + Lists ToolInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str assistant_id: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + assistant_id=assistant_id, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + assistant_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ToolInstance]: + """ + Asynchronously lists ToolInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str assistant_id: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + assistant_id=assistant_id, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + assistant_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ToolPage: + """ + Retrieve a single page of ToolInstance records from the API. + Request is executed immediately + + :param assistant_id: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ToolInstance + """ + data = values.of( + { + "AssistantId": assistant_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ToolPage(self._version, response) + + async def page_async( + self, + assistant_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ToolPage: + """ + Asynchronously retrieve a single page of ToolInstance records from the API. + Request is executed immediately + + :param assistant_id: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ToolInstance + """ + data = values.of( + { + "AssistantId": assistant_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ToolPage(self._version, response) + + def get_page(self, target_url: str) -> ToolPage: + """ + Retrieve a specific page of ToolInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ToolInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ToolPage(self._version, response) + + async def get_page_async(self, target_url: str) -> ToolPage: + """ + Asynchronously retrieve a specific page of ToolInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ToolInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ToolPage(self._version, response) + + def get(self, id: str) -> ToolContext: + """ + Constructs a ToolContext + + :param id: + """ + return ToolContext(self._version, id=id) + + def __call__(self, id: str) -> ToolContext: + """ + Constructs a ToolContext + + :param id: + """ + return ToolContext(self._version, id=id) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/BulkexportsBase.py b/venv/Lib/site-packages/twilio/rest/bulkexports/BulkexportsBase.py new file mode 100644 index 00000000..cbca4c53 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/bulkexports/BulkexportsBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.bulkexports.v1 import V1 + + +class BulkexportsBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Bulkexports Domain + + :returns: Domain for Bulkexports + """ + super().__init__(twilio, "https://bulkexports.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Bulkexports + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/__init__.py b/venv/Lib/site-packages/twilio/rest/bulkexports/__init__.py new file mode 100644 index 00000000..3a28fb57 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/bulkexports/__init__.py @@ -0,0 +1,25 @@ +from warnings import warn + +from twilio.rest.bulkexports.BulkexportsBase import BulkexportsBase +from twilio.rest.bulkexports.v1.export import ExportList +from twilio.rest.bulkexports.v1.export_configuration import ExportConfigurationList + + +class Bulkexports(BulkexportsBase): + @property + def exports(self) -> ExportList: + warn( + "exports is deprecated. Use v1.exports instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.exports + + @property + def export_configuration(self) -> ExportConfigurationList: + warn( + "export_configuration is deprecated. Use v1.export_configuration instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.export_configuration diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/__pycache__/BulkexportsBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/bulkexports/__pycache__/BulkexportsBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7ab3d933608fc92a42606000c564568ebcb6907 GIT binary patch literal 2035 zcmahKO>Y}TbauU7ubrd`X=ziaqA9dNKGc>aR8>(`ku*>uAgLhqU~M(5cgOLP_3kn| zc4Nzj93qiOty&48X+KYsNoLOcW5T z`#*oxIMfjOO&kU*n<7Umfb1a$Rgt4Os;4y7s;US)<7Jv!Rg<{pWt)0cmw498HI1sF zAQjz0j=qhY9MujoiM?vRV-)k&4+=sBjMo}&gzdng_?{Kvb?Q@Qaq8e&2bhEqeDc9S z5F`RfvdhE2kEv9`74peXYJpYU6W_r{o+SkY6AmGQDUSjO?Vc$VBt}SCV5yOWTppMu zJ*k^WrefeNu_$E0ojBeVK=?BUW-%5nlJ7v?EP&mW)wK`j(>i%p6k#Zs)#AZR#lov0 z^%rh0<6B7u16Bgn2IpZkUoHp0v_khvT3%psYBxY&DZqZfF?C#yd4pnGI%ryc%ksQV zsqlwrSy73N)sVY^Z+U?0OF`3eeSzKdT23nkR->bj;QTEN4@Ff421s=j znyIThs1Ad)Jzmvl*2z%4t~%Pbc92@A=744ZExWB%^E+r$sTRIKMLnKeY^a@X?QE|v8e2>@y*${;$Fta(Oxi}}%f%E9%3;Sq(QV0U)Vm)c1_r6iS-9W+;p znK&D@Lds%;5EmjKB+ig_1?XBty*kT7N^zbL*)BpNkuSzuFKRdE%`YR$BJ-2w$WW3q2c0`BS^OpNyIPvxgTKelZrGT)e!aJur@dk77Nkmksa0aEU}@ z^F9Y;5B1R3L)HnhHN}ODTs?G<>O&I;#Q)HP8B)4ehiy3N*Bz)BOm~Fa6&%!G+q0s| zCcr$?0X$aNDcB<67_%vWvD&V5r(dl}yD}@p-T|O5;|T7Ga5nz zq05%It3%0?JU_GShU?S+)##qNz9uhLX(Xi^j}bcqk&LDd<0+gH^16XYIPVFS8~|B@ zsX3WvaZF6MZ#5}Qc7c#);Iuq}j}!6@JUt1Ai9aAYZ?O?Fc*7X)$ObSmWpO6rjLisa zBE1PV^*lm~3Y!F~jPnE89%cwb0-P3%s{o#FqrR5Q&h5945p4Zwq@U`mdUoc~;$H~1 zqs)NNpUQ&RyMH6tWbo3^O0f{<2yp@%qSkpQbp3TErZS#RFLF)X7e~GkOmr|FOBv#l z$<*SvMkuA)$Xn2^BzelX&w+B{Sd7{W<9br98|)Gs#SBIQ>1Py0`BTj++VNSWT=*Sb Weu`$FqT)0CyfXKwevDv~R{jBZ3>3Kl literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/bulkexports/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8528cf980432035425eb6ea8d3ce5691cdbe761b GIT binary patch literal 1437 zcmcgs%}*0S6rcU4gf+yP?)naJd9ROD2SV>WN|ML`t;Td>8Vq)LG;+Hx_b#yG^ITga4Fktt(g z3-)HBDz#Wz*<)s!^Tnz`92k=mWqS!fFS*2{69&cLir);TGZyt=HWQE0GW_FLkZUSr6GxAF|u3$SY5_U$vZz@_2lsy8vEvMk~ zl~F$yA;2n;VtawITci#iPhQmkgi!77^z?mg3ezReEol|k%Htaa?08xQI~8rln%Ai1 z;mak!GYXh$Ue&TKH%Bn_a`UZn=5*b1EKk?7r5fo0h~@q^dYc#NfB-!Y>LvQ3Bz6+x zpAy46gG2iRNSuWo>0!8E!xt`rq}q9kQk8+dJ^D#rZWgsubyj(~|_K zs6eEfIg+6Kf#X0(FNDJ4kbahW0@QNqcM^{R_OVqLKt+r`JdV+i$&vTTk!@v!3_#{= zTJaTKcZ?#|bw94_Mb|9b%ueX~v$A1F5v4@j5++`au!j&7m9Rz*PPU1Hy~3j^%*zz} z=oL__Xh-U*^RjgI&8hDQhK7LT?!Zy+iLA`_#cM2<31Z(MITP;5c9~6g_zL@NKp)ev z!!L!cmu0P&ZEL-38%OM~Lf8xR&;2R;@L2`d@^k;pJ4$#+L2%>KfYV~(Kp78-yiQUO kV9$)60aX_`j@v~izoN-qG`5T8e#pIC=5=l#!4NF}2@HU2NB{r; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/__init__.py new file mode 100644 index 00000000..a888fb48 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Bulkexports + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.bulkexports.v1.export import ExportList +from twilio.rest.bulkexports.v1.export_configuration import ExportConfigurationList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Bulkexports + + :param domain: The Twilio.bulkexports domain + """ + super().__init__(domain, "v1") + self._exports: Optional[ExportList] = None + self._export_configuration: Optional[ExportConfigurationList] = None + + @property + def exports(self) -> ExportList: + if self._exports is None: + self._exports = ExportList(self) + return self._exports + + @property + def export_configuration(self) -> ExportConfigurationList: + if self._export_configuration is None: + self._export_configuration = ExportConfigurationList(self) + return self._export_configuration + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bb28821efae8d9bc936e2153e639345135372f7 GIT binary patch literal 2477 zcmcf?O>YxNbauVAH*1GbNC|C2H3bp6w6T?*st6Dtp)_g;h@?4KZl@dXIN7q^-OjEJ zwv3cRq&gB6rz*Kr;)?PodhaECRG<}+D)rP$l{TOvPJJ`8HjYrmt!w-3`=0kT&%X=~ z8VH`-558IcDTC1OoajF31lcVCvW{$2LbhV7u2NG=s>1P?mZQI9e! zqBdS^axozUzxr?nXAy2F-V(eHHlax8Ho*~Ok;(iX;2HPHj-(j`~s;R5*;2mHWt*DuEW4EgQqmkn8_8;z-Lh?1-yRnjg~16>Wi*Z!Sho0+QqqfeD3OWL3)_IGJkP0DYt8d!pN#e{+^oS zD*^Su249km@L55evK&Q0I9V+EAhrT$Jn0jNBU)J&DpNl8{0LLqi9|3JaY)Vb>Xz#^ z3&tP3|E3b_SAxj#Jv}G zld&i)z8auJ+%t;R#>A|t#p$pfP!{WiIB+l_fF&arznx&D(%%p>6>A}NtBkLfcz_Vm zd_qE=5XLJnzrHY8{xXD^%U?`S&zGlYcs=ria>I8j^c)ORRBlkOQJ!%Y%b^p|@xZEF zx0YyFj>Ie%84aUiU*yHcM6nxPA!xFFa84_?Fj43-4+A4S2H?dCdX`56`_{7e^}`#7 z?hZfF$DR~E>1ekHpL{;k(SFsB?t&VMGmJ)c=2c)Z^&TER|LtA_u#Vd3+n(qZva&zo zI^t=g&BPvh+hzWT-5k27%$h120zC$s7)bUOyh82)vx5NRY*P1@0l6jkQLe+m3i>TK zbm#Qi>8%`oIy!bYdN}%VXX^IlCqoDC+*-S}rH`^N{X4MG=w2*Qp1Al%y}c7EODRfo1OkxJ^Sk>}KP6jphJ6Gi szXD>CcT$R?{H5jw zhPEk7g^?Jo+&YboMOQLVz)rD?SV$K3KGplQ3Hs0geG#J+5(W*L-R{E{C<>-@kW@g6 z{{J~MBa)`%IGgl763?7D_xaC%{m%SNeSLs~>-tAO7~0v%asPl1_9a@G(qBMkf>XH| zr}C;R$){W~SIQl8r-Yc05@RBd<&Ak$zL<|b3rT+}5DU<}n5;_$V?mntBc`o4^3E&EMp0M!~~}t9e@&+ljUyAS%a|RZf9J1ly+uKt#&Xt8xkAi za^dkcOmM;hdt6DvIoQA5ejvcebTN@kWTY->e=d1myOhlkLuVC8KlnF>G%1@qn@q%| zldSEDL;WYE-s6X(Y=pj-Paf*A$emPl+DXY7nF^XqFK4wh^pRd*8<8PVI?Iq@Wc8lz z?hI5b*+iGMPf%@W@gdseU`9%33`tWH23<^?PLfj6IVG9QM+5(eyb=*icW*jx3I`K$ z!}PtJH4>S$k~GCrX~;xereD`cLP;h@G}CiIN#-;?!keMPY28rLaqU1RZD^MaC<@y} zCp0~iBXJGNf=3g&QTFUTtq~oDjWaG~so#1i4FU)L5eSRM#dr`Hm&(W7eohUmE=^F~ zny7g+@1ScHG*<=9r+F|p=o#k*c~!hxAMarI5IRgsGlnv%q-V8wVlV*;Dv_4#F<4!# z(OC^lpcy(Y38a+RucHrTa!FOf7m*ZuED7g#*6zHl{h~lNe3^JAl}%~}kS3=m(&wZX z4xN->oyTA9KN$rP*CZuwfY?>M2z1jm1DB1e!d^POK9ycZ6d(c>CfUemHB=UwggGfQ zh*PF=X&^gpo%HJ~Ka!4Vx~`nl^iJsjyaL`}cQvAcoWg^WR;A+#fsIOJm9(X-*esOf zI5xg33~itav!`ZMG`+B0D7&UNtK^dzMK$Z~7IblOp-iOE4B@Y|2W0xs_zBK%Dz6En z+?!w?NBMW54lkY?bq(7FlNHfaby|#aGLA;CMcTUT(V(rfl119O%i22gF49&gYwLN; z8pN`;Uc0R-jJhxJIvDU#Za8R{F5DA5tk`EitI$feH6oYiBA!0eYssHkSH>e|gZ;ob znk<7MOgHRgBw&hqE~^pKC(DU+!jNUteNHn-6SN@9FCkdsnIAsTGjIy*gg$WO@ZpmK2Q~e?k;x8R$Ry%g zFIXmH;DVOEFmN<+c0f-UT31$ypGQU=FsNbd21YWv&o0=}?hD(xnMuXvEGVdGHcwh$ z){*r~Xs@XK))KVT{{)gRuW%28oWJ3kx8Q4;T=}uD{nJg+cP_tu`TjFAo1PmNt_SC~ zY`eF0YU};f%$9@W!pFXrxvrh}UY&Y%`kBKsT`yrt>s;rKdq<{@JP6HnzK8{@=Q<+q zY<+v{U2UdgCye1Mdbs*EldpaB)V{mwY;<2Cy07SVtqwp{15|zY06#9gSzm(XaHfZ7 zMvkQ8mH=QGht#AZa}_cZ$Shb|bzO-V3xdE6JB+^24Ei~2x=^a}Xe{4zy$gyRFJLm3 zq4`=ffst@4JS;GPTa1_GfPg9kjc1vEP(sxHJ4)HE=%hN$u0;i@WYLI#c5wy-76o0N zLUjpNCXvbMs3n05^{CVfD%c*&E|nAl9u>)4LS+wb5^7Cr2If%VDtj1d^&Y7PiyWv} zEv%|W8`}sv%cO!b#nW3vAgw?$b9If5*5DvQmZl`Dp(%7+12-MFS|aFum>wBlB0thm zV-S1xC~LC=yFLTS6|NZOg5kHGyY}34o%DBWcFl#CPt@P6pKI&5oxYX6D;L_Hdnme} zY8XFw{aDe*g_plIc5Q6hw}z~R-W807EI=7;7i1P=v|)$MppkXieig6=KhJz!r1
  1. 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 UXy)Pfg?1jOnf#o?JLS;-0K "ExportContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ExportContext for this ExportInstance + """ + if self._context is None: + self._context = ExportContext( + self._version, + resource_type=self._solution["resource_type"], + ) + return self._context + + def fetch(self) -> "ExportInstance": + """ + Fetch the ExportInstance + + + :returns: The fetched ExportInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ExportInstance": + """ + Asynchronous coroutine to fetch the ExportInstance + + + :returns: The fetched ExportInstance + """ + return await self._proxy.fetch_async() + + @property + def days(self) -> DayList: + """ + Access the days + """ + return self._proxy.days + + @property + def export_custom_jobs(self) -> ExportCustomJobList: + """ + Access the export_custom_jobs + """ + return self._proxy.export_custom_jobs + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ExportContext(InstanceContext): + + def __init__(self, version: Version, resource_type: str): + """ + Initialize the ExportContext + + :param version: Version that contains the resource + :param resource_type: The type of communication – Messages, Calls, Conferences, and Participants + """ + super().__init__(version) + + # Path Solution + self._solution = { + "resource_type": resource_type, + } + self._uri = "/Exports/{resource_type}".format(**self._solution) + + self._days: Optional[DayList] = None + self._export_custom_jobs: Optional[ExportCustomJobList] = None + + def fetch(self) -> ExportInstance: + """ + Fetch the ExportInstance + + + :returns: The fetched ExportInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ExportInstance( + self._version, + payload, + resource_type=self._solution["resource_type"], + ) + + async def fetch_async(self) -> ExportInstance: + """ + Asynchronous coroutine to fetch the ExportInstance + + + :returns: The fetched ExportInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ExportInstance( + self._version, + payload, + resource_type=self._solution["resource_type"], + ) + + @property + def days(self) -> DayList: + """ + Access the days + """ + if self._days is None: + self._days = DayList( + self._version, + self._solution["resource_type"], + ) + return self._days + + @property + def export_custom_jobs(self) -> ExportCustomJobList: + """ + Access the export_custom_jobs + """ + if self._export_custom_jobs is None: + self._export_custom_jobs = ExportCustomJobList( + self._version, + self._solution["resource_type"], + ) + return self._export_custom_jobs + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ExportList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ExportList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Exports" + + self._jobs: Optional[JobList] = None + + @property + def jobs(self) -> JobList: + """ + Access the jobs + """ + if self._jobs is None: + self._jobs = JobList(self._version) + return self._jobs + + def get(self, resource_type: str) -> ExportContext: + """ + Constructs a ExportContext + + :param resource_type: The type of communication – Messages, Calls, Conferences, and Participants + """ + return ExportContext(self._version, resource_type=resource_type) + + def __call__(self, resource_type: str) -> ExportContext: + """ + Constructs a ExportContext + + :param resource_type: The type of communication – Messages, Calls, Conferences, and Participants + """ + return ExportContext(self._version, resource_type=resource_type) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a36e35ba1142acf53e02c832563237ae75a3039 GIT binary patch literal 10005 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/day.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/day.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcdecb6b41236e5e7c005d83ccac246360c1c2a5 GIT binary patch literal 19009 zcmeHPYj6}-cJ7|(dFnAjFC-ywgFs?HjCk1K6%Sj0jWHl&9?q^7?|3xRLId-1_Y5E* zB`%xVh?KpCZ0$;Hr3&^@yHf0p<)kXcf3kKeRoSZi(X3o0RoA*g9zT-GqsA*7d-;{` z+}qvLBSv`fvKv>*E$Q}sKhHh)JLjI(KU7uu1w60*;)TI)bqm73P{4d#hG$_0o^c^2 z^a(LB=17Q1N1r3<>~kiiJ}K$yb0yt%rUf3l*lf`z3-WwNTT ziuqlM>SUlV!2Iq+O>$Y^GUoRrYLj(+bK*lMN0ifv-C0mRlQ%dFVup=H6^$bXB1;Fs~77>sLjG#yjq^ASxx zt)vt+l2u}I{}3gI!(qAjLlG1erh@Fvox6fYE?X9=hl+*6tkn@&98z~8;#t<2C~G7cN#!Dm#8Alp??gdCkM8VA4e8SUcr>d^hvQmS_db)!#?z@t zLU)}^!J~T*W{C*Ws$SKj4W*)HFzC=LVv44y@kk;*tmy7@kwi|>f}$Qcn9{P5R8-lQ zPGyw~Swz*CQO6W5ol~O<;wq^q_|@)#jCg}G~gW*2E>^AQdOT%@yDuS-b>OO zh^MEoB36yPCG}O}?Z>++=26@Oj#vf!)nmd1u`h632nO_u{gEMaB)K1%o2EN{E~3gR z=2}&v*>E=9&6a>i$09?t&We2S_%rgO+c$5K2hwUXl9glFSaN!Rt&VEU3dkVEA_n3K zrIT{X5&7haeaOr#kFyFjV@|l$&Plra;Mr0~ZRrL>L6;7DEU{qDmYM7e7N2ksY zDk%(yFBGFpUM^-E)_@vUQnAEPI2B16b(v8zMaf!5iN*)w;2o?wRzo~>nvL#Ey5Cln z*-|(=lrgFz9}O#-P9}4ycr-#JDgX0J-y zhQqq^w31bukdft3sn5D64lZ_DQB`6iY703l$f5dlUsy{gazvh}C2H_HH+rKa2Glyr zR&VCz{q%*yj2DN)nj0x}`p7Tcd0}7osgvNP+Nnba51u%+U(wEH)0tD}(($O$1NNRh zbxuj0J9RkTe@csIl}(vQ^ekRTJOytQ#^<8*R%!~QYp18>v(n&3}1 zet+YnGP~yCG3izBFWW+MZQJv0+o#XJbMftq?`@ym@$_ulAtd?c?<(85?X5#ohi(RD zJD;M;TILr=6x_n9jq`PlfBM+O+Ux7Dt^dg7Z1JP6>VjA3+BPP=R<(d`3c6cWvN<&s zH8vo{2{f5(%ie%zoJb4r#m`GSvc-)koUt}qF(1lNO^cqGNNc}D8ar&>befO~#A=l; z-wPZi((pg|+0w%?4tE9I3p|^joZx)y=wwF#feACAlb_~BDuJ~~CejaXpB}I(1WD5w zL);bzQ#_s1`87oIrpcOTJfw(mw2(@Rl&%p}yw42Yl)-8jE_LcMw zy|B@h)s5m#Q(G}3K}jV_)BVNr*fIudR#ziwN>tnM(r8&_bsc4PhpAsf!?m^sLOkwK z%K8MHmxMx%P+9Z(?#sJpD&$|bw$Inpk5^r-nqRf%dg@wgGMrzvd%nJDy!UGFjYsnJ z!P_2bW%bzpSC16@LQVbaqnAf#ysc_GYAPWp2O=0jZHH$mf;wZ76EYc(i7K$n;+^Bx zbUdkKql0X2ZDaA5n_xl<1C$%fVb5z4OwgfrqAlIUGN~Kkx6PT_h4An)Tfq>^_Y`GY z4hQp9O#{Dp`Qlta&Ijb#z?vEFn!9I!#`X&S7LLI=gmdom%)%=;2QQ+g?>fev-*mZz z~?UuBq6D zPAxnM$E337!EaAt;G^QGBPNuaoDp%v@rE%q-xbG2QFwKQBn*i}SyPT-*TvD@7e{-i zMBUBt_LNh1gf{EqSzSD*(bS_qjK|#Z?IQWr(3E3KyFOKe+l62`zI-X+uP

    |PipE{Pziub8(zA{V9Xi~-53Gk7v9yy2Rx7M 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 F_&?>wVV3{^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/job.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/__pycache__/job.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..596d669d373b98807d759e9fdced2e6988a02ea2 GIT binary patch literal 11353 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 VuE08XU-N7cJ0~+=3%Ic}{$Bwde_H?m literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/day.py b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/day.py new file mode 100644 index 00000000..f4b2a065 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/day.py @@ -0,0 +1,431 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Bulkexports + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class DayInstance(InstanceResource): + """ + :ivar redirect_to: + :ivar day: The ISO 8601 format date of the resources in the file, for a UTC day + :ivar size: The size of the day's data file in bytes + :ivar create_date: The ISO 8601 format date when resources is created + :ivar friendly_name: The friendly name specified when creating the job + :ivar resource_type: The type of communication – Messages, Calls, Conferences, and Participants + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + resource_type: str, + day: Optional[str] = None, + ): + super().__init__(version) + + self.redirect_to: Optional[str] = payload.get("redirect_to") + self.day: Optional[str] = payload.get("day") + self.size: Optional[int] = deserialize.integer(payload.get("size")) + self.create_date: Optional[str] = payload.get("create_date") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.resource_type: Optional[str] = payload.get("resource_type") + + self._solution = { + "resource_type": resource_type, + "day": day or self.day, + } + self._context: Optional[DayContext] = None + + @property + def _proxy(self) -> "DayContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DayContext for this DayInstance + """ + if self._context is None: + self._context = DayContext( + self._version, + resource_type=self._solution["resource_type"], + day=self._solution["day"], + ) + return self._context + + def fetch(self) -> "DayInstance": + """ + Fetch the DayInstance + + + :returns: The fetched DayInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DayInstance": + """ + Asynchronous coroutine to fetch the DayInstance + + + :returns: The fetched DayInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DayContext(InstanceContext): + + def __init__(self, version: Version, resource_type: str, day: str): + """ + Initialize the DayContext + + :param version: Version that contains the resource + :param resource_type: The type of communication – Messages, Calls, Conferences, and Participants + :param day: The ISO 8601 format date of the resources in the file, for a UTC day + """ + super().__init__(version) + + # Path Solution + self._solution = { + "resource_type": resource_type, + "day": day, + } + self._uri = "/Exports/{resource_type}/Days/{day}".format(**self._solution) + + def fetch(self) -> DayInstance: + """ + Fetch the DayInstance + + + :returns: The fetched DayInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DayInstance( + self._version, + payload, + resource_type=self._solution["resource_type"], + day=self._solution["day"], + ) + + async def fetch_async(self) -> DayInstance: + """ + Asynchronous coroutine to fetch the DayInstance + + + :returns: The fetched DayInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DayInstance( + self._version, + payload, + resource_type=self._solution["resource_type"], + day=self._solution["day"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DayPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> DayInstance: + """ + Build an instance of DayInstance + + :param payload: Payload response from the API + """ + return DayInstance( + self._version, payload, resource_type=self._solution["resource_type"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DayList(ListResource): + + def __init__(self, version: Version, resource_type: str): + """ + Initialize the DayList + + :param version: Version that contains the resource + :param resource_type: The type of communication – Messages, Calls, Conferences, and Participants + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "resource_type": resource_type, + } + self._uri = "/Exports/{resource_type}/Days".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DayInstance]: + """ + Streams DayInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DayInstance]: + """ + Asynchronously streams DayInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DayInstance]: + """ + Lists DayInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DayInstance]: + """ + Asynchronously lists DayInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DayPage: + """ + Retrieve a single page of DayInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DayInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DayPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DayPage: + """ + Asynchronously retrieve a single page of DayInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DayInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DayPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DayPage: + """ + Retrieve a specific page of DayInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DayInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DayPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DayPage: + """ + Asynchronously retrieve a specific page of DayInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DayInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DayPage(self._version, response, self._solution) + + def get(self, day: str) -> DayContext: + """ + Constructs a DayContext + + :param day: The ISO 8601 format date of the resources in the file, for a UTC day + """ + return DayContext( + self._version, resource_type=self._solution["resource_type"], day=day + ) + + def __call__(self, day: str) -> DayContext: + """ + Constructs a DayContext + + :param day: The ISO 8601 format date of the resources in the file, for a UTC day + """ + return DayContext( + self._version, resource_type=self._solution["resource_type"], day=day + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/export_custom_job.py b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/export_custom_job.py new file mode 100644 index 00000000..72d0e9b3 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/export_custom_job.py @@ -0,0 +1,400 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Bulkexports + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ExportCustomJobInstance(InstanceResource): + """ + :ivar friendly_name: The friendly name specified when creating the job + :ivar resource_type: The type of communication – Messages, Calls, Conferences, and Participants + :ivar start_day: The start day for the custom export specified when creating the job + :ivar end_day: The end day for the export specified when creating the job + :ivar webhook_url: The optional webhook url called on completion of the job. If this is supplied, `WebhookMethod` must also be supplied. + :ivar webhook_method: This is the method used to call the webhook on completion of the job. If this is supplied, `WebhookUrl` must also be supplied. + :ivar email: The optional email to send the completion notification to + :ivar job_sid: The unique job_sid returned when the custom export was created + :ivar details: The details of a job which is an object that contains an array of status grouped by `status` state. Each `status` object has a `status` string, a count which is the number of days in that `status`, and list of days in that `status`. The day strings are in the format yyyy-MM-dd. As an example, a currently running job may have a status object for COMPLETED and a `status` object for SUBMITTED each with its own count and list of days. + :ivar job_queue_position: This is the job position from the 1st in line. Your queue position will never increase. As jobs ahead of yours in the queue are processed, the queue position number will decrease + :ivar estimated_completion_time: this is the time estimated until your job is complete. This is calculated each time you request the job list. The time is calculated based on the current rate of job completion (which may vary) and your job queue position + """ + + def __init__(self, version: Version, payload: Dict[str, Any], resource_type: str): + super().__init__(version) + + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.resource_type: Optional[str] = payload.get("resource_type") + self.start_day: Optional[str] = payload.get("start_day") + self.end_day: Optional[str] = payload.get("end_day") + self.webhook_url: Optional[str] = payload.get("webhook_url") + self.webhook_method: Optional[str] = payload.get("webhook_method") + self.email: Optional[str] = payload.get("email") + self.job_sid: Optional[str] = payload.get("job_sid") + self.details: Optional[Dict[str, object]] = payload.get("details") + self.job_queue_position: Optional[str] = payload.get("job_queue_position") + self.estimated_completion_time: Optional[str] = payload.get( + "estimated_completion_time" + ) + + self._solution = { + "resource_type": resource_type, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ExportCustomJobPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ExportCustomJobInstance: + """ + Build an instance of ExportCustomJobInstance + + :param payload: Payload response from the API + """ + return ExportCustomJobInstance( + self._version, payload, resource_type=self._solution["resource_type"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ExportCustomJobList(ListResource): + + def __init__(self, version: Version, resource_type: str): + """ + Initialize the ExportCustomJobList + + :param version: Version that contains the resource + :param resource_type: The type of communication – Messages, Calls, Conferences, and Participants + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "resource_type": resource_type, + } + self._uri = "/Exports/{resource_type}/Jobs".format(**self._solution) + + def create( + self, + start_day: str, + end_day: str, + friendly_name: str, + webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + ) -> ExportCustomJobInstance: + """ + Create the ExportCustomJobInstance + + :param start_day: The start day for the custom export specified as a string in the format of yyyy-mm-dd + :param end_day: The end day for the custom export specified as a string in the format of yyyy-mm-dd. End day is inclusive and must be 2 days earlier than the current UTC day. + :param friendly_name: The friendly name specified when creating the job + :param webhook_url: The optional webhook url called on completion of the job. If this is supplied, `WebhookMethod` must also be supplied. If you set neither webhook nor email, you will have to check your job's status manually. + :param webhook_method: This is the method used to call the webhook on completion of the job. If this is supplied, `WebhookUrl` must also be supplied. + :param email: The optional email to send the completion notification to. You can set both webhook, and email, or one or the other. If you set neither, the job will run but you will have to query to determine your job's status. + + :returns: The created ExportCustomJobInstance + """ + + data = values.of( + { + "StartDay": start_day, + "EndDay": end_day, + "FriendlyName": friendly_name, + "WebhookUrl": webhook_url, + "WebhookMethod": webhook_method, + "Email": email, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ExportCustomJobInstance( + self._version, payload, resource_type=self._solution["resource_type"] + ) + + async def create_async( + self, + start_day: str, + end_day: str, + friendly_name: str, + webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + ) -> ExportCustomJobInstance: + """ + Asynchronously create the ExportCustomJobInstance + + :param start_day: The start day for the custom export specified as a string in the format of yyyy-mm-dd + :param end_day: The end day for the custom export specified as a string in the format of yyyy-mm-dd. End day is inclusive and must be 2 days earlier than the current UTC day. + :param friendly_name: The friendly name specified when creating the job + :param webhook_url: The optional webhook url called on completion of the job. If this is supplied, `WebhookMethod` must also be supplied. If you set neither webhook nor email, you will have to check your job's status manually. + :param webhook_method: This is the method used to call the webhook on completion of the job. If this is supplied, `WebhookUrl` must also be supplied. + :param email: The optional email to send the completion notification to. You can set both webhook, and email, or one or the other. If you set neither, the job will run but you will have to query to determine your job's status. + + :returns: The created ExportCustomJobInstance + """ + + data = values.of( + { + "StartDay": start_day, + "EndDay": end_day, + "FriendlyName": friendly_name, + "WebhookUrl": webhook_url, + "WebhookMethod": webhook_method, + "Email": email, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ExportCustomJobInstance( + self._version, payload, resource_type=self._solution["resource_type"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ExportCustomJobInstance]: + """ + Streams ExportCustomJobInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ExportCustomJobInstance]: + """ + Asynchronously streams ExportCustomJobInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ExportCustomJobInstance]: + """ + Lists ExportCustomJobInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ExportCustomJobInstance]: + """ + Asynchronously lists ExportCustomJobInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ExportCustomJobPage: + """ + Retrieve a single page of ExportCustomJobInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ExportCustomJobInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ExportCustomJobPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ExportCustomJobPage: + """ + Asynchronously retrieve a single page of ExportCustomJobInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ExportCustomJobInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ExportCustomJobPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ExportCustomJobPage: + """ + Retrieve a specific page of ExportCustomJobInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ExportCustomJobInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ExportCustomJobPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ExportCustomJobPage: + """ + Asynchronously retrieve a specific page of ExportCustomJobInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ExportCustomJobInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ExportCustomJobPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/job.py b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/job.py new file mode 100644 index 00000000..5358ffa8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export/job.py @@ -0,0 +1,253 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Bulkexports + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class JobInstance(InstanceResource): + """ + :ivar resource_type: The type of communication – Messages, Calls, Conferences, and Participants + :ivar friendly_name: The friendly name specified when creating the job + :ivar details: The details of a job which is an object that contains an array of status grouped by `status` state. Each `status` object has a `status` string, a count which is the number of days in that `status`, and list of days in that `status`. The day strings are in the format yyyy-MM-dd. As an example, a currently running job may have a status object for COMPLETED and a `status` object for SUBMITTED each with its own count and list of days. + :ivar start_day: The start time for the export specified when creating the job + :ivar end_day: The end time for the export specified when creating the job + :ivar job_sid: The job_sid returned when the export was created + :ivar webhook_url: The optional webhook url called on completion + :ivar webhook_method: This is the method used to call the webhook + :ivar email: The optional email to send the completion notification to + :ivar url: + :ivar job_queue_position: This is the job position from the 1st in line. Your queue position will never increase. As jobs ahead of yours in the queue are processed, the queue position number will decrease + :ivar estimated_completion_time: this is the time estimated until your job is complete. This is calculated each time you request the job list. The time is calculated based on the current rate of job completion (which may vary) and your job queue position + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], job_sid: Optional[str] = None + ): + super().__init__(version) + + self.resource_type: Optional[str] = payload.get("resource_type") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.details: Optional[Dict[str, object]] = payload.get("details") + self.start_day: Optional[str] = payload.get("start_day") + self.end_day: Optional[str] = payload.get("end_day") + self.job_sid: Optional[str] = payload.get("job_sid") + self.webhook_url: Optional[str] = payload.get("webhook_url") + self.webhook_method: Optional[str] = payload.get("webhook_method") + self.email: Optional[str] = payload.get("email") + self.url: Optional[str] = payload.get("url") + self.job_queue_position: Optional[str] = payload.get("job_queue_position") + self.estimated_completion_time: Optional[str] = payload.get( + "estimated_completion_time" + ) + + self._solution = { + "job_sid": job_sid or self.job_sid, + } + self._context: Optional[JobContext] = None + + @property + def _proxy(self) -> "JobContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: JobContext for this JobInstance + """ + if self._context is None: + self._context = JobContext( + self._version, + job_sid=self._solution["job_sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the JobInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the JobInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "JobInstance": + """ + Fetch the JobInstance + + + :returns: The fetched JobInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "JobInstance": + """ + Asynchronous coroutine to fetch the JobInstance + + + :returns: The fetched JobInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class JobContext(InstanceContext): + + def __init__(self, version: Version, job_sid: str): + """ + Initialize the JobContext + + :param version: Version that contains the resource + :param job_sid: The unique string that that we created to identify the Bulk Export job + """ + super().__init__(version) + + # Path Solution + self._solution = { + "job_sid": job_sid, + } + self._uri = "/Exports/Jobs/{job_sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the JobInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the JobInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> JobInstance: + """ + Fetch the JobInstance + + + :returns: The fetched JobInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return JobInstance( + self._version, + payload, + job_sid=self._solution["job_sid"], + ) + + async def fetch_async(self) -> JobInstance: + """ + Asynchronous coroutine to fetch the JobInstance + + + :returns: The fetched JobInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return JobInstance( + self._version, + payload, + job_sid=self._solution["job_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class JobList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the JobList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, job_sid: str) -> JobContext: + """ + Constructs a JobContext + + :param job_sid: The unique string that that we created to identify the Bulk Export job + """ + return JobContext(self._version, job_sid=job_sid) + + def __call__(self, job_sid: str) -> JobContext: + """ + Constructs a JobContext + + :param job_sid: The unique string that that we created to identify the Bulk Export job + """ + return JobContext(self._version, job_sid=job_sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export_configuration.py b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export_configuration.py new file mode 100644 index 00000000..20764276 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/bulkexports/v1/export_configuration.py @@ -0,0 +1,312 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Bulkexports + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ExportConfigurationInstance(InstanceResource): + """ + :ivar enabled: If true, Twilio will automatically generate every day's file when the day is over. + :ivar webhook_url: Stores the URL destination for the method specified in webhook_method. + :ivar webhook_method: Sets whether Twilio should call a webhook URL when the automatic generation is complete, using GET or POST. The actual destination is set in the webhook_url + :ivar resource_type: The type of communication – Messages, Calls, Conferences, and Participants + :ivar url: The URL of this resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + resource_type: Optional[str] = None, + ): + super().__init__(version) + + self.enabled: Optional[bool] = payload.get("enabled") + self.webhook_url: Optional[str] = payload.get("webhook_url") + self.webhook_method: Optional[str] = payload.get("webhook_method") + self.resource_type: Optional[str] = payload.get("resource_type") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "resource_type": resource_type or self.resource_type, + } + self._context: Optional[ExportConfigurationContext] = None + + @property + def _proxy(self) -> "ExportConfigurationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ExportConfigurationContext for this ExportConfigurationInstance + """ + if self._context is None: + self._context = ExportConfigurationContext( + self._version, + resource_type=self._solution["resource_type"], + ) + return self._context + + def fetch(self) -> "ExportConfigurationInstance": + """ + Fetch the ExportConfigurationInstance + + + :returns: The fetched ExportConfigurationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ExportConfigurationInstance": + """ + Asynchronous coroutine to fetch the ExportConfigurationInstance + + + :returns: The fetched ExportConfigurationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + enabled: Union[bool, object] = values.unset, + webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + ) -> "ExportConfigurationInstance": + """ + Update the ExportConfigurationInstance + + :param enabled: If true, Twilio will automatically generate every day's file when the day is over. + :param webhook_url: Stores the URL destination for the method specified in webhook_method. + :param webhook_method: Sets whether Twilio should call a webhook URL when the automatic generation is complete, using GET or POST. The actual destination is set in the webhook_url + + :returns: The updated ExportConfigurationInstance + """ + return self._proxy.update( + enabled=enabled, + webhook_url=webhook_url, + webhook_method=webhook_method, + ) + + async def update_async( + self, + enabled: Union[bool, object] = values.unset, + webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + ) -> "ExportConfigurationInstance": + """ + Asynchronous coroutine to update the ExportConfigurationInstance + + :param enabled: If true, Twilio will automatically generate every day's file when the day is over. + :param webhook_url: Stores the URL destination for the method specified in webhook_method. + :param webhook_method: Sets whether Twilio should call a webhook URL when the automatic generation is complete, using GET or POST. The actual destination is set in the webhook_url + + :returns: The updated ExportConfigurationInstance + """ + return await self._proxy.update_async( + enabled=enabled, + webhook_url=webhook_url, + webhook_method=webhook_method, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ExportConfigurationContext(InstanceContext): + + def __init__(self, version: Version, resource_type: str): + """ + Initialize the ExportConfigurationContext + + :param version: Version that contains the resource + :param resource_type: The type of communication – Messages, Calls, Conferences, and Participants + """ + super().__init__(version) + + # Path Solution + self._solution = { + "resource_type": resource_type, + } + self._uri = "/Exports/{resource_type}/Configuration".format(**self._solution) + + def fetch(self) -> ExportConfigurationInstance: + """ + Fetch the ExportConfigurationInstance + + + :returns: The fetched ExportConfigurationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ExportConfigurationInstance( + self._version, + payload, + resource_type=self._solution["resource_type"], + ) + + async def fetch_async(self) -> ExportConfigurationInstance: + """ + Asynchronous coroutine to fetch the ExportConfigurationInstance + + + :returns: The fetched ExportConfigurationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ExportConfigurationInstance( + self._version, + payload, + resource_type=self._solution["resource_type"], + ) + + def update( + self, + enabled: Union[bool, object] = values.unset, + webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + ) -> ExportConfigurationInstance: + """ + Update the ExportConfigurationInstance + + :param enabled: If true, Twilio will automatically generate every day's file when the day is over. + :param webhook_url: Stores the URL destination for the method specified in webhook_method. + :param webhook_method: Sets whether Twilio should call a webhook URL when the automatic generation is complete, using GET or POST. The actual destination is set in the webhook_url + + :returns: The updated ExportConfigurationInstance + """ + + data = values.of( + { + "Enabled": serialize.boolean_to_string(enabled), + "WebhookUrl": webhook_url, + "WebhookMethod": webhook_method, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ExportConfigurationInstance( + self._version, payload, resource_type=self._solution["resource_type"] + ) + + async def update_async( + self, + enabled: Union[bool, object] = values.unset, + webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + ) -> ExportConfigurationInstance: + """ + Asynchronous coroutine to update the ExportConfigurationInstance + + :param enabled: If true, Twilio will automatically generate every day's file when the day is over. + :param webhook_url: Stores the URL destination for the method specified in webhook_method. + :param webhook_method: Sets whether Twilio should call a webhook URL when the automatic generation is complete, using GET or POST. The actual destination is set in the webhook_url + + :returns: The updated ExportConfigurationInstance + """ + + data = values.of( + { + "Enabled": serialize.boolean_to_string(enabled), + "WebhookUrl": webhook_url, + "WebhookMethod": webhook_method, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ExportConfigurationInstance( + self._version, payload, resource_type=self._solution["resource_type"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ExportConfigurationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ExportConfigurationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, resource_type: str) -> ExportConfigurationContext: + """ + Constructs a ExportConfigurationContext + + :param resource_type: The type of communication – Messages, Calls, Conferences, and Participants + """ + return ExportConfigurationContext(self._version, resource_type=resource_type) + + def __call__(self, resource_type: str) -> ExportConfigurationContext: + """ + Constructs a ExportConfigurationContext + + :param resource_type: The type of communication – Messages, Calls, Conferences, and Participants + """ + return ExportConfigurationContext(self._version, resource_type=resource_type) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/ChatBase.py b/venv/Lib/site-packages/twilio/rest/chat/ChatBase.py new file mode 100644 index 00000000..6d8656da --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/ChatBase.py @@ -0,0 +1,66 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.chat.v1 import V1 +from twilio.rest.chat.v2 import V2 +from twilio.rest.chat.v3 import V3 + + +class ChatBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Chat Domain + + :returns: Domain for Chat + """ + super().__init__(twilio, "https://chat.twilio.com") + self._v1: Optional[V1] = None + self._v2: Optional[V2] = None + self._v3: Optional[V3] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Chat + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + @property + def v2(self) -> V2: + """ + :returns: Versions v2 of Chat + """ + if self._v2 is None: + self._v2 = V2(self) + return self._v2 + + @property + def v3(self) -> V3: + """ + :returns: Versions v3 of Chat + """ + if self._v3 is None: + self._v3 = V3(self) + return self._v3 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/__init__.py b/venv/Lib/site-packages/twilio/rest/chat/__init__.py new file mode 100644 index 00000000..9608a0fd --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/__init__.py @@ -0,0 +1,35 @@ +from warnings import warn + +from twilio.rest.chat.ChatBase import ChatBase +from twilio.rest.chat.v2.credential import CredentialList +from twilio.rest.chat.v2.service import ServiceList +from twilio.rest.chat.v3.channel import ChannelList + + +class Chat(ChatBase): + @property + def credentials(self) -> CredentialList: + warn( + "credentials is deprecated. Use v2.credentials instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.credentials + + @property + def services(self) -> ServiceList: + warn( + "services is deprecated. Use v2.services instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.services + + @property + def channels(self) -> ChannelList: + warn( + "channels is deprecated. Use v3.channels instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v3.channels diff --git a/venv/Lib/site-packages/twilio/rest/chat/__pycache__/ChatBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/__pycache__/ChatBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d69d80f53f7abe2ce970b9bff2d4a38da143efa GIT binary patch literal 2651 zcmd58O>f*pbnNwdy&w5#3rPx9J1rDxLETjn4pk@>ZG%b#G!=v%tVM%s&t^@%_A++1 z+0`C$h(sc_DiT7;l>>(=KZQ#{94d>R5C?97w4&;X_r~7MMh!yTI`+PK^WK{`?`xj- z$B~f&fpO>OFB(7Sg#3n!{>Y}tULBAv;t-QKilcf;Q#Dlu@r;*gYNjS}&C51*QN)#Lj7F}#{|I+mZdNqk)AS$r65k;+Vu38O%X|>#QX?TGdak~Km z^8xjPh;qk`Xw=};mIpK~f5q~=PNnb%rmU>Q#$qdS1K;uh*XM(#<@$(S@m%glfT=g8 zC7h9P)=n~=z%=b-Pr&+XC@@Y;1&T~{6rQQ88>9}!wq7zdo^>)@ud9x>uI;26%$%ee zK+O(O^O9Nssy;+5!u}G_a_gEovO!iAbM#YEHe%yS!-_6jA&>Rww(GfptqvKe0gg8A zT?g=;vPGf+b5re+yKp^vilgkLd!WF9$_5(bs_$dMLydBD)N-b~h_xZdg6~GI<+)uh zgN;@}1~8bI=VZ(Y9<2yJoJ%>h9tet(1BvcrKdm;9D~U%HJ7``jXX9+R(&8dE7<1t; z#^MZXPa~K?Fk8;VTFAY+D1v=)o-vtl#zJ&}(zRzxSLSM;gJ;pwJiIVwamj>Vn$W)FshJ@Vy%wU4ZgM}t)L$WFQ+(m4=0d>@pN(v_E7W@$f3Hy~7SF+$p&ra}E+qROfm z1HA(JExE6VqcDYdA{8$IjMesZw>XGNd-@Cz_Yka+-2y3%-#fo~{z388Unh@mzy9s& z#{8WR9*!Nmx4OByF(zIHu@}nwnZvvv2P;Jm!4!alzRwK%KJyj|y@KF{^KAAo&yJv} z27>23n;rIS_U(W73^+-}V!zlT9i^;x`QVyg7eU*F&!R=^0=lf@b*SJixLe0&;N5rcjUs7Y=jl8zl-;ucLN#-p2paLYnzbX1#?48t1Q&E@% z)#T803XC-aXT?Lj#MoExHAy%E|7*y05F0H4pCu7>XumCc^oe(i4plMI7A{#to7&N1c$Hu$ecotEn_3+y}b(X?CN#K!2z z)-N#oaWQ3J|CB+Bj}1{OHg@{XKk``*m==FR7HI!R!>|MFt- zlSIgOTtp)lDz&GeY!HiBfY~ldbtl-O4lesXf6N{#I-{chZ&Iv{>>Uy^6OxxT8q+^z{ zid~@55}aL^2G#-wibj}%)MfzLAe88WMRbu$mO$ls(Gu6??a)_`1*ih3)PllB!B+)T zZb1{Pv8>|DxJO@M)LUV0L5PyVjFe&S+G7wK#B10r!4m-rh9!P%kRXuPWJ!)J&3Q>_ z>X9}}vhvK@%|e3|uGw6(XqnN1=}{}EJ>gWVjOI>wxZI)nTY{hDo>^FSXoWgi znc-gj?#VEOU2>m66>N9G7b~NFM@t;|Qs&f|=XfIRcy8iO9+EMhe>gQYm!G73*(;Uv zl@iqE-U5^?U!iU#KW)FvbK9fW%aGGtpgiwYZO1N+Fv`7=0esH}-LBysb+`tO1=9H=ukX?t?Ua!vDp$$=|5=BttODQ*Uu+(bT?0AhV8@Ypliq^}x= zYZj?t_({VkmaG*A^^{?}S}~o_qLx{yOqsXJu$hB9$*>s%_E{V?%(YdIS}#ljQ55*+ zk3g)Gy;%BCRAQGmpZ_K>)g+>H2Ebt^)U?fOXwn)ct-a|NgwcXC1UY819lnaMCG;t; zcW{5bt#a5_$fuW^0D-S4!?(pBJY_%eN(3kM2iiG>_bgzbokyd5b!Gx0G)P(BF5cQ> t^=_T%ads7!_ CredentialList: + if self._credentials is None: + self._credentials = CredentialList(self) + return self._credentials + + @property + def services(self) -> ServiceList: + if self._services is None: + self._services = ServiceList(self) + return self._services + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45ca2c6d61c919224aa7c7c01861eb152f304837 GIT binary patch literal 2384 zcmcf?O>YxNbauVAH@5Rpi1-jmG!1RRLaZB=R;q=fQi4!a8YoFq$#Og0cqe$v+Uw44 zOdVM$he&lK5T`0R_6W*P=_M2-(27WvdZ>C!8&DCazBjWruAu6zyX!aabLM@`^G}0= z83NC(pTDk7rU>~JiSCn(k^K@No5Ud{;%JWUX*Ip1YltVjM9nA}5;weLEmcZMJn5xt zX33Oz${VO>%=j+v7JzRm$I#ae8&DwBP2uNS*W@Jt@sY7H|&63<8?0V zkUMm#g<{4Sefc5-Squ&3s=zB`tktK2`=A+P^3*n^?cNJ)B;W%TC1DIXl0<+$fCR_KCKx_V)Lfu6fEYbn#Y%L^BZah^RpkVf`O=>H?x^m2pO!G>N` z74U^6PpO7sBPbRMK8Wpxdpa%Vg9YxQI-~TsVrcD90+j><7^R3smNVd?GRe?kx+P8o+0=yo?3tI;Cqb zzBpeje-7F~`IFh%h4Ks!u7`f3-1MPt=b&A}a+BAa{&X6}s+Njg}aK16H$(Q&yLG1Q@|_0MFOR(;OKX+DP9wk8BzmxeNZD&O7L(+)GIJ-dJp=Izx}HKHc6X&(-XZ!)<#0qkx!d!$M#UZ zF7sdP=E*&6F0YGW&=W9SffR4R65tM090V9;`x3o61o8FJlc;+Fz#91_JNzg+c0W6| zlYQ$6weE%w=$X#U!`%4e;e(Hc>HT54V^T2+y8mZ*;xHTt0gk{T(gqGjnSWqPlZ)oaZj-dMyuQkN zEqz7!O&9(@Y`QF5UU$3}6}$m$1-)nE#OY}kRXYSl`l(&1x^@1a7ONv?)lju??plje z)AwEzF=KcjV{x}C!UA6d%+MOy%aD;t8CHG}uUy@(akz3B#%jK^;vt@6>|2JEiK8fxX+H*7ln6p0CJ-BpFJ^^%9%Fe;900EDx{qYni2<}ka0msT z0eHSn_6#%m{#NrDfn{%$q=xqNMDoq8ul^*k>?gVm@L!20woajFq9>Zz%OsPNTgU$* zu*eAI8FTqulxEEFD-c>LY&G2aHGvl@I;d{FwPXj}if5X@vPK8`C2E?$6lutH=jzFOu#stq};@-_`*D^3NS5B0f|j4FW+85)3iVIoMt>5Bih(5 aIk8LL-X$OIlJ}mb#3?Lx?=7@H_Ky-dSWGm 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�V>QUp?!OC2VgGK4jvlgYa2K#+Y ziZc)hCqh6pScr9%=b25^#(Bw8wxApD?|s2ro8F7#)=sV0?DhB8WP zGNt)-n_&G{)TDCCvZ81fu(#}|IwVp_Dh=j5QIcvJ=@pb-ZBEzjDrA=eC>7=uVo{mM zM#X&$S20Y+kdc6z7+Pi0)BCPn>hCk|k^VCh2y@AV&C*t$=RdWS^0v>KIDX|%xq}Pb z!4!A!r(8#h>-dD*@d?-Y3AgnVZsRB1>U)lWg@2BpYw+EJaUFd3dhJOI5A$>HJ&t+q b#qAaRmdi)(ad_R^&}~QH*k>HQSzrDyodkif literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/credential.py b/venv/Lib/site-packages/twilio/rest/chat/v1/credential.py new file mode 100644 index 00000000..3bd48b11 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v1/credential.py @@ -0,0 +1,711 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CredentialInstance(InstanceResource): + + class PushService(object): + GCM = "gcm" + APN = "apn" + FCM = "fcm" + + """ + :ivar sid: The unique string that we created to identify the Credential resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/api/rest/account) that created the Credential resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar type: + :ivar sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :ivar date_created: The date and time in GMT when the resource was created specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar url: The absolute URL of the Credential resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["CredentialInstance.PushService"] = payload.get("type") + self.sandbox: Optional[str] = payload.get("sandbox") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[CredentialContext] = None + + @property + def _proxy(self) -> "CredentialContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CredentialContext for this CredentialInstance + """ + if self._context is None: + self._context = CredentialContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CredentialInstance": + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CredentialInstance": + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Asynchronous coroutine to update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the CredentialContext + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the Credential resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Credentials/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CredentialInstance: + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CredentialInstance: + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronous coroutine to update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CredentialInstance: + """ + Build an instance of CredentialInstance + + :param payload: Payload response from the API + """ + return CredentialInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CredentialList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CredentialList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Credentials" + + def create( + self, + type: "CredentialInstance.PushService", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Create the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + async def create_async( + self, + type: "CredentialInstance.PushService", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronously create the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CredentialInstance]: + """ + Streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CredentialInstance]: + """ + Asynchronously streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Asynchronously lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Asynchronously retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + def get_page(self, target_url: str) -> CredentialPage: + """ + Retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CredentialPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CredentialPage: + """ + Asynchronously retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CredentialPage(self._version, response) + + def get(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: The Twilio-provided string that uniquely identifies the Credential resource to update. + """ + return CredentialContext(self._version, sid=sid) + + def __call__(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: The Twilio-provided string that uniquely identifies the Credential resource to update. + """ + return CredentialContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/__init__.py b/venv/Lib/site-packages/twilio/rest/chat/v1/service/__init__.py new file mode 100644 index 00000000..26fde402 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v1/service/__init__.py @@ -0,0 +1,1359 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.chat.v1.service.channel import ChannelList +from twilio.rest.chat.v1.service.role import RoleList +from twilio.rest.chat.v1.service.user import UserList + + +class ServiceInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Service resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/api/rest/account) that created the Service resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT when the resource was created specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar default_service_role_sid: The service role assigned to users when they are added to the service. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :ivar default_channel_role_sid: The channel role assigned to users when they are added to a channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :ivar default_channel_creator_role_sid: The channel role assigned to a channel creator when they join a new channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :ivar read_status_enabled: Whether the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature is enabled. The default is `true`. + :ivar reachability_enabled: Whether the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) is enabled for this Service instance. The default is `false`. + :ivar typing_indicator_timeout: How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + :ivar consumption_report_interval: DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + :ivar limits: An object that describes the limits of the service instance. The `limits` object contains `channel_members` to describe the members/channel limit and `user_channels` to describe the channels/user limit. `channel_members` can be 1,000 or less, with a default of 250. `user_channels` can be 1,000 or less, with a default value of 100. + :ivar webhooks: An object that contains information about the webhooks configured for this service. + :ivar pre_webhook_url: The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + :ivar post_webhook_url: The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + :ivar webhook_method: The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :ivar webhook_filters: The list of WebHook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :ivar notifications: The notification configuration for the Service instance. See [Push Notification Configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more information. + :ivar url: The absolute URL of the Service resource. + :ivar links: The absolute URLs of the Service's [Channels](https://www.twilio.com/docs/chat/api/channels), [Roles](https://www.twilio.com/docs/chat/api/roles), and [Users](https://www.twilio.com/docs/chat/api/users). + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.default_service_role_sid: Optional[str] = payload.get( + "default_service_role_sid" + ) + self.default_channel_role_sid: Optional[str] = payload.get( + "default_channel_role_sid" + ) + self.default_channel_creator_role_sid: Optional[str] = payload.get( + "default_channel_creator_role_sid" + ) + self.read_status_enabled: Optional[bool] = payload.get("read_status_enabled") + self.reachability_enabled: Optional[bool] = payload.get("reachability_enabled") + self.typing_indicator_timeout: Optional[int] = deserialize.integer( + payload.get("typing_indicator_timeout") + ) + self.consumption_report_interval: Optional[int] = deserialize.integer( + payload.get("consumption_report_interval") + ) + self.limits: Optional[Dict[str, object]] = payload.get("limits") + self.webhooks: Optional[Dict[str, object]] = payload.get("webhooks") + self.pre_webhook_url: Optional[str] = payload.get("pre_webhook_url") + self.post_webhook_url: Optional[str] = payload.get("post_webhook_url") + self.webhook_method: Optional[str] = payload.get("webhook_method") + self.webhook_filters: Optional[List[str]] = payload.get("webhook_filters") + self.notifications: Optional[Dict[str, object]] = payload.get("notifications") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ServiceContext] = None + + @property + def _proxy(self) -> "ServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ServiceContext for this ServiceInstance + """ + if self._context is None: + self._context = ServiceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ServiceInstance": + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ServiceInstance": + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + webhooks_on_message_send_url: Union[str, object] = values.unset, + webhooks_on_message_send_method: Union[str, object] = values.unset, + webhooks_on_message_update_url: Union[str, object] = values.unset, + webhooks_on_message_update_method: Union[str, object] = values.unset, + webhooks_on_message_remove_url: Union[str, object] = values.unset, + webhooks_on_message_remove_method: Union[str, object] = values.unset, + webhooks_on_channel_add_url: Union[str, object] = values.unset, + webhooks_on_channel_add_method: Union[str, object] = values.unset, + webhooks_on_channel_destroy_url: Union[str, object] = values.unset, + webhooks_on_channel_destroy_method: Union[str, object] = values.unset, + webhooks_on_channel_update_url: Union[str, object] = values.unset, + webhooks_on_channel_update_method: Union[str, object] = values.unset, + webhooks_on_member_add_url: Union[str, object] = values.unset, + webhooks_on_member_add_method: Union[str, object] = values.unset, + webhooks_on_member_remove_url: Union[str, object] = values.unset, + webhooks_on_member_remove_method: Union[str, object] = values.unset, + webhooks_on_message_sent_url: Union[str, object] = values.unset, + webhooks_on_message_sent_method: Union[str, object] = values.unset, + webhooks_on_message_updated_url: Union[str, object] = values.unset, + webhooks_on_message_updated_method: Union[str, object] = values.unset, + webhooks_on_message_removed_url: Union[str, object] = values.unset, + webhooks_on_message_removed_method: Union[str, object] = values.unset, + webhooks_on_channel_added_url: Union[str, object] = values.unset, + webhooks_on_channel_added_method: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_url: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_method: Union[str, object] = values.unset, + webhooks_on_channel_updated_url: Union[str, object] = values.unset, + webhooks_on_channel_updated_method: Union[str, object] = values.unset, + webhooks_on_member_added_url: Union[str, object] = values.unset, + webhooks_on_member_added_method: Union[str, object] = values.unset, + webhooks_on_member_removed_url: Union[str, object] = values.unset, + webhooks_on_member_removed_method: Union[str, object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + ) -> "ServiceInstance": + """ + Update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param default_service_role_sid: The service role assigned to users when they are added to the service. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param default_channel_role_sid: The channel role assigned to users when they are added to a channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param default_channel_creator_role_sid: The channel role assigned to a channel creator when they join a new channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param read_status_enabled: Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + :param reachability_enabled: Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + :param typing_indicator_timeout: How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + :param consumption_report_interval: DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + :param notifications_new_message_enabled: Whether to send a notification when a new message is added to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_new_message_template: The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_added_to_channel_enabled: Whether to send a notification when a member is added to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_added_to_channel_template: The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_removed_from_channel_enabled: Whether to send a notification to a user when they are removed from a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_removed_from_channel_template: The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_invited_to_channel_enabled: Whether to send a notification when a user is invited to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_invited_to_channel_template: The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param pre_webhook_url: The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + :param post_webhook_url: The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + :param webhook_method: The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_filters: The list of WebHook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhooks_on_message_send_url: The URL of the webhook to call in response to the `on_message_send` event using the `webhooks.on_message_send.method` HTTP method. + :param webhooks_on_message_send_method: The HTTP method to use when calling the `webhooks.on_message_send.url`. + :param webhooks_on_message_update_url: The URL of the webhook to call in response to the `on_message_update` event using the `webhooks.on_message_update.method` HTTP method. + :param webhooks_on_message_update_method: The HTTP method to use when calling the `webhooks.on_message_update.url`. + :param webhooks_on_message_remove_url: The URL of the webhook to call in response to the `on_message_remove` event using the `webhooks.on_message_remove.method` HTTP method. + :param webhooks_on_message_remove_method: The HTTP method to use when calling the `webhooks.on_message_remove.url`. + :param webhooks_on_channel_add_url: The URL of the webhook to call in response to the `on_channel_add` event using the `webhooks.on_channel_add.method` HTTP method. + :param webhooks_on_channel_add_method: The HTTP method to use when calling the `webhooks.on_channel_add.url`. + :param webhooks_on_channel_destroy_url: The URL of the webhook to call in response to the `on_channel_destroy` event using the `webhooks.on_channel_destroy.method` HTTP method. + :param webhooks_on_channel_destroy_method: The HTTP method to use when calling the `webhooks.on_channel_destroy.url`. + :param webhooks_on_channel_update_url: The URL of the webhook to call in response to the `on_channel_update` event using the `webhooks.on_channel_update.method` HTTP method. + :param webhooks_on_channel_update_method: The HTTP method to use when calling the `webhooks.on_channel_update.url`. + :param webhooks_on_member_add_url: The URL of the webhook to call in response to the `on_member_add` event using the `webhooks.on_member_add.method` HTTP method. + :param webhooks_on_member_add_method: The HTTP method to use when calling the `webhooks.on_member_add.url`. + :param webhooks_on_member_remove_url: The URL of the webhook to call in response to the `on_member_remove` event using the `webhooks.on_member_remove.method` HTTP method. + :param webhooks_on_member_remove_method: The HTTP method to use when calling the `webhooks.on_member_remove.url`. + :param webhooks_on_message_sent_url: The URL of the webhook to call in response to the `on_message_sent` event using the `webhooks.on_message_sent.method` HTTP method. + :param webhooks_on_message_sent_method: The URL of the webhook to call in response to the `on_message_sent` event`. + :param webhooks_on_message_updated_url: The URL of the webhook to call in response to the `on_message_updated` event using the `webhooks.on_message_updated.method` HTTP method. + :param webhooks_on_message_updated_method: The HTTP method to use when calling the `webhooks.on_message_updated.url`. + :param webhooks_on_message_removed_url: The URL of the webhook to call in response to the `on_message_removed` event using the `webhooks.on_message_removed.method` HTTP method. + :param webhooks_on_message_removed_method: The HTTP method to use when calling the `webhooks.on_message_removed.url`. + :param webhooks_on_channel_added_url: The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_added.method` HTTP method. + :param webhooks_on_channel_added_method: The URL of the webhook to call in response to the `on_channel_added` event`. + :param webhooks_on_channel_destroyed_url: The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_destroyed.method` HTTP method. + :param webhooks_on_channel_destroyed_method: The HTTP method to use when calling the `webhooks.on_channel_destroyed.url`. + :param webhooks_on_channel_updated_url: The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + :param webhooks_on_channel_updated_method: The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + :param webhooks_on_member_added_url: The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + :param webhooks_on_member_added_method: The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + :param webhooks_on_member_removed_url: The URL of the webhook to call in response to the `on_member_removed` event using the `webhooks.on_member_removed.method` HTTP method. + :param webhooks_on_member_removed_method: The HTTP method to use when calling the `webhooks.on_member_removed.url`. + :param limits_channel_members: The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + :param limits_user_channels: The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + + :returns: The updated ServiceInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + default_service_role_sid=default_service_role_sid, + default_channel_role_sid=default_channel_role_sid, + default_channel_creator_role_sid=default_channel_creator_role_sid, + read_status_enabled=read_status_enabled, + reachability_enabled=reachability_enabled, + typing_indicator_timeout=typing_indicator_timeout, + consumption_report_interval=consumption_report_interval, + notifications_new_message_enabled=notifications_new_message_enabled, + notifications_new_message_template=notifications_new_message_template, + notifications_added_to_channel_enabled=notifications_added_to_channel_enabled, + notifications_added_to_channel_template=notifications_added_to_channel_template, + notifications_removed_from_channel_enabled=notifications_removed_from_channel_enabled, + notifications_removed_from_channel_template=notifications_removed_from_channel_template, + notifications_invited_to_channel_enabled=notifications_invited_to_channel_enabled, + notifications_invited_to_channel_template=notifications_invited_to_channel_template, + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + webhook_method=webhook_method, + webhook_filters=webhook_filters, + webhooks_on_message_send_url=webhooks_on_message_send_url, + webhooks_on_message_send_method=webhooks_on_message_send_method, + webhooks_on_message_update_url=webhooks_on_message_update_url, + webhooks_on_message_update_method=webhooks_on_message_update_method, + webhooks_on_message_remove_url=webhooks_on_message_remove_url, + webhooks_on_message_remove_method=webhooks_on_message_remove_method, + webhooks_on_channel_add_url=webhooks_on_channel_add_url, + webhooks_on_channel_add_method=webhooks_on_channel_add_method, + webhooks_on_channel_destroy_url=webhooks_on_channel_destroy_url, + webhooks_on_channel_destroy_method=webhooks_on_channel_destroy_method, + webhooks_on_channel_update_url=webhooks_on_channel_update_url, + webhooks_on_channel_update_method=webhooks_on_channel_update_method, + webhooks_on_member_add_url=webhooks_on_member_add_url, + webhooks_on_member_add_method=webhooks_on_member_add_method, + webhooks_on_member_remove_url=webhooks_on_member_remove_url, + webhooks_on_member_remove_method=webhooks_on_member_remove_method, + webhooks_on_message_sent_url=webhooks_on_message_sent_url, + webhooks_on_message_sent_method=webhooks_on_message_sent_method, + webhooks_on_message_updated_url=webhooks_on_message_updated_url, + webhooks_on_message_updated_method=webhooks_on_message_updated_method, + webhooks_on_message_removed_url=webhooks_on_message_removed_url, + webhooks_on_message_removed_method=webhooks_on_message_removed_method, + webhooks_on_channel_added_url=webhooks_on_channel_added_url, + webhooks_on_channel_added_method=webhooks_on_channel_added_method, + webhooks_on_channel_destroyed_url=webhooks_on_channel_destroyed_url, + webhooks_on_channel_destroyed_method=webhooks_on_channel_destroyed_method, + webhooks_on_channel_updated_url=webhooks_on_channel_updated_url, + webhooks_on_channel_updated_method=webhooks_on_channel_updated_method, + webhooks_on_member_added_url=webhooks_on_member_added_url, + webhooks_on_member_added_method=webhooks_on_member_added_method, + webhooks_on_member_removed_url=webhooks_on_member_removed_url, + webhooks_on_member_removed_method=webhooks_on_member_removed_method, + limits_channel_members=limits_channel_members, + limits_user_channels=limits_user_channels, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + webhooks_on_message_send_url: Union[str, object] = values.unset, + webhooks_on_message_send_method: Union[str, object] = values.unset, + webhooks_on_message_update_url: Union[str, object] = values.unset, + webhooks_on_message_update_method: Union[str, object] = values.unset, + webhooks_on_message_remove_url: Union[str, object] = values.unset, + webhooks_on_message_remove_method: Union[str, object] = values.unset, + webhooks_on_channel_add_url: Union[str, object] = values.unset, + webhooks_on_channel_add_method: Union[str, object] = values.unset, + webhooks_on_channel_destroy_url: Union[str, object] = values.unset, + webhooks_on_channel_destroy_method: Union[str, object] = values.unset, + webhooks_on_channel_update_url: Union[str, object] = values.unset, + webhooks_on_channel_update_method: Union[str, object] = values.unset, + webhooks_on_member_add_url: Union[str, object] = values.unset, + webhooks_on_member_add_method: Union[str, object] = values.unset, + webhooks_on_member_remove_url: Union[str, object] = values.unset, + webhooks_on_member_remove_method: Union[str, object] = values.unset, + webhooks_on_message_sent_url: Union[str, object] = values.unset, + webhooks_on_message_sent_method: Union[str, object] = values.unset, + webhooks_on_message_updated_url: Union[str, object] = values.unset, + webhooks_on_message_updated_method: Union[str, object] = values.unset, + webhooks_on_message_removed_url: Union[str, object] = values.unset, + webhooks_on_message_removed_method: Union[str, object] = values.unset, + webhooks_on_channel_added_url: Union[str, object] = values.unset, + webhooks_on_channel_added_method: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_url: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_method: Union[str, object] = values.unset, + webhooks_on_channel_updated_url: Union[str, object] = values.unset, + webhooks_on_channel_updated_method: Union[str, object] = values.unset, + webhooks_on_member_added_url: Union[str, object] = values.unset, + webhooks_on_member_added_method: Union[str, object] = values.unset, + webhooks_on_member_removed_url: Union[str, object] = values.unset, + webhooks_on_member_removed_method: Union[str, object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + ) -> "ServiceInstance": + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param default_service_role_sid: The service role assigned to users when they are added to the service. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param default_channel_role_sid: The channel role assigned to users when they are added to a channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param default_channel_creator_role_sid: The channel role assigned to a channel creator when they join a new channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param read_status_enabled: Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + :param reachability_enabled: Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + :param typing_indicator_timeout: How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + :param consumption_report_interval: DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + :param notifications_new_message_enabled: Whether to send a notification when a new message is added to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_new_message_template: The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_added_to_channel_enabled: Whether to send a notification when a member is added to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_added_to_channel_template: The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_removed_from_channel_enabled: Whether to send a notification to a user when they are removed from a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_removed_from_channel_template: The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_invited_to_channel_enabled: Whether to send a notification when a user is invited to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_invited_to_channel_template: The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param pre_webhook_url: The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + :param post_webhook_url: The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + :param webhook_method: The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_filters: The list of WebHook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhooks_on_message_send_url: The URL of the webhook to call in response to the `on_message_send` event using the `webhooks.on_message_send.method` HTTP method. + :param webhooks_on_message_send_method: The HTTP method to use when calling the `webhooks.on_message_send.url`. + :param webhooks_on_message_update_url: The URL of the webhook to call in response to the `on_message_update` event using the `webhooks.on_message_update.method` HTTP method. + :param webhooks_on_message_update_method: The HTTP method to use when calling the `webhooks.on_message_update.url`. + :param webhooks_on_message_remove_url: The URL of the webhook to call in response to the `on_message_remove` event using the `webhooks.on_message_remove.method` HTTP method. + :param webhooks_on_message_remove_method: The HTTP method to use when calling the `webhooks.on_message_remove.url`. + :param webhooks_on_channel_add_url: The URL of the webhook to call in response to the `on_channel_add` event using the `webhooks.on_channel_add.method` HTTP method. + :param webhooks_on_channel_add_method: The HTTP method to use when calling the `webhooks.on_channel_add.url`. + :param webhooks_on_channel_destroy_url: The URL of the webhook to call in response to the `on_channel_destroy` event using the `webhooks.on_channel_destroy.method` HTTP method. + :param webhooks_on_channel_destroy_method: The HTTP method to use when calling the `webhooks.on_channel_destroy.url`. + :param webhooks_on_channel_update_url: The URL of the webhook to call in response to the `on_channel_update` event using the `webhooks.on_channel_update.method` HTTP method. + :param webhooks_on_channel_update_method: The HTTP method to use when calling the `webhooks.on_channel_update.url`. + :param webhooks_on_member_add_url: The URL of the webhook to call in response to the `on_member_add` event using the `webhooks.on_member_add.method` HTTP method. + :param webhooks_on_member_add_method: The HTTP method to use when calling the `webhooks.on_member_add.url`. + :param webhooks_on_member_remove_url: The URL of the webhook to call in response to the `on_member_remove` event using the `webhooks.on_member_remove.method` HTTP method. + :param webhooks_on_member_remove_method: The HTTP method to use when calling the `webhooks.on_member_remove.url`. + :param webhooks_on_message_sent_url: The URL of the webhook to call in response to the `on_message_sent` event using the `webhooks.on_message_sent.method` HTTP method. + :param webhooks_on_message_sent_method: The URL of the webhook to call in response to the `on_message_sent` event`. + :param webhooks_on_message_updated_url: The URL of the webhook to call in response to the `on_message_updated` event using the `webhooks.on_message_updated.method` HTTP method. + :param webhooks_on_message_updated_method: The HTTP method to use when calling the `webhooks.on_message_updated.url`. + :param webhooks_on_message_removed_url: The URL of the webhook to call in response to the `on_message_removed` event using the `webhooks.on_message_removed.method` HTTP method. + :param webhooks_on_message_removed_method: The HTTP method to use when calling the `webhooks.on_message_removed.url`. + :param webhooks_on_channel_added_url: The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_added.method` HTTP method. + :param webhooks_on_channel_added_method: The URL of the webhook to call in response to the `on_channel_added` event`. + :param webhooks_on_channel_destroyed_url: The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_destroyed.method` HTTP method. + :param webhooks_on_channel_destroyed_method: The HTTP method to use when calling the `webhooks.on_channel_destroyed.url`. + :param webhooks_on_channel_updated_url: The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + :param webhooks_on_channel_updated_method: The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + :param webhooks_on_member_added_url: The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + :param webhooks_on_member_added_method: The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + :param webhooks_on_member_removed_url: The URL of the webhook to call in response to the `on_member_removed` event using the `webhooks.on_member_removed.method` HTTP method. + :param webhooks_on_member_removed_method: The HTTP method to use when calling the `webhooks.on_member_removed.url`. + :param limits_channel_members: The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + :param limits_user_channels: The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + + :returns: The updated ServiceInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + default_service_role_sid=default_service_role_sid, + default_channel_role_sid=default_channel_role_sid, + default_channel_creator_role_sid=default_channel_creator_role_sid, + read_status_enabled=read_status_enabled, + reachability_enabled=reachability_enabled, + typing_indicator_timeout=typing_indicator_timeout, + consumption_report_interval=consumption_report_interval, + notifications_new_message_enabled=notifications_new_message_enabled, + notifications_new_message_template=notifications_new_message_template, + notifications_added_to_channel_enabled=notifications_added_to_channel_enabled, + notifications_added_to_channel_template=notifications_added_to_channel_template, + notifications_removed_from_channel_enabled=notifications_removed_from_channel_enabled, + notifications_removed_from_channel_template=notifications_removed_from_channel_template, + notifications_invited_to_channel_enabled=notifications_invited_to_channel_enabled, + notifications_invited_to_channel_template=notifications_invited_to_channel_template, + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + webhook_method=webhook_method, + webhook_filters=webhook_filters, + webhooks_on_message_send_url=webhooks_on_message_send_url, + webhooks_on_message_send_method=webhooks_on_message_send_method, + webhooks_on_message_update_url=webhooks_on_message_update_url, + webhooks_on_message_update_method=webhooks_on_message_update_method, + webhooks_on_message_remove_url=webhooks_on_message_remove_url, + webhooks_on_message_remove_method=webhooks_on_message_remove_method, + webhooks_on_channel_add_url=webhooks_on_channel_add_url, + webhooks_on_channel_add_method=webhooks_on_channel_add_method, + webhooks_on_channel_destroy_url=webhooks_on_channel_destroy_url, + webhooks_on_channel_destroy_method=webhooks_on_channel_destroy_method, + webhooks_on_channel_update_url=webhooks_on_channel_update_url, + webhooks_on_channel_update_method=webhooks_on_channel_update_method, + webhooks_on_member_add_url=webhooks_on_member_add_url, + webhooks_on_member_add_method=webhooks_on_member_add_method, + webhooks_on_member_remove_url=webhooks_on_member_remove_url, + webhooks_on_member_remove_method=webhooks_on_member_remove_method, + webhooks_on_message_sent_url=webhooks_on_message_sent_url, + webhooks_on_message_sent_method=webhooks_on_message_sent_method, + webhooks_on_message_updated_url=webhooks_on_message_updated_url, + webhooks_on_message_updated_method=webhooks_on_message_updated_method, + webhooks_on_message_removed_url=webhooks_on_message_removed_url, + webhooks_on_message_removed_method=webhooks_on_message_removed_method, + webhooks_on_channel_added_url=webhooks_on_channel_added_url, + webhooks_on_channel_added_method=webhooks_on_channel_added_method, + webhooks_on_channel_destroyed_url=webhooks_on_channel_destroyed_url, + webhooks_on_channel_destroyed_method=webhooks_on_channel_destroyed_method, + webhooks_on_channel_updated_url=webhooks_on_channel_updated_url, + webhooks_on_channel_updated_method=webhooks_on_channel_updated_method, + webhooks_on_member_added_url=webhooks_on_member_added_url, + webhooks_on_member_added_method=webhooks_on_member_added_method, + webhooks_on_member_removed_url=webhooks_on_member_removed_url, + webhooks_on_member_removed_method=webhooks_on_member_removed_method, + limits_channel_members=limits_channel_members, + limits_user_channels=limits_user_channels, + ) + + @property + def channels(self) -> ChannelList: + """ + Access the channels + """ + return self._proxy.channels + + @property + def roles(self) -> RoleList: + """ + Access the roles + """ + return self._proxy.roles + + @property + def users(self) -> UserList: + """ + Access the users + """ + return self._proxy.users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServiceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ServiceContext + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the Service resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Services/{sid}".format(**self._solution) + + self._channels: Optional[ChannelList] = None + self._roles: Optional[RoleList] = None + self._users: Optional[UserList] = None + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ServiceInstance: + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ServiceInstance: + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + webhooks_on_message_send_url: Union[str, object] = values.unset, + webhooks_on_message_send_method: Union[str, object] = values.unset, + webhooks_on_message_update_url: Union[str, object] = values.unset, + webhooks_on_message_update_method: Union[str, object] = values.unset, + webhooks_on_message_remove_url: Union[str, object] = values.unset, + webhooks_on_message_remove_method: Union[str, object] = values.unset, + webhooks_on_channel_add_url: Union[str, object] = values.unset, + webhooks_on_channel_add_method: Union[str, object] = values.unset, + webhooks_on_channel_destroy_url: Union[str, object] = values.unset, + webhooks_on_channel_destroy_method: Union[str, object] = values.unset, + webhooks_on_channel_update_url: Union[str, object] = values.unset, + webhooks_on_channel_update_method: Union[str, object] = values.unset, + webhooks_on_member_add_url: Union[str, object] = values.unset, + webhooks_on_member_add_method: Union[str, object] = values.unset, + webhooks_on_member_remove_url: Union[str, object] = values.unset, + webhooks_on_member_remove_method: Union[str, object] = values.unset, + webhooks_on_message_sent_url: Union[str, object] = values.unset, + webhooks_on_message_sent_method: Union[str, object] = values.unset, + webhooks_on_message_updated_url: Union[str, object] = values.unset, + webhooks_on_message_updated_method: Union[str, object] = values.unset, + webhooks_on_message_removed_url: Union[str, object] = values.unset, + webhooks_on_message_removed_method: Union[str, object] = values.unset, + webhooks_on_channel_added_url: Union[str, object] = values.unset, + webhooks_on_channel_added_method: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_url: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_method: Union[str, object] = values.unset, + webhooks_on_channel_updated_url: Union[str, object] = values.unset, + webhooks_on_channel_updated_method: Union[str, object] = values.unset, + webhooks_on_member_added_url: Union[str, object] = values.unset, + webhooks_on_member_added_method: Union[str, object] = values.unset, + webhooks_on_member_removed_url: Union[str, object] = values.unset, + webhooks_on_member_removed_method: Union[str, object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + ) -> ServiceInstance: + """ + Update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param default_service_role_sid: The service role assigned to users when they are added to the service. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param default_channel_role_sid: The channel role assigned to users when they are added to a channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param default_channel_creator_role_sid: The channel role assigned to a channel creator when they join a new channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param read_status_enabled: Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + :param reachability_enabled: Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + :param typing_indicator_timeout: How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + :param consumption_report_interval: DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + :param notifications_new_message_enabled: Whether to send a notification when a new message is added to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_new_message_template: The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_added_to_channel_enabled: Whether to send a notification when a member is added to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_added_to_channel_template: The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_removed_from_channel_enabled: Whether to send a notification to a user when they are removed from a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_removed_from_channel_template: The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_invited_to_channel_enabled: Whether to send a notification when a user is invited to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_invited_to_channel_template: The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param pre_webhook_url: The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + :param post_webhook_url: The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + :param webhook_method: The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_filters: The list of WebHook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhooks_on_message_send_url: The URL of the webhook to call in response to the `on_message_send` event using the `webhooks.on_message_send.method` HTTP method. + :param webhooks_on_message_send_method: The HTTP method to use when calling the `webhooks.on_message_send.url`. + :param webhooks_on_message_update_url: The URL of the webhook to call in response to the `on_message_update` event using the `webhooks.on_message_update.method` HTTP method. + :param webhooks_on_message_update_method: The HTTP method to use when calling the `webhooks.on_message_update.url`. + :param webhooks_on_message_remove_url: The URL of the webhook to call in response to the `on_message_remove` event using the `webhooks.on_message_remove.method` HTTP method. + :param webhooks_on_message_remove_method: The HTTP method to use when calling the `webhooks.on_message_remove.url`. + :param webhooks_on_channel_add_url: The URL of the webhook to call in response to the `on_channel_add` event using the `webhooks.on_channel_add.method` HTTP method. + :param webhooks_on_channel_add_method: The HTTP method to use when calling the `webhooks.on_channel_add.url`. + :param webhooks_on_channel_destroy_url: The URL of the webhook to call in response to the `on_channel_destroy` event using the `webhooks.on_channel_destroy.method` HTTP method. + :param webhooks_on_channel_destroy_method: The HTTP method to use when calling the `webhooks.on_channel_destroy.url`. + :param webhooks_on_channel_update_url: The URL of the webhook to call in response to the `on_channel_update` event using the `webhooks.on_channel_update.method` HTTP method. + :param webhooks_on_channel_update_method: The HTTP method to use when calling the `webhooks.on_channel_update.url`. + :param webhooks_on_member_add_url: The URL of the webhook to call in response to the `on_member_add` event using the `webhooks.on_member_add.method` HTTP method. + :param webhooks_on_member_add_method: The HTTP method to use when calling the `webhooks.on_member_add.url`. + :param webhooks_on_member_remove_url: The URL of the webhook to call in response to the `on_member_remove` event using the `webhooks.on_member_remove.method` HTTP method. + :param webhooks_on_member_remove_method: The HTTP method to use when calling the `webhooks.on_member_remove.url`. + :param webhooks_on_message_sent_url: The URL of the webhook to call in response to the `on_message_sent` event using the `webhooks.on_message_sent.method` HTTP method. + :param webhooks_on_message_sent_method: The URL of the webhook to call in response to the `on_message_sent` event`. + :param webhooks_on_message_updated_url: The URL of the webhook to call in response to the `on_message_updated` event using the `webhooks.on_message_updated.method` HTTP method. + :param webhooks_on_message_updated_method: The HTTP method to use when calling the `webhooks.on_message_updated.url`. + :param webhooks_on_message_removed_url: The URL of the webhook to call in response to the `on_message_removed` event using the `webhooks.on_message_removed.method` HTTP method. + :param webhooks_on_message_removed_method: The HTTP method to use when calling the `webhooks.on_message_removed.url`. + :param webhooks_on_channel_added_url: The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_added.method` HTTP method. + :param webhooks_on_channel_added_method: The URL of the webhook to call in response to the `on_channel_added` event`. + :param webhooks_on_channel_destroyed_url: The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_destroyed.method` HTTP method. + :param webhooks_on_channel_destroyed_method: The HTTP method to use when calling the `webhooks.on_channel_destroyed.url`. + :param webhooks_on_channel_updated_url: The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + :param webhooks_on_channel_updated_method: The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + :param webhooks_on_member_added_url: The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + :param webhooks_on_member_added_method: The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + :param webhooks_on_member_removed_url: The URL of the webhook to call in response to the `on_member_removed` event using the `webhooks.on_member_removed.method` HTTP method. + :param webhooks_on_member_removed_method: The HTTP method to use when calling the `webhooks.on_member_removed.url`. + :param limits_channel_members: The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + :param limits_user_channels: The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DefaultServiceRoleSid": default_service_role_sid, + "DefaultChannelRoleSid": default_channel_role_sid, + "DefaultChannelCreatorRoleSid": default_channel_creator_role_sid, + "ReadStatusEnabled": serialize.boolean_to_string(read_status_enabled), + "ReachabilityEnabled": serialize.boolean_to_string( + reachability_enabled + ), + "TypingIndicatorTimeout": typing_indicator_timeout, + "ConsumptionReportInterval": consumption_report_interval, + "Notifications.NewMessage.Enabled": serialize.boolean_to_string( + notifications_new_message_enabled + ), + "Notifications.NewMessage.Template": notifications_new_message_template, + "Notifications.AddedToChannel.Enabled": serialize.boolean_to_string( + notifications_added_to_channel_enabled + ), + "Notifications.AddedToChannel.Template": notifications_added_to_channel_template, + "Notifications.RemovedFromChannel.Enabled": serialize.boolean_to_string( + notifications_removed_from_channel_enabled + ), + "Notifications.RemovedFromChannel.Template": notifications_removed_from_channel_template, + "Notifications.InvitedToChannel.Enabled": serialize.boolean_to_string( + notifications_invited_to_channel_enabled + ), + "Notifications.InvitedToChannel.Template": notifications_invited_to_channel_template, + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "WebhookMethod": webhook_method, + "WebhookFilters": serialize.map(webhook_filters, lambda e: e), + "Webhooks.OnMessageSend.Url": webhooks_on_message_send_url, + "Webhooks.OnMessageSend.Method": webhooks_on_message_send_method, + "Webhooks.OnMessageUpdate.Url": webhooks_on_message_update_url, + "Webhooks.OnMessageUpdate.Method": webhooks_on_message_update_method, + "Webhooks.OnMessageRemove.Url": webhooks_on_message_remove_url, + "Webhooks.OnMessageRemove.Method": webhooks_on_message_remove_method, + "Webhooks.OnChannelAdd.Url": webhooks_on_channel_add_url, + "Webhooks.OnChannelAdd.Method": webhooks_on_channel_add_method, + "Webhooks.OnChannelDestroy.Url": webhooks_on_channel_destroy_url, + "Webhooks.OnChannelDestroy.Method": webhooks_on_channel_destroy_method, + "Webhooks.OnChannelUpdate.Url": webhooks_on_channel_update_url, + "Webhooks.OnChannelUpdate.Method": webhooks_on_channel_update_method, + "Webhooks.OnMemberAdd.Url": webhooks_on_member_add_url, + "Webhooks.OnMemberAdd.Method": webhooks_on_member_add_method, + "Webhooks.OnMemberRemove.Url": webhooks_on_member_remove_url, + "Webhooks.OnMemberRemove.Method": webhooks_on_member_remove_method, + "Webhooks.OnMessageSent.Url": webhooks_on_message_sent_url, + "Webhooks.OnMessageSent.Method": webhooks_on_message_sent_method, + "Webhooks.OnMessageUpdated.Url": webhooks_on_message_updated_url, + "Webhooks.OnMessageUpdated.Method": webhooks_on_message_updated_method, + "Webhooks.OnMessageRemoved.Url": webhooks_on_message_removed_url, + "Webhooks.OnMessageRemoved.Method": webhooks_on_message_removed_method, + "Webhooks.OnChannelAdded.Url": webhooks_on_channel_added_url, + "Webhooks.OnChannelAdded.Method": webhooks_on_channel_added_method, + "Webhooks.OnChannelDestroyed.Url": webhooks_on_channel_destroyed_url, + "Webhooks.OnChannelDestroyed.Method": webhooks_on_channel_destroyed_method, + "Webhooks.OnChannelUpdated.Url": webhooks_on_channel_updated_url, + "Webhooks.OnChannelUpdated.Method": webhooks_on_channel_updated_method, + "Webhooks.OnMemberAdded.Url": webhooks_on_member_added_url, + "Webhooks.OnMemberAdded.Method": webhooks_on_member_added_method, + "Webhooks.OnMemberRemoved.Url": webhooks_on_member_removed_url, + "Webhooks.OnMemberRemoved.Method": webhooks_on_member_removed_method, + "Limits.ChannelMembers": limits_channel_members, + "Limits.UserChannels": limits_user_channels, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + webhooks_on_message_send_url: Union[str, object] = values.unset, + webhooks_on_message_send_method: Union[str, object] = values.unset, + webhooks_on_message_update_url: Union[str, object] = values.unset, + webhooks_on_message_update_method: Union[str, object] = values.unset, + webhooks_on_message_remove_url: Union[str, object] = values.unset, + webhooks_on_message_remove_method: Union[str, object] = values.unset, + webhooks_on_channel_add_url: Union[str, object] = values.unset, + webhooks_on_channel_add_method: Union[str, object] = values.unset, + webhooks_on_channel_destroy_url: Union[str, object] = values.unset, + webhooks_on_channel_destroy_method: Union[str, object] = values.unset, + webhooks_on_channel_update_url: Union[str, object] = values.unset, + webhooks_on_channel_update_method: Union[str, object] = values.unset, + webhooks_on_member_add_url: Union[str, object] = values.unset, + webhooks_on_member_add_method: Union[str, object] = values.unset, + webhooks_on_member_remove_url: Union[str, object] = values.unset, + webhooks_on_member_remove_method: Union[str, object] = values.unset, + webhooks_on_message_sent_url: Union[str, object] = values.unset, + webhooks_on_message_sent_method: Union[str, object] = values.unset, + webhooks_on_message_updated_url: Union[str, object] = values.unset, + webhooks_on_message_updated_method: Union[str, object] = values.unset, + webhooks_on_message_removed_url: Union[str, object] = values.unset, + webhooks_on_message_removed_method: Union[str, object] = values.unset, + webhooks_on_channel_added_url: Union[str, object] = values.unset, + webhooks_on_channel_added_method: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_url: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_method: Union[str, object] = values.unset, + webhooks_on_channel_updated_url: Union[str, object] = values.unset, + webhooks_on_channel_updated_method: Union[str, object] = values.unset, + webhooks_on_member_added_url: Union[str, object] = values.unset, + webhooks_on_member_added_method: Union[str, object] = values.unset, + webhooks_on_member_removed_url: Union[str, object] = values.unset, + webhooks_on_member_removed_method: Union[str, object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param default_service_role_sid: The service role assigned to users when they are added to the service. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param default_channel_role_sid: The channel role assigned to users when they are added to a channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param default_channel_creator_role_sid: The channel role assigned to a channel creator when they join a new channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + :param read_status_enabled: Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + :param reachability_enabled: Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + :param typing_indicator_timeout: How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + :param consumption_report_interval: DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + :param notifications_new_message_enabled: Whether to send a notification when a new message is added to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_new_message_template: The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_added_to_channel_enabled: Whether to send a notification when a member is added to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_added_to_channel_template: The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_removed_from_channel_enabled: Whether to send a notification to a user when they are removed from a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_removed_from_channel_template: The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_invited_to_channel_enabled: Whether to send a notification when a user is invited to a channel. Can be: `true` or `false` and the default is `false`. + :param notifications_invited_to_channel_template: The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param pre_webhook_url: The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + :param post_webhook_url: The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + :param webhook_method: The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_filters: The list of WebHook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhooks_on_message_send_url: The URL of the webhook to call in response to the `on_message_send` event using the `webhooks.on_message_send.method` HTTP method. + :param webhooks_on_message_send_method: The HTTP method to use when calling the `webhooks.on_message_send.url`. + :param webhooks_on_message_update_url: The URL of the webhook to call in response to the `on_message_update` event using the `webhooks.on_message_update.method` HTTP method. + :param webhooks_on_message_update_method: The HTTP method to use when calling the `webhooks.on_message_update.url`. + :param webhooks_on_message_remove_url: The URL of the webhook to call in response to the `on_message_remove` event using the `webhooks.on_message_remove.method` HTTP method. + :param webhooks_on_message_remove_method: The HTTP method to use when calling the `webhooks.on_message_remove.url`. + :param webhooks_on_channel_add_url: The URL of the webhook to call in response to the `on_channel_add` event using the `webhooks.on_channel_add.method` HTTP method. + :param webhooks_on_channel_add_method: The HTTP method to use when calling the `webhooks.on_channel_add.url`. + :param webhooks_on_channel_destroy_url: The URL of the webhook to call in response to the `on_channel_destroy` event using the `webhooks.on_channel_destroy.method` HTTP method. + :param webhooks_on_channel_destroy_method: The HTTP method to use when calling the `webhooks.on_channel_destroy.url`. + :param webhooks_on_channel_update_url: The URL of the webhook to call in response to the `on_channel_update` event using the `webhooks.on_channel_update.method` HTTP method. + :param webhooks_on_channel_update_method: The HTTP method to use when calling the `webhooks.on_channel_update.url`. + :param webhooks_on_member_add_url: The URL of the webhook to call in response to the `on_member_add` event using the `webhooks.on_member_add.method` HTTP method. + :param webhooks_on_member_add_method: The HTTP method to use when calling the `webhooks.on_member_add.url`. + :param webhooks_on_member_remove_url: The URL of the webhook to call in response to the `on_member_remove` event using the `webhooks.on_member_remove.method` HTTP method. + :param webhooks_on_member_remove_method: The HTTP method to use when calling the `webhooks.on_member_remove.url`. + :param webhooks_on_message_sent_url: The URL of the webhook to call in response to the `on_message_sent` event using the `webhooks.on_message_sent.method` HTTP method. + :param webhooks_on_message_sent_method: The URL of the webhook to call in response to the `on_message_sent` event`. + :param webhooks_on_message_updated_url: The URL of the webhook to call in response to the `on_message_updated` event using the `webhooks.on_message_updated.method` HTTP method. + :param webhooks_on_message_updated_method: The HTTP method to use when calling the `webhooks.on_message_updated.url`. + :param webhooks_on_message_removed_url: The URL of the webhook to call in response to the `on_message_removed` event using the `webhooks.on_message_removed.method` HTTP method. + :param webhooks_on_message_removed_method: The HTTP method to use when calling the `webhooks.on_message_removed.url`. + :param webhooks_on_channel_added_url: The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_added.method` HTTP method. + :param webhooks_on_channel_added_method: The URL of the webhook to call in response to the `on_channel_added` event`. + :param webhooks_on_channel_destroyed_url: The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_destroyed.method` HTTP method. + :param webhooks_on_channel_destroyed_method: The HTTP method to use when calling the `webhooks.on_channel_destroyed.url`. + :param webhooks_on_channel_updated_url: The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + :param webhooks_on_channel_updated_method: The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + :param webhooks_on_member_added_url: The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + :param webhooks_on_member_added_method: The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + :param webhooks_on_member_removed_url: The URL of the webhook to call in response to the `on_member_removed` event using the `webhooks.on_member_removed.method` HTTP method. + :param webhooks_on_member_removed_method: The HTTP method to use when calling the `webhooks.on_member_removed.url`. + :param limits_channel_members: The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + :param limits_user_channels: The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DefaultServiceRoleSid": default_service_role_sid, + "DefaultChannelRoleSid": default_channel_role_sid, + "DefaultChannelCreatorRoleSid": default_channel_creator_role_sid, + "ReadStatusEnabled": serialize.boolean_to_string(read_status_enabled), + "ReachabilityEnabled": serialize.boolean_to_string( + reachability_enabled + ), + "TypingIndicatorTimeout": typing_indicator_timeout, + "ConsumptionReportInterval": consumption_report_interval, + "Notifications.NewMessage.Enabled": serialize.boolean_to_string( + notifications_new_message_enabled + ), + "Notifications.NewMessage.Template": notifications_new_message_template, + "Notifications.AddedToChannel.Enabled": serialize.boolean_to_string( + notifications_added_to_channel_enabled + ), + "Notifications.AddedToChannel.Template": notifications_added_to_channel_template, + "Notifications.RemovedFromChannel.Enabled": serialize.boolean_to_string( + notifications_removed_from_channel_enabled + ), + "Notifications.RemovedFromChannel.Template": notifications_removed_from_channel_template, + "Notifications.InvitedToChannel.Enabled": serialize.boolean_to_string( + notifications_invited_to_channel_enabled + ), + "Notifications.InvitedToChannel.Template": notifications_invited_to_channel_template, + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "WebhookMethod": webhook_method, + "WebhookFilters": serialize.map(webhook_filters, lambda e: e), + "Webhooks.OnMessageSend.Url": webhooks_on_message_send_url, + "Webhooks.OnMessageSend.Method": webhooks_on_message_send_method, + "Webhooks.OnMessageUpdate.Url": webhooks_on_message_update_url, + "Webhooks.OnMessageUpdate.Method": webhooks_on_message_update_method, + "Webhooks.OnMessageRemove.Url": webhooks_on_message_remove_url, + "Webhooks.OnMessageRemove.Method": webhooks_on_message_remove_method, + "Webhooks.OnChannelAdd.Url": webhooks_on_channel_add_url, + "Webhooks.OnChannelAdd.Method": webhooks_on_channel_add_method, + "Webhooks.OnChannelDestroy.Url": webhooks_on_channel_destroy_url, + "Webhooks.OnChannelDestroy.Method": webhooks_on_channel_destroy_method, + "Webhooks.OnChannelUpdate.Url": webhooks_on_channel_update_url, + "Webhooks.OnChannelUpdate.Method": webhooks_on_channel_update_method, + "Webhooks.OnMemberAdd.Url": webhooks_on_member_add_url, + "Webhooks.OnMemberAdd.Method": webhooks_on_member_add_method, + "Webhooks.OnMemberRemove.Url": webhooks_on_member_remove_url, + "Webhooks.OnMemberRemove.Method": webhooks_on_member_remove_method, + "Webhooks.OnMessageSent.Url": webhooks_on_message_sent_url, + "Webhooks.OnMessageSent.Method": webhooks_on_message_sent_method, + "Webhooks.OnMessageUpdated.Url": webhooks_on_message_updated_url, + "Webhooks.OnMessageUpdated.Method": webhooks_on_message_updated_method, + "Webhooks.OnMessageRemoved.Url": webhooks_on_message_removed_url, + "Webhooks.OnMessageRemoved.Method": webhooks_on_message_removed_method, + "Webhooks.OnChannelAdded.Url": webhooks_on_channel_added_url, + "Webhooks.OnChannelAdded.Method": webhooks_on_channel_added_method, + "Webhooks.OnChannelDestroyed.Url": webhooks_on_channel_destroyed_url, + "Webhooks.OnChannelDestroyed.Method": webhooks_on_channel_destroyed_method, + "Webhooks.OnChannelUpdated.Url": webhooks_on_channel_updated_url, + "Webhooks.OnChannelUpdated.Method": webhooks_on_channel_updated_method, + "Webhooks.OnMemberAdded.Url": webhooks_on_member_added_url, + "Webhooks.OnMemberAdded.Method": webhooks_on_member_added_method, + "Webhooks.OnMemberRemoved.Url": webhooks_on_member_removed_url, + "Webhooks.OnMemberRemoved.Method": webhooks_on_member_removed_method, + "Limits.ChannelMembers": limits_channel_members, + "Limits.UserChannels": limits_user_channels, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def channels(self) -> ChannelList: + """ + Access the channels + """ + if self._channels is None: + self._channels = ChannelList( + self._version, + self._solution["sid"], + ) + return self._channels + + @property + def roles(self) -> RoleList: + """ + Access the roles + """ + if self._roles is None: + self._roles = RoleList( + self._version, + self._solution["sid"], + ) + return self._roles + + @property + def users(self) -> UserList: + """ + Access the users + """ + if self._users is None: + self._users = UserList( + self._version, + self._solution["sid"], + ) + return self._users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ServiceInstance: + """ + Build an instance of ServiceInstance + + :param payload: Payload response from the API + """ + return ServiceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services" + + def create(self, friendly_name: str) -> ServiceInstance: + """ + Create the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + async def create_async(self, friendly_name: str) -> ServiceInstance: + """ + Asynchronously create the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ServiceInstance]: + """ + Streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ServiceInstance]: + """ + Asynchronously streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Asynchronously lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Asynchronously retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + def get_page(self, target_url: str) -> ServicePage: + """ + Retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ServicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ServicePage: + """ + Asynchronously retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ServicePage(self._version, response) + + def get(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The Twilio-provided string that uniquely identifies the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The Twilio-provided string that uniquely identifies the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v1/service/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2547862046b16513d355974d102b9b32cf7d19f9 GIT binary patch literal 72645 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 "ChannelContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ChannelContext for this ChannelInstance + """ + if self._context is None: + self._context = ChannelContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ChannelInstance": + """ + Fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ChannelInstance": + """ + Asynchronous coroutine to fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "ChannelInstance": + """ + Update the ChannelInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated ChannelInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + unique_name=unique_name, + attributes=attributes, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "ChannelInstance": + """ + Asynchronous coroutine to update the ChannelInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated ChannelInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + unique_name=unique_name, + attributes=attributes, + ) + + @property + def invites(self) -> InviteList: + """ + Access the invites + """ + return self._proxy.invites + + @property + def members(self) -> MemberList: + """ + Access the members + """ + return self._proxy.members + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + return self._proxy.messages + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the ChannelContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to update the resource from. + :param sid: The Twilio-provided string that uniquely identifies the Channel resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Channels/{sid}".format(**self._solution) + + self._invites: Optional[InviteList] = None + self._members: Optional[MemberList] = None + self._messages: Optional[MessageList] = None + + def delete(self) -> bool: + """ + Deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ChannelInstance: + """ + Fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ChannelInstance: + """ + Asynchronous coroutine to fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Update the ChannelInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Asynchronous coroutine to update the ChannelInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + @property + def invites(self) -> InviteList: + """ + Access the invites + """ + if self._invites is None: + self._invites = InviteList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._invites + + @property + def members(self) -> MemberList: + """ + Access the members + """ + if self._members is None: + self._members = MemberList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._members + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + if self._messages is None: + self._messages = MessageList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._messages + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ChannelInstance: + """ + Build an instance of ChannelInstance + + :param payload: Payload response from the API + """ + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ChannelList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the ChannelList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Channels".format(**self._solution) + + def create( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + ) -> ChannelInstance: + """ + Create the ChannelInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + :param type: + + :returns: The created ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "Type": type, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + ) -> ChannelInstance: + """ + Asynchronously create the ChannelInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + :param type: + + :returns: The created ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "Type": type, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ChannelInstance]: + """ + Streams ChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["ChannelInstance.ChannelType"] type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(type=type, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ChannelInstance]: + """ + Asynchronously streams ChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["ChannelInstance.ChannelType"] type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(type=type, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelInstance]: + """ + Lists ChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["ChannelInstance.ChannelType"] type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + type=type, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelInstance]: + """ + Asynchronously lists ChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["ChannelInstance.ChannelType"] type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + type=type, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelPage: + """ + Retrieve a single page of ChannelInstance records from the API. + Request is executed immediately + + :param type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelInstance + """ + data = values.of( + { + "Type": serialize.map(type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelPage(self._version, response, self._solution) + + async def page_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelPage: + """ + Asynchronously retrieve a single page of ChannelInstance records from the API. + Request is executed immediately + + :param type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelInstance + """ + data = values.of( + { + "Type": serialize.map(type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ChannelPage: + """ + Retrieve a specific page of ChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ChannelPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ChannelPage: + """ + Asynchronously retrieve a specific page of ChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ChannelPage(self._version, response, self._solution) + + def get(self, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param sid: The Twilio-provided string that uniquely identifies the Channel resource to update. + """ + return ChannelContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param sid: The Twilio-provided string that uniquely identifies the Channel resource to update. + """ + return ChannelContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83ce4409aea3725e4233923c8323724773911eae GIT binary patch literal 32738 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 NLZanUfu3wE{|{gR;)MVJ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/__pycache__/member.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/__pycache__/member.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b30da3b79e3034ab4a9c9bbf032a1534ac3c5fd GIT binary patch literal 32485 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 "InviteContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InviteContext for this InviteInstance + """ + if self._context is None: + self._context = InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "InviteInstance": + """ + Fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InviteInstance": + """ + Asynchronous coroutine to fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InviteContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the InviteContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to fetch the resource from. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) the resource to fetch belongs to. + :param sid: The Twilio-provided string that uniquely identifies the Invite resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Invites/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> InviteInstance: + """ + Fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InviteInstance: + """ + Asynchronous coroutine to fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InvitePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InviteInstance: + """ + Build an instance of InviteInstance + + :param payload: Payload response from the API + """ + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InviteList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the InviteList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to read the resources from. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) the resources to read belong to. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Invites".format( + **self._solution + ) + + def create( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> InviteInstance: + """ + Create the InviteInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/api/chat/rest/v1/user) within the [Service](https://www.twilio.com/docs/api/chat/rest/v1/service). See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more info. + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to the new member. + + :returns: The created InviteInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> InviteInstance: + """ + Asynchronously create the InviteInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/api/chat/rest/v1/user) within the [Service](https://www.twilio.com/docs/api/chat/rest/v1/service). See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more info. + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to the new member. + + :returns: The created InviteInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InviteInstance]: + """ + Streams InviteInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(identity=identity, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InviteInstance]: + """ + Asynchronously streams InviteInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(identity=identity, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InviteInstance]: + """ + Lists InviteInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InviteInstance]: + """ + Asynchronously lists InviteInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InvitePage: + """ + Retrieve a single page of InviteInstance records from the API. + Request is executed immediately + + :param identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InviteInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InvitePage(self._version, response, self._solution) + + async def page_async( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InvitePage: + """ + Asynchronously retrieve a single page of InviteInstance records from the API. + Request is executed immediately + + :param identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InviteInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InvitePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> InvitePage: + """ + Retrieve a specific page of InviteInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InviteInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InvitePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> InvitePage: + """ + Asynchronously retrieve a specific page of InviteInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InviteInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InvitePage(self._version, response, self._solution) + + def get(self, sid: str) -> InviteContext: + """ + Constructs a InviteContext + + :param sid: The Twilio-provided string that uniquely identifies the Invite resource to fetch. + """ + return InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> InviteContext: + """ + Constructs a InviteContext + + :param sid: The Twilio-provided string that uniquely identifies the Invite resource to fetch. + """ + return InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/member.py b/venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/member.py new file mode 100644 index 00000000..1262703d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/member.py @@ -0,0 +1,716 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MemberInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Member resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/api/rest/account) that created the Member resource. + :ivar channel_sid: The unique ID of the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) for the member. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) the resource is associated with. + :ivar identity: The application-defined string that uniquely identifies the resource's [User](https://www.twilio.com/docs/api/chat/rest/users) within the [Service](https://www.twilio.com/docs/api/chat/rest/services). See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more info. + :ivar date_created: The date and time in GMT when the resource was created specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to the member. + :ivar last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/api/chat/rest/messages) in the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) that the Member has read. + :ivar last_consumption_timestamp: The ISO 8601 timestamp string that represents the date-time of the last [Message](https://www.twilio.com/docs/api/chat/rest/messages) read event for the Member within the [Channel](https://www.twilio.com/docs/api/chat/rest/channels). + :ivar url: The absolute URL of the Member resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.identity: Optional[str] = payload.get("identity") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.role_sid: Optional[str] = payload.get("role_sid") + self.last_consumed_message_index: Optional[int] = deserialize.integer( + payload.get("last_consumed_message_index") + ) + self.last_consumption_timestamp: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("last_consumption_timestamp")) + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[MemberContext] = None + + @property + def _proxy(self) -> "MemberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MemberContext for this MemberInstance + """ + if self._context is None: + self._context = MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the MemberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MemberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "MemberInstance": + """ + Fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MemberInstance": + """ + Asynchronous coroutine to fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + ) -> "MemberInstance": + """ + Update the MemberInstance + + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/api/chat/rest/messages) that the Member has read within the [Channel](https://www.twilio.com/docs/api/chat/rest/channels). + + :returns: The updated MemberInstance + """ + return self._proxy.update( + role_sid=role_sid, + last_consumed_message_index=last_consumed_message_index, + ) + + async def update_async( + self, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + ) -> "MemberInstance": + """ + Asynchronous coroutine to update the MemberInstance + + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/api/chat/rest/messages) that the Member has read within the [Channel](https://www.twilio.com/docs/api/chat/rest/channels). + + :returns: The updated MemberInstance + """ + return await self._proxy.update_async( + role_sid=role_sid, + last_consumed_message_index=last_consumed_message_index, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MemberContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the MemberContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to update the resource from. + :param channel_sid: The unique ID of the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) the member to update belongs to. Can be the Channel resource's `sid` or `unique_name`. + :param sid: The Twilio-provided string that uniquely identifies the Member resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Members/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the MemberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MemberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MemberInstance: + """ + Fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MemberInstance: + """ + Asynchronous coroutine to fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + ) -> MemberInstance: + """ + Update the MemberInstance + + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/api/chat/rest/messages) that the Member has read within the [Channel](https://www.twilio.com/docs/api/chat/rest/channels). + + :returns: The updated MemberInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + ) -> MemberInstance: + """ + Asynchronous coroutine to update the MemberInstance + + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/api/chat/rest/messages) that the Member has read within the [Channel](https://www.twilio.com/docs/api/chat/rest/channels). + + :returns: The updated MemberInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MemberPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MemberInstance: + """ + Build an instance of MemberInstance + + :param payload: Payload response from the API + """ + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MemberList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the MemberList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to read the resources from. + :param channel_sid: The unique ID of the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) the members to read belong to. Can be the Channel resource's `sid` or `unique_name` value. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Members".format( + **self._solution + ) + + def create( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> MemberInstance: + """ + Create the MemberInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/api/chat/rest/v1/user) within the [Service](https://www.twilio.com/docs/api/chat/rest/services). See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + + :returns: The created MemberInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> MemberInstance: + """ + Asynchronously create the MemberInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/api/chat/rest/v1/user) within the [Service](https://www.twilio.com/docs/api/chat/rest/services). See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + + :returns: The created MemberInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MemberInstance]: + """ + Streams MemberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(identity=identity, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MemberInstance]: + """ + Asynchronously streams MemberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(identity=identity, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MemberInstance]: + """ + Lists MemberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MemberInstance]: + """ + Asynchronously lists MemberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MemberPage: + """ + Retrieve a single page of MemberInstance records from the API. + Request is executed immediately + + :param identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MemberInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MemberPage(self._version, response, self._solution) + + async def page_async( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MemberPage: + """ + Asynchronously retrieve a single page of MemberInstance records from the API. + Request is executed immediately + + :param identity: The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MemberInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MemberPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MemberPage: + """ + Retrieve a specific page of MemberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MemberInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MemberPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MemberPage: + """ + Asynchronously retrieve a specific page of MemberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MemberInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MemberPage(self._version, response, self._solution) + + def get(self, sid: str) -> MemberContext: + """ + Constructs a MemberContext + + :param sid: The Twilio-provided string that uniquely identifies the Member resource to update. + """ + return MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MemberContext: + """ + Constructs a MemberContext + + :param sid: The Twilio-provided string that uniquely identifies the Member resource to update. + """ + return MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/message.py b/venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/message.py new file mode 100644 index 00000000..e7cfc921 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v1/service/channel/message.py @@ -0,0 +1,731 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MessageInstance(InstanceResource): + + class OrderType(object): + ASC = "asc" + DESC = "desc" + + """ + :ivar sid: The unique string that we created to identify the Message resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/api/rest/account) that created the Message resource. + :ivar attributes: The JSON string that stores application-specific data. **Note** If this property has been assigned a value, it's only displayed in a FETCH action that returns a single resource; otherwise, it's null. If the attributes have not been set, `{}` is returned. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) the resource is associated with. + :ivar to: The SID of the [Channel](https://www.twilio.com/docs/chat/api/channels) that the message was sent to. + :ivar channel_sid: The unique ID of the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) the Message resource belongs to. + :ivar date_created: The date and time in GMT when the resource was created specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar was_edited: Whether the message has been edited since it was created. + :ivar _from: The [identity](https://www.twilio.com/docs/api/chat/guides/identity) of the message's author. The default value is `system`. + :ivar body: The content of the message. + :ivar index: The index of the message within the [Channel](https://www.twilio.com/docs/chat/api/channels). + :ivar url: The absolute URL of the Message resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.attributes: Optional[str] = payload.get("attributes") + self.service_sid: Optional[str] = payload.get("service_sid") + self.to: Optional[str] = payload.get("to") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.was_edited: Optional[bool] = payload.get("was_edited") + self._from: Optional[str] = payload.get("from") + self.body: Optional[str] = payload.get("body") + self.index: Optional[int] = deserialize.integer(payload.get("index")) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[MessageContext] = None + + @property + def _proxy(self) -> "MessageContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MessageContext for this MessageInstance + """ + if self._context is None: + self._context = MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "MessageInstance": + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MessageInstance": + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Update the MessageInstance + + :param body: The message to send to the channel. Can also be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated MessageInstance + """ + return self._proxy.update( + body=body, + attributes=attributes, + ) + + async def update_async( + self, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Asynchronous coroutine to update the MessageInstance + + :param body: The message to send to the channel. Can also be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated MessageInstance + """ + return await self._proxy.update_async( + body=body, + attributes=attributes, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessageContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the MessageContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to update the resource from. + :param channel_sid: The unique ID of the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) the message belongs to. Can be the Channel's `sid` or `unique_name`. + :param sid: The Twilio-provided string that uniquely identifies the Message resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Messages/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MessageInstance: + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MessageInstance: + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Update the MessageInstance + + :param body: The message to send to the channel. Can also be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Body": body, + "Attributes": attributes, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronous coroutine to update the MessageInstance + + :param body: The message to send to the channel. Can also be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Body": body, + "Attributes": attributes, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessagePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MessageInstance: + """ + Build an instance of MessageInstance + + :param payload: Payload response from the API + """ + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MessageList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the MessageList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to read the resources from. + :param channel_sid: The unique ID of the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) the message to read belongs to. Can be the Channel's `sid` or `unique_name`. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Messages".format( + **self._solution + ) + + def create( + self, + body: str, + from_: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Create the MessageInstance + + :param body: The message to send to the channel. Can also be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param from_: The [identity](https://www.twilio.com/docs/api/chat/guides/identity) of the new message's author. The default value is `system`. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The created MessageInstance + """ + + data = values.of( + { + "Body": body, + "From": from_, + "Attributes": attributes, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, + body: str, + from_: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronously create the MessageInstance + + :param body: The message to send to the channel. Can also be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param from_: The [identity](https://www.twilio.com/docs/api/chat/guides/identity) of the new message's author. The default value is `system`. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The created MessageInstance + """ + + data = values.of( + { + "Body": body, + "From": from_, + "Attributes": attributes, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MessageInstance]: + """ + Streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(order=order, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MessageInstance]: + """ + Asynchronously streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(order=order, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + order=order, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Asynchronously lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + order=order, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + async def page_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Asynchronously retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MessagePage: + """ + Retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MessagePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MessagePage: + """ + Asynchronously retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MessagePage(self._version, response, self._solution) + + def get(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: The Twilio-provided string that uniquely identifies the Message resource to update. + """ + return MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: The Twilio-provided string that uniquely identifies the Message resource to update. + """ + return MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/role.py b/venv/Lib/site-packages/twilio/rest/chat/v1/service/role.py new file mode 100644 index 00000000..d81cbd55 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v1/service/role.py @@ -0,0 +1,645 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RoleInstance(InstanceResource): + + class RoleType(object): + CHANNEL = "channel" + DEPLOYMENT = "deployment" + + """ + :ivar sid: The unique string that we created to identify the Role resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/api/rest/account) that created the Role resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) the resource is associated with. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar type: + :ivar permissions: An array of the permissions the role has been granted, formatted as a JSON string. + :ivar date_created: The date and time in GMT when the resource was created specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar url: The absolute URL of the Role resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["RoleInstance.RoleType"] = payload.get("type") + self.permissions: Optional[List[str]] = payload.get("permissions") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[RoleContext] = None + + @property + def _proxy(self) -> "RoleContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RoleContext for this RoleInstance + """ + if self._context is None: + self._context = RoleContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "RoleInstance": + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "RoleInstance": + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return await self._proxy.fetch_async() + + def update(self, permission: List[str]) -> "RoleInstance": + """ + Update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type` and are described in the documentation. + + :returns: The updated RoleInstance + """ + return self._proxy.update( + permission=permission, + ) + + async def update_async(self, permission: List[str]) -> "RoleInstance": + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type` and are described in the documentation. + + :returns: The updated RoleInstance + """ + return await self._proxy.update_async( + permission=permission, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RoleContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the RoleContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to update the resource from. + :param sid: The Twilio-provided string that uniquely identifies the Role resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Roles/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> RoleInstance: + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> RoleInstance: + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update(self, permission: List[str]) -> RoleInstance: + """ + Update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type` and are described in the documentation. + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async(self, permission: List[str]) -> RoleInstance: + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type` and are described in the documentation. + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RolePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RoleInstance: + """ + Build an instance of RoleInstance + + :param payload: Payload response from the API + """ + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RoleList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the RoleList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Roles".format(**self._solution) + + def create( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Create the RoleInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param type: + :param permission: A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type` and are described in the documentation. + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Asynchronously create the RoleInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param type: + :param permission: A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type` and are described in the documentation. + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RoleInstance]: + """ + Streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RoleInstance]: + """ + Asynchronously streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Asynchronously lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Asynchronously retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> RolePage: + """ + Retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RolePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> RolePage: + """ + Asynchronously retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RolePage(self._version, response, self._solution) + + def get(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: The Twilio-provided string that uniquely identifies the Role resource to update. + """ + return RoleContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: The Twilio-provided string that uniquely identifies the Role resource to update. + """ + return RoleContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/user/__init__.py b/venv/Lib/site-packages/twilio/rest/chat/v1/service/user/__init__.py new file mode 100644 index 00000000..c6b90095 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v1/service/user/__init__.py @@ -0,0 +1,723 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.chat.v1.service.user.user_channel import UserChannelList + + +class UserInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the User resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/api/rest/account) that created the User resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) the resource is associated with. + :ivar attributes: The JSON string that stores application-specific data. **Note** If this property has been assigned a value, it's only displayed in a FETCH action that returns a single resource; otherwise, it's null. If the attributes have not been set, `{}` is returned. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to the user. + :ivar identity: The application-defined string that uniquely identifies the resource's User within the [Service](https://www.twilio.com/docs/api/chat/rest/services). This value is often a username or an email address. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more info. + :ivar is_online: Whether the User is actively connected to the Service instance and online. This value is only returned by Fetch actions that return a single resource and `null` is always returned by a Read action. This value is `null` if the Service's `reachability_enabled` is `false`, if the User has never been online for the Service instance, even if the Service's `reachability_enabled` is `true`. + :ivar is_notifiable: Whether the User has a potentially valid Push Notification registration (APN or GCM) for the Service instance. If at least one registration exists, `true`; otherwise `false`. This value is only returned by Fetch actions that return a single resource and `null` is always returned by a Read action. This value is `null` if the Service's `reachability_enabled` is `false`, and if the User has never had a notification registration, even if the Service's `reachability_enabled` is `true`. + :ivar date_created: The date and time in GMT when the resource was created specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar joined_channels_count: The number of Channels this User is a Member of. + :ivar links: The absolute URLs of the [Channel](https://www.twilio.com/docs/chat/api/channels) and [Binding](https://www.twilio.com/docs/chat/rest/bindings-resource) resources related to the user. + :ivar url: The absolute URL of the User resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.attributes: Optional[str] = payload.get("attributes") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.role_sid: Optional[str] = payload.get("role_sid") + self.identity: Optional[str] = payload.get("identity") + self.is_online: Optional[bool] = payload.get("is_online") + self.is_notifiable: Optional[bool] = payload.get("is_notifiable") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.joined_channels_count: Optional[int] = deserialize.integer( + payload.get("joined_channels_count") + ) + self.links: Optional[Dict[str, object]] = payload.get("links") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[UserContext] = None + + @property + def _proxy(self) -> "UserContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserContext for this UserInstance + """ + if self._context is None: + self._context = UserContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UserInstance": + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserInstance": + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Update the UserInstance + + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to this user. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the resource. It is often used for display purposes. + + :returns: The updated UserInstance + """ + return self._proxy.update( + role_sid=role_sid, + attributes=attributes, + friendly_name=friendly_name, + ) + + async def update_async( + self, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Asynchronous coroutine to update the UserInstance + + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to this user. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the resource. It is often used for display purposes. + + :returns: The updated UserInstance + """ + return await self._proxy.update_async( + role_sid=role_sid, + attributes=attributes, + friendly_name=friendly_name, + ) + + @property + def user_channels(self) -> UserChannelList: + """ + Access the user_channels + """ + return self._proxy.user_channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the UserContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to update the resource from. + :param sid: The Twilio-provided string that uniquely identifies the User resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Users/{sid}".format(**self._solution) + + self._user_channels: Optional[UserChannelList] = None + + def delete(self) -> bool: + """ + Deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserInstance: + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> UserInstance: + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Update the UserInstance + + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to this user. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the resource. It is often used for display purposes. + + :returns: The updated UserInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronous coroutine to update the UserInstance + + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to this user. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the resource. It is often used for display purposes. + + :returns: The updated UserInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + @property + def user_channels(self) -> UserChannelList: + """ + Access the user_channels + """ + if self._user_channels is None: + self._user_channels = UserChannelList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._user_channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserInstance: + """ + Build an instance of UserInstance + + :param payload: Payload response from the API + """ + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the UserList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Users".format(**self._solution) + + def create( + self, + identity: str, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Create the UserInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/api/chat/rest/v1/user) within the [Service](https://www.twilio.com/docs/api/chat/rest/v1/service). This value is often a username or email address. See the Identity documentation for more details. + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to the new User. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the new resource. This value is often used for display purposes. + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + identity: str, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronously create the UserInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/api/chat/rest/v1/user) within the [Service](https://www.twilio.com/docs/api/chat/rest/v1/service). This value is often a username or email address. See the Identity documentation for more details. + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to the new User. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the new resource. This value is often used for display purposes. + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserInstance]: + """ + Streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserInstance]: + """ + Asynchronously streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Asynchronously lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Asynchronously retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserPage: + """ + Retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserPage: + """ + Asynchronously retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserPage(self._version, response, self._solution) + + def get(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: The Twilio-provided string that uniquely identifies the User resource to update. + """ + return UserContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: The Twilio-provided string that uniquely identifies the User resource to update. + """ + return UserContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/user/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v1/service/user/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ec5157741142d5e18ec45a63ee444d13bf61328 GIT binary patch literal 31598 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/user/__pycache__/user_channel.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v1/service/user/__pycache__/user_channel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a62f1c91521530ab8de6daed2cb0268ed932ac7 GIT binary patch literal 14942 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v1/service/user/user_channel.py b/venv/Lib/site-packages/twilio/rest/chat/v1/service/user/user_channel.py new file mode 100644 index 00000000..b7f35aa9 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v1/service/user/user_channel.py @@ -0,0 +1,322 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class UserChannelInstance(InstanceResource): + + class ChannelStatus(object): + JOINED = "joined" + INVITED = "invited" + NOT_PARTICIPATING = "not_participating" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/api/rest/account) that created the User Channel resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) the resource is associated with. + :ivar channel_sid: The SID of the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) the resource belongs to. + :ivar member_sid: The SID of a [Member](https://www.twilio.com/docs/api/chat/rest/members) that represents the User on the Channel. + :ivar status: + :ivar last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/api/chat/rest/messages) in the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) that the Member has read. + :ivar unread_messages_count: The number of unread Messages in the Channel for the User. Note that retrieving messages on a client endpoint does not mean that messages are consumed or read. See [Consumption Horizon feature](/docs/api/chat/guides/consumption-horizon) to learn how to mark messages as consumed. + :ivar links: The absolute URLs of the [Members](https://www.twilio.com/docs/chat/api/members), [Messages](https://www.twilio.com/docs/chat/api/messages) , [Invites](https://www.twilio.com/docs/chat/api/invites) and, if it exists, the last [Message](https://www.twilio.com/docs/chat/api/messages) for the Channel. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], service_sid: str, user_sid: str + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.member_sid: Optional[str] = payload.get("member_sid") + self.status: Optional["UserChannelInstance.ChannelStatus"] = payload.get( + "status" + ) + self.last_consumed_message_index: Optional[int] = deserialize.integer( + payload.get("last_consumed_message_index") + ) + self.unread_messages_count: Optional[int] = deserialize.integer( + payload.get("unread_messages_count") + ) + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserChannelInstance: + """ + Build an instance of UserChannelInstance + + :param payload: Payload response from the API + """ + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserChannelList(ListResource): + + def __init__(self, version: Version, service_sid: str, user_sid: str): + """ + Initialize the UserChannelList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/api/chat/rest/services) to read the resources from. + :param user_sid: The SID of the [User](https://www.twilio.com/docs/api/chat/rest/users) to read the User Channel resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + } + self._uri = "/Services/{service_sid}/Users/{user_sid}/Channels".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserChannelInstance]: + """ + Streams UserChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserChannelInstance]: + """ + Asynchronously streams UserChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserChannelInstance]: + """ + Lists UserChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserChannelInstance]: + """ + Asynchronously lists UserChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserChannelPage: + """ + Retrieve a single page of UserChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserChannelPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserChannelPage: + """ + Asynchronously retrieve a single page of UserChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserChannelPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserChannelPage: + """ + Retrieve a specific page of UserChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserChannelPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserChannelPage: + """ + Asynchronously retrieve a specific page of UserChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserChannelPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/__init__.py b/venv/Lib/site-packages/twilio/rest/chat/v2/__init__.py new file mode 100644 index 00000000..e949532d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.chat.v2.credential import CredentialList +from twilio.rest.chat.v2.service import ServiceList + + +class V2(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V2 version of Chat + + :param domain: The Twilio.chat domain + """ + super().__init__(domain, "v2") + self._credentials: Optional[CredentialList] = None + self._services: Optional[ServiceList] = None + + @property + def credentials(self) -> CredentialList: + if self._credentials is None: + self._credentials = CredentialList(self) + return self._credentials + + @property + def services(self) -> ServiceList: + if self._services is None: + self._services = ServiceList(self) + return self._services + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..663f8d525c9a5aacd5cf19f45717f814f63ff1e4 GIT binary patch literal 2384 zcmcf?O>YxNbauVAH@5Rpi1-jmG!1RRLaeKlR;q=fQi4!a8YoFq$#Og0cqe$v+Uw44 zOdVM$he&lK5T`0R_6W*P=_M2-(27WvdZ>C!8&DCazBjWruAu6zyX!aabLM@`^G}0= z83NC(pTDk7rU>~JiSCn(k^K@No5Ud{;%JWUX*Ip1YltVjM9nA}5;weLEmcZMJn5xt zX33Oz${VO>%=j+v7JzRm$I#ae8&DwBP2uNS*W@Jt@sY7H|&63<8?0V zkUMm#g<{4Sefc5-Squ&3s=zB`tktK2`=A+P^3*n^?cNJ)B;W%TC1DIXl0<+$fCR_KCKx_V)Lfu6fEYbn#Y%L^BZah^RpkVf`O=>H?x^m2pO!G>N` z74U^6PpO7sBPbRMK8Wpxdpa%Vg9YxQI-~TsVrcD90+j><7^R3smNVd?GRe?kx+P8o+0=yo?3tI;Cqb zzBpeje-7F~`IFh%h4Ks!u7`f3-1MPt=b&A}a+BAa{&X6}s+Njg}aK16H$(Q&yLG1Q@|_0MFOR(;OKX+DP9wk8BzmxeNZD&O7L(+)GIJ-dJp=Izx}HKHc6X&(-XZ!)<#0qkx!d!$M#UZ zF7sdP=E*&6F0YGW&=W9SffR4R65tM090V9;`x3o61o8FJlc;+Fz#91_JNzg+c0W6| zlYQ$6weE%w=$X#U!`%4e;e(Hc>HT54V^T2+y8mZ*;xHTt0gk{T(gqGjnSWqPlZ)oaZj-dMyuQkN zEqz7!O&9(@Y`QF5UU$3}6}$m$1-)nE#OY}kRXYSl`l(&1x^@1a7ONv?)lju??plje z)AwEzF=KcjV{x}C!UA6d%+MOy%aD;t8CHG}uUy@(akz3B#%jK^;vt@6>|2JEiK8fxX+H*7ln6p0CJ-BpFJ^^%9%Fe;900EDx{qYni2<}ka0msT z0eHSn_6#%m{#NrDfn{%$q=xqNMDoq8ul^*k>?gVm@L!20woajFq9>Zz%OsPNTgU$* zu*eAI8FTqulxEEFD-c>LY&G2aHGvl@I;d{FwPXj}if5X@vPK8`C2E?$6lutH=jzFOu#stq};@-_`*D^3NS5B0f|j4FW+85)3iVIoMt>5Bih(5 aIk8LL-X$OIlJ}mb#9b{ny7&T^{DR|3U%dap<1x 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/credential.py b/venv/Lib/site-packages/twilio/rest/chat/v2/credential.py new file mode 100644 index 00000000..5479abec --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/credential.py @@ -0,0 +1,711 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CredentialInstance(InstanceResource): + + class PushService(object): + GCM = "gcm" + APN = "apn" + FCM = "fcm" + + """ + :ivar sid: The unique string that we created to identify the Credential resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Credential resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar type: + :ivar sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Credential resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["CredentialInstance.PushService"] = payload.get("type") + self.sandbox: Optional[str] = payload.get("sandbox") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[CredentialContext] = None + + @property + def _proxy(self) -> "CredentialContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CredentialContext for this CredentialInstance + """ + if self._context is None: + self._context = CredentialContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CredentialInstance": + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CredentialInstance": + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Asynchronous coroutine to update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the CredentialContext + + :param version: Version that contains the resource + :param sid: The SID of the Credential resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Credentials/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CredentialInstance: + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CredentialInstance: + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronous coroutine to update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CredentialInstance: + """ + Build an instance of CredentialInstance + + :param payload: Payload response from the API + """ + return CredentialInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CredentialList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CredentialList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Credentials" + + def create( + self, + type: "CredentialInstance.PushService", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Create the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + async def create_async( + self, + type: "CredentialInstance.PushService", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronously create the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CredentialInstance]: + """ + Streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CredentialInstance]: + """ + Asynchronously streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Asynchronously lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Asynchronously retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + def get_page(self, target_url: str) -> CredentialPage: + """ + Retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CredentialPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CredentialPage: + """ + Asynchronously retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CredentialPage(self._version, response) + + def get(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: The SID of the Credential resource to update. + """ + return CredentialContext(self._version, sid=sid) + + def __call__(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: The SID of the Credential resource to update. + """ + return CredentialContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/__init__.py b/venv/Lib/site-packages/twilio/rest/chat/v2/service/__init__.py new file mode 100644 index 00000000..90a6c6cd --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/service/__init__.py @@ -0,0 +1,1128 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.chat.v2.service.binding import BindingList +from twilio.rest.chat.v2.service.channel import ChannelList +from twilio.rest.chat.v2.service.role import RoleList +from twilio.rest.chat.v2.service.user import UserList + + +class ServiceInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Service resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Service resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar default_service_role_sid: The service role assigned to users when they are added to the service. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :ivar default_channel_role_sid: The channel role assigned to users when they are added to a channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :ivar default_channel_creator_role_sid: The channel role assigned to a channel creator when they join a new channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :ivar read_status_enabled: Whether the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature is enabled. The default is `true`. + :ivar reachability_enabled: Whether the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) is enabled for this Service instance. The default is `false`. + :ivar typing_indicator_timeout: How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + :ivar consumption_report_interval: DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + :ivar limits: An object that describes the limits of the service instance. The `limits` object contains `channel_members` to describe the members/channel limit and `user_channels` to describe the channels/user limit. `channel_members` can be 1,000 or less, with a default of 250. `user_channels` can be 1,000 or less, with a default value of 100. + :ivar pre_webhook_url: The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :ivar post_webhook_url: The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :ivar webhook_method: The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :ivar webhook_filters: The list of webhook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :ivar pre_webhook_retry_count: The number of times to retry a call to the `pre_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. Default retry count is 0 times, which means the call won't be retried. + :ivar post_webhook_retry_count: The number of times to retry a call to the `post_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. The default is 0, which means the call won't be retried. + :ivar notifications: The notification configuration for the Service instance. See [Push Notification Configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :ivar media: An object that describes the properties of media that the service supports. The object contains the `size_limit_mb` property, which describes the size of the largest media file in MB; and the `compatibility_message` property, which contains the message text to send when a media message does not have any text. + :ivar url: The absolute URL of the Service resource. + :ivar links: The absolute URLs of the Service's [Channels](https://www.twilio.com/docs/chat/channels), [Roles](https://www.twilio.com/docs/chat/rest/role-resource), [Bindings](https://www.twilio.com/docs/chat/rest/binding-resource), and [Users](https://www.twilio.com/docs/chat/rest/user-resource). + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.default_service_role_sid: Optional[str] = payload.get( + "default_service_role_sid" + ) + self.default_channel_role_sid: Optional[str] = payload.get( + "default_channel_role_sid" + ) + self.default_channel_creator_role_sid: Optional[str] = payload.get( + "default_channel_creator_role_sid" + ) + self.read_status_enabled: Optional[bool] = payload.get("read_status_enabled") + self.reachability_enabled: Optional[bool] = payload.get("reachability_enabled") + self.typing_indicator_timeout: Optional[int] = deserialize.integer( + payload.get("typing_indicator_timeout") + ) + self.consumption_report_interval: Optional[int] = deserialize.integer( + payload.get("consumption_report_interval") + ) + self.limits: Optional[Dict[str, object]] = payload.get("limits") + self.pre_webhook_url: Optional[str] = payload.get("pre_webhook_url") + self.post_webhook_url: Optional[str] = payload.get("post_webhook_url") + self.webhook_method: Optional[str] = payload.get("webhook_method") + self.webhook_filters: Optional[List[str]] = payload.get("webhook_filters") + self.pre_webhook_retry_count: Optional[int] = deserialize.integer( + payload.get("pre_webhook_retry_count") + ) + self.post_webhook_retry_count: Optional[int] = deserialize.integer( + payload.get("post_webhook_retry_count") + ) + self.notifications: Optional[Dict[str, object]] = payload.get("notifications") + self.media: Optional[Dict[str, object]] = payload.get("media") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ServiceContext] = None + + @property + def _proxy(self) -> "ServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ServiceContext for this ServiceInstance + """ + if self._context is None: + self._context = ServiceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ServiceInstance": + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ServiceInstance": + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_new_message_sound: Union[str, object] = values.unset, + notifications_new_message_badge_count_enabled: Union[ + bool, object + ] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_added_to_channel_sound: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_sound: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_sound: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + media_compatibility_message: Union[str, object] = values.unset, + pre_webhook_retry_count: Union[int, object] = values.unset, + post_webhook_retry_count: Union[int, object] = values.unset, + notifications_log_enabled: Union[bool, object] = values.unset, + ) -> "ServiceInstance": + """ + Update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. + :param default_service_role_sid: The service role assigned to users when they are added to the service. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param default_channel_role_sid: The channel role assigned to users when they are added to a channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param default_channel_creator_role_sid: The channel role assigned to a channel creator when they join a new channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param read_status_enabled: Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + :param reachability_enabled: Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + :param typing_indicator_timeout: How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + :param consumption_report_interval: DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + :param notifications_new_message_enabled: Whether to send a notification when a new message is added to a channel. The default is `false`. + :param notifications_new_message_template: The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_new_message_sound: The name of the sound to play when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_new_message_badge_count_enabled: Whether the new message badge is enabled. The default is `false`. + :param notifications_added_to_channel_enabled: Whether to send a notification when a member is added to a channel. The default is `false`. + :param notifications_added_to_channel_template: The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_added_to_channel_sound: The name of the sound to play when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_removed_from_channel_enabled: Whether to send a notification to a user when they are removed from a channel. The default is `false`. + :param notifications_removed_from_channel_template: The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_removed_from_channel_sound: The name of the sound to play to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_invited_to_channel_enabled: Whether to send a notification when a user is invited to a channel. The default is `false`. + :param notifications_invited_to_channel_template: The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param notifications_invited_to_channel_sound: The name of the sound to play when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param pre_webhook_url: The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param post_webhook_url: The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_method: The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_filters: The list of webhook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param limits_channel_members: The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + :param limits_user_channels: The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + :param media_compatibility_message: The message to send when a media message has no text. Can be used as placeholder message. + :param pre_webhook_retry_count: The number of times to retry a call to the `pre_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. Default retry count is 0 times, which means the call won't be retried. + :param post_webhook_retry_count: The number of times to retry a call to the `post_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. The default is 0, which means the call won't be retried. + :param notifications_log_enabled: Whether to log notifications. The default is `false`. + + :returns: The updated ServiceInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + default_service_role_sid=default_service_role_sid, + default_channel_role_sid=default_channel_role_sid, + default_channel_creator_role_sid=default_channel_creator_role_sid, + read_status_enabled=read_status_enabled, + reachability_enabled=reachability_enabled, + typing_indicator_timeout=typing_indicator_timeout, + consumption_report_interval=consumption_report_interval, + notifications_new_message_enabled=notifications_new_message_enabled, + notifications_new_message_template=notifications_new_message_template, + notifications_new_message_sound=notifications_new_message_sound, + notifications_new_message_badge_count_enabled=notifications_new_message_badge_count_enabled, + notifications_added_to_channel_enabled=notifications_added_to_channel_enabled, + notifications_added_to_channel_template=notifications_added_to_channel_template, + notifications_added_to_channel_sound=notifications_added_to_channel_sound, + notifications_removed_from_channel_enabled=notifications_removed_from_channel_enabled, + notifications_removed_from_channel_template=notifications_removed_from_channel_template, + notifications_removed_from_channel_sound=notifications_removed_from_channel_sound, + notifications_invited_to_channel_enabled=notifications_invited_to_channel_enabled, + notifications_invited_to_channel_template=notifications_invited_to_channel_template, + notifications_invited_to_channel_sound=notifications_invited_to_channel_sound, + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + webhook_method=webhook_method, + webhook_filters=webhook_filters, + limits_channel_members=limits_channel_members, + limits_user_channels=limits_user_channels, + media_compatibility_message=media_compatibility_message, + pre_webhook_retry_count=pre_webhook_retry_count, + post_webhook_retry_count=post_webhook_retry_count, + notifications_log_enabled=notifications_log_enabled, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_new_message_sound: Union[str, object] = values.unset, + notifications_new_message_badge_count_enabled: Union[ + bool, object + ] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_added_to_channel_sound: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_sound: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_sound: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + media_compatibility_message: Union[str, object] = values.unset, + pre_webhook_retry_count: Union[int, object] = values.unset, + post_webhook_retry_count: Union[int, object] = values.unset, + notifications_log_enabled: Union[bool, object] = values.unset, + ) -> "ServiceInstance": + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. + :param default_service_role_sid: The service role assigned to users when they are added to the service. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param default_channel_role_sid: The channel role assigned to users when they are added to a channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param default_channel_creator_role_sid: The channel role assigned to a channel creator when they join a new channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param read_status_enabled: Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + :param reachability_enabled: Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + :param typing_indicator_timeout: How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + :param consumption_report_interval: DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + :param notifications_new_message_enabled: Whether to send a notification when a new message is added to a channel. The default is `false`. + :param notifications_new_message_template: The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_new_message_sound: The name of the sound to play when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_new_message_badge_count_enabled: Whether the new message badge is enabled. The default is `false`. + :param notifications_added_to_channel_enabled: Whether to send a notification when a member is added to a channel. The default is `false`. + :param notifications_added_to_channel_template: The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_added_to_channel_sound: The name of the sound to play when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_removed_from_channel_enabled: Whether to send a notification to a user when they are removed from a channel. The default is `false`. + :param notifications_removed_from_channel_template: The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_removed_from_channel_sound: The name of the sound to play to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_invited_to_channel_enabled: Whether to send a notification when a user is invited to a channel. The default is `false`. + :param notifications_invited_to_channel_template: The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param notifications_invited_to_channel_sound: The name of the sound to play when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param pre_webhook_url: The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param post_webhook_url: The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_method: The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_filters: The list of webhook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param limits_channel_members: The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + :param limits_user_channels: The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + :param media_compatibility_message: The message to send when a media message has no text. Can be used as placeholder message. + :param pre_webhook_retry_count: The number of times to retry a call to the `pre_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. Default retry count is 0 times, which means the call won't be retried. + :param post_webhook_retry_count: The number of times to retry a call to the `post_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. The default is 0, which means the call won't be retried. + :param notifications_log_enabled: Whether to log notifications. The default is `false`. + + :returns: The updated ServiceInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + default_service_role_sid=default_service_role_sid, + default_channel_role_sid=default_channel_role_sid, + default_channel_creator_role_sid=default_channel_creator_role_sid, + read_status_enabled=read_status_enabled, + reachability_enabled=reachability_enabled, + typing_indicator_timeout=typing_indicator_timeout, + consumption_report_interval=consumption_report_interval, + notifications_new_message_enabled=notifications_new_message_enabled, + notifications_new_message_template=notifications_new_message_template, + notifications_new_message_sound=notifications_new_message_sound, + notifications_new_message_badge_count_enabled=notifications_new_message_badge_count_enabled, + notifications_added_to_channel_enabled=notifications_added_to_channel_enabled, + notifications_added_to_channel_template=notifications_added_to_channel_template, + notifications_added_to_channel_sound=notifications_added_to_channel_sound, + notifications_removed_from_channel_enabled=notifications_removed_from_channel_enabled, + notifications_removed_from_channel_template=notifications_removed_from_channel_template, + notifications_removed_from_channel_sound=notifications_removed_from_channel_sound, + notifications_invited_to_channel_enabled=notifications_invited_to_channel_enabled, + notifications_invited_to_channel_template=notifications_invited_to_channel_template, + notifications_invited_to_channel_sound=notifications_invited_to_channel_sound, + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + webhook_method=webhook_method, + webhook_filters=webhook_filters, + limits_channel_members=limits_channel_members, + limits_user_channels=limits_user_channels, + media_compatibility_message=media_compatibility_message, + pre_webhook_retry_count=pre_webhook_retry_count, + post_webhook_retry_count=post_webhook_retry_count, + notifications_log_enabled=notifications_log_enabled, + ) + + @property + def bindings(self) -> BindingList: + """ + Access the bindings + """ + return self._proxy.bindings + + @property + def channels(self) -> ChannelList: + """ + Access the channels + """ + return self._proxy.channels + + @property + def roles(self) -> RoleList: + """ + Access the roles + """ + return self._proxy.roles + + @property + def users(self) -> UserList: + """ + Access the users + """ + return self._proxy.users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServiceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ServiceContext + + :param version: Version that contains the resource + :param sid: The SID of the Service resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Services/{sid}".format(**self._solution) + + self._bindings: Optional[BindingList] = None + self._channels: Optional[ChannelList] = None + self._roles: Optional[RoleList] = None + self._users: Optional[UserList] = None + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ServiceInstance: + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ServiceInstance: + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_new_message_sound: Union[str, object] = values.unset, + notifications_new_message_badge_count_enabled: Union[ + bool, object + ] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_added_to_channel_sound: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_sound: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_sound: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + media_compatibility_message: Union[str, object] = values.unset, + pre_webhook_retry_count: Union[int, object] = values.unset, + post_webhook_retry_count: Union[int, object] = values.unset, + notifications_log_enabled: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. + :param default_service_role_sid: The service role assigned to users when they are added to the service. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param default_channel_role_sid: The channel role assigned to users when they are added to a channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param default_channel_creator_role_sid: The channel role assigned to a channel creator when they join a new channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param read_status_enabled: Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + :param reachability_enabled: Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + :param typing_indicator_timeout: How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + :param consumption_report_interval: DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + :param notifications_new_message_enabled: Whether to send a notification when a new message is added to a channel. The default is `false`. + :param notifications_new_message_template: The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_new_message_sound: The name of the sound to play when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_new_message_badge_count_enabled: Whether the new message badge is enabled. The default is `false`. + :param notifications_added_to_channel_enabled: Whether to send a notification when a member is added to a channel. The default is `false`. + :param notifications_added_to_channel_template: The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_added_to_channel_sound: The name of the sound to play when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_removed_from_channel_enabled: Whether to send a notification to a user when they are removed from a channel. The default is `false`. + :param notifications_removed_from_channel_template: The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_removed_from_channel_sound: The name of the sound to play to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_invited_to_channel_enabled: Whether to send a notification when a user is invited to a channel. The default is `false`. + :param notifications_invited_to_channel_template: The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param notifications_invited_to_channel_sound: The name of the sound to play when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param pre_webhook_url: The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param post_webhook_url: The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_method: The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_filters: The list of webhook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param limits_channel_members: The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + :param limits_user_channels: The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + :param media_compatibility_message: The message to send when a media message has no text. Can be used as placeholder message. + :param pre_webhook_retry_count: The number of times to retry a call to the `pre_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. Default retry count is 0 times, which means the call won't be retried. + :param post_webhook_retry_count: The number of times to retry a call to the `post_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. The default is 0, which means the call won't be retried. + :param notifications_log_enabled: Whether to log notifications. The default is `false`. + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DefaultServiceRoleSid": default_service_role_sid, + "DefaultChannelRoleSid": default_channel_role_sid, + "DefaultChannelCreatorRoleSid": default_channel_creator_role_sid, + "ReadStatusEnabled": serialize.boolean_to_string(read_status_enabled), + "ReachabilityEnabled": serialize.boolean_to_string( + reachability_enabled + ), + "TypingIndicatorTimeout": typing_indicator_timeout, + "ConsumptionReportInterval": consumption_report_interval, + "Notifications.NewMessage.Enabled": serialize.boolean_to_string( + notifications_new_message_enabled + ), + "Notifications.NewMessage.Template": notifications_new_message_template, + "Notifications.NewMessage.Sound": notifications_new_message_sound, + "Notifications.NewMessage.BadgeCountEnabled": serialize.boolean_to_string( + notifications_new_message_badge_count_enabled + ), + "Notifications.AddedToChannel.Enabled": serialize.boolean_to_string( + notifications_added_to_channel_enabled + ), + "Notifications.AddedToChannel.Template": notifications_added_to_channel_template, + "Notifications.AddedToChannel.Sound": notifications_added_to_channel_sound, + "Notifications.RemovedFromChannel.Enabled": serialize.boolean_to_string( + notifications_removed_from_channel_enabled + ), + "Notifications.RemovedFromChannel.Template": notifications_removed_from_channel_template, + "Notifications.RemovedFromChannel.Sound": notifications_removed_from_channel_sound, + "Notifications.InvitedToChannel.Enabled": serialize.boolean_to_string( + notifications_invited_to_channel_enabled + ), + "Notifications.InvitedToChannel.Template": notifications_invited_to_channel_template, + "Notifications.InvitedToChannel.Sound": notifications_invited_to_channel_sound, + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "WebhookMethod": webhook_method, + "WebhookFilters": serialize.map(webhook_filters, lambda e: e), + "Limits.ChannelMembers": limits_channel_members, + "Limits.UserChannels": limits_user_channels, + "Media.CompatibilityMessage": media_compatibility_message, + "PreWebhookRetryCount": pre_webhook_retry_count, + "PostWebhookRetryCount": post_webhook_retry_count, + "Notifications.LogEnabled": serialize.boolean_to_string( + notifications_log_enabled + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_new_message_sound: Union[str, object] = values.unset, + notifications_new_message_badge_count_enabled: Union[ + bool, object + ] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_added_to_channel_sound: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_sound: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_sound: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + media_compatibility_message: Union[str, object] = values.unset, + pre_webhook_retry_count: Union[int, object] = values.unset, + post_webhook_retry_count: Union[int, object] = values.unset, + notifications_log_enabled: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. + :param default_service_role_sid: The service role assigned to users when they are added to the service. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param default_channel_role_sid: The channel role assigned to users when they are added to a channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param default_channel_creator_role_sid: The channel role assigned to a channel creator when they join a new channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + :param read_status_enabled: Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + :param reachability_enabled: Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + :param typing_indicator_timeout: How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + :param consumption_report_interval: DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + :param notifications_new_message_enabled: Whether to send a notification when a new message is added to a channel. The default is `false`. + :param notifications_new_message_template: The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_new_message_sound: The name of the sound to play when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + :param notifications_new_message_badge_count_enabled: Whether the new message badge is enabled. The default is `false`. + :param notifications_added_to_channel_enabled: Whether to send a notification when a member is added to a channel. The default is `false`. + :param notifications_added_to_channel_template: The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_added_to_channel_sound: The name of the sound to play when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + :param notifications_removed_from_channel_enabled: Whether to send a notification to a user when they are removed from a channel. The default is `false`. + :param notifications_removed_from_channel_template: The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_removed_from_channel_sound: The name of the sound to play to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + :param notifications_invited_to_channel_enabled: Whether to send a notification when a user is invited to a channel. The default is `false`. + :param notifications_invited_to_channel_template: The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param notifications_invited_to_channel_sound: The name of the sound to play when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + :param pre_webhook_url: The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param post_webhook_url: The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_method: The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param webhook_filters: The list of webhook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + :param limits_channel_members: The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + :param limits_user_channels: The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + :param media_compatibility_message: The message to send when a media message has no text. Can be used as placeholder message. + :param pre_webhook_retry_count: The number of times to retry a call to the `pre_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. Default retry count is 0 times, which means the call won't be retried. + :param post_webhook_retry_count: The number of times to retry a call to the `post_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. The default is 0, which means the call won't be retried. + :param notifications_log_enabled: Whether to log notifications. The default is `false`. + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DefaultServiceRoleSid": default_service_role_sid, + "DefaultChannelRoleSid": default_channel_role_sid, + "DefaultChannelCreatorRoleSid": default_channel_creator_role_sid, + "ReadStatusEnabled": serialize.boolean_to_string(read_status_enabled), + "ReachabilityEnabled": serialize.boolean_to_string( + reachability_enabled + ), + "TypingIndicatorTimeout": typing_indicator_timeout, + "ConsumptionReportInterval": consumption_report_interval, + "Notifications.NewMessage.Enabled": serialize.boolean_to_string( + notifications_new_message_enabled + ), + "Notifications.NewMessage.Template": notifications_new_message_template, + "Notifications.NewMessage.Sound": notifications_new_message_sound, + "Notifications.NewMessage.BadgeCountEnabled": serialize.boolean_to_string( + notifications_new_message_badge_count_enabled + ), + "Notifications.AddedToChannel.Enabled": serialize.boolean_to_string( + notifications_added_to_channel_enabled + ), + "Notifications.AddedToChannel.Template": notifications_added_to_channel_template, + "Notifications.AddedToChannel.Sound": notifications_added_to_channel_sound, + "Notifications.RemovedFromChannel.Enabled": serialize.boolean_to_string( + notifications_removed_from_channel_enabled + ), + "Notifications.RemovedFromChannel.Template": notifications_removed_from_channel_template, + "Notifications.RemovedFromChannel.Sound": notifications_removed_from_channel_sound, + "Notifications.InvitedToChannel.Enabled": serialize.boolean_to_string( + notifications_invited_to_channel_enabled + ), + "Notifications.InvitedToChannel.Template": notifications_invited_to_channel_template, + "Notifications.InvitedToChannel.Sound": notifications_invited_to_channel_sound, + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "WebhookMethod": webhook_method, + "WebhookFilters": serialize.map(webhook_filters, lambda e: e), + "Limits.ChannelMembers": limits_channel_members, + "Limits.UserChannels": limits_user_channels, + "Media.CompatibilityMessage": media_compatibility_message, + "PreWebhookRetryCount": pre_webhook_retry_count, + "PostWebhookRetryCount": post_webhook_retry_count, + "Notifications.LogEnabled": serialize.boolean_to_string( + notifications_log_enabled + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def bindings(self) -> BindingList: + """ + Access the bindings + """ + if self._bindings is None: + self._bindings = BindingList( + self._version, + self._solution["sid"], + ) + return self._bindings + + @property + def channels(self) -> ChannelList: + """ + Access the channels + """ + if self._channels is None: + self._channels = ChannelList( + self._version, + self._solution["sid"], + ) + return self._channels + + @property + def roles(self) -> RoleList: + """ + Access the roles + """ + if self._roles is None: + self._roles = RoleList( + self._version, + self._solution["sid"], + ) + return self._roles + + @property + def users(self) -> UserList: + """ + Access the users + """ + if self._users is None: + self._users = UserList( + self._version, + self._solution["sid"], + ) + return self._users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ServiceInstance: + """ + Build an instance of ServiceInstance + + :param payload: Payload response from the API + """ + return ServiceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services" + + def create(self, friendly_name: str) -> ServiceInstance: + """ + Create the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + async def create_async(self, friendly_name: str) -> ServiceInstance: + """ + Asynchronously create the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ServiceInstance]: + """ + Streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ServiceInstance]: + """ + Asynchronously streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Asynchronously lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Asynchronously retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + def get_page(self, target_url: str) -> ServicePage: + """ + Retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ServicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ServicePage: + """ + Asynchronously retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ServicePage(self._version, response) + + def get(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The SID of the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The SID of the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v2/service/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22927500972825490f56a5083053be0925576b12 GIT binary patch literal 57157 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/__pycache__/binding.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v2/service/__pycache__/binding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..271df6652790292f923ca802e7a2d2d27020b94b GIT binary patch literal 25877 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 CvJqPV literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/__pycache__/role.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v2/service/__pycache__/role.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a9c9b6f26931a1452c550623509d9eb6ab9e8be GIT binary patch literal 27060 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 E4@cwo+W-In literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/binding.py b/venv/Lib/site-packages/twilio/rest/chat/v2/service/binding.py new file mode 100644 index 00000000..125f4b93 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/service/binding.py @@ -0,0 +1,536 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class BindingInstance(InstanceResource): + + class BindingType(object): + GCM = "gcm" + APN = "apn" + FCM = "fcm" + + """ + :ivar sid: The unique string that we created to identify the Binding resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Binding resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the Binding resource is associated with. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar endpoint: The unique endpoint identifier for the Binding. The format of this value depends on the `binding_type`. + :ivar identity: The application-defined string that uniquely identifies the resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more info. + :ivar credential_sid: The SID of the [Credential](https://www.twilio.com/docs/chat/rest/credential-resource) for the binding. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :ivar binding_type: + :ivar message_types: The [Programmable Chat message types](https://www.twilio.com/docs/chat/push-notification-configuration#push-types) the binding is subscribed to. + :ivar url: The absolute URL of the Binding resource. + :ivar links: The absolute URLs of the Binding's [User](https://www.twilio.com/docs/chat/rest/user-resource). + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.endpoint: Optional[str] = payload.get("endpoint") + self.identity: Optional[str] = payload.get("identity") + self.credential_sid: Optional[str] = payload.get("credential_sid") + self.binding_type: Optional["BindingInstance.BindingType"] = payload.get( + "binding_type" + ) + self.message_types: Optional[List[str]] = payload.get("message_types") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[BindingContext] = None + + @property + def _proxy(self) -> "BindingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: BindingContext for this BindingInstance + """ + if self._context is None: + self._context = BindingContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "BindingInstance": + """ + Fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "BindingInstance": + """ + Asynchronous coroutine to fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BindingContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the BindingContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to fetch the Binding resource from. + :param sid: The SID of the Binding resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Bindings/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> BindingInstance: + """ + Fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return BindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> BindingInstance: + """ + Asynchronous coroutine to fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return BindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BindingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> BindingInstance: + """ + Build an instance of BindingInstance + + :param payload: Payload response from the API + """ + return BindingInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class BindingList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the BindingList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the Binding resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Bindings".format(**self._solution) + + def stream( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[BindingInstance]: + """ + Streams BindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["BindingInstance.BindingType"] binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + binding_type=binding_type, identity=identity, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[BindingInstance]: + """ + Asynchronously streams BindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["BindingInstance.BindingType"] binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + binding_type=binding_type, identity=identity, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BindingInstance]: + """ + Lists BindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["BindingInstance.BindingType"] binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + binding_type=binding_type, + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BindingInstance]: + """ + Asynchronously lists BindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["BindingInstance.BindingType"] binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + binding_type=binding_type, + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BindingPage: + """ + Retrieve a single page of BindingInstance records from the API. + Request is executed immediately + + :param binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BindingInstance + """ + data = values.of( + { + "BindingType": serialize.map(binding_type, lambda e: e), + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BindingPage(self._version, response, self._solution) + + async def page_async( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BindingPage: + """ + Asynchronously retrieve a single page of BindingInstance records from the API. + Request is executed immediately + + :param binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BindingInstance + """ + data = values.of( + { + "BindingType": serialize.map(binding_type, lambda e: e), + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BindingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> BindingPage: + """ + Retrieve a specific page of BindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BindingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return BindingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> BindingPage: + """ + Asynchronously retrieve a specific page of BindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BindingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return BindingPage(self._version, response, self._solution) + + def get(self, sid: str) -> BindingContext: + """ + Constructs a BindingContext + + :param sid: The SID of the Binding resource to fetch. + """ + return BindingContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> BindingContext: + """ + Constructs a BindingContext + + :param sid: The SID of the Binding resource to fetch. + """ + return BindingContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__init__.py b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__init__.py new file mode 100644 index 00000000..36d08a38 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__init__.py @@ -0,0 +1,962 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.chat.v2.service.channel.invite import InviteList +from twilio.rest.chat.v2.service.channel.member import MemberList +from twilio.rest.chat.v2.service.channel.message import MessageList +from twilio.rest.chat.v2.service.channel.webhook import WebhookList + + +class ChannelInstance(InstanceResource): + + class ChannelType(object): + PUBLIC = "public" + PRIVATE = "private" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: The unique string that we created to identify the Channel resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Channel resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the Channel resource is associated with. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :ivar attributes: The JSON string that stores application-specific data. If attributes have not been set, `{}` is returned. + :ivar type: + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar created_by: The `identity` of the User that created the channel. If the Channel was created by using the API, the value is `system`. + :ivar members_count: The number of Members in the Channel. + :ivar messages_count: The number of Messages that have been passed in the Channel. + :ivar url: The absolute URL of the Channel resource. + :ivar links: The absolute URLs of the [Members](https://www.twilio.com/docs/chat/rest/member-resource), [Messages](https://www.twilio.com/docs/chat/rest/message-resource), [Invites](https://www.twilio.com/docs/chat/rest/invite-resource), Webhooks and, if it exists, the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) for the Channel. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.unique_name: Optional[str] = payload.get("unique_name") + self.attributes: Optional[str] = payload.get("attributes") + self.type: Optional["ChannelInstance.ChannelType"] = payload.get("type") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.created_by: Optional[str] = payload.get("created_by") + self.members_count: Optional[int] = deserialize.integer( + payload.get("members_count") + ) + self.messages_count: Optional[int] = deserialize.integer( + payload.get("messages_count") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[ChannelContext] = None + + @property + def _proxy(self) -> "ChannelContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ChannelContext for this ChannelInstance + """ + if self._context is None: + self._context = ChannelContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "ChannelInstance": + """ + Fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ChannelInstance": + """ + Asynchronous coroutine to fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> "ChannelInstance": + """ + Update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 256 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 256 characters or less in length and unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param created_by: The `identity` of the User that created the channel. Default is: `system`. + + :returns: The updated ChannelInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + unique_name=unique_name, + attributes=attributes, + date_created=date_created, + date_updated=date_updated, + created_by=created_by, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> "ChannelInstance": + """ + Asynchronous coroutine to update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 256 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 256 characters or less in length and unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param created_by: The `identity` of the User that created the channel. Default is: `system`. + + :returns: The updated ChannelInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + unique_name=unique_name, + attributes=attributes, + date_created=date_created, + date_updated=date_updated, + created_by=created_by, + ) + + @property + def invites(self) -> InviteList: + """ + Access the invites + """ + return self._proxy.invites + + @property + def members(self) -> MemberList: + """ + Access the members + """ + return self._proxy.members + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + return self._proxy.messages + + @property + def webhooks(self) -> WebhookList: + """ + Access the webhooks + """ + return self._proxy.webhooks + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the ChannelContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to update the Channel resource in. + :param sid: The SID of the Channel resource to update. This value can be either the `sid` or the `unique_name` of the Channel resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Channels/{sid}".format(**self._solution) + + self._invites: Optional[InviteList] = None + self._members: Optional[MemberList] = None + self._messages: Optional[MessageList] = None + self._webhooks: Optional[WebhookList] = None + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ChannelInstance: + """ + Fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ChannelInstance: + """ + Asynchronous coroutine to fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 256 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 256 characters or less in length and unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param created_by: The `identity` of the User that created the channel. Default is: `system`. + + :returns: The updated ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "CreatedBy": created_by, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Asynchronous coroutine to update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 256 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 256 characters or less in length and unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param created_by: The `identity` of the User that created the channel. Default is: `system`. + + :returns: The updated ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "CreatedBy": created_by, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + @property + def invites(self) -> InviteList: + """ + Access the invites + """ + if self._invites is None: + self._invites = InviteList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._invites + + @property + def members(self) -> MemberList: + """ + Access the members + """ + if self._members is None: + self._members = MemberList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._members + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + if self._messages is None: + self._messages = MessageList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._messages + + @property + def webhooks(self) -> WebhookList: + """ + Access the webhooks + """ + if self._webhooks is None: + self._webhooks = WebhookList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._webhooks + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ChannelInstance: + """ + Build an instance of ChannelInstance + + :param payload: Payload response from the API + """ + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ChannelList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the ChannelList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the Channel resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Channels".format(**self._solution) + + def create( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Create the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the Channel resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + :param type: + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. The default value is `null`. Note that this parameter should only be used in cases where a Channel is being recreated from a backup/separate source and where a Message was previously updated. + :param created_by: The `identity` of the User that created the channel. Default is: `system`. + + :returns: The created ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "Type": type, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "CreatedBy": created_by, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Asynchronously create the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the Channel resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + :param attributes: A valid JSON string that contains application-specific data. + :param type: + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. The default value is `null`. Note that this parameter should only be used in cases where a Channel is being recreated from a backup/separate source and where a Message was previously updated. + :param created_by: The `identity` of the User that created the channel. Default is: `system`. + + :returns: The created ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "Type": type, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "CreatedBy": created_by, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ChannelInstance]: + """ + Streams ChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["ChannelInstance.ChannelType"] type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(type=type, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ChannelInstance]: + """ + Asynchronously streams ChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["ChannelInstance.ChannelType"] type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(type=type, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelInstance]: + """ + Lists ChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["ChannelInstance.ChannelType"] type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + type=type, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelInstance]: + """ + Asynchronously lists ChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["ChannelInstance.ChannelType"] type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + type=type, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelPage: + """ + Retrieve a single page of ChannelInstance records from the API. + Request is executed immediately + + :param type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelInstance + """ + data = values.of( + { + "Type": serialize.map(type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelPage(self._version, response, self._solution) + + async def page_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelPage: + """ + Asynchronously retrieve a single page of ChannelInstance records from the API. + Request is executed immediately + + :param type: The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelInstance + """ + data = values.of( + { + "Type": serialize.map(type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ChannelPage: + """ + Retrieve a specific page of ChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ChannelPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ChannelPage: + """ + Asynchronously retrieve a specific page of ChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ChannelPage(self._version, response, self._solution) + + def get(self, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param sid: The SID of the Channel resource to update. This value can be either the `sid` or the `unique_name` of the Channel resource to update. + """ + return ChannelContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param sid: The SID of the Channel resource to update. This value can be either the `sid` or the `unique_name` of the Channel resource to update. + """ + return ChannelContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c04e742755bd191a49cd1420f08c1047620a7281 GIT binary patch literal 40381 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 KD$tXS<^KXq8|)4M literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/member.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/member.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8954b7986ee837b027c9ff95dcbf5212c2600858 GIT binary patch literal 40193 zcmeHweRNdUwcow-J)@CE==%$}AV3-{jrg#^mNBtFU=xFEBXC}1{DxuX3I@-Ia%Tic zNU3Y{@}PB|A+IlpzN{KISL+9zHhq7lQELDWLuA zs%P#hJQszC&?iL1h$SY*#XeCazcprwTl=hWTc0g%@3Y4peU7-Z&lz|1x#I3VH_Ky- zdEzB~C2?<`H(uIT%Hr&?vbe9$$NY|1d3;&lGUj*2D&m!WmCWyoRmH3Os+r#%tBKe4 z)rx{ectnVJ&IpkbdD&}L-oCy%7VAZ9sqE8Z>sf3WVtsP09^1fT%MrUwuGC{2hbsJ) zp}!La!6V^!;8-*zg_99kIvGkyN9Ba9gwk?EIxGu_wTb_B?)ISEt&~u~3Q?3Js={rp}fgACMC$BR#@LAgKgcEyvR7fmCNl zM-s`QfoQurKuAu@;bSaIcT!3u(~=yCrdeactde*rF&K))h60{n(A4pZSyu!Dn~uh1 zzcXv?N(^Of-O+G5Yug)5rL(Tb2h!1GA{5Ko4<_Kry7r`LCM1ibaRztUK>@oCw7RiCCu=Hp@lKa*J%$XSvNSxP?eV#46h( zHrXLNWmmtY9v~ui*%?7N;*{O8lVbWkXN7(-;yP2>=aEYyjaYNG*VM}TymIOBCN*Gq zAb*MMi+E+L3e_!__uC?+XY75;ZmUEYN>oIeBEB=WzDhjH@vJHi;qwsN?<{!lWwH-_ ztMx(!Le+Yx5}_JBRAmZPn?f}R<)OGELVtOr7Clq@d3fjIZTJ*>q7FS#7r|`pw?yhO zKkCm4r^LR7UctXSTeeS*ACVPpahX;OP(1t1RpF6eFA=fN8nN`*hOBd<3*_8d6WEvKGMCkGClNJhhQ7w}s8 z&*l&Tn77ZHm+HR58YRIeCy8v99A+P?13*@yM@;bFPq%}k>9Iw#g^3MezIW$Px z6K}W5Smfs?;*N|5q!4d0-ZNz>`OnEV9h2#2s&|qQCmVU>Imgw&hLB3$6 zmOdo-%X*Y`2xdz{;c#*=k*4*dtVN8nhN4~32v&YHJ(Tqlc@hjOGLfHZXmEfcBUzV{ z1d^d;*a+e#9SkQEslm7$3C87A3OFJdO+@5V*#<)*BWHp{?tl`B4`i)_N-XOMrPE6E z$Y5GdO;}k2cvGl_{;I4!H8>zEgy5oyXc|b(dQ?uc<}0n#V!hdlpMo@57N?A{7_mI;@8Jtm&Ku2XoX{V?FIUVF|phR~tm5dD%<%L@DR*YD3W^E}s)~~Fl zY|Z3QSLIuZQb9)K1%oMCc0|ug(sPPLxi-TYt}Vdo+6z(bsfU4ve)F7gygGKSKT5aS^}@0e&zIJ z=XA?%F>Ept}OMh^k3zwQt=Zo65AoI_~sFhlIz zHPg8-)45NDI8}Gww08?YKFC0}UUvzlbu-@9jJI{X_Kn7g#;NcoE}sXVQr&D?+P>^Y$y2F@LZ%-L$L+F=XRy@_+2=zQ5@{;Gre7 z@neXZO2^C40Fe_?vR?;?b%tW`XyT}JBBVrs?TO#q3lzpNujtsEMzHrEy4(FZ8^lW?9Ba^-@z{H2G^Jv3D!ebD5eEw8#* zdZBc-NqV{GQqTB9nWhI!{;Il*Jr{Z|-9H z-Kij_mVzfaAs584ktjJv0);K8S^LohWD~U$o`ojraebO<#fXr3T_;p9O)NKltaoI$ z9Fu`t+31+x-!Mo6Ate--7HTM+lx67;+WA?!T_xt)Rf1G{^uU29Bt`xj&Y5ZHm>i18 ziUG7f{s%y^O3{8P!Wtx{2E$=lj-=Y8-9*JoNlYK*WHcq~EyqZ9;T8QBQsn)$H1bfQHIf&k2@tPfoD7 zJ#5hCjmirsJoglw#{}_?N9F~bhfiblzHPZ^{f6Bx^a@*r7j1uOJt_LFH$Kweo1N{C zDaiz_z;IGYVlzs}7{E|k?Y!T|(Nwz8dp+7x>UKV;H31B2jpx_;$YOZQJvZ2S<9W$1{!_8V_FcPQ zG;I|$p=f>0ZGm$;D^TN3VD*VNzN(MqZaE!3R&?#@S@IZ?R#`t406sOpyPjF=KRe5( zdS-^P5C76kGt4``V1^#-J(vw!hU=luRPpPtRH!S^GHvvg2Sg@nLhp6 zGSzL<)qxpbV9FJk@&(lCwxUJ6EUvY^Vs8-{1!^EX^Q0+JpJ5jq?dOJvO-5QDw=)?> z#1RWWCyY2ooY)%FlOSykKmEB~Wi!+Ee2`J|Mf;bM>DPJJHwO+^hpZhW_%_qKryE2G zYthsDam0A0RpYmwJb5y}chW#O8SjWB!zs>tU|a}-(heVIWD-3BzHanrLZeLLoEyQm zvWVOt8jPhSDgz=1WK8;45_?c;Kn_RyiJVEI99HAgy_~19*hZ+_iF`Xa$Jo$~hT~A- zS&6?tJ2q)OK)I!-_wf_eVjH0z!19g2t6=M(_u(^IItH-<4s{XfWHfy&s=n$@&bC=Z zEh^h3<-gh66&&{X%RRlP_i>4iX8Bs=MBrrf+2{ax<)J`QIod&?4&)0`KEI?N7w>YP zu=kh2-b(Alvf4X$yHkvZXxR56x zMk^>bBps2Z!4#I$$zyUt3Te|1*^kI{%ur;tIa0rpj3dJl@D~RMz)2)RsM?r$EzL7GI;Acgt76fJ^yS{id!!VY9_RtqfplmJ;iM*o1_mIr3elOX zUByLV2`?K`#a0ZDgYwx zJR+RKy@aIHeQ-d5Y|<$Zl?b1$UOwBpbGD^xwtg-BuU(b%F|yo6WVuTt%L{i$MxPu3 z%-f|;7TO_iMxy`J;xO!-3zIDTb=jIRQxJwz(bAr}=#718Pu01rOM9wDjj|m;-8??? z9bjosy$StxM^wt^c~4d7Jggrhy&T)C=Sap&oWCo61tsROGmHg^F`e28ho2`m>E}t6 zol$gqBnF3z7#!LjiH%ZcaIEVP$HjKrguTPe;K1RJpDEA41EnhQxbe)7IQm5_XNaRs z%#ea#F&U|L*6$WH-)kz&QK)DgSI?eCKzX?$Q50Tmv!h{U6k1l998y^0y7WZ+1_1 zO@3``>&x3OZ69AX{^U$!N2a0ow{te+d4A<8ad`DM&bbW`2_JZBQ@~uAbb56Age_}3 zo{T0K3q5OxtUsPo{ty5rIJ-6LR5|-bHXTXjcr%Mgw|K%w0FfeI8i+oxP+4=a^+GEe zccuI7p0|2twmp&A_QdqI{qHyQPFM7vbL z55dv=q(R|tR7i@VkQ7)UZGx;LdE~epPBZ-hg@mRG4Rh8CdRw6mQD{0ciCoqNsQ_di z=^@5nR!S+KeK3I|k3vg0Ydexm#u!^!A$}xdt|`PB%32{mRA?v_qIVTq-paF-P^wA+ z!*VPZ41$48jC{tRdzcNmLXBn)H9K`0)95#6gzGkoy>9HO>jEA*SE=2VTQ96weXVqj zeaqElbvZkpkbqUxoDYv}K7Z`Oiky>TTtZEK&P_fK`AW#=70Qt7+%q3j+1y@HaFqSZ zQf6O1XN50EzFezNTKUr6b9=A3eRj{))h)B$j>(!S@78NpOS30uM&OY7c+M8%+~U z*Q!?)YYigNn##H{>)2CcC7Fsfxe|)<3hV9}-#qCUe=xIlYp#@{%7nG+$6F_NPp$9F zta&i!qquURwrT9q%l%VLZJC<(+%k%*FvnF=T$NDWFxEVFV(gww)w&$DBv&JN8s=)r z*CT#`US_xGw0DbR&A%4t$yOJejbY42{YR^Yesh0~>1ovJi-^K3kyw1c;fG9%QZtiYt5uq&JJU{n+% z7#XFQwFL*2sNcc4hpQ=rd5v*m2s|{RfX&KLHM|yeDuepv%3i-j-qb!gknvuxFzH5t z{Lxf`@~S{yp>)4E<^A%E_sNX+$!mh8v~0Gb=3?MN0Mt!s8B;j=rkihjUDUuDa)`1t z3H$-Y9 zourhVh`dp^kfuh~(YPpB5}lJh`b`Cf)~v?xza|;Z|6j?CE2fR2P97Wo`MgW zc@Izo>$JZIpXngORWDSrvo?lYT5mz$rAR7`0c;Q|>o58*_^+0)pK9yQ(TL1hZIzz0 z&g(cDu%xjaf7*W5dDT}*8ZDpTOZqxtou}=VjEuZ?-KUAGa%y;$@U!a!!*&yAhPV*%&F$Q4AX-b~d3wQvN<1 z^T04Y3RRA69vIHBsHfoxp%^<$-o^-3*I#_*!ZS0~9hvHm*~-StRj<~+Qa||!R#?r3 z;%XP9j{1C8UDqn{-3GC1rS08DJN%{tIn8jk@4C>eTdh08N)l-_BbIF_ej95FINh2y$jvX+;ww9o->fi%ZW(%AKv*Ilov^axh9TX_tiZj>8@ zLmkIc&`x!9L4#@_owYu)>j0Y^h4_~AWBks-`9iBvVe^F@Mw!l>y1Z#+E6s4svxsSx zRGLvV)1KHw(`OL*nd+)(2{#4KI?uZ@uKKG$!0i{>XDZfaD%Or4ykdLX{g(T^ty2|i z*^&QezU8yfx!ZS+^hamwnqDruRCakZQ+J=q4@JDP3uR-2new&QOB^H;a%dtUG(rE- z1Y&4l4PqCA20o2Rge7h_F7Zz=sct!O7MO4@nsBeX^OFjCXSEyFkK^BLfGXw+k@%T)EAjS91T56^XMO-07paR=G`Dal`uU@FO|;J zZOqhdoCQ}P@^bW2bg~v$r+yQ#PCY4mvHip)l&`qcX_a#W#*I`Zn)7^@V@J98u1nle zW_#Do0yme47FXXX$5wSKbVdq0X?4*HMb-L8^lKou$Y<9`j9cW>FL;bNad^=~qpq88 zorX2z9ud>%CjKjiOb4NJW9INRX0cA5i5K)Lgf)Vd=3?<7vU`& z*Z34#1E`D>D}Z*Ig5QX1#0{isJ&L-$(DuPD&8|_XIzM~ZB??0d69FF3uTYe9Lrr3*dO?E) z4yyMvJYD*|3PwZRSY_NmPPOBh)J_cQc3i@c6Li}+a>L7LghaZXE}7+#0&adj-g{ue zri`M+%Gcp!ZKRc;u>E2UMXn`h9XV{%@ftQA8ghl?{>lKHtS6e%l+u+1#WEs>@lgvl zr4j?p*+x0@w>8X4bIPAlYJT&gJsYS;`*9RRHE61l8Y#q&p@#|k{9hzv7rR#|uX$UY99A#+vvJX1@1xAkELH8x->MNzVa1dzseS1zfX+#I9W}5sP-cT zM7E!{0fQ}OKV8CNpB@$iUEwy-6?cx+Zi%@Tz=mFi)k^bNO{Xi$l&3Iv6x!4I3FZR% zzC})+*7#Ej{v$X&MQM$Nk%;nbDw)R~OaNoX9?C^zNfpHelv`8oHDdx!jl4qm0EQw| zYUJ~a5;SsXQ>JcHAxfy<{5v6tc6z$2#2Ehm`-p+z!2d#M}z$NkS;4< zMN^bMIP+S%nOeFV&fO9IDu<}1XUGY{F`uErh#B^qDPT={T13eEb4))aLZDuOIzy-Q1UJ(_f{_6nWJo6mdfg+o6sBKAdvOAl(`6g04{M7Ysp@WwFEePV5rwF zLfr?gqn%~Au{dg`=4@xul6jZ3o~2?cJB_tk+Xwy+T0BQHfFb1ac7|blzyK^jv9!x_ z>W3P`d+lZN5oBKHO7cnMd`ENs7xjl9A;OO(KuX=?mE+;@x>tH~0)mskS9s(a9QO9H z=Ia6;tbPW-v<@l(gMM@Oq9F_E2lP9bZh&oJ-GJh9;!iggQfWJM8O$d59KBIiynT^nk!Af>jExIch-@_d z^**nF#soXBL@IS(8T2ODS)|_;A?g1DdJwk_wNiX9OjsjWU8Y7L-P-*u>DrKzSk z)K4CZy{*`&)M2FZ8Y%S%<=0H5DO4uc_In}?Xk*O<% zKHgvmuRyplvXZ4YAzeavxgop?;T0%LG{9>3S28^m3HxocMhTFywE}gNFyVCVN0^?G z10)43&_uBn*F*s;7c!}!PAuFdJ(PE`d*~Z@Q9TrTmwA-I=UEAb-2luhQs~+oDMq#A z^(IuM7=u>Ce5DvwdE%35p^(xE+JT#yTnXjw=%DE1ru-93qv0)grUAlrKa`UI0Uqsv)5x}3$x z{Z)JAI5E)*eoW4y%X0FGBkmE8LC#W=_GxK2rxbxbQiAw$El>Wb%UO!0vEBdm62tk$ z8(I(G`ZVYA5QC1?f(I8(SBfv_Le(iiz?E07&xM-^JTtC`^INqE`J|3ApoH}_+0k3X z`p3~I-GNK7is62?@y4;LowZmM$B_~ThQky->Weut@@=l8QK z(eWfM#zzzV$$6;oE*gpa%_w{PymC)73E5*xb@}NNw3HU5EVt$HYK!%MFJUgR$7* zz^7@J0Zc+>*#WzRzLv?v1n%pdAnS41GP!^~GH(ONfS=k(pHUJ zD*q5sh-z4Wx$a#sJ^W>1+5?o5Ag~`O13&}7IbTCob;M$c^`RB+XN{OpL5OXu@ z;LR&go0{-)qB>8)wo$RgDm_pg+WXOyliw4F9bU%Sw~YMeRl^Lukoqr31MPjkrt;9V zX7*0C9x6Sg_26Y%54xIfTlcKA6Er*}*-1MA!ieVG;_p_qp^%4LNZ!AIm!A6x$ooa9 zGc1w#=q~fmOybW|Lb!91UsFOTM)GUwQz~zS8P40v6c|fG4;V>*qg4*zA3occP6A6O z0rq)=rIUd1ShRE!STZ)I8`ry)8MZqz8SmP}Wq^VPI zp_72}7oct!k*|!CZz1a5sG)c(^4`nqR87JZs3m?MwWNyE>aQb7(`GQx>Kx8jiDLf+ za_}n>pFPoj*Od?Rl)HKZqXKXH{EoFdSBZbsBJNyi`>WRb;qS@XW6^jtopldD#R9y- zVY#@-?0YDFTSilH14Fx&Fbd&XF;h3tx4}hkl1IO;+khFxmGI+;Df|_?$T?z1d1m-s ztBJI4LVG~h>fGzzGz38LLc{1_HNzBigv+KFK}%nz!f87s>EE9sqk<@!KW($y%Vgt( z+0Kz-q2VZqV)~E@+5hD507CA^GJ?6CG!p6jo`m64vJH<E)J|;xnZ%I3c@R*?ztyjgl#wAINk<1^RTJL_AOQwGPzK|t3ZPI?iSha&?nvgZA=h=bnCQpWYO*Vu}K=2Nk&qSbS~-3y1e?z5pgCTR^RT-ZXHj z5+Nj&I4*u2?>dk#tj*2iqSqIOn{By*l9B}v`arV*=5H_)wIH)n&to9-eifnB# zTy$~yh2=BL)@PQjAHQ$XKfP?*S;s8yc;lYU<<`mmD^F*(>^VC$?fddso9XH|G}P8j z)=qRx`#Pswo&0)=$^igu!>#Xk5YTkEi=tvHWjFums)~k$ZwK9j<6$*jySQES&(xW; zni(gfnQ=1gp+7Kg0|lH6-my!&0-t@F++%51;HE&9c7>%~VG+B6G6@{mW84pvHxZNd zuEHElz&CMks_s%=eKmN5U+?`O}4kz zz-KxF=t}f-dDy7N146ynPQbpFfUhK|X|F*#KtGV?meBu1q`tKhy15M$93y=vz3{|(eq?0;Km2N&FgPB0|H_>vC ztuK+!(exdV&oo}3{qkh8-p}f;qdqw0%&5X8;#s4%+dz)8?qg(X5z?8Hs|$1~_3Ygw zovAHYU>emN<`(vEN;kvCk(u=MTe3ESqY#w~`kARbnzN*c9Hq8%a`;~%H0(1-TdDZp z5JJ2MDUh|UhuwR!OMx%%&DO7)t!bQXXwEtDfxJ1vMq*O4X%i!@OO*Eu_+vKdbXr%% zREXDqWS(}!n#X3KS4|(C+9bSW3tNuD;?-s?#l}BJ1uEEf!SbRPmw2o2=iY)mqqbhS zBJ-UT7@cYjeQd;u1#~LC@e+zum94&b90nTRB@}tb`~|i9eqT|f@-KmAdiIb zrfezuwP0IS_G`Pd+;d%kbG4@FS5{m{%~=rrn;gae=2w)E6P#|(Z<+VEsSSYreBCzj zAB!EfKX+^sU$Jbpeb=_x@v6AdGj84Nc+Ixe_J+7kd{f-)_<^|9_Cwb;Q6-I;T5Pt2 zk;(k5WilA56P#^}&>O#nhBu6voe?zl0HJblj4j{MZU2ngZ?5Sbu|{kLbA%39(Q({0 z?QXy_Xm>krsohQ1c#5cVXoNNhYHxDLIU93rD1A93Ll+!dgyj$iQpk%w>%W`~_wyv#HCbG2PNV zDjy)laQb>H+1tl;6aI}S<1Jkylb6qVUQ*@ts^=H|(^08td;szT97LpWjD!g|>7cju zp*4adKIj5GV}6Ed)0n=DQ+?kC!-(nJQF@E{GefV>WbJ|Iq)PnF5gA27p7Kn002%XJCaU0=F7 zt$o9Z;pVp~{T*@`H&{28gim;@*R+d#$cccONLhM)H(oaNO{9R7U8AZE{;X;3%lj_v z8*hE{vFWCVXP39k)-}&It-a>96G00c3`0m2njxe=oN9k!s_Dt;iv4Gu2HQrJwHF_{ z@X$=<+Dzrzyj?fjm7}n2RJ9IubaI0N88`rZZJeK4y9?+{`3XvJLkItkeBUCc2xeCPJrc+kLn&o=jvUhB zQ2v@6hK7GcKBn!VqhaMgBCZH>rK~0@m<=)GzqS*K{d1&qJ&(JIW$Tx}y!_Jgnfi^H zdV}>$j%6Fjer5yN&%7zB%{h^NBSpK}^IiAvSS`NWDejPL?>@K={;UTk0m%XfED9F4 zr~N&YTTmqfxTWw{%u0SSwF}gl^JV31-+`m^>2v9}qh*br_tZ{chFfjrI=G&Q=*bzy_@kz?8 zgMV;0>r|`Z=0q5Yq1p`2paYe^fn&0Fm37fXplNNo{HsMiNwb^`>_9+VAyn1z?Y|{c z*)mfZ$W#VqDz{`Rw@eORIX+#v=d9}kU;V-xzj5Bsq4Nd&&AkIh=aRu+_$ziv_D*J7 zA$RR=%szd?wT1-HFZx8h$%gxdpO-!A#8jp+lFIvVvZd;jR3%k;r2C(cYMzW`+PqU4 z5UM3&#(*#{w=j1MPJztIIKz=jKVUE$_Zi(=n|&G) zjfS5lY{QfK^nx)t@VW=XVBc!jxm5dd24up|%b)32EY{$SxxLwq@PTX3Ou(@%nBgVW zY83Ub(Q1@(FCvD^45R@@K8h}%+l&MpXka5sH$}dn9rDV&mLk_jF^n1!dm1Byu9)e6(nm>rt>nww`J{$R?;G@U9knHS-X0Hs((eR z-oL8Q%GEMTN{~YXRMe25LJ0t)+Q6D1-|OViNboPc5iP(3I126fjB%-um`3?G==76Q{9qtvpA1XRXv68+|R5D zkBT0=(B;iJfu7@?bL^R`W1$p}ogCI;VV&5|gNA1IomGN1gdYI{M?$bQLbhP|!I#d# z*(O6;K(ok5))~_BskBl?S(X>gg0o7JuH-4C%ag4)=3x>cJ)Oh{*-B%&YEp_Bn$4CQ zQ|P$CIIY|yBE#Vf!!snk0+9GYUxE)z-gq)H7=w|<9=3@) j#q*C}7ntYzZdbL~e!l9ufXDR>yBr8KeJs$EwdMZ-<;-J( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/message.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/__pycache__/message.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31d66a0e0c55d9e1672bf555ca3f4f917533a486 GIT binary patch literal 37596 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 Dl^*#L literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/invite.py b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/invite.py new file mode 100644 index 00000000..7c7f9f62 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/invite.py @@ -0,0 +1,598 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class InviteInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Invite resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Invite resource. + :ivar channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Invite resource belongs to. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the Invite resource is associated with. + :ivar identity: The application-defined string that uniquely identifies the resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more info. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) assigned to the resource. + :ivar created_by: The `identity` of the User that created the invite. + :ivar url: The absolute URL of the Invite resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.identity: Optional[str] = payload.get("identity") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.role_sid: Optional[str] = payload.get("role_sid") + self.created_by: Optional[str] = payload.get("created_by") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[InviteContext] = None + + @property + def _proxy(self) -> "InviteContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InviteContext for this InviteInstance + """ + if self._context is None: + self._context = InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "InviteInstance": + """ + Fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InviteInstance": + """ + Asynchronous coroutine to fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InviteContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the InviteContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to fetch the Invite resource from. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Invite resource to fetch belongs to. This value can be the Channel resource's `sid` or `unique_name`. + :param sid: The SID of the Invite resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Invites/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> InviteInstance: + """ + Fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InviteInstance: + """ + Asynchronous coroutine to fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InvitePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InviteInstance: + """ + Build an instance of InviteInstance + + :param payload: Payload response from the API + """ + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InviteList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the InviteList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the Invite resources from. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Invite resources to read belong to. This value can be the Channel resource's `sid` or `unique_name`. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Invites".format( + **self._solution + ) + + def create( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> InviteInstance: + """ + Create the InviteInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more info. + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) assigned to the new member. + + :returns: The created InviteInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> InviteInstance: + """ + Asynchronously create the InviteInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more info. + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) assigned to the new member. + + :returns: The created InviteInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InviteInstance]: + """ + Streams InviteInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(identity=identity, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InviteInstance]: + """ + Asynchronously streams InviteInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(identity=identity, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InviteInstance]: + """ + Lists InviteInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InviteInstance]: + """ + Asynchronously lists InviteInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InvitePage: + """ + Retrieve a single page of InviteInstance records from the API. + Request is executed immediately + + :param identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InviteInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InvitePage(self._version, response, self._solution) + + async def page_async( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InvitePage: + """ + Asynchronously retrieve a single page of InviteInstance records from the API. + Request is executed immediately + + :param identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InviteInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InvitePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> InvitePage: + """ + Retrieve a specific page of InviteInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InviteInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InvitePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> InvitePage: + """ + Asynchronously retrieve a specific page of InviteInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InviteInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InvitePage(self._version, response, self._solution) + + def get(self, sid: str) -> InviteContext: + """ + Constructs a InviteContext + + :param sid: The SID of the Invite resource to fetch. + """ + return InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> InviteContext: + """ + Constructs a InviteContext + + :param sid: The SID of the Invite resource to fetch. + """ + return InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/member.py b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/member.py new file mode 100644 index 00000000..f07cb218 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/member.py @@ -0,0 +1,905 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MemberInstance(InstanceResource): + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: The unique string that we created to identify the Member resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Member resource. + :ivar channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Member resource belongs to. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the Member resource is associated with. + :ivar identity: The application-defined string that uniquely identifies the resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more info. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) assigned to the member. + :ivar last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. + :ivar last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + :ivar url: The absolute URL of the Member resource. + :ivar attributes: The JSON string that stores application-specific data. If attributes have not been set, `{}` is returned. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.identity: Optional[str] = payload.get("identity") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.role_sid: Optional[str] = payload.get("role_sid") + self.last_consumed_message_index: Optional[int] = deserialize.integer( + payload.get("last_consumed_message_index") + ) + self.last_consumption_timestamp: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("last_consumption_timestamp")) + ) + self.url: Optional[str] = payload.get("url") + self.attributes: Optional[str] = payload.get("attributes") + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[MemberContext] = None + + @property + def _proxy(self) -> "MemberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MemberContext for this MemberInstance + """ + if self._context is None: + self._context = MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "MemberInstance": + """ + Fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MemberInstance": + """ + Asynchronous coroutine to fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "MemberInstance": + """ + Update the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) that the Member has read within the [Channel](https://www.twilio.com/docs/chat/channels). + :param last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated MemberInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + role_sid=role_sid, + last_consumed_message_index=last_consumed_message_index, + last_consumption_timestamp=last_consumption_timestamp, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "MemberInstance": + """ + Asynchronous coroutine to update the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) that the Member has read within the [Channel](https://www.twilio.com/docs/chat/channels). + :param last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated MemberInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + role_sid=role_sid, + last_consumed_message_index=last_consumed_message_index, + last_consumption_timestamp=last_consumption_timestamp, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MemberContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the MemberContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to update the Member resource in. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Member resource to update belongs to. This value can be the Channel resource's `sid` or `unique_name`. + :param sid: The SID of the Member resource to update. This value can be either the Member's `sid` or its `identity` value. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Members/{sid}".format( + **self._solution + ) + ) + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MemberInstance: + """ + Fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MemberInstance: + """ + Asynchronous coroutine to fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MemberInstance: + """ + Update the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) that the Member has read within the [Channel](https://www.twilio.com/docs/chat/channels). + :param last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated MemberInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MemberInstance: + """ + Asynchronous coroutine to update the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) that the Member has read within the [Channel](https://www.twilio.com/docs/chat/channels). + :param last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The updated MemberInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MemberPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MemberInstance: + """ + Build an instance of MemberInstance + + :param payload: Payload response from the API + """ + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MemberList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the MemberList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the Member resources from. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Member resources to read belong to. This value can be the Channel resource's `sid` or `unique_name`. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Members".format( + **self._solution + ) + + def create( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MemberInstance: + """ + Create the MemberInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more info. + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. This parameter should only be used when recreating a Member from a backup/separate source. + :param last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. The default value is `null`. Note that this parameter should only be used when a Member is being recreated from a backup/separate source and where a Member was previously updated. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The created MemberInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MemberInstance: + """ + Asynchronously create the MemberInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more info. + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. This parameter should only be used when recreating a Member from a backup/separate source. + :param last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. The default value is `null`. Note that this parameter should only be used when a Member is being recreated from a backup/separate source and where a Member was previously updated. + :param attributes: A valid JSON string that contains application-specific data. + + :returns: The created MemberInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MemberInstance]: + """ + Streams MemberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the Member resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(identity=identity, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MemberInstance]: + """ + Asynchronously streams MemberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the Member resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(identity=identity, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MemberInstance]: + """ + Lists MemberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the Member resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MemberInstance]: + """ + Asynchronously lists MemberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the Member resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MemberPage: + """ + Retrieve a single page of MemberInstance records from the API. + Request is executed immediately + + :param identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the Member resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MemberInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MemberPage(self._version, response, self._solution) + + async def page_async( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MemberPage: + """ + Asynchronously retrieve a single page of MemberInstance records from the API. + Request is executed immediately + + :param identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the Member resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MemberInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MemberPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MemberPage: + """ + Retrieve a specific page of MemberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MemberInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MemberPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MemberPage: + """ + Asynchronously retrieve a specific page of MemberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MemberInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MemberPage(self._version, response, self._solution) + + def get(self, sid: str) -> MemberContext: + """ + Constructs a MemberContext + + :param sid: The SID of the Member resource to update. This value can be either the Member's `sid` or its `identity` value. + """ + return MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MemberContext: + """ + Constructs a MemberContext + + :param sid: The SID of the Member resource to update. This value can be either the Member's `sid` or its `identity` value. + """ + return MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/message.py b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/message.py new file mode 100644 index 00000000..d0bf2e5a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/message.py @@ -0,0 +1,905 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MessageInstance(InstanceResource): + + class OrderType(object): + ASC = "asc" + DESC = "desc" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: The unique string that we created to identify the Message resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Message resource. + :ivar attributes: The JSON string that stores application-specific data. If attributes have not been set, `{}` is returned. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the Message resource is associated with. + :ivar to: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) that the message was sent to. + :ivar channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Message resource belongs to. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar last_updated_by: The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + :ivar was_edited: Whether the message has been edited since it was created. + :ivar _from: The [Identity](https://www.twilio.com/docs/chat/identity) of the message's author. The default value is `system`. + :ivar body: The content of the message. + :ivar index: The index of the message within the [Channel](https://www.twilio.com/docs/chat/channels). Indices may skip numbers, but will always be in order of when the message was received. + :ivar type: The Message type. Can be: `text` or `media`. + :ivar media: An object that describes the Message's media, if the message contains media. The object contains these fields: `content_type` with the MIME type of the media, `filename` with the name of the media, `sid` with the SID of the Media resource, and `size` with the media object's file size in bytes. If the Message has no media, this value is `null`. + :ivar url: The absolute URL of the Message resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.attributes: Optional[str] = payload.get("attributes") + self.service_sid: Optional[str] = payload.get("service_sid") + self.to: Optional[str] = payload.get("to") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.last_updated_by: Optional[str] = payload.get("last_updated_by") + self.was_edited: Optional[bool] = payload.get("was_edited") + self._from: Optional[str] = payload.get("from") + self.body: Optional[str] = payload.get("body") + self.index: Optional[int] = deserialize.integer(payload.get("index")) + self.type: Optional[str] = payload.get("type") + self.media: Optional[Dict[str, object]] = payload.get("media") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[MessageContext] = None + + @property + def _proxy(self) -> "MessageContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MessageContext for this MessageInstance + """ + if self._context is None: + self._context = MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "MessageInstance": + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MessageInstance": + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param body: The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param attributes: A valid JSON string that contains application-specific data. + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param last_updated_by: The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + :param from_: The [Identity](https://www.twilio.com/docs/chat/identity) of the message's author. + + :returns: The updated MessageInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + body=body, + attributes=attributes, + date_created=date_created, + date_updated=date_updated, + last_updated_by=last_updated_by, + from_=from_, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Asynchronous coroutine to update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param body: The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param attributes: A valid JSON string that contains application-specific data. + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param last_updated_by: The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + :param from_: The [Identity](https://www.twilio.com/docs/chat/identity) of the message's author. + + :returns: The updated MessageInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + body=body, + attributes=attributes, + date_created=date_created, + date_updated=date_updated, + last_updated_by=last_updated_by, + from_=from_, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessageContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the MessageContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to update the Message resource in. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Message resource to update belongs to. This value can be the Channel resource's `sid` or `unique_name`. + :param sid: The SID of the Message resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Messages/{sid}".format( + **self._solution + ) + ) + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MessageInstance: + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MessageInstance: + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param body: The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param attributes: A valid JSON string that contains application-specific data. + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param last_updated_by: The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + :param from_: The [Identity](https://www.twilio.com/docs/chat/identity) of the message's author. + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Body": body, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "LastUpdatedBy": last_updated_by, + "From": from_, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronous coroutine to update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param body: The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param attributes: A valid JSON string that contains application-specific data. + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param last_updated_by: The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + :param from_: The [Identity](https://www.twilio.com/docs/chat/identity) of the message's author. + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Body": body, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "LastUpdatedBy": last_updated_by, + "From": from_, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessagePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MessageInstance: + """ + Build an instance of MessageInstance + + :param payload: Payload response from the API + """ + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MessageList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the MessageList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the Message resources from. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Message resource to read belongs to. This value can be the Channel resource's `sid` or `unique_name`. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Messages".format( + **self._solution + ) + + def create( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + from_: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + media_sid: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Create the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param from_: The [Identity](https://www.twilio.com/docs/chat/identity) of the new message's author. The default value is `system`. + :param attributes: A valid JSON string that contains application-specific data. + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param last_updated_by: The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + :param body: The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param media_sid: The SID of the [Media](https://www.twilio.com/docs/chat/rest/media) to attach to the new Message. + + :returns: The created MessageInstance + """ + + data = values.of( + { + "From": from_, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "LastUpdatedBy": last_updated_by, + "Body": body, + "MediaSid": media_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + from_: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + media_sid: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronously create the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param from_: The [Identity](https://www.twilio.com/docs/chat/identity) of the new message's author. The default value is `system`. + :param attributes: A valid JSON string that contains application-specific data. + :param date_created: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + :param date_updated: The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + :param last_updated_by: The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + :param body: The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + :param media_sid: The SID of the [Media](https://www.twilio.com/docs/chat/rest/media) to attach to the new Message. + + :returns: The created MessageInstance + """ + + data = values.of( + { + "From": from_, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "LastUpdatedBy": last_updated_by, + "Body": body, + "MediaSid": media_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MessageInstance]: + """ + Streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(order=order, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MessageInstance]: + """ + Asynchronously streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(order=order, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + order=order, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Asynchronously lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + order=order, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + async def page_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Asynchronously retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MessagePage: + """ + Retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MessagePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MessagePage: + """ + Asynchronously retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MessagePage(self._version, response, self._solution) + + def get(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: The SID of the Message resource to update. + """ + return MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: The SID of the Message resource to update. + """ + return MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/webhook.py b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/webhook.py new file mode 100644 index 00000000..3e31df42 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/service/channel/webhook.py @@ -0,0 +1,800 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class WebhookInstance(InstanceResource): + + class Method(object): + GET = "GET" + POST = "POST" + + class Type(object): + WEBHOOK = "webhook" + TRIGGER = "trigger" + STUDIO = "studio" + + """ + :ivar sid: The unique string that we created to identify the Channel Webhook resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Channel Webhook resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the Channel Webhook resource is associated with. + :ivar channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Channel Webhook resource belongs to. + :ivar type: The type of webhook. Can be: `webhook`, `studio`, or `trigger`. + :ivar url: The absolute URL of the Channel Webhook resource. + :ivar configuration: The JSON string that describes how the channel webhook is configured. The configuration object contains the `url`, `method`, `filters`, and `retry_count` values that are configured by the create and update actions. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.type: Optional[str] = payload.get("type") + self.url: Optional[str] = payload.get("url") + self.configuration: Optional[Dict[str, object]] = payload.get("configuration") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[WebhookContext] = None + + @property + def _proxy(self) -> "WebhookContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: WebhookContext for this WebhookInstance + """ + if self._context is None: + self._context = WebhookContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "WebhookInstance": + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "WebhookInstance": + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> "WebhookInstance": + """ + Update the WebhookInstance + + :param configuration_url: The URL of the webhook to call using the `configuration.method`. + :param configuration_method: + :param configuration_filters: The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + :param configuration_triggers: A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + :param configuration_flow_sid: The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` = `studio`. + :param configuration_retry_count: The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + + :returns: The updated WebhookInstance + """ + return self._proxy.update( + configuration_url=configuration_url, + configuration_method=configuration_method, + configuration_filters=configuration_filters, + configuration_triggers=configuration_triggers, + configuration_flow_sid=configuration_flow_sid, + configuration_retry_count=configuration_retry_count, + ) + + async def update_async( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> "WebhookInstance": + """ + Asynchronous coroutine to update the WebhookInstance + + :param configuration_url: The URL of the webhook to call using the `configuration.method`. + :param configuration_method: + :param configuration_filters: The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + :param configuration_triggers: A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + :param configuration_flow_sid: The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` = `studio`. + :param configuration_retry_count: The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + + :returns: The updated WebhookInstance + """ + return await self._proxy.update_async( + configuration_url=configuration_url, + configuration_method=configuration_method, + configuration_filters=configuration_filters, + configuration_triggers=configuration_triggers, + configuration_flow_sid=configuration_flow_sid, + configuration_retry_count=configuration_retry_count, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebhookContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the WebhookContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) with the Channel that has the Webhook resource to update. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Channel Webhook resource to update belongs to. This value can be the Channel resource's `sid` or `unique_name`. + :param sid: The SID of the Channel Webhook resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Webhooks/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> WebhookInstance: + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> WebhookInstance: + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Update the WebhookInstance + + :param configuration_url: The URL of the webhook to call using the `configuration.method`. + :param configuration_method: + :param configuration_filters: The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + :param configuration_triggers: A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + :param configuration_flow_sid: The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` = `studio`. + :param configuration_retry_count: The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.RetryCount": configuration_retry_count, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Asynchronous coroutine to update the WebhookInstance + + :param configuration_url: The URL of the webhook to call using the `configuration.method`. + :param configuration_method: + :param configuration_filters: The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + :param configuration_triggers: A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + :param configuration_flow_sid: The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` = `studio`. + :param configuration_retry_count: The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.RetryCount": configuration_retry_count, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebhookPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> WebhookInstance: + """ + Build an instance of WebhookInstance + + :param payload: Payload response from the API + """ + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class WebhookList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the WebhookList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) with the Channel to read the resources from. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the Channel Webhook resources to read belong to. This value can be the Channel resource's `sid` or `unique_name`. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Webhooks".format( + **self._solution + ) + + def create( + self, + type: "WebhookInstance.Type", + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Create the WebhookInstance + + :param type: + :param configuration_url: The URL of the webhook to call using the `configuration.method`. + :param configuration_method: + :param configuration_filters: The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + :param configuration_triggers: A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + :param configuration_flow_sid: The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` is `studio`. + :param configuration_retry_count: The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + + :returns: The created WebhookInstance + """ + + data = values.of( + { + "Type": type, + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.RetryCount": configuration_retry_count, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, + type: "WebhookInstance.Type", + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Asynchronously create the WebhookInstance + + :param type: + :param configuration_url: The URL of the webhook to call using the `configuration.method`. + :param configuration_method: + :param configuration_filters: The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + :param configuration_triggers: A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + :param configuration_flow_sid: The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` is `studio`. + :param configuration_retry_count: The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + + :returns: The created WebhookInstance + """ + + data = values.of( + { + "Type": type, + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.RetryCount": configuration_retry_count, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[WebhookInstance]: + """ + Streams WebhookInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[WebhookInstance]: + """ + Asynchronously streams WebhookInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[WebhookInstance]: + """ + Lists WebhookInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[WebhookInstance]: + """ + Asynchronously lists WebhookInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> WebhookPage: + """ + Retrieve a single page of WebhookInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of WebhookInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return WebhookPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> WebhookPage: + """ + Asynchronously retrieve a single page of WebhookInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of WebhookInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return WebhookPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> WebhookPage: + """ + Retrieve a specific page of WebhookInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of WebhookInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return WebhookPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> WebhookPage: + """ + Asynchronously retrieve a specific page of WebhookInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of WebhookInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return WebhookPage(self._version, response, self._solution) + + def get(self, sid: str) -> WebhookContext: + """ + Constructs a WebhookContext + + :param sid: The SID of the Channel Webhook resource to update. + """ + return WebhookContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> WebhookContext: + """ + Constructs a WebhookContext + + :param sid: The SID of the Channel Webhook resource to update. + """ + return WebhookContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/role.py b/venv/Lib/site-packages/twilio/rest/chat/v2/service/role.py new file mode 100644 index 00000000..fef06436 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/service/role.py @@ -0,0 +1,645 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RoleInstance(InstanceResource): + + class RoleType(object): + CHANNEL = "channel" + DEPLOYMENT = "deployment" + + """ + :ivar sid: The unique string that we created to identify the Role resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Role resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the Role resource is associated with. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar type: + :ivar permissions: An array of the permissions the role has been granted. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Role resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["RoleInstance.RoleType"] = payload.get("type") + self.permissions: Optional[List[str]] = payload.get("permissions") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[RoleContext] = None + + @property + def _proxy(self) -> "RoleContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RoleContext for this RoleInstance + """ + if self._context is None: + self._context = RoleContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "RoleInstance": + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "RoleInstance": + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return await self._proxy.fetch_async() + + def update(self, permission: List[str]) -> "RoleInstance": + """ + Update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + return self._proxy.update( + permission=permission, + ) + + async def update_async(self, permission: List[str]) -> "RoleInstance": + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + return await self._proxy.update_async( + permission=permission, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RoleContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the RoleContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to update the Role resource in. + :param sid: The SID of the Role resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Roles/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> RoleInstance: + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> RoleInstance: + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update(self, permission: List[str]) -> RoleInstance: + """ + Update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async(self, permission: List[str]) -> RoleInstance: + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RolePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RoleInstance: + """ + Build an instance of RoleInstance + + :param payload: Payload response from the API + """ + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RoleList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the RoleList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the Role resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Roles".format(**self._solution) + + def create( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Create the RoleInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param type: + :param permission: A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type`. + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Asynchronously create the RoleInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param type: + :param permission: A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type`. + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RoleInstance]: + """ + Streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RoleInstance]: + """ + Asynchronously streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Asynchronously lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Asynchronously retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> RolePage: + """ + Retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RolePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> RolePage: + """ + Asynchronously retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RolePage(self._version, response, self._solution) + + def get(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: The SID of the Role resource to update. + """ + return RoleContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: The SID of the Role resource to update. + """ + return RoleContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__init__.py b/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__init__.py new file mode 100644 index 00000000..9fbde6fe --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__init__.py @@ -0,0 +1,804 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.chat.v2.service.user.user_binding import UserBindingList +from twilio.rest.chat.v2.service.user.user_channel import UserChannelList + + +class UserInstance(InstanceResource): + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: The unique string that we created to identify the User resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the User resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the User resource is associated with. + :ivar attributes: The JSON string that stores application-specific data. If attributes have not been set, `{}` is returned. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) assigned to the user. + :ivar identity: The application-defined string that uniquely identifies the resource's User within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). This value is often a username or an email address, and is case-sensitive. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more info. + :ivar is_online: Whether the User is actively connected to the Service instance and online. This value is only returned by Fetch actions that return a single resource and `null` is always returned by a Read action. This value is `null` if the Service's `reachability_enabled` is `false`, if the User has never been online for the Service instance, even if the Service's `reachability_enabled` is `true`. + :ivar is_notifiable: Whether the User has a potentially valid Push Notification registration (APN or GCM) for the Service instance. If at least one registration exists, `true`; otherwise `false`. This value is only returned by Fetch actions that return a single resource and `null` is always returned by a Read action. This value is `null` if the Service's `reachability_enabled` is `false`, and if the User has never had a notification registration, even if the Service's `reachability_enabled` is `true`. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar joined_channels_count: The number of Channels the User is a Member of. + :ivar links: The absolute URLs of the [Channel](https://www.twilio.com/docs/chat/channels) and [Binding](https://www.twilio.com/docs/chat/rest/binding-resource) resources related to the user. + :ivar url: The absolute URL of the User resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.attributes: Optional[str] = payload.get("attributes") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.role_sid: Optional[str] = payload.get("role_sid") + self.identity: Optional[str] = payload.get("identity") + self.is_online: Optional[bool] = payload.get("is_online") + self.is_notifiable: Optional[bool] = payload.get("is_notifiable") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.joined_channels_count: Optional[int] = deserialize.integer( + payload.get("joined_channels_count") + ) + self.links: Optional[Dict[str, object]] = payload.get("links") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[UserContext] = None + + @property + def _proxy(self) -> "UserContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserContext for this UserInstance + """ + if self._context is None: + self._context = UserContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UserInstance": + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserInstance": + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the User. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the resource. It is often used for display purposes. + + :returns: The updated UserInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + role_sid=role_sid, + attributes=attributes, + friendly_name=friendly_name, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Asynchronous coroutine to update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the User. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the resource. It is often used for display purposes. + + :returns: The updated UserInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + role_sid=role_sid, + attributes=attributes, + friendly_name=friendly_name, + ) + + @property + def user_bindings(self) -> UserBindingList: + """ + Access the user_bindings + """ + return self._proxy.user_bindings + + @property + def user_channels(self) -> UserChannelList: + """ + Access the user_channels + """ + return self._proxy.user_channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the UserContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to update the User resource in. + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Users/{sid}".format(**self._solution) + + self._user_bindings: Optional[UserBindingList] = None + self._user_channels: Optional[UserChannelList] = None + + def delete(self) -> bool: + """ + Deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserInstance: + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> UserInstance: + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the User. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the resource. It is often used for display purposes. + + :returns: The updated UserInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronous coroutine to update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the User. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the resource. It is often used for display purposes. + + :returns: The updated UserInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + @property + def user_bindings(self) -> UserBindingList: + """ + Access the user_bindings + """ + if self._user_bindings is None: + self._user_bindings = UserBindingList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._user_bindings + + @property + def user_channels(self) -> UserChannelList: + """ + Access the user_channels + """ + if self._user_channels is None: + self._user_channels = UserChannelList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._user_channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserInstance: + """ + Build an instance of UserInstance + + :param payload: Payload response from the API + """ + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the UserList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the User resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Users".format(**self._solution) + + def create( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Create the UserInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). This value is often a username or email address. See the Identity documentation for more info. + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the new User. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the new resource. This value is often used for display purposes. + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronously create the UserInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). This value is often a username or email address. See the Identity documentation for more info. + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the new User. + :param attributes: A valid JSON string that contains application-specific data. + :param friendly_name: A descriptive string that you create to describe the new resource. This value is often used for display purposes. + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserInstance]: + """ + Streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserInstance]: + """ + Asynchronously streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Asynchronously lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Asynchronously retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserPage: + """ + Retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserPage: + """ + Asynchronously retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserPage(self._version, response, self._solution) + + def get(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + return UserContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + return UserContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..925d0e6fafb2204e6a7ea310f1b4fd0176099620 GIT binary patch literal 31183 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 HXT$k_a;~N$ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__pycache__/user_binding.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__pycache__/user_binding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e43af1664d94ed2825e7882b2801925fc608ad3 GIT binary patch literal 24902 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__pycache__/user_channel.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/__pycache__/user_channel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cccc1e4b16cf407329129a34fd8793c7a35e22d GIT binary patch literal 28260 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 "UserBindingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserBindingContext for this UserBindingInstance + """ + if self._context is None: + self._context = UserBindingContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserBindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserBindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UserBindingInstance": + """ + Fetch the UserBindingInstance + + + :returns: The fetched UserBindingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserBindingInstance": + """ + Asynchronous coroutine to fetch the UserBindingInstance + + + :returns: The fetched UserBindingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserBindingContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, user_sid: str, sid: str): + """ + Initialize the UserBindingContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to fetch the User Binding resource from. + :param user_sid: The SID of the [User](https://www.twilio.com/docs/chat/rest/user-resource) with the User Binding resource to fetch. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param sid: The SID of the User Binding resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Users/{user_sid}/Bindings/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the UserBindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserBindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserBindingInstance: + """ + Fetch the UserBindingInstance + + + :returns: The fetched UserBindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserBindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> UserBindingInstance: + """ + Asynchronous coroutine to fetch the UserBindingInstance + + + :returns: The fetched UserBindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserBindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserBindingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserBindingInstance: + """ + Build an instance of UserBindingInstance + + :param payload: Payload response from the API + """ + return UserBindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserBindingList(ListResource): + + def __init__(self, version: Version, service_sid: str, user_sid: str): + """ + Initialize the UserBindingList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the User Binding resources from. + :param user_sid: The SID of the [User](https://www.twilio.com/docs/chat/rest/user-resource) with the User Binding resources to read. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + } + self._uri = "/Services/{service_sid}/Users/{user_sid}/Bindings".format( + **self._solution + ) + + def stream( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserBindingInstance]: + """ + Streams UserBindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["UserBindingInstance.BindingType"] binding_type: The push technology used by the User Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(binding_type=binding_type, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserBindingInstance]: + """ + Asynchronously streams UserBindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["UserBindingInstance.BindingType"] binding_type: The push technology used by the User Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + binding_type=binding_type, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserBindingInstance]: + """ + Lists UserBindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["UserBindingInstance.BindingType"] binding_type: The push technology used by the User Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + binding_type=binding_type, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserBindingInstance]: + """ + Asynchronously lists UserBindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["UserBindingInstance.BindingType"] binding_type: The push technology used by the User Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + binding_type=binding_type, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserBindingPage: + """ + Retrieve a single page of UserBindingInstance records from the API. + Request is executed immediately + + :param binding_type: The push technology used by the User Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserBindingInstance + """ + data = values.of( + { + "BindingType": serialize.map(binding_type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserBindingPage(self._version, response, self._solution) + + async def page_async( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserBindingPage: + """ + Asynchronously retrieve a single page of UserBindingInstance records from the API. + Request is executed immediately + + :param binding_type: The push technology used by the User Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserBindingInstance + """ + data = values.of( + { + "BindingType": serialize.map(binding_type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserBindingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserBindingPage: + """ + Retrieve a specific page of UserBindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserBindingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserBindingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserBindingPage: + """ + Asynchronously retrieve a specific page of UserBindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserBindingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserBindingPage(self._version, response, self._solution) + + def get(self, sid: str) -> UserBindingContext: + """ + Constructs a UserBindingContext + + :param sid: The SID of the User Binding resource to fetch. + """ + return UserBindingContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> UserBindingContext: + """ + Constructs a UserBindingContext + + :param sid: The SID of the User Binding resource to fetch. + """ + return UserBindingContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/user_channel.py b/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/user_channel.py new file mode 100644 index 00000000..9fab3573 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v2/service/user/user_channel.py @@ -0,0 +1,708 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class UserChannelInstance(InstanceResource): + + class ChannelStatus(object): + JOINED = "joined" + INVITED = "invited" + NOT_PARTICIPATING = "not_participating" + + class NotificationLevel(object): + DEFAULT = "default" + MUTED = "muted" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the User Channel resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the User Channel resource is associated with. + :ivar channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) the User Channel resource belongs to. + :ivar user_sid: The SID of the [User](https://www.twilio.com/docs/chat/rest/user-resource) the User Channel belongs to. + :ivar member_sid: The SID of a [Member](https://www.twilio.com/docs/chat/rest/member-resource) that represents the User on the Channel. + :ivar status: + :ivar last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. + :ivar unread_messages_count: The number of unread Messages in the Channel for the User. Note that retrieving messages on a client endpoint does not mean that messages are consumed or read. See [Consumption Horizon feature](https://www.twilio.com/docs/chat/consumption-horizon) to learn how to mark messages as consumed. + :ivar links: The absolute URLs of the [Members](https://www.twilio.com/docs/chat/rest/member-resource), [Messages](https://www.twilio.com/docs/chat/rest/message-resource) , [Invites](https://www.twilio.com/docs/chat/rest/invite-resource) and, if it exists, the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) for the Channel. + :ivar url: The absolute URL of the User Channel resource. + :ivar notification_level: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + user_sid: str, + channel_sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.user_sid: Optional[str] = payload.get("user_sid") + self.member_sid: Optional[str] = payload.get("member_sid") + self.status: Optional["UserChannelInstance.ChannelStatus"] = payload.get( + "status" + ) + self.last_consumed_message_index: Optional[int] = deserialize.integer( + payload.get("last_consumed_message_index") + ) + self.unread_messages_count: Optional[int] = deserialize.integer( + payload.get("unread_messages_count") + ) + self.links: Optional[Dict[str, object]] = payload.get("links") + self.url: Optional[str] = payload.get("url") + self.notification_level: Optional["UserChannelInstance.NotificationLevel"] = ( + payload.get("notification_level") + ) + + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + "channel_sid": channel_sid or self.channel_sid, + } + self._context: Optional[UserChannelContext] = None + + @property + def _proxy(self) -> "UserChannelContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserChannelContext for this UserChannelInstance + """ + if self._context is None: + self._context = UserChannelContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=self._solution["channel_sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "UserChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the UserChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "UserChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the UserChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "UserChannelInstance": + """ + Fetch the UserChannelInstance + + + :returns: The fetched UserChannelInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserChannelInstance": + """ + Asynchronous coroutine to fetch the UserChannelInstance + + + :returns: The fetched UserChannelInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + notification_level: Union[ + "UserChannelInstance.NotificationLevel", object + ] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + ) -> "UserChannelInstance": + """ + Update the UserChannelInstance + + :param notification_level: + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. + :param last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + + :returns: The updated UserChannelInstance + """ + return self._proxy.update( + notification_level=notification_level, + last_consumed_message_index=last_consumed_message_index, + last_consumption_timestamp=last_consumption_timestamp, + ) + + async def update_async( + self, + notification_level: Union[ + "UserChannelInstance.NotificationLevel", object + ] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + ) -> "UserChannelInstance": + """ + Asynchronous coroutine to update the UserChannelInstance + + :param notification_level: + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. + :param last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + + :returns: The updated UserChannelInstance + """ + return await self._proxy.update_async( + notification_level=notification_level, + last_consumed_message_index=last_consumed_message_index, + last_consumption_timestamp=last_consumption_timestamp, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserChannelContext(InstanceContext): + + def __init__( + self, version: Version, service_sid: str, user_sid: str, channel_sid: str + ): + """ + Initialize the UserChannelContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to update the User Channel resource in. + :param user_sid: The SID of the [User](https://www.twilio.com/docs/chat/rest/user-resource) to update the User Channel resource from. This value can be either the `sid` or the `identity` of the User resource. + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) with the User Channel resource to update. This value can be the Channel resource's `sid` or `unique_name`. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + "channel_sid": channel_sid, + } + self._uri = ( + "/Services/{service_sid}/Users/{user_sid}/Channels/{channel_sid}".format( + **self._solution + ) + ) + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "UserChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the UserChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "UserChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the UserChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserChannelInstance: + """ + Fetch the UserChannelInstance + + + :returns: The fetched UserChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def fetch_async(self) -> UserChannelInstance: + """ + Asynchronous coroutine to fetch the UserChannelInstance + + + :returns: The fetched UserChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def update( + self, + notification_level: Union[ + "UserChannelInstance.NotificationLevel", object + ] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + ) -> UserChannelInstance: + """ + Update the UserChannelInstance + + :param notification_level: + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. + :param last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + + :returns: The updated UserChannelInstance + """ + + data = values.of( + { + "NotificationLevel": notification_level, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def update_async( + self, + notification_level: Union[ + "UserChannelInstance.NotificationLevel", object + ] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + ) -> UserChannelInstance: + """ + Asynchronous coroutine to update the UserChannelInstance + + :param notification_level: + :param last_consumed_message_index: The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. + :param last_consumption_timestamp: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + + :returns: The updated UserChannelInstance + """ + + data = values.of( + { + "NotificationLevel": notification_level, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserChannelInstance: + """ + Build an instance of UserChannelInstance + + :param payload: Payload response from the API + """ + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserChannelList(ListResource): + + def __init__(self, version: Version, service_sid: str, user_sid: str): + """ + Initialize the UserChannelList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the User Channel resources from. + :param user_sid: The SID of the [User](https://www.twilio.com/docs/chat/rest/user-resource) to read the User Channel resources from. This value can be either the `sid` or the `identity` of the User resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + } + self._uri = "/Services/{service_sid}/Users/{user_sid}/Channels".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserChannelInstance]: + """ + Streams UserChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserChannelInstance]: + """ + Asynchronously streams UserChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserChannelInstance]: + """ + Lists UserChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserChannelInstance]: + """ + Asynchronously lists UserChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserChannelPage: + """ + Retrieve a single page of UserChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserChannelPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserChannelPage: + """ + Asynchronously retrieve a single page of UserChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserChannelPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserChannelPage: + """ + Retrieve a specific page of UserChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserChannelPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserChannelPage: + """ + Asynchronously retrieve a specific page of UserChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserChannelPage(self._version, response, self._solution) + + def get(self, channel_sid: str) -> UserChannelContext: + """ + Constructs a UserChannelContext + + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) with the User Channel resource to update. This value can be the Channel resource's `sid` or `unique_name`. + """ + return UserChannelContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=channel_sid, + ) + + def __call__(self, channel_sid: str) -> UserChannelContext: + """ + Constructs a UserChannelContext + + :param channel_sid: The SID of the [Channel](https://www.twilio.com/docs/chat/channels) with the User Channel resource to update. This value can be the Channel resource's `sid` or `unique_name`. + """ + return UserChannelContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=channel_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v3/__init__.py b/venv/Lib/site-packages/twilio/rest/chat/v3/__init__.py new file mode 100644 index 00000000..582dc440 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v3/__init__.py @@ -0,0 +1,43 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.chat.v3.channel import ChannelList + + +class V3(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V3 version of Chat + + :param domain: The Twilio.chat domain + """ + super().__init__(domain, "v3") + self._channels: Optional[ChannelList] = None + + @property + def channels(self) -> ChannelList: + if self._channels is None: + self._channels = ChannelList(self) + return self._channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/chat/v3/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v3/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a4f6f150a0204a299e17bae4e8d502ef928d62a GIT binary patch literal 1996 zcmahKO>Y}TbauVA*Ul$tNsHQ|A<%+_Vk5b5h^mMxDOE&Csx}14G8#6!<9O+McbQ$g zII^l7B9Ta~dP2#OBUOG1m-2C_R*i(j0dWhY5misTH?wvVA;fs~=6%ikp79SOBSix1 z{!d>tj|@V7L!!U3DRQ_7$PRHxjX0X4ds<7c=^El0FViw=hQtjo+sf5)63=@1mRU13 zqLb^y$!!uR&yBr|vR5l~%~HYoT_dDOVJ$b^h}wa}>0K+LYux9;in&8qyC`Oi(U(7D zAdBHaxhwE5GSxb!f_Cs2W72Dn(%#?)Y$V_V6(wN|Ig&(xE_-$0D2%ZRVyO|ut_{SGb6P z05mrrv@92~A;``5xp%{jVp~m%g6Zgx!;gUe28NN7ng#=@I~vb4^exhW!Q33K89eJ` zc&?#4#-_2CTBzlLX96#~Y19f^^UIY&CT^<(bfA`tX=cp1RA+75{a z!fm}r9>B%uX^ys+o`I1EE*n_r>ZQ#3s;mq)dck*N*YezTE{n5Lr5%+z4H~MM1J#+( z5>|_iOHA?t{6)S4AilX5lD@Qdks;541mvM zYZ!|#JxVuTd^R^z|1^Sl>K`vGEZ66GbSDnNdM9vgeid3B*E`(r)Ni<}^~jC+bZFUk ztTi6hV>xLR!K1i>!BsldN`j$t{&M-&qHha z%>OtC!=NpebTJBgA_w4+CdOck&;k{&08Gq&No7)ff}++GfDQ8N(AdM-?b*jeZ#=#5 z&iAK(zEIwpzrXlo?9{`1+xH%u7sLdpoyZAjl@rd}4(VzoeVq@wds74*7am26HiXN4 z$LmtTL#Q`2#lmYe(40~Aie~61mfduH{=X;I$FHcDqC5w!E3Z^%9})2?L~$Zx#?T>S zX&V)B3AOS7HpoGdj8Dn5N<%n(zSZI|eMQDvfz$R7A7<<;cm$M0;2(+{jKmBDyeA^= z%5sZI5G0u>7UDI;M$$R8x#uxf(!@A$WoRGDW(X4vA&@bD0Lb%Aa$w}M@9%bw2y6!v zBsY4XXR@#FzWWz}?J(1492B$JsogjKCa}rirJ==AG08LL1U5vSi@TxguL&HcU+@rkI>d1$a5+%`JDTxZ{;n3Cje|f)Nz~PS^|ciYnWzxCkVU pUi21#gN&wWf9k`Uade(&=l99m`{d$2sXoh1YExThjtFeh%0KN7{we?f literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v3/__pycache__/channel.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/chat/v3/__pycache__/channel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3211bc0e1770611bfd3eba6d84bc016138bdd572 GIT binary patch literal 12016 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/chat/v3/channel.py b/venv/Lib/site-packages/twilio/rest/chat/v3/channel.py new file mode 100644 index 00000000..4682838f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/chat/v3/channel.py @@ -0,0 +1,325 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Chat + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ChannelInstance(InstanceResource): + + class ChannelType(object): + PUBLIC = "public" + PRIVATE = "private" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: The unique string that we created to identify the Channel resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Channel resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the Channel resource is associated with. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :ivar attributes: The JSON string that stores application-specific data. If attributes have not been set, `{}` is returned. + :ivar type: + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar created_by: The `identity` of the User that created the channel. If the Channel was created by using the API, the value is `system`. + :ivar members_count: The number of Members in the Channel. + :ivar messages_count: The number of Messages that have been passed in the Channel. + :ivar messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this channel belongs to. + :ivar url: The absolute URL of the Channel resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: Optional[str] = None, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.unique_name: Optional[str] = payload.get("unique_name") + self.attributes: Optional[str] = payload.get("attributes") + self.type: Optional["ChannelInstance.ChannelType"] = payload.get("type") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.created_by: Optional[str] = payload.get("created_by") + self.members_count: Optional[int] = deserialize.integer( + payload.get("members_count") + ) + self.messages_count: Optional[int] = deserialize.integer( + payload.get("messages_count") + ) + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid or self.service_sid, + "sid": sid or self.sid, + } + self._context: Optional[ChannelContext] = None + + @property + def _proxy(self) -> "ChannelContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ChannelContext for this ChannelInstance + """ + if self._context is None: + self._context = ChannelContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + ) -> "ChannelInstance": + """ + Update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param type: + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this channel belongs to. + + :returns: The updated ChannelInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + type=type, + messaging_service_sid=messaging_service_sid, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + ) -> "ChannelInstance": + """ + Asynchronous coroutine to update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param type: + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this channel belongs to. + + :returns: The updated ChannelInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + type=type, + messaging_service_sid=messaging_service_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the ChannelContext + + :param version: Version that contains the resource + :param service_sid: The unique SID identifier of the Service. + :param sid: A 34 character string that uniquely identifies this Channel. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Channels/{sid}".format(**self._solution) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param type: + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this channel belongs to. + + :returns: The updated ChannelInstance + """ + + data = values.of( + { + "Type": type, + "MessagingServiceSid": messaging_service_sid, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Asynchronous coroutine to update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param type: + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this channel belongs to. + + :returns: The updated ChannelInstance + """ + + data = values.of( + { + "Type": type, + "MessagingServiceSid": messaging_service_sid, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ChannelList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, service_sid: str, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param service_sid: The unique SID identifier of the Service. + :param sid: A 34 character string that uniquely identifies this Channel. + """ + return ChannelContext(self._version, service_sid=service_sid, sid=sid) + + def __call__(self, service_sid: str, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param service_sid: The unique SID identifier of the Service. + :param sid: A 34 character string that uniquely identifies this Channel. + """ + return ChannelContext(self._version, service_sid=service_sid, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/content/ContentBase.py b/venv/Lib/site-packages/twilio/rest/content/ContentBase.py new file mode 100644 index 00000000..8a1ccd5d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/content/ContentBase.py @@ -0,0 +1,55 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.content.v1 import V1 +from twilio.rest.content.v2 import V2 + + +class ContentBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Content Domain + + :returns: Domain for Content + """ + super().__init__(twilio, "https://content.twilio.com") + self._v1: Optional[V1] = None + self._v2: Optional[V2] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Content + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + @property + def v2(self) -> V2: + """ + :returns: Versions v2 of Content + """ + if self._v2 is None: + self._v2 = V2(self) + return self._v2 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/content/__init__.py b/venv/Lib/site-packages/twilio/rest/content/__init__.py new file mode 100644 index 00000000..7663bd71 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/content/__init__.py @@ -0,0 +1,35 @@ +from warnings import warn + +from twilio.rest.content.ContentBase import ContentBase +from twilio.rest.content.v1.content import ContentList +from twilio.rest.content.v1.content_and_approvals import ContentAndApprovalsList +from twilio.rest.content.v1.legacy_content import LegacyContentList + + +class Content(ContentBase): + @property + def contents(self) -> ContentList: + warn( + "contents is deprecated. Use v1.contents instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.contents + + @property + def content_and_approvals(self) -> ContentAndApprovalsList: + warn( + "content_and_approvals is deprecated. Use v1.content_and_approvals instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.content_and_approvals + + @property + def legacy_contents(self) -> LegacyContentList: + warn( + "legacy_contents is deprecated. Use v1.legacy_contents instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.legacy_contents diff --git a/venv/Lib/site-packages/twilio/rest/content/__pycache__/ContentBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/content/__pycache__/ContentBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd32dd00ae7aff4f45d44e4e2111e02b05659677 GIT binary patch literal 2346 zcmd57O>Y}TbauU7ubofYC=I2cX-bQXR9o?>ib_P&pb`OXfwYH}(Xibe$4l3{W_IJo zmJc~ZB9U6P5<*X4T zX-Hi6@{NL7P>4#d5GS`u9D{3nnZ&d?(#{tP*7ph_1xi=yZbf_kQifS z#8M*(yF4(yZ2c0p3>~n57i2NWKI8Y60wCy|(hfe3~cE3PTDB zv(}>Eg=EodP3~X1zD%zq84N@Tj@F~78P1o>0SK+8dp=Ds2qSLSL18JNeh^XaxDk!& zoZ9k&hUKqWp4ToF{=kwImDsq}jNHJtJizs(pkcW_VwXLa`w?L3%{d7xc2eU6rUfVc zD$w6RJ8@zv&{C?S@JvnJA~k5O%~4b1StrBwn(Anq+FokG%t@{R-0UH49yANU(>FD9 zWQ(jT=IH07n2Sd)2Yv+3ELtIt_2`c4xq+=7@D<7g%eCygk!yKwhs!Lcu0VD%QCP!d%?lo_2|t`qCA1a@ znko;KIwuEJvy+HQNiZclXk0C7aW-6QauFMhxo|6EafY?#5LAkpSPQvV6ZpL2JY%w& zjD_enr5n%9%k$M6As1owqvhq5>JkrcM?tgN3S66Cg5HR#E$+9fAG^1zp&Rk@P0PM* zt@5y%cu*ERjLNB3<M(QQ;510WGXS1#kf)<0Kfay&$(Y%lesuc1 zUyOyvr_XL_cMZASGy0%LVm--|4HIIxFb4efKLfBsy5y^&=m6Q6j8I3eF4;@ZLm3Cm zSDb?mQaY7k2@dLX6OsjeAJWzw4QfYfRaC_|m=-#Khl-elEyPQyI0i6QTXUW9!zlqP z!0*oj*dVz>h-TmRB(t2?Bv6x9wNR^_?~S}y!gShOZ!>^NSV3f_dC zgvPaSIt?`s>i3Cd*Il3g=ZVhb#T7X+N@=+k9v%$_o*Z7t*voyMa4X<+h*^-Oot%~N z702+U`c{L(OD!JQ;d(L)9V(_2}ce@ zf#r=yQUMMX8Gk%|hy&A3j`LD$PA1|N!b*}G8S5#qns|hd@40a?$@PMG7f9^M@EriX mjG`!is(D4*pC-zw-^tl06!C>8%vx)#5ER6WijGjNr*lgE}}KDAXL6IPMjLk-llsVlGa{Lhr0&&erR+ z)-Y@qx(*dd#VEJJ0B$S?bpja{h0Yw#*MNW~n4pP7G6flmw|RqnIKT9J(6MZ>b5LW#RfowCqZo8!pKcW$Ft1Gnch1y}6Gnc}-1G6Fn>MPy^} zTT})u0P~QM=T^>^1Jqc`Vkwi|TAjHDXpayxE^xx_GYTfFca!HYB3C@iaXNfgiEi<;O->p$O@rNp2WM;T_qx3>`sVKn)$`v12G!P7c7h zyWC;Eqz}^v`(v72PiEU{mL9?I|BY$h_Mf*Np7~D~eNWUs;Fug(vN9J4Ti0x);~=YRz1>xt`GVC(DK%dQ|Libwb@1h+oLfI~+D<)Cla9uBqXb~?{} z(>>pG&zEkWI?sJ+-}em@rGt9B!d&Knr}EZ~U4jMuV^vOYB4AP5xoYZq@?ue5}TCH#_+KQZEN& ContentList: + if self._contents is None: + self._contents = ContentList(self) + return self._contents + + @property + def content_and_approvals(self) -> ContentAndApprovalsList: + if self._content_and_approvals is None: + self._content_and_approvals = ContentAndApprovalsList(self) + return self._content_and_approvals + + @property + def legacy_contents(self) -> LegacyContentList: + if self._legacy_contents is None: + self._legacy_contents = LegacyContentList(self) + return self._legacy_contents + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/content/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/content/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43407a63ab2829f36544cfc253727c3e555079b1 GIT binary patch literal 2869 zcmc&0O>Y}TbawrtFgxU>)9zux-O;ts-Y1D=sETduLog_=wyUXmx z#gSFz5D7;r>Io%Bj#Rnu6S#A6Xi=k8BO!4rr$Aa!^~9T*^)^Wh++e(V^X7fcym=qv zA3Hmf2*#bCK3jO4KDGLYIM!t5|LjQOq&Rc(YnAhQL0 zAR;&zGYVfaz_x6Zfg&)Biwp~l2y!vBiyK^7hz4?CT$p6S?6|P}lmWJ3xouZf*&gC+ z%a@blnr<1UVXJ4=i?-zv%M(O)ckp=&M0FNtO{1bt3%To;ZcM9VQxgTDJ$Y^V(nxUC zrsi@bZPBy$-M4zpAr|PUmqie4THw1Zc%I{q6pJ>nHODv`#0c0PsVs1jaa*-)PbIqH z@xxU3CRNQ^)J(HpNIqt<&r7~?&G8J|(oDb;GlaUZ05m>sS2crSsldG}hU>xdSg;(k z^fAYwc1<(gfOY5!nb#`yJ@OTiU;+l&hIT2ezk<9bs3bvd%eq7&b8-{SL5{DaOHmTj zBP2d2>(Q0yMqr_o;8X>uu|3odPE7(ezK5Cu{WQ=LE74MC6MZR_x^AGn;>$C`eq85{ zRpdQKivrG0w>t&k8)*%BA#+u3ps%4G8qCotE%F}ELlj9OofU_xquZa_;PJ{G9U9} z?xI7euV8Gzh8X)DIM8tY-ZqLgOUGI}hJH6TdHC9FHy`n%E-~k53OoS|n5PiNE^}2? zm!Fp|j+8%f;r!)~Cnl!L z=I-d~Xe-tKsPD{oNAC9(n&WpSw=z91JJ}#DU_13e;F{4<$!LCAcH%RjsmMSma+d zmU=FT=c{m0bezJ>@aVml?*Tdu+Y{rUX2s$>^PHv1GTKR^?i}|lpJ9E;(y9ddQWE2; ztuLAkPh00C={7cA_1zkEHe5Q^e+-UKH=zkt4B_>qCDan06y= z0{9|WL#=^P#v2NGLm@BM>VJpvav?9blZ?f3>!B?QbrB4Hx&3fV;UjBz&y@=z%%hZ51M7n>tNxvcBuT%^X({^j1d>i{qk(Od+eYWN U(bP7&_#~c{a?N8;5lr0HUu2`p)c^nh literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/content/v1/__pycache__/content_and_approvals.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/content/v1/__pycache__/content_and_approvals.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f54ec1d4a4d4cdece945ba529fe27a79289a264f GIT binary patch literal 14886 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 T5%9XRqu-B2 "ContentContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ContentContext for this ContentInstance + """ + if self._context is None: + self._context = ContentContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ContentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ContentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ContentInstance": + """ + Fetch the ContentInstance + + + :returns: The fetched ContentInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ContentInstance": + """ + Asynchronous coroutine to fetch the ContentInstance + + + :returns: The fetched ContentInstance + """ + return await self._proxy.fetch_async() + + @property + def approval_create(self) -> ApprovalCreateList: + """ + Access the approval_create + """ + return self._proxy.approval_create + + @property + def approval_fetch(self) -> ApprovalFetchList: + """ + Access the approval_fetch + """ + return self._proxy.approval_fetch + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ContentContext(InstanceContext): + + class AuthenticationAction(object): + """ + :ivar type: + :ivar copy_code_text: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.type: Optional["ContentInstance.AuthenticationActionType"] = ( + payload.get("type") + ) + self.copy_code_text: Optional[str] = payload.get("copy_code_text") + + def to_dict(self): + return { + "type": self.type, + "copy_code_text": self.copy_code_text, + } + + class CallToActionAction(object): + """ + :ivar type: + :ivar title: + :ivar url: + :ivar phone: + :ivar code: + :ivar id: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.type: Optional["ContentInstance.CallToActionActionType"] = payload.get( + "type" + ) + self.title: Optional[str] = payload.get("title") + self.url: Optional[str] = payload.get("url") + self.phone: Optional[str] = payload.get("phone") + self.code: Optional[str] = payload.get("code") + self.id: Optional[str] = payload.get("id") + + def to_dict(self): + return { + "type": self.type, + "title": self.title, + "url": self.url, + "phone": self.phone, + "code": self.code, + "id": self.id, + } + + class CardAction(object): + """ + :ivar type: + :ivar title: + :ivar url: + :ivar phone: + :ivar id: + :ivar code: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.type: Optional["ContentInstance.CardActionType"] = payload.get("type") + self.title: Optional[str] = payload.get("title") + self.url: Optional[str] = payload.get("url") + self.phone: Optional[str] = payload.get("phone") + self.id: Optional[str] = payload.get("id") + self.code: Optional[str] = payload.get("code") + + def to_dict(self): + return { + "type": self.type, + "title": self.title, + "url": self.url, + "phone": self.phone, + "id": self.id, + "code": self.code, + } + + class CarouselAction(object): + """ + :ivar type: + :ivar title: + :ivar url: + :ivar phone: + :ivar id: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.type: Optional["ContentInstance.CarouselActionType"] = payload.get( + "type" + ) + self.title: Optional[str] = payload.get("title") + self.url: Optional[str] = payload.get("url") + self.phone: Optional[str] = payload.get("phone") + self.id: Optional[str] = payload.get("id") + + def to_dict(self): + return { + "type": self.type, + "title": self.title, + "url": self.url, + "phone": self.phone, + "id": self.id, + } + + class CarouselCard(object): + """ + :ivar title: + :ivar body: + :ivar media: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.title: Optional[str] = payload.get("title") + self.body: Optional[str] = payload.get("body") + self.media: Optional[str] = payload.get("media") + self.actions: Optional[List[ContentList.CarouselAction]] = payload.get( + "actions" + ) + + def to_dict(self): + return { + "title": self.title, + "body": self.body, + "media": self.media, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + class CatalogItem(object): + """ + :ivar id: + :ivar section_title: + :ivar name: + :ivar media_url: + :ivar price: + :ivar description: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.section_title: Optional[str] = payload.get("section_title") + self.name: Optional[str] = payload.get("name") + self.media_url: Optional[str] = payload.get("media_url") + self.price: Optional[float] = payload.get("price") + self.description: Optional[str] = payload.get("description") + + def to_dict(self): + return { + "id": self.id, + "section_title": self.section_title, + "name": self.name, + "media_url": self.media_url, + "price": self.price, + "description": self.description, + } + + class ContentCreateRequest(object): + """ + :ivar friendly_name: User defined name of the content + :ivar variables: Key value pairs of variable name to value + :ivar language: Language code for the content + :ivar types: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.variables: Optional[dict[str, str]] = payload.get("variables") + self.language: Optional[str] = payload.get("language") + self.types: Optional[ContentList.Types] = payload.get("types") + + def to_dict(self): + return { + "friendly_name": self.friendly_name, + "variables": self.variables, + "language": self.language, + "types": self.types.to_dict() if self.types is not None else None, + } + + class FlowsPage(object): + """ + :ivar id: + :ivar next_page_id: + :ivar title: + :ivar subtitle: + :ivar layout: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.next_page_id: Optional[str] = payload.get("next_page_id") + self.title: Optional[str] = payload.get("title") + self.subtitle: Optional[str] = payload.get("subtitle") + self.layout: Optional[List[ContentList.FlowsPageComponent]] = payload.get( + "layout" + ) + + def to_dict(self): + return { + "id": self.id, + "next_page_id": self.next_page_id, + "title": self.title, + "subtitle": self.subtitle, + "layout": ( + [layout.to_dict() for layout in self.layout] + if self.layout is not None + else None + ), + } + + class FlowsPageComponent(object): + """ + :ivar label: + :ivar type: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.label: Optional[str] = payload.get("label") + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "label": self.label, + "type": self.type, + } + + class ListItem(object): + """ + :ivar id: + :ivar item: + :ivar description: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.item: Optional[str] = payload.get("item") + self.description: Optional[str] = payload.get("description") + + def to_dict(self): + return { + "id": self.id, + "item": self.item, + "description": self.description, + } + + class QuickReplyAction(object): + """ + :ivar type: + :ivar title: + :ivar id: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.type: Optional["ContentInstance.QuickReplyActionType"] = payload.get( + "type" + ) + self.title: Optional[str] = payload.get("title") + self.id: Optional[str] = payload.get("id") + + def to_dict(self): + return { + "type": self.type, + "title": self.title, + "id": self.id, + } + + class TwilioCallToAction(object): + """ + :ivar body: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.actions: Optional[List[ContentList.CallToActionAction]] = payload.get( + "actions" + ) + + def to_dict(self): + return { + "body": self.body, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + class TwilioCard(object): + """ + :ivar title: + :ivar subtitle: + :ivar media: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.title: Optional[str] = payload.get("title") + self.subtitle: Optional[str] = payload.get("subtitle") + self.media: Optional[List[str]] = payload.get("media") + self.actions: Optional[List[ContentList.CardAction]] = payload.get( + "actions" + ) + + def to_dict(self): + return { + "title": self.title, + "subtitle": self.subtitle, + "media": self.media, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + class TwilioCarousel(object): + """ + :ivar body: + :ivar cards: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.cards: Optional[List[ContentList.CarouselCard]] = payload.get("cards") + + def to_dict(self): + return { + "body": self.body, + "cards": ( + [cards.to_dict() for cards in self.cards] + if self.cards is not None + else None + ), + } + + class TwilioCatalog(object): + """ + :ivar title: + :ivar body: + :ivar subtitle: + :ivar id: + :ivar items: + :ivar dynamic_items: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.title: Optional[str] = payload.get("title") + self.body: Optional[str] = payload.get("body") + self.subtitle: Optional[str] = payload.get("subtitle") + self.id: Optional[str] = payload.get("id") + self.items: Optional[List[ContentList.CatalogItem]] = payload.get("items") + self.dynamic_items: Optional[str] = payload.get("dynamic_items") + + def to_dict(self): + return { + "title": self.title, + "body": self.body, + "subtitle": self.subtitle, + "id": self.id, + "items": ( + [items.to_dict() for items in self.items] + if self.items is not None + else None + ), + "dynamic_items": self.dynamic_items, + } + + class TwilioFlows(object): + """ + :ivar body: + :ivar button_text: + :ivar subtitle: + :ivar media_url: + :ivar pages: + :ivar type: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.button_text: Optional[str] = payload.get("button_text") + self.subtitle: Optional[str] = payload.get("subtitle") + self.media_url: Optional[str] = payload.get("media_url") + self.pages: Optional[List[ContentList.FlowsPage]] = payload.get("pages") + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "body": self.body, + "button_text": self.button_text, + "subtitle": self.subtitle, + "media_url": self.media_url, + "pages": ( + [pages.to_dict() for pages in self.pages] + if self.pages is not None + else None + ), + "type": self.type, + } + + class TwilioListPicker(object): + """ + :ivar body: + :ivar button: + :ivar items: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.button: Optional[str] = payload.get("button") + self.items: Optional[List[ContentList.ListItem]] = payload.get("items") + + def to_dict(self): + return { + "body": self.body, + "button": self.button, + "items": ( + [items.to_dict() for items in self.items] + if self.items is not None + else None + ), + } + + class TwilioLocation(object): + """ + :ivar latitude: + :ivar longitude: + :ivar label: + :ivar id: + :ivar address: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.latitude: Optional[float] = payload.get("latitude") + self.longitude: Optional[float] = payload.get("longitude") + self.label: Optional[str] = payload.get("label") + self.id: Optional[str] = payload.get("id") + self.address: Optional[str] = payload.get("address") + + def to_dict(self): + return { + "latitude": self.latitude, + "longitude": self.longitude, + "label": self.label, + "id": self.id, + "address": self.address, + } + + class TwilioMedia(object): + """ + :ivar body: + :ivar media: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.media: Optional[List[str]] = payload.get("media") + + def to_dict(self): + return { + "body": self.body, + "media": self.media, + } + + class TwilioQuickReply(object): + """ + :ivar body: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.actions: Optional[List[ContentList.QuickReplyAction]] = payload.get( + "actions" + ) + + def to_dict(self): + return { + "body": self.body, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + class TwilioSchedule(object): + """ + :ivar id: + :ivar title: + :ivar time_slots: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.title: Optional[str] = payload.get("title") + self.time_slots: Optional[str] = payload.get("time_slots") + + def to_dict(self): + return { + "id": self.id, + "title": self.title, + "time_slots": self.time_slots, + } + + class TwilioText(object): + """ + :ivar body: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + + def to_dict(self): + return { + "body": self.body, + } + + class Types(object): + """ + :ivar twilio_text: + :ivar twilio_media: + :ivar twilio_location: + :ivar twilio_list_picker: + :ivar twilio_call_to_action: + :ivar twilio_quick_reply: + :ivar twilio_card: + :ivar twilio_catalog: + :ivar twilio_carousel: + :ivar twilio_flows: + :ivar twilio_schedule: + :ivar whatsapp_card: + :ivar whatsapp_authentication: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.twilio_text: Optional[ContentList.TwilioText] = payload.get( + "twilio_text" + ) + self.twilio_media: Optional[ContentList.TwilioMedia] = payload.get( + "twilio_media" + ) + self.twilio_location: Optional[ContentList.TwilioLocation] = payload.get( + "twilio_location" + ) + self.twilio_list_picker: Optional[ContentList.TwilioListPicker] = ( + payload.get("twilio_list_picker") + ) + self.twilio_call_to_action: Optional[ContentList.TwilioCallToAction] = ( + payload.get("twilio_call_to_action") + ) + self.twilio_quick_reply: Optional[ContentList.TwilioQuickReply] = ( + payload.get("twilio_quick_reply") + ) + self.twilio_card: Optional[ContentList.TwilioCard] = payload.get( + "twilio_card" + ) + self.twilio_catalog: Optional[ContentList.TwilioCatalog] = payload.get( + "twilio_catalog" + ) + self.twilio_carousel: Optional[ContentList.TwilioCarousel] = payload.get( + "twilio_carousel" + ) + self.twilio_flows: Optional[ContentList.TwilioFlows] = payload.get( + "twilio_flows" + ) + self.twilio_schedule: Optional[ContentList.TwilioSchedule] = payload.get( + "twilio_schedule" + ) + self.whatsapp_card: Optional[ContentList.WhatsappCard] = payload.get( + "whatsapp_card" + ) + self.whatsapp_authentication: Optional[ + ContentList.WhatsappAuthentication + ] = payload.get("whatsapp_authentication") + + def to_dict(self): + return { + "twilio_text": ( + self.twilio_text.to_dict() if self.twilio_text is not None else None + ), + "twilio_media": ( + self.twilio_media.to_dict() + if self.twilio_media is not None + else None + ), + "twilio_location": ( + self.twilio_location.to_dict() + if self.twilio_location is not None + else None + ), + "twilio_list_picker": ( + self.twilio_list_picker.to_dict() + if self.twilio_list_picker is not None + else None + ), + "twilio_call_to_action": ( + self.twilio_call_to_action.to_dict() + if self.twilio_call_to_action is not None + else None + ), + "twilio_quick_reply": ( + self.twilio_quick_reply.to_dict() + if self.twilio_quick_reply is not None + else None + ), + "twilio_card": ( + self.twilio_card.to_dict() if self.twilio_card is not None else None + ), + "twilio_catalog": ( + self.twilio_catalog.to_dict() + if self.twilio_catalog is not None + else None + ), + "twilio_carousel": ( + self.twilio_carousel.to_dict() + if self.twilio_carousel is not None + else None + ), + "twilio_flows": ( + self.twilio_flows.to_dict() + if self.twilio_flows is not None + else None + ), + "twilio_schedule": ( + self.twilio_schedule.to_dict() + if self.twilio_schedule is not None + else None + ), + "whatsapp_card": ( + self.whatsapp_card.to_dict() + if self.whatsapp_card is not None + else None + ), + "whatsapp_authentication": ( + self.whatsapp_authentication.to_dict() + if self.whatsapp_authentication is not None + else None + ), + } + + class WhatsappAuthentication(object): + """ + :ivar add_security_recommendation: + :ivar code_expiration_minutes: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.add_security_recommendation: Optional[bool] = payload.get( + "add_security_recommendation" + ) + self.code_expiration_minutes: Optional[float] = payload.get( + "code_expiration_minutes" + ) + self.actions: Optional[List[ContentList.AuthenticationAction]] = ( + payload.get("actions") + ) + + def to_dict(self): + return { + "add_security_recommendation": self.add_security_recommendation, + "code_expiration_minutes": self.code_expiration_minutes, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + class WhatsappCard(object): + """ + :ivar body: + :ivar footer: + :ivar media: + :ivar header_text: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.footer: Optional[str] = payload.get("footer") + self.media: Optional[List[str]] = payload.get("media") + self.header_text: Optional[str] = payload.get("header_text") + self.actions: Optional[List[ContentList.CardAction]] = payload.get( + "actions" + ) + + def to_dict(self): + return { + "body": self.body, + "footer": self.footer, + "media": self.media, + "header_text": self.header_text, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + def __init__(self, version: Version, sid: str): + """ + Initialize the ContentContext + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the Content resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Content/{sid}".format(**self._solution) + + self._approval_create: Optional[ApprovalCreateList] = None + self._approval_fetch: Optional[ApprovalFetchList] = None + + def delete(self) -> bool: + """ + Deletes the ContentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ContentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ContentInstance: + """ + Fetch the ContentInstance + + + :returns: The fetched ContentInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ContentInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ContentInstance: + """ + Asynchronous coroutine to fetch the ContentInstance + + + :returns: The fetched ContentInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ContentInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + @property + def approval_create(self) -> ApprovalCreateList: + """ + Access the approval_create + """ + if self._approval_create is None: + self._approval_create = ApprovalCreateList( + self._version, + self._solution["sid"], + ) + return self._approval_create + + @property + def approval_fetch(self) -> ApprovalFetchList: + """ + Access the approval_fetch + """ + if self._approval_fetch is None: + self._approval_fetch = ApprovalFetchList( + self._version, + self._solution["sid"], + ) + return self._approval_fetch + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ContentPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ContentInstance: + """ + Build an instance of ContentInstance + + :param payload: Payload response from the API + """ + return ContentInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ContentList(ListResource): + + class AuthenticationAction(object): + """ + :ivar type: + :ivar copy_code_text: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.type: Optional["ContentInstance.AuthenticationActionType"] = ( + payload.get("type") + ) + self.copy_code_text: Optional[str] = payload.get("copy_code_text") + + def to_dict(self): + return { + "type": self.type, + "copy_code_text": self.copy_code_text, + } + + class CallToActionAction(object): + """ + :ivar type: + :ivar title: + :ivar url: + :ivar phone: + :ivar code: + :ivar id: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.type: Optional["ContentInstance.CallToActionActionType"] = payload.get( + "type" + ) + self.title: Optional[str] = payload.get("title") + self.url: Optional[str] = payload.get("url") + self.phone: Optional[str] = payload.get("phone") + self.code: Optional[str] = payload.get("code") + self.id: Optional[str] = payload.get("id") + + def to_dict(self): + return { + "type": self.type, + "title": self.title, + "url": self.url, + "phone": self.phone, + "code": self.code, + "id": self.id, + } + + class CardAction(object): + """ + :ivar type: + :ivar title: + :ivar url: + :ivar phone: + :ivar id: + :ivar code: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.type: Optional["ContentInstance.CardActionType"] = payload.get("type") + self.title: Optional[str] = payload.get("title") + self.url: Optional[str] = payload.get("url") + self.phone: Optional[str] = payload.get("phone") + self.id: Optional[str] = payload.get("id") + self.code: Optional[str] = payload.get("code") + + def to_dict(self): + return { + "type": self.type, + "title": self.title, + "url": self.url, + "phone": self.phone, + "id": self.id, + "code": self.code, + } + + class CarouselAction(object): + """ + :ivar type: + :ivar title: + :ivar url: + :ivar phone: + :ivar id: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.type: Optional["ContentInstance.CarouselActionType"] = payload.get( + "type" + ) + self.title: Optional[str] = payload.get("title") + self.url: Optional[str] = payload.get("url") + self.phone: Optional[str] = payload.get("phone") + self.id: Optional[str] = payload.get("id") + + def to_dict(self): + return { + "type": self.type, + "title": self.title, + "url": self.url, + "phone": self.phone, + "id": self.id, + } + + class CarouselCard(object): + """ + :ivar title: + :ivar body: + :ivar media: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.title: Optional[str] = payload.get("title") + self.body: Optional[str] = payload.get("body") + self.media: Optional[str] = payload.get("media") + self.actions: Optional[List[ContentList.CarouselAction]] = payload.get( + "actions" + ) + + def to_dict(self): + return { + "title": self.title, + "body": self.body, + "media": self.media, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + class CatalogItem(object): + """ + :ivar id: + :ivar section_title: + :ivar name: + :ivar media_url: + :ivar price: + :ivar description: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.section_title: Optional[str] = payload.get("section_title") + self.name: Optional[str] = payload.get("name") + self.media_url: Optional[str] = payload.get("media_url") + self.price: Optional[float] = payload.get("price") + self.description: Optional[str] = payload.get("description") + + def to_dict(self): + return { + "id": self.id, + "section_title": self.section_title, + "name": self.name, + "media_url": self.media_url, + "price": self.price, + "description": self.description, + } + + class ContentCreateRequest(object): + """ + :ivar friendly_name: User defined name of the content + :ivar variables: Key value pairs of variable name to value + :ivar language: Language code for the content + :ivar types: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.variables: Optional[dict[str, str]] = payload.get("variables") + self.language: Optional[str] = payload.get("language") + self.types: Optional[ContentList.Types] = payload.get("types") + + def to_dict(self): + return { + "friendly_name": self.friendly_name, + "variables": self.variables, + "language": self.language, + "types": self.types.to_dict() if self.types is not None else None, + } + + class FlowsPage(object): + """ + :ivar id: + :ivar next_page_id: + :ivar title: + :ivar subtitle: + :ivar layout: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.next_page_id: Optional[str] = payload.get("next_page_id") + self.title: Optional[str] = payload.get("title") + self.subtitle: Optional[str] = payload.get("subtitle") + self.layout: Optional[List[ContentList.FlowsPageComponent]] = payload.get( + "layout" + ) + + def to_dict(self): + return { + "id": self.id, + "next_page_id": self.next_page_id, + "title": self.title, + "subtitle": self.subtitle, + "layout": ( + [layout.to_dict() for layout in self.layout] + if self.layout is not None + else None + ), + } + + class FlowsPageComponent(object): + """ + :ivar label: + :ivar type: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.label: Optional[str] = payload.get("label") + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "label": self.label, + "type": self.type, + } + + class ListItem(object): + """ + :ivar id: + :ivar item: + :ivar description: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.item: Optional[str] = payload.get("item") + self.description: Optional[str] = payload.get("description") + + def to_dict(self): + return { + "id": self.id, + "item": self.item, + "description": self.description, + } + + class QuickReplyAction(object): + """ + :ivar type: + :ivar title: + :ivar id: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.type: Optional["ContentInstance.QuickReplyActionType"] = payload.get( + "type" + ) + self.title: Optional[str] = payload.get("title") + self.id: Optional[str] = payload.get("id") + + def to_dict(self): + return { + "type": self.type, + "title": self.title, + "id": self.id, + } + + class TwilioCallToAction(object): + """ + :ivar body: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.actions: Optional[List[ContentList.CallToActionAction]] = payload.get( + "actions" + ) + + def to_dict(self): + return { + "body": self.body, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + class TwilioCard(object): + """ + :ivar title: + :ivar subtitle: + :ivar media: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.title: Optional[str] = payload.get("title") + self.subtitle: Optional[str] = payload.get("subtitle") + self.media: Optional[List[str]] = payload.get("media") + self.actions: Optional[List[ContentList.CardAction]] = payload.get( + "actions" + ) + + def to_dict(self): + return { + "title": self.title, + "subtitle": self.subtitle, + "media": self.media, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + class TwilioCarousel(object): + """ + :ivar body: + :ivar cards: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.cards: Optional[List[ContentList.CarouselCard]] = payload.get("cards") + + def to_dict(self): + return { + "body": self.body, + "cards": ( + [cards.to_dict() for cards in self.cards] + if self.cards is not None + else None + ), + } + + class TwilioCatalog(object): + """ + :ivar title: + :ivar body: + :ivar subtitle: + :ivar id: + :ivar items: + :ivar dynamic_items: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.title: Optional[str] = payload.get("title") + self.body: Optional[str] = payload.get("body") + self.subtitle: Optional[str] = payload.get("subtitle") + self.id: Optional[str] = payload.get("id") + self.items: Optional[List[ContentList.CatalogItem]] = payload.get("items") + self.dynamic_items: Optional[str] = payload.get("dynamic_items") + + def to_dict(self): + return { + "title": self.title, + "body": self.body, + "subtitle": self.subtitle, + "id": self.id, + "items": ( + [items.to_dict() for items in self.items] + if self.items is not None + else None + ), + "dynamic_items": self.dynamic_items, + } + + class TwilioFlows(object): + """ + :ivar body: + :ivar button_text: + :ivar subtitle: + :ivar media_url: + :ivar pages: + :ivar type: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.button_text: Optional[str] = payload.get("button_text") + self.subtitle: Optional[str] = payload.get("subtitle") + self.media_url: Optional[str] = payload.get("media_url") + self.pages: Optional[List[ContentList.FlowsPage]] = payload.get("pages") + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "body": self.body, + "button_text": self.button_text, + "subtitle": self.subtitle, + "media_url": self.media_url, + "pages": ( + [pages.to_dict() for pages in self.pages] + if self.pages is not None + else None + ), + "type": self.type, + } + + class TwilioListPicker(object): + """ + :ivar body: + :ivar button: + :ivar items: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.button: Optional[str] = payload.get("button") + self.items: Optional[List[ContentList.ListItem]] = payload.get("items") + + def to_dict(self): + return { + "body": self.body, + "button": self.button, + "items": ( + [items.to_dict() for items in self.items] + if self.items is not None + else None + ), + } + + class TwilioLocation(object): + """ + :ivar latitude: + :ivar longitude: + :ivar label: + :ivar id: + :ivar address: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.latitude: Optional[float] = payload.get("latitude") + self.longitude: Optional[float] = payload.get("longitude") + self.label: Optional[str] = payload.get("label") + self.id: Optional[str] = payload.get("id") + self.address: Optional[str] = payload.get("address") + + def to_dict(self): + return { + "latitude": self.latitude, + "longitude": self.longitude, + "label": self.label, + "id": self.id, + "address": self.address, + } + + class TwilioMedia(object): + """ + :ivar body: + :ivar media: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.media: Optional[List[str]] = payload.get("media") + + def to_dict(self): + return { + "body": self.body, + "media": self.media, + } + + class TwilioQuickReply(object): + """ + :ivar body: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.actions: Optional[List[ContentList.QuickReplyAction]] = payload.get( + "actions" + ) + + def to_dict(self): + return { + "body": self.body, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + class TwilioSchedule(object): + """ + :ivar id: + :ivar title: + :ivar time_slots: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.title: Optional[str] = payload.get("title") + self.time_slots: Optional[str] = payload.get("time_slots") + + def to_dict(self): + return { + "id": self.id, + "title": self.title, + "time_slots": self.time_slots, + } + + class TwilioText(object): + """ + :ivar body: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + + def to_dict(self): + return { + "body": self.body, + } + + class Types(object): + """ + :ivar twilio_text: + :ivar twilio_media: + :ivar twilio_location: + :ivar twilio_list_picker: + :ivar twilio_call_to_action: + :ivar twilio_quick_reply: + :ivar twilio_card: + :ivar twilio_catalog: + :ivar twilio_carousel: + :ivar twilio_flows: + :ivar twilio_schedule: + :ivar whatsapp_card: + :ivar whatsapp_authentication: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.twilio_text: Optional[ContentList.TwilioText] = payload.get( + "twilio_text" + ) + self.twilio_media: Optional[ContentList.TwilioMedia] = payload.get( + "twilio_media" + ) + self.twilio_location: Optional[ContentList.TwilioLocation] = payload.get( + "twilio_location" + ) + self.twilio_list_picker: Optional[ContentList.TwilioListPicker] = ( + payload.get("twilio_list_picker") + ) + self.twilio_call_to_action: Optional[ContentList.TwilioCallToAction] = ( + payload.get("twilio_call_to_action") + ) + self.twilio_quick_reply: Optional[ContentList.TwilioQuickReply] = ( + payload.get("twilio_quick_reply") + ) + self.twilio_card: Optional[ContentList.TwilioCard] = payload.get( + "twilio_card" + ) + self.twilio_catalog: Optional[ContentList.TwilioCatalog] = payload.get( + "twilio_catalog" + ) + self.twilio_carousel: Optional[ContentList.TwilioCarousel] = payload.get( + "twilio_carousel" + ) + self.twilio_flows: Optional[ContentList.TwilioFlows] = payload.get( + "twilio_flows" + ) + self.twilio_schedule: Optional[ContentList.TwilioSchedule] = payload.get( + "twilio_schedule" + ) + self.whatsapp_card: Optional[ContentList.WhatsappCard] = payload.get( + "whatsapp_card" + ) + self.whatsapp_authentication: Optional[ + ContentList.WhatsappAuthentication + ] = payload.get("whatsapp_authentication") + + def to_dict(self): + return { + "twilio_text": ( + self.twilio_text.to_dict() if self.twilio_text is not None else None + ), + "twilio_media": ( + self.twilio_media.to_dict() + if self.twilio_media is not None + else None + ), + "twilio_location": ( + self.twilio_location.to_dict() + if self.twilio_location is not None + else None + ), + "twilio_list_picker": ( + self.twilio_list_picker.to_dict() + if self.twilio_list_picker is not None + else None + ), + "twilio_call_to_action": ( + self.twilio_call_to_action.to_dict() + if self.twilio_call_to_action is not None + else None + ), + "twilio_quick_reply": ( + self.twilio_quick_reply.to_dict() + if self.twilio_quick_reply is not None + else None + ), + "twilio_card": ( + self.twilio_card.to_dict() if self.twilio_card is not None else None + ), + "twilio_catalog": ( + self.twilio_catalog.to_dict() + if self.twilio_catalog is not None + else None + ), + "twilio_carousel": ( + self.twilio_carousel.to_dict() + if self.twilio_carousel is not None + else None + ), + "twilio_flows": ( + self.twilio_flows.to_dict() + if self.twilio_flows is not None + else None + ), + "twilio_schedule": ( + self.twilio_schedule.to_dict() + if self.twilio_schedule is not None + else None + ), + "whatsapp_card": ( + self.whatsapp_card.to_dict() + if self.whatsapp_card is not None + else None + ), + "whatsapp_authentication": ( + self.whatsapp_authentication.to_dict() + if self.whatsapp_authentication is not None + else None + ), + } + + class WhatsappAuthentication(object): + """ + :ivar add_security_recommendation: + :ivar code_expiration_minutes: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.add_security_recommendation: Optional[bool] = payload.get( + "add_security_recommendation" + ) + self.code_expiration_minutes: Optional[float] = payload.get( + "code_expiration_minutes" + ) + self.actions: Optional[List[ContentList.AuthenticationAction]] = ( + payload.get("actions") + ) + + def to_dict(self): + return { + "add_security_recommendation": self.add_security_recommendation, + "code_expiration_minutes": self.code_expiration_minutes, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + class WhatsappCard(object): + """ + :ivar body: + :ivar footer: + :ivar media: + :ivar header_text: + :ivar actions: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.body: Optional[str] = payload.get("body") + self.footer: Optional[str] = payload.get("footer") + self.media: Optional[List[str]] = payload.get("media") + self.header_text: Optional[str] = payload.get("header_text") + self.actions: Optional[List[ContentList.CardAction]] = payload.get( + "actions" + ) + + def to_dict(self): + return { + "body": self.body, + "footer": self.footer, + "media": self.media, + "header_text": self.header_text, + "actions": ( + [actions.to_dict() for actions in self.actions] + if self.actions is not None + else None + ), + } + + def __init__(self, version: Version): + """ + Initialize the ContentList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Content" + + def create(self, content_create_request: ContentCreateRequest) -> ContentInstance: + """ + Create the ContentInstance + + :param content_create_request: + + :returns: The created ContentInstance + """ + data = content_create_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ContentInstance(self._version, payload) + + async def create_async( + self, content_create_request: ContentCreateRequest + ) -> ContentInstance: + """ + Asynchronously create the ContentInstance + + :param content_create_request: + + :returns: The created ContentInstance + """ + data = content_create_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ContentInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ContentInstance]: + """ + Streams ContentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ContentInstance]: + """ + Asynchronously streams ContentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ContentInstance]: + """ + Lists ContentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ContentInstance]: + """ + Asynchronously lists ContentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ContentPage: + """ + Retrieve a single page of ContentInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ContentInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ContentPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ContentPage: + """ + Asynchronously retrieve a single page of ContentInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ContentInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ContentPage(self._version, response) + + def get_page(self, target_url: str) -> ContentPage: + """ + Retrieve a specific page of ContentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ContentInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ContentPage(self._version, response) + + async def get_page_async(self, target_url: str) -> ContentPage: + """ + Asynchronously retrieve a specific page of ContentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ContentInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ContentPage(self._version, response) + + def get(self, sid: str) -> ContentContext: + """ + Constructs a ContentContext + + :param sid: The Twilio-provided string that uniquely identifies the Content resource to fetch. + """ + return ContentContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ContentContext: + """ + Constructs a ContentContext + + :param sid: The Twilio-provided string that uniquely identifies the Content resource to fetch. + """ + return ContentContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/content/v1/content/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/content/v1/content/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3365a1af247698c7e06bab273e1c584bd078743e GIT binary patch literal 92411 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%0AIzG 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/content/v1/content/__pycache__/approval_fetch.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/content/v1/content/__pycache__/approval_fetch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9dc56124b11de6aad556d511dea447a1fc25630e GIT binary patch literal 8554 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/content/v1/content/approval_create.py b/venv/Lib/site-packages/twilio/rest/content/v1/content/approval_create.py new file mode 100644 index 00000000..9f34064e --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/content/v1/content/approval_create.py @@ -0,0 +1,172 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Content + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ApprovalCreateInstance(InstanceResource): + + class ContentApprovalRequest(object): + """ + :ivar name: Name of the template. + :ivar category: A WhatsApp recognized template category. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.name: Optional[str] = payload.get("name") + self.category: Optional[str] = payload.get("category") + + def to_dict(self): + return { + "name": self.name, + "category": self.category, + } + + """ + :ivar name: + :ivar category: + :ivar content_type: + :ivar status: + :ivar rejection_reason: + :ivar allow_category_change: + """ + + def __init__(self, version: Version, payload: Dict[str, Any], content_sid: str): + super().__init__(version) + + self.name: Optional[str] = payload.get("name") + self.category: Optional[str] = payload.get("category") + self.content_type: Optional[str] = payload.get("content_type") + self.status: Optional[str] = payload.get("status") + self.rejection_reason: Optional[str] = payload.get("rejection_reason") + self.allow_category_change: Optional[bool] = payload.get( + "allow_category_change" + ) + + self._solution = { + "content_sid": content_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ApprovalCreateList(ListResource): + + class ContentApprovalRequest(object): + """ + :ivar name: Name of the template. + :ivar category: A WhatsApp recognized template category. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.name: Optional[str] = payload.get("name") + self.category: Optional[str] = payload.get("category") + + def to_dict(self): + return { + "name": self.name, + "category": self.category, + } + + def __init__(self, version: Version, content_sid: str): + """ + Initialize the ApprovalCreateList + + :param version: Version that contains the resource + :param content_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "content_sid": content_sid, + } + self._uri = "/Content/{content_sid}/ApprovalRequests/whatsapp".format( + **self._solution + ) + + def create( + self, content_approval_request: ContentApprovalRequest + ) -> ApprovalCreateInstance: + """ + Create the ApprovalCreateInstance + + :param content_approval_request: + + :returns: The created ApprovalCreateInstance + """ + data = content_approval_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ApprovalCreateInstance( + self._version, payload, content_sid=self._solution["content_sid"] + ) + + async def create_async( + self, content_approval_request: ContentApprovalRequest + ) -> ApprovalCreateInstance: + """ + Asynchronously create the ApprovalCreateInstance + + :param content_approval_request: + + :returns: The created ApprovalCreateInstance + """ + data = content_approval_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ApprovalCreateInstance( + self._version, payload, content_sid=self._solution["content_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/content/v1/content/approval_fetch.py b/venv/Lib/site-packages/twilio/rest/content/v1/content/approval_fetch.py new file mode 100644 index 00000000..d3d00e50 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/content/v1/content/approval_fetch.py @@ -0,0 +1,193 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Content + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ApprovalFetchInstance(InstanceResource): + """ + :ivar sid: The unique string that that we created to identify the Content resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/usage/api/account) that created Content resource. + :ivar whatsapp: Contains the whatsapp approval information for the Content resource, with fields such as approval status, rejection reason, and category, amongst others. + :ivar url: The URL of the resource, relative to `https://content.twilio.com`. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], sid: str): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.whatsapp: Optional[Dict[str, object]] = payload.get("whatsapp") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid, + } + self._context: Optional[ApprovalFetchContext] = None + + @property + def _proxy(self) -> "ApprovalFetchContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ApprovalFetchContext for this ApprovalFetchInstance + """ + if self._context is None: + self._context = ApprovalFetchContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "ApprovalFetchInstance": + """ + Fetch the ApprovalFetchInstance + + + :returns: The fetched ApprovalFetchInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ApprovalFetchInstance": + """ + Asynchronous coroutine to fetch the ApprovalFetchInstance + + + :returns: The fetched ApprovalFetchInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ApprovalFetchContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ApprovalFetchContext + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the Content resource whose approval information to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Content/{sid}/ApprovalRequests".format(**self._solution) + + def fetch(self) -> ApprovalFetchInstance: + """ + Fetch the ApprovalFetchInstance + + + :returns: The fetched ApprovalFetchInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ApprovalFetchInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ApprovalFetchInstance: + """ + Asynchronous coroutine to fetch the ApprovalFetchInstance + + + :returns: The fetched ApprovalFetchInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ApprovalFetchInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ApprovalFetchList(ListResource): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ApprovalFetchList + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the Content resource whose approval information to fetch. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + + def get(self) -> ApprovalFetchContext: + """ + Constructs a ApprovalFetchContext + + """ + return ApprovalFetchContext(self._version, sid=self._solution["sid"]) + + def __call__(self) -> ApprovalFetchContext: + """ + Constructs a ApprovalFetchContext + + """ + return ApprovalFetchContext(self._version, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/content/v1/content_and_approvals.py b/venv/Lib/site-packages/twilio/rest/content/v1/content_and_approvals.py new file mode 100644 index 00000000..c2a21066 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/content/v1/content_and_approvals.py @@ -0,0 +1,298 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Content + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ContentAndApprovalsInstance(InstanceResource): + """ + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar sid: The unique string that that we created to identify the Content resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/usage/api/account) that created Content resource. + :ivar friendly_name: A string name used to describe the Content resource. Not visible to the end recipient. + :ivar language: Two-letter (ISO 639-1) language code (e.g., en) identifying the language the Content resource is in. + :ivar variables: Defines the default placeholder values for variables included in the Content resource. e.g. {\"1\": \"Customer_Name\"}. + :ivar types: The [Content types](https://www.twilio.com/docs/content-api/content-types-overview) (e.g. twilio/text) for this Content resource. + :ivar approval_requests: The submitted information and approval request status of the Content resource. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.language: Optional[str] = payload.get("language") + self.variables: Optional[Dict[str, object]] = payload.get("variables") + self.types: Optional[Dict[str, object]] = payload.get("types") + self.approval_requests: Optional[Dict[str, object]] = payload.get( + "approval_requests" + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ContentAndApprovalsPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ContentAndApprovalsInstance: + """ + Build an instance of ContentAndApprovalsInstance + + :param payload: Payload response from the API + """ + return ContentAndApprovalsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ContentAndApprovalsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ContentAndApprovalsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/ContentAndApprovals" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ContentAndApprovalsInstance]: + """ + Streams ContentAndApprovalsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ContentAndApprovalsInstance]: + """ + Asynchronously streams ContentAndApprovalsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ContentAndApprovalsInstance]: + """ + Lists ContentAndApprovalsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ContentAndApprovalsInstance]: + """ + Asynchronously lists ContentAndApprovalsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ContentAndApprovalsPage: + """ + Retrieve a single page of ContentAndApprovalsInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ContentAndApprovalsInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ContentAndApprovalsPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ContentAndApprovalsPage: + """ + Asynchronously retrieve a single page of ContentAndApprovalsInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ContentAndApprovalsInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ContentAndApprovalsPage(self._version, response) + + def get_page(self, target_url: str) -> ContentAndApprovalsPage: + """ + Retrieve a specific page of ContentAndApprovalsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ContentAndApprovalsInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ContentAndApprovalsPage(self._version, response) + + async def get_page_async(self, target_url: str) -> ContentAndApprovalsPage: + """ + Asynchronously retrieve a specific page of ContentAndApprovalsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ContentAndApprovalsInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ContentAndApprovalsPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/content/v1/legacy_content.py b/venv/Lib/site-packages/twilio/rest/content/v1/legacy_content.py new file mode 100644 index 00000000..d32778e7 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/content/v1/legacy_content.py @@ -0,0 +1,300 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Content + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class LegacyContentInstance(InstanceResource): + """ + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar sid: The unique string that that we created to identify the Content resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/usage/api/account) that created Content resource. + :ivar friendly_name: A string name used to describe the Content resource. Not visible to the end recipient. + :ivar language: Two-letter (ISO 639-1) language code (e.g., en) identifying the language the Content resource is in. + :ivar variables: Defines the default placeholder values for variables included in the Content resource. e.g. {\"1\": \"Customer_Name\"}. + :ivar types: The [Content types](https://www.twilio.com/docs/content-api/content-types-overview) (e.g. twilio/text) for this Content resource. + :ivar legacy_template_name: The string name of the legacy content template associated with this Content resource, unique across all template names for its account. Only lowercase letters, numbers and underscores are allowed + :ivar legacy_body: The string body field of the legacy content template associated with this Content resource + :ivar url: The URL of the resource, relative to `https://content.twilio.com`. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.language: Optional[str] = payload.get("language") + self.variables: Optional[Dict[str, object]] = payload.get("variables") + self.types: Optional[Dict[str, object]] = payload.get("types") + self.legacy_template_name: Optional[str] = payload.get("legacy_template_name") + self.legacy_body: Optional[str] = payload.get("legacy_body") + self.url: Optional[str] = payload.get("url") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class LegacyContentPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> LegacyContentInstance: + """ + Build an instance of LegacyContentInstance + + :param payload: Payload response from the API + """ + return LegacyContentInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class LegacyContentList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the LegacyContentList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/LegacyContent" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[LegacyContentInstance]: + """ + Streams LegacyContentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[LegacyContentInstance]: + """ + Asynchronously streams LegacyContentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[LegacyContentInstance]: + """ + Lists LegacyContentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[LegacyContentInstance]: + """ + Asynchronously lists LegacyContentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> LegacyContentPage: + """ + Retrieve a single page of LegacyContentInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of LegacyContentInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return LegacyContentPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> LegacyContentPage: + """ + Asynchronously retrieve a single page of LegacyContentInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of LegacyContentInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return LegacyContentPage(self._version, response) + + def get_page(self, target_url: str) -> LegacyContentPage: + """ + Retrieve a specific page of LegacyContentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of LegacyContentInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return LegacyContentPage(self._version, response) + + async def get_page_async(self, target_url: str) -> LegacyContentPage: + """ + Asynchronously retrieve a specific page of LegacyContentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of LegacyContentInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return LegacyContentPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/content/v2/__init__.py b/venv/Lib/site-packages/twilio/rest/content/v2/__init__.py new file mode 100644 index 00000000..ca6d8bcd --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/content/v2/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Content + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.content.v2.content import ContentList +from twilio.rest.content.v2.content_and_approvals import ContentAndApprovalsList + + +class V2(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V2 version of Content + + :param domain: The Twilio.content domain + """ + super().__init__(domain, "v2") + self._contents: Optional[ContentList] = None + self._content_and_approvals: Optional[ContentAndApprovalsList] = None + + @property + def contents(self) -> ContentList: + if self._contents is None: + self._contents = ContentList(self) + return self._contents + + @property + def content_and_approvals(self) -> ContentAndApprovalsList: + if self._content_and_approvals is None: + self._content_and_approvals = ContentAndApprovalsList(self) + return self._content_and_approvals + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/content/v2/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/content/v2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94ef771c692fae52afb0b1ec590beda57798f33e GIT binary patch literal 2458 zcmcgt&2JM&6rWwM?Tzgul%zmaf~KV*I4O1&RXs!~YDy4_S^|PJhn1`8#ycTf*1Ox; zjj1CG|4NW5{FpC(Hz~=8oH%x$Y;Dv!>|m=8(y}NvvQKp zdijQFnUc?WJ&l4@(1=bh5GTJz9FrT{88x?6Z1t22_HP;?1q#pHk{i)_;Bb1wj_5V+ zb79Bap$jcEGsftP7Zs>t7$`?YUJ+BT11>lZhA}2rZByFrzMw_{K5$VM#!w?gB)DX| z1{%dNRz)tIM5(LYd0ATqE7#NyCRbCUGj12e&ye7Pwa&bh;u`Af_}2=mOgCK54d@wq zF7RXS$4ZH{gD+miL}(79mybjISyW`H@y^c zA7bbQ)r3G)Y5-ED*^IDa{ zuh{#tmYA2q*bRK!13o{`MFaw{x#^%`yT}#O^geN;7{sHgIORK2VJL#8?L}y+D=aCR z0*ma|K>iwF%Za4{bahALnMHk_ECPhrN|wR1PKM_eb;npUw$mA`ywsYY%^uM9fM)@8 zxi!Nou9L4ct8|r=^NBt`p5z?4+q!;W69(|OkNuB;+|f2k+%<0KZSoBqthVN8+i46O z6VS5m3{vXkL0Wn_v!V)%P?_=F*tI=(h0EH`kJF~A91Rw`aFA_4?}^YBc7v)tV$XSs ziAr4|CpC2g61_P-TQ-txv>bAgn2fowAY(}nOCzG>NQY&%?=ZX5igG3~BJM2;yivfP z$-XldVJeiaKDW+I)IN=1x3!OFX69mS`Q zM_)}DVpSXQWNwm{R@PT|7xS0lDska2$EJ(I<-X&!sNf->4IpXb4b}CWP!NeG=taA} z}q91TJ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/content/v2/__pycache__/content.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/content/v2/__pycache__/content.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b36d6cf5c666c9502b3ef9e14de4bbaef0a1f9a GIT binary patch literal 24656 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 YJFahgz`)Og9aB~aw0_FqFRAnY0P;0ajsO4v literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/content/v2/__pycache__/content_and_approvals.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/content/v2/__pycache__/content_and_approvals.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0032f7aa5fb41a1ed1a5266f4c42c512a543f86c GIT binary patch literal 25074 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/content/v2/content.py b/venv/Lib/site-packages/twilio/rest/content/v2/content.py new file mode 100644 index 00000000..c2e2db7d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/content/v2/content.py @@ -0,0 +1,464 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Content + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ContentInstance(InstanceResource): + """ + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar sid: The unique string that that we created to identify the Content resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/usage/api/account) that created Content resource. + :ivar friendly_name: A string name used to describe the Content resource. Not visible to the end recipient. + :ivar language: Two-letter (ISO 639-1) language code (e.g., en) identifying the language the Content resource is in. + :ivar variables: Defines the default placeholder values for variables included in the Content resource. e.g. {\"1\": \"Customer_Name\"}. + :ivar types: The [Content types](https://www.twilio.com/docs/content/content-types-overview) (e.g. twilio/text) for this Content resource. + :ivar url: The URL of the resource, relative to `https://content.twilio.com`. + :ivar links: A list of links related to the Content resource, such as approval_fetch and approval_create + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.language: Optional[str] = payload.get("language") + self.variables: Optional[Dict[str, object]] = payload.get("variables") + self.types: Optional[Dict[str, object]] = payload.get("types") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ContentPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ContentInstance: + """ + Build an instance of ContentInstance + + :param payload: Payload response from the API + """ + return ContentInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ContentList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ContentList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Content" + + def stream( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ContentInstance]: + """ + Streams ContentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str sort_by_date: Whether to sort by ascending or descending date updated + :param str sort_by_content_name: Whether to sort by ascending or descending content name + :param datetime date_created_after: Filter by >=[date-time] + :param datetime date_created_before: Filter by <=[date-time] + :param str content_name: Filter by Regex Pattern in content name + :param str content: Filter by Regex Pattern in template content + :param List[str] language: Filter by array of valid language(s) + :param List[str] content_type: Filter by array of contentType(s) + :param List[str] channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + sort_by_date=sort_by_date, + sort_by_content_name=sort_by_content_name, + date_created_after=date_created_after, + date_created_before=date_created_before, + content_name=content_name, + content=content, + language=language, + content_type=content_type, + channel_eligibility=channel_eligibility, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ContentInstance]: + """ + Asynchronously streams ContentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str sort_by_date: Whether to sort by ascending or descending date updated + :param str sort_by_content_name: Whether to sort by ascending or descending content name + :param datetime date_created_after: Filter by >=[date-time] + :param datetime date_created_before: Filter by <=[date-time] + :param str content_name: Filter by Regex Pattern in content name + :param str content: Filter by Regex Pattern in template content + :param List[str] language: Filter by array of valid language(s) + :param List[str] content_type: Filter by array of contentType(s) + :param List[str] channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + sort_by_date=sort_by_date, + sort_by_content_name=sort_by_content_name, + date_created_after=date_created_after, + date_created_before=date_created_before, + content_name=content_name, + content=content, + language=language, + content_type=content_type, + channel_eligibility=channel_eligibility, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ContentInstance]: + """ + Lists ContentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str sort_by_date: Whether to sort by ascending or descending date updated + :param str sort_by_content_name: Whether to sort by ascending or descending content name + :param datetime date_created_after: Filter by >=[date-time] + :param datetime date_created_before: Filter by <=[date-time] + :param str content_name: Filter by Regex Pattern in content name + :param str content: Filter by Regex Pattern in template content + :param List[str] language: Filter by array of valid language(s) + :param List[str] content_type: Filter by array of contentType(s) + :param List[str] channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + sort_by_date=sort_by_date, + sort_by_content_name=sort_by_content_name, + date_created_after=date_created_after, + date_created_before=date_created_before, + content_name=content_name, + content=content, + language=language, + content_type=content_type, + channel_eligibility=channel_eligibility, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ContentInstance]: + """ + Asynchronously lists ContentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str sort_by_date: Whether to sort by ascending or descending date updated + :param str sort_by_content_name: Whether to sort by ascending or descending content name + :param datetime date_created_after: Filter by >=[date-time] + :param datetime date_created_before: Filter by <=[date-time] + :param str content_name: Filter by Regex Pattern in content name + :param str content: Filter by Regex Pattern in template content + :param List[str] language: Filter by array of valid language(s) + :param List[str] content_type: Filter by array of contentType(s) + :param List[str] channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + sort_by_date=sort_by_date, + sort_by_content_name=sort_by_content_name, + date_created_after=date_created_after, + date_created_before=date_created_before, + content_name=content_name, + content=content, + language=language, + content_type=content_type, + channel_eligibility=channel_eligibility, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ContentPage: + """ + Retrieve a single page of ContentInstance records from the API. + Request is executed immediately + + :param sort_by_date: Whether to sort by ascending or descending date updated + :param sort_by_content_name: Whether to sort by ascending or descending content name + :param date_created_after: Filter by >=[date-time] + :param date_created_before: Filter by <=[date-time] + :param content_name: Filter by Regex Pattern in content name + :param content: Filter by Regex Pattern in template content + :param language: Filter by array of valid language(s) + :param content_type: Filter by array of contentType(s) + :param channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ContentInstance + """ + data = values.of( + { + "SortByDate": sort_by_date, + "SortByContentName": sort_by_content_name, + "DateCreatedAfter": serialize.iso8601_datetime(date_created_after), + "DateCreatedBefore": serialize.iso8601_datetime(date_created_before), + "ContentName": content_name, + "Content": content, + "Language": serialize.map(language, lambda e: e), + "ContentType": serialize.map(content_type, lambda e: e), + "ChannelEligibility": serialize.map(channel_eligibility, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ContentPage(self._version, response) + + async def page_async( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ContentPage: + """ + Asynchronously retrieve a single page of ContentInstance records from the API. + Request is executed immediately + + :param sort_by_date: Whether to sort by ascending or descending date updated + :param sort_by_content_name: Whether to sort by ascending or descending content name + :param date_created_after: Filter by >=[date-time] + :param date_created_before: Filter by <=[date-time] + :param content_name: Filter by Regex Pattern in content name + :param content: Filter by Regex Pattern in template content + :param language: Filter by array of valid language(s) + :param content_type: Filter by array of contentType(s) + :param channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ContentInstance + """ + data = values.of( + { + "SortByDate": sort_by_date, + "SortByContentName": sort_by_content_name, + "DateCreatedAfter": serialize.iso8601_datetime(date_created_after), + "DateCreatedBefore": serialize.iso8601_datetime(date_created_before), + "ContentName": content_name, + "Content": content, + "Language": serialize.map(language, lambda e: e), + "ContentType": serialize.map(content_type, lambda e: e), + "ChannelEligibility": serialize.map(channel_eligibility, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ContentPage(self._version, response) + + def get_page(self, target_url: str) -> ContentPage: + """ + Retrieve a specific page of ContentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ContentInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ContentPage(self._version, response) + + async def get_page_async(self, target_url: str) -> ContentPage: + """ + Asynchronously retrieve a specific page of ContentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ContentInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ContentPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/content/v2/content_and_approvals.py b/venv/Lib/site-packages/twilio/rest/content/v2/content_and_approvals.py new file mode 100644 index 00000000..823bcfe0 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/content/v2/content_and_approvals.py @@ -0,0 +1,464 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Content + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ContentAndApprovalsInstance(InstanceResource): + """ + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar sid: The unique string that that we created to identify the Content resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/usage/api/account) that created Content resource. + :ivar friendly_name: A string name used to describe the Content resource. Not visible to the end recipient. + :ivar language: Two-letter (ISO 639-1) language code (e.g., en) identifying the language the Content resource is in. + :ivar variables: Defines the default placeholder values for variables included in the Content resource. e.g. {\"1\": \"Customer_Name\"}. + :ivar types: The [Content types](https://www.twilio.com/docs/content/content-types-overview) (e.g. twilio/text) for this Content resource. + :ivar approval_requests: The submitted information and approval request status of the Content resource. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.language: Optional[str] = payload.get("language") + self.variables: Optional[Dict[str, object]] = payload.get("variables") + self.types: Optional[Dict[str, object]] = payload.get("types") + self.approval_requests: Optional[Dict[str, object]] = payload.get( + "approval_requests" + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ContentAndApprovalsPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ContentAndApprovalsInstance: + """ + Build an instance of ContentAndApprovalsInstance + + :param payload: Payload response from the API + """ + return ContentAndApprovalsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ContentAndApprovalsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ContentAndApprovalsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/ContentAndApprovals" + + def stream( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ContentAndApprovalsInstance]: + """ + Streams ContentAndApprovalsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str sort_by_date: Whether to sort by ascending or descending date updated + :param str sort_by_content_name: Whether to sort by ascending or descending content name + :param datetime date_created_after: Filter by >=[date-time] + :param datetime date_created_before: Filter by <=[date-time] + :param str content_name: Filter by Regex Pattern in content name + :param str content: Filter by Regex Pattern in template content + :param List[str] language: Filter by array of valid language(s) + :param List[str] content_type: Filter by array of contentType(s) + :param List[str] channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + sort_by_date=sort_by_date, + sort_by_content_name=sort_by_content_name, + date_created_after=date_created_after, + date_created_before=date_created_before, + content_name=content_name, + content=content, + language=language, + content_type=content_type, + channel_eligibility=channel_eligibility, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ContentAndApprovalsInstance]: + """ + Asynchronously streams ContentAndApprovalsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str sort_by_date: Whether to sort by ascending or descending date updated + :param str sort_by_content_name: Whether to sort by ascending or descending content name + :param datetime date_created_after: Filter by >=[date-time] + :param datetime date_created_before: Filter by <=[date-time] + :param str content_name: Filter by Regex Pattern in content name + :param str content: Filter by Regex Pattern in template content + :param List[str] language: Filter by array of valid language(s) + :param List[str] content_type: Filter by array of contentType(s) + :param List[str] channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + sort_by_date=sort_by_date, + sort_by_content_name=sort_by_content_name, + date_created_after=date_created_after, + date_created_before=date_created_before, + content_name=content_name, + content=content, + language=language, + content_type=content_type, + channel_eligibility=channel_eligibility, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ContentAndApprovalsInstance]: + """ + Lists ContentAndApprovalsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str sort_by_date: Whether to sort by ascending or descending date updated + :param str sort_by_content_name: Whether to sort by ascending or descending content name + :param datetime date_created_after: Filter by >=[date-time] + :param datetime date_created_before: Filter by <=[date-time] + :param str content_name: Filter by Regex Pattern in content name + :param str content: Filter by Regex Pattern in template content + :param List[str] language: Filter by array of valid language(s) + :param List[str] content_type: Filter by array of contentType(s) + :param List[str] channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + sort_by_date=sort_by_date, + sort_by_content_name=sort_by_content_name, + date_created_after=date_created_after, + date_created_before=date_created_before, + content_name=content_name, + content=content, + language=language, + content_type=content_type, + channel_eligibility=channel_eligibility, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ContentAndApprovalsInstance]: + """ + Asynchronously lists ContentAndApprovalsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str sort_by_date: Whether to sort by ascending or descending date updated + :param str sort_by_content_name: Whether to sort by ascending or descending content name + :param datetime date_created_after: Filter by >=[date-time] + :param datetime date_created_before: Filter by <=[date-time] + :param str content_name: Filter by Regex Pattern in content name + :param str content: Filter by Regex Pattern in template content + :param List[str] language: Filter by array of valid language(s) + :param List[str] content_type: Filter by array of contentType(s) + :param List[str] channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + sort_by_date=sort_by_date, + sort_by_content_name=sort_by_content_name, + date_created_after=date_created_after, + date_created_before=date_created_before, + content_name=content_name, + content=content, + language=language, + content_type=content_type, + channel_eligibility=channel_eligibility, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ContentAndApprovalsPage: + """ + Retrieve a single page of ContentAndApprovalsInstance records from the API. + Request is executed immediately + + :param sort_by_date: Whether to sort by ascending or descending date updated + :param sort_by_content_name: Whether to sort by ascending or descending content name + :param date_created_after: Filter by >=[date-time] + :param date_created_before: Filter by <=[date-time] + :param content_name: Filter by Regex Pattern in content name + :param content: Filter by Regex Pattern in template content + :param language: Filter by array of valid language(s) + :param content_type: Filter by array of contentType(s) + :param channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ContentAndApprovalsInstance + """ + data = values.of( + { + "SortByDate": sort_by_date, + "SortByContentName": sort_by_content_name, + "DateCreatedAfter": serialize.iso8601_datetime(date_created_after), + "DateCreatedBefore": serialize.iso8601_datetime(date_created_before), + "ContentName": content_name, + "Content": content, + "Language": serialize.map(language, lambda e: e), + "ContentType": serialize.map(content_type, lambda e: e), + "ChannelEligibility": serialize.map(channel_eligibility, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ContentAndApprovalsPage(self._version, response) + + async def page_async( + self, + sort_by_date: Union[str, object] = values.unset, + sort_by_content_name: Union[str, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + content_name: Union[str, object] = values.unset, + content: Union[str, object] = values.unset, + language: Union[List[str], object] = values.unset, + content_type: Union[List[str], object] = values.unset, + channel_eligibility: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ContentAndApprovalsPage: + """ + Asynchronously retrieve a single page of ContentAndApprovalsInstance records from the API. + Request is executed immediately + + :param sort_by_date: Whether to sort by ascending or descending date updated + :param sort_by_content_name: Whether to sort by ascending or descending content name + :param date_created_after: Filter by >=[date-time] + :param date_created_before: Filter by <=[date-time] + :param content_name: Filter by Regex Pattern in content name + :param content: Filter by Regex Pattern in template content + :param language: Filter by array of valid language(s) + :param content_type: Filter by array of contentType(s) + :param channel_eligibility: Filter by array of ChannelEligibility(s), where ChannelEligibility=: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ContentAndApprovalsInstance + """ + data = values.of( + { + "SortByDate": sort_by_date, + "SortByContentName": sort_by_content_name, + "DateCreatedAfter": serialize.iso8601_datetime(date_created_after), + "DateCreatedBefore": serialize.iso8601_datetime(date_created_before), + "ContentName": content_name, + "Content": content, + "Language": serialize.map(language, lambda e: e), + "ContentType": serialize.map(content_type, lambda e: e), + "ChannelEligibility": serialize.map(channel_eligibility, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ContentAndApprovalsPage(self._version, response) + + def get_page(self, target_url: str) -> ContentAndApprovalsPage: + """ + Retrieve a specific page of ContentAndApprovalsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ContentAndApprovalsInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ContentAndApprovalsPage(self._version, response) + + async def get_page_async(self, target_url: str) -> ContentAndApprovalsPage: + """ + Asynchronously retrieve a specific page of ContentAndApprovalsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ContentAndApprovalsInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ContentAndApprovalsPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/ConversationsBase.py b/venv/Lib/site-packages/twilio/rest/conversations/ConversationsBase.py new file mode 100644 index 00000000..89043083 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/ConversationsBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.conversations.v1 import V1 + + +class ConversationsBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Conversations Domain + + :returns: Domain for Conversations + """ + super().__init__(twilio, "https://conversations.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Conversations + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/__init__.py b/venv/Lib/site-packages/twilio/rest/conversations/__init__.py new file mode 100644 index 00000000..d60cb426 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/__init__.py @@ -0,0 +1,87 @@ +from warnings import warn + +from twilio.rest.conversations.ConversationsBase import ConversationsBase +from twilio.rest.conversations.v1.address_configuration import AddressConfigurationList +from twilio.rest.conversations.v1.configuration import ConfigurationList +from twilio.rest.conversations.v1.conversation import ConversationList +from twilio.rest.conversations.v1.credential import CredentialList +from twilio.rest.conversations.v1.participant_conversation import ( + ParticipantConversationList, +) +from twilio.rest.conversations.v1.role import RoleList +from twilio.rest.conversations.v1.service import ServiceList +from twilio.rest.conversations.v1.user import UserList + + +class Conversations(ConversationsBase): + @property + def configuration(self) -> ConfigurationList: + warn( + "configuration is deprecated. Use v1.configuration instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.configuration + + @property + def address_configurations(self) -> AddressConfigurationList: + warn( + "address_configurations is deprecated. Use v1.address_configurations instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.address_configurations + + @property + def conversations(self) -> ConversationList: + warn( + "conversations is deprecated. Use v1.conversations instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.conversations + + @property + def credentials(self) -> CredentialList: + warn( + "credentials is deprecated. Use v1.credentials instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.credentials + + @property + def participant_conversations(self) -> ParticipantConversationList: + warn( + "participant_conversations is deprecated. Use v1.participant_conversations instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.participant_conversations + + @property + def roles(self) -> RoleList: + warn( + "roles is deprecated. Use v1.roles instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.roles + + @property + def services(self) -> ServiceList: + warn( + "services is deprecated. Use v1.services instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.services + + @property + def users(self) -> UserList: + warn( + "users is deprecated. Use v1.users instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.users diff --git a/venv/Lib/site-packages/twilio/rest/conversations/__pycache__/ConversationsBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/__pycache__/ConversationsBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e5499a1ec4f81831b8039fd1a0fd7fb06cd1694 GIT binary patch literal 2059 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 iYUJ91C<@|1m AddressConfigurationList: + if self._address_configurations is None: + self._address_configurations = AddressConfigurationList(self) + return self._address_configurations + + @property + def configuration(self) -> ConfigurationList: + if self._configuration is None: + self._configuration = ConfigurationList(self) + return self._configuration + + @property + def conversations(self) -> ConversationList: + if self._conversations is None: + self._conversations = ConversationList(self) + return self._conversations + + @property + def conversation_with_participants(self) -> ConversationWithParticipantsList: + if self._conversation_with_participants is None: + self._conversation_with_participants = ConversationWithParticipantsList( + self + ) + return self._conversation_with_participants + + @property + def credentials(self) -> CredentialList: + if self._credentials is None: + self._credentials = CredentialList(self) + return self._credentials + + @property + def participant_conversations(self) -> ParticipantConversationList: + if self._participant_conversations is None: + self._participant_conversations = ParticipantConversationList(self) + return self._participant_conversations + + @property + def roles(self) -> RoleList: + if self._roles is None: + self._roles = RoleList(self) + return self._roles + + @property + def services(self) -> ServiceList: + if self._services is None: + self._services = ServiceList(self) + return self._services + + @property + def users(self) -> UserList: + if self._users is None: + self._users = UserList(self) + return self._users + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b558e332f5dbff5059f1cd151c073cab9fc4e0b GIT binary patch literal 5387 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/credential.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/credential.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92fb4bd164869556aca4a6dac4ba8ef8dd4b7979 GIT binary patch literal 31079 zcmeHwd2ke0nrCL+RXR%d4Nh(fP)UF-Kn83f0j&nhfWX}?<1QDKDJZBz&MX0v#f-;h zb|At%hUwTwo|qWJT$YBOG472W+YvkKW@Zn^?)I*#>Va{|Crs_h%L8p*iG!l z?(cgqGb`&52HbXgXGz4%cVGFv@B7~Oz37JdT(zUN%$~ zFCQw8R}59KIA^Rf?jQ0qzbjT1uO6yqes`=UUOQCF{GM1{ynd*j`Mt4*c;ir`DAxqlQvQ6VbG-rOk)>bWdgs2(a73b9rv zBx%C@hiD4m4_SChC`2(VNDehQaTGD!7YcQdPp^bWcbN5tCRkyfRnLdYd6krzx{Kg* z7_OPx@pk!S=3_N{!ceg&_v9QJpg-27#yjho?9#Ik~Bkkp%BB=&hD<@K^5v{wU zBZ=hjNVHx5Qb-%))<`^@7!Ai_V?p14BNz&Z8IO!FoQlSk zfIDOFNsMJ2ebGoNz z@eJFVQHAVOyo#HA!>$X$uqeCER}A@-GPzmyoOfK;8yPB>-Acu6EO(+K!zydazvhnfb3Kx?L^S5;&sk;2L` z7DFC{12?m0p$V@Xe9PjHUA7H5Wc!eF%n@+jX)UfNcwkgJad>P*$=JgqiH!YtB%ZMk zN8$qkSH=?xCBktf6w3HQp?Fdrjgh}R6nX&&LQk>x92m&h_x3)OvG3`9YFb#Jj@&uc z+kNy1*0*+aUw{AMqkW2YDwP~LdO8`6C_TVLsiUWr#Ob5^qsNYF(Uj6Y5{{h0vek~J z7$WRY6)n{fv0~1S(;GV?<}3t9#xfqG=V}9*Y{h?#R{D8izOwd$-Ec12)n$lPSHQ`* z2@?~Ja*u?^V#%sqO~xBFmKpt6q!%7b-f|$~9i(9<-(Ve?!2ruV(;pWW~+ifEbN(f9td?>+lL z!|aX&DB+!7-TvmOYo~4mW>;@VxcsBe$LBitr#tu0m)E|w@8Z76%GvTY3wGN^9~Ey# z`y034Eko8NtXP-VC&X0LT-yA5PfV_SW9{o}vvykx>Uy;j@m<{)96zXFm?Ps-mDH%3 zh!{u~;}vM87?wB>&lQ3viY<6v3Z!ytUpQ&5?Oe9fa43t!Wc=869TiiT~b_NF0a8hN=o{_MDvwnIi@%G`7@UfU8C5O!l0ih@s zk0y>wr^9MAIjTwF2xDl2QcoHF-9QjRE*o;&k=)IcH0~?B?^TbxS#_ z)SK5ybS9T%5I(b041A|W_6j)EM=?8@>Rf)kDl7mU>8qQO1Nk4rOQVk|F)+`#Le$f- z@#b7vqpcuM+C?R{!Ffr@Rte=*ukEbrYi%N2d+Mrt_$3D z+Lu&b=zI04tVgJ-d+prCb2FYc21$7kMBkP{P!~LlLC{GPevnCjuIq1nbMa2xoQ*yu zrlb_UsVE+Zuhg_3R!0>nIxNYosHBZXB8nnw8>Btqn1=6lqg> zp>9XOGL!0)2$!5jp8p_aZ-j$stfaYl@#2ef{$*+ZvRVI%8PAI1NuuGug8vJL;OrB` z2b!o?K#pHTO+T_-vHugNQy3Js2(LQ+!hS{!*zR032gmj*C)8wupgWROlfa(|1)v*F z=`-}zPVRs)yXAbgLSfoG70q!kW@7x2;x8PumKs7Pjo6-lAk>V>ZfLpk?B!?Y>f6)x z?X&eAbN-GQPsfbEy>=pfrdAaST%- z;E@tV2#wHVOr4YEEt<2vG-pl4<%2AHgeI#9ETyzxn)NTA@hty!faQzklr099Nj@)M z!DO0%SjMJj5jgxd&FRv`=9CwT(ae?t!wu>B4YT#ZIe&1*6P)n}@2Gvq%Gn%Z<{8(M zDT^p-DmomEfM3d#ji}Mn#7&)2#uzJp^QsYBA_J^4@w%37apv6VPOxP`$4Z0 z;)HF&KH->fPPiuAKNhd+>@d)+?eC+Y;pUe)!Wg+lKLCeJkhzht8jefE7{cZBjlt=3FVB0?GlrW1f~8I=yyUw z+UN*n?Rr#-oInR6kjZFLESWgYr9;#^y%UyM?v|d#c1}trVq?!i?xaXZ4(*qe1WEg3 zG%|vAuyG^hgcJ1EVKOpt)K6JQ$Pk(RE;oU4& zdaA#FPvUTI@2>vu9Pc^PzpLkXe}B)(v2EYl`slXxySJX{JNUhC?@JE#pEw;E=sCE1 zPmrFT9XljeeD^?KQI*dZjm!cv4=^&lv;+_<7@2iohX#A31Bd#b!N8<_yT4}+ZuiJR z460{eFFM~dIyT%98&JQsEplpWUwmLJxp{amhLamhsalH1qi-wn#`2vL3ejo$*7!Ey zwusd-_sJ}pZ$=9a!G88BrK{iD=pKX=mhP=vNA;i$^l{xff@#)( z(Mz*Wd!njxEDWYd@5=^sW)!oH|0q1Dq`)g2*Q5@qHfQ z8?Sp5$r>@w;3$H5?Av^G{d~)s`KA^0SJz5^war<-P_=wP@KpJ-g2(IQRJ0I9zk=!( zj={NK=58@G4Q9`_2(xGZ`&X>!dvU_bhs$8G*IY@)mcYVDKSb;g5&J{Lu8R{4l=%>` zGx6Tt5W7knVUx=)=jcXfvj>q>0yRH_=#slWYvCVJS=t}+U0*P7*S8psZU_QLH~2m? z5jC)NmG6$m_JylE#3`}eG41Tg-xn5$zhv>GRXBzo&?DQ6opq?9m1GMVu@+n zxbwwxJ6=3DFfC?WBzOy_rtKM9urni`%7~{m+SnLW`;K=zX?D+!s5{4l#pEg&3K8EP z3I(^vk`ZupJA-Eazou?K0*ArN&szrH?z_=*6XD?E`V$b zFF&$O9Pil971coq*GQ_ymD<5)HkN2vdhy)OX-CF!G8s)U(Obp|O;21?pF?faHpZu9 z+~B83IIR(s=zIvt!g-$;5kB+8cThqj;ThPGa-p{2%G%3o(c5?X-XC~xU~cmIe{#;hH|^j1fqT|}V8(NR@go6|mf;puqISbE{B`7SR$C~Z^h#n?TO7VygYyiQNHNqAZu6hE=oJGx8M=cn3x z@lPoY{GF@v7q)Wek_9__S@LDu+|HGgjs*d)Y>nI5d9{!HoeS`GGj$tp zbj{RlOILPhorr=AzG=zi;MLWW&!!s#SvN&_gof71%~xHMkEiR`WW5yS%ZnXq3FimIe2ZF0}07t_@%vVMxH5~>?6MJBs0ok~|N&r&C{HG*&HLM{3B zi2q0ivP*P34~mm3KEsDPC^C>|z!Cwlm=A$6Jqu?6J=Wt9vZz3PtT=`p?6`ydeEASN z5&;FZ6AEfK9gl$D1-}P=FZ^!!eYziqB8JM8@{_cT3Z8F5EL8hmrBe1Oe*KU`nNq1Z z%usn=s3I>^iIB_8>Ca26$_vq~RLRv)?N@yh#$37&U*k;FU?!>o9}d7uE#RYu9df7z z0k2~im@6kqFBu^sXFMjqaTYNJN_l&+QXYz48&l>IRbh_}+(;>vuk45tk3#6X;Q15r zcS#*=ri|GG&hej`0=#}GYxy~*f_)+=BM~$Ui@~>vx)Q2edWIiC;1Uobe-M9g&4MAt zGaJzbbkH-CY;dzhl$R$Q98E-D7*%3p5||#G5gCp$H4v0%Mujq2oF@VUXII%au;!91UL&5 zaBz0RWJ^o2p-~~nVwMJiQfw!HOE_tjW1uB^CPZj#b)W@2+tnu!nQ`^)-oN|sZm@5z zI0SV`ruUC#+$WSUBu5%1oUs75Elk4UtnIIBLLt_%FCx})sJqZT^)xwW;0)+g67>$0y#ji#;C4O@|Zyys38~3&GOD44nIcV?ZZPA#X>i`+#Vm&_y8H zVL7~ehKSd5*Rp6h?0j7EEt z;+4}Dyx_j%Nqd@a)ihjbzuZ1ovnpM)YU;?lj`zLqc|X`PQ?rU~GXAT7**s1MJazFY zoKc~p0hO04Cr8s&t8Tj;1Og623~Hh!G)JGBtupGs{jRdF>T_egIj!sMOMHG8`~2?Q z=ZE$^z_jlkwI4%Pf0LY-$oVaD*c!gucV`=?{O_*5jFS1^n&~H(Eb^`Sx)$&mG!-RF zuIt=KZ)$s^;`NHTrj6;Qjq|lllkywU*P}NYvBH}-VTCu-3a|BDaNov(kL6zk09h~c z8aTk!^Qd^!Blc`^-1M%4zd!@3?xP9WPtJOBOsRjKs?&!ghAXyXJYR$>47quVSSt3E zVv8nn=K-MvmBl|W&)}W&+%pOA%C-rwY$seKJK%HbSg8cO{aigGQHpR4GJW)&Wmf!lw*AbRGwmeIX~)4oU8j1doY9*^s+}6l ztpprme|qrnv_mC+R~>_saX_pXX54^fZFns>kx*}@nj{TMI1x%ELtKB%DIgOo{e6TywpDb z$h!HZfsa~O&b4->Tf1(YnQeVyzGc~bi}Z=#Q&G8K_f_Fg-tC5bUS|1jVC2fQ=aE~v zWoqE&)#;km&_7M4-WYp*Y%2Bccd$@v*I=QVYxL^MH`}kZ-)MYSen0VE;)5gUor51* zcpxi)(&A#+`MVgwy`M_9(=)h*@E-s7Mw{5%G4v6XZ5$q`2jhJO2sl>}YNU5W>^%GP%i0RI>nIj#7rVAvov zo6=323Sqc;a}lvw6p-_%%=TUD#G53Ef1iZ7I z4l? zNA!J&s1N8O>I1rnnjnH!k@@J%p0Kb9QC9mV#SW3JQy1XcAdZHu6U2&cCbqW84){G| zPM9)P=GHOU2XgxdCO)#6tq20OW5@pmvZAoE(qJL2`Sc>tKVZXf!70 zoxaD(qFfIaJxiinC3Q;&xOoyu@J4X@iPVz%=_nkiGMj9n!K9UAD`QZXS^u^f&$eRu5X}OcEt<9~P+p=Bgu2Jq z-UHsF)^{?YW6^P4hVU%gbks~-77f92_)P7antXl&CZz297x~4MxMZM$m^!wyv z*hnJZGIExaLjo@5{02?II)n%fxt!fs`=)BAB2!J*2C@QzGh6x>=$);CGr8h6`FS-| zLmtRhBZ8iVf4~$KYE_19Orv6hMg`zoN^0`;#tyq=yX=60D~w%9k3)=_%uHX+5DXJ7 zX&!`pW*W?5Eor{IP?=H&4M;iU{^eiqm`bu4xg;GC_mwGC zN*TqWCsm{kxoh4UGcW0oYVVr2&df_%mil|lTZ_C6rRVB?Vu$TAnF!~grye1{2_gQx zP?^#=?2*afwdsD^D4q8KT5d$k&2p3C!A%K`AQ{ad6D^i-3&O2(D@$)fdKx zFGX1xhRaLge}rkVBoG0~N@&PNovBMAR@y-rlVMGwWd*t{h)@d+OiA4kGRu$IVCWSy z3BaOSC~Epksi4dz#>=hBq5Xzr!JcN*$kuSG~+(*IvvB^r}$ zvOQ`V2A_jy3_>v`s{i$h$1FUIC!A;D0FH%O9N@h2Juoj1EgT+NI6Sm)AhXwp77oA| z5pMNf3Uio}Q_SG7w{B_xN}mzjEgtHHM?vhw787#8d@5!&tWk}hj{rv zBq~H(gD)+c{{Bq+ftj|0vo(hP3Nc`q|Yr( z59tk`#U9b*c&vsYI8?)dq~Mg#qC5D9MDQUId`JWz5<%Q*L1um&dEC`@ool`BN(2Y) zMg_}x8@l}nZOOQ>YjIlm$3zP)_qteUA+P0UL=mTu>sO)d`a+`kfI2Tu8S@lfJ9jM+ z|3(mZwL1PrY=uALj78(oRK`03VI!{V8COc5D*Yo2^?q%{4LWj;4o{J=vEZ4oo7cEt zHt9L%Ku+$>b4wjEg#Ec)w$s+wXa~XtNBDUN4oo^Vm;#3tFLgx<#KyS5Le}!6#uAKe z!^X{lFxrA_0>yJjL)pEKWVOI;X=CB>D5xJ@l0^qed3~rt8HPbVtZGt7L~tajX;Hc@ z1{WelV~k3&IX8RBj-kS~Mv<*eDJ0n*jit~f+!Vu&a9{(R-^C4*Mpwt6hFrH0h%51= zI+p8*)y9^ewPii%mX3^&^)L&V_Q#3Q_%TF69B+&XhSR+LpgtvQ17_z9MwP#hkHU~1 zr+evmEpASPeX^<-mCz%0RY-z27nESWJRHUV>7K_#lE<3W>gRe*sO**oN_C4JOOt2} zs)7T)T55xI=7f@9cQ(RcM8Z{RF=^CtKTCdhDMa?vvfdMR$0CjVu})*~=x6^h_0Q}I z^%n)mBHQe4aka-rQ-CEtv$+EJUJRzz26)%PDcJjrz}A~)ILu7b?@}kP?MyVqF9?Yz zHQY>T02}L|L@RiM6b&jt33m~#WhFL98#_BY0~TSIY0{-%gTxFJ$=aNzYb>fjGsEvj z;4SKaX!cC~Q>;2z+R#h=6F4~dObV7v84V)D3TYV!%@}T;U<00Zav2!qX5}(2o=u%b zjCrk=#6@C%j<}+&2(RdW5#s$e(xKc~E8sxOlFLixs@J8f*G)Z!i?FJct8X+;cg*^`XFOazQH1thK^qJI5)R)wEP|MTZ3-W& z-P*mQzQW_X_l*i2`KS=A`wGUoJHttI()@M>tUI67hZyo9hAc*5M$AJDNmuoPP~0bm zRNn+@7_cHpl{m(XkCBov-CdO_=L=A0O|K)l5Es6MxFS~6TB;tZ5A8e1#aPirks=P^ zhc1VvPTx3{?$~uHG+W<0=kK-P#X#C0m|A(mb>qz2{#pN%GoB~2PNAw#yrcP1_sfs< zED_%kds-duu7ocSTbd{F=}>}Ig#etn2!6z+LAt``y3YE6d9#K8HzG|;MLhR?BBmIr zPRt69Bx2E1?2;gGaccu~iytU)9;2jyM5#E1Aal}3teo^bBTUa53;=HKOC`-Zb@+ts*{hR)vOX3+VD*7=qdSl|^+3xb`_5If2G!f9AvSeLD7eKC$|OlC-5wumwx zVtjH78w^d}H8Y!p*X$A7aUo*cY@|5&ZG&Kv?3Zn?mV;%f!+&oV@|?2|!WEhCjKCNf zd${~Aj0_F-A-2#SVvFK6ElG=Q#t3NcvK9NLV+-|dti6GNs1lE07@wLLf^OwyG6@G# zX;#?YD&wO;bAH2mlhuAg7P+Kv5#BhAf}E*XC#+dNw|Yx@^%fIztl0|8v8M7f!M?2W zGpDP{hofFqzFQ4#zpx7xwOJdYKhIM9=f9u?91ipPe#yMQ)ab~=%Z-nVuZuy)@4Frs zuiCmCf8^NY`ZKZ9_ojW5>(3osj=vNi7jKB0Tt5-J9RJMoxTv#DspKgofvXNlT*W07 zd3TeWyvTn?6INbi@#74z-7)VBKj*l+?M{IT2e$qbPSa|K=DFZ0CAeZ%J61)NUWP7I zv{>!9zR;S`W$;koojl<&U}SUkAHroBQAl5;FeCyAx+{(*j3gU58eu4COh(6gfHKEL z9pZu&l6oj-mB=XlkV!Ni$1h^w;6rT8B30mw5BoCgE72Lv*1f2m()c*I^V`+Gw6jD#pQ|oy1Yn?#B7kMpeyFst<{k@WD(I3mw{|BWIs$` z^;oB6IHr(@^3g*5Hfc?tK&+MEfPRx4(rfdB#gFHhUVgAqu!G8eL|s zK|&I)#HCY|xb}`6DEcdkeTN(-i7{=EG9KeltVYK`Y3<|Tq7|yCh*KCrSLp#zIr3Dv&``%T!-^>+Vq>8<-6>d?* z()nH!@(ScR0NRHOU)N-O9SdK558%1z3RnLHQt>k(h0FObsSwjcv18RFWh`E)l&Oe9 z(@N#U`#i1J-$5R(f%F*Im9# z6mPB+d!BIIT-6GH#s`~BIzkVV&b&jOL@jBXu|RsgMO8}}WZ_flDw2|P7Iyvyg@kdo z*QlqoBsX{07)c_=e`zi-D=8gOB6QjE*GEiqbBF6q4)hzpPz5?l*ACNduOyt)bsvZ| zR7M0Q4@k<|NjOA>5>x0`}{4wo%*lfWGZy% z)1{>hcm5kB`O$RqqjSx> z(#^Ym`q&5SW}A=9)gCDUiNx7FV~9#0?Wq<2O6;k2yweIFvqdkB`Dhzt-J<|AS%Dd; z^x)PU6ORqz(wp&DOxy&^NXUn9-!$p1bDX_yFlj*moHhSd-jcKpJ%hB0M851Z!OwWo z)rin&6b8e&5&m(@uX7pS;IENsp&p6gH(^S(47b88xwhm+?}z@aGoG!S7qrd>Ep0|G z9%R-tiz&0=tSXOA`>@6^8GP6 zv|q^BA@WvLVYC7*yI_t0Zew|2a8q0kW+L@ha-SCFkFf!=QpbyqYHGBsnAG zyZ}c7rZcQt>AnM%oXd#RUcmQd)~#OWimUEV1-!CtLi^@>z9_NX*?p^Web$M0u_!>6m z%%V-W;?igleoH|Lpb*9PAz zpDzCd*JN(FRo6VZV)FFl`gGlDx?OV%srgoBr_m*rE`85`G<2Upumvh@CMBz2_2=3Oxn+!3x zP4@D*m9YBO<6xZmSz2gRA@ tz-@u~ZXa-t+eDaj`)>=(b9>xbC3asrd|SZl_Uc_u1de_x(3|z;{{n;mjIjU! literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/participant_conversation.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/participant_conversation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb56d17276b0dd07c77912915e8a30e5a493373b GIT binary patch literal 19109 zcmeHPTWlQHd7jz(E|=trOG%_CS|dv$xgxow?h0)=rY=?#F|@2(+YOV=a%WZ?X>XaC zl}w6kjl^grz^UzrRtyp#P7pL=>_T$UHcnm|_oXfRP_hi5#UMdk6b0IsVja@3qo;oV znaj?uxKixcY0`2mo;~M3|NQ4N|2hBd9RG83bBM$9(!YLb>iTCn?%%0kJzg`j@*`w! zaUz%CL|$}d`5d3%dCI%9uADpJ&Uq4^oHyak`4YaIKjF^>5`kPW5o9=?Y$(^1Xv&2X zVOI8Ln{zFR7MAyATXT^_gysF&4Y{^N8_Nf>(Oi3?o#$NKNlpyD$cZ7T<#o5wpTtH6 zZ2~kbwcF554B8B6ixjb;o2Of2kyM4}xR8M7{FJN;>4GQ;*HWr*Ny z$)r&Ij{pQp(u?fZNFFGfSPm4TL$4*1tkqdTn6>`{mvoK ztdU$QUrJ@O)A7)M5x2y6Js{!>YjRGC`E~bbep>e&m(!Z=8Ix5_4?J6>p{26A_d*^S zJ#b1RmMAEC^QbzVPg}*9OK%b-RZ`?sR-Tb`-_=yMB&nbuIh9wnR6Z@8mDEB>NlSo* ziMXTezlcc$c~p7Mq%KKmgOiQaXBJj2BJ(F$XcCv;vDjRUp?NU0OLE%`?Fn+CTk?t? z$tU@xK*rUHw=$j^T!t6DFNPCA5%7#l^uOpygl=%p^NFT&Tr8k(JCjm0IV~4cdCmD% zt=`vk3Co2&D;@Z$c1YwCZqb$Si0*`U+7t8M-}MNh@pBp`Uk}LnR9cg-V%n_Vbhe;M z;&{xb2a?HrDkmkAdMKI96~t1O^5JCi%lMFHP2kk{=&|#sE}qbR*6*>gXV0BDzQCc!iK|ln>cp5lIibp$G+0cfui!hV z6B^^)Aw^QPp|q3Phpz4!Dpsc~>8y+wr*$tIn$nKeyYQ!OK=LA2j&|P&ls9zV@FBVB zQ?>!BY)7K|X&n)V`HQLPY#}A4&Fu`897kI%l~;z5{uzIZ(+J9*o9)UpGGs z&&|3nTbr|mhF{UfnB|f-^#-^uiyCk}7Lf+HZU?U2ZUbD81J~m0M*a0VaQ%$`q^hY)a{f|sQqGI` zMQe_IgOTZ|ft2#{mrD}c-*!VvXZa^?%k$!WcfWrJzoN!A>Rz=}loZ;j<-Dw6cXnTr zG-Vg2U+JNwmy$k8VwCKrq@R)jN(L#3Q$lM-kH~7_@WJ6dNlPv(LsU0R$sS7fQnHVd z{YYXS-J?p`jPf`^b|BG%$s`l@$)rj<7xbGK6oG0FBAMwsQ{A@si%)!Rd1#y< z-R1a!J69I2ERLLBj*k&!YkA+u51x4QiN#M}Sl)M$Aluh~eD=A2>Hnwxa=3rR?K;he z2yJ)8#|M>VOKfa2k;03_W}&$D{o#Yhj#&b zh(UL*2Ds*qd*QyNaNq6Cce)n377v_Rjy<;=K3j2f!RDU?dLE6jHsuN^x4(S)=IOD=X8b)?u8i@1?`eL1$NL=p8fp*GOykdfsAu%7&POxKRn~)iVA=~^v8%ziAf1}+4ayTBopw#@ zv)pATo{0`E%Y;H}=4a+??mJqNv!am73$m&13x$l(pgY!9<6y{QN=fAeQ}r9ci%bUu z1FJYr$95Z8J4B2hQTRF(QEn7kIohK$YGFhm;i8%+-jJM4Bgi5%q`4erM5n^7j^0k+?)dh2g`@J~p^GalQ;ASFf+7c4j|h0C_aXuLw{+ECFgy0Kh5WD80`a|wBCN(;J#!srRYt#LhM-agXHi;XgfJh_qh;0xjn;qpS${nbK zFGXxezLR-PwqXC?*ihh*e}`$LHL`}}4E-?yS7*h$9<<^`9(I>4gQi_E_Y8AGGKJ(6 zG;PDz#Kb~_?U4HMfRr(X#fV^foj@R^!RrY%2_k}#gWO@hs_MHlokI=UP{(6#&+L<&tm(lbWC`r98Of0TqzYLNc_7#q`3q!jagg~|jpO$+Vbndd?pcqe z3Cwx%o|CGHJIl|yX1yX$-G9SndFbYR4O+219Mz^~eR$tZ?^|tw>pZEK(3q_RoYP?I z<KSf-+t0i0NadF^m|h6^15QEHWaDqHkn%(}-cCn>86(QiKfV zft=S)ix-NS?Hr{JecovV2;^A&LZ9W5zIN?e-0&L4(}moSSV*gNot5(*j)T z=tvF&PQ#Rs3uE*xFtLE|J#bKfFGPXY6$X9vV>sr_Tui^-lwF%D^wNklaGSG(Z0a5u zJRCJpr6-~E!eb*sp~mN}bE?G6ZVC8gz^zraiI3Rs6&Frvf;wf9D=FDQDNoTI2j7`P zWehqZTquIs1y-;bAz#W(0*E%OC4`wX*fVafn7)|J+r)C!=TZrio7W@>+bZG_61HCR zRRIhu;fujyV9mt^;kcAZf&Yzs z8#7yd0n3?fIejssYw&7Gxgr8KG{Y(I=+wiyYEZi-Yg3H%a|IRg9&0aR9TaHW9}wg? z_&z7+``8-;!k*#b;aF9+Rowx0n2ElOIbG9?#Y#o$l+mKOPuZhY&SHmNa4XN^M>#_Y z0hH&E#5~GL{OCk*nRuJ-PrPmClQTkjlMj6bGp2- z`?YIt_58SNY2tB8DEcXQmIyKcGv*z4s!w50XaO4>u*OFRD3eT|QKQ{Qk( zTo(A7QVRJ(NyV0IO!B$_UKhY@7jiDbbpgCCfY$}^Z%6+R#Pn5UU1}?+^_U$$yfG+EBi3?7WqHHCZQLH|>Ia-4uHN z0U;Y(YK`6AdDnOM+MBJ*txqooo~{HTi0`Z9%m2!u(QW(>`O$9Ak9H!Lc1m7yc0vMj zE95k-^JWvg?qL=xEZH~s*U1l#=XKNn4Lj47iaDhojr`XUa#=F#ZI$UlJ}X~g<`)dk zzSsb^PH2TSHk|||Nr6XQG*m;fI)yJWh3HF`G78&3E7&wmBXClJ31=CQFpJi0L3TQ8 z-4^_$Z9(F27&29x&*n_awlaPVGtf37*DXOZ9S2}rvFT$b>Kb;SVS6>0QkvM0(+;G* zI84B_;TshmW&|#H9QL1W!r@$?hlnX;ti`+yO+A%%amF5oZI?uGrjbu?3U1vhK5LJf=P7o%O!zdMOOMsvUp9gTR^doMK>3NuQv5NO^AfYCZ7&g#euDAbQ&!MHB zLv@0v_b>!eZ_E3fcYDkG-asU@${~4Y)7D?Ox#noa1@H$If`9M}s;F>*VCa`D`%9J1 z|9z$N2>%U!*z--_5&k=_!=CSY_WN%0dqWHE{k}Imhdp=sBm7_S`+a}SANKrB;0SM; zep=y*l-HY>8E823(==%7v2CXR2E=JIt$qFnF+EsJ6xaKveLi{4S3Nhh)?1=Wbj$YX z>p8#Zne~g_C(#~afu`kUb%%a0uMrCrDQ-x8t$Pq7^uOV^?6yv`tPzZ$NP+acl*Xx5 zgmrQ`+|58lDm(4)#6zm#9MpQC?!yJ@{+|Tt*a~K=nNG-ElFrk@7K+BXPr9VV9I(z4 za?Y@svGk2M&FGowb}+(RU`|!e72(mR5O6w60c|+>;V8M$UNcKU8QS+cf(4Gv1j_K5M{B%*e zzdcnf;zAY+<_|qTh)DGyhMF5hVAPC@-j6s@E~~hY;u}q;rJ|<0Po6lx;L&|KNt-H& zx*MlFbRS!;s_vgcbPEw=$QwGDrn?Fm7WQI+D`gxYc4}@RSTBy!R7Ku1Bi`k~nQw%% zh(rKEHg@z;r5hTCfI@0mM-XCcVT}#njf<8)xA)&UvT)?BzU9_qi-BWC zfUI8Rd=(vA389OIx%F@XVwqjPtzrj8V8CevemF4%V{i*I{er0k|)>4#ObE}gK- zjN6t&zca^3)}<3pocw=~PD%!QnsSAbEG2aQTFFyVprnWdH#(V!P)Y=$qY=vIDY0dQ zauvn3_IyHnxIsdDzG1k;Xy^YLUSI~v$Fli%c7Ln;>)rP{_bhepso(s!?8WB4h2l63 zBtXTFn)@o9EC0&q&ZBPr?H>Lp?|Hko3wb>RnMbGYA%<&?i;`i0?T}mfQzQ)!C%RBs z_x#Ex1z)|+Fz3>$S0UFt2080;7!Iyf6mx9rB~HVkD5Yhb2mD_$9jbGQBWq_)SvSM6 z056;!v(I#yr=tKh&+@R|ejFMaV|6%s*{L6&Sjgc_t?n}p1nPdXT|*l(&&bZ;>nZG< zD}8KB$I%1C62#IC?>daZP-oXQ2rP5VDPH?=V!A-lb^oy=Z(X8ow7kxD-8j zxAfNK<>;v!fuFYSUQ0=FG83^MQ&PTeama2K_4 zTOKp^*1@ID!F!$impb>~>pZ&DdGyBz{&Dwm=Y@OG3u`beDcu)&GbFx$G|K-iKf1y5 zgD&Jgp*u;m-ag8mB(_eiJ4sU*yz*I^(``s%UG-OyD8g@C&tsO9w}jhYnnHdbj0%HLtB}7H?{3&E^C=^9fCMjWGk<2DT+`d3LTHMABr=yfRhQxXC zZ;XJHFp0bmUmq9$DxRQs_%;7~9DXWWxW4%JX1_gK?iu)A_S@O=wjJdiz3(=4d!Klx zZS%Z){^ESoQrpgo7XV!IY}@>bI{(Zo*OxZzsQ3wlLxmml?wfO!AeBN~`_}nmuO6w; z`;{;kYFljEvlQIB(oE%}e51BT`TE92`3GAA%-I}@&h}75gPRvOA6yC^q6PtI)Z$~_ zP;G+%)VD{VYI9Vownim1*0R_#xD<@9G*kI_gVAlPZwr9>wg^;hi%QkDsN`&m%Food z6&t#M%vZkgXPe|5fpslBHXWUvso zscU}UYrgp>mNxcQniwq1wRg@(=QHzNFrX`}1>9l{?OJJN)n|WOJ2uXTF!a~b&W+vU#+JCTpL6~H!HxWk+xs)F_h;PpRo_XTKg}=p99-pCZuPt?!sBM; V&Q*?nS9_j!Q*q!uj%8TG{{y)RVGjTR literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/role.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/__pycache__/role.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5344996fc1342e9ae2b6d0455e8bf6ff658ed23 GIT binary patch literal 25933 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 "AddressConfigurationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AddressConfigurationContext for this AddressConfigurationInstance + """ + if self._context is None: + self._context = AddressConfigurationContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AddressConfigurationInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AddressConfigurationInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AddressConfigurationInstance": + """ + Fetch the AddressConfigurationInstance + + + :returns: The fetched AddressConfigurationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AddressConfigurationInstance": + """ + Asynchronous coroutine to fetch the AddressConfigurationInstance + + + :returns: The fetched AddressConfigurationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + auto_creation_enabled: Union[bool, object] = values.unset, + auto_creation_type: Union[ + "AddressConfigurationInstance.AutoCreationType", object + ] = values.unset, + auto_creation_conversation_service_sid: Union[str, object] = values.unset, + auto_creation_webhook_url: Union[str, object] = values.unset, + auto_creation_webhook_method: Union[ + "AddressConfigurationInstance.Method", object + ] = values.unset, + auto_creation_webhook_filters: Union[List[str], object] = values.unset, + auto_creation_studio_flow_sid: Union[str, object] = values.unset, + auto_creation_studio_retry_count: Union[int, object] = values.unset, + ) -> "AddressConfigurationInstance": + """ + Update the AddressConfigurationInstance + + :param friendly_name: The human-readable name of this configuration, limited to 256 characters. Optional. + :param auto_creation_enabled: Enable/Disable auto-creating conversations for messages to this address + :param auto_creation_type: + :param auto_creation_conversation_service_sid: Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + :param auto_creation_webhook_url: For type `webhook`, the url for the webhook request. + :param auto_creation_webhook_method: + :param auto_creation_webhook_filters: The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + :param auto_creation_studio_flow_sid: For type `studio`, the studio flow SID where the webhook should be sent to. + :param auto_creation_studio_retry_count: For type `studio`, number of times to retry the webhook request + + :returns: The updated AddressConfigurationInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + auto_creation_enabled=auto_creation_enabled, + auto_creation_type=auto_creation_type, + auto_creation_conversation_service_sid=auto_creation_conversation_service_sid, + auto_creation_webhook_url=auto_creation_webhook_url, + auto_creation_webhook_method=auto_creation_webhook_method, + auto_creation_webhook_filters=auto_creation_webhook_filters, + auto_creation_studio_flow_sid=auto_creation_studio_flow_sid, + auto_creation_studio_retry_count=auto_creation_studio_retry_count, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + auto_creation_enabled: Union[bool, object] = values.unset, + auto_creation_type: Union[ + "AddressConfigurationInstance.AutoCreationType", object + ] = values.unset, + auto_creation_conversation_service_sid: Union[str, object] = values.unset, + auto_creation_webhook_url: Union[str, object] = values.unset, + auto_creation_webhook_method: Union[ + "AddressConfigurationInstance.Method", object + ] = values.unset, + auto_creation_webhook_filters: Union[List[str], object] = values.unset, + auto_creation_studio_flow_sid: Union[str, object] = values.unset, + auto_creation_studio_retry_count: Union[int, object] = values.unset, + ) -> "AddressConfigurationInstance": + """ + Asynchronous coroutine to update the AddressConfigurationInstance + + :param friendly_name: The human-readable name of this configuration, limited to 256 characters. Optional. + :param auto_creation_enabled: Enable/Disable auto-creating conversations for messages to this address + :param auto_creation_type: + :param auto_creation_conversation_service_sid: Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + :param auto_creation_webhook_url: For type `webhook`, the url for the webhook request. + :param auto_creation_webhook_method: + :param auto_creation_webhook_filters: The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + :param auto_creation_studio_flow_sid: For type `studio`, the studio flow SID where the webhook should be sent to. + :param auto_creation_studio_retry_count: For type `studio`, number of times to retry the webhook request + + :returns: The updated AddressConfigurationInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + auto_creation_enabled=auto_creation_enabled, + auto_creation_type=auto_creation_type, + auto_creation_conversation_service_sid=auto_creation_conversation_service_sid, + auto_creation_webhook_url=auto_creation_webhook_url, + auto_creation_webhook_method=auto_creation_webhook_method, + auto_creation_webhook_filters=auto_creation_webhook_filters, + auto_creation_studio_flow_sid=auto_creation_studio_flow_sid, + auto_creation_studio_retry_count=auto_creation_studio_retry_count, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AddressConfigurationContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the AddressConfigurationContext + + :param version: Version that contains the resource + :param sid: The SID of the Address Configuration resource. This value can be either the `sid` or the `address` of the configuration + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Configuration/Addresses/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the AddressConfigurationInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AddressConfigurationInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AddressConfigurationInstance: + """ + Fetch the AddressConfigurationInstance + + + :returns: The fetched AddressConfigurationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AddressConfigurationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AddressConfigurationInstance: + """ + Asynchronous coroutine to fetch the AddressConfigurationInstance + + + :returns: The fetched AddressConfigurationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AddressConfigurationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + auto_creation_enabled: Union[bool, object] = values.unset, + auto_creation_type: Union[ + "AddressConfigurationInstance.AutoCreationType", object + ] = values.unset, + auto_creation_conversation_service_sid: Union[str, object] = values.unset, + auto_creation_webhook_url: Union[str, object] = values.unset, + auto_creation_webhook_method: Union[ + "AddressConfigurationInstance.Method", object + ] = values.unset, + auto_creation_webhook_filters: Union[List[str], object] = values.unset, + auto_creation_studio_flow_sid: Union[str, object] = values.unset, + auto_creation_studio_retry_count: Union[int, object] = values.unset, + ) -> AddressConfigurationInstance: + """ + Update the AddressConfigurationInstance + + :param friendly_name: The human-readable name of this configuration, limited to 256 characters. Optional. + :param auto_creation_enabled: Enable/Disable auto-creating conversations for messages to this address + :param auto_creation_type: + :param auto_creation_conversation_service_sid: Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + :param auto_creation_webhook_url: For type `webhook`, the url for the webhook request. + :param auto_creation_webhook_method: + :param auto_creation_webhook_filters: The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + :param auto_creation_studio_flow_sid: For type `studio`, the studio flow SID where the webhook should be sent to. + :param auto_creation_studio_retry_count: For type `studio`, number of times to retry the webhook request + + :returns: The updated AddressConfigurationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "AutoCreation.Enabled": serialize.boolean_to_string( + auto_creation_enabled + ), + "AutoCreation.Type": auto_creation_type, + "AutoCreation.ConversationServiceSid": auto_creation_conversation_service_sid, + "AutoCreation.WebhookUrl": auto_creation_webhook_url, + "AutoCreation.WebhookMethod": auto_creation_webhook_method, + "AutoCreation.WebhookFilters": serialize.map( + auto_creation_webhook_filters, lambda e: e + ), + "AutoCreation.StudioFlowSid": auto_creation_studio_flow_sid, + "AutoCreation.StudioRetryCount": auto_creation_studio_retry_count, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AddressConfigurationInstance( + self._version, payload, sid=self._solution["sid"] + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + auto_creation_enabled: Union[bool, object] = values.unset, + auto_creation_type: Union[ + "AddressConfigurationInstance.AutoCreationType", object + ] = values.unset, + auto_creation_conversation_service_sid: Union[str, object] = values.unset, + auto_creation_webhook_url: Union[str, object] = values.unset, + auto_creation_webhook_method: Union[ + "AddressConfigurationInstance.Method", object + ] = values.unset, + auto_creation_webhook_filters: Union[List[str], object] = values.unset, + auto_creation_studio_flow_sid: Union[str, object] = values.unset, + auto_creation_studio_retry_count: Union[int, object] = values.unset, + ) -> AddressConfigurationInstance: + """ + Asynchronous coroutine to update the AddressConfigurationInstance + + :param friendly_name: The human-readable name of this configuration, limited to 256 characters. Optional. + :param auto_creation_enabled: Enable/Disable auto-creating conversations for messages to this address + :param auto_creation_type: + :param auto_creation_conversation_service_sid: Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + :param auto_creation_webhook_url: For type `webhook`, the url for the webhook request. + :param auto_creation_webhook_method: + :param auto_creation_webhook_filters: The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + :param auto_creation_studio_flow_sid: For type `studio`, the studio flow SID where the webhook should be sent to. + :param auto_creation_studio_retry_count: For type `studio`, number of times to retry the webhook request + + :returns: The updated AddressConfigurationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "AutoCreation.Enabled": serialize.boolean_to_string( + auto_creation_enabled + ), + "AutoCreation.Type": auto_creation_type, + "AutoCreation.ConversationServiceSid": auto_creation_conversation_service_sid, + "AutoCreation.WebhookUrl": auto_creation_webhook_url, + "AutoCreation.WebhookMethod": auto_creation_webhook_method, + "AutoCreation.WebhookFilters": serialize.map( + auto_creation_webhook_filters, lambda e: e + ), + "AutoCreation.StudioFlowSid": auto_creation_studio_flow_sid, + "AutoCreation.StudioRetryCount": auto_creation_studio_retry_count, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AddressConfigurationInstance( + self._version, payload, sid=self._solution["sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AddressConfigurationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AddressConfigurationInstance: + """ + Build an instance of AddressConfigurationInstance + + :param payload: Payload response from the API + """ + return AddressConfigurationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AddressConfigurationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AddressConfigurationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Configuration/Addresses" + + def create( + self, + type: "AddressConfigurationInstance.Type", + address: str, + friendly_name: Union[str, object] = values.unset, + auto_creation_enabled: Union[bool, object] = values.unset, + auto_creation_type: Union[ + "AddressConfigurationInstance.AutoCreationType", object + ] = values.unset, + auto_creation_conversation_service_sid: Union[str, object] = values.unset, + auto_creation_webhook_url: Union[str, object] = values.unset, + auto_creation_webhook_method: Union[ + "AddressConfigurationInstance.Method", object + ] = values.unset, + auto_creation_webhook_filters: Union[List[str], object] = values.unset, + auto_creation_studio_flow_sid: Union[str, object] = values.unset, + auto_creation_studio_retry_count: Union[int, object] = values.unset, + address_country: Union[str, object] = values.unset, + ) -> AddressConfigurationInstance: + """ + Create the AddressConfigurationInstance + + :param type: + :param address: The unique address to be configured. The address can be a whatsapp address or phone number + :param friendly_name: The human-readable name of this configuration, limited to 256 characters. Optional. + :param auto_creation_enabled: Enable/Disable auto-creating conversations for messages to this address + :param auto_creation_type: + :param auto_creation_conversation_service_sid: Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + :param auto_creation_webhook_url: For type `webhook`, the url for the webhook request. + :param auto_creation_webhook_method: + :param auto_creation_webhook_filters: The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + :param auto_creation_studio_flow_sid: For type `studio`, the studio flow SID where the webhook should be sent to. + :param auto_creation_studio_retry_count: For type `studio`, number of times to retry the webhook request + :param address_country: An ISO 3166-1 alpha-2n country code which the address belongs to. This is currently only applicable to short code addresses. + + :returns: The created AddressConfigurationInstance + """ + + data = values.of( + { + "Type": type, + "Address": address, + "FriendlyName": friendly_name, + "AutoCreation.Enabled": serialize.boolean_to_string( + auto_creation_enabled + ), + "AutoCreation.Type": auto_creation_type, + "AutoCreation.ConversationServiceSid": auto_creation_conversation_service_sid, + "AutoCreation.WebhookUrl": auto_creation_webhook_url, + "AutoCreation.WebhookMethod": auto_creation_webhook_method, + "AutoCreation.WebhookFilters": serialize.map( + auto_creation_webhook_filters, lambda e: e + ), + "AutoCreation.StudioFlowSid": auto_creation_studio_flow_sid, + "AutoCreation.StudioRetryCount": auto_creation_studio_retry_count, + "AddressCountry": address_country, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AddressConfigurationInstance(self._version, payload) + + async def create_async( + self, + type: "AddressConfigurationInstance.Type", + address: str, + friendly_name: Union[str, object] = values.unset, + auto_creation_enabled: Union[bool, object] = values.unset, + auto_creation_type: Union[ + "AddressConfigurationInstance.AutoCreationType", object + ] = values.unset, + auto_creation_conversation_service_sid: Union[str, object] = values.unset, + auto_creation_webhook_url: Union[str, object] = values.unset, + auto_creation_webhook_method: Union[ + "AddressConfigurationInstance.Method", object + ] = values.unset, + auto_creation_webhook_filters: Union[List[str], object] = values.unset, + auto_creation_studio_flow_sid: Union[str, object] = values.unset, + auto_creation_studio_retry_count: Union[int, object] = values.unset, + address_country: Union[str, object] = values.unset, + ) -> AddressConfigurationInstance: + """ + Asynchronously create the AddressConfigurationInstance + + :param type: + :param address: The unique address to be configured. The address can be a whatsapp address or phone number + :param friendly_name: The human-readable name of this configuration, limited to 256 characters. Optional. + :param auto_creation_enabled: Enable/Disable auto-creating conversations for messages to this address + :param auto_creation_type: + :param auto_creation_conversation_service_sid: Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + :param auto_creation_webhook_url: For type `webhook`, the url for the webhook request. + :param auto_creation_webhook_method: + :param auto_creation_webhook_filters: The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + :param auto_creation_studio_flow_sid: For type `studio`, the studio flow SID where the webhook should be sent to. + :param auto_creation_studio_retry_count: For type `studio`, number of times to retry the webhook request + :param address_country: An ISO 3166-1 alpha-2n country code which the address belongs to. This is currently only applicable to short code addresses. + + :returns: The created AddressConfigurationInstance + """ + + data = values.of( + { + "Type": type, + "Address": address, + "FriendlyName": friendly_name, + "AutoCreation.Enabled": serialize.boolean_to_string( + auto_creation_enabled + ), + "AutoCreation.Type": auto_creation_type, + "AutoCreation.ConversationServiceSid": auto_creation_conversation_service_sid, + "AutoCreation.WebhookUrl": auto_creation_webhook_url, + "AutoCreation.WebhookMethod": auto_creation_webhook_method, + "AutoCreation.WebhookFilters": serialize.map( + auto_creation_webhook_filters, lambda e: e + ), + "AutoCreation.StudioFlowSid": auto_creation_studio_flow_sid, + "AutoCreation.StudioRetryCount": auto_creation_studio_retry_count, + "AddressCountry": address_country, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AddressConfigurationInstance(self._version, payload) + + def stream( + self, + type: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AddressConfigurationInstance]: + """ + Streams AddressConfigurationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str type: Filter the address configurations by its type. This value can be one of: `whatsapp`, `sms`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(type=type, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + type: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AddressConfigurationInstance]: + """ + Asynchronously streams AddressConfigurationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str type: Filter the address configurations by its type. This value can be one of: `whatsapp`, `sms`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(type=type, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + type: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AddressConfigurationInstance]: + """ + Lists AddressConfigurationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str type: Filter the address configurations by its type. This value can be one of: `whatsapp`, `sms`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + type=type, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + type: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AddressConfigurationInstance]: + """ + Asynchronously lists AddressConfigurationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str type: Filter the address configurations by its type. This value can be one of: `whatsapp`, `sms`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + type=type, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + type: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AddressConfigurationPage: + """ + Retrieve a single page of AddressConfigurationInstance records from the API. + Request is executed immediately + + :param type: Filter the address configurations by its type. This value can be one of: `whatsapp`, `sms`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AddressConfigurationInstance + """ + data = values.of( + { + "Type": type, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AddressConfigurationPage(self._version, response) + + async def page_async( + self, + type: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AddressConfigurationPage: + """ + Asynchronously retrieve a single page of AddressConfigurationInstance records from the API. + Request is executed immediately + + :param type: Filter the address configurations by its type. This value can be one of: `whatsapp`, `sms`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AddressConfigurationInstance + """ + data = values.of( + { + "Type": type, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AddressConfigurationPage(self._version, response) + + def get_page(self, target_url: str) -> AddressConfigurationPage: + """ + Retrieve a specific page of AddressConfigurationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AddressConfigurationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AddressConfigurationPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AddressConfigurationPage: + """ + Asynchronously retrieve a specific page of AddressConfigurationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AddressConfigurationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AddressConfigurationPage(self._version, response) + + def get(self, sid: str) -> AddressConfigurationContext: + """ + Constructs a AddressConfigurationContext + + :param sid: The SID of the Address Configuration resource. This value can be either the `sid` or the `address` of the configuration + """ + return AddressConfigurationContext(self._version, sid=sid) + + def __call__(self, sid: str) -> AddressConfigurationContext: + """ + Constructs a AddressConfigurationContext + + :param sid: The SID of the Address Configuration resource. This value can be either the `sid` or the `address` of the configuration + """ + return AddressConfigurationContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/__init__.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/__init__.py new file mode 100644 index 00000000..58408235 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/__init__.py @@ -0,0 +1,325 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.conversations.v1.configuration.webhook import WebhookList + + +class ConfigurationInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this configuration. + :ivar default_chat_service_sid: The SID of the default [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) used when creating a conversation. + :ivar default_messaging_service_sid: The SID of the default [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) used when creating a conversation. + :ivar default_inactive_timer: Default ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :ivar default_closed_timer: Default ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :ivar url: An absolute API resource URL for this global configuration. + :ivar links: Contains absolute API resource URLs to access the webhook and default service configurations. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.default_chat_service_sid: Optional[str] = payload.get( + "default_chat_service_sid" + ) + self.default_messaging_service_sid: Optional[str] = payload.get( + "default_messaging_service_sid" + ) + self.default_inactive_timer: Optional[str] = payload.get( + "default_inactive_timer" + ) + self.default_closed_timer: Optional[str] = payload.get("default_closed_timer") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._context: Optional[ConfigurationContext] = None + + @property + def _proxy(self) -> "ConfigurationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ConfigurationContext for this ConfigurationInstance + """ + if self._context is None: + self._context = ConfigurationContext( + self._version, + ) + return self._context + + def fetch(self) -> "ConfigurationInstance": + """ + Fetch the ConfigurationInstance + + + :returns: The fetched ConfigurationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ConfigurationInstance": + """ + Asynchronous coroutine to fetch the ConfigurationInstance + + + :returns: The fetched ConfigurationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + default_chat_service_sid: Union[str, object] = values.unset, + default_messaging_service_sid: Union[str, object] = values.unset, + default_inactive_timer: Union[str, object] = values.unset, + default_closed_timer: Union[str, object] = values.unset, + ) -> "ConfigurationInstance": + """ + Update the ConfigurationInstance + + :param default_chat_service_sid: The SID of the default [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) to use when creating a conversation. + :param default_messaging_service_sid: The SID of the default [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) to use when creating a conversation. + :param default_inactive_timer: Default ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param default_closed_timer: Default ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + + :returns: The updated ConfigurationInstance + """ + return self._proxy.update( + default_chat_service_sid=default_chat_service_sid, + default_messaging_service_sid=default_messaging_service_sid, + default_inactive_timer=default_inactive_timer, + default_closed_timer=default_closed_timer, + ) + + async def update_async( + self, + default_chat_service_sid: Union[str, object] = values.unset, + default_messaging_service_sid: Union[str, object] = values.unset, + default_inactive_timer: Union[str, object] = values.unset, + default_closed_timer: Union[str, object] = values.unset, + ) -> "ConfigurationInstance": + """ + Asynchronous coroutine to update the ConfigurationInstance + + :param default_chat_service_sid: The SID of the default [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) to use when creating a conversation. + :param default_messaging_service_sid: The SID of the default [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) to use when creating a conversation. + :param default_inactive_timer: Default ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param default_closed_timer: Default ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + + :returns: The updated ConfigurationInstance + """ + return await self._proxy.update_async( + default_chat_service_sid=default_chat_service_sid, + default_messaging_service_sid=default_messaging_service_sid, + default_inactive_timer=default_inactive_timer, + default_closed_timer=default_closed_timer, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ConfigurationContext(InstanceContext): + + def __init__(self, version: Version): + """ + Initialize the ConfigurationContext + + :param version: Version that contains the resource + """ + super().__init__(version) + + self._uri = "/Configuration" + + def fetch(self) -> ConfigurationInstance: + """ + Fetch the ConfigurationInstance + + + :returns: The fetched ConfigurationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ConfigurationInstance( + self._version, + payload, + ) + + async def fetch_async(self) -> ConfigurationInstance: + """ + Asynchronous coroutine to fetch the ConfigurationInstance + + + :returns: The fetched ConfigurationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ConfigurationInstance( + self._version, + payload, + ) + + def update( + self, + default_chat_service_sid: Union[str, object] = values.unset, + default_messaging_service_sid: Union[str, object] = values.unset, + default_inactive_timer: Union[str, object] = values.unset, + default_closed_timer: Union[str, object] = values.unset, + ) -> ConfigurationInstance: + """ + Update the ConfigurationInstance + + :param default_chat_service_sid: The SID of the default [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) to use when creating a conversation. + :param default_messaging_service_sid: The SID of the default [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) to use when creating a conversation. + :param default_inactive_timer: Default ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param default_closed_timer: Default ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + + :returns: The updated ConfigurationInstance + """ + + data = values.of( + { + "DefaultChatServiceSid": default_chat_service_sid, + "DefaultMessagingServiceSid": default_messaging_service_sid, + "DefaultInactiveTimer": default_inactive_timer, + "DefaultClosedTimer": default_closed_timer, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConfigurationInstance(self._version, payload) + + async def update_async( + self, + default_chat_service_sid: Union[str, object] = values.unset, + default_messaging_service_sid: Union[str, object] = values.unset, + default_inactive_timer: Union[str, object] = values.unset, + default_closed_timer: Union[str, object] = values.unset, + ) -> ConfigurationInstance: + """ + Asynchronous coroutine to update the ConfigurationInstance + + :param default_chat_service_sid: The SID of the default [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) to use when creating a conversation. + :param default_messaging_service_sid: The SID of the default [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) to use when creating a conversation. + :param default_inactive_timer: Default ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param default_closed_timer: Default ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + + :returns: The updated ConfigurationInstance + """ + + data = values.of( + { + "DefaultChatServiceSid": default_chat_service_sid, + "DefaultMessagingServiceSid": default_messaging_service_sid, + "DefaultInactiveTimer": default_inactive_timer, + "DefaultClosedTimer": default_closed_timer, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConfigurationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ConfigurationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ConfigurationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._webhooks: Optional[WebhookList] = None + + @property + def webhooks(self) -> WebhookList: + """ + Access the webhooks + """ + if self._webhooks is None: + self._webhooks = WebhookList(self._version) + return self._webhooks + + def get(self) -> ConfigurationContext: + """ + Constructs a ConfigurationContext + + """ + return ConfigurationContext(self._version) + + def __call__(self) -> ConfigurationContext: + """ + Constructs a ConfigurationContext + + """ + return ConfigurationContext(self._version) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..196583b971f4be6c2e86c8f056ab0d0f8eb84500 GIT binary patch literal 12982 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/__pycache__/webhook.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/configuration/__pycache__/webhook.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..133b139561d0a545f380bbf3f02153d4a476deb3 GIT binary patch literal 12751 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 XlPes)S6&t# "WebhookContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: WebhookContext for this WebhookInstance + """ + if self._context is None: + self._context = WebhookContext( + self._version, + ) + return self._context + + def fetch(self) -> "WebhookInstance": + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "WebhookInstance": + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + method: Union[str, object] = values.unset, + filters: Union[List[str], object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + target: Union["WebhookInstance.Target", object] = values.unset, + ) -> "WebhookInstance": + """ + Update the WebhookInstance + + :param method: The HTTP method to be used when sending a webhook request. + :param filters: The list of webhook event triggers that are enabled for this Service: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onMessageAdd`, `onMessageUpdate`, `onMessageRemove`, `onConversationUpdated`, `onConversationRemoved`, `onConversationAdd`, `onConversationAdded`, `onConversationRemove`, `onConversationUpdate`, `onConversationStateUpdated`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onParticipantAdd`, `onParticipantRemove`, `onParticipantUpdate`, `onDeliveryUpdated`, `onUserAdded`, `onUserUpdate`, `onUserUpdated` + :param pre_webhook_url: The absolute url the pre-event webhook request should be sent to. + :param post_webhook_url: The absolute url the post-event webhook request should be sent to. + :param target: + + :returns: The updated WebhookInstance + """ + return self._proxy.update( + method=method, + filters=filters, + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + target=target, + ) + + async def update_async( + self, + method: Union[str, object] = values.unset, + filters: Union[List[str], object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + target: Union["WebhookInstance.Target", object] = values.unset, + ) -> "WebhookInstance": + """ + Asynchronous coroutine to update the WebhookInstance + + :param method: The HTTP method to be used when sending a webhook request. + :param filters: The list of webhook event triggers that are enabled for this Service: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onMessageAdd`, `onMessageUpdate`, `onMessageRemove`, `onConversationUpdated`, `onConversationRemoved`, `onConversationAdd`, `onConversationAdded`, `onConversationRemove`, `onConversationUpdate`, `onConversationStateUpdated`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onParticipantAdd`, `onParticipantRemove`, `onParticipantUpdate`, `onDeliveryUpdated`, `onUserAdded`, `onUserUpdate`, `onUserUpdated` + :param pre_webhook_url: The absolute url the pre-event webhook request should be sent to. + :param post_webhook_url: The absolute url the post-event webhook request should be sent to. + :param target: + + :returns: The updated WebhookInstance + """ + return await self._proxy.update_async( + method=method, + filters=filters, + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + target=target, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class WebhookContext(InstanceContext): + + def __init__(self, version: Version): + """ + Initialize the WebhookContext + + :param version: Version that contains the resource + """ + super().__init__(version) + + self._uri = "/Configuration/Webhooks" + + def fetch(self) -> WebhookInstance: + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return WebhookInstance( + self._version, + payload, + ) + + async def fetch_async(self) -> WebhookInstance: + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + ) + + def update( + self, + method: Union[str, object] = values.unset, + filters: Union[List[str], object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + target: Union["WebhookInstance.Target", object] = values.unset, + ) -> WebhookInstance: + """ + Update the WebhookInstance + + :param method: The HTTP method to be used when sending a webhook request. + :param filters: The list of webhook event triggers that are enabled for this Service: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onMessageAdd`, `onMessageUpdate`, `onMessageRemove`, `onConversationUpdated`, `onConversationRemoved`, `onConversationAdd`, `onConversationAdded`, `onConversationRemove`, `onConversationUpdate`, `onConversationStateUpdated`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onParticipantAdd`, `onParticipantRemove`, `onParticipantUpdate`, `onDeliveryUpdated`, `onUserAdded`, `onUserUpdate`, `onUserUpdated` + :param pre_webhook_url: The absolute url the pre-event webhook request should be sent to. + :param post_webhook_url: The absolute url the post-event webhook request should be sent to. + :param target: + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "Method": method, + "Filters": serialize.map(filters, lambda e: e), + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "Target": target, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance(self._version, payload) + + async def update_async( + self, + method: Union[str, object] = values.unset, + filters: Union[List[str], object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + target: Union["WebhookInstance.Target", object] = values.unset, + ) -> WebhookInstance: + """ + Asynchronous coroutine to update the WebhookInstance + + :param method: The HTTP method to be used when sending a webhook request. + :param filters: The list of webhook event triggers that are enabled for this Service: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onMessageAdd`, `onMessageUpdate`, `onMessageRemove`, `onConversationUpdated`, `onConversationRemoved`, `onConversationAdd`, `onConversationAdded`, `onConversationRemove`, `onConversationUpdate`, `onConversationStateUpdated`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onParticipantAdd`, `onParticipantRemove`, `onParticipantUpdate`, `onDeliveryUpdated`, `onUserAdded`, `onUserUpdate`, `onUserUpdated` + :param pre_webhook_url: The absolute url the pre-event webhook request should be sent to. + :param post_webhook_url: The absolute url the post-event webhook request should be sent to. + :param target: + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "Method": method, + "Filters": serialize.map(filters, lambda e: e), + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "Target": target, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class WebhookList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the WebhookList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self) -> WebhookContext: + """ + Constructs a WebhookContext + + """ + return WebhookContext(self._version) + + def __call__(self) -> WebhookContext: + """ + Constructs a WebhookContext + + """ + return WebhookContext(self._version) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__init__.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__init__.py new file mode 100644 index 00000000..d1f08cc2 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__init__.py @@ -0,0 +1,1025 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.conversations.v1.conversation.message import MessageList +from twilio.rest.conversations.v1.conversation.participant import ParticipantList +from twilio.rest.conversations.v1.conversation.webhook import WebhookList + + +class ConversationInstance(InstanceResource): + + class State(object): + INACTIVE = "inactive" + ACTIVE = "active" + CLOSED = "closed" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this conversation. + :ivar chat_service_sid: The unique ID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) this conversation belongs to. + :ivar messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :ivar unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :ivar attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \"{}\" will be returned. + :ivar state: + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. + :ivar timers: Timer date values representing state update for this conversation. + :ivar url: An absolute API resource URL for this conversation. + :ivar links: Contains absolute URLs to access the [participants](https://www.twilio.com/docs/conversations/api/conversation-participant-resource), [messages](https://www.twilio.com/docs/conversations/api/conversation-message-resource) and [webhooks](https://www.twilio.com/docs/conversations/api/conversation-scoped-webhook-resource) of this conversation. + :ivar bindings: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.unique_name: Optional[str] = payload.get("unique_name") + self.attributes: Optional[str] = payload.get("attributes") + self.state: Optional["ConversationInstance.State"] = payload.get("state") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.timers: Optional[Dict[str, object]] = payload.get("timers") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + self.bindings: Optional[Dict[str, object]] = payload.get("bindings") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ConversationContext] = None + + @property + def _proxy(self) -> "ConversationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ConversationContext for this ConversationInstance + """ + if self._context is None: + self._context = ConversationContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "ConversationInstance": + """ + Fetch the ConversationInstance + + + :returns: The fetched ConversationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ConversationInstance": + """ + Asynchronous coroutine to fetch the ConversationInstance + + + :returns: The fetched ConversationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> "ConversationInstance": + """ + Update the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The updated ConversationInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + messaging_service_sid=messaging_service_sid, + state=state, + timers_inactive=timers_inactive, + timers_closed=timers_closed, + unique_name=unique_name, + bindings_email_address=bindings_email_address, + bindings_email_name=bindings_email_name, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> "ConversationInstance": + """ + Asynchronous coroutine to update the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The updated ConversationInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + messaging_service_sid=messaging_service_sid, + state=state, + timers_inactive=timers_inactive, + timers_closed=timers_closed, + unique_name=unique_name, + bindings_email_address=bindings_email_address, + bindings_email_name=bindings_email_name, + ) + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + return self._proxy.messages + + @property + def participants(self) -> ParticipantList: + """ + Access the participants + """ + return self._proxy.participants + + @property + def webhooks(self) -> WebhookList: + """ + Access the webhooks + """ + return self._proxy.webhooks + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConversationContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ConversationContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this resource. Can also be the `unique_name` of the Conversation. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Conversations/{sid}".format(**self._solution) + + self._messages: Optional[MessageList] = None + self._participants: Optional[ParticipantList] = None + self._webhooks: Optional[WebhookList] = None + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ConversationInstance: + """ + Fetch the ConversationInstance + + + :returns: The fetched ConversationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ConversationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ConversationInstance: + """ + Asynchronous coroutine to fetch the ConversationInstance + + + :returns: The fetched ConversationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ConversationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> ConversationInstance: + """ + Update the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The updated ConversationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MessagingServiceSid": messaging_service_sid, + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "UniqueName": unique_name, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> ConversationInstance: + """ + Asynchronous coroutine to update the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The updated ConversationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MessagingServiceSid": messaging_service_sid, + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "UniqueName": unique_name, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + if self._messages is None: + self._messages = MessageList( + self._version, + self._solution["sid"], + ) + return self._messages + + @property + def participants(self) -> ParticipantList: + """ + Access the participants + """ + if self._participants is None: + self._participants = ParticipantList( + self._version, + self._solution["sid"], + ) + return self._participants + + @property + def webhooks(self) -> WebhookList: + """ + Access the webhooks + """ + if self._webhooks is None: + self._webhooks = WebhookList( + self._version, + self._solution["sid"], + ) + return self._webhooks + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConversationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ConversationInstance: + """ + Build an instance of ConversationInstance + + :param payload: Payload response from the API + """ + return ConversationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ConversationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ConversationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Conversations" + + def create( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> ConversationInstance: + """ + Create the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The created ConversationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "MessagingServiceSid": messaging_service_sid, + "Attributes": attributes, + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationInstance(self._version, payload) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> ConversationInstance: + """ + Asynchronously create the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The created ConversationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "MessagingServiceSid": messaging_service_sid, + "Attributes": attributes, + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationInstance(self._version, payload) + + def stream( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ConversationInstance]: + """ + Streams ConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param str end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param "ConversationInstance.State" state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + start_date=start_date, + end_date=end_date, + state=state, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ConversationInstance]: + """ + Asynchronously streams ConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param str end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param "ConversationInstance.State" state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + start_date=start_date, + end_date=end_date, + state=state, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConversationInstance]: + """ + Lists ConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param str end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param "ConversationInstance.State" state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + start_date=start_date, + end_date=end_date, + state=state, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConversationInstance]: + """ + Asynchronously lists ConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param str end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param "ConversationInstance.State" state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + start_date=start_date, + end_date=end_date, + state=state, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConversationPage: + """ + Retrieve a single page of ConversationInstance records from the API. + Request is executed immediately + + :param start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConversationInstance + """ + data = values.of( + { + "StartDate": start_date, + "EndDate": end_date, + "State": state, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConversationPage(self._version, response) + + async def page_async( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConversationPage: + """ + Asynchronously retrieve a single page of ConversationInstance records from the API. + Request is executed immediately + + :param start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConversationInstance + """ + data = values.of( + { + "StartDate": start_date, + "EndDate": end_date, + "State": state, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConversationPage(self._version, response) + + def get_page(self, target_url: str) -> ConversationPage: + """ + Retrieve a specific page of ConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConversationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ConversationPage(self._version, response) + + async def get_page_async(self, target_url: str) -> ConversationPage: + """ + Asynchronously retrieve a specific page of ConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConversationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ConversationPage(self._version, response) + + def get(self, sid: str) -> ConversationContext: + """ + Constructs a ConversationContext + + :param sid: A 34 character string that uniquely identifies this resource. Can also be the `unique_name` of the Conversation. + """ + return ConversationContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ConversationContext: + """ + Constructs a ConversationContext + + :param sid: A 34 character string that uniquely identifies this resource. Can also be the `unique_name` of the Conversation. + """ + return ConversationContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e41e85df258975e8d84f947b63885646729533b3 GIT binary patch literal 48834 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__pycache__/participant.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/__pycache__/participant.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8b971b48af291db0b977e3b33210459a5e6b0d0 GIT binary patch literal 38233 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 "MessageContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MessageContext for this MessageInstance + """ + if self._context is None: + self._context = MessageContext( + self._version, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "MessageInstance": + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MessageInstance": + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The updated MessageInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + author=author, + body=body, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + subject=subject, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Asynchronous coroutine to update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The updated MessageInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + author=author, + body=body, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + subject=subject, + ) + + @property + def delivery_receipts(self) -> DeliveryReceiptList: + """ + Access the delivery_receipts + """ + return self._proxy.delivery_receipts + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessageContext(InstanceContext): + + def __init__(self, version: Version, conversation_sid: str, sid: str): + """ + Initialize the MessageContext + + :param version: Version that contains the resource + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this message. + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conversation_sid": conversation_sid, + "sid": sid, + } + self._uri = "/Conversations/{conversation_sid}/Messages/{sid}".format( + **self._solution + ) + + self._delivery_receipts: Optional[DeliveryReceiptList] = None + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MessageInstance: + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MessageInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MessageInstance: + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MessageInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Author": author, + "Body": body, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "Subject": subject, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronous coroutine to update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Author": author, + "Body": body, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "Subject": subject, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + @property + def delivery_receipts(self) -> DeliveryReceiptList: + """ + Access the delivery_receipts + """ + if self._delivery_receipts is None: + self._delivery_receipts = DeliveryReceiptList( + self._version, + self._solution["conversation_sid"], + self._solution["sid"], + ) + return self._delivery_receipts + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessagePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MessageInstance: + """ + Build an instance of MessageInstance + + :param payload: Payload response from the API + """ + return MessageInstance( + self._version, payload, conversation_sid=self._solution["conversation_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MessageList(ListResource): + + def __init__(self, version: Version, conversation_sid: str): + """ + Initialize the MessageList + + :param version: Version that contains the resource + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for messages. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conversation_sid": conversation_sid, + } + self._uri = "/Conversations/{conversation_sid}/Messages".format( + **self._solution + ) + + def create( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + media_sid: Union[str, object] = values.unset, + content_sid: Union[str, object] = values.unset, + content_variables: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Create the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param media_sid: The Media SID to be attached to the new Message. + :param content_sid: The unique ID of the multi-channel [Rich Content](https://www.twilio.com/docs/content) template, required for template-generated messages. **Note** that if this field is set, `Body` and `MediaSid` parameters are ignored. + :param content_variables: A structurally valid JSON string that contains values to resolve Rich Content template variables. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The created MessageInstance + """ + + data = values.of( + { + "Author": author, + "Body": body, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MediaSid": media_sid, + "ContentSid": content_sid, + "ContentVariables": content_variables, + "Subject": subject, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, payload, conversation_sid=self._solution["conversation_sid"] + ) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + media_sid: Union[str, object] = values.unset, + content_sid: Union[str, object] = values.unset, + content_variables: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronously create the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param media_sid: The Media SID to be attached to the new Message. + :param content_sid: The unique ID of the multi-channel [Rich Content](https://www.twilio.com/docs/content) template, required for template-generated messages. **Note** that if this field is set, `Body` and `MediaSid` parameters are ignored. + :param content_variables: A structurally valid JSON string that contains values to resolve Rich Content template variables. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The created MessageInstance + """ + + data = values.of( + { + "Author": author, + "Body": body, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MediaSid": media_sid, + "ContentSid": content_sid, + "ContentVariables": content_variables, + "Subject": subject, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, payload, conversation_sid=self._solution["conversation_sid"] + ) + + def stream( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MessageInstance]: + """ + Streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(order=order, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MessageInstance]: + """ + Asynchronously streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(order=order, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + order=order, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Asynchronously lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + order=order, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + async def page_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Asynchronously retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MessagePage: + """ + Retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MessagePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MessagePage: + """ + Asynchronously retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MessagePage(self._version, response, self._solution) + + def get(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return MessageContext( + self._version, conversation_sid=self._solution["conversation_sid"], sid=sid + ) + + def __call__(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return MessageContext( + self._version, conversation_sid=self._solution["conversation_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/message/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/message/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c81d92f5373913d71bcd31d32628ba22217f830 GIT binary patch literal 37106 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/message/__pycache__/delivery_receipt.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/message/__pycache__/delivery_receipt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c23336952e04387a3b8f72a84f1c91a4cc8a6a4f GIT binary patch literal 21069 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 Z=JNO*ntL2>_c{liNUZ*VqdOzye*w "DeliveryReceiptContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DeliveryReceiptContext for this DeliveryReceiptInstance + """ + if self._context is None: + self._context = DeliveryReceiptContext( + self._version, + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "DeliveryReceiptInstance": + """ + Fetch the DeliveryReceiptInstance + + + :returns: The fetched DeliveryReceiptInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DeliveryReceiptInstance": + """ + Asynchronous coroutine to fetch the DeliveryReceiptInstance + + + :returns: The fetched DeliveryReceiptInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DeliveryReceiptContext(InstanceContext): + + def __init__( + self, version: Version, conversation_sid: str, message_sid: str, sid: str + ): + """ + Initialize the DeliveryReceiptContext + + :param version: Version that contains the resource + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this message. + :param message_sid: The SID of the message within a [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) the delivery receipt belongs to. + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conversation_sid": conversation_sid, + "message_sid": message_sid, + "sid": sid, + } + self._uri = "/Conversations/{conversation_sid}/Messages/{message_sid}/Receipts/{sid}".format( + **self._solution + ) + + def fetch(self) -> DeliveryReceiptInstance: + """ + Fetch the DeliveryReceiptInstance + + + :returns: The fetched DeliveryReceiptInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DeliveryReceiptInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> DeliveryReceiptInstance: + """ + Asynchronous coroutine to fetch the DeliveryReceiptInstance + + + :returns: The fetched DeliveryReceiptInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DeliveryReceiptInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DeliveryReceiptPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> DeliveryReceiptInstance: + """ + Build an instance of DeliveryReceiptInstance + + :param payload: Payload response from the API + """ + return DeliveryReceiptInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DeliveryReceiptList(ListResource): + + def __init__(self, version: Version, conversation_sid: str, message_sid: str): + """ + Initialize the DeliveryReceiptList + + :param version: Version that contains the resource + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this message. + :param message_sid: The SID of the message within a [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) the delivery receipt belongs to. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conversation_sid": conversation_sid, + "message_sid": message_sid, + } + self._uri = ( + "/Conversations/{conversation_sid}/Messages/{message_sid}/Receipts".format( + **self._solution + ) + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DeliveryReceiptInstance]: + """ + Streams DeliveryReceiptInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DeliveryReceiptInstance]: + """ + Asynchronously streams DeliveryReceiptInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DeliveryReceiptInstance]: + """ + Lists DeliveryReceiptInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DeliveryReceiptInstance]: + """ + Asynchronously lists DeliveryReceiptInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DeliveryReceiptPage: + """ + Retrieve a single page of DeliveryReceiptInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DeliveryReceiptInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DeliveryReceiptPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DeliveryReceiptPage: + """ + Asynchronously retrieve a single page of DeliveryReceiptInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DeliveryReceiptInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DeliveryReceiptPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DeliveryReceiptPage: + """ + Retrieve a specific page of DeliveryReceiptInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DeliveryReceiptInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DeliveryReceiptPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DeliveryReceiptPage: + """ + Asynchronously retrieve a specific page of DeliveryReceiptInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DeliveryReceiptInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DeliveryReceiptPage(self._version, response, self._solution) + + def get(self, sid: str) -> DeliveryReceiptContext: + """ + Constructs a DeliveryReceiptContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return DeliveryReceiptContext( + self._version, + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> DeliveryReceiptContext: + """ + Constructs a DeliveryReceiptContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return DeliveryReceiptContext( + self._version, + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/participant.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/participant.py new file mode 100644 index 00000000..deb65264 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/participant.py @@ -0,0 +1,895 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ParticipantInstance(InstanceResource): + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this participant. + :ivar conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this participant. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :ivar attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \"{}\" will be returned. + :ivar messaging_binding: Information about how this participant exchanges messages with the conversation. A JSON parameter consisting of type and address fields of the participant. + :ivar role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. + :ivar url: An absolute API resource URL for this participant. + :ivar last_read_message_index: Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + :ivar last_read_timestamp: Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + conversation_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.conversation_sid: Optional[str] = payload.get("conversation_sid") + self.sid: Optional[str] = payload.get("sid") + self.identity: Optional[str] = payload.get("identity") + self.attributes: Optional[str] = payload.get("attributes") + self.messaging_binding: Optional[Dict[str, object]] = payload.get( + "messaging_binding" + ) + self.role_sid: Optional[str] = payload.get("role_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.last_read_message_index: Optional[int] = deserialize.integer( + payload.get("last_read_message_index") + ) + self.last_read_timestamp: Optional[str] = payload.get("last_read_timestamp") + + self._solution = { + "conversation_sid": conversation_sid, + "sid": sid or self.sid, + } + self._context: Optional[ParticipantContext] = None + + @property + def _proxy(self) -> "ParticipantContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ParticipantContext for this ParticipantInstance + """ + if self._context is None: + self._context = ParticipantContext( + self._version, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "ParticipantInstance": + """ + Fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ParticipantInstance": + """ + Asynchronous coroutine to fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + identity: Union[str, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + last_read_timestamp: Union[str, object] = values.unset, + ) -> "ParticipantInstance": + """ + Update the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + :param messaging_binding_proxy_address: The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param last_read_message_index: Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + :param last_read_timestamp: Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + + :returns: The updated ParticipantInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + role_sid=role_sid, + messaging_binding_proxy_address=messaging_binding_proxy_address, + messaging_binding_projected_address=messaging_binding_projected_address, + identity=identity, + last_read_message_index=last_read_message_index, + last_read_timestamp=last_read_timestamp, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + identity: Union[str, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + last_read_timestamp: Union[str, object] = values.unset, + ) -> "ParticipantInstance": + """ + Asynchronous coroutine to update the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + :param messaging_binding_proxy_address: The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param last_read_message_index: Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + :param last_read_timestamp: Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + + :returns: The updated ParticipantInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + role_sid=role_sid, + messaging_binding_proxy_address=messaging_binding_proxy_address, + messaging_binding_projected_address=messaging_binding_projected_address, + identity=identity, + last_read_message_index=last_read_message_index, + last_read_timestamp=last_read_timestamp, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ParticipantContext(InstanceContext): + + def __init__(self, version: Version, conversation_sid: str, sid: str): + """ + Initialize the ParticipantContext + + :param version: Version that contains the resource + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this participant. + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conversation_sid": conversation_sid, + "sid": sid, + } + self._uri = "/Conversations/{conversation_sid}/Participants/{sid}".format( + **self._solution + ) + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ParticipantInstance: + """ + Fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ParticipantInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ParticipantInstance: + """ + Asynchronous coroutine to fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + identity: Union[str, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + last_read_timestamp: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Update the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + :param messaging_binding_proxy_address: The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param last_read_message_index: Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + :param last_read_timestamp: Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + + :returns: The updated ParticipantInstance + """ + + data = values.of( + { + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "RoleSid": role_sid, + "MessagingBinding.ProxyAddress": messaging_binding_proxy_address, + "MessagingBinding.ProjectedAddress": messaging_binding_projected_address, + "Identity": identity, + "LastReadMessageIndex": last_read_message_index, + "LastReadTimestamp": last_read_timestamp, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + identity: Union[str, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + last_read_timestamp: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Asynchronous coroutine to update the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + :param messaging_binding_proxy_address: The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param last_read_message_index: Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + :param last_read_timestamp: Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + + :returns: The updated ParticipantInstance + """ + + data = values.of( + { + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "RoleSid": role_sid, + "MessagingBinding.ProxyAddress": messaging_binding_proxy_address, + "MessagingBinding.ProjectedAddress": messaging_binding_projected_address, + "Identity": identity, + "LastReadMessageIndex": last_read_message_index, + "LastReadTimestamp": last_read_timestamp, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ParticipantPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ParticipantInstance: + """ + Build an instance of ParticipantInstance + + :param payload: Payload response from the API + """ + return ParticipantInstance( + self._version, payload, conversation_sid=self._solution["conversation_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ParticipantList(ListResource): + + def __init__(self, version: Version, conversation_sid: str): + """ + Initialize the ParticipantList + + :param version: Version that contains the resource + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for participants. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conversation_sid": conversation_sid, + } + self._uri = "/Conversations/{conversation_sid}/Participants".format( + **self._solution + ) + + def create( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + identity: Union[str, object] = values.unset, + messaging_binding_address: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Create the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param messaging_binding_address: The address of the participant's device, e.g. a phone or WhatsApp number. Together with the Proxy address, this determines a participant uniquely. This field (with proxy_address) is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + :param messaging_binding_proxy_address: The address of the Twilio phone number (or WhatsApp number) that the participant is in contact with. This field, together with participant address, is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. Communication mask for the Conversation participant with Identity. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + + :returns: The created ParticipantInstance + """ + + data = values.of( + { + "Identity": identity, + "MessagingBinding.Address": messaging_binding_address, + "MessagingBinding.ProxyAddress": messaging_binding_proxy_address, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MessagingBinding.ProjectedAddress": messaging_binding_projected_address, + "RoleSid": role_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, payload, conversation_sid=self._solution["conversation_sid"] + ) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + identity: Union[str, object] = values.unset, + messaging_binding_address: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Asynchronously create the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param messaging_binding_address: The address of the participant's device, e.g. a phone or WhatsApp number. Together with the Proxy address, this determines a participant uniquely. This field (with proxy_address) is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + :param messaging_binding_proxy_address: The address of the Twilio phone number (or WhatsApp number) that the participant is in contact with. This field, together with participant address, is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. Communication mask for the Conversation participant with Identity. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + + :returns: The created ParticipantInstance + """ + + data = values.of( + { + "Identity": identity, + "MessagingBinding.Address": messaging_binding_address, + "MessagingBinding.ProxyAddress": messaging_binding_proxy_address, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MessagingBinding.ProjectedAddress": messaging_binding_projected_address, + "RoleSid": role_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, payload, conversation_sid=self._solution["conversation_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ParticipantInstance]: + """ + Streams ParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ParticipantInstance]: + """ + Asynchronously streams ParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantInstance]: + """ + Lists ParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantInstance]: + """ + Asynchronously lists ParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantPage: + """ + Retrieve a single page of ParticipantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantPage: + """ + Asynchronously retrieve a single page of ParticipantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ParticipantPage: + """ + Retrieve a specific page of ParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ParticipantPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ParticipantPage: + """ + Asynchronously retrieve a specific page of ParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ParticipantPage(self._version, response, self._solution) + + def get(self, sid: str) -> ParticipantContext: + """ + Constructs a ParticipantContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return ParticipantContext( + self._version, conversation_sid=self._solution["conversation_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ParticipantContext: + """ + Constructs a ParticipantContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return ParticipantContext( + self._version, conversation_sid=self._solution["conversation_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/webhook.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/webhook.py new file mode 100644 index 00000000..837f88c2 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation/webhook.py @@ -0,0 +1,758 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class WebhookInstance(InstanceResource): + + class Method(object): + GET = "GET" + POST = "POST" + + class Target(object): + WEBHOOK = "webhook" + TRIGGER = "trigger" + STUDIO = "studio" + + """ + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this conversation. + :ivar conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this webhook. + :ivar target: The target of this webhook: `webhook`, `studio`, `trigger` + :ivar url: An absolute API resource URL for this webhook. + :ivar configuration: The configuration of this webhook. Is defined based on target. + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + conversation_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.conversation_sid: Optional[str] = payload.get("conversation_sid") + self.target: Optional[str] = payload.get("target") + self.url: Optional[str] = payload.get("url") + self.configuration: Optional[Dict[str, object]] = payload.get("configuration") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "conversation_sid": conversation_sid, + "sid": sid or self.sid, + } + self._context: Optional[WebhookContext] = None + + @property + def _proxy(self) -> "WebhookContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: WebhookContext for this WebhookInstance + """ + if self._context is None: + self._context = WebhookContext( + self._version, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "WebhookInstance": + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "WebhookInstance": + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + ) -> "WebhookInstance": + """ + Update the WebhookInstance + + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + + :returns: The updated WebhookInstance + """ + return self._proxy.update( + configuration_url=configuration_url, + configuration_method=configuration_method, + configuration_filters=configuration_filters, + configuration_triggers=configuration_triggers, + configuration_flow_sid=configuration_flow_sid, + ) + + async def update_async( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + ) -> "WebhookInstance": + """ + Asynchronous coroutine to update the WebhookInstance + + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + + :returns: The updated WebhookInstance + """ + return await self._proxy.update_async( + configuration_url=configuration_url, + configuration_method=configuration_method, + configuration_filters=configuration_filters, + configuration_triggers=configuration_triggers, + configuration_flow_sid=configuration_flow_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebhookContext(InstanceContext): + + def __init__(self, version: Version, conversation_sid: str, sid: str): + """ + Initialize the WebhookContext + + :param version: Version that contains the resource + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this webhook. + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conversation_sid": conversation_sid, + "sid": sid, + } + self._uri = "/Conversations/{conversation_sid}/Webhooks/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> WebhookInstance: + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return WebhookInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> WebhookInstance: + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + ) -> WebhookInstance: + """ + Update the WebhookInstance + + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + ) -> WebhookInstance: + """ + Asynchronous coroutine to update the WebhookInstance + + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebhookPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> WebhookInstance: + """ + Build an instance of WebhookInstance + + :param payload: Payload response from the API + """ + return WebhookInstance( + self._version, payload, conversation_sid=self._solution["conversation_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class WebhookList(ListResource): + + def __init__(self, version: Version, conversation_sid: str): + """ + Initialize the WebhookList + + :param version: Version that contains the resource + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this webhook. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conversation_sid": conversation_sid, + } + self._uri = "/Conversations/{conversation_sid}/Webhooks".format( + **self._solution + ) + + def create( + self, + target: "WebhookInstance.Target", + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_replay_after: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Create the WebhookInstance + + :param target: + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + :param configuration_replay_after: The message index for which and it's successors the webhook will be replayed. Not set by default + + :returns: The created WebhookInstance + """ + + data = values.of( + { + "Target": target, + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.ReplayAfter": configuration_replay_after, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, payload, conversation_sid=self._solution["conversation_sid"] + ) + + async def create_async( + self, + target: "WebhookInstance.Target", + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_replay_after: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Asynchronously create the WebhookInstance + + :param target: + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + :param configuration_replay_after: The message index for which and it's successors the webhook will be replayed. Not set by default + + :returns: The created WebhookInstance + """ + + data = values.of( + { + "Target": target, + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.ReplayAfter": configuration_replay_after, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, payload, conversation_sid=self._solution["conversation_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[WebhookInstance]: + """ + Streams WebhookInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[WebhookInstance]: + """ + Asynchronously streams WebhookInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[WebhookInstance]: + """ + Lists WebhookInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[WebhookInstance]: + """ + Asynchronously lists WebhookInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> WebhookPage: + """ + Retrieve a single page of WebhookInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of WebhookInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return WebhookPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> WebhookPage: + """ + Asynchronously retrieve a single page of WebhookInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of WebhookInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return WebhookPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> WebhookPage: + """ + Retrieve a specific page of WebhookInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of WebhookInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return WebhookPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> WebhookPage: + """ + Asynchronously retrieve a specific page of WebhookInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of WebhookInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return WebhookPage(self._version, response, self._solution) + + def get(self, sid: str) -> WebhookContext: + """ + Constructs a WebhookContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return WebhookContext( + self._version, conversation_sid=self._solution["conversation_sid"], sid=sid + ) + + def __call__(self, sid: str) -> WebhookContext: + """ + Constructs a WebhookContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return WebhookContext( + self._version, conversation_sid=self._solution["conversation_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation_with_participants.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation_with_participants.py new file mode 100644 index 00000000..a818a29c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/conversation_with_participants.py @@ -0,0 +1,251 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ConversationWithParticipantsInstance(InstanceResource): + + class State(object): + INACTIVE = "inactive" + ACTIVE = "active" + CLOSED = "closed" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this conversation. + :ivar chat_service_sid: The unique ID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) this conversation belongs to. + :ivar messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :ivar unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :ivar attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \"{}\" will be returned. + :ivar state: + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. + :ivar timers: Timer date values representing state update for this conversation. + :ivar links: Contains absolute URLs to access the [participants](https://www.twilio.com/docs/conversations/api/conversation-participant-resource), [messages](https://www.twilio.com/docs/conversations/api/conversation-message-resource) and [webhooks](https://www.twilio.com/docs/conversations/api/conversation-scoped-webhook-resource) of this conversation. + :ivar bindings: + :ivar url: An absolute API resource URL for this conversation. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.unique_name: Optional[str] = payload.get("unique_name") + self.attributes: Optional[str] = payload.get("attributes") + self.state: Optional["ConversationWithParticipantsInstance.State"] = ( + payload.get("state") + ) + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.timers: Optional[Dict[str, object]] = payload.get("timers") + self.links: Optional[Dict[str, object]] = payload.get("links") + self.bindings: Optional[Dict[str, object]] = payload.get("bindings") + self.url: Optional[str] = payload.get("url") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ConversationWithParticipantsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ConversationWithParticipantsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/ConversationWithParticipants" + + def create( + self, + x_twilio_webhook_enabled: Union[ + "ConversationWithParticipantsInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + state: Union[ + "ConversationWithParticipantsInstance.State", object + ] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + participant: Union[List[str], object] = values.unset, + ) -> ConversationWithParticipantsInstance: + """ + Create the ConversationWithParticipantsInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + :param participant: The participant to be added to the conversation in JSON format. The JSON object attributes are as parameters in [Participant Resource](https://www.twilio.com/docs/conversations/api/conversation-participant-resource). The maximum number of participants that can be added in a single request is 10. + + :returns: The created ConversationWithParticipantsInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "MessagingServiceSid": messaging_service_sid, + "Attributes": attributes, + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + "Participant": serialize.map(participant, lambda e: e), + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationWithParticipantsInstance(self._version, payload) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationWithParticipantsInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + state: Union[ + "ConversationWithParticipantsInstance.State", object + ] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + participant: Union[List[str], object] = values.unset, + ) -> ConversationWithParticipantsInstance: + """ + Asynchronously create the ConversationWithParticipantsInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + :param participant: The participant to be added to the conversation in JSON format. The JSON object attributes are as parameters in [Participant Resource](https://www.twilio.com/docs/conversations/api/conversation-participant-resource). The maximum number of participants that can be added in a single request is 10. + + :returns: The created ConversationWithParticipantsInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "MessagingServiceSid": messaging_service_sid, + "Attributes": attributes, + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + "Participant": serialize.map(participant, lambda e: e), + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationWithParticipantsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/credential.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/credential.py new file mode 100644 index 00000000..f382458b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/credential.py @@ -0,0 +1,723 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CredentialInstance(InstanceResource): + + class PushType(object): + APN = "apn" + GCM = "gcm" + FCM = "fcm" + + """ + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this credential. + :ivar friendly_name: The human-readable name of this credential, limited to 64 characters. Optional. + :ivar type: + :ivar sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. + :ivar url: An absolute API resource URL for this credential. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["CredentialInstance.PushType"] = payload.get("type") + self.sandbox: Optional[str] = payload.get("sandbox") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[CredentialContext] = None + + @property + def _proxy(self) -> "CredentialContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CredentialContext for this CredentialInstance + """ + if self._context is None: + self._context = CredentialContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CredentialInstance": + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CredentialInstance": + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + type: Union["CredentialInstance.PushType", object] = values.unset, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Update the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + return self._proxy.update( + type=type, + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + async def update_async( + self, + type: Union["CredentialInstance.PushType", object] = values.unset, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Asynchronous coroutine to update the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + return await self._proxy.update_async( + type=type, + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the CredentialContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Credentials/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CredentialInstance: + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CredentialInstance: + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + type: Union["CredentialInstance.PushType", object] = values.unset, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Update the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + type: Union["CredentialInstance.PushType", object] = values.unset, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronous coroutine to update the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CredentialInstance: + """ + Build an instance of CredentialInstance + + :param payload: Payload response from the API + """ + return CredentialInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CredentialList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CredentialList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Credentials" + + def create( + self, + type: "CredentialInstance.PushType", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Create the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + async def create_async( + self, + type: "CredentialInstance.PushType", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronously create the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + :param private_key: [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + :param secret: [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CredentialInstance]: + """ + Streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CredentialInstance]: + """ + Asynchronously streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Asynchronously lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Asynchronously retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + def get_page(self, target_url: str) -> CredentialPage: + """ + Retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CredentialPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CredentialPage: + """ + Asynchronously retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CredentialPage(self._version, response) + + def get(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return CredentialContext(self._version, sid=sid) + + def __call__(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return CredentialContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/participant_conversation.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/participant_conversation.py new file mode 100644 index 00000000..0938bd54 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/participant_conversation.py @@ -0,0 +1,366 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ParticipantConversationInstance(InstanceResource): + + class State(object): + INACTIVE = "inactive" + ACTIVE = "active" + CLOSED = "closed" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this conversation. + :ivar chat_service_sid: The unique ID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) this conversation belongs to. + :ivar participant_sid: The unique ID of the [Participant](https://www.twilio.com/docs/conversations/api/conversation-participant-resource). + :ivar participant_user_sid: The unique string that identifies the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). + :ivar participant_identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :ivar participant_messaging_binding: Information about how this participant exchanges messages with the conversation. A JSON parameter consisting of type and address fields of the participant. + :ivar conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) this Participant belongs to. + :ivar conversation_unique_name: An application-defined string that uniquely identifies the Conversation resource. + :ivar conversation_friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :ivar conversation_attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \"{}\" will be returned. + :ivar conversation_date_created: The date that this conversation was created, given in ISO 8601 format. + :ivar conversation_date_updated: The date that this conversation was last updated, given in ISO 8601 format. + :ivar conversation_created_by: Identity of the creator of this Conversation. + :ivar conversation_state: + :ivar conversation_timers: Timer date values representing state update for this conversation. + :ivar links: Contains absolute URLs to access the [participant](https://www.twilio.com/docs/conversations/api/conversation-participant-resource) and [conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) of this conversation. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.participant_sid: Optional[str] = payload.get("participant_sid") + self.participant_user_sid: Optional[str] = payload.get("participant_user_sid") + self.participant_identity: Optional[str] = payload.get("participant_identity") + self.participant_messaging_binding: Optional[Dict[str, object]] = payload.get( + "participant_messaging_binding" + ) + self.conversation_sid: Optional[str] = payload.get("conversation_sid") + self.conversation_unique_name: Optional[str] = payload.get( + "conversation_unique_name" + ) + self.conversation_friendly_name: Optional[str] = payload.get( + "conversation_friendly_name" + ) + self.conversation_attributes: Optional[str] = payload.get( + "conversation_attributes" + ) + self.conversation_date_created: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("conversation_date_created")) + ) + self.conversation_date_updated: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("conversation_date_updated")) + ) + self.conversation_created_by: Optional[str] = payload.get( + "conversation_created_by" + ) + self.conversation_state: Optional["ParticipantConversationInstance.State"] = ( + payload.get("conversation_state") + ) + self.conversation_timers: Optional[Dict[str, object]] = payload.get( + "conversation_timers" + ) + self.links: Optional[Dict[str, object]] = payload.get("links") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ParticipantConversationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ParticipantConversationInstance: + """ + Build an instance of ParticipantConversationInstance + + :param payload: Payload response from the API + """ + return ParticipantConversationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ParticipantConversationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ParticipantConversationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/ParticipantConversations" + + def stream( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ParticipantConversationInstance]: + """ + Streams ParticipantConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param str address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + identity=identity, address=address, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ParticipantConversationInstance]: + """ + Asynchronously streams ParticipantConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param str address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + identity=identity, address=address, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantConversationInstance]: + """ + Lists ParticipantConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param str address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + address=address, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantConversationInstance]: + """ + Asynchronously lists ParticipantConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param str address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + address=address, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantConversationPage: + """ + Retrieve a single page of ParticipantConversationInstance records from the API. + Request is executed immediately + + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantConversationInstance + """ + data = values.of( + { + "Identity": identity, + "Address": address, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantConversationPage(self._version, response) + + async def page_async( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantConversationPage: + """ + Asynchronously retrieve a single page of ParticipantConversationInstance records from the API. + Request is executed immediately + + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantConversationInstance + """ + data = values.of( + { + "Identity": identity, + "Address": address, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantConversationPage(self._version, response) + + def get_page(self, target_url: str) -> ParticipantConversationPage: + """ + Retrieve a specific page of ParticipantConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantConversationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ParticipantConversationPage(self._version, response) + + async def get_page_async(self, target_url: str) -> ParticipantConversationPage: + """ + Asynchronously retrieve a specific page of ParticipantConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantConversationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ParticipantConversationPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/role.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/role.py new file mode 100644 index 00000000..229e9b7d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/role.py @@ -0,0 +1,610 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RoleInstance(InstanceResource): + + class RoleType(object): + CONVERSATION = "conversation" + SERVICE = "service" + + """ + :ivar sid: The unique string that we created to identify the Role resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Role resource. + :ivar chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Role resource is associated with. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar type: + :ivar permissions: An array of the permissions the role has been granted. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: An absolute API resource URL for this user role. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["RoleInstance.RoleType"] = payload.get("type") + self.permissions: Optional[List[str]] = payload.get("permissions") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[RoleContext] = None + + @property + def _proxy(self) -> "RoleContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RoleContext for this RoleInstance + """ + if self._context is None: + self._context = RoleContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "RoleInstance": + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "RoleInstance": + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return await self._proxy.fetch_async() + + def update(self, permission: List[str]) -> "RoleInstance": + """ + Update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + return self._proxy.update( + permission=permission, + ) + + async def update_async(self, permission: List[str]) -> "RoleInstance": + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + return await self._proxy.update_async( + permission=permission, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RoleContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the RoleContext + + :param version: Version that contains the resource + :param sid: The SID of the Role resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Roles/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> RoleInstance: + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return RoleInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> RoleInstance: + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return RoleInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update(self, permission: List[str]) -> RoleInstance: + """ + Update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async(self, permission: List[str]) -> RoleInstance: + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RolePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RoleInstance: + """ + Build an instance of RoleInstance + + :param payload: Payload response from the API + """ + return RoleInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RoleList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the RoleList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Roles" + + def create( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Create the RoleInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param type: + :param permission: A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type`. + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance(self._version, payload) + + async def create_async( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Asynchronously create the RoleInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param type: + :param permission: A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type`. + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RoleInstance]: + """ + Streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RoleInstance]: + """ + Asynchronously streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Asynchronously lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Asynchronously retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response) + + def get_page(self, target_url: str) -> RolePage: + """ + Retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RolePage(self._version, response) + + async def get_page_async(self, target_url: str) -> RolePage: + """ + Asynchronously retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RolePage(self._version, response) + + def get(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: The SID of the Role resource to update. + """ + return RoleContext(self._version, sid=sid) + + def __call__(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: The SID of the Role resource to update. + """ + return RoleContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/__init__.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/__init__.py new file mode 100644 index 00000000..3b92c879 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/__init__.py @@ -0,0 +1,667 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.conversations.v1.service.binding import BindingList +from twilio.rest.conversations.v1.service.configuration import ConfigurationList +from twilio.rest.conversations.v1.service.conversation import ConversationList +from twilio.rest.conversations.v1.service.conversation_with_participants import ( + ConversationWithParticipantsList, +) +from twilio.rest.conversations.v1.service.participant_conversation import ( + ParticipantConversationList, +) +from twilio.rest.conversations.v1.service.role import RoleList +from twilio.rest.conversations.v1.service.user import UserList + + +class ServiceInstance(InstanceResource): + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this service. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar friendly_name: The human-readable name of this service, limited to 256 characters. Optional. + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. + :ivar url: An absolute API resource URL for this service. + :ivar links: Contains absolute API resource URLs to access conversations, users, roles, bindings and configuration of this service. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ServiceContext] = None + + @property + def _proxy(self) -> "ServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ServiceContext for this ServiceInstance + """ + if self._context is None: + self._context = ServiceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ServiceInstance": + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ServiceInstance": + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return await self._proxy.fetch_async() + + @property + def bindings(self) -> BindingList: + """ + Access the bindings + """ + return self._proxy.bindings + + @property + def configuration(self) -> ConfigurationList: + """ + Access the configuration + """ + return self._proxy.configuration + + @property + def conversations(self) -> ConversationList: + """ + Access the conversations + """ + return self._proxy.conversations + + @property + def conversation_with_participants(self) -> ConversationWithParticipantsList: + """ + Access the conversation_with_participants + """ + return self._proxy.conversation_with_participants + + @property + def participant_conversations(self) -> ParticipantConversationList: + """ + Access the participant_conversations + """ + return self._proxy.participant_conversations + + @property + def roles(self) -> RoleList: + """ + Access the roles + """ + return self._proxy.roles + + @property + def users(self) -> UserList: + """ + Access the users + """ + return self._proxy.users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServiceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ServiceContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Services/{sid}".format(**self._solution) + + self._bindings: Optional[BindingList] = None + self._configuration: Optional[ConfigurationList] = None + self._conversations: Optional[ConversationList] = None + self._conversation_with_participants: Optional[ + ConversationWithParticipantsList + ] = None + self._participant_conversations: Optional[ParticipantConversationList] = None + self._roles: Optional[RoleList] = None + self._users: Optional[UserList] = None + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ServiceInstance: + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ServiceInstance: + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + @property + def bindings(self) -> BindingList: + """ + Access the bindings + """ + if self._bindings is None: + self._bindings = BindingList( + self._version, + self._solution["sid"], + ) + return self._bindings + + @property + def configuration(self) -> ConfigurationList: + """ + Access the configuration + """ + if self._configuration is None: + self._configuration = ConfigurationList( + self._version, + self._solution["sid"], + ) + return self._configuration + + @property + def conversations(self) -> ConversationList: + """ + Access the conversations + """ + if self._conversations is None: + self._conversations = ConversationList( + self._version, + self._solution["sid"], + ) + return self._conversations + + @property + def conversation_with_participants(self) -> ConversationWithParticipantsList: + """ + Access the conversation_with_participants + """ + if self._conversation_with_participants is None: + self._conversation_with_participants = ConversationWithParticipantsList( + self._version, + self._solution["sid"], + ) + return self._conversation_with_participants + + @property + def participant_conversations(self) -> ParticipantConversationList: + """ + Access the participant_conversations + """ + if self._participant_conversations is None: + self._participant_conversations = ParticipantConversationList( + self._version, + self._solution["sid"], + ) + return self._participant_conversations + + @property + def roles(self) -> RoleList: + """ + Access the roles + """ + if self._roles is None: + self._roles = RoleList( + self._version, + self._solution["sid"], + ) + return self._roles + + @property + def users(self) -> UserList: + """ + Access the users + """ + if self._users is None: + self._users = UserList( + self._version, + self._solution["sid"], + ) + return self._users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ServiceInstance: + """ + Build an instance of ServiceInstance + + :param payload: Payload response from the API + """ + return ServiceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services" + + def create(self, friendly_name: str) -> ServiceInstance: + """ + Create the ServiceInstance + + :param friendly_name: The human-readable name of this service, limited to 256 characters. Optional. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + async def create_async(self, friendly_name: str) -> ServiceInstance: + """ + Asynchronously create the ServiceInstance + + :param friendly_name: The human-readable name of this service, limited to 256 characters. Optional. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ServiceInstance]: + """ + Streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ServiceInstance]: + """ + Asynchronously streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Asynchronously lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Asynchronously retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + def get_page(self, target_url: str) -> ServicePage: + """ + Retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ServicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ServicePage: + """ + Asynchronously retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ServicePage(self._version, response) + + def get(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return ServiceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return ServiceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29ac49e3766993d96825607a60ad9dabf53a28e5 GIT binary patch literal 27387 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 CA0w3j literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/__pycache__/binding.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/__pycache__/binding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..012bd94662293cb5b6a5fc8c7b12a3cd54761c36 GIT binary patch literal 26133 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 sG&rTFlGcEkHub zI$n~6#Je_mEOPButv9umMZqZ`FXR2QcK&Qq`4P>^RhsI`*19T{s^s5zh09)kKQb!_TpqWQ3H4GJ@@o|^?BTL&b|CgZEcjp^NpXpIQS<=Iqu)7;5-34Gy6kiu5&Wi z&&j;(OY<4NpXVv>Px~_det$;j7cznVKqlB9%!K+wnQ(tN6X}mI93dUe)b!V6V*N2z z4y0={b^UcLA57P08u}YpK9pXRY3y%g`Ea@^)7;<8b3X1MCr2)Ga#X3i>9@wyznDR5 z0F5clE_4Zl)&g3mG`P^EBlYnHsl;N0D+S9BKx(H2Z}b92Zh?9*OE!r>zF8xxqkqr0{#NUs!1jZ!itnomt&^^v2w{| zC*|x$EO4jWZgPyhY@ynCXxwU&kZHImzCa0ec-m=K6sZsEuY-R&YAw?RHLd2v4)N(+ z_PnC$lA-3Zx>ZFhh`+|5BIbwBq}7yo!ooiOOy3Ey``Dp`)kg1gC!XoD7d$QL>?LW~ z$d#?S_*`De;vMmz^(k^%g7q?J7m(y(hoy9SBoX~DqLw&shGl$VL(M4hkm>Kvj+jD^nlen`h^iZA__;hyO-h@AlUZcU z@F9apBBzbak1FAqbXG}Olx(FzyD;02%-6wa3fIqr*?f$kc@VTu@w)^qL^#>61Y|)8 zDj_92;A_QOazF_U1g~%dyd1n7>yOAGlznpevd|yB!d>M1Yx=l Vbu(hN1F=B2FR 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 sV=Q*_Y3T)r__TPw "BindingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: BindingContext for this BindingInstance + """ + if self._context is None: + self._context = BindingContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "BindingInstance": + """ + Fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "BindingInstance": + """ + Asynchronous coroutine to fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BindingContext(InstanceContext): + + def __init__(self, version: Version, chat_service_sid: str, sid: str): + """ + Initialize the BindingContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Binding resource is associated with. + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "sid": sid, + } + self._uri = "/Services/{chat_service_sid}/Bindings/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> BindingInstance: + """ + Fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return BindingInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> BindingInstance: + """ + Asynchronous coroutine to fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return BindingInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BindingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> BindingInstance: + """ + Build an instance of BindingInstance + + :param payload: Payload response from the API + """ + return BindingInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class BindingList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the BindingList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Binding resource is associated with. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._uri = "/Services/{chat_service_sid}/Bindings".format(**self._solution) + + def stream( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[BindingInstance]: + """ + Streams BindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["BindingInstance.BindingType"] binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param List[str] identity: The identity of a [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource) this binding belongs to. See [access tokens](https://www.twilio.com/docs/conversations/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + binding_type=binding_type, identity=identity, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[BindingInstance]: + """ + Asynchronously streams BindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["BindingInstance.BindingType"] binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param List[str] identity: The identity of a [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource) this binding belongs to. See [access tokens](https://www.twilio.com/docs/conversations/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + binding_type=binding_type, identity=identity, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BindingInstance]: + """ + Lists BindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["BindingInstance.BindingType"] binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param List[str] identity: The identity of a [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource) this binding belongs to. See [access tokens](https://www.twilio.com/docs/conversations/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + binding_type=binding_type, + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BindingInstance]: + """ + Asynchronously lists BindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["BindingInstance.BindingType"] binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param List[str] identity: The identity of a [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource) this binding belongs to. See [access tokens](https://www.twilio.com/docs/conversations/create-tokens) for more details. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + binding_type=binding_type, + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BindingPage: + """ + Retrieve a single page of BindingInstance records from the API. + Request is executed immediately + + :param binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param identity: The identity of a [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource) this binding belongs to. See [access tokens](https://www.twilio.com/docs/conversations/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BindingInstance + """ + data = values.of( + { + "BindingType": serialize.map(binding_type, lambda e: e), + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BindingPage(self._version, response, self._solution) + + async def page_async( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BindingPage: + """ + Asynchronously retrieve a single page of BindingInstance records from the API. + Request is executed immediately + + :param binding_type: The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + :param identity: The identity of a [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource) this binding belongs to. See [access tokens](https://www.twilio.com/docs/conversations/create-tokens) for more details. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BindingInstance + """ + data = values.of( + { + "BindingType": serialize.map(binding_type, lambda e: e), + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BindingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> BindingPage: + """ + Retrieve a specific page of BindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BindingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return BindingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> BindingPage: + """ + Asynchronously retrieve a specific page of BindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BindingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return BindingPage(self._version, response, self._solution) + + def get(self, sid: str) -> BindingContext: + """ + Constructs a BindingContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return BindingContext( + self._version, chat_service_sid=self._solution["chat_service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> BindingContext: + """ + Constructs a BindingContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return BindingContext( + self._version, chat_service_sid=self._solution["chat_service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/__init__.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/__init__.py new file mode 100644 index 00000000..e37c8888 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/__init__.py @@ -0,0 +1,375 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.conversations.v1.service.configuration.notification import ( + NotificationList, +) +from twilio.rest.conversations.v1.service.configuration.webhook import WebhookList + + +class ConfigurationInstance(InstanceResource): + """ + :ivar chat_service_sid: The unique string that we created to identify the Service configuration resource. + :ivar default_conversation_creator_role_sid: The conversation-level role assigned to a conversation creator when they join a new conversation. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :ivar default_conversation_role_sid: The conversation-level role assigned to users when they are added to a conversation. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :ivar default_chat_service_role_sid: The service-level role assigned to users when they are added to the service. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :ivar url: An absolute API resource URL for this service configuration. + :ivar links: Contains an absolute API resource URL to access the push notifications configuration of this service. + :ivar reachability_enabled: Whether the [Reachability Indicator](https://www.twilio.com/docs/conversations/reachability) is enabled for this Conversations Service. The default is `false`. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], chat_service_sid: str + ): + super().__init__(version) + + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.default_conversation_creator_role_sid: Optional[str] = payload.get( + "default_conversation_creator_role_sid" + ) + self.default_conversation_role_sid: Optional[str] = payload.get( + "default_conversation_role_sid" + ) + self.default_chat_service_role_sid: Optional[str] = payload.get( + "default_chat_service_role_sid" + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + self.reachability_enabled: Optional[bool] = payload.get("reachability_enabled") + + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._context: Optional[ConfigurationContext] = None + + @property + def _proxy(self) -> "ConfigurationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ConfigurationContext for this ConfigurationInstance + """ + if self._context is None: + self._context = ConfigurationContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + ) + return self._context + + def fetch(self) -> "ConfigurationInstance": + """ + Fetch the ConfigurationInstance + + + :returns: The fetched ConfigurationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ConfigurationInstance": + """ + Asynchronous coroutine to fetch the ConfigurationInstance + + + :returns: The fetched ConfigurationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + default_conversation_creator_role_sid: Union[str, object] = values.unset, + default_conversation_role_sid: Union[str, object] = values.unset, + default_chat_service_role_sid: Union[str, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + ) -> "ConfigurationInstance": + """ + Update the ConfigurationInstance + + :param default_conversation_creator_role_sid: The conversation-level role assigned to a conversation creator when they join a new conversation. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param default_conversation_role_sid: The conversation-level role assigned to users when they are added to a conversation. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param default_chat_service_role_sid: The service-level role assigned to users when they are added to the service. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param reachability_enabled: Whether the [Reachability Indicator](https://www.twilio.com/docs/conversations/reachability) is enabled for this Conversations Service. The default is `false`. + + :returns: The updated ConfigurationInstance + """ + return self._proxy.update( + default_conversation_creator_role_sid=default_conversation_creator_role_sid, + default_conversation_role_sid=default_conversation_role_sid, + default_chat_service_role_sid=default_chat_service_role_sid, + reachability_enabled=reachability_enabled, + ) + + async def update_async( + self, + default_conversation_creator_role_sid: Union[str, object] = values.unset, + default_conversation_role_sid: Union[str, object] = values.unset, + default_chat_service_role_sid: Union[str, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + ) -> "ConfigurationInstance": + """ + Asynchronous coroutine to update the ConfigurationInstance + + :param default_conversation_creator_role_sid: The conversation-level role assigned to a conversation creator when they join a new conversation. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param default_conversation_role_sid: The conversation-level role assigned to users when they are added to a conversation. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param default_chat_service_role_sid: The service-level role assigned to users when they are added to the service. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param reachability_enabled: Whether the [Reachability Indicator](https://www.twilio.com/docs/conversations/reachability) is enabled for this Conversations Service. The default is `false`. + + :returns: The updated ConfigurationInstance + """ + return await self._proxy.update_async( + default_conversation_creator_role_sid=default_conversation_creator_role_sid, + default_conversation_role_sid=default_conversation_role_sid, + default_chat_service_role_sid=default_chat_service_role_sid, + reachability_enabled=reachability_enabled, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConfigurationContext(InstanceContext): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the ConfigurationContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the Service configuration resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._uri = "/Services/{chat_service_sid}/Configuration".format( + **self._solution + ) + + def fetch(self) -> ConfigurationInstance: + """ + Fetch the ConfigurationInstance + + + :returns: The fetched ConfigurationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ConfigurationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + ) + + async def fetch_async(self) -> ConfigurationInstance: + """ + Asynchronous coroutine to fetch the ConfigurationInstance + + + :returns: The fetched ConfigurationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ConfigurationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + ) + + def update( + self, + default_conversation_creator_role_sid: Union[str, object] = values.unset, + default_conversation_role_sid: Union[str, object] = values.unset, + default_chat_service_role_sid: Union[str, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + ) -> ConfigurationInstance: + """ + Update the ConfigurationInstance + + :param default_conversation_creator_role_sid: The conversation-level role assigned to a conversation creator when they join a new conversation. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param default_conversation_role_sid: The conversation-level role assigned to users when they are added to a conversation. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param default_chat_service_role_sid: The service-level role assigned to users when they are added to the service. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param reachability_enabled: Whether the [Reachability Indicator](https://www.twilio.com/docs/conversations/reachability) is enabled for this Conversations Service. The default is `false`. + + :returns: The updated ConfigurationInstance + """ + + data = values.of( + { + "DefaultConversationCreatorRoleSid": default_conversation_creator_role_sid, + "DefaultConversationRoleSid": default_conversation_role_sid, + "DefaultChatServiceRoleSid": default_chat_service_role_sid, + "ReachabilityEnabled": serialize.boolean_to_string( + reachability_enabled + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConfigurationInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + async def update_async( + self, + default_conversation_creator_role_sid: Union[str, object] = values.unset, + default_conversation_role_sid: Union[str, object] = values.unset, + default_chat_service_role_sid: Union[str, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + ) -> ConfigurationInstance: + """ + Asynchronous coroutine to update the ConfigurationInstance + + :param default_conversation_creator_role_sid: The conversation-level role assigned to a conversation creator when they join a new conversation. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param default_conversation_role_sid: The conversation-level role assigned to users when they are added to a conversation. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param default_chat_service_role_sid: The service-level role assigned to users when they are added to the service. See [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + :param reachability_enabled: Whether the [Reachability Indicator](https://www.twilio.com/docs/conversations/reachability) is enabled for this Conversations Service. The default is `false`. + + :returns: The updated ConfigurationInstance + """ + + data = values.of( + { + "DefaultConversationCreatorRoleSid": default_conversation_creator_role_sid, + "DefaultConversationRoleSid": default_conversation_role_sid, + "DefaultChatServiceRoleSid": default_chat_service_role_sid, + "ReachabilityEnabled": serialize.boolean_to_string( + reachability_enabled + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConfigurationInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConfigurationList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the ConfigurationList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the Service configuration resource to fetch. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + + self._notifications: Optional[NotificationList] = None + self._webhooks: Optional[WebhookList] = None + + @property + def notifications(self) -> NotificationList: + """ + Access the notifications + """ + if self._notifications is None: + self._notifications = NotificationList( + self._version, chat_service_sid=self._solution["chat_service_sid"] + ) + return self._notifications + + @property + def webhooks(self) -> WebhookList: + """ + Access the webhooks + """ + if self._webhooks is None: + self._webhooks = WebhookList( + self._version, chat_service_sid=self._solution["chat_service_sid"] + ) + return self._webhooks + + def get(self) -> ConfigurationContext: + """ + Constructs a ConfigurationContext + + """ + return ConfigurationContext( + self._version, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __call__(self) -> ConfigurationContext: + """ + Constructs a ConfigurationContext + + """ + return ConfigurationContext( + self._version, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..634318069f4af2dd9b6fe8426084b2b25b550544 GIT binary patch literal 16328 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/notification.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/notification.py new file mode 100644 index 00000000..6aced281 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/notification.py @@ -0,0 +1,463 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class NotificationInstance(InstanceResource): + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this configuration. + :ivar chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Configuration applies to. + :ivar new_message: The Push Notification configuration for New Messages. + :ivar added_to_conversation: The Push Notification configuration for being added to a Conversation. + :ivar removed_from_conversation: The Push Notification configuration for being removed from a Conversation. + :ivar log_enabled: Weather the notification logging is enabled. + :ivar url: An absolute API resource URL for this configuration. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], chat_service_sid: str + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.new_message: Optional[Dict[str, object]] = payload.get("new_message") + self.added_to_conversation: Optional[Dict[str, object]] = payload.get( + "added_to_conversation" + ) + self.removed_from_conversation: Optional[Dict[str, object]] = payload.get( + "removed_from_conversation" + ) + self.log_enabled: Optional[bool] = payload.get("log_enabled") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._context: Optional[NotificationContext] = None + + @property + def _proxy(self) -> "NotificationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: NotificationContext for this NotificationInstance + """ + if self._context is None: + self._context = NotificationContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + ) + return self._context + + def fetch(self) -> "NotificationInstance": + """ + Fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "NotificationInstance": + """ + Asynchronous coroutine to fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + log_enabled: Union[bool, object] = values.unset, + new_message_enabled: Union[bool, object] = values.unset, + new_message_template: Union[str, object] = values.unset, + new_message_sound: Union[str, object] = values.unset, + new_message_badge_count_enabled: Union[bool, object] = values.unset, + added_to_conversation_enabled: Union[bool, object] = values.unset, + added_to_conversation_template: Union[str, object] = values.unset, + added_to_conversation_sound: Union[str, object] = values.unset, + removed_from_conversation_enabled: Union[bool, object] = values.unset, + removed_from_conversation_template: Union[str, object] = values.unset, + removed_from_conversation_sound: Union[str, object] = values.unset, + new_message_with_media_enabled: Union[bool, object] = values.unset, + new_message_with_media_template: Union[str, object] = values.unset, + ) -> "NotificationInstance": + """ + Update the NotificationInstance + + :param log_enabled: Weather the notification logging is enabled. + :param new_message_enabled: Whether to send a notification when a new message is added to a conversation. The default is `false`. + :param new_message_template: The template to use to create the notification text displayed when a new message is added to a conversation and `new_message.enabled` is `true`. + :param new_message_sound: The name of the sound to play when a new message is added to a conversation and `new_message.enabled` is `true`. + :param new_message_badge_count_enabled: Whether the new message badge is enabled. The default is `false`. + :param added_to_conversation_enabled: Whether to send a notification when a participant is added to a conversation. The default is `false`. + :param added_to_conversation_template: The template to use to create the notification text displayed when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + :param added_to_conversation_sound: The name of the sound to play when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + :param removed_from_conversation_enabled: Whether to send a notification to a user when they are removed from a conversation. The default is `false`. + :param removed_from_conversation_template: The template to use to create the notification text displayed to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + :param removed_from_conversation_sound: The name of the sound to play to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + :param new_message_with_media_enabled: Whether to send a notification when a new message with media/file attachments is added to a conversation. The default is `false`. + :param new_message_with_media_template: The template to use to create the notification text displayed when a new message with media/file attachments is added to a conversation and `new_message.attachments.enabled` is `true`. + + :returns: The updated NotificationInstance + """ + return self._proxy.update( + log_enabled=log_enabled, + new_message_enabled=new_message_enabled, + new_message_template=new_message_template, + new_message_sound=new_message_sound, + new_message_badge_count_enabled=new_message_badge_count_enabled, + added_to_conversation_enabled=added_to_conversation_enabled, + added_to_conversation_template=added_to_conversation_template, + added_to_conversation_sound=added_to_conversation_sound, + removed_from_conversation_enabled=removed_from_conversation_enabled, + removed_from_conversation_template=removed_from_conversation_template, + removed_from_conversation_sound=removed_from_conversation_sound, + new_message_with_media_enabled=new_message_with_media_enabled, + new_message_with_media_template=new_message_with_media_template, + ) + + async def update_async( + self, + log_enabled: Union[bool, object] = values.unset, + new_message_enabled: Union[bool, object] = values.unset, + new_message_template: Union[str, object] = values.unset, + new_message_sound: Union[str, object] = values.unset, + new_message_badge_count_enabled: Union[bool, object] = values.unset, + added_to_conversation_enabled: Union[bool, object] = values.unset, + added_to_conversation_template: Union[str, object] = values.unset, + added_to_conversation_sound: Union[str, object] = values.unset, + removed_from_conversation_enabled: Union[bool, object] = values.unset, + removed_from_conversation_template: Union[str, object] = values.unset, + removed_from_conversation_sound: Union[str, object] = values.unset, + new_message_with_media_enabled: Union[bool, object] = values.unset, + new_message_with_media_template: Union[str, object] = values.unset, + ) -> "NotificationInstance": + """ + Asynchronous coroutine to update the NotificationInstance + + :param log_enabled: Weather the notification logging is enabled. + :param new_message_enabled: Whether to send a notification when a new message is added to a conversation. The default is `false`. + :param new_message_template: The template to use to create the notification text displayed when a new message is added to a conversation and `new_message.enabled` is `true`. + :param new_message_sound: The name of the sound to play when a new message is added to a conversation and `new_message.enabled` is `true`. + :param new_message_badge_count_enabled: Whether the new message badge is enabled. The default is `false`. + :param added_to_conversation_enabled: Whether to send a notification when a participant is added to a conversation. The default is `false`. + :param added_to_conversation_template: The template to use to create the notification text displayed when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + :param added_to_conversation_sound: The name of the sound to play when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + :param removed_from_conversation_enabled: Whether to send a notification to a user when they are removed from a conversation. The default is `false`. + :param removed_from_conversation_template: The template to use to create the notification text displayed to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + :param removed_from_conversation_sound: The name of the sound to play to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + :param new_message_with_media_enabled: Whether to send a notification when a new message with media/file attachments is added to a conversation. The default is `false`. + :param new_message_with_media_template: The template to use to create the notification text displayed when a new message with media/file attachments is added to a conversation and `new_message.attachments.enabled` is `true`. + + :returns: The updated NotificationInstance + """ + return await self._proxy.update_async( + log_enabled=log_enabled, + new_message_enabled=new_message_enabled, + new_message_template=new_message_template, + new_message_sound=new_message_sound, + new_message_badge_count_enabled=new_message_badge_count_enabled, + added_to_conversation_enabled=added_to_conversation_enabled, + added_to_conversation_template=added_to_conversation_template, + added_to_conversation_sound=added_to_conversation_sound, + removed_from_conversation_enabled=removed_from_conversation_enabled, + removed_from_conversation_template=removed_from_conversation_template, + removed_from_conversation_sound=removed_from_conversation_sound, + new_message_with_media_enabled=new_message_with_media_enabled, + new_message_with_media_template=new_message_with_media_template, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NotificationContext(InstanceContext): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the NotificationContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Configuration applies to. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._uri = "/Services/{chat_service_sid}/Configuration/Notifications".format( + **self._solution + ) + + def fetch(self) -> NotificationInstance: + """ + Fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return NotificationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + ) + + async def fetch_async(self) -> NotificationInstance: + """ + Asynchronous coroutine to fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return NotificationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + ) + + def update( + self, + log_enabled: Union[bool, object] = values.unset, + new_message_enabled: Union[bool, object] = values.unset, + new_message_template: Union[str, object] = values.unset, + new_message_sound: Union[str, object] = values.unset, + new_message_badge_count_enabled: Union[bool, object] = values.unset, + added_to_conversation_enabled: Union[bool, object] = values.unset, + added_to_conversation_template: Union[str, object] = values.unset, + added_to_conversation_sound: Union[str, object] = values.unset, + removed_from_conversation_enabled: Union[bool, object] = values.unset, + removed_from_conversation_template: Union[str, object] = values.unset, + removed_from_conversation_sound: Union[str, object] = values.unset, + new_message_with_media_enabled: Union[bool, object] = values.unset, + new_message_with_media_template: Union[str, object] = values.unset, + ) -> NotificationInstance: + """ + Update the NotificationInstance + + :param log_enabled: Weather the notification logging is enabled. + :param new_message_enabled: Whether to send a notification when a new message is added to a conversation. The default is `false`. + :param new_message_template: The template to use to create the notification text displayed when a new message is added to a conversation and `new_message.enabled` is `true`. + :param new_message_sound: The name of the sound to play when a new message is added to a conversation and `new_message.enabled` is `true`. + :param new_message_badge_count_enabled: Whether the new message badge is enabled. The default is `false`. + :param added_to_conversation_enabled: Whether to send a notification when a participant is added to a conversation. The default is `false`. + :param added_to_conversation_template: The template to use to create the notification text displayed when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + :param added_to_conversation_sound: The name of the sound to play when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + :param removed_from_conversation_enabled: Whether to send a notification to a user when they are removed from a conversation. The default is `false`. + :param removed_from_conversation_template: The template to use to create the notification text displayed to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + :param removed_from_conversation_sound: The name of the sound to play to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + :param new_message_with_media_enabled: Whether to send a notification when a new message with media/file attachments is added to a conversation. The default is `false`. + :param new_message_with_media_template: The template to use to create the notification text displayed when a new message with media/file attachments is added to a conversation and `new_message.attachments.enabled` is `true`. + + :returns: The updated NotificationInstance + """ + + data = values.of( + { + "LogEnabled": serialize.boolean_to_string(log_enabled), + "NewMessage.Enabled": serialize.boolean_to_string(new_message_enabled), + "NewMessage.Template": new_message_template, + "NewMessage.Sound": new_message_sound, + "NewMessage.BadgeCountEnabled": serialize.boolean_to_string( + new_message_badge_count_enabled + ), + "AddedToConversation.Enabled": serialize.boolean_to_string( + added_to_conversation_enabled + ), + "AddedToConversation.Template": added_to_conversation_template, + "AddedToConversation.Sound": added_to_conversation_sound, + "RemovedFromConversation.Enabled": serialize.boolean_to_string( + removed_from_conversation_enabled + ), + "RemovedFromConversation.Template": removed_from_conversation_template, + "RemovedFromConversation.Sound": removed_from_conversation_sound, + "NewMessage.WithMedia.Enabled": serialize.boolean_to_string( + new_message_with_media_enabled + ), + "NewMessage.WithMedia.Template": new_message_with_media_template, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return NotificationInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + async def update_async( + self, + log_enabled: Union[bool, object] = values.unset, + new_message_enabled: Union[bool, object] = values.unset, + new_message_template: Union[str, object] = values.unset, + new_message_sound: Union[str, object] = values.unset, + new_message_badge_count_enabled: Union[bool, object] = values.unset, + added_to_conversation_enabled: Union[bool, object] = values.unset, + added_to_conversation_template: Union[str, object] = values.unset, + added_to_conversation_sound: Union[str, object] = values.unset, + removed_from_conversation_enabled: Union[bool, object] = values.unset, + removed_from_conversation_template: Union[str, object] = values.unset, + removed_from_conversation_sound: Union[str, object] = values.unset, + new_message_with_media_enabled: Union[bool, object] = values.unset, + new_message_with_media_template: Union[str, object] = values.unset, + ) -> NotificationInstance: + """ + Asynchronous coroutine to update the NotificationInstance + + :param log_enabled: Weather the notification logging is enabled. + :param new_message_enabled: Whether to send a notification when a new message is added to a conversation. The default is `false`. + :param new_message_template: The template to use to create the notification text displayed when a new message is added to a conversation and `new_message.enabled` is `true`. + :param new_message_sound: The name of the sound to play when a new message is added to a conversation and `new_message.enabled` is `true`. + :param new_message_badge_count_enabled: Whether the new message badge is enabled. The default is `false`. + :param added_to_conversation_enabled: Whether to send a notification when a participant is added to a conversation. The default is `false`. + :param added_to_conversation_template: The template to use to create the notification text displayed when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + :param added_to_conversation_sound: The name of the sound to play when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + :param removed_from_conversation_enabled: Whether to send a notification to a user when they are removed from a conversation. The default is `false`. + :param removed_from_conversation_template: The template to use to create the notification text displayed to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + :param removed_from_conversation_sound: The name of the sound to play to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + :param new_message_with_media_enabled: Whether to send a notification when a new message with media/file attachments is added to a conversation. The default is `false`. + :param new_message_with_media_template: The template to use to create the notification text displayed when a new message with media/file attachments is added to a conversation and `new_message.attachments.enabled` is `true`. + + :returns: The updated NotificationInstance + """ + + data = values.of( + { + "LogEnabled": serialize.boolean_to_string(log_enabled), + "NewMessage.Enabled": serialize.boolean_to_string(new_message_enabled), + "NewMessage.Template": new_message_template, + "NewMessage.Sound": new_message_sound, + "NewMessage.BadgeCountEnabled": serialize.boolean_to_string( + new_message_badge_count_enabled + ), + "AddedToConversation.Enabled": serialize.boolean_to_string( + added_to_conversation_enabled + ), + "AddedToConversation.Template": added_to_conversation_template, + "AddedToConversation.Sound": added_to_conversation_sound, + "RemovedFromConversation.Enabled": serialize.boolean_to_string( + removed_from_conversation_enabled + ), + "RemovedFromConversation.Template": removed_from_conversation_template, + "RemovedFromConversation.Sound": removed_from_conversation_sound, + "NewMessage.WithMedia.Enabled": serialize.boolean_to_string( + new_message_with_media_enabled + ), + "NewMessage.WithMedia.Template": new_message_with_media_template, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return NotificationInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NotificationList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the NotificationList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Configuration applies to. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + + def get(self) -> NotificationContext: + """ + Constructs a NotificationContext + + """ + return NotificationContext( + self._version, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __call__(self) -> NotificationContext: + """ + Constructs a NotificationContext + + """ + return NotificationContext( + self._version, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/webhook.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/webhook.py new file mode 100644 index 00000000..706f4105 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/configuration/webhook.py @@ -0,0 +1,340 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class WebhookInstance(InstanceResource): + + class Method(object): + GET = "GET" + POST = "POST" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this service. + :ivar chat_service_sid: The unique ID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) this conversation belongs to. + :ivar pre_webhook_url: The absolute url the pre-event webhook request should be sent to. + :ivar post_webhook_url: The absolute url the post-event webhook request should be sent to. + :ivar filters: The list of events that your configured webhook targets will receive. Events not configured here will not fire. Possible values are `onParticipantAdd`, `onParticipantAdded`, `onDeliveryUpdated`, `onConversationUpdated`, `onConversationRemove`, `onParticipantRemove`, `onConversationUpdate`, `onMessageAdd`, `onMessageRemoved`, `onParticipantUpdated`, `onConversationAdded`, `onMessageAdded`, `onConversationAdd`, `onConversationRemoved`, `onParticipantUpdate`, `onMessageRemove`, `onMessageUpdated`, `onParticipantRemoved`, `onMessageUpdate` or `onConversationStateUpdated`. + :ivar method: + :ivar url: An absolute API resource URL for this webhook. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], chat_service_sid: str + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.pre_webhook_url: Optional[str] = payload.get("pre_webhook_url") + self.post_webhook_url: Optional[str] = payload.get("post_webhook_url") + self.filters: Optional[List[str]] = payload.get("filters") + self.method: Optional["WebhookInstance.Method"] = payload.get("method") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._context: Optional[WebhookContext] = None + + @property + def _proxy(self) -> "WebhookContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: WebhookContext for this WebhookInstance + """ + if self._context is None: + self._context = WebhookContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + ) + return self._context + + def fetch(self) -> "WebhookInstance": + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "WebhookInstance": + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + filters: Union[List[str], object] = values.unset, + method: Union[str, object] = values.unset, + ) -> "WebhookInstance": + """ + Update the WebhookInstance + + :param pre_webhook_url: The absolute url the pre-event webhook request should be sent to. + :param post_webhook_url: The absolute url the post-event webhook request should be sent to. + :param filters: The list of events that your configured webhook targets will receive. Events not configured here will not fire. Possible values are `onParticipantAdd`, `onParticipantAdded`, `onDeliveryUpdated`, `onConversationUpdated`, `onConversationRemove`, `onParticipantRemove`, `onConversationUpdate`, `onMessageAdd`, `onMessageRemoved`, `onParticipantUpdated`, `onConversationAdded`, `onMessageAdded`, `onConversationAdd`, `onConversationRemoved`, `onParticipantUpdate`, `onMessageRemove`, `onMessageUpdated`, `onParticipantRemoved`, `onMessageUpdate` or `onConversationStateUpdated`. + :param method: The HTTP method to be used when sending a webhook request. One of `GET` or `POST`. + + :returns: The updated WebhookInstance + """ + return self._proxy.update( + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + filters=filters, + method=method, + ) + + async def update_async( + self, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + filters: Union[List[str], object] = values.unset, + method: Union[str, object] = values.unset, + ) -> "WebhookInstance": + """ + Asynchronous coroutine to update the WebhookInstance + + :param pre_webhook_url: The absolute url the pre-event webhook request should be sent to. + :param post_webhook_url: The absolute url the post-event webhook request should be sent to. + :param filters: The list of events that your configured webhook targets will receive. Events not configured here will not fire. Possible values are `onParticipantAdd`, `onParticipantAdded`, `onDeliveryUpdated`, `onConversationUpdated`, `onConversationRemove`, `onParticipantRemove`, `onConversationUpdate`, `onMessageAdd`, `onMessageRemoved`, `onParticipantUpdated`, `onConversationAdded`, `onMessageAdded`, `onConversationAdd`, `onConversationRemoved`, `onParticipantUpdate`, `onMessageRemove`, `onMessageUpdated`, `onParticipantRemoved`, `onMessageUpdate` or `onConversationStateUpdated`. + :param method: The HTTP method to be used when sending a webhook request. One of `GET` or `POST`. + + :returns: The updated WebhookInstance + """ + return await self._proxy.update_async( + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + filters=filters, + method=method, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebhookContext(InstanceContext): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the WebhookContext + + :param version: Version that contains the resource + :param chat_service_sid: The unique ID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) this conversation belongs to. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._uri = "/Services/{chat_service_sid}/Configuration/Webhooks".format( + **self._solution + ) + + def fetch(self) -> WebhookInstance: + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return WebhookInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + ) + + async def fetch_async(self) -> WebhookInstance: + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + ) + + def update( + self, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + filters: Union[List[str], object] = values.unset, + method: Union[str, object] = values.unset, + ) -> WebhookInstance: + """ + Update the WebhookInstance + + :param pre_webhook_url: The absolute url the pre-event webhook request should be sent to. + :param post_webhook_url: The absolute url the post-event webhook request should be sent to. + :param filters: The list of events that your configured webhook targets will receive. Events not configured here will not fire. Possible values are `onParticipantAdd`, `onParticipantAdded`, `onDeliveryUpdated`, `onConversationUpdated`, `onConversationRemove`, `onParticipantRemove`, `onConversationUpdate`, `onMessageAdd`, `onMessageRemoved`, `onParticipantUpdated`, `onConversationAdded`, `onMessageAdded`, `onConversationAdd`, `onConversationRemoved`, `onParticipantUpdate`, `onMessageRemove`, `onMessageUpdated`, `onParticipantRemoved`, `onMessageUpdate` or `onConversationStateUpdated`. + :param method: The HTTP method to be used when sending a webhook request. One of `GET` or `POST`. + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "Filters": serialize.map(filters, lambda e: e), + "Method": method, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + async def update_async( + self, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + filters: Union[List[str], object] = values.unset, + method: Union[str, object] = values.unset, + ) -> WebhookInstance: + """ + Asynchronous coroutine to update the WebhookInstance + + :param pre_webhook_url: The absolute url the pre-event webhook request should be sent to. + :param post_webhook_url: The absolute url the post-event webhook request should be sent to. + :param filters: The list of events that your configured webhook targets will receive. Events not configured here will not fire. Possible values are `onParticipantAdd`, `onParticipantAdded`, `onDeliveryUpdated`, `onConversationUpdated`, `onConversationRemove`, `onParticipantRemove`, `onConversationUpdate`, `onMessageAdd`, `onMessageRemoved`, `onParticipantUpdated`, `onConversationAdded`, `onMessageAdded`, `onConversationAdd`, `onConversationRemoved`, `onParticipantUpdate`, `onMessageRemove`, `onMessageUpdated`, `onParticipantRemoved`, `onMessageUpdate` or `onConversationStateUpdated`. + :param method: The HTTP method to be used when sending a webhook request. One of `GET` or `POST`. + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "Filters": serialize.map(filters, lambda e: e), + "Method": method, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebhookList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the WebhookList + + :param version: Version that contains the resource + :param chat_service_sid: The unique ID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) this conversation belongs to. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + + def get(self) -> WebhookContext: + """ + Constructs a WebhookContext + + """ + return WebhookContext( + self._version, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __call__(self) -> WebhookContext: + """ + Constructs a WebhookContext + + """ + return WebhookContext( + self._version, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__init__.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__init__.py new file mode 100644 index 00000000..0f28c4df --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__init__.py @@ -0,0 +1,1069 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.conversations.v1.service.conversation.message import MessageList +from twilio.rest.conversations.v1.service.conversation.participant import ( + ParticipantList, +) +from twilio.rest.conversations.v1.service.conversation.webhook import WebhookList + + +class ConversationInstance(InstanceResource): + + class State(object): + INACTIVE = "inactive" + ACTIVE = "active" + CLOSED = "closed" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this conversation. + :ivar chat_service_sid: The unique ID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) this conversation belongs to. + :ivar messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :ivar unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :ivar attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \"{}\" will be returned. + :ivar state: + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. + :ivar timers: Timer date values representing state update for this conversation. + :ivar url: An absolute API resource URL for this conversation. + :ivar links: Contains absolute URLs to access the [participants](https://www.twilio.com/docs/conversations/api/conversation-participant-resource), [messages](https://www.twilio.com/docs/conversations/api/conversation-message-resource) and [webhooks](https://www.twilio.com/docs/conversations/api/conversation-scoped-webhook-resource) of this conversation. + :ivar bindings: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + chat_service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.unique_name: Optional[str] = payload.get("unique_name") + self.attributes: Optional[str] = payload.get("attributes") + self.state: Optional["ConversationInstance.State"] = payload.get("state") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.timers: Optional[Dict[str, object]] = payload.get("timers") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + self.bindings: Optional[Dict[str, object]] = payload.get("bindings") + + self._solution = { + "chat_service_sid": chat_service_sid, + "sid": sid or self.sid, + } + self._context: Optional[ConversationContext] = None + + @property + def _proxy(self) -> "ConversationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ConversationContext for this ConversationInstance + """ + if self._context is None: + self._context = ConversationContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "ConversationInstance": + """ + Fetch the ConversationInstance + + + :returns: The fetched ConversationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ConversationInstance": + """ + Asynchronous coroutine to fetch the ConversationInstance + + + :returns: The fetched ConversationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> "ConversationInstance": + """ + Update the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The updated ConversationInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + messaging_service_sid=messaging_service_sid, + state=state, + timers_inactive=timers_inactive, + timers_closed=timers_closed, + unique_name=unique_name, + bindings_email_address=bindings_email_address, + bindings_email_name=bindings_email_name, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> "ConversationInstance": + """ + Asynchronous coroutine to update the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The updated ConversationInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + messaging_service_sid=messaging_service_sid, + state=state, + timers_inactive=timers_inactive, + timers_closed=timers_closed, + unique_name=unique_name, + bindings_email_address=bindings_email_address, + bindings_email_name=bindings_email_name, + ) + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + return self._proxy.messages + + @property + def participants(self) -> ParticipantList: + """ + Access the participants + """ + return self._proxy.participants + + @property + def webhooks(self) -> WebhookList: + """ + Access the webhooks + """ + return self._proxy.webhooks + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConversationContext(InstanceContext): + + def __init__(self, version: Version, chat_service_sid: str, sid: str): + """ + Initialize the ConversationContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Conversation resource is associated with. + :param sid: A 34 character string that uniquely identifies this resource. Can also be the `unique_name` of the Conversation. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "sid": sid, + } + self._uri = "/Services/{chat_service_sid}/Conversations/{sid}".format( + **self._solution + ) + + self._messages: Optional[MessageList] = None + self._participants: Optional[ParticipantList] = None + self._webhooks: Optional[WebhookList] = None + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ConversationInstance: + """ + Fetch the ConversationInstance + + + :returns: The fetched ConversationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ConversationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ConversationInstance: + """ + Asynchronous coroutine to fetch the ConversationInstance + + + :returns: The fetched ConversationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ConversationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> ConversationInstance: + """ + Update the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The updated ConversationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MessagingServiceSid": messaging_service_sid, + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "UniqueName": unique_name, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> ConversationInstance: + """ + Asynchronous coroutine to update the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The updated ConversationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MessagingServiceSid": messaging_service_sid, + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "UniqueName": unique_name, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + if self._messages is None: + self._messages = MessageList( + self._version, + self._solution["chat_service_sid"], + self._solution["sid"], + ) + return self._messages + + @property + def participants(self) -> ParticipantList: + """ + Access the participants + """ + if self._participants is None: + self._participants = ParticipantList( + self._version, + self._solution["chat_service_sid"], + self._solution["sid"], + ) + return self._participants + + @property + def webhooks(self) -> WebhookList: + """ + Access the webhooks + """ + if self._webhooks is None: + self._webhooks = WebhookList( + self._version, + self._solution["chat_service_sid"], + self._solution["sid"], + ) + return self._webhooks + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConversationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ConversationInstance: + """ + Build an instance of ConversationInstance + + :param payload: Payload response from the API + """ + return ConversationInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ConversationList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the ConversationList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Conversation resource is associated with. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._uri = "/Services/{chat_service_sid}/Conversations".format( + **self._solution + ) + + def create( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> ConversationInstance: + """ + Create the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The created ConversationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "MessagingServiceSid": messaging_service_sid, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + ) -> ConversationInstance: + """ + Asynchronously create the ConversationInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + + :returns: The created ConversationInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "MessagingServiceSid": messaging_service_sid, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def stream( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ConversationInstance]: + """ + Streams ConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param str end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param "ConversationInstance.State" state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + start_date=start_date, + end_date=end_date, + state=state, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ConversationInstance]: + """ + Asynchronously streams ConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param str end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param "ConversationInstance.State" state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + start_date=start_date, + end_date=end_date, + state=state, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConversationInstance]: + """ + Lists ConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param str end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param "ConversationInstance.State" state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + start_date=start_date, + end_date=end_date, + state=state, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConversationInstance]: + """ + Asynchronously lists ConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param str end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param "ConversationInstance.State" state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + start_date=start_date, + end_date=end_date, + state=state, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConversationPage: + """ + Retrieve a single page of ConversationInstance records from the API. + Request is executed immediately + + :param start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConversationInstance + """ + data = values.of( + { + "StartDate": start_date, + "EndDate": end_date, + "State": state, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConversationPage(self._version, response, self._solution) + + async def page_async( + self, + start_date: Union[str, object] = values.unset, + end_date: Union[str, object] = values.unset, + state: Union["ConversationInstance.State", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConversationPage: + """ + Asynchronously retrieve a single page of ConversationInstance records from the API. + Request is executed immediately + + :param start_date: Specifies the beginning of the date range for filtering Conversations based on their creation date. Conversations that were created on or after this date will be included in the results. The date must be in ISO8601 format, specifically starting at the beginning of the specified date (YYYY-MM-DDT00:00:00Z), for precise filtering. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param end_date: Defines the end of the date range for filtering conversations by their creation date. Only conversations that were created on or before this date will appear in the results. The date must be in ISO8601 format, specifically capturing up to the end of the specified date (YYYY-MM-DDT23:59:59Z), to ensure that conversations from the entire end day are included. This parameter can be combined with other filters. If this filter is used, the returned list is sorted by latest conversation creation date in descending order. + :param state: State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConversationInstance + """ + data = values.of( + { + "StartDate": start_date, + "EndDate": end_date, + "State": state, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConversationPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ConversationPage: + """ + Retrieve a specific page of ConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConversationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ConversationPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ConversationPage: + """ + Asynchronously retrieve a specific page of ConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConversationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ConversationPage(self._version, response, self._solution) + + def get(self, sid: str) -> ConversationContext: + """ + Constructs a ConversationContext + + :param sid: A 34 character string that uniquely identifies this resource. Can also be the `unique_name` of the Conversation. + """ + return ConversationContext( + self._version, chat_service_sid=self._solution["chat_service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ConversationContext: + """ + Constructs a ConversationContext + + :param sid: A 34 character string that uniquely identifies this resource. Can also be the `unique_name` of the Conversation. + """ + return ConversationContext( + self._version, chat_service_sid=self._solution["chat_service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50627e700d1f3569de600233ed7ae10722d18bcf GIT binary patch literal 50294 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__pycache__/participant.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__pycache__/participant.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1159bb1aa4d7c2136494855216fdb881c7a23b3d GIT binary patch literal 39411 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 S__@(@(vCp%6M=qNTmB!dh0d-3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__pycache__/webhook.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/__pycache__/webhook.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdce3e144695581868e22f0980e346b98bd23661 GIT binary patch literal 32310 zcmeHwdvp|6nqO7FyVX()wcZb0ylK!2FyIxBK_JYq2HECe&&YV%O?L?zy47-33oIeU zj!ibO@vI?}8N_6Ejpxi6OTn|o*(A1Sv#~vyB$KnrS@mdgr1Y_~Om=dz^GD8UM)-I} z`6s{c-m2=VRttm&Y@e6{-MV$(b?dv|_ucPt`>#t&eFCm;{`{HaZw&~--_e79Ikm{l zbwn-+F`-9@i7{J3Oo~0CNO60@mbCZSla3xo(%Iuox_VqmcaJ;i>G34JJziGEk?-F;eSUYB^FD$w4EvVXz_;jO0W? z@JYB19gnM0G!>Jj(-BoVCilroBrV6Jql1(k4u_@uKT4paFjZuC9?W^vN|}mKJ5((k zX1xwe(y;Ll$@GB#D8h5XVM<|-6i}DLN07o};cy$pv_^Pxo6&A~m{sOQwQ^{jH%WzQ zxOjY;0_yOH-mWB3AN;>w{)mrH)9H93o|0OmU8%lPvZ6-P@l>D6vuFnKKYd)5`Uj3C z;!)`kFMVM5!9!B#V|!b98{Ll{+TEc|cp{>*N|Awd$};QHqy2Ip>PUO|r${NSte4~I zbidls)|Ntcq(9!GeJNz8<>+x%q$?%$rP7idi>KLOqO6l-q;DXSNDQ|6eoZhG60@Ed zzHmC8ltb>Uy|ZsH>*$I{(^<#9xSGy-9_^=BizKqn!+nTkJ$usx5-BBH+NloqMfJy! zJzEl!RauEg67eB9>&-`9ry_{~Sw&ZYy?tsr(ifF6ZE5+rG?L2oqyw^=8c?D#()`r5 z>Dm1RrWllKM&%;vfVdiT#LHNg5tg_G}V!_%NxQhUHn`}40-N91rNOhP} zonFB!#Oh;C*%foiZrLMydu?@SIEHx4gFmnAlRcEu>pLg(idcxHJteX~))4cbbzIek z&{K-VS=MWdm7aC<1hjY=;^nc%SOE7$xR>KzAqP*a)+(89_bRp5i6vi!x3X(*RUuc! zg2q!N@~ZjU8EI8T(yA?Ol*EKyf2`)Lv!~`>jk|ce_wa3M@iw*iZXSHYI((`q6`jxkEgIsn|e*;{I^>Su9(gqtu`ir53@sFhkwWrgwE5 zIgACT9(iQ%-a|*aWc6e^)qmtvDjtD@>OK&)KH~Rp%W_ z6B3jM5EP#*dWE@@6|?s^2OS~j+zC4rQI5&!tXmsH)}2=3$BxNL)}^KgV)0aW$feL4 zRq83AA!Xf9?%w&;M<0D8>ppZ~@18xo4`f{j4;}8>`>4`LW!L~0Q$ZJRTv>t#8nL9$0O;mHfv!uPAR52Whr(fM_s6| zU≪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%0AA=J@rKe1r?S$=a769PZ|e|G!Ye zf2Dv)Vhq)9)}xzkn~vnyL@U&sm22q7V82T^;CW<$Ymju!Z_}#j+GW#?D{zVlF$`GW za7Q!_jIbzk^S+3|noHX*Zkr0O$OKp9{kR?P9D^@nLbC7jvb9Me-d`} zz%^OF-%_q?dbR0t(^TEMOr7aS2ELT*=}?AxI+Wp->pAB}zJ5r|(w%{A!x;F66iOJyJbDj?a_45-LGw2Yo zy@bD+_YoMoUBnBoVr=E70l30_^4$PHg9z9o*hA;pz*`W3F9B%MPm&RAD*v5=EP`yQ z29=uFHIHjQM6MMc%XG-owom#YHx{Vmd4Er^`G;tMZ=ouL`o$b|wq)vBrs^Kd)IB&= zw=+|>^ZkuKTQgaAcq({!UI-;V=?Pu@`e5f`@!yD@jgGfhBF28@$$}|~J7SpfI3ngf z5HOh;$dOA|@!iGkoeXghoXO2_+%fcmf$d-t331gxl=Rg4-U4YwPjkGRM+h3;hU_pw zpq3qYKmN5z9u1)y+aI?eZt+uo2nj>_&k5?E@+RhLW+QUI{=&h~IJxQ;$5sXN))ky- zHBa~F@>!Jsi5F1*j)GqyFuygO#f&4Pap?z#o8Co9Ksxk+>x&& zP3}T`CD}*NeI?6iBv;WD8%fC4-5rt&{Upgzk^4z*rWmuOJxwtW1u6yf0kU>T@wpcz z8N4cF1H_MZCVI~#tO`+eCQngFnyUOY1q>&!UDr?P@goYZQ?P>qf*<97Q}8SWMcu`J zL^%}v2)J1NK3<8ri&wxo)14D=duIc?O&mDGf4yXv=t)&Uoo@Q@&QGXsXsJTI%5u6>Ba$pYg7uig-3^*5Z5W{UL6uM^C6$b}p6i zE}rqy<3oCXIO5uH|G58#_W@^@c)hZ2 zblK>s(Y2Y%l{qJ+psnhL(G6Ezqgygnt8#9Z<`GaXINCeffQ@~Q)dW=es%A=9_QRrZ zue;bO`Y^aFSUPkc+d@YwV6e69N#&{6&giM|dA@)|+(!R_<^fIdT`cKJx7jHgKbN38 zMbo0~4mD=o;V=&T1yaJ=rC)Cx?1vDI9}Z9aB0o8TT)H{VVF-nANw!2gGWci&KSfGX zJ%t(g6OPI@n(|t8uXp{278P=(&NdY-0zRD`ajcL^Hd|*dlOXY~kzY>vL36(5(#X!r z$d;RPh|^}`Dvly|pejdw40|=wBM}28M#ceX{MT@|E5AV+u$rKrK#;SGqIkpR7abor z3gY6w74}UD`!d45zZEuRgiRj_4}Bzbd?c*@NLcleu;ixexJ~R9C#qN86j>wzA3QC&7-a=ar1@cHwD~owjXoiq4{Hh?rbdo4=U~mrT_o{ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/__init__.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/__init__.py new file mode 100644 index 00000000..c4123afd --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/__init__.py @@ -0,0 +1,943 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.conversations.v1.service.conversation.message.delivery_receipt import ( + DeliveryReceiptList, +) + + +class MessageInstance(InstanceResource): + + class OrderType(object): + ASC = "asc" + DESC = "desc" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this message. + :ivar chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Participant resource is associated with. + :ivar conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this message. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar index: The index of the message within the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource). + :ivar author: The channel specific identifier of the message's author. Defaults to `system`. + :ivar body: The content of the message, can be up to 1,600 characters long. + :ivar media: An array of objects that describe the Message's media, if the message contains media. Each object contains these fields: `content_type` with the MIME type of the media, `filename` with the name of the media, `sid` with the SID of the Media resource, and `size` with the media object's file size in bytes. If the Message has no media, this value is `null`. + :ivar attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \"{}\" will be returned. + :ivar participant_sid: The unique ID of messages's author participant. Null in case of `system` sent message. + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :ivar delivery: An object that contains the summary of delivery statuses for the message to non-chat participants. + :ivar url: An absolute API resource URL for this message. + :ivar links: Contains an absolute API resource URL to access the delivery & read receipts of this message. + :ivar content_sid: The unique ID of the multi-channel [Rich Content](https://www.twilio.com/docs/content) template. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + chat_service_sid: str, + conversation_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.conversation_sid: Optional[str] = payload.get("conversation_sid") + self.sid: Optional[str] = payload.get("sid") + self.index: Optional[int] = deserialize.integer(payload.get("index")) + self.author: Optional[str] = payload.get("author") + self.body: Optional[str] = payload.get("body") + self.media: Optional[List[Dict[str, object]]] = payload.get("media") + self.attributes: Optional[str] = payload.get("attributes") + self.participant_sid: Optional[str] = payload.get("participant_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.delivery: Optional[Dict[str, object]] = payload.get("delivery") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + self.content_sid: Optional[str] = payload.get("content_sid") + + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + "sid": sid or self.sid, + } + self._context: Optional[MessageContext] = None + + @property + def _proxy(self) -> "MessageContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MessageContext for this MessageInstance + """ + if self._context is None: + self._context = MessageContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "MessageInstance": + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MessageInstance": + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The updated MessageInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + author=author, + body=body, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + subject=subject, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Asynchronous coroutine to update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The updated MessageInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + author=author, + body=body, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + subject=subject, + ) + + @property + def delivery_receipts(self) -> DeliveryReceiptList: + """ + Access the delivery_receipts + """ + return self._proxy.delivery_receipts + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessageContext(InstanceContext): + + def __init__( + self, version: Version, chat_service_sid: str, conversation_sid: str, sid: str + ): + """ + Initialize the MessageContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Participant resource is associated with. + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this message. + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + "sid": sid, + } + self._uri = "/Services/{chat_service_sid}/Conversations/{conversation_sid}/Messages/{sid}".format( + **self._solution + ) + + self._delivery_receipts: Optional[DeliveryReceiptList] = None + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MessageInstance: + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MessageInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MessageInstance: + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MessageInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Author": author, + "Body": body, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "Subject": subject, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronous coroutine to update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Author": author, + "Body": body, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "Subject": subject, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + @property + def delivery_receipts(self) -> DeliveryReceiptList: + """ + Access the delivery_receipts + """ + if self._delivery_receipts is None: + self._delivery_receipts = DeliveryReceiptList( + self._version, + self._solution["chat_service_sid"], + self._solution["conversation_sid"], + self._solution["sid"], + ) + return self._delivery_receipts + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessagePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MessageInstance: + """ + Build an instance of MessageInstance + + :param payload: Payload response from the API + """ + return MessageInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MessageList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str, conversation_sid: str): + """ + Initialize the MessageList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Participant resource is associated with. + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for messages. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + } + self._uri = "/Services/{chat_service_sid}/Conversations/{conversation_sid}/Messages".format( + **self._solution + ) + + def create( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + media_sid: Union[str, object] = values.unset, + content_sid: Union[str, object] = values.unset, + content_variables: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Create the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param media_sid: The Media SID to be attached to the new Message. + :param content_sid: The unique ID of the multi-channel [Rich Content](https://www.twilio.com/docs/content) template, required for template-generated messages. **Note** that if this field is set, `Body` and `MediaSid` parameters are ignored. + :param content_variables: A structurally valid JSON string that contains values to resolve Rich Content template variables. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The created MessageInstance + """ + + data = values.of( + { + "Author": author, + "Body": body, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MediaSid": media_sid, + "ContentSid": content_sid, + "ContentVariables": content_variables, + "Subject": subject, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + author: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + media_sid: Union[str, object] = values.unset, + content_sid: Union[str, object] = values.unset, + content_variables: Union[str, object] = values.unset, + subject: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronously create the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param author: The channel specific identifier of the message's author. Defaults to `system`. + :param body: The content of the message, can be up to 1,600 characters long. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. `null` if the message has not been edited. + :param attributes: A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param media_sid: The Media SID to be attached to the new Message. + :param content_sid: The unique ID of the multi-channel [Rich Content](https://www.twilio.com/docs/content) template, required for template-generated messages. **Note** that if this field is set, `Body` and `MediaSid` parameters are ignored. + :param content_variables: A structurally valid JSON string that contains values to resolve Rich Content template variables. + :param subject: The subject of the message, can be up to 256 characters long. + + :returns: The created MessageInstance + """ + + data = values.of( + { + "Author": author, + "Body": body, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MediaSid": media_sid, + "ContentSid": content_sid, + "ContentVariables": content_variables, + "Subject": subject, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + def stream( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MessageInstance]: + """ + Streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(order=order, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MessageInstance]: + """ + Asynchronously streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(order=order, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + order=order, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Asynchronously lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + order=order, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + async def page_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Asynchronously retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MessagePage: + """ + Retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MessagePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MessagePage: + """ + Asynchronously retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MessagePage(self._version, response, self._solution) + + def get(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return MessageContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return MessageContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7af6528e40fdfd176cb72cb20066b196481af87 GIT binary patch literal 38241 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 F`v1L;AN>FT literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/__pycache__/delivery_receipt.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/__pycache__/delivery_receipt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2137e865ed773467a808f2986d7fe9ebc9c71a21 GIT binary patch literal 21944 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/delivery_receipt.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/delivery_receipt.py new file mode 100644 index 00000000..939b6312 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/message/delivery_receipt.py @@ -0,0 +1,505 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class DeliveryReceiptInstance(InstanceResource): + + class DeliveryStatus(object): + READ = "read" + FAILED = "failed" + DELIVERED = "delivered" + UNDELIVERED = "undelivered" + SENT = "sent" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this participant. + :ivar chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Message resource is associated with. + :ivar conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this message. + :ivar message_sid: The SID of the message within a [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) the delivery receipt belongs to + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar channel_message_sid: A messaging channel-specific identifier for the message delivered to participant e.g. `SMxx` for SMS, `WAxx` for Whatsapp etc. + :ivar participant_sid: The unique ID of the participant the delivery receipt belongs to. + :ivar status: + :ivar error_code: The message [delivery error code](https://www.twilio.com/docs/sms/api/message-resource#delivery-related-errors) for a `failed` status, + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. `null` if the delivery receipt has not been updated. + :ivar url: An absolute API resource URL for this delivery receipt. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + chat_service_sid: str, + conversation_sid: str, + message_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.conversation_sid: Optional[str] = payload.get("conversation_sid") + self.message_sid: Optional[str] = payload.get("message_sid") + self.sid: Optional[str] = payload.get("sid") + self.channel_message_sid: Optional[str] = payload.get("channel_message_sid") + self.participant_sid: Optional[str] = payload.get("participant_sid") + self.status: Optional["DeliveryReceiptInstance.DeliveryStatus"] = payload.get( + "status" + ) + self.error_code: Optional[int] = deserialize.integer(payload.get("error_code")) + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + "message_sid": message_sid, + "sid": sid or self.sid, + } + self._context: Optional[DeliveryReceiptContext] = None + + @property + def _proxy(self) -> "DeliveryReceiptContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DeliveryReceiptContext for this DeliveryReceiptInstance + """ + if self._context is None: + self._context = DeliveryReceiptContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "DeliveryReceiptInstance": + """ + Fetch the DeliveryReceiptInstance + + + :returns: The fetched DeliveryReceiptInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DeliveryReceiptInstance": + """ + Asynchronous coroutine to fetch the DeliveryReceiptInstance + + + :returns: The fetched DeliveryReceiptInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DeliveryReceiptContext(InstanceContext): + + def __init__( + self, + version: Version, + chat_service_sid: str, + conversation_sid: str, + message_sid: str, + sid: str, + ): + """ + Initialize the DeliveryReceiptContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Message resource is associated with. + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this message. + :param message_sid: The SID of the message within a [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) the delivery receipt belongs to. + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + "message_sid": message_sid, + "sid": sid, + } + self._uri = "/Services/{chat_service_sid}/Conversations/{conversation_sid}/Messages/{message_sid}/Receipts/{sid}".format( + **self._solution + ) + + def fetch(self) -> DeliveryReceiptInstance: + """ + Fetch the DeliveryReceiptInstance + + + :returns: The fetched DeliveryReceiptInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DeliveryReceiptInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> DeliveryReceiptInstance: + """ + Asynchronous coroutine to fetch the DeliveryReceiptInstance + + + :returns: The fetched DeliveryReceiptInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DeliveryReceiptInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DeliveryReceiptPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> DeliveryReceiptInstance: + """ + Build an instance of DeliveryReceiptInstance + + :param payload: Payload response from the API + """ + return DeliveryReceiptInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DeliveryReceiptList(ListResource): + + def __init__( + self, + version: Version, + chat_service_sid: str, + conversation_sid: str, + message_sid: str, + ): + """ + Initialize the DeliveryReceiptList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Message resource is associated with. + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this message. + :param message_sid: The SID of the message within a [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) the delivery receipt belongs to. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + "message_sid": message_sid, + } + self._uri = "/Services/{chat_service_sid}/Conversations/{conversation_sid}/Messages/{message_sid}/Receipts".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DeliveryReceiptInstance]: + """ + Streams DeliveryReceiptInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DeliveryReceiptInstance]: + """ + Asynchronously streams DeliveryReceiptInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DeliveryReceiptInstance]: + """ + Lists DeliveryReceiptInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DeliveryReceiptInstance]: + """ + Asynchronously lists DeliveryReceiptInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DeliveryReceiptPage: + """ + Retrieve a single page of DeliveryReceiptInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DeliveryReceiptInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DeliveryReceiptPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DeliveryReceiptPage: + """ + Asynchronously retrieve a single page of DeliveryReceiptInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DeliveryReceiptInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DeliveryReceiptPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DeliveryReceiptPage: + """ + Retrieve a specific page of DeliveryReceiptInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DeliveryReceiptInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DeliveryReceiptPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DeliveryReceiptPage: + """ + Asynchronously retrieve a specific page of DeliveryReceiptInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DeliveryReceiptInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DeliveryReceiptPage(self._version, response, self._solution) + + def get(self, sid: str) -> DeliveryReceiptContext: + """ + Constructs a DeliveryReceiptContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return DeliveryReceiptContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> DeliveryReceiptContext: + """ + Constructs a DeliveryReceiptContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return DeliveryReceiptContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + message_sid=self._solution["message_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/participant.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/participant.py new file mode 100644 index 00000000..03a3cead --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/participant.py @@ -0,0 +1,925 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ParticipantInstance(InstanceResource): + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this participant. + :ivar chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Participant resource is associated with. + :ivar conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this participant. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the [Conversation SDK](https://www.twilio.com/docs/conversations/sdk-overview) to communicate. Limited to 256 characters. + :ivar attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set `{}` will be returned. + :ivar messaging_binding: Information about how this participant exchanges messages with the conversation. A JSON parameter consisting of type and address fields of the participant. + :ivar role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + :ivar date_created: The date on which this resource was created. + :ivar date_updated: The date on which this resource was last updated. + :ivar url: An absolute API resource URL for this participant. + :ivar last_read_message_index: Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + :ivar last_read_timestamp: Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + chat_service_sid: str, + conversation_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.conversation_sid: Optional[str] = payload.get("conversation_sid") + self.sid: Optional[str] = payload.get("sid") + self.identity: Optional[str] = payload.get("identity") + self.attributes: Optional[str] = payload.get("attributes") + self.messaging_binding: Optional[Dict[str, object]] = payload.get( + "messaging_binding" + ) + self.role_sid: Optional[str] = payload.get("role_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.last_read_message_index: Optional[int] = deserialize.integer( + payload.get("last_read_message_index") + ) + self.last_read_timestamp: Optional[str] = payload.get("last_read_timestamp") + + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + "sid": sid or self.sid, + } + self._context: Optional[ParticipantContext] = None + + @property + def _proxy(self) -> "ParticipantContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ParticipantContext for this ParticipantInstance + """ + if self._context is None: + self._context = ParticipantContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "ParticipantInstance": + """ + Fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ParticipantInstance": + """ + Asynchronous coroutine to fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + identity: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + last_read_timestamp: Union[str, object] = values.unset, + ) -> "ParticipantInstance": + """ + Update the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param date_created: The date on which this resource was created. + :param date_updated: The date on which this resource was last updated. + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the [Conversation SDK](https://www.twilio.com/docs/conversations/sdk-overview) to communicate. Limited to 256 characters. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set `{}` will be returned. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + :param messaging_binding_proxy_address: The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + :param last_read_message_index: Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + :param last_read_timestamp: Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + + :returns: The updated ParticipantInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + date_created=date_created, + date_updated=date_updated, + identity=identity, + attributes=attributes, + role_sid=role_sid, + messaging_binding_proxy_address=messaging_binding_proxy_address, + messaging_binding_projected_address=messaging_binding_projected_address, + last_read_message_index=last_read_message_index, + last_read_timestamp=last_read_timestamp, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + identity: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + last_read_timestamp: Union[str, object] = values.unset, + ) -> "ParticipantInstance": + """ + Asynchronous coroutine to update the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param date_created: The date on which this resource was created. + :param date_updated: The date on which this resource was last updated. + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the [Conversation SDK](https://www.twilio.com/docs/conversations/sdk-overview) to communicate. Limited to 256 characters. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set `{}` will be returned. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + :param messaging_binding_proxy_address: The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + :param last_read_message_index: Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + :param last_read_timestamp: Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + + :returns: The updated ParticipantInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + date_created=date_created, + date_updated=date_updated, + identity=identity, + attributes=attributes, + role_sid=role_sid, + messaging_binding_proxy_address=messaging_binding_proxy_address, + messaging_binding_projected_address=messaging_binding_projected_address, + last_read_message_index=last_read_message_index, + last_read_timestamp=last_read_timestamp, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ParticipantContext(InstanceContext): + + def __init__( + self, version: Version, chat_service_sid: str, conversation_sid: str, sid: str + ): + """ + Initialize the ParticipantContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Participant resource is associated with. + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this participant. + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + "sid": sid, + } + self._uri = "/Services/{chat_service_sid}/Conversations/{conversation_sid}/Participants/{sid}".format( + **self._solution + ) + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ParticipantInstance: + """ + Fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ParticipantInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ParticipantInstance: + """ + Asynchronous coroutine to fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + identity: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + last_read_timestamp: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Update the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param date_created: The date on which this resource was created. + :param date_updated: The date on which this resource was last updated. + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the [Conversation SDK](https://www.twilio.com/docs/conversations/sdk-overview) to communicate. Limited to 256 characters. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set `{}` will be returned. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + :param messaging_binding_proxy_address: The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + :param last_read_message_index: Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + :param last_read_timestamp: Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + + :returns: The updated ParticipantInstance + """ + + data = values.of( + { + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Identity": identity, + "Attributes": attributes, + "RoleSid": role_sid, + "MessagingBinding.ProxyAddress": messaging_binding_proxy_address, + "MessagingBinding.ProjectedAddress": messaging_binding_projected_address, + "LastReadMessageIndex": last_read_message_index, + "LastReadTimestamp": last_read_timestamp, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + identity: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + last_read_timestamp: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Asynchronous coroutine to update the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param date_created: The date on which this resource was created. + :param date_updated: The date on which this resource was last updated. + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the [Conversation SDK](https://www.twilio.com/docs/conversations/sdk-overview) to communicate. Limited to 256 characters. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set `{}` will be returned. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + :param messaging_binding_proxy_address: The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + :param last_read_message_index: Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + :param last_read_timestamp: Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + + :returns: The updated ParticipantInstance + """ + + data = values.of( + { + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Identity": identity, + "Attributes": attributes, + "RoleSid": role_sid, + "MessagingBinding.ProxyAddress": messaging_binding_proxy_address, + "MessagingBinding.ProjectedAddress": messaging_binding_projected_address, + "LastReadMessageIndex": last_read_message_index, + "LastReadTimestamp": last_read_timestamp, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ParticipantPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ParticipantInstance: + """ + Build an instance of ParticipantInstance + + :param payload: Payload response from the API + """ + return ParticipantInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ParticipantList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str, conversation_sid: str): + """ + Initialize the ParticipantList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Participant resource is associated with. + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for participants. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + } + self._uri = "/Services/{chat_service_sid}/Conversations/{conversation_sid}/Participants".format( + **self._solution + ) + + def create( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + identity: Union[str, object] = values.unset, + messaging_binding_address: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Create the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the [Conversation SDK](https://www.twilio.com/docs/conversations/sdk-overview) to communicate. Limited to 256 characters. + :param messaging_binding_address: The address of the participant's device, e.g. a phone or WhatsApp number. Together with the Proxy address, this determines a participant uniquely. This field (with `proxy_address`) is only null when the participant is interacting from an SDK endpoint (see the `identity` field). + :param messaging_binding_proxy_address: The address of the Twilio phone number (or WhatsApp number) that the participant is in contact with. This field, together with participant address, is only null when the participant is interacting from an SDK endpoint (see the `identity` field). + :param date_created: The date on which this resource was created. + :param date_updated: The date on which this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set `{}` will be returned. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + + :returns: The created ParticipantInstance + """ + + data = values.of( + { + "Identity": identity, + "MessagingBinding.Address": messaging_binding_address, + "MessagingBinding.ProxyAddress": messaging_binding_proxy_address, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MessagingBinding.ProjectedAddress": messaging_binding_projected_address, + "RoleSid": role_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "ParticipantInstance.WebhookEnabledType", object + ] = values.unset, + identity: Union[str, object] = values.unset, + messaging_binding_address: Union[str, object] = values.unset, + messaging_binding_proxy_address: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + messaging_binding_projected_address: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Asynchronously create the ParticipantInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the [Conversation SDK](https://www.twilio.com/docs/conversations/sdk-overview) to communicate. Limited to 256 characters. + :param messaging_binding_address: The address of the participant's device, e.g. a phone or WhatsApp number. Together with the Proxy address, this determines a participant uniquely. This field (with `proxy_address`) is only null when the participant is interacting from an SDK endpoint (see the `identity` field). + :param messaging_binding_proxy_address: The address of the Twilio phone number (or WhatsApp number) that the participant is in contact with. This field, together with participant address, is only null when the participant is interacting from an SDK endpoint (see the `identity` field). + :param date_created: The date on which this resource was created. + :param date_updated: The date on which this resource was last updated. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set `{}` will be returned. + :param messaging_binding_projected_address: The address of the Twilio phone number that is used in Group MMS. + :param role_sid: The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + + :returns: The created ParticipantInstance + """ + + data = values.of( + { + "Identity": identity, + "MessagingBinding.Address": messaging_binding_address, + "MessagingBinding.ProxyAddress": messaging_binding_proxy_address, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + "MessagingBinding.ProjectedAddress": messaging_binding_projected_address, + "RoleSid": role_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ParticipantInstance]: + """ + Streams ParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ParticipantInstance]: + """ + Asynchronously streams ParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantInstance]: + """ + Lists ParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantInstance]: + """ + Asynchronously lists ParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantPage: + """ + Retrieve a single page of ParticipantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantPage: + """ + Asynchronously retrieve a single page of ParticipantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ParticipantPage: + """ + Retrieve a specific page of ParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ParticipantPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ParticipantPage: + """ + Asynchronously retrieve a specific page of ParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ParticipantPage(self._version, response, self._solution) + + def get(self, sid: str) -> ParticipantContext: + """ + Constructs a ParticipantContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return ParticipantContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> ParticipantContext: + """ + Constructs a ParticipantContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return ParticipantContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/webhook.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/webhook.py new file mode 100644 index 00000000..08ec93ce --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation/webhook.py @@ -0,0 +1,788 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class WebhookInstance(InstanceResource): + + class Method(object): + GET = "GET" + POST = "POST" + + class Target(object): + WEBHOOK = "webhook" + TRIGGER = "trigger" + STUDIO = "studio" + + """ + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this conversation. + :ivar chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Participant resource is associated with. + :ivar conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this webhook. + :ivar target: The target of this webhook: `webhook`, `studio`, `trigger` + :ivar url: An absolute API resource URL for this webhook. + :ivar configuration: The configuration of this webhook. Is defined based on target. + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + chat_service_sid: str, + conversation_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.conversation_sid: Optional[str] = payload.get("conversation_sid") + self.target: Optional[str] = payload.get("target") + self.url: Optional[str] = payload.get("url") + self.configuration: Optional[Dict[str, object]] = payload.get("configuration") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + "sid": sid or self.sid, + } + self._context: Optional[WebhookContext] = None + + @property + def _proxy(self) -> "WebhookContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: WebhookContext for this WebhookInstance + """ + if self._context is None: + self._context = WebhookContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "WebhookInstance": + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "WebhookInstance": + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + ) -> "WebhookInstance": + """ + Update the WebhookInstance + + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + + :returns: The updated WebhookInstance + """ + return self._proxy.update( + configuration_url=configuration_url, + configuration_method=configuration_method, + configuration_filters=configuration_filters, + configuration_triggers=configuration_triggers, + configuration_flow_sid=configuration_flow_sid, + ) + + async def update_async( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + ) -> "WebhookInstance": + """ + Asynchronous coroutine to update the WebhookInstance + + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + + :returns: The updated WebhookInstance + """ + return await self._proxy.update_async( + configuration_url=configuration_url, + configuration_method=configuration_method, + configuration_filters=configuration_filters, + configuration_triggers=configuration_triggers, + configuration_flow_sid=configuration_flow_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebhookContext(InstanceContext): + + def __init__( + self, version: Version, chat_service_sid: str, conversation_sid: str, sid: str + ): + """ + Initialize the WebhookContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Participant resource is associated with. + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this webhook. + :param sid: A 34 character string that uniquely identifies this resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + "sid": sid, + } + self._uri = "/Services/{chat_service_sid}/Conversations/{conversation_sid}/Webhooks/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> WebhookInstance: + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return WebhookInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> WebhookInstance: + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + ) -> WebhookInstance: + """ + Update the WebhookInstance + + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + ) -> WebhookInstance: + """ + Asynchronous coroutine to update the WebhookInstance + + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebhookPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> WebhookInstance: + """ + Build an instance of WebhookInstance + + :param payload: Payload response from the API + """ + return WebhookInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class WebhookList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str, conversation_sid: str): + """ + Initialize the WebhookList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Participant resource is associated with. + :param conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this webhook. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "conversation_sid": conversation_sid, + } + self._uri = "/Services/{chat_service_sid}/Conversations/{conversation_sid}/Webhooks".format( + **self._solution + ) + + def create( + self, + target: "WebhookInstance.Target", + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_replay_after: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Create the WebhookInstance + + :param target: + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + :param configuration_replay_after: The message index for which and it's successors the webhook will be replayed. Not set by default + + :returns: The created WebhookInstance + """ + + data = values.of( + { + "Target": target, + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.ReplayAfter": configuration_replay_after, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + async def create_async( + self, + target: "WebhookInstance.Target", + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_replay_after: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Asynchronously create the WebhookInstance + + :param target: + :param configuration_url: The absolute url the webhook request should be sent to. + :param configuration_method: + :param configuration_filters: The list of events, firing webhook event for this Conversation. + :param configuration_triggers: The list of keywords, firing webhook event for this Conversation. + :param configuration_flow_sid: The studio flow SID, where the webhook should be sent to. + :param configuration_replay_after: The message index for which and it's successors the webhook will be replayed. Not set by default + + :returns: The created WebhookInstance + """ + + data = values.of( + { + "Target": target, + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.ReplayAfter": configuration_replay_after, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[WebhookInstance]: + """ + Streams WebhookInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[WebhookInstance]: + """ + Asynchronously streams WebhookInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[WebhookInstance]: + """ + Lists WebhookInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[WebhookInstance]: + """ + Asynchronously lists WebhookInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> WebhookPage: + """ + Retrieve a single page of WebhookInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of WebhookInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return WebhookPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> WebhookPage: + """ + Asynchronously retrieve a single page of WebhookInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of WebhookInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return WebhookPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> WebhookPage: + """ + Retrieve a specific page of WebhookInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of WebhookInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return WebhookPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> WebhookPage: + """ + Asynchronously retrieve a specific page of WebhookInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of WebhookInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return WebhookPage(self._version, response, self._solution) + + def get(self, sid: str) -> WebhookContext: + """ + Constructs a WebhookContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return WebhookContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> WebhookContext: + """ + Constructs a WebhookContext + + :param sid: A 34 character string that uniquely identifies this resource. + """ + return WebhookContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + conversation_sid=self._solution["conversation_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation_with_participants.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation_with_participants.py new file mode 100644 index 00000000..ff82a8ce --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/conversation_with_participants.py @@ -0,0 +1,272 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ConversationWithParticipantsInstance(InstanceResource): + + class State(object): + INACTIVE = "inactive" + ACTIVE = "active" + CLOSED = "closed" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this conversation. + :ivar chat_service_sid: The unique ID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) this conversation belongs to. + :ivar messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :ivar unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :ivar attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \"{}\" will be returned. + :ivar state: + :ivar date_created: The date that this resource was created. + :ivar date_updated: The date that this resource was last updated. + :ivar timers: Timer date values representing state update for this conversation. + :ivar links: Contains absolute URLs to access the [participants](https://www.twilio.com/docs/conversations/api/conversation-participant-resource), [messages](https://www.twilio.com/docs/conversations/api/conversation-message-resource) and [webhooks](https://www.twilio.com/docs/conversations/api/conversation-scoped-webhook-resource) of this conversation. + :ivar bindings: + :ivar url: An absolute API resource URL for this conversation. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], chat_service_sid: str + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.unique_name: Optional[str] = payload.get("unique_name") + self.attributes: Optional[str] = payload.get("attributes") + self.state: Optional["ConversationWithParticipantsInstance.State"] = ( + payload.get("state") + ) + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.timers: Optional[Dict[str, object]] = payload.get("timers") + self.links: Optional[Dict[str, object]] = payload.get("links") + self.bindings: Optional[Dict[str, object]] = payload.get("bindings") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "chat_service_sid": chat_service_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return ( + "".format( + context + ) + ) + + +class ConversationWithParticipantsList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the ConversationWithParticipantsList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Conversation resource is associated with. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._uri = "/Services/{chat_service_sid}/ConversationWithParticipants".format( + **self._solution + ) + + def create( + self, + x_twilio_webhook_enabled: Union[ + "ConversationWithParticipantsInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + state: Union[ + "ConversationWithParticipantsInstance.State", object + ] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + participant: Union[List[str], object] = values.unset, + ) -> ConversationWithParticipantsInstance: + """ + Create the ConversationWithParticipantsInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + :param participant: The participant to be added to the conversation in JSON format. The JSON object attributes are as parameters in [Participant Resource](https://www.twilio.com/docs/conversations/api/conversation-participant-resource). The maximum number of participants that can be added in a single request is 10. + + :returns: The created ConversationWithParticipantsInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "MessagingServiceSid": messaging_service_sid, + "Attributes": attributes, + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + "Participant": serialize.map(participant, lambda e: e), + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationWithParticipantsInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "ConversationWithParticipantsInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + state: Union[ + "ConversationWithParticipantsInstance.State", object + ] = values.unset, + timers_inactive: Union[str, object] = values.unset, + timers_closed: Union[str, object] = values.unset, + bindings_email_address: Union[str, object] = values.unset, + bindings_email_name: Union[str, object] = values.unset, + participant: Union[List[str], object] = values.unset, + ) -> ConversationWithParticipantsInstance: + """ + Asynchronously create the ConversationWithParticipantsInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :param unique_name: An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + :param date_created: The date that this resource was created. + :param date_updated: The date that this resource was last updated. + :param messaging_service_sid: The unique ID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) this conversation belongs to. + :param attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + :param state: + :param timers_inactive: ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + :param timers_closed: ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + :param bindings_email_address: The default email address that will be used when sending outbound emails in this conversation. + :param bindings_email_name: The default name that will be used when sending outbound emails in this conversation. + :param participant: The participant to be added to the conversation in JSON format. The JSON object attributes are as parameters in [Participant Resource](https://www.twilio.com/docs/conversations/api/conversation-participant-resource). The maximum number of participants that can be added in a single request is 10. + + :returns: The created ConversationWithParticipantsInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "MessagingServiceSid": messaging_service_sid, + "Attributes": attributes, + "State": state, + "Timers.Inactive": timers_inactive, + "Timers.Closed": timers_closed, + "Bindings.Email.Address": bindings_email_address, + "Bindings.Email.Name": bindings_email_name, + "Participant": serialize.map(participant, lambda e: e), + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConversationWithParticipantsInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/participant_conversation.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/participant_conversation.py new file mode 100644 index 00000000..8ec561a7 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/participant_conversation.py @@ -0,0 +1,383 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ParticipantConversationInstance(InstanceResource): + + class State(object): + INACTIVE = "inactive" + ACTIVE = "active" + CLOSED = "closed" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this conversation. + :ivar chat_service_sid: The unique ID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) this conversation belongs to. + :ivar participant_sid: The unique ID of the [Participant](https://www.twilio.com/docs/conversations/api/conversation-participant-resource). + :ivar participant_user_sid: The unique string that identifies the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). + :ivar participant_identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :ivar participant_messaging_binding: Information about how this participant exchanges messages with the conversation. A JSON parameter consisting of type and address fields of the participant. + :ivar conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) this Participant belongs to. + :ivar conversation_unique_name: An application-defined string that uniquely identifies the Conversation resource. + :ivar conversation_friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :ivar conversation_attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \"{}\" will be returned. + :ivar conversation_date_created: The date that this conversation was created, given in ISO 8601 format. + :ivar conversation_date_updated: The date that this conversation was last updated, given in ISO 8601 format. + :ivar conversation_created_by: Identity of the creator of this Conversation. + :ivar conversation_state: + :ivar conversation_timers: Timer date values representing state update for this conversation. + :ivar links: Contains absolute URLs to access the [participant](https://www.twilio.com/docs/conversations/api/conversation-participant-resource) and [conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) of this conversation. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], chat_service_sid: str + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.participant_sid: Optional[str] = payload.get("participant_sid") + self.participant_user_sid: Optional[str] = payload.get("participant_user_sid") + self.participant_identity: Optional[str] = payload.get("participant_identity") + self.participant_messaging_binding: Optional[Dict[str, object]] = payload.get( + "participant_messaging_binding" + ) + self.conversation_sid: Optional[str] = payload.get("conversation_sid") + self.conversation_unique_name: Optional[str] = payload.get( + "conversation_unique_name" + ) + self.conversation_friendly_name: Optional[str] = payload.get( + "conversation_friendly_name" + ) + self.conversation_attributes: Optional[str] = payload.get( + "conversation_attributes" + ) + self.conversation_date_created: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("conversation_date_created")) + ) + self.conversation_date_updated: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("conversation_date_updated")) + ) + self.conversation_created_by: Optional[str] = payload.get( + "conversation_created_by" + ) + self.conversation_state: Optional["ParticipantConversationInstance.State"] = ( + payload.get("conversation_state") + ) + self.conversation_timers: Optional[Dict[str, object]] = payload.get( + "conversation_timers" + ) + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "chat_service_sid": chat_service_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class ParticipantConversationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ParticipantConversationInstance: + """ + Build an instance of ParticipantConversationInstance + + :param payload: Payload response from the API + """ + return ParticipantConversationInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ParticipantConversationList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the ParticipantConversationList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Participant Conversations resource is associated with. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._uri = "/Services/{chat_service_sid}/ParticipantConversations".format( + **self._solution + ) + + def stream( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ParticipantConversationInstance]: + """ + Streams ParticipantConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param str address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + identity=identity, address=address, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ParticipantConversationInstance]: + """ + Asynchronously streams ParticipantConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param str address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + identity=identity, address=address, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantConversationInstance]: + """ + Lists ParticipantConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param str address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + address=address, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantConversationInstance]: + """ + Asynchronously lists ParticipantConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param str address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + address=address, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantConversationPage: + """ + Retrieve a single page of ParticipantConversationInstance records from the API. + Request is executed immediately + + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantConversationInstance + """ + data = values.of( + { + "Identity": identity, + "Address": address, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantConversationPage(self._version, response, self._solution) + + async def page_async( + self, + identity: Union[str, object] = values.unset, + address: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantConversationPage: + """ + Asynchronously retrieve a single page of ParticipantConversationInstance records from the API. + Request is executed immediately + + :param identity: A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + :param address: A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantConversationInstance + """ + data = values.of( + { + "Identity": identity, + "Address": address, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantConversationPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ParticipantConversationPage: + """ + Retrieve a specific page of ParticipantConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantConversationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ParticipantConversationPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ParticipantConversationPage: + """ + Asynchronously retrieve a specific page of ParticipantConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantConversationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ParticipantConversationPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/role.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/role.py new file mode 100644 index 00000000..0884fb00 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/role.py @@ -0,0 +1,645 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RoleInstance(InstanceResource): + + class RoleType(object): + CONVERSATION = "conversation" + SERVICE = "service" + + """ + :ivar sid: The unique string that we created to identify the Role resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Role resource. + :ivar chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Role resource is associated with. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar type: + :ivar permissions: An array of the permissions the role has been granted. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: An absolute API resource URL for this user role. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + chat_service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["RoleInstance.RoleType"] = payload.get("type") + self.permissions: Optional[List[str]] = payload.get("permissions") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "chat_service_sid": chat_service_sid, + "sid": sid or self.sid, + } + self._context: Optional[RoleContext] = None + + @property + def _proxy(self) -> "RoleContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RoleContext for this RoleInstance + """ + if self._context is None: + self._context = RoleContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "RoleInstance": + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "RoleInstance": + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return await self._proxy.fetch_async() + + def update(self, permission: List[str]) -> "RoleInstance": + """ + Update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + return self._proxy.update( + permission=permission, + ) + + async def update_async(self, permission: List[str]) -> "RoleInstance": + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + return await self._proxy.update_async( + permission=permission, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RoleContext(InstanceContext): + + def __init__(self, version: Version, chat_service_sid: str, sid: str): + """ + Initialize the RoleContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) to update the Role resource in. + :param sid: The SID of the Role resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "sid": sid, + } + self._uri = "/Services/{chat_service_sid}/Roles/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> RoleInstance: + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return RoleInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> RoleInstance: + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return RoleInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + def update(self, permission: List[str]) -> RoleInstance: + """ + Update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + async def update_async(self, permission: List[str]) -> RoleInstance: + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RolePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RoleInstance: + """ + Build an instance of RoleInstance + + :param payload: Payload response from the API + """ + return RoleInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RoleList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the RoleList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) to read the Role resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._uri = "/Services/{chat_service_sid}/Roles".format(**self._solution) + + def create( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Create the RoleInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param type: + :param permission: A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type`. + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + async def create_async( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Asynchronously create the RoleInstance + + :param friendly_name: A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + :param type: + :param permission: A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type`. + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RoleInstance]: + """ + Streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RoleInstance]: + """ + Asynchronously streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Asynchronously lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Asynchronously retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> RolePage: + """ + Retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RolePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> RolePage: + """ + Asynchronously retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RolePage(self._version, response, self._solution) + + def get(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: The SID of the Role resource to update. + """ + return RoleContext( + self._version, chat_service_sid=self._solution["chat_service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: The SID of the Role resource to update. + """ + return RoleContext( + self._version, chat_service_sid=self._solution["chat_service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/__init__.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/__init__.py new file mode 100644 index 00000000..b8cda74c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/__init__.py @@ -0,0 +1,818 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.conversations.v1.service.user.user_conversation import ( + UserConversationList, +) + + +class UserInstance(InstanceResource): + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: The unique string that we created to identify the User resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the User resource. + :ivar chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the User resource is associated with. + :ivar role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) assigned to the user. + :ivar identity: The application-defined string that uniquely identifies the resource's User within the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource). This value is often a username or an email address, and is case-sensitive. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :ivar is_online: Whether the User is actively connected to this Conversations Service and online. This value is only returned by Fetch actions that return a single resource and `null` is always returned by a Read action. This value is `null` if the Service's `reachability_enabled` is `false`, if the User has never been online for this Conversations Service, even if the Service's `reachability_enabled` is `true`. + :ivar is_notifiable: Whether the User has a potentially valid Push Notification registration (APN or GCM) for this Conversations Service. If at least one registration exists, `true`; otherwise `false`. This value is only returned by Fetch actions that return a single resource and `null` is always returned by a Read action. This value is `null` if the Service's `reachability_enabled` is `false`, and if the User has never had a notification registration, even if the Service's `reachability_enabled` is `true`. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: An absolute API resource URL for this user. + :ivar links: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + chat_service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.role_sid: Optional[str] = payload.get("role_sid") + self.identity: Optional[str] = payload.get("identity") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.attributes: Optional[str] = payload.get("attributes") + self.is_online: Optional[bool] = payload.get("is_online") + self.is_notifiable: Optional[bool] = payload.get("is_notifiable") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "chat_service_sid": chat_service_sid, + "sid": sid or self.sid, + } + self._context: Optional[UserContext] = None + + @property + def _proxy(self) -> "UserContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserContext for this UserInstance + """ + if self._context is None: + self._context = UserContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "UserInstance": + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserInstance": + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The updated UserInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + attributes=attributes, + role_sid=role_sid, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Asynchronous coroutine to update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The updated UserInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + attributes=attributes, + role_sid=role_sid, + ) + + @property + def user_conversations(self) -> UserConversationList: + """ + Access the user_conversations + """ + return self._proxy.user_conversations + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserContext(InstanceContext): + + def __init__(self, version: Version, chat_service_sid: str, sid: str): + """ + Initialize the UserContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the User resource is associated with. + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "sid": sid, + } + self._uri = "/Services/{chat_service_sid}/Users/{sid}".format(**self._solution) + + self._user_conversations: Optional[UserConversationList] = None + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserInstance: + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> UserInstance: + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The updated UserInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Attributes": attributes, + "RoleSid": role_sid, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronous coroutine to update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The updated UserInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Attributes": attributes, + "RoleSid": role_sid, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + sid=self._solution["sid"], + ) + + @property + def user_conversations(self) -> UserConversationList: + """ + Access the user_conversations + """ + if self._user_conversations is None: + self._user_conversations = UserConversationList( + self._version, + self._solution["chat_service_sid"], + self._solution["sid"], + ) + return self._user_conversations + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserInstance: + """ + Build an instance of UserInstance + + :param payload: Payload response from the API + """ + return UserInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str): + """ + Initialize the UserList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) to read the User resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + } + self._uri = "/Services/{chat_service_sid}/Users".format(**self._solution) + + def create( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Create the UserInstance + + :param identity: The application-defined string that uniquely identifies the resource's User within the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource). This value is often a username or an email address, and is case-sensitive. + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "FriendlyName": friendly_name, + "Attributes": attributes, + "RoleSid": role_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + async def create_async( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronously create the UserInstance + + :param identity: The application-defined string that uniquely identifies the resource's User within the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource). This value is often a username or an email address, and is case-sensitive. + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "FriendlyName": friendly_name, + "Attributes": attributes, + "RoleSid": role_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, chat_service_sid=self._solution["chat_service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserInstance]: + """ + Streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserInstance]: + """ + Asynchronously streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Asynchronously lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Asynchronously retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserPage: + """ + Retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserPage: + """ + Asynchronously retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserPage(self._version, response, self._solution) + + def get(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + return UserContext( + self._version, chat_service_sid=self._solution["chat_service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + return UserContext( + self._version, chat_service_sid=self._solution["chat_service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..faec739111c2cfdad63276047a80cf839f24f80a GIT binary patch literal 31164 zcmeHwdvp|6dS_L4^;0c%>;2+UAV6x6TH;~AfEmQY9t@T}NZ7kFcDv~=LF1NMQ{4h2 zqz$o2Mx3?Bkl6$|$*%Dv8Kc-)aIz<6_UvX%PBxkB>`BxkXQlM9cgUIKoMg}LIqhkD zJj2;P_V?XeRbAcc7GUF9&xQisx^-W5>)!8v&->l}L3z1b!1d}6UpSr}6@(wtgMQhx zNcJBQxg=#9fTVs|%Yrl0+>X!y>{kB1SzkSfr?-+FUI|p6;E>=d0 zxd+So%LYCD9`h$WqIZTA@@JsZA`^i&URdXQVc>)JmjQDOE=5 zlF@2^O(-J@f?LMbcRZSq!|{kBp9&@9W6F@ChLTD|J~~R-!C+9%{i6g*3Q|RO=fQ$U zt(2(hSspk3A(MkCiqkvv`L~mD?=^gyPUjB%i57Vh=EE<Fi_-bT-pefzd)10D+{Sf$WNGM+c;@{_~L5bDT} z@u`Tb0rr;T$>eZiTW4n+*`eWRhc;8lPAcK!tjONDJQPpLN+g1Phm=Ho zL=7uQ^U(WD&yJ@tu6QG|q^Cm1s7TFWv~M19suJc)frn+22*r{T`+K#1ienbVGT!;*FFkR;@*+;v0}6o^!VT%6qC&jv7^w#z@6EslOU` zFYYzPTloB`=wW`ZeTo;OqJKkW-cwcHlQSX=xFgl*ZSCjpNAVUuckgP@yE@FEQ>h=Y zL~2d5*nl(#(&{j}jg!J@vA?NT@HeGB1aUgB=0O?|CcCmVxaHt1BKBJ&mVRl}>X&XW zH`fk4qZ~aRkH5HYD0DQYMEXXDm9&&pN0hW}AQVd|J$_r-84M1E29;ni?G6S9cs8AJ=>1ZyAnqZ?BCyaWUrEVF&Q5|axxwb zE8Rd1$s;F~p_4}rMvopzM3YL#a47sDmQ>YmE&LR<4*gh$zk~d)KMFe(WYCvunlpIFkrE?yFnl*+F2wsGNAHBhRo)l}AaZ;5s#Q(5~R+O?U=I_^-`ZYt}% zLs^HZtm_VCou;ykWuo#WzRhJSt0Q3{N!XKJCz|wF?p~rLx89O|$1GInwLVjeWqM2c z9W8qG7EAQPV=C*rL)mgu*-E3VbzC|vCcprW3nz@()^kB(Dt_C7epKlx5tIv7>rbPC z-`k_E#$&oH6b{EnhOkPa5p@-%IMq1t0xcG2G=jw)O^&9^2h^xC6p4*81d?`#l1Vjs zbR?-H(ynMC7$1s7hm>?VqTmUl15v_3X%A8UU|3a%#nYZfhA9#2a6|>oN39nV(-!t# z)*XLM+Ljm@R#d`O93!Ny$CMDie1su8Q-Hl(S)~{sZTVn=Acqt$TCb6=ini zrb+1)=lt6BSJzFiyEZtxcJHM0fwN)0bMw_R(`RP3KQY_cLn%w=TLW*MdGpM*ZL_UA zQKfvrbNj}t2c{2P_s+I|l`1sN`@60-Pd8sXGV9-s3SRyB*;#)#o-5`%HeG#o`q}Ht zXFK+@3LkcDpX)l9>N+^@sebLi`2$lGv!2$h)w14A*^RgC!ulPH70B3ymbLkxwc+9S z*1fy#`mxy!kK&bXlvuHTzPj$$zB0Ayjked@KDJq#(D*AA8K=;Nfq1o?VfM6LRgxp> zP*^937)XHzp5g4vh+Lu-fP3L}c1tpciG>perp=Wrv2sL0D<$$6`}U5(;$cl0%@ywj z$hbg61R9&I$e|%Qs`0ImhZxw&196pc(t1Wa=c~0`5}ZQAw6Ns(fYBh93aSl8 zhmOf7LuxcWl8{4TCM^Wy?pQ4M5-n8@sgN7g_~|I5E(il8MriNnVgvPb8z1w;Hkp8V zPhR)X4Ksur9my>bm4MwZsatVNmzi3?3ezaGx&?XDqWUmy37T1%t)R3$NL?Ept2VzP zz!Q6^?4tDrxIv1h)f;Zo1V zp34uVYW%kx($b2_y{|lxaSOhh*Cx(S%s7{D=xR6}HvS})YLuzPHF4avE@D%x9 zbZ`-{Lt~seG$v5~YG2<|vZ{O?l2TGWu7o0rYHHe;)_&~o!-Gy7)&MN|u(}c3D1Pz_cr&ZmDc)^_V8ewE4S`c7P zn`my%oIf+?U6Jyxm|y)!#wz$$W(AASoe?Z9H=D2pGx9PjXP-uJKoCFkth@}l?F?q_ zH!PQ|ziP7yy}}mZ73mMGr$oQ?_D9B7GlBHD8Xuxn7LKcN(2XGllNU;AL-&g}lj>fK zU5`GI9zHF>5Q*L@Ew;RQ+>eB@Ml+xW%oT`pP7qc7MAZLwAQ9h+awL-zzqm>nUz8Nt1*JY9;$suOP?Hsp7^eyY z@a2?Op7pMrajxXRZl-xO01VgH{VI9PLFdxB6?>L{g zYqXrl%ySZw06z~Ng5k2!_=pUJVf5G#=MkWH3xnGyOs9aFaFrU@6Pmi46A5^WkM};= zBR_fcgc455=GGHX?t$cmhKHfMWQxs>#IO>E&=8ivs)qvd{sB4Hn0!2RQem3Lqlz*l zCzNEn{KA=u7f1)n378UD&=*~T;XUcyzZWc%971KLap;ICCzY7|>>KgT4IE= z04#Ocyw6Tfi(g^WO1w@y(aS0g-5|)5_))=@)Bf9fVt@HIO=4+Q` zT#WkKi2B-e>PxTCFIpoEAss>FUJ=s5b+Q-@{=04F^-~%<@$Y-EvL37~vIiIlS0$2Z zP#X`25{=ySA**oZJcG0XHpg7&U8+Jt0H--?44R{{Ip!rq{Em(I9eo{PF&X?$OS|}c z;#%oDw)T8}hsZvW`z$FeN>U%$A%bqO@v!?4)+V$>>Wu}$^<0-LCK!p!y{jjo90 z9Es#bzPXq>R%dti3VQ5qt<4EoSWg%VPu@0#ITbI)P`aIyub)!mC!qxc@z9ATsLn75 z02E`4combUo(P4HlVnh;3Jp75w?#RR(WRl-h`%gx-a1Ns4(f;_`0xpF!V(dR4GtmG zx3!`94e^pF3a>Ov!l+0B%(P|9c4p#{GZQ`2V%kosf>3hWnzjVG(&CG0@nnLA9$jHH zwSF2`8We%zeosWI~q|R zL7>M8?ETFuX^_+=3Yrn5?QzBiF)M{i>Ry#*8n%d}s?w;a1d&XAn07(|0-a8Blu6bq zSv%6Uks+`>D(T+S($RQ4#sq4Wq%kI7sKg_yMDJBXU1}8tv{cn01nF{3V;NRrv0xCQ z`!=L9A!Qevb(K2J0x~ov{s~Lvr{{!QlEv0A_4F+Pw~VvG=FF@WmaY7_Y`JaI&B}(1 z4R@&Us_HI;r#4mY1WEZhGJko z%Bx>Hc>dtWF0ajfb7kwir{l`W8P7u>TP-c_j17rs#a)ptquAPeD4bpCu(f2X9JWpf zq5K{5?HjHhoIW`3@4UKXddYli$6MoXj(_ZJDE49`;>8V1r+P21nR+%=@6VJ`l1Hd* znrfLkIkhfTvnEqcNfknM!<2RE>8Y|*)v64&2Gx|iAzMkY9sloMy@`#nWDCr!+WHd# zcWu-W%Xl2N1L9Q6rvlv>EVH=}WA2TsOp9ghKr3cDcSKZRe^eycw50(%vs+8&JpDGs zexkytZA4(Dwkb}sbZb^>hvJ5n)d@Rk**(>8p@t{oP|9ILb;E{Qp~cG(_ZDyI^QWSx z`MvijPDL`lr9AJcBJYWM>V_@d*6;iL{V3kT=kA>ky{lBJFp||6)k>4Kx&~YwOg;Bhh)La3Ci-sb|Q*nKA-jVYeMu&s%3yOCyN9*V2AQddiuT~vJHY0;%3SJfr5$05s*dC zmuJxf6=bF@vq`J=QE{eb=UmOc6#akZ`_f-m{AC3quz0y{?s;rd`WvUrk#RTmincp2 z?jld&Z7i_gM>cjU0IvB}j4_Ug<6_h>JWN;?FC7&O78!QqVhgPp+Z>^?#FrFYc&g{i~gIwwKMH|GgeD^Mb;`+yC)sD zz#Ouysome|m~`CqR+H^$&fAjmwp`hIz28~CS#RHrvyY251}a1AG+!^{ zFZ<^RI6uGmEPPq!49Xa(gr3-@eia|1o}plzf(ZoJT*PKb{bfpFQ^dGanj-Zj1o_j# z>wSdPi^C+=Po`sSKFDY?VPV}zFhNGrW*g#pG8wVvBqL@27lJ#jInycj}iG=z0?0 zk@RhaSjjqjR-$F7poJ5(U<$5?jpULNd3MTs$MLpCNU>_2>H#F(_L(%bohK65C}AhX z!f-NeeQaMJn|>1#-GC~7M@9`%)bmaf{b569ga18`KUVw91Tm}D1W_tu3>$u0ozX+rXp`dUyoj^ z2a;&q03^{!wn>Kkoq})4JpoF_g^ITm9H-cKTf`eqakn7daBW4rKv|z>Z8A{IIKJUd zD2CgYz&9IP11D^Y6BQHm*~i5shKOIqi2Mkwl1b_hyHMI7?z)0WwTz3Z4Js!)M{eM^ z?GcI4T*QW$T|;G9hCq#Es^<4Jxk9yu9P8Ew+W%D zRMZ_!=(~i}VXDArE>i*JFQaLvi9uRRCD&2VM!~lzI77q+^YaWoW0<*VPZU-e9T zQl3qJ?`xWA-uNGSKkz;Lw+&s$+ju~nd~BvBkn(iiT)7X}ydvdXelxdpb-cbNRkdcm zx^XJ`#^~##SCZGC!Q!oM#p3;J>y{&U;??xaK=4y{iQxY^E=mv_S02In?2D8w#1ad* zj4e`6Zjl-Ur(As+6Q=%a3K%>38pSS9kRw7D>G9VP^xSDpssDzG<`xrErRFat_194( zv2dL*gHawoYql4?M5|>MH92MaIW8ET)@?{NY$#kXjT`SDwcA~>$1VP;Pu$~_{LEi-c_ z3$+gK5f~6h&CFsR-&|Qss;p(EY~6>g+w~ocoB^F#zCPvKVCF`%4yg@07(ei=f@0cN zGv{qhd0S_ktqXZmLSt;O&mr>Vu%@X;Xvm&JkOvmj(~bDMkH#)FNN;+9f};rXxyJ#d zjJ2BQNH-G|F>3u+OqP0#8ahtZ+7`7~X~dBXR%(>$#1NP*Qp^rBR-i`Wwx~ZNsMw71 zcWH}yc+R^k<=ypu{j7KYjB`H&0Dpaf!HL_L7%JOD{UKRUCBA{#kkmNE5)|yCfJy31 zE@NUEcb7RuiDaOFxuqdg-L#iVP%vK~agE1BHhm>(0-vujDMyj-ZRlMxT2z0-` zk>B6%{e(Sd0)|ni)^=E2Xab^C%?8Axn~n1I#SAw{)JjuqL$%F)VLU6~mRVbCb6?(( z6>!Vwjg&A6Z7kL@647#=Nr;jPOhS}YU=pGvn1t%Gl@wFO#ce_;vv3fo;(d5GEXQPc zbKBaOQ3&@eH^m{AX>iyc*Nj4sYepfO&oKUsOVVQ54TzXs(i9kj6q{z^u_$(!Caf?W zILJ^0GlGP;bJXUyr=7I=$k~!HoD21v2BjcCGz&uD4a|Bqts@XZifSq&YzO~479I0L zmth?{VJMk*k3?gUybbtJPgBoyYxe>}faXrNO@4~|m5~m67!J8);g1h8)i!)+jTbQT z0Xyp|^wV$U=2ga@6YYSd_+i{Q%S|7pG23Ym++3hr=Dw`la!o@OFelFtwpfEoV7xs! z`E+W_wZ8YBfA{&By-%kedghijf6FxL|E?rt#J+@zD&g`8F{`)#G;+Vk)8noav$-@v$O4fuT(PM%r7T$`t&T9{d%J zgC9?XVVqdnd#_Yq314Y=vnM0q@fub=ZkZapZPQfCEde+7e%3%9OzR?P_6SC$n4xn( zVn$ADX(MNG^W43pV!cQ(spcCS;Vf)2Hahd3TzOA!7*#!R-7jfWy_dceFMD5lNY2R~ z<`TUuQm&LM6~x)&U;#Y_*IIR%}9k%t?-^)9Sm;DTHuEU!fBK3eq>WLI-0Pb!y zJvZXHDbmF9n~~p)=Ow1+C3s$nx`g+aBEF27kCy`jFXz~wTcQ(sv23cD%gDlhkL!M&PZzZOfOId6)65)Pmoz8MJPdqCpDKylE#q}Qu>F-9~ zPnq)H>_Z8QYx(jSxeL}i&56)1)b4`Cb?aQsS5oxa(N%1E9E!N^b)9&NEvnO7T#Y94g@W{g(uqR2Ko zM2FbhznJY7dAlL7(IP&Ogo{Fm?Y5=k6lf;|_DCp$p=eAFMIz`Roa#bD5!#gz4keTh zY$L^q3DJ|vf=wCs(c=#*i(T5@6n$4JbLHkEZuZZ3;QjFhd4Fh*@cE*KJ~!Cu>fEn+ z+pDi&p{cJ@@J$LxuQ_euI!>nEET!Y*81>(x_yQAb+Rk5JXoYoge4Imt1z7M~)Pb`U zv>-^h5a?ajj09JZH0CAwiD7I0nokHUP~iuw>P|VI*+b$VlK|MgrYdce8!( zyu1gyW+=->%6v%EEsu)#!4j~zgj9&-Uq;8X8}JEtW88%l`U`^T7ijE1JLcC-XF&FJ zF^5?{GXr}4yl7DMQ7Bc1D?ObDGfu?DhM;t!C|O<7+6X8&v^t5WDaZ%c-McfELH zow&PJy3xKCaXNlxFq%xehN0cUc{gK9adGt9_})@xtK#Q9VeU?HEHoAcBB$fE$N`tPhbEK(IPl_(pd>Q!I2?xq zF`ZR{qlLiyl8nhl+aL_!fbkx3tT(@k`4^AGlIRl7Dbf9V3%b}YC+Of3Vz`ZN;bBl2 zjH{!$j+g{kjq_zaz@a9?sK&cvoVhYIGI$h;&;;w>gzd@v{Q+%A+Wbc64Hk$+j*Z}q z4jkb^Vh9dJgmW?Nzot`bWb}v~5HZAG7m($>%0LJoND{zMykJbUZW{2oP3|eyEw&R* zrf<-W_Gp(+9f#mS$1%cD2yzb&ei<ahi zLjBcbu@a*|&EiBTz!Do~Qw7WygQ+$@?;4!DmBC@08kti-EYc=#jW({cUJu4`l!*as ztb;PG-F7(|Py#Ye!f9hQ+U50KU0r^YqQ-E=)(+ue+tjh4pAFY&RDn@oWSBa|-w0ui z0MY1~N_Y=ieY&adAb>7|wEF2Xz;PtVDkahqjab^wKUnwHrqZll+Rlrq?;@qp?eq_k zW@4my6VDLFeH=N^qqo7`>eAASOXn)rrYhH7dFYydwsOa$eIEOgu>t4u<}2$`Et@At zXT4h{rM%6`P>-*)kfv+{Tn23sBw5ct`e65a@n~MUfFOOyOnrKD>K$2VT^g zw|nGX(Vvu${;(^gh4G)ZP!ydsX03q#7nkW z;(KCuvvhqGVtE+SuuPM>y1+7B0w>}K81$O1w>1_IOqwP1DH09rL=5&_Bcm88!;Pwk zapdBQia}ZFthhpkNC7D#1thtBfg>Q6O@4u`_7`+QkMrS@xpRLs4(h0aJ*+zSg;Qbf zA0tJd04^ZMFd3i25Rwsa9?Iar9_e(MLNTV zHtOS;%K5tH`KA^u>hgxHz}1L(=hv8*DlO@k@s}M#U@$$}Qbm$+5rdOk%wSyd&WhV0 zyk-qsjtODQMmi5Jjq#RgWOvtXINK{FR~^pJMbM{~Y{ zpLcZ-&w*Ux?+~u&LxY@oSSz%yn_IIbwPuTfEn2q%TeMbuDp*%kd}@Q|0=5kK+&Al% z{KSg=dKn9nf1086pZ5rV-MU62^#$Qy1(q)WE;`)a?cY1^85P+1-JVyz8 zGY+21a|@Cdw>Fcl+2kLLpD2K}+IEi?W_t+>Guq1e62k6XhEZY{%G2x>T(C$NwJ@73 z%g)dshQUCShj1WD6q**S0(in4gQAIsk@Pp_oqPtHW8SBiOKQcf#j9A^#7 z?BF1N(gM!%u~C!mfFB6JW{S-kZ3R50^w9*;X}WYo5dDY=lOW7n0nHj6KE=GIrr6QA zHm-p|FA~wgVd&4me#zk&Dbv8;p)1B$o0}u0M+pTH*L1Y&8Xl&WdZ^3vIfg2PzM^o@ zjJLrL%4K|}T8TMJJL$O>Z|3@FvP_zsExv)rX|qR@osC<984wqkB$*O~+auY=KH42Q z?ckgMDI(PGQNYwKh7}TrlWSWq6SN&eqY0c%Af1YdO&CT`|AdzQFCiUlf~=b%m$uF~ zw9GGAo#&{e+aRZ&pXqpNX35uPs}4;%Ouk3e^_L#G_{d!K>QwdWoZFyu{TO_YYSzG& zqQ*Vx#Ie}EhAD|03@@L)R`cGncb9Q7gR5N3fNyXgO90h(X=eP=E^zQf&OBw#eOU0| zm{xPY(h#{t8bDdV9|4jd;DIj~52!b2AuaUfs! z@LjpvBi>jg?siKzRr^!X^)C49MA6x$GP)oRC78BIkAr{TWk}tww5|d*MS!7-PRBrcZGL#x~oEWH7#P6w*&Txw7|a z&vXxdNha0aGt;-gQ^-8PjXFow z$RQ}tl@!msuM#46@6|+ubw{rzHln&$Q#em-_m!;dguh}{ZN`Q> z&TnXG%Rj->LCKyxugP*ss>nM?(@RMZzf1>dQoA6J@S3cqSZr~x$)8g%21G$#HQ& z#jSn1eZDO~hje_5lU&j1n#SC*r#SbO^}McmYU5@5)b>G%RZA)g?sCl*Hm&J& znf4n4N3s2%{ZJXh5a}hRJpePJk+X>M*ickmyh+^PNpGJutYL<~X3DvILA7LO=>vP2M<{YW@CCmc)(2Y)22 z`$*XOk+AI}VZ%p4>qo+hPb?PEa?3qo5f6wn)$sUav0Jac%k!_z#_LIjw*4} WWb&4P+pV=v+VC*`i9mPOoBs=WRoavQ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/__pycache__/user_conversation.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/__pycache__/user_conversation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7e2f7d8c846201967b7d75171249921a87d395b GIT binary patch literal 27994 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 KITm4*^8W%fd49?O literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/user_conversation.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/user_conversation.py new file mode 100644 index 00000000..4f1727f8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/service/user/user_conversation.py @@ -0,0 +1,684 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class UserConversationInstance(InstanceResource): + + class NotificationLevel(object): + DEFAULT = "default" + MUTED = "muted" + + class State(object): + INACTIVE = "inactive" + ACTIVE = "active" + CLOSED = "closed" + + """ + :ivar account_sid: The unique ID of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this conversation. + :ivar chat_service_sid: The unique ID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) this conversation belongs to. + :ivar conversation_sid: The unique ID of the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for this User Conversation. + :ivar unread_messages_count: The number of unread Messages in the Conversation for the Participant. + :ivar last_read_message_index: The index of the last Message in the Conversation that the Participant has read. + :ivar participant_sid: The unique ID of the [participant](https://www.twilio.com/docs/conversations/api/conversation-participant-resource) the user conversation belongs to. + :ivar user_sid: The unique string that identifies the [User resource](https://www.twilio.com/docs/conversations/api/user-resource). + :ivar friendly_name: The human-readable name of this conversation, limited to 256 characters. Optional. + :ivar conversation_state: + :ivar timers: Timer date values representing state update for this conversation. + :ivar attributes: An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \"{}\" will be returned. + :ivar date_created: The date that this conversation was created, given in ISO 8601 format. + :ivar date_updated: The date that this conversation was last updated, given in ISO 8601 format. + :ivar created_by: Identity of the creator of this Conversation. + :ivar notification_level: + :ivar unique_name: An application-defined string that uniquely identifies the Conversation resource. It can be used to address the resource in place of the resource's `conversation_sid` in the URL. + :ivar url: + :ivar links: Contains absolute URLs to access the [participant](https://www.twilio.com/docs/conversations/api/conversation-participant-resource) and [conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) of this conversation. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + chat_service_sid: str, + user_sid: str, + conversation_sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.conversation_sid: Optional[str] = payload.get("conversation_sid") + self.unread_messages_count: Optional[int] = deserialize.integer( + payload.get("unread_messages_count") + ) + self.last_read_message_index: Optional[int] = deserialize.integer( + payload.get("last_read_message_index") + ) + self.participant_sid: Optional[str] = payload.get("participant_sid") + self.user_sid: Optional[str] = payload.get("user_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.conversation_state: Optional["UserConversationInstance.State"] = ( + payload.get("conversation_state") + ) + self.timers: Optional[Dict[str, object]] = payload.get("timers") + self.attributes: Optional[str] = payload.get("attributes") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.created_by: Optional[str] = payload.get("created_by") + self.notification_level: Optional[ + "UserConversationInstance.NotificationLevel" + ] = payload.get("notification_level") + self.unique_name: Optional[str] = payload.get("unique_name") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "chat_service_sid": chat_service_sid, + "user_sid": user_sid, + "conversation_sid": conversation_sid or self.conversation_sid, + } + self._context: Optional[UserConversationContext] = None + + @property + def _proxy(self) -> "UserConversationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserConversationContext for this UserConversationInstance + """ + if self._context is None: + self._context = UserConversationContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + user_sid=self._solution["user_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserConversationInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserConversationInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UserConversationInstance": + """ + Fetch the UserConversationInstance + + + :returns: The fetched UserConversationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserConversationInstance": + """ + Asynchronous coroutine to fetch the UserConversationInstance + + + :returns: The fetched UserConversationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + notification_level: Union[ + "UserConversationInstance.NotificationLevel", object + ] = values.unset, + last_read_timestamp: Union[datetime, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + ) -> "UserConversationInstance": + """ + Update the UserConversationInstance + + :param notification_level: + :param last_read_timestamp: The date of the last message read in conversation by the user, given in ISO 8601 format. + :param last_read_message_index: The index of the last Message in the Conversation that the Participant has read. + + :returns: The updated UserConversationInstance + """ + return self._proxy.update( + notification_level=notification_level, + last_read_timestamp=last_read_timestamp, + last_read_message_index=last_read_message_index, + ) + + async def update_async( + self, + notification_level: Union[ + "UserConversationInstance.NotificationLevel", object + ] = values.unset, + last_read_timestamp: Union[datetime, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + ) -> "UserConversationInstance": + """ + Asynchronous coroutine to update the UserConversationInstance + + :param notification_level: + :param last_read_timestamp: The date of the last message read in conversation by the user, given in ISO 8601 format. + :param last_read_message_index: The index of the last Message in the Conversation that the Participant has read. + + :returns: The updated UserConversationInstance + """ + return await self._proxy.update_async( + notification_level=notification_level, + last_read_timestamp=last_read_timestamp, + last_read_message_index=last_read_message_index, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserConversationContext(InstanceContext): + + def __init__( + self, + version: Version, + chat_service_sid: str, + user_sid: str, + conversation_sid: str, + ): + """ + Initialize the UserConversationContext + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Conversation resource is associated with. + :param user_sid: The unique SID identifier of the [User resource](https://www.twilio.com/docs/conversations/api/user-resource). This value can be either the `sid` or the `identity` of the User resource. + :param conversation_sid: The unique SID identifier of the Conversation. This value can be either the `sid` or the `unique_name` of the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource). + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "user_sid": user_sid, + "conversation_sid": conversation_sid, + } + self._uri = "/Services/{chat_service_sid}/Users/{user_sid}/Conversations/{conversation_sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the UserConversationInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserConversationInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserConversationInstance: + """ + Fetch the UserConversationInstance + + + :returns: The fetched UserConversationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserConversationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + user_sid=self._solution["user_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + async def fetch_async(self) -> UserConversationInstance: + """ + Asynchronous coroutine to fetch the UserConversationInstance + + + :returns: The fetched UserConversationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserConversationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + user_sid=self._solution["user_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + def update( + self, + notification_level: Union[ + "UserConversationInstance.NotificationLevel", object + ] = values.unset, + last_read_timestamp: Union[datetime, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + ) -> UserConversationInstance: + """ + Update the UserConversationInstance + + :param notification_level: + :param last_read_timestamp: The date of the last message read in conversation by the user, given in ISO 8601 format. + :param last_read_message_index: The index of the last Message in the Conversation that the Participant has read. + + :returns: The updated UserConversationInstance + """ + + data = values.of( + { + "NotificationLevel": notification_level, + "LastReadTimestamp": serialize.iso8601_datetime(last_read_timestamp), + "LastReadMessageIndex": last_read_message_index, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserConversationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + user_sid=self._solution["user_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + async def update_async( + self, + notification_level: Union[ + "UserConversationInstance.NotificationLevel", object + ] = values.unset, + last_read_timestamp: Union[datetime, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + ) -> UserConversationInstance: + """ + Asynchronous coroutine to update the UserConversationInstance + + :param notification_level: + :param last_read_timestamp: The date of the last message read in conversation by the user, given in ISO 8601 format. + :param last_read_message_index: The index of the last Message in the Conversation that the Participant has read. + + :returns: The updated UserConversationInstance + """ + + data = values.of( + { + "NotificationLevel": notification_level, + "LastReadTimestamp": serialize.iso8601_datetime(last_read_timestamp), + "LastReadMessageIndex": last_read_message_index, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserConversationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + user_sid=self._solution["user_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserConversationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserConversationInstance: + """ + Build an instance of UserConversationInstance + + :param payload: Payload response from the API + """ + return UserConversationInstance( + self._version, + payload, + chat_service_sid=self._solution["chat_service_sid"], + user_sid=self._solution["user_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserConversationList(ListResource): + + def __init__(self, version: Version, chat_service_sid: str, user_sid: str): + """ + Initialize the UserConversationList + + :param version: Version that contains the resource + :param chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the Conversation resource is associated with. + :param user_sid: The unique SID identifier of the [User resource](https://www.twilio.com/docs/conversations/api/user-resource). This value can be either the `sid` or the `identity` of the User resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "chat_service_sid": chat_service_sid, + "user_sid": user_sid, + } + self._uri = ( + "/Services/{chat_service_sid}/Users/{user_sid}/Conversations".format( + **self._solution + ) + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserConversationInstance]: + """ + Streams UserConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserConversationInstance]: + """ + Asynchronously streams UserConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserConversationInstance]: + """ + Lists UserConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserConversationInstance]: + """ + Asynchronously lists UserConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserConversationPage: + """ + Retrieve a single page of UserConversationInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserConversationInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserConversationPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserConversationPage: + """ + Asynchronously retrieve a single page of UserConversationInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserConversationInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserConversationPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserConversationPage: + """ + Retrieve a specific page of UserConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserConversationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserConversationPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserConversationPage: + """ + Asynchronously retrieve a specific page of UserConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserConversationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserConversationPage(self._version, response, self._solution) + + def get(self, conversation_sid: str) -> UserConversationContext: + """ + Constructs a UserConversationContext + + :param conversation_sid: The unique SID identifier of the Conversation. This value can be either the `sid` or the `unique_name` of the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource). + """ + return UserConversationContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + user_sid=self._solution["user_sid"], + conversation_sid=conversation_sid, + ) + + def __call__(self, conversation_sid: str) -> UserConversationContext: + """ + Constructs a UserConversationContext + + :param conversation_sid: The unique SID identifier of the Conversation. This value can be either the `sid` or the `unique_name` of the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource). + """ + return UserConversationContext( + self._version, + chat_service_sid=self._solution["chat_service_sid"], + user_sid=self._solution["user_sid"], + conversation_sid=conversation_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/user/__init__.py b/venv/Lib/site-packages/twilio/rest/conversations/v1/user/__init__.py new file mode 100644 index 00000000..fe5d12f0 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/conversations/v1/user/__init__.py @@ -0,0 +1,780 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Conversations + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.conversations.v1.user.user_conversation import UserConversationList + + +class UserInstance(InstanceResource): + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: The unique string that we created to identify the User resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the User resource. + :ivar chat_service_sid: The SID of the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) the User resource is associated with. + :ivar role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) assigned to the user. + :ivar identity: The application-defined string that uniquely identifies the resource's User within the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource). This value is often a username or an email address, and is case-sensitive. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :ivar is_online: Whether the User is actively connected to this Conversations Service and online. This value is only returned by Fetch actions that return a single resource and `null` is always returned by a Read action. This value is `null` if the Service's `reachability_enabled` is `false`, if the User has never been online for this Conversations Service, even if the Service's `reachability_enabled` is `true`. + :ivar is_notifiable: Whether the User has a potentially valid Push Notification registration (APN or GCM) for this Conversations Service. If at least one registration exists, `true`; otherwise `false`. This value is only returned by Fetch actions that return a single resource and `null` is always returned by a Read action. This value is `null` if the Service's `reachability_enabled` is `false`, and if the User has never had a notification registration, even if the Service's `reachability_enabled` is `true`. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: An absolute API resource URL for this user. + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.role_sid: Optional[str] = payload.get("role_sid") + self.identity: Optional[str] = payload.get("identity") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.attributes: Optional[str] = payload.get("attributes") + self.is_online: Optional[bool] = payload.get("is_online") + self.is_notifiable: Optional[bool] = payload.get("is_notifiable") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[UserContext] = None + + @property + def _proxy(self) -> "UserContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserContext for this UserInstance + """ + if self._context is None: + self._context = UserContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "UserInstance": + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserInstance": + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The updated UserInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + attributes=attributes, + role_sid=role_sid, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Asynchronous coroutine to update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The updated UserInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + attributes=attributes, + role_sid=role_sid, + ) + + @property + def user_conversations(self) -> UserConversationList: + """ + Access the user_conversations + """ + return self._proxy.user_conversations + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the UserContext + + :param version: Version that contains the resource + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Users/{sid}".format(**self._solution) + + self._user_conversations: Optional[UserConversationList] = None + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserInstance: + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> UserInstance: + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The updated UserInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Attributes": attributes, + "RoleSid": role_sid, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronous coroutine to update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The updated UserInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Attributes": attributes, + "RoleSid": role_sid, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def user_conversations(self) -> UserConversationList: + """ + Access the user_conversations + """ + if self._user_conversations is None: + self._user_conversations = UserConversationList( + self._version, + self._solution["sid"], + ) + return self._user_conversations + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserInstance: + """ + Build an instance of UserInstance + + :param payload: Payload response from the API + """ + return UserInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the UserList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Users" + + def create( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Create the UserInstance + + :param identity: The application-defined string that uniquely identifies the resource's User within the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource). This value is often a username or an email address, and is case-sensitive. + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "FriendlyName": friendly_name, + "Attributes": attributes, + "RoleSid": role_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance(self._version, payload) + + async def create_async( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + role_sid: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronously create the UserInstance + + :param identity: The application-defined string that uniquely identifies the resource's User within the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource). This value is often a username or an email address, and is case-sensitive. + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + :param role_sid: The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "FriendlyName": friendly_name, + "Attributes": attributes, + "RoleSid": role_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserInstance]: + """ + Streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserInstance]: + """ + Asynchronously streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Asynchronously lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Asynchronously retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response) + + def get_page(self, target_url: str) -> UserPage: + """ + Retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserPage(self._version, response) + + async def get_page_async(self, target_url: str) -> UserPage: + """ + Asynchronously retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserPage(self._version, response) + + def get(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + return UserContext(self._version, sid=sid) + + def __call__(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + return UserContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/user/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/user/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49809311d67846388dce5a3ae7799bd4029438fc GIT binary patch literal 29820 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/conversations/v1/user/__pycache__/user_conversation.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/conversations/v1/user/__pycache__/user_conversation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..514ab8e8d83cb720de9640b79e593648bd499173 GIT binary patch literal 27105 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 "UserConversationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserConversationContext for this UserConversationInstance + """ + if self._context is None: + self._context = UserConversationContext( + self._version, + user_sid=self._solution["user_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserConversationInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserConversationInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UserConversationInstance": + """ + Fetch the UserConversationInstance + + + :returns: The fetched UserConversationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserConversationInstance": + """ + Asynchronous coroutine to fetch the UserConversationInstance + + + :returns: The fetched UserConversationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + notification_level: Union[ + "UserConversationInstance.NotificationLevel", object + ] = values.unset, + last_read_timestamp: Union[datetime, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + ) -> "UserConversationInstance": + """ + Update the UserConversationInstance + + :param notification_level: + :param last_read_timestamp: The date of the last message read in conversation by the user, given in ISO 8601 format. + :param last_read_message_index: The index of the last Message in the Conversation that the Participant has read. + + :returns: The updated UserConversationInstance + """ + return self._proxy.update( + notification_level=notification_level, + last_read_timestamp=last_read_timestamp, + last_read_message_index=last_read_message_index, + ) + + async def update_async( + self, + notification_level: Union[ + "UserConversationInstance.NotificationLevel", object + ] = values.unset, + last_read_timestamp: Union[datetime, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + ) -> "UserConversationInstance": + """ + Asynchronous coroutine to update the UserConversationInstance + + :param notification_level: + :param last_read_timestamp: The date of the last message read in conversation by the user, given in ISO 8601 format. + :param last_read_message_index: The index of the last Message in the Conversation that the Participant has read. + + :returns: The updated UserConversationInstance + """ + return await self._proxy.update_async( + notification_level=notification_level, + last_read_timestamp=last_read_timestamp, + last_read_message_index=last_read_message_index, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserConversationContext(InstanceContext): + + def __init__(self, version: Version, user_sid: str, conversation_sid: str): + """ + Initialize the UserConversationContext + + :param version: Version that contains the resource + :param user_sid: The unique SID identifier of the [User resource](https://www.twilio.com/docs/conversations/api/user-resource). This value can be either the `sid` or the `identity` of the User resource. + :param conversation_sid: The unique SID identifier of the Conversation. This value can be either the `sid` or the `unique_name` of the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource). + """ + super().__init__(version) + + # Path Solution + self._solution = { + "user_sid": user_sid, + "conversation_sid": conversation_sid, + } + self._uri = "/Users/{user_sid}/Conversations/{conversation_sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the UserConversationInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserConversationInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserConversationInstance: + """ + Fetch the UserConversationInstance + + + :returns: The fetched UserConversationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserConversationInstance( + self._version, + payload, + user_sid=self._solution["user_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + async def fetch_async(self) -> UserConversationInstance: + """ + Asynchronous coroutine to fetch the UserConversationInstance + + + :returns: The fetched UserConversationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserConversationInstance( + self._version, + payload, + user_sid=self._solution["user_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + def update( + self, + notification_level: Union[ + "UserConversationInstance.NotificationLevel", object + ] = values.unset, + last_read_timestamp: Union[datetime, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + ) -> UserConversationInstance: + """ + Update the UserConversationInstance + + :param notification_level: + :param last_read_timestamp: The date of the last message read in conversation by the user, given in ISO 8601 format. + :param last_read_message_index: The index of the last Message in the Conversation that the Participant has read. + + :returns: The updated UserConversationInstance + """ + + data = values.of( + { + "NotificationLevel": notification_level, + "LastReadTimestamp": serialize.iso8601_datetime(last_read_timestamp), + "LastReadMessageIndex": last_read_message_index, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserConversationInstance( + self._version, + payload, + user_sid=self._solution["user_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + async def update_async( + self, + notification_level: Union[ + "UserConversationInstance.NotificationLevel", object + ] = values.unset, + last_read_timestamp: Union[datetime, object] = values.unset, + last_read_message_index: Union[int, object] = values.unset, + ) -> UserConversationInstance: + """ + Asynchronous coroutine to update the UserConversationInstance + + :param notification_level: + :param last_read_timestamp: The date of the last message read in conversation by the user, given in ISO 8601 format. + :param last_read_message_index: The index of the last Message in the Conversation that the Participant has read. + + :returns: The updated UserConversationInstance + """ + + data = values.of( + { + "NotificationLevel": notification_level, + "LastReadTimestamp": serialize.iso8601_datetime(last_read_timestamp), + "LastReadMessageIndex": last_read_message_index, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserConversationInstance( + self._version, + payload, + user_sid=self._solution["user_sid"], + conversation_sid=self._solution["conversation_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserConversationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserConversationInstance: + """ + Build an instance of UserConversationInstance + + :param payload: Payload response from the API + """ + return UserConversationInstance( + self._version, payload, user_sid=self._solution["user_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserConversationList(ListResource): + + def __init__(self, version: Version, user_sid: str): + """ + Initialize the UserConversationList + + :param version: Version that contains the resource + :param user_sid: The unique SID identifier of the [User resource](https://www.twilio.com/docs/conversations/api/user-resource). This value can be either the `sid` or the `identity` of the User resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "user_sid": user_sid, + } + self._uri = "/Users/{user_sid}/Conversations".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserConversationInstance]: + """ + Streams UserConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserConversationInstance]: + """ + Asynchronously streams UserConversationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserConversationInstance]: + """ + Lists UserConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserConversationInstance]: + """ + Asynchronously lists UserConversationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserConversationPage: + """ + Retrieve a single page of UserConversationInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserConversationInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserConversationPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserConversationPage: + """ + Asynchronously retrieve a single page of UserConversationInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserConversationInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserConversationPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserConversationPage: + """ + Retrieve a specific page of UserConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserConversationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserConversationPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserConversationPage: + """ + Asynchronously retrieve a specific page of UserConversationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserConversationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserConversationPage(self._version, response, self._solution) + + def get(self, conversation_sid: str) -> UserConversationContext: + """ + Constructs a UserConversationContext + + :param conversation_sid: The unique SID identifier of the Conversation. This value can be either the `sid` or the `unique_name` of the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource). + """ + return UserConversationContext( + self._version, + user_sid=self._solution["user_sid"], + conversation_sid=conversation_sid, + ) + + def __call__(self, conversation_sid: str) -> UserConversationContext: + """ + Constructs a UserConversationContext + + :param conversation_sid: The unique SID identifier of the Conversation. This value can be either the `sid` or the `unique_name` of the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource). + """ + return UserConversationContext( + self._version, + user_sid=self._solution["user_sid"], + conversation_sid=conversation_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/events/EventsBase.py b/venv/Lib/site-packages/twilio/rest/events/EventsBase.py new file mode 100644 index 00000000..eb2251ae --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/events/EventsBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.events.v1 import V1 + + +class EventsBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Events Domain + + :returns: Domain for Events + """ + super().__init__(twilio, "https://events.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Events + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/events/__init__.py b/venv/Lib/site-packages/twilio/rest/events/__init__.py new file mode 100644 index 00000000..c359cfe9 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/events/__init__.py @@ -0,0 +1,45 @@ +from warnings import warn + +from twilio.rest.events.EventsBase import EventsBase +from twilio.rest.events.v1.event_type import EventTypeList +from twilio.rest.events.v1.schema import SchemaList +from twilio.rest.events.v1.sink import SinkList +from twilio.rest.events.v1.subscription import SubscriptionList + + +class Events(EventsBase): + @property + def event_types(self) -> EventTypeList: + warn( + "event_types is deprecated. Use v1.event_types instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.event_types + + @property + def schemas(self) -> SchemaList: + warn( + "schemas is deprecated. Use v1.schemas instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.schemas + + @property + def sinks(self) -> SinkList: + warn( + "sinks is deprecated. Use v1.sinks instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.sinks + + @property + def subscriptions(self) -> SubscriptionList: + warn( + "subscriptions is deprecated. Use v1.subscriptions instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.subscriptions diff --git a/venv/Lib/site-packages/twilio/rest/events/__pycache__/EventsBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/events/__pycache__/EventsBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bf1df0ac0d80a90c444e17015f7f23ccfc13f3d GIT binary patch literal 1975 zcmahKO>Y}TbauU7ubodCnkJ&ECXj-Bs4YtfRZ*yDn^Gbmsc5K>Wi)Jd$H~(5u9@Aq zvE@S!kw_$>RzfJba;zeL373L6R4aNy9Jm?Mh^i;vn^`+)5n^`z=FR*5n)Qz(BLxC$ z@8>Vpe=rF74G;a5O_8G|K=z4Cs>Ib?-Pam=Ro4*D_?d=LH6(8M*@js)C7$(j4XbKt zL?<_iYi<)a$Bn~`vRBQwtzzE(UL&MH>B_nnQ73dcy=O;sjR#!VF?Z=|8<>nSdh$>p zAc+B@c6s>sF_ltWlvh8g1y*Sn-~J=dk^+K?!x%E<5dms$ALMijZ+H_N(G zS4pN~;7wUXS#XEP&k>-%THh?C=t8}H`C0+&E-kOzm`m&A+fhWJVD?5FzECW>+~mR4 zTZ{Cjs$eKept>H%&1kM%4uNSmy-R6%ff;jW9RwCa8iX@CshpwNOv`! zsp~tW4uiBkTs3&s&2Y1>yT-P0m|CdjfMx+LyKPkSJ7iO<7H*TGnG|lcz+H6Bj(B3m z_dMSV9sQJB7+`{)kKP9GowiTn0drUHl06vcuI6fosSb=PP}#sjTQ6ohx3QCQEe2lf z*}m7|vNXy!R1A~HzNj@Pc)THkXfEZ@dMK!p9msU1`;Fi-fs%^7WE-tRr7I<_w4x6=B z=sElt9Z&PUaV`W*%rg#p)+xc)(`9~ zFrxDSo^6q*!z4etoBPR{I+%PkGyjYA?&Fz@JI0=M1bmX1sw@s%^1;H$WqUpWWS?}& zmjl)bvNax~j9guEnCe5D`o#axg8|Vxl|ji*+Hwa<1fv_#R)vQ3ms?ZR#RymyCV+>U z7=^`=gbuZxmtI-*oUy&E4q_Vm4kcd|yh||f!0HQy}UTVG~zJ<~`05b9M8JS&i2*)Az*r-6H+;m08T$&pA&MjLpG1yTVl@SPj6~d)6&E;BNhXSgm_lqM9dn2KK4V2q zi~&`K_@3;Cu+R{K31qwj;Mq3m8M*A62d!fQTki}pM|--NoqBNXF9O?9rcdaNXR|X0 zZ~RSQlfg?vOT|KxW6TX5h}w+XO)ppzIDyHT^p>vTwQ%LN7udICC}rRclBp$UPf))tN;K2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/events/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/events/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41d042e70a27e3d0f63655796da590ce9b03c298 GIT binary patch literal 2170 zcmc(g&2Jl35WwGldi|Az5K4*S#w0PqNZ6`cRVb=JKq{!Ha%c)jE2CxOeNDI7UAymX zoI0W^haAWOm0S8RROLV6;&N%U!YAO+Td3)!5)w0SH)fOCQcqrAXbjSpfIkr49{3{)x>g ztcqfFt=pzoTppr(t$Bm`cCs?o++Z`&r`ERCd6T*A&}{{1YsTBeGTD<199ZuYN=(Ti zrc4z_qUv?ok$2UHNxZ2Es}5ErWz7hy0ai6-%?fJ{tXj&N@9Nb|q{ojE>5PV3ENDup zf{-)TG`I?4pM*o7BZcx&oFo4{q$QE>$W7?h$?K+m(n81@sj90x7budnLV(B1E-yQ@ z&1lmOsZ%R|$!WQBwstHc;32i0+7sOV0g&dQ-Q4sb#H*?dYmKH?k`zGrYiO4nY(#SB zY?M#sfq$x;de=EVQTh2-pDs6GGsYWVT)up*u|oM~*lIUAEw@QO-hlcVP-LfZ#a(Z3 zH>B^kVNZL5@~&bh#Mv9@Jq==KBEgdc&0x$Thy=~WQE2Yn-MiZ}&ahJu_o~6X z$Kh=rizW8G1QboAc>&2RA}Jgp!EB`yKt31=zt0nx%M>)o_x EventTypeList: + if self._event_types is None: + self._event_types = EventTypeList(self) + return self._event_types + + @property + def schemas(self) -> SchemaList: + if self._schemas is None: + self._schemas = SchemaList(self) + return self._schemas + + @property + def sinks(self) -> SinkList: + if self._sinks is None: + self._sinks = SinkList(self) + return self._sinks + + @property + def subscriptions(self) -> SubscriptionList: + if self._subscriptions is None: + self._subscriptions = SubscriptionList(self) + return self._subscriptions + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/events/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93d01866d12a1db99a200cbacf8ac7d99f7f1531 GIT binary patch literal 3146 zcmc&$&2JM&6rc6y#&$mVDA2@#AqhcliLLM<(Ey>SK`7!=B#l(dbh`0Q$d>g-XEz3$ zAmtFLjs&8YDv^5OSd>fuk6xTYMYJMPrJlH@4XB7y- zukGzI0^hygzL}j;3HcKz%`faRTLPG6qLVDq6+K`og+Ml-ARjb?g-|vm`H&edM6wad zhs|g~&8m`*m~DkvHYWL~880NV3CXKwd!ZxSp^yMMNA$KuqQ`h>HR$e{?X1RA3GJCe zNQ}ZaIcr!nU(z|fsafpv8rh~Yvxy5y~?XVqeYesCFMa@ToE z=lwqr;{<+S;%XQ}iJT(AE$4F}aXH2^$azj&amM${=H+77)UyNUu1hq=E5v@ow7GEV)RVvrBJWH@#fuMOZ`6xiKh-wA^LZw#(K?CQ|~nRyKyb5P{m}`B`Z) zR-(m{O}TE^@-TV1NkJ>lX{K3C$DU#6Q;MTrF55<_sF}b=r?{|S0&HZgRL~6M+9kTl zYMEa!EE@!|iTo@tXx>bnFp4)kzH4G`+R6(oRh2qX&%rO z9-Il($qc0XVj>&jVLiwrGXXuc7+Uo_WTR55f;8MBZIjX%NFy!MxRfS98f}rbgVzp_ zsf(d(XPw+qvRxA-)#e1IhMkBm;pPJ^2Mz&`XWsf6$dAf0v3=!IV4mEAf}K}%Wz|~) zWd>5_dyumxW><$EaIT2<- zfGwwkSuMe}Qb8wVadSo_0Fcwhn9MK6EJRG{!mF>o7|DHU!NGIq$HymgW8Au7m&&^<&qKHvNJA*Ol3IJJZHLG6yeXa)CTgkhYGc=$g7`W!Hn9kJZ8TW1rPSkJXRY(}(M!yY1_rq+y7!kBrts zzpFi4u!=Yl!R5VsfY(_1~byy@1r@f zbfOX8`?S07!O@@60OmY`xxI9|p>}^TFgp=P+q=NDzftbBE(F!u0FEQLmJHmx7T?>5 z4?gWX{L9fteaA5a_sI%{-*Ut)UTcJ2)bg`Nk^kq4+V+#~qnth~n`C-wc=X}h@r34xTQcS~ z8+S5_z%ip2$YzXm4M2oIX3C6yI7uVGYZ27W%IcizJ<1Or} ztbWmp3Rx!mkdx_!nd8Q$A2=sy*+O95JMCV#&2!UaETxEDAeE){x$GPwjw_L1)m!-7 zzFZ`mp;-9zO63KCVRH|ObZiEK;r%Pu{w6SN1)BoE42Zt9pG^&kwgy)#Iyr zd{uvAUj}vkzOH{W77h=r^#4O(ke4Nob}7~6L>bdddAOwrygEkly1-uQ>~LRz^t5L2 zwD?Gf9<~ARB{Z99LOrV}+RGhx|7_`)e z8#Eb&18{5?Gq&_s>Pa^-M#V9hVz0M`fNTa8Mfod`P(m+~L`iOtgB#?)1{v8PM>a@i TgPeXI`BWLG?|wmGkna8kV5jj7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/__pycache__/event_type.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/events/v1/__pycache__/event_type.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..654d1c691a94655b951530c83a7ad32f0cf15c74 GIT binary patch literal 20305 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 "EventTypeContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: EventTypeContext for this EventTypeInstance + """ + if self._context is None: + self._context = EventTypeContext( + self._version, + type=self._solution["type"], + ) + return self._context + + def fetch(self) -> "EventTypeInstance": + """ + Fetch the EventTypeInstance + + + :returns: The fetched EventTypeInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "EventTypeInstance": + """ + Asynchronous coroutine to fetch the EventTypeInstance + + + :returns: The fetched EventTypeInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EventTypeContext(InstanceContext): + + def __init__(self, version: Version, type: str): + """ + Initialize the EventTypeContext + + :param version: Version that contains the resource + :param type: A string that uniquely identifies this Event Type. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "type": type, + } + self._uri = "/Types/{type}".format(**self._solution) + + def fetch(self) -> EventTypeInstance: + """ + Fetch the EventTypeInstance + + + :returns: The fetched EventTypeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return EventTypeInstance( + self._version, + payload, + type=self._solution["type"], + ) + + async def fetch_async(self) -> EventTypeInstance: + """ + Asynchronous coroutine to fetch the EventTypeInstance + + + :returns: The fetched EventTypeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return EventTypeInstance( + self._version, + payload, + type=self._solution["type"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EventTypePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> EventTypeInstance: + """ + Build an instance of EventTypeInstance + + :param payload: Payload response from the API + """ + return EventTypeInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class EventTypeList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the EventTypeList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Types" + + def stream( + self, + schema_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[EventTypeInstance]: + """ + Streams EventTypeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str schema_id: A string parameter filtering the results to return only the Event Types using a given schema. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(schema_id=schema_id, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + schema_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[EventTypeInstance]: + """ + Asynchronously streams EventTypeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str schema_id: A string parameter filtering the results to return only the Event Types using a given schema. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(schema_id=schema_id, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + schema_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EventTypeInstance]: + """ + Lists EventTypeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str schema_id: A string parameter filtering the results to return only the Event Types using a given schema. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + schema_id=schema_id, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + schema_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EventTypeInstance]: + """ + Asynchronously lists EventTypeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str schema_id: A string parameter filtering the results to return only the Event Types using a given schema. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + schema_id=schema_id, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + schema_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EventTypePage: + """ + Retrieve a single page of EventTypeInstance records from the API. + Request is executed immediately + + :param schema_id: A string parameter filtering the results to return only the Event Types using a given schema. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EventTypeInstance + """ + data = values.of( + { + "SchemaId": schema_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EventTypePage(self._version, response) + + async def page_async( + self, + schema_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EventTypePage: + """ + Asynchronously retrieve a single page of EventTypeInstance records from the API. + Request is executed immediately + + :param schema_id: A string parameter filtering the results to return only the Event Types using a given schema. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EventTypeInstance + """ + data = values.of( + { + "SchemaId": schema_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EventTypePage(self._version, response) + + def get_page(self, target_url: str) -> EventTypePage: + """ + Retrieve a specific page of EventTypeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EventTypeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return EventTypePage(self._version, response) + + async def get_page_async(self, target_url: str) -> EventTypePage: + """ + Asynchronously retrieve a specific page of EventTypeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EventTypeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return EventTypePage(self._version, response) + + def get(self, type: str) -> EventTypeContext: + """ + Constructs a EventTypeContext + + :param type: A string that uniquely identifies this Event Type. + """ + return EventTypeContext(self._version, type=type) + + def __call__(self, type: str) -> EventTypeContext: + """ + Constructs a EventTypeContext + + :param type: A string that uniquely identifies this Event Type. + """ + return EventTypeContext(self._version, type=type) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/schema/__init__.py b/venv/Lib/site-packages/twilio/rest/events/v1/schema/__init__.py new file mode 100644 index 00000000..2c7ffa6b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/events/v1/schema/__init__.py @@ -0,0 +1,221 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Events + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.events.v1.schema.schema_version import SchemaVersionList + + +class SchemaInstance(InstanceResource): + """ + :ivar id: The unique identifier of the schema. Each schema can have multiple versions, that share the same id. + :ivar url: The URL of this resource. + :ivar links: Contains a dictionary of URL links to nested resources of this schema. + :ivar latest_version_date_created: The date that the latest schema version was created, given in ISO 8601 format. + :ivar latest_version: The latest version published of this schema. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], id: Optional[str] = None + ): + super().__init__(version) + + self.id: Optional[str] = payload.get("id") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + self.latest_version_date_created: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("latest_version_date_created")) + ) + self.latest_version: Optional[int] = deserialize.integer( + payload.get("latest_version") + ) + + self._solution = { + "id": id or self.id, + } + self._context: Optional[SchemaContext] = None + + @property + def _proxy(self) -> "SchemaContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SchemaContext for this SchemaInstance + """ + if self._context is None: + self._context = SchemaContext( + self._version, + id=self._solution["id"], + ) + return self._context + + def fetch(self) -> "SchemaInstance": + """ + Fetch the SchemaInstance + + + :returns: The fetched SchemaInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SchemaInstance": + """ + Asynchronous coroutine to fetch the SchemaInstance + + + :returns: The fetched SchemaInstance + """ + return await self._proxy.fetch_async() + + @property + def versions(self) -> SchemaVersionList: + """ + Access the versions + """ + return self._proxy.versions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SchemaContext(InstanceContext): + + def __init__(self, version: Version, id: str): + """ + Initialize the SchemaContext + + :param version: Version that contains the resource + :param id: The unique identifier of the schema. Each schema can have multiple versions, that share the same id. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + self._uri = "/Schemas/{id}".format(**self._solution) + + self._versions: Optional[SchemaVersionList] = None + + def fetch(self) -> SchemaInstance: + """ + Fetch the SchemaInstance + + + :returns: The fetched SchemaInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SchemaInstance( + self._version, + payload, + id=self._solution["id"], + ) + + async def fetch_async(self) -> SchemaInstance: + """ + Asynchronous coroutine to fetch the SchemaInstance + + + :returns: The fetched SchemaInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SchemaInstance( + self._version, + payload, + id=self._solution["id"], + ) + + @property + def versions(self) -> SchemaVersionList: + """ + Access the versions + """ + if self._versions is None: + self._versions = SchemaVersionList( + self._version, + self._solution["id"], + ) + return self._versions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SchemaList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SchemaList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, id: str) -> SchemaContext: + """ + Constructs a SchemaContext + + :param id: The unique identifier of the schema. Each schema can have multiple versions, that share the same id. + """ + return SchemaContext(self._version, id=id) + + def __call__(self, id: str) -> SchemaContext: + """ + Constructs a SchemaContext + + :param id: The unique identifier of the schema. Each schema can have multiple versions, that share the same id. + """ + return SchemaContext(self._version, id=id) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/schema/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/events/v1/schema/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88fbc3b2c942d74bdd4bae216833aa7aab87aa10 GIT binary patch literal 9280 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/schema/__pycache__/schema_version.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/events/v1/schema/__pycache__/schema_version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5390750e40502a1346286d393c3076d74af03286 GIT binary patch literal 19444 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 X+&LxP7I3@0Ips#7@_m8sj28Yc2s(Rd literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/schema/schema_version.py b/venv/Lib/site-packages/twilio/rest/events/v1/schema/schema_version.py new file mode 100644 index 00000000..be000b9c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/events/v1/schema/schema_version.py @@ -0,0 +1,432 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Events + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class SchemaVersionInstance(InstanceResource): + """ + :ivar id: The unique identifier of the schema. Each schema can have multiple versions, that share the same id. + :ivar schema_version: The version of this schema. + :ivar date_created: The date the schema version was created, given in ISO 8601 format. + :ivar url: The URL of this resource. + :ivar raw: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + id: str, + schema_version: Optional[int] = None, + ): + super().__init__(version) + + self.id: Optional[str] = payload.get("id") + self.schema_version: Optional[int] = deserialize.integer( + payload.get("schema_version") + ) + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.url: Optional[str] = payload.get("url") + self.raw: Optional[str] = payload.get("raw") + + self._solution = { + "id": id, + "schema_version": schema_version or self.schema_version, + } + self._context: Optional[SchemaVersionContext] = None + + @property + def _proxy(self) -> "SchemaVersionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SchemaVersionContext for this SchemaVersionInstance + """ + if self._context is None: + self._context = SchemaVersionContext( + self._version, + id=self._solution["id"], + schema_version=self._solution["schema_version"], + ) + return self._context + + def fetch(self) -> "SchemaVersionInstance": + """ + Fetch the SchemaVersionInstance + + + :returns: The fetched SchemaVersionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SchemaVersionInstance": + """ + Asynchronous coroutine to fetch the SchemaVersionInstance + + + :returns: The fetched SchemaVersionInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SchemaVersionContext(InstanceContext): + + def __init__(self, version: Version, id: str, schema_version: int): + """ + Initialize the SchemaVersionContext + + :param version: Version that contains the resource + :param id: The unique identifier of the schema. Each schema can have multiple versions, that share the same id. + :param schema_version: The version of the schema + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + "schema_version": schema_version, + } + self._uri = "/Schemas/{id}/Versions/{schema_version}".format(**self._solution) + + def fetch(self) -> SchemaVersionInstance: + """ + Fetch the SchemaVersionInstance + + + :returns: The fetched SchemaVersionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SchemaVersionInstance( + self._version, + payload, + id=self._solution["id"], + schema_version=self._solution["schema_version"], + ) + + async def fetch_async(self) -> SchemaVersionInstance: + """ + Asynchronous coroutine to fetch the SchemaVersionInstance + + + :returns: The fetched SchemaVersionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SchemaVersionInstance( + self._version, + payload, + id=self._solution["id"], + schema_version=self._solution["schema_version"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SchemaVersionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SchemaVersionInstance: + """ + Build an instance of SchemaVersionInstance + + :param payload: Payload response from the API + """ + return SchemaVersionInstance(self._version, payload, id=self._solution["id"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SchemaVersionList(ListResource): + + def __init__(self, version: Version, id: str): + """ + Initialize the SchemaVersionList + + :param version: Version that contains the resource + :param id: The unique identifier of the schema. Each schema can have multiple versions, that share the same id. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "id": id, + } + self._uri = "/Schemas/{id}/Versions".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SchemaVersionInstance]: + """ + Streams SchemaVersionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SchemaVersionInstance]: + """ + Asynchronously streams SchemaVersionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SchemaVersionInstance]: + """ + Lists SchemaVersionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SchemaVersionInstance]: + """ + Asynchronously lists SchemaVersionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SchemaVersionPage: + """ + Retrieve a single page of SchemaVersionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SchemaVersionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SchemaVersionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SchemaVersionPage: + """ + Asynchronously retrieve a single page of SchemaVersionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SchemaVersionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SchemaVersionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> SchemaVersionPage: + """ + Retrieve a specific page of SchemaVersionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SchemaVersionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SchemaVersionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> SchemaVersionPage: + """ + Asynchronously retrieve a specific page of SchemaVersionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SchemaVersionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SchemaVersionPage(self._version, response, self._solution) + + def get(self, schema_version: int) -> SchemaVersionContext: + """ + Constructs a SchemaVersionContext + + :param schema_version: The version of the schema + """ + return SchemaVersionContext( + self._version, id=self._solution["id"], schema_version=schema_version + ) + + def __call__(self, schema_version: int) -> SchemaVersionContext: + """ + Constructs a SchemaVersionContext + + :param schema_version: The version of the schema + """ + return SchemaVersionContext( + self._version, id=self._solution["id"], schema_version=schema_version + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/sink/__init__.py b/venv/Lib/site-packages/twilio/rest/events/v1/sink/__init__.py new file mode 100644 index 00000000..3771f83b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/events/v1/sink/__init__.py @@ -0,0 +1,703 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Events + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.events.v1.sink.sink_test import SinkTestList +from twilio.rest.events.v1.sink.sink_validate import SinkValidateList + + +class SinkInstance(InstanceResource): + + class SinkType(object): + KINESIS = "kinesis" + WEBHOOK = "webhook" + SEGMENT = "segment" + EMAIL = "email" + + class Status(object): + INITIALIZED = "initialized" + VALIDATING = "validating" + ACTIVE = "active" + FAILED = "failed" + + """ + :ivar date_created: The date that this Sink was created, given in ISO 8601 format. + :ivar date_updated: The date that this Sink was updated, given in ISO 8601 format. + :ivar description: A human readable description for the Sink + :ivar sid: A 34 character string that uniquely identifies this Sink. + :ivar sink_configuration: The information required for Twilio to connect to the provided Sink encoded as JSON. + :ivar sink_type: + :ivar status: + :ivar url: The URL of this resource. + :ivar links: Contains a dictionary of URL links to nested resources of this Sink. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.description: Optional[str] = payload.get("description") + self.sid: Optional[str] = payload.get("sid") + self.sink_configuration: Optional[Dict[str, object]] = payload.get( + "sink_configuration" + ) + self.sink_type: Optional["SinkInstance.SinkType"] = payload.get("sink_type") + self.status: Optional["SinkInstance.Status"] = payload.get("status") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[SinkContext] = None + + @property + def _proxy(self) -> "SinkContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SinkContext for this SinkInstance + """ + if self._context is None: + self._context = SinkContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the SinkInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SinkInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "SinkInstance": + """ + Fetch the SinkInstance + + + :returns: The fetched SinkInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SinkInstance": + """ + Asynchronous coroutine to fetch the SinkInstance + + + :returns: The fetched SinkInstance + """ + return await self._proxy.fetch_async() + + def update(self, description: str) -> "SinkInstance": + """ + Update the SinkInstance + + :param description: A human readable description for the Sink **This value should not contain PII.** + + :returns: The updated SinkInstance + """ + return self._proxy.update( + description=description, + ) + + async def update_async(self, description: str) -> "SinkInstance": + """ + Asynchronous coroutine to update the SinkInstance + + :param description: A human readable description for the Sink **This value should not contain PII.** + + :returns: The updated SinkInstance + """ + return await self._proxy.update_async( + description=description, + ) + + @property + def sink_test(self) -> SinkTestList: + """ + Access the sink_test + """ + return self._proxy.sink_test + + @property + def sink_validate(self) -> SinkValidateList: + """ + Access the sink_validate + """ + return self._proxy.sink_validate + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SinkContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the SinkContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this Sink. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Sinks/{sid}".format(**self._solution) + + self._sink_test: Optional[SinkTestList] = None + self._sink_validate: Optional[SinkValidateList] = None + + def delete(self) -> bool: + """ + Deletes the SinkInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SinkInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> SinkInstance: + """ + Fetch the SinkInstance + + + :returns: The fetched SinkInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SinkInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> SinkInstance: + """ + Asynchronous coroutine to fetch the SinkInstance + + + :returns: The fetched SinkInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SinkInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update(self, description: str) -> SinkInstance: + """ + Update the SinkInstance + + :param description: A human readable description for the Sink **This value should not contain PII.** + + :returns: The updated SinkInstance + """ + + data = values.of( + { + "Description": description, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SinkInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async(self, description: str) -> SinkInstance: + """ + Asynchronous coroutine to update the SinkInstance + + :param description: A human readable description for the Sink **This value should not contain PII.** + + :returns: The updated SinkInstance + """ + + data = values.of( + { + "Description": description, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SinkInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def sink_test(self) -> SinkTestList: + """ + Access the sink_test + """ + if self._sink_test is None: + self._sink_test = SinkTestList( + self._version, + self._solution["sid"], + ) + return self._sink_test + + @property + def sink_validate(self) -> SinkValidateList: + """ + Access the sink_validate + """ + if self._sink_validate is None: + self._sink_validate = SinkValidateList( + self._version, + self._solution["sid"], + ) + return self._sink_validate + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SinkPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SinkInstance: + """ + Build an instance of SinkInstance + + :param payload: Payload response from the API + """ + return SinkInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SinkList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SinkList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Sinks" + + def create( + self, + description: str, + sink_configuration: object, + sink_type: "SinkInstance.SinkType", + ) -> SinkInstance: + """ + Create the SinkInstance + + :param description: A human readable description for the Sink **This value should not contain PII.** + :param sink_configuration: The information required for Twilio to connect to the provided Sink encoded as JSON. + :param sink_type: + + :returns: The created SinkInstance + """ + + data = values.of( + { + "Description": description, + "SinkConfiguration": serialize.object(sink_configuration), + "SinkType": sink_type, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SinkInstance(self._version, payload) + + async def create_async( + self, + description: str, + sink_configuration: object, + sink_type: "SinkInstance.SinkType", + ) -> SinkInstance: + """ + Asynchronously create the SinkInstance + + :param description: A human readable description for the Sink **This value should not contain PII.** + :param sink_configuration: The information required for Twilio to connect to the provided Sink encoded as JSON. + :param sink_type: + + :returns: The created SinkInstance + """ + + data = values.of( + { + "Description": description, + "SinkConfiguration": serialize.object(sink_configuration), + "SinkType": sink_type, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SinkInstance(self._version, payload) + + def stream( + self, + in_use: Union[bool, object] = values.unset, + status: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SinkInstance]: + """ + Streams SinkInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool in_use: A boolean query parameter filtering the results to return sinks used/not used by a subscription. + :param str status: A String query parameter filtering the results by status `initialized`, `validating`, `active` or `failed`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(in_use=in_use, status=status, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + in_use: Union[bool, object] = values.unset, + status: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SinkInstance]: + """ + Asynchronously streams SinkInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool in_use: A boolean query parameter filtering the results to return sinks used/not used by a subscription. + :param str status: A String query parameter filtering the results by status `initialized`, `validating`, `active` or `failed`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + in_use=in_use, status=status, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + in_use: Union[bool, object] = values.unset, + status: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SinkInstance]: + """ + Lists SinkInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool in_use: A boolean query parameter filtering the results to return sinks used/not used by a subscription. + :param str status: A String query parameter filtering the results by status `initialized`, `validating`, `active` or `failed`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + in_use=in_use, + status=status, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + in_use: Union[bool, object] = values.unset, + status: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SinkInstance]: + """ + Asynchronously lists SinkInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool in_use: A boolean query parameter filtering the results to return sinks used/not used by a subscription. + :param str status: A String query parameter filtering the results by status `initialized`, `validating`, `active` or `failed`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + in_use=in_use, + status=status, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + in_use: Union[bool, object] = values.unset, + status: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SinkPage: + """ + Retrieve a single page of SinkInstance records from the API. + Request is executed immediately + + :param in_use: A boolean query parameter filtering the results to return sinks used/not used by a subscription. + :param status: A String query parameter filtering the results by status `initialized`, `validating`, `active` or `failed`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SinkInstance + """ + data = values.of( + { + "InUse": serialize.boolean_to_string(in_use), + "Status": status, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SinkPage(self._version, response) + + async def page_async( + self, + in_use: Union[bool, object] = values.unset, + status: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SinkPage: + """ + Asynchronously retrieve a single page of SinkInstance records from the API. + Request is executed immediately + + :param in_use: A boolean query parameter filtering the results to return sinks used/not used by a subscription. + :param status: A String query parameter filtering the results by status `initialized`, `validating`, `active` or `failed`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SinkInstance + """ + data = values.of( + { + "InUse": serialize.boolean_to_string(in_use), + "Status": status, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SinkPage(self._version, response) + + def get_page(self, target_url: str) -> SinkPage: + """ + Retrieve a specific page of SinkInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SinkInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SinkPage(self._version, response) + + async def get_page_async(self, target_url: str) -> SinkPage: + """ + Asynchronously retrieve a specific page of SinkInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SinkInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SinkPage(self._version, response) + + def get(self, sid: str) -> SinkContext: + """ + Constructs a SinkContext + + :param sid: A 34 character string that uniquely identifies this Sink. + """ + return SinkContext(self._version, sid=sid) + + def __call__(self, sid: str) -> SinkContext: + """ + Constructs a SinkContext + + :param sid: A 34 character string that uniquely identifies this Sink. + """ + return SinkContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/sink/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/events/v1/sink/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95bf7341b6f9929c784442a4e842e68bf9f750b4 GIT binary patch literal 28678 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�u^hlv50EGLLZ|@ZHNyBPH7tN<+^Zm5 zb08RJXndjUjX-Ls;?|hhKHCFbB8sDTU5g5r!tBp_ko*`4qQV*q6giq50^a0?2OLXG z+lvE!1_ZpSjkK=+Me)tzoz{-o9RS3dTNWcqE13XN@X503Kw(YmtJ72()z^veIK6q;KbbiPnAEkeAe>E!oq*z+8QYHp@eTVSk_?h(f%J19V+Wv`6pqHw_}M`qVUy5@ZlIP{ zxEkvNiIq-u1bFv@M1&)$`e|OmVY5IuzWuLwSI6cn&F?ke?AWu=v1g@sb?yc4>P+1G zS6r;z0DidSW6FK4ciX{s>9ZZu!AF$OcJ6}ueJ>1<5ZMsZ$qc*^06%Yn>g3jcj>SwqNh0BZ7#|S=b8vu* zv5w*0a8%5m!de%QdL*1iCKCMf2Y>()E-Nk3!xExk{9ZM`;oq{>5q(jbHOmCQ^V>6v zyi$G!n^(71*n5st*|F$8M9J_GAQ@NaPp)CR;2Xw*VjjSiK<=nchA=g36ff@7umR6? z9{(S$xX@qgRE!$iP6hMEaG>t!5J_HsW$g0Q{5zmiIX#<-ri4)AuwKKWZt?G{gv z9(Dpc5Ty9%H|2;VNnguNl5%e|k#;PQ?YGHee<7LMWY2A~<8Ex7bX=O>^yFQFmAku- POVYl#OWzRu^2z@JxV str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SinkTestList(ListResource): + + def __init__(self, version: Version, sid: str): + """ + Initialize the SinkTestList + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies the Sink to be Tested. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Sinks/{sid}/Test".format(**self._solution) + + def create(self) -> SinkTestInstance: + """ + Create the SinkTestInstance + + + :returns: The created SinkTestInstance + """ + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = self._version.create(method="POST", uri=self._uri, headers=headers) + + return SinkTestInstance(self._version, payload, sid=self._solution["sid"]) + + async def create_async(self) -> SinkTestInstance: + """ + Asynchronously create the SinkTestInstance + + + :returns: The created SinkTestInstance + """ + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, headers=headers + ) + + return SinkTestInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/sink/sink_validate.py b/venv/Lib/site-packages/twilio/rest/events/v1/sink/sink_validate.py new file mode 100644 index 00000000..53eef814 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/events/v1/sink/sink_validate.py @@ -0,0 +1,123 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Events + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class SinkValidateInstance(InstanceResource): + """ + :ivar result: Feedback indicating whether the given Sink was validated. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], sid: str): + super().__init__(version) + + self.result: Optional[str] = payload.get("result") + + self._solution = { + "sid": sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SinkValidateList(ListResource): + + def __init__(self, version: Version, sid: str): + """ + Initialize the SinkValidateList + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies the Sink being validated. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Sinks/{sid}/Validate".format(**self._solution) + + def create(self, test_id: str) -> SinkValidateInstance: + """ + Create the SinkValidateInstance + + :param test_id: A 34 character string that uniquely identifies the test event for a Sink being validated. + + :returns: The created SinkValidateInstance + """ + + data = values.of( + { + "TestId": test_id, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SinkValidateInstance(self._version, payload, sid=self._solution["sid"]) + + async def create_async(self, test_id: str) -> SinkValidateInstance: + """ + Asynchronously create the SinkValidateInstance + + :param test_id: A 34 character string that uniquely identifies the test event for a Sink being validated. + + :returns: The created SinkValidateInstance + """ + + data = values.of( + { + "TestId": test_id, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SinkValidateInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/subscription/__init__.py b/venv/Lib/site-packages/twilio/rest/events/v1/subscription/__init__.py new file mode 100644 index 00000000..872c9ed7 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/events/v1/subscription/__init__.py @@ -0,0 +1,665 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Events + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.events.v1.subscription.subscribed_event import SubscribedEventList + + +class SubscriptionInstance(InstanceResource): + """ + :ivar account_sid: The unique SID identifier of the Account. + :ivar sid: A 34 character string that uniquely identifies this Subscription. + :ivar date_created: The date that this Subscription was created, given in ISO 8601 format. + :ivar date_updated: The date that this Subscription was updated, given in ISO 8601 format. + :ivar description: A human readable description for the Subscription + :ivar sink_sid: The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + :ivar url: The URL of this resource. + :ivar links: Contains a dictionary of URL links to nested resources of this Subscription. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.sid: Optional[str] = payload.get("sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.description: Optional[str] = payload.get("description") + self.sink_sid: Optional[str] = payload.get("sink_sid") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[SubscriptionContext] = None + + @property + def _proxy(self) -> "SubscriptionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SubscriptionContext for this SubscriptionInstance + """ + if self._context is None: + self._context = SubscriptionContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the SubscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SubscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "SubscriptionInstance": + """ + Fetch the SubscriptionInstance + + + :returns: The fetched SubscriptionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SubscriptionInstance": + """ + Asynchronous coroutine to fetch the SubscriptionInstance + + + :returns: The fetched SubscriptionInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + description: Union[str, object] = values.unset, + sink_sid: Union[str, object] = values.unset, + ) -> "SubscriptionInstance": + """ + Update the SubscriptionInstance + + :param description: A human readable description for the Subscription. + :param sink_sid: The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + + :returns: The updated SubscriptionInstance + """ + return self._proxy.update( + description=description, + sink_sid=sink_sid, + ) + + async def update_async( + self, + description: Union[str, object] = values.unset, + sink_sid: Union[str, object] = values.unset, + ) -> "SubscriptionInstance": + """ + Asynchronous coroutine to update the SubscriptionInstance + + :param description: A human readable description for the Subscription. + :param sink_sid: The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + + :returns: The updated SubscriptionInstance + """ + return await self._proxy.update_async( + description=description, + sink_sid=sink_sid, + ) + + @property + def subscribed_events(self) -> SubscribedEventList: + """ + Access the subscribed_events + """ + return self._proxy.subscribed_events + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SubscriptionContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the SubscriptionContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this Subscription. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Subscriptions/{sid}".format(**self._solution) + + self._subscribed_events: Optional[SubscribedEventList] = None + + def delete(self) -> bool: + """ + Deletes the SubscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SubscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> SubscriptionInstance: + """ + Fetch the SubscriptionInstance + + + :returns: The fetched SubscriptionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SubscriptionInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> SubscriptionInstance: + """ + Asynchronous coroutine to fetch the SubscriptionInstance + + + :returns: The fetched SubscriptionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SubscriptionInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + description: Union[str, object] = values.unset, + sink_sid: Union[str, object] = values.unset, + ) -> SubscriptionInstance: + """ + Update the SubscriptionInstance + + :param description: A human readable description for the Subscription. + :param sink_sid: The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + + :returns: The updated SubscriptionInstance + """ + + data = values.of( + { + "Description": description, + "SinkSid": sink_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SubscriptionInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + description: Union[str, object] = values.unset, + sink_sid: Union[str, object] = values.unset, + ) -> SubscriptionInstance: + """ + Asynchronous coroutine to update the SubscriptionInstance + + :param description: A human readable description for the Subscription. + :param sink_sid: The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + + :returns: The updated SubscriptionInstance + """ + + data = values.of( + { + "Description": description, + "SinkSid": sink_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SubscriptionInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def subscribed_events(self) -> SubscribedEventList: + """ + Access the subscribed_events + """ + if self._subscribed_events is None: + self._subscribed_events = SubscribedEventList( + self._version, + self._solution["sid"], + ) + return self._subscribed_events + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SubscriptionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SubscriptionInstance: + """ + Build an instance of SubscriptionInstance + + :param payload: Payload response from the API + """ + return SubscriptionInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SubscriptionList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SubscriptionList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Subscriptions" + + def create( + self, description: str, sink_sid: str, types: List[object] + ) -> SubscriptionInstance: + """ + Create the SubscriptionInstance + + :param description: A human readable description for the Subscription **This value should not contain PII.** + :param sink_sid: The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + :param types: An array of objects containing the subscribed Event Types + + :returns: The created SubscriptionInstance + """ + + data = values.of( + { + "Description": description, + "SinkSid": sink_sid, + "Types": serialize.map(types, lambda e: serialize.object(e)), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SubscriptionInstance(self._version, payload) + + async def create_async( + self, description: str, sink_sid: str, types: List[object] + ) -> SubscriptionInstance: + """ + Asynchronously create the SubscriptionInstance + + :param description: A human readable description for the Subscription **This value should not contain PII.** + :param sink_sid: The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + :param types: An array of objects containing the subscribed Event Types + + :returns: The created SubscriptionInstance + """ + + data = values.of( + { + "Description": description, + "SinkSid": sink_sid, + "Types": serialize.map(types, lambda e: serialize.object(e)), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SubscriptionInstance(self._version, payload) + + def stream( + self, + sink_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SubscriptionInstance]: + """ + Streams SubscriptionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str sink_sid: The SID of the sink that the list of Subscriptions should be filtered by. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(sink_sid=sink_sid, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + sink_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SubscriptionInstance]: + """ + Asynchronously streams SubscriptionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str sink_sid: The SID of the sink that the list of Subscriptions should be filtered by. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(sink_sid=sink_sid, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + sink_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SubscriptionInstance]: + """ + Lists SubscriptionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str sink_sid: The SID of the sink that the list of Subscriptions should be filtered by. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + sink_sid=sink_sid, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + sink_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SubscriptionInstance]: + """ + Asynchronously lists SubscriptionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str sink_sid: The SID of the sink that the list of Subscriptions should be filtered by. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + sink_sid=sink_sid, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + sink_sid: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SubscriptionPage: + """ + Retrieve a single page of SubscriptionInstance records from the API. + Request is executed immediately + + :param sink_sid: The SID of the sink that the list of Subscriptions should be filtered by. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SubscriptionInstance + """ + data = values.of( + { + "SinkSid": sink_sid, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SubscriptionPage(self._version, response) + + async def page_async( + self, + sink_sid: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SubscriptionPage: + """ + Asynchronously retrieve a single page of SubscriptionInstance records from the API. + Request is executed immediately + + :param sink_sid: The SID of the sink that the list of Subscriptions should be filtered by. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SubscriptionInstance + """ + data = values.of( + { + "SinkSid": sink_sid, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SubscriptionPage(self._version, response) + + def get_page(self, target_url: str) -> SubscriptionPage: + """ + Retrieve a specific page of SubscriptionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SubscriptionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SubscriptionPage(self._version, response) + + async def get_page_async(self, target_url: str) -> SubscriptionPage: + """ + Asynchronously retrieve a specific page of SubscriptionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SubscriptionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SubscriptionPage(self._version, response) + + def get(self, sid: str) -> SubscriptionContext: + """ + Constructs a SubscriptionContext + + :param sid: A 34 character string that uniquely identifies this Subscription. + """ + return SubscriptionContext(self._version, sid=sid) + + def __call__(self, sid: str) -> SubscriptionContext: + """ + Constructs a SubscriptionContext + + :param sid: A 34 character string that uniquely identifies this Subscription. + """ + return SubscriptionContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/subscription/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/events/v1/subscription/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e554d6d6326da677e839968962d84e995c372dfc GIT binary patch literal 28575 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 M&D19X{j%=-e~!}|o&W#< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/events/v1/subscription/__pycache__/subscribed_event.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/events/v1/subscription/__pycache__/subscribed_event.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d88e9aa931642bc04540c9ee253986d098b33793 GIT binary patch literal 25727 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 "SubscribedEventContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SubscribedEventContext for this SubscribedEventInstance + """ + if self._context is None: + self._context = SubscribedEventContext( + self._version, + subscription_sid=self._solution["subscription_sid"], + type=self._solution["type"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the SubscribedEventInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SubscribedEventInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "SubscribedEventInstance": + """ + Fetch the SubscribedEventInstance + + + :returns: The fetched SubscribedEventInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SubscribedEventInstance": + """ + Asynchronous coroutine to fetch the SubscribedEventInstance + + + :returns: The fetched SubscribedEventInstance + """ + return await self._proxy.fetch_async() + + def update( + self, schema_version: Union[int, object] = values.unset + ) -> "SubscribedEventInstance": + """ + Update the SubscribedEventInstance + + :param schema_version: The schema version that the Subscription should use. + + :returns: The updated SubscribedEventInstance + """ + return self._proxy.update( + schema_version=schema_version, + ) + + async def update_async( + self, schema_version: Union[int, object] = values.unset + ) -> "SubscribedEventInstance": + """ + Asynchronous coroutine to update the SubscribedEventInstance + + :param schema_version: The schema version that the Subscription should use. + + :returns: The updated SubscribedEventInstance + """ + return await self._proxy.update_async( + schema_version=schema_version, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SubscribedEventContext(InstanceContext): + + def __init__(self, version: Version, subscription_sid: str, type: str): + """ + Initialize the SubscribedEventContext + + :param version: Version that contains the resource + :param subscription_sid: The unique SID identifier of the Subscription. + :param type: Type of event being subscribed to. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "subscription_sid": subscription_sid, + "type": type, + } + self._uri = "/Subscriptions/{subscription_sid}/SubscribedEvents/{type}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the SubscribedEventInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SubscribedEventInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> SubscribedEventInstance: + """ + Fetch the SubscribedEventInstance + + + :returns: The fetched SubscribedEventInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SubscribedEventInstance( + self._version, + payload, + subscription_sid=self._solution["subscription_sid"], + type=self._solution["type"], + ) + + async def fetch_async(self) -> SubscribedEventInstance: + """ + Asynchronous coroutine to fetch the SubscribedEventInstance + + + :returns: The fetched SubscribedEventInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SubscribedEventInstance( + self._version, + payload, + subscription_sid=self._solution["subscription_sid"], + type=self._solution["type"], + ) + + def update( + self, schema_version: Union[int, object] = values.unset + ) -> SubscribedEventInstance: + """ + Update the SubscribedEventInstance + + :param schema_version: The schema version that the Subscription should use. + + :returns: The updated SubscribedEventInstance + """ + + data = values.of( + { + "SchemaVersion": schema_version, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SubscribedEventInstance( + self._version, + payload, + subscription_sid=self._solution["subscription_sid"], + type=self._solution["type"], + ) + + async def update_async( + self, schema_version: Union[int, object] = values.unset + ) -> SubscribedEventInstance: + """ + Asynchronous coroutine to update the SubscribedEventInstance + + :param schema_version: The schema version that the Subscription should use. + + :returns: The updated SubscribedEventInstance + """ + + data = values.of( + { + "SchemaVersion": schema_version, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SubscribedEventInstance( + self._version, + payload, + subscription_sid=self._solution["subscription_sid"], + type=self._solution["type"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SubscribedEventPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SubscribedEventInstance: + """ + Build an instance of SubscribedEventInstance + + :param payload: Payload response from the API + """ + return SubscribedEventInstance( + self._version, payload, subscription_sid=self._solution["subscription_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SubscribedEventList(ListResource): + + def __init__(self, version: Version, subscription_sid: str): + """ + Initialize the SubscribedEventList + + :param version: Version that contains the resource + :param subscription_sid: The unique SID identifier of the Subscription. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "subscription_sid": subscription_sid, + } + self._uri = "/Subscriptions/{subscription_sid}/SubscribedEvents".format( + **self._solution + ) + + def create( + self, type: str, schema_version: Union[int, object] = values.unset + ) -> SubscribedEventInstance: + """ + Create the SubscribedEventInstance + + :param type: Type of event being subscribed to. + :param schema_version: The schema version that the Subscription should use. + + :returns: The created SubscribedEventInstance + """ + + data = values.of( + { + "Type": type, + "SchemaVersion": schema_version, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SubscribedEventInstance( + self._version, payload, subscription_sid=self._solution["subscription_sid"] + ) + + async def create_async( + self, type: str, schema_version: Union[int, object] = values.unset + ) -> SubscribedEventInstance: + """ + Asynchronously create the SubscribedEventInstance + + :param type: Type of event being subscribed to. + :param schema_version: The schema version that the Subscription should use. + + :returns: The created SubscribedEventInstance + """ + + data = values.of( + { + "Type": type, + "SchemaVersion": schema_version, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SubscribedEventInstance( + self._version, payload, subscription_sid=self._solution["subscription_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SubscribedEventInstance]: + """ + Streams SubscribedEventInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SubscribedEventInstance]: + """ + Asynchronously streams SubscribedEventInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SubscribedEventInstance]: + """ + Lists SubscribedEventInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SubscribedEventInstance]: + """ + Asynchronously lists SubscribedEventInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SubscribedEventPage: + """ + Retrieve a single page of SubscribedEventInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SubscribedEventInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SubscribedEventPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SubscribedEventPage: + """ + Asynchronously retrieve a single page of SubscribedEventInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SubscribedEventInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SubscribedEventPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> SubscribedEventPage: + """ + Retrieve a specific page of SubscribedEventInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SubscribedEventInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SubscribedEventPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> SubscribedEventPage: + """ + Asynchronously retrieve a specific page of SubscribedEventInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SubscribedEventInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SubscribedEventPage(self._version, response, self._solution) + + def get(self, type: str) -> SubscribedEventContext: + """ + Constructs a SubscribedEventContext + + :param type: Type of event being subscribed to. + """ + return SubscribedEventContext( + self._version, + subscription_sid=self._solution["subscription_sid"], + type=type, + ) + + def __call__(self, type: str) -> SubscribedEventContext: + """ + Constructs a SubscribedEventContext + + :param type: Type of event being subscribed to. + """ + return SubscribedEventContext( + self._version, + subscription_sid=self._solution["subscription_sid"], + type=type, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/FlexApiBase.py b/venv/Lib/site-packages/twilio/rest/flex_api/FlexApiBase.py new file mode 100644 index 00000000..3bda5b6b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/FlexApiBase.py @@ -0,0 +1,55 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.flex_api.v1 import V1 +from twilio.rest.flex_api.v2 import V2 + + +class FlexApiBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the FlexApi Domain + + :returns: Domain for FlexApi + """ + super().__init__(twilio, "https://flex-api.twilio.com") + self._v1: Optional[V1] = None + self._v2: Optional[V2] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of FlexApi + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + @property + def v2(self) -> V2: + """ + :returns: Versions v2 of FlexApi + """ + if self._v2 is None: + self._v2 = V2(self) + return self._v2 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/__init__.py b/venv/Lib/site-packages/twilio/rest/flex_api/__init__.py new file mode 100644 index 00000000..8f679516 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/__init__.py @@ -0,0 +1,185 @@ +from warnings import warn + +from twilio.rest.flex_api.FlexApiBase import FlexApiBase +from twilio.rest.flex_api.v1.assessments import AssessmentsList +from twilio.rest.flex_api.v1.channel import ChannelList +from twilio.rest.flex_api.v1.configuration import ConfigurationList +from twilio.rest.flex_api.v1.flex_flow import FlexFlowList +from twilio.rest.flex_api.v1.insights_assessments_comment import ( + InsightsAssessmentsCommentList, +) +from twilio.rest.flex_api.v1.insights_conversations import InsightsConversationsList +from twilio.rest.flex_api.v1.insights_questionnaires import InsightsQuestionnairesList +from twilio.rest.flex_api.v1.insights_questionnaires_category import ( + InsightsQuestionnairesCategoryList, +) +from twilio.rest.flex_api.v1.insights_questionnaires_question import ( + InsightsQuestionnairesQuestionList, +) +from twilio.rest.flex_api.v1.insights_segments import InsightsSegmentsList +from twilio.rest.flex_api.v1.insights_session import InsightsSessionList +from twilio.rest.flex_api.v1.insights_settings_answer_sets import ( + InsightsSettingsAnswerSetsList, +) +from twilio.rest.flex_api.v1.insights_settings_comment import ( + InsightsSettingsCommentList, +) +from twilio.rest.flex_api.v1.insights_user_roles import InsightsUserRolesList +from twilio.rest.flex_api.v1.interaction import InteractionList +from twilio.rest.flex_api.v1.web_channel import WebChannelList +from twilio.rest.flex_api.v2.web_channels import WebChannelsList + + +class FlexApi(FlexApiBase): + @property + def assessments(self) -> AssessmentsList: + warn( + "assessments is deprecated. Use v1.assessments instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.assessments + + @property + def channel(self) -> ChannelList: + warn( + "channel is deprecated. Use v1.channel instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.channel + + @property + def configuration(self) -> ConfigurationList: + warn( + "configuration is deprecated. Use v1.configuration instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.configuration + + @property + def flex_flow(self) -> FlexFlowList: + warn( + "flex_flow is deprecated. Use v1.flex_flow instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.flex_flow + + @property + def insights_assessments_comment(self) -> InsightsAssessmentsCommentList: + warn( + "insights_assessments_comment is deprecated. Use v1.insights_assessments_comment instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.insights_assessments_comment + + @property + def insights_conversations(self) -> InsightsConversationsList: + warn( + "insights_conversations is deprecated. Use v1.insights_conversations instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.insights_conversations + + @property + def insights_questionnaires(self) -> InsightsQuestionnairesList: + warn( + "insights_questionnaires is deprecated. Use v1.insights_questionnaires instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.insights_questionnaires + + @property + def insights_questionnaires_category(self) -> InsightsQuestionnairesCategoryList: + warn( + "insights_questionnaires_category is deprecated. Use v1.insights_questionnaires_category instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.insights_questionnaires_category + + @property + def insights_questionnaires_question(self) -> InsightsQuestionnairesQuestionList: + warn( + "insights_questionnaires_question is deprecated. Use v1.insights_questionnaires_question instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.insights_questionnaires_question + + @property + def insights_segments(self) -> InsightsSegmentsList: + warn( + "insights_segments is deprecated. Use v1.insights_segments instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.insights_segments + + @property + def insights_session(self) -> InsightsSessionList: + warn( + "insights_session is deprecated. Use v1.insights_session instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.insights_session + + @property + def insights_settings_answer_sets(self) -> InsightsSettingsAnswerSetsList: + warn( + "insights_settings_answer_sets is deprecated. Use v1.insights_settings_answer_sets instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.insights_settings_answer_sets + + @property + def insights_settings_comment(self) -> InsightsSettingsCommentList: + warn( + "insights_settings_comment is deprecated. Use v1.insights_settings_comment instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.insights_settings_comment + + @property + def insights_user_roles(self) -> InsightsUserRolesList: + warn( + "insights_user_roles is deprecated. Use v1.insights_user_roles instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.insights_user_roles + + @property + def interaction(self) -> InteractionList: + warn( + "interaction is deprecated. Use v1.interaction instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.interaction + + @property + def web_channel(self) -> WebChannelList: + warn( + "web_channel is deprecated. Use v1.web_channel instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.web_channel + + @property + def web_channels(self) -> WebChannelsList: + warn( + "web_channels is deprecated. Use v2.web_channels instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.web_channels diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/__pycache__/FlexApiBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/__pycache__/FlexApiBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2276ae7a60bdb5284ab115acb15199415ddf92e GIT binary patch literal 2350 zcmd57O>Y}TbauU7ubnT`Mroi0O;Z|Vq}qy4Ra6C%21*1Z1=1cCqhaG6H%r&MW_IJo zmJc~ZB9U6P5<zu|e)GQO&HI|?ABTo= z1lGNuzg+zxO~`LZ^cK)^bxqiIh)qmlE4Jz?b=6cA#8Ymnu9=#|H8)+?O?^~LR4~%*qKdY8(iB<#iq@HR<@9{zE=pzQM$b91hnegoZhhldW(BpSRuFR zN(+RHF?#r+z(5uQB;F-)oJ_Q0DeA{Rc?zu34t{$dNlOkW#uCO*C`kl(x>Lae5@W1{ zSYjk*mwIMdN1lx}6E(OkwuriL9g<%l!22pavy|c$@wca6$${O)rRDdglRUXr5Ku^% zwHEp>B#SOJxHo%!fnJL<=!+s8T@AxVFkLG7Aha6Jr6j!|40&}G6y|;E`61=D6Vh;% z)2h6nZh32#>$ZxyKd@v4B{G&8q2qg&3%EY-*Dc3G?5gWu3rrO%3wwG8iGm>inH+_Vg1^XdxQGnK9JrRTD8-sn2+D<2qy^lq34GsC zmN8jQ#sc)4(v9bzU!AVp2)GC;A1*8`SLS(eJMzYw`N&zR1Ww2= zHLU7w>lP0xu?Ho=gRq2dF>tGtc#at_HdZ}yz}_{#VzfwA-8)*7t~0k$C;|ajOZ^60)O340ql?t`Km8EL^kpv>d4h0 zd&zkyWRH2mIp`s!UG5j*uu?Z6ThRFdZB9|YcC1TN1_@}UFO~Bx> z-4+$R0Zj>=YvFwAYaZ6`W2?IAc>F(4wDVV%<%6y;ZyajI)|s4W32AmYcAr0jC~DbHkJtd6!8jhW%Io&n@?o%B!W>Cd;;LvCfV1F^yF^yfWWptO7!7< zRZovUnEQ*s)=l*o`}rRBFQRmMV)w$|1U4C=ykoI27-bl<{VIf}hpmR=-4gf|qf^QF zTERJC%aJIsywN}+z^NkRkIo$76l=+xDK@8MCQg!;_ctR%O`&7T6Ogxx8Ah1b8{{VgEKLG#$ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d37a718f5c840f4554f148a32efa35fb9a832a44 GIT binary patch literal 8582 zcmd6s&vVF(RU^sL>YtI-mumAj$WsAuTM0NnTI~HBk~tzF!^E zB2t9p2h?G0L>eLapgO9JNn<1*QqO7Q(m2V7)d_7aHend@bDJjKsKJI5+ar7Bi98-Ee@2T})x_EdlGyW}H zWO&PekVj?w8{AZt->mPJ-p%U@z7*GWUD0(-DI5Bol5T*<#^Zdstf=;7WTR5vF7520 zyiux@Z7~G3Y^s$5`+DY9SugE8Hgu-Cjfw`<+8&dR2d-{kK{~0;Y4W^d{NLgLmV>QgEQ$)Rh z)j>v`Ch81UMMjMhHHOt8MvW777ON3PO%OGS)nP_W9gbv1tv-8gSplRNd#GH%14I8{ zSArosy^E9QoI!0x-takIMc)^6{qo$$+!McJssBC+)bmd69+&ZN9le#WFXmWDj}?_& zq!jQnDQ07M{>Anevke|)-B9wy?6=VT3*H*gjeOy$s_ZLj#*g4$t>K$?6?jQ}h&K?t z1T5eFq7`K7!6p5=qHgQZquBQkHm>Dhvg^6qw{G3f-Bk3aMrAj*Unv!o^&Pw+F ze(p}`QBE%z%9UN*W`0M}bH+hQEmh|6x;N&x@%AF;cT4lKTq>6gSv$ zG=*eWm@Sd@v5lXf6QSpEOv@64n(Rmd!bo))W z9m~332k;`U>Rq%}f!3sJwmQw|*vuZYe&Ibm(^WBT3hAyeyuoymLj_(@C`YrzpYPvR%Cjsqy|VS1J6fb8^{&AKrE z1Td#OFuR-oeG~J?-prS);<70$cZK;~cjr4i^WrffA+GuvxdYadEt_+3hIfXecx%q~ zZT_i=@k4LM3srH!6c)O|c$0Q|4+lDA1Yx~)vzhhmfa{1y6E33f0MRKI(Rx$Qn^@lW zW_h_PUN(ixU19lFsU8Py$&f}$;mky0R%ZoBf=rbzX6wL=29X%gKVt)eKuLEn94L=u z8U^wU-8Fc0f`KXE!m!bRf$@CNRSav)op>*)rEH_inILeia>)v@1zaHD&H8B6SwpPr zm)OD{P&U06PogR&Od&yL%~s~3CCG9)uPL%@4al-qDekF|56SXJdwJEi2)n4Vt03bL zK~$IoHW5U1NeB=1K@I{`NPq-FFsL6Ah!-IE?uFpp76l=JS1}ZV1l|r%7!o+AqCrUD z42DEV;4p!PAc5x{ia-K8G8%>ib`mrK39Jt^3JFXRGzJMUdQn>!wMgSQsF1|*zy3AP zanHDyz2R5BKyTt${x^qzPJ6h(AQ4^-*}3TP6qusa6s4w=8C?KdirP}t7C*iYrZ_dl zscG5F-T~V(wJlRy)=aO1ElX`#YMVDR8(^EKws~q>GnejzZH?O2I3|dwncMp6Ksprwn%MrX6hQ)=BRCs+Rhk+#PP48l-Kwq zk1JqGk_!KY$FdgOBm=#bxnv3O2@yVm)xHhHY61H!1njfhcECPsuO#@qi2QhVSP4(J z#!nGs8CcO)o=(6UmWY*V>BRAS%AAJgY#1P4vw6blBHUyl= z^0nsM7II!9Yac?%Qn%LLuoR61kp1D!i#zu~HWe$=wsq&tj%+`W_ zRY0CLWH0_+xL$k6yp3dRz*{k=L*`Wv&+{kTj1}p nfQ`ShuWacymfmZWwy=Z?zkR~p_%86k$0z^r^fd>+ AssessmentsList: + if self._assessments is None: + self._assessments = AssessmentsList(self) + return self._assessments + + @property + def channel(self) -> ChannelList: + if self._channel is None: + self._channel = ChannelList(self) + return self._channel + + @property + def configuration(self) -> ConfigurationList: + if self._configuration is None: + self._configuration = ConfigurationList(self) + return self._configuration + + @property + def flex_flow(self) -> FlexFlowList: + if self._flex_flow is None: + self._flex_flow = FlexFlowList(self) + return self._flex_flow + + @property + def insights_assessments_comment(self) -> InsightsAssessmentsCommentList: + if self._insights_assessments_comment is None: + self._insights_assessments_comment = InsightsAssessmentsCommentList(self) + return self._insights_assessments_comment + + @property + def insights_conversations(self) -> InsightsConversationsList: + if self._insights_conversations is None: + self._insights_conversations = InsightsConversationsList(self) + return self._insights_conversations + + @property + def insights_questionnaires(self) -> InsightsQuestionnairesList: + if self._insights_questionnaires is None: + self._insights_questionnaires = InsightsQuestionnairesList(self) + return self._insights_questionnaires + + @property + def insights_questionnaires_category(self) -> InsightsQuestionnairesCategoryList: + if self._insights_questionnaires_category is None: + self._insights_questionnaires_category = InsightsQuestionnairesCategoryList( + self + ) + return self._insights_questionnaires_category + + @property + def insights_questionnaires_question(self) -> InsightsQuestionnairesQuestionList: + if self._insights_questionnaires_question is None: + self._insights_questionnaires_question = InsightsQuestionnairesQuestionList( + self + ) + return self._insights_questionnaires_question + + @property + def insights_segments(self) -> InsightsSegmentsList: + if self._insights_segments is None: + self._insights_segments = InsightsSegmentsList(self) + return self._insights_segments + + @property + def insights_session(self) -> InsightsSessionList: + if self._insights_session is None: + self._insights_session = InsightsSessionList(self) + return self._insights_session + + @property + def insights_settings_answer_sets(self) -> InsightsSettingsAnswerSetsList: + if self._insights_settings_answer_sets is None: + self._insights_settings_answer_sets = InsightsSettingsAnswerSetsList(self) + return self._insights_settings_answer_sets + + @property + def insights_settings_comment(self) -> InsightsSettingsCommentList: + if self._insights_settings_comment is None: + self._insights_settings_comment = InsightsSettingsCommentList(self) + return self._insights_settings_comment + + @property + def insights_user_roles(self) -> InsightsUserRolesList: + if self._insights_user_roles is None: + self._insights_user_roles = InsightsUserRolesList(self) + return self._insights_user_roles + + @property + def interaction(self) -> InteractionList: + if self._interaction is None: + self._interaction = InteractionList(self) + return self._interaction + + @property + def plugins(self) -> PluginList: + if self._plugins is None: + self._plugins = PluginList(self) + return self._plugins + + @property + def plugin_archive(self) -> PluginArchiveList: + if self._plugin_archive is None: + self._plugin_archive = PluginArchiveList(self) + return self._plugin_archive + + @property + def plugin_configurations(self) -> PluginConfigurationList: + if self._plugin_configurations is None: + self._plugin_configurations = PluginConfigurationList(self) + return self._plugin_configurations + + @property + def plugin_configuration_archive(self) -> PluginConfigurationArchiveList: + if self._plugin_configuration_archive is None: + self._plugin_configuration_archive = PluginConfigurationArchiveList(self) + return self._plugin_configuration_archive + + @property + def plugin_releases(self) -> PluginReleaseList: + if self._plugin_releases is None: + self._plugin_releases = PluginReleaseList(self) + return self._plugin_releases + + @property + def plugin_version_archive(self) -> PluginVersionArchiveList: + if self._plugin_version_archive is None: + self._plugin_version_archive = PluginVersionArchiveList(self) + return self._plugin_version_archive + + @property + def provisioning_status(self) -> ProvisioningStatusList: + if self._provisioning_status is None: + self._provisioning_status = ProvisioningStatusList(self) + return self._provisioning_status + + @property + def web_channel(self) -> WebChannelList: + if self._web_channel is None: + self._web_channel = WebChannelList(self) + return self._web_channel + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2ef7caca48fb41395b1dc4a0d22d19dfc31221d GIT binary patch literal 11514 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/assessments.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/assessments.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a959ca9f34bcc13083158291344887796ae0e210 GIT binary patch literal 26616 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 QjRQ`+w0|PdFB{AM2YH7Xi~s-t literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/configuration.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/configuration.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bef98cd2485089c63f475d70c3b8718b665dd6d6 GIT binary patch literal 13956 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 G==gs?0l5$W literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_assessments_comment.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_assessments_comment.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8a4f3582e401264038912ddf930376d548b665a GIT binary patch literal 20146 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_conversations.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_conversations.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7b992b88248f975cffb3a2d9c9be9922a25198c GIT binary patch literal 15595 zcmeHOZ*UYxcAwdu*?-!V1S=#Y5FR2xEJ!PX!4P2#0&GrYStcNy%buL|Xs1^i*nc-O zi;zyFTsCzPRdyVzl0#Q<)sfUy3dK&)rIL#;`H;JON+n;k(N#$`WmjC4q>_AFPIBSn zQ{L;InH{ZG^4Y=3U711jboX?>*MDBW_v_ca{~U>gIC$Rvm)FL>afIXk4HNbwT9K8% zfXE$A;S!v}E1nFW^&~u5Z^D}u5<*r?h*@94m-Q$7*+3$|V;OHIm<=UD*}6m>O$(WD zHj;?YxR|NWHY6Ho+?Q$0Zb@vRaeroOHkyd?oQFHlDS?}u5+srLysQn0CYl?9+&U6< za<|dkFyux^gOl4lSs!bV|C8sqkOa^0xT;I3yh5Z2S(nC0j%cz$6lru4KPQt(sqzmq zFe`}_>6-=Xl2$2K5u}6Fl1a*ST9T%ne~^s{_=6(sOEQT$G>HMSoF0K37E303FlG^9 z**y;3I3tOLvAK|Z6$4~AV$+o*0`< zpD|9PLUA;srlet3=;HI2hNb=s194V$=;h((`>b)!$U3bg7mfUy!IoYwkQ~&J&a)ZF zYjMhD+%O7yUr$dSKFbBQ+nONwY>?DAEpjd|2-UYRWK$K~*=*z{>?g&FAEdDPGP�(4=IQx0cjP&c1xs;uZdCWS6=tNWH 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_questionnaires.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_questionnaires.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09cb1c617d2aa6d92209340579e5931e3a1041fc GIT binary patch literal 32734 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_questionnaires_question.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_questionnaires_question.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c828082f74b64b7f6e310ab717ca948d121c75a3 GIT binary patch literal 30731 zcmeHwdvH`&n%}+s?pEu8B!r&k@)QkHinX*b zwvyj>&b_y9w^}cISkJn+HmA?~eZKRZ-*>*Fzb!5G2>4$A`AdCQ_1I$e9(&Bu2xqDosi?Q5=_Zq>G&W82Lb^p_aAwXSAY_-UvA8BYOzdFC?84|2(VIzC283B z58mX!|A@jv0s-=2PBN&-;bZXOwm_hbY+5GVyUoZqFw7G3s9HQ^&aD?X^&c1J=f)wVy9OsTGC z`%{rbJQ!8&N8_-luDvN5{e+^Hb|nYnA>HY-swH7LDJzj+G%_Ts?wr+eDi|G*lRi-` z-y2V+g7J{ND-lo0XHxL0(7g`H$;5yXlHup2qD^k+^Rkje;Rv!F44#lfe4=x+Tysnx zvIxQtuoh*ZN5p!xgvB1KTL@Q$EwU|amF==acJ^B85It;@U9y90y^ae)uNbzUFYR&5 zo^W;8dEWM(mSInc>^)hpIZQu@?~==qTe+5-L$2txVHMhYmMkiT2PrCxr+84lz4ma4 zTv1SePzh6OO7mQ0d9Lz2mm@6nmW3+l!$QN{VBp7SMf^O4t@*!z3C5053 zQC}h|L}?_wdJ-zdmXH*Tho!{nI1wIDAKjZ%3tqYJX-z3wJ3Y|U7~PAvM0c5U#NrPr z5k@U|B$J2Kn^0K0izN)9H763vAWyYRbIq9~7*C#-l|WKX1@z9%dCi?N8cm!I#Dl!B z-e~ZIB!SF=a2}7!EM+*7WcKbZ=H&UB8#<5#32H~LquR0}G2+HYCM8FsNhv7x2bEML zG!Vrk&>KvJ{Vb!Zwga$lhGm$gmWQcQ^-ht`+C*oxxWdvTd4GXU$d{}%BtN?wYFl;%g z^FG{*nPDTwun^Gr5Tq*}*P`c!xJFH8iEA~*HOieOuFVwJp;vB}xOP)q=R9#8rns(o z;yO)n-Fn>AQr&j4Mz`gDXQ`n}&q@D9Z+Z1pv!rpG;+D=6*JFxXrpFCihOKABB)HOH z;iS=4JyZ}PB5I-UxZrx>s?b9R1z$zBdUD~a6_ebzM71Xe`ej9R1p<+HBozp#))R6{sYP+DOojG#h4yZxfs95n zn#drIUUf$J+EpGQujOP&!(DVS2{ZpITBHGRq(EE^+3d8B|A5>PN_@Op^6L@aUJ<6|l z*jgk?{u0I)=Y)G+!CiLInReBVF8jo_;?DX_*EfuBn21fT-+jUMiK{lVVe|FJ#~+{g z{^W)y$)hgQ?0@&{+h-@*C!2R%u)S8AnUUhrj+-ysc;Qz4ozQtv@f8G@b> zyTuE(*Gs3-R6%tpa%w<{hcs$NegcgiqkrdNxlHq(d<(vFzEqB?2`3Gzm5YXS2F=O& zhDDl*?_1sjZKV(EgC$M=bk;DM@tPsumq+jZaMstN|zEV)Z@kL3TiD3W2 zW=V{PRsui0P^Rs?Ym>Aw&c!Y5%BwgkICpe}vIZNKXRB{qWIsNeLi1Q%Gj|?Zkyz8( zwy3N@D&*0OpCru%N%2uWjsUfCaHw_e{Pa5cdGsBW%eP>h6S5V8x8jY?i=DSiq)!{W zG8NUAOD~mXnpRx>?v?M3b*Gyizh}2Lm0j5V+JUS~sHlEpoQ zhJrK}A#KJWgwIblN890;ZH}HaW++R;jA8M8V`s+9vfTe`qa%0AQ8^{^v+2UxYZ`2D zIKh~dS7FXkb(z~BJ$>ZJL9m~Ucu9S7Ff1#kOpFZ8!NUs!TRg#hep^z+xlP%Jd z!Dv#J5}0tx=}1yG>W;D7jQ05~$|n4%4xVt_!bX$@C8_%)KCa3(*cUvgJg);tl3WFY z4JtC)XS*uX7a$2xdc(Q`U?P0?=W4vBP;_2sM>;u>IWykDQA#6E| zas8p?vh^R^?ZRPUyYQOrUsz9zKI{Eo82!Oc;(baYPHQ=oP!ib0;xcDSd3*k0jKrqfBdKXv@N;vfrH5?^8}Rk^UF$hS_SNrvCB^mtL4!+L~V4 z%7?qgkKwNId~S?62EM{`KS>PPE0RzAbFta>BfC#zOor;!SsP-uO}q%PAt8g?go8LN zTD8-=VJvQr41-e}whh~d9a!Po&OGv^=#nKJ&n|;PVpO z7rp|ip!D>$^E}MG%BhX%M6CxJYeGw;Gfq5#?&9Y;Q{JY-DvxRMFgDp)Q|B1eg`G!p zmCVsVY^nonw8D$s62~2!wZck4i=EHH?8rD?}{z9F}q)!>(mn#Pnyp}D4xEs5QnJoz?W|DMYlxB3r7Sw3^Nf!(D7@BS69z?M&c-c6_Om0MXGglnMb$xvtzc^0s#^RTRqW@Ic-w{oOz$EYR8+nXVQwY;w6X@slhi~kj=$iQ6 z==Q5SuIw0FG4|Y4LtDE3@NcGVi1W(w72;552Nz2D2~F1lq_ZPC#%-$Y zWFiu0hbq+$SRg1U{nin1_Hq5QG3F@6zW6OnoKDQji^F=7{g;!7fzBm zXQu|)2}L135pY%d$)LJNp03n762lZHE)JS zx4hYR>5;6HdAWpT%SV%!V!vilvl|6R*{>{Kd(*TPwk+AQjY9hq;!hhtY`iOY?4E0T z##W7;8rzUwy)8@bpRJyzpKQIbdG#vIokPdBw?$>WZ@blQ$z zRI7E%_5I`fGaEKt?-=jMG`GGx{Pu8W{l@Dp<1Lw%%@lUGyb&oXYqECyqSCcZqld4p z9ep9a%$IeN7b@L2y6ala=)QE#x~!YLJVI6NsCD%D(UNrK>TC&ld4-yW(Jj{;qmQST zg25oKvb?;g7@XNXo2QqMZKwFVTel9k-7~uCa{)i>yvYVVgh4kx9hRM54Z4*t2$iiQ z1nspkVW;)Hw+F(|lLqK(jO~y~2Mlh(0{)>WCTfciS3#t+;Cn~>Ba$x| zA%j+*edwmagzp8^&uz3OGnYTU0Q@1g5efFEt7-I7-eh zGbL7oA(TT~4Pd_QIcy@4)Zl?&9FTtuoD6)pJUQ8RRzF%&-ryPppIupj-eH>w+gaI` zs@ehrN(8WHGlemU1dSWt6{y=#?m50Otb}W5o^4#~BSR=~18I`P1(8soEKeu^ic2WF z8CqX@NW5MB%vAMr>FVe13YMjwOj+d{@r&`hR@i~LyE&a=CrsL9^AIv)cKsM3kU1LM zXEAOQb4!dEIOd3D?${B*;5#kF=UFjc6q2u^60c#)`&Rv46mhA_R#X^wU(7hC>e#(! z|DGdzz~VV#GCq`WOU~rw_b4GDX$_R zda8U?x_s5xV;@xiwC=;YpFMTEeAQ(6k=w2#Gx1Fty;t#X`fp%xmU-?m`CS=7ocL|C z;Hh?nFnlFK1_@@Amtk~kL#HIjhm9R$(`f9Jei-@V#URMdiy1F|i2Q_ddI<*O+3!^^ zbl{fOU4HS>i&IP6(o5SiRSnmw->rMQZsIB6(={851D2I2_g4h_`*B5)9kAQZwBklmD;-^1A##`Fbp11Y z-^-{?Jk@$+uwTAkVNP%|39-2Y_nPE>9BU3fd-%w>O^KpnN(_c-0}vflh{UmtQE7$E z=Vf$}FD@D*bqO7ZE-y%|Dmitf&tRoB2?78F?ezCe>SY1YS@-; z*fw!yvf+u$@(r2B)tTk%Gs|1j5V8kDS$88yiDGyvcFuHxB`sO1y9=TPP-t_Ff{NwSArOycd zUtsAkgy271{+I}+FMs)C8*-bsp|3y=Jd7Na;cny60Gy$~lTf3sLz;WaL)hE^_9tK;;$q6FhDtk~Bg^md`YPyALN+G`;7*%^Xv9$TT*0b;#>RK4D zrGt${;L_(Yxs-!c#B-Ek$D*-NjsGSnR5?WX9ED-VIvJ9;@S_+jpNZtJ=?5U7fhbnkkBWJaB6$#|NWa;&2B=tF z2r9yZfr|LeZe9>@w@CvP@mmNgl2-w!NL~e?B6$^nisV%QDv}pK#f{TT$QE4~sEDWx z@T4RKfG2r9n7Z|fg{UG89*wH;X$-3{y%}C+f+FO1Haih5Q&EK zuFv5@_1v{WD8F}RWTJsU+J)+N=^(#ZO=wX+uFjF%DG_796jXGKRFE*R)kFL$?9KRL zjWrVp)r-rkxX8*&oKGM^{pB|&_%4wO;$zv7zhc`&_-5=z?ACWC%MaXk9pHy|M9KSD zuTuA3hQtc>B9cC|ZPB!k>as)WMPg+m4AWgYPV_d+-N~#eI&JPl9jEC+43q0rJT0=C zcl+Fh^oy#^SrBRk@7{}KV|0mCW<5E5Wc)xkj!`dBC5a%pAPdPXYk&lyYV_$#-_Kgf z_2Cf#_P4m$epeg$9Ou%iCyocQ;PSG9AyE40rsaGyQ!Z<67s9!}b zDkszfjmcObT%6|?-C}Q=>Y%1pimqD4OJVAdU)OD3(*@gw+_=s4mvP~XbZT{F*tr=^ zW2p4*7`H0}m|MyzGDyI!kQ6~VO~xRMaSMmc7+S`RB9NKSRRCXeoQzm~)xj&4!^U)A zdhVsX0ATu`A^RcU-0fvVhS%WxL}K1T8WSpgN5i38J}rQ!*B3>l@2v1=q+NIIRsyW; z1aaZSyXr~ts{qi&4k?8s>{Zlyx&!rJ2;fZD@xEDPtO!WF2(ktkxSqklp5Wi13ytMt zzR8Shm3)#sq;@lOy@^ujMAIzm=d>zM{9jbfNvAYg9$zc9Q{Kc%VsuTpM7G%oTK8NO z&C92XcI%nAA%67!W7vwq{eOah`M?Ylq2d|;C6TKiBV|6;|G+5LB4Pb}vSo(xyE=C^ ziXVMj+*xn?SZIK~TeU|cu}DgF_X8yXFEAvB44F6@=)gb5r2Pdfi_-mp-jB|{jM%~8 zm~%y5^f78^H?&Ww9DE}V#OBsKv)Fx@VF#EuEAgg!S#;FV$vRpA6u z2Gz7Mo-i;0WfC3~3hJ-i;E@QNIFMydJ%>F#L^o-fR9cD#ha#X_^rQj3Yr*qF7IJTI zB!rvdDFnjVpGYPn^q>RY--tvRbz@^;)Es)JC@0h>hs{N?t6u}r6siP`SI%cZo$^Xhso6uSMt~ z^yWy?XthR*SXZ=5NBhyO5_1?DPVs@*ad;vJy>r1H@{aIpW3$d@Q-gwk=Z!gu)s0!5= z37}>Wo+I1i11U^u-m|#`m^f^5uk-P$1yi^x-;ej0sE32ltnQnusyw&TkyIb6bu58_ zHfBAmphP65MT+=kzXav(bu2}Tv}xnUjXu-4*j+43!ar>-8C4Ifs_yQQ>A!` zfVXKy7_C(RvKe_OKZJqHag6sZq2>fw@}z2`zEd5%>ALD!E-|HJS*i}6 zK>0KHB#9N&hKu94#KA6z>*WRgSK3B?4`~1rk1QvFIhkK=!9=_Nyi08 z2DjdDLqk(Tt7*jT@*3PO7b@ze1smPUfTV|OX!DD4*LIJsome*BHd)?&+ttotbu;B9 zdj2Z@O@9nSmwy(ewjiN}AKik|>FnZYI=Dn@-c^Fd(s)}wjR)Vjit&y1pclxtG42I? zBk$&iq@M`FL(>0{^lQXQ`o@!f1qvg2B8;8I`)Wv^KS%1(-sh2-6rF87VCo^VW@zEM6|{={w9 z6WLP4xu2x-_AA@FmWv;XT}`%svl_NM9^L?2Nk7yKw1UqrM&%hsF>HgzK1eHl@1a5T zfw#5<{}f3KdP`j1Z-KlLLzrW6kH({smt}(wp~qrCzw-E48QV4ZR6HQZ7y{z7rI*;& z{F2TV;enV`!l&ozVyS>gT_l^)(phhukl*%Prt1 zS@*GNRfPBD{N^lON*(*#}=6PZ2XNH@UQkume;)C zB&+eyy$x|j?1y2B%ywE}{G~NGZl-qy{3SK}A^BquCh5dQI~MOp&wMS%e;Sg9@#60c?H@1hBd6bHTo%>~lLbEA9y}?$k8?$|{srWi9ajB1`^X z{E7myg3Ims4YU4+-3)uBu2cLoaii@mN2mDbmd9-G*tR;x#Lb>@>sH76w#RG}VyE~o z#jTE?h>zL+wX0Lqc-~avWjU^vF#eb0XCZ34{uw-CJ?N~NM=UOkpGOdnSFO(*h%DEg z3R_H?Q;xYcr-tzoN7!Z($m62fFfN*Ppti+D<%<%-JBFPm9VgekVtAL1d4T_Q2OBZY z#{Pc@FC|2PAxc5uTJaOWa;bv}nVfsm)J44pvuZ}0bDZ!Y?NK_gzw#M5G(gYUM`AHN zkPb{WI%vYn9_0H~G{@(KYuUtNlZ-B%o{*2we53am>4_A2gr5O|=1Zq$0F}>3o>Ie6 zHMXAvp6GyNB-Rhy9Q?Z!iV}#90|I)%7z%TCgfY&7$8un?MF&(F3jF9sQ%@SmBei1T zBWctlPu+l+7P?tGO>2$BCx-=v06%sc6|b&{vgtPJeOE^`7&{&g?il*k+|!4V9_n$E zs(_aC45lY5?VNDyxpM;Ju5gclsn*bC0@ZDdjzWros*Bu*(P1Xhn{kamwLY~cUqjBp zW?GWzrOgn;sn%GqpKHAlK+5kG`~bFbcOfYrqwsMu7&2>IDNtSdRpq1`p*mZkF{G61 zf*4ZjoFGwT5+#BmU8kwK;g-Os%hz2UxiT_#?8C<=mp_$hYNn^X8rS4qDll|gi(M*c zYSUHOs+L{uywo{WwI*G)CWD7P!dD|#A``X`PC%8ddM(s#sy!E6_Z&jS=84reTW_@9 zs+}x<=C1~)Y3%g11&7r|F?hq`BCY$aMY%tU20$v^K`XQ-i52DiA zfa)sf^FvaNC8vFJl4|9B#4?d;gJI(|-hG*2@iOeBoE@S(swi6X-z+oq5EAAhe;eulNOr+)Hf?XkCFB zX>b*0MzdcIMR1Ye>t!`_UD{56AxQsoK4A5Z9@=k6>NS}+d^HIztMqS?+hS`2h!zv+ zI>Lz<-p5fL{Goc)sTI%kV)RE${w+p8`2a?qqNeJi2|`nTXdzdl^~fL6%Gi#~Ai=E^ zs%tqr(44Mno~rVvtNc?{+tO9rCI&t@Ia#&$g6q@rO~n`i^9-Xo$ru5;USxn@uor&C z4rX6wUKT=Ti<_s$=4%aZG|$&LHs6QSH+N`Z)0duaVHEt|VT_f34?`{0X09fjVg&sb z0`liAKdbx~=KDty6V7({(#qp7XY*{%j&V{J?B}(2C!gG(Fa=2O0&k=Rk1jnm}$gVz4)p zy#|I^S5jF8kD+<~A`?5rVK^qyy6Ji(z%d1vIUdzsy%_TrK6PR49U>EK>-sXisQe95 zEB}#_7xO4S%>S2 zoWGx42njHLD38s!7B&U;%m&jmxvvk{Cp_`-%-L+v4Y^qks z9~FYtn9xO`y`Q0y$~$Cxmy92f!4AsT$o3H#|A7oP!DtRCe@n)9$T&_$2nJ(ApWqjc zUMEj7z6au)JdQ4As_bri$2I4#@d{%{?jcM5bmiT0KPi#c)Mf2tff9FBP1eb*E}^y| z>t{w$V{5v`pLLQy-kibXoEJy3ZgP2qYP{ZgsWVHN z;F^`E@^E{G#3gdN?mq)S!de4gGz!lP)R?Z8^;^ql3Oo*Lbdu3npUGe1w>JT75= zUZJ{fv}&|>v;mk-mK6g%5>Lx?ISYn@w)QZrHqU;iYWI7h2c2+j3%z)|PrSY10KIvO zUa9rM%+%v~J+jkt{g*=q7T%>7yqX?|SQ{Bx74IT4+1 zUxRWCzhJlr`{@-d+L736!#O(0NhPC$L;}?k?av1u58^LSc_=<<&@m#bHk!ix5$&Y` z{ZCverIfs>XcQbS*q;l^j@tnhtOewL8P3x5xw+q literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_segments.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_segments.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ab6ed7d28333994951587ec6f195a2a3e0e4833 GIT binary patch literal 18821 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 BAXxwa literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_session.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_session.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a27b7d4687ecbbaa3092c137656774374a140d9 GIT binary patch literal 7384 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 G4g42nCGB+p literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_settings_answer_sets.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/insights_settings_answer_sets.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18275751a95c92ebededb3e7595f58b314c42a07 GIT binary patch literal 5071 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_archive.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_archive.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbf6571f09dbf644c9436aa20242325ac736a485 GIT binary patch literal 10491 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_configuration_archive.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_configuration_archive.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33ba504b734a028dc96f28732595b72651d195fc GIT binary patch literal 10503 zcmdryTWl0pmba?A`sHrBV+;WTqzou_L)^_{CJzHn3{Jp2j1!w=wsE$m=qlqf{mQLs zn>Mz@CTP}Z$r5%nVr*C)UKZr|U$NXWn7gL4UXXZ9bVGe#7W zBnqeSX)ePhIS%`tG@tP#JsEG(n-P*i#+UT5ac|n62_yrVU^2*_g>)!Wm8@cYUpkzL zBqOZvPgiGZk~OR!NJlfzC7HFC>i(U7cVqg5~(R;%36HEc8jqt$AS zJ6cz)iACjq;|K|faCP@-x|qr-syHa?;#oDTQrS=y@k|k?B}o$Je{cYYBwWbuRM zhAIO=Jh)7f*sjB(IPCtwFh0O9fLJqUnDf4-S5fK2^*Y&ZM=J z*lhv5`&L)C*xK11x0ZIC?0&1+KIgQovqf^j$SpW*@nl}j!W!|g#ep1+vt9ZOBd<3n z5;>Tb^IDV5Aec7PR38Ir%Zb^XA*zaIFk(_{lZ>1#$mw)39{LXyk{D+O6kx2OWz?A0 z^t5J+rngN?8D`*Q-q3PcIc*B3ve1d~W|gAqD%Iq)Hl&)q0XbbzbwE(lp4AOGn^F(u zvW9xzfT5@}^scJs3N)p{SopZ68)eV__f)C_;*=$XliV&=LPVuR}US6rX7U>8<44}YYGa7Di*TZhXqyC4XS0&0wZNZ98|>= zRhc@1xM+%+HMHI$V={`NXzeC0*iNK2CoK7~Hjz`QTp?>n?q*%>ZDOvMVLIJvO@7em z$lBoGVBBD$98cvk2_=`(6Plb!fczzFOficOtBAS5Eb0s>P9;LKaz?d| z1A7*U0J<#h@|OgmO;L>rvxTB;zK z8zNI7G#0&bT2~hk4cwLNW3;J;5q46js-l(^51;532m93Q3Y(+(cKD&^)s)t&ffEt|A1u*On+W3rgO4ldO##o-ZDK!w~B6U_MgB*{eT-IhC6xLJ4`--`C;xB z%;Ck6VZPsS#MTgN6>dNVb!Nb(LXx2OGe;lq>`5DT8(QT?W=$2J3T(TLxArgY`SG z#&b@uzt-u^-;R zOwU=>V3=tgpr>oGS%=N@*q~c6qne&WIhGuUN7v&VdJZ!vG4Tbv3^-G^9}`TkuBLlw z6v6P&Ez*OM#C)kF>Bwsg8!pb}4mJ0j0`I8z9BXgy?rBr?b4D)TGmz6#YAbkWqh~

    `vsF%RpM@eTHNoN<3erFTmDA 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 W#{}<>2l#rfjl0?Ngy5ZV|Gxp{Ch+P2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_release.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_release.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d48af40ac893e5e2ce1437748fb0e261309bfb1 GIT binary patch literal 22413 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 WQ_`Y<*W#vL4+5nh3iM`N|9=2SYkbK7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_version_archive.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/plugin_version_archive.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96521fdc2ffdfab6d2173329cb2ae38f0c4c1227 GIT binary patch literal 11295 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/web_channel.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/__pycache__/web_channel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d65b7473f92b4b9e009f80383fbeba39cd3372ba GIT binary patch literal 25597 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 Tho8G!CItk}e8$l)>&X8DX7;@< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/assessments.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/assessments.py new file mode 100644 index 00000000..130514b2 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/assessments.py @@ -0,0 +1,685 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AssessmentsInstance(InstanceResource): + """ + :ivar account_sid: The unique SID identifier of the Account. + :ivar assessment_sid: The SID of the assessment + :ivar offset: Offset of the conversation + :ivar report: The flag indicating if this assessment is part of report + :ivar weight: The weightage given to this comment + :ivar agent_id: The id of the Agent + :ivar segment_id: Segment Id of conversation + :ivar user_name: The name of the user. + :ivar user_email: The email id of the user. + :ivar answer_text: The answer text selected by user + :ivar answer_id: The id of the answer selected by user + :ivar assessment: Assessment Details associated with an assessment + :ivar timestamp: + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + assessment_sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.assessment_sid: Optional[str] = payload.get("assessment_sid") + self.offset: Optional[float] = deserialize.decimal(payload.get("offset")) + self.report: Optional[bool] = payload.get("report") + self.weight: Optional[float] = deserialize.decimal(payload.get("weight")) + self.agent_id: Optional[str] = payload.get("agent_id") + self.segment_id: Optional[str] = payload.get("segment_id") + self.user_name: Optional[str] = payload.get("user_name") + self.user_email: Optional[str] = payload.get("user_email") + self.answer_text: Optional[str] = payload.get("answer_text") + self.answer_id: Optional[str] = payload.get("answer_id") + self.assessment: Optional[Dict[str, object]] = payload.get("assessment") + self.timestamp: Optional[float] = deserialize.decimal(payload.get("timestamp")) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "assessment_sid": assessment_sid or self.assessment_sid, + } + self._context: Optional[AssessmentsContext] = None + + @property + def _proxy(self) -> "AssessmentsContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AssessmentsContext for this AssessmentsInstance + """ + if self._context is None: + self._context = AssessmentsContext( + self._version, + assessment_sid=self._solution["assessment_sid"], + ) + return self._context + + def update( + self, + offset: float, + answer_text: str, + answer_id: str, + authorization: Union[str, object] = values.unset, + ) -> "AssessmentsInstance": + """ + Update the AssessmentsInstance + + :param offset: The offset of the conversation + :param answer_text: The answer text selected by user + :param answer_id: The id of the answer selected by user + :param authorization: The Authorization HTTP request header + + :returns: The updated AssessmentsInstance + """ + return self._proxy.update( + offset=offset, + answer_text=answer_text, + answer_id=answer_id, + authorization=authorization, + ) + + async def update_async( + self, + offset: float, + answer_text: str, + answer_id: str, + authorization: Union[str, object] = values.unset, + ) -> "AssessmentsInstance": + """ + Asynchronous coroutine to update the AssessmentsInstance + + :param offset: The offset of the conversation + :param answer_text: The answer text selected by user + :param answer_id: The id of the answer selected by user + :param authorization: The Authorization HTTP request header + + :returns: The updated AssessmentsInstance + """ + return await self._proxy.update_async( + offset=offset, + answer_text=answer_text, + answer_id=answer_id, + authorization=authorization, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssessmentsContext(InstanceContext): + + def __init__(self, version: Version, assessment_sid: str): + """ + Initialize the AssessmentsContext + + :param version: Version that contains the resource + :param assessment_sid: The SID of the assessment to be modified + """ + super().__init__(version) + + # Path Solution + self._solution = { + "assessment_sid": assessment_sid, + } + self._uri = "/Insights/QualityManagement/Assessments/{assessment_sid}".format( + **self._solution + ) + + def update( + self, + offset: float, + answer_text: str, + answer_id: str, + authorization: Union[str, object] = values.unset, + ) -> AssessmentsInstance: + """ + Update the AssessmentsInstance + + :param offset: The offset of the conversation + :param answer_text: The answer text selected by user + :param answer_id: The id of the answer selected by user + :param authorization: The Authorization HTTP request header + + :returns: The updated AssessmentsInstance + """ + + data = values.of( + { + "Offset": offset, + "AnswerText": answer_text, + "AnswerId": answer_id, + } + ) + headers = values.of({}) + + if not ( + authorization is values.unset + or (isinstance(authorization, str) and not authorization) + ): + headers["Authorization"] = authorization + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AssessmentsInstance( + self._version, payload, assessment_sid=self._solution["assessment_sid"] + ) + + async def update_async( + self, + offset: float, + answer_text: str, + answer_id: str, + authorization: Union[str, object] = values.unset, + ) -> AssessmentsInstance: + """ + Asynchronous coroutine to update the AssessmentsInstance + + :param offset: The offset of the conversation + :param answer_text: The answer text selected by user + :param answer_id: The id of the answer selected by user + :param authorization: The Authorization HTTP request header + + :returns: The updated AssessmentsInstance + """ + + data = values.of( + { + "Offset": offset, + "AnswerText": answer_text, + "AnswerId": answer_id, + } + ) + headers = values.of({}) + + if not ( + authorization is values.unset + or (isinstance(authorization, str) and not authorization) + ): + headers["Authorization"] = authorization + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AssessmentsInstance( + self._version, payload, assessment_sid=self._solution["assessment_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssessmentsPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AssessmentsInstance: + """ + Build an instance of AssessmentsInstance + + :param payload: Payload response from the API + """ + return AssessmentsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AssessmentsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AssessmentsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Insights/QualityManagement/Assessments" + + def create( + self, + category_sid: str, + category_name: str, + segment_id: str, + agent_id: str, + offset: float, + metric_id: str, + metric_name: str, + answer_text: str, + answer_id: str, + questionnaire_sid: str, + authorization: Union[str, object] = values.unset, + ) -> AssessmentsInstance: + """ + Create the AssessmentsInstance + + :param category_sid: The SID of the category + :param category_name: The name of the category + :param segment_id: Segment Id of the conversation + :param agent_id: The id of the Agent + :param offset: The offset of the conversation. + :param metric_id: The question SID selected for assessment + :param metric_name: The question name of the assessment + :param answer_text: The answer text selected by user + :param answer_id: The id of the answer selected by user + :param questionnaire_sid: Questionnaire SID of the associated question + :param authorization: The Authorization HTTP request header + + :returns: The created AssessmentsInstance + """ + + data = values.of( + { + "CategorySid": category_sid, + "CategoryName": category_name, + "SegmentId": segment_id, + "AgentId": agent_id, + "Offset": offset, + "MetricId": metric_id, + "MetricName": metric_name, + "AnswerText": answer_text, + "AnswerId": answer_id, + "QuestionnaireSid": questionnaire_sid, + } + ) + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AssessmentsInstance(self._version, payload) + + async def create_async( + self, + category_sid: str, + category_name: str, + segment_id: str, + agent_id: str, + offset: float, + metric_id: str, + metric_name: str, + answer_text: str, + answer_id: str, + questionnaire_sid: str, + authorization: Union[str, object] = values.unset, + ) -> AssessmentsInstance: + """ + Asynchronously create the AssessmentsInstance + + :param category_sid: The SID of the category + :param category_name: The name of the category + :param segment_id: Segment Id of the conversation + :param agent_id: The id of the Agent + :param offset: The offset of the conversation. + :param metric_id: The question SID selected for assessment + :param metric_name: The question name of the assessment + :param answer_text: The answer text selected by user + :param answer_id: The id of the answer selected by user + :param questionnaire_sid: Questionnaire SID of the associated question + :param authorization: The Authorization HTTP request header + + :returns: The created AssessmentsInstance + """ + + data = values.of( + { + "CategorySid": category_sid, + "CategoryName": category_name, + "SegmentId": segment_id, + "AgentId": agent_id, + "Offset": offset, + "MetricId": metric_id, + "MetricName": metric_name, + "AnswerText": answer_text, + "AnswerId": answer_id, + "QuestionnaireSid": questionnaire_sid, + } + ) + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AssessmentsInstance(self._version, payload) + + def stream( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AssessmentsInstance]: + """ + Streams AssessmentsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: The id of the segment. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + authorization=authorization, + segment_id=segment_id, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AssessmentsInstance]: + """ + Asynchronously streams AssessmentsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: The id of the segment. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + authorization=authorization, + segment_id=segment_id, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssessmentsInstance]: + """ + Lists AssessmentsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: The id of the segment. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + authorization=authorization, + segment_id=segment_id, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssessmentsInstance]: + """ + Asynchronously lists AssessmentsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: The id of the segment. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + authorization=authorization, + segment_id=segment_id, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssessmentsPage: + """ + Retrieve a single page of AssessmentsInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param segment_id: The id of the segment. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssessmentsInstance + """ + data = values.of( + { + "Authorization": authorization, + "SegmentId": segment_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssessmentsPage(self._version, response) + + async def page_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssessmentsPage: + """ + Asynchronously retrieve a single page of AssessmentsInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param segment_id: The id of the segment. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssessmentsInstance + """ + data = values.of( + { + "Authorization": authorization, + "SegmentId": segment_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssessmentsPage(self._version, response) + + def get_page(self, target_url: str) -> AssessmentsPage: + """ + Retrieve a specific page of AssessmentsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssessmentsInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AssessmentsPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AssessmentsPage: + """ + Asynchronously retrieve a specific page of AssessmentsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssessmentsInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AssessmentsPage(self._version, response) + + def get(self, assessment_sid: str) -> AssessmentsContext: + """ + Constructs a AssessmentsContext + + :param assessment_sid: The SID of the assessment to be modified + """ + return AssessmentsContext(self._version, assessment_sid=assessment_sid) + + def __call__(self, assessment_sid: str) -> AssessmentsContext: + """ + Constructs a AssessmentsContext + + :param assessment_sid: The SID of the assessment to be modified + """ + return AssessmentsContext(self._version, assessment_sid=assessment_sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/channel.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/channel.py new file mode 100644 index 00000000..aa98ff8d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/channel.py @@ -0,0 +1,575 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ChannelInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Channel resource and owns this Workflow. + :ivar flex_flow_sid: The SID of the Flex Flow. + :ivar sid: The unique string that we created to identify the Channel resource. + :ivar user_sid: The SID of the chat user. + :ivar task_sid: The SID of the TaskRouter Task. Only valid when integration type is `task`. `null` for integration types `studio` & `external` + :ivar url: The absolute URL of the Flex chat channel resource. + :ivar date_created: The date and time in GMT when the Flex chat channel was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Flex chat channel was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.flex_flow_sid: Optional[str] = payload.get("flex_flow_sid") + self.sid: Optional[str] = payload.get("sid") + self.user_sid: Optional[str] = payload.get("user_sid") + self.task_sid: Optional[str] = payload.get("task_sid") + self.url: Optional[str] = payload.get("url") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ChannelContext] = None + + @property + def _proxy(self) -> "ChannelContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ChannelContext for this ChannelInstance + """ + if self._context is None: + self._context = ChannelContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ChannelInstance": + """ + Fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ChannelInstance": + """ + Asynchronous coroutine to fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ChannelContext + + :param version: Version that contains the resource + :param sid: The SID of the Flex chat channel resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Channels/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ChannelInstance: + """ + Fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ChannelInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ChannelInstance: + """ + Asynchronous coroutine to fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ChannelInstance: + """ + Build an instance of ChannelInstance + + :param payload: Payload response from the API + """ + return ChannelInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ChannelList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ChannelList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Channels" + + def create( + self, + flex_flow_sid: str, + identity: str, + chat_user_friendly_name: str, + chat_friendly_name: str, + target: Union[str, object] = values.unset, + chat_unique_name: Union[str, object] = values.unset, + pre_engagement_data: Union[str, object] = values.unset, + task_sid: Union[str, object] = values.unset, + task_attributes: Union[str, object] = values.unset, + long_lived: Union[bool, object] = values.unset, + ) -> ChannelInstance: + """ + Create the ChannelInstance + + :param flex_flow_sid: The SID of the Flex Flow. + :param identity: The `identity` value that uniquely identifies the new resource's chat User. + :param chat_user_friendly_name: The chat participant's friendly name. + :param chat_friendly_name: The chat channel's friendly name. + :param target: The Target Contact Identity, for example the phone number of an SMS. + :param chat_unique_name: The chat channel's unique name. + :param pre_engagement_data: The pre-engagement data. + :param task_sid: The SID of the TaskRouter Task. Only valid when integration type is `task`. `null` for integration types `studio` & `external` + :param task_attributes: The Task attributes to be added for the TaskRouter Task. + :param long_lived: Whether to create the channel as long-lived. + + :returns: The created ChannelInstance + """ + + data = values.of( + { + "FlexFlowSid": flex_flow_sid, + "Identity": identity, + "ChatUserFriendlyName": chat_user_friendly_name, + "ChatFriendlyName": chat_friendly_name, + "Target": target, + "ChatUniqueName": chat_unique_name, + "PreEngagementData": pre_engagement_data, + "TaskSid": task_sid, + "TaskAttributes": task_attributes, + "LongLived": serialize.boolean_to_string(long_lived), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance(self._version, payload) + + async def create_async( + self, + flex_flow_sid: str, + identity: str, + chat_user_friendly_name: str, + chat_friendly_name: str, + target: Union[str, object] = values.unset, + chat_unique_name: Union[str, object] = values.unset, + pre_engagement_data: Union[str, object] = values.unset, + task_sid: Union[str, object] = values.unset, + task_attributes: Union[str, object] = values.unset, + long_lived: Union[bool, object] = values.unset, + ) -> ChannelInstance: + """ + Asynchronously create the ChannelInstance + + :param flex_flow_sid: The SID of the Flex Flow. + :param identity: The `identity` value that uniquely identifies the new resource's chat User. + :param chat_user_friendly_name: The chat participant's friendly name. + :param chat_friendly_name: The chat channel's friendly name. + :param target: The Target Contact Identity, for example the phone number of an SMS. + :param chat_unique_name: The chat channel's unique name. + :param pre_engagement_data: The pre-engagement data. + :param task_sid: The SID of the TaskRouter Task. Only valid when integration type is `task`. `null` for integration types `studio` & `external` + :param task_attributes: The Task attributes to be added for the TaskRouter Task. + :param long_lived: Whether to create the channel as long-lived. + + :returns: The created ChannelInstance + """ + + data = values.of( + { + "FlexFlowSid": flex_flow_sid, + "Identity": identity, + "ChatUserFriendlyName": chat_user_friendly_name, + "ChatFriendlyName": chat_friendly_name, + "Target": target, + "ChatUniqueName": chat_unique_name, + "PreEngagementData": pre_engagement_data, + "TaskSid": task_sid, + "TaskAttributes": task_attributes, + "LongLived": serialize.boolean_to_string(long_lived), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ChannelInstance]: + """ + Streams ChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ChannelInstance]: + """ + Asynchronously streams ChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelInstance]: + """ + Lists ChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelInstance]: + """ + Asynchronously lists ChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelPage: + """ + Retrieve a single page of ChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelPage: + """ + Asynchronously retrieve a single page of ChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelPage(self._version, response) + + def get_page(self, target_url: str) -> ChannelPage: + """ + Retrieve a specific page of ChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ChannelPage(self._version, response) + + async def get_page_async(self, target_url: str) -> ChannelPage: + """ + Asynchronously retrieve a specific page of ChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ChannelPage(self._version, response) + + def get(self, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param sid: The SID of the Flex chat channel resource to fetch. + """ + return ChannelContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param sid: The SID of the Flex chat channel resource to fetch. + """ + return ChannelContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/configuration.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/configuration.py new file mode 100644 index 00000000..28a66be0 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/configuration.py @@ -0,0 +1,439 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ConfigurationInstance(InstanceResource): + + class Status(object): + OK = "ok" + INPROGRESS = "inprogress" + NOTSTARTED = "notstarted" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Configuration resource. + :ivar date_created: The date and time in GMT when the Configuration resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Configuration resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar attributes: An object that contains application-specific data. + :ivar status: + :ivar taskrouter_workspace_sid: The SID of the TaskRouter Workspace. + :ivar taskrouter_target_workflow_sid: The SID of the TaskRouter target Workflow. + :ivar taskrouter_target_taskqueue_sid: The SID of the TaskRouter Target TaskQueue. + :ivar taskrouter_taskqueues: The list of TaskRouter TaskQueues. + :ivar taskrouter_skills: The Skill description for TaskRouter workers. + :ivar taskrouter_worker_channels: The TaskRouter default channel capacities and availability for workers. + :ivar taskrouter_worker_attributes: The TaskRouter Worker attributes. + :ivar taskrouter_offline_activity_sid: The TaskRouter SID of the offline activity. + :ivar runtime_domain: The URL where the Flex instance is hosted. + :ivar messaging_service_instance_sid: The SID of the Messaging service instance. + :ivar chat_service_instance_sid: The SID of the chat service this user belongs to. + :ivar flex_service_instance_sid: The SID of the Flex service instance. + :ivar flex_instance_sid: The SID of the Flex instance. + :ivar ui_language: The primary language of the Flex UI. + :ivar ui_attributes: The object that describes Flex UI characteristics and settings. + :ivar ui_dependencies: The object that defines the NPM packages and versions to be used in Hosted Flex. + :ivar ui_version: The Pinned UI version. + :ivar service_version: The Flex Service version. + :ivar call_recording_enabled: Whether call recording is enabled. + :ivar call_recording_webhook_url: The call recording webhook URL. + :ivar crm_enabled: Whether CRM is present for Flex. + :ivar crm_type: The CRM type. + :ivar crm_callback_url: The CRM Callback URL. + :ivar crm_fallback_url: The CRM Fallback URL. + :ivar crm_attributes: An object that contains the CRM attributes. + :ivar public_attributes: The list of public attributes, which are visible to unauthenticated clients. + :ivar plugin_service_enabled: Whether the plugin service enabled. + :ivar plugin_service_attributes: The plugin service attributes. + :ivar integrations: A list of objects that contain the configurations for the Integrations supported in this configuration. + :ivar outbound_call_flows: The list of outbound call flows. + :ivar serverless_service_sids: The list of serverless service SIDs. + :ivar queue_stats_configuration: Configurable parameters for Queues Statistics. + :ivar notifications: Configurable parameters for Notifications. + :ivar markdown: Configurable parameters for Markdown. + :ivar url: The absolute URL of the Configuration resource. + :ivar flex_insights_hr: Object with enabled/disabled flag with list of workspaces. + :ivar flex_insights_drilldown: Setting this to true will redirect Flex UI to the URL set in flex_url + :ivar flex_url: URL to redirect to in case drilldown is enabled. + :ivar channel_configs: Settings for different limits for Flex Conversations channels attachments. + :ivar debugger_integration: Configurable parameters for Debugger Integration. + :ivar flex_ui_status_report: Configurable parameters for Flex UI Status report. + :ivar agent_conv_end_methods: Agent conversation end methods. + :ivar citrix_voice_vdi: Citrix voice vdi configuration and settings. + :ivar offline_config: Presence and presence ttl configuration + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.attributes: Optional[Dict[str, object]] = payload.get("attributes") + self.status: Optional["ConfigurationInstance.Status"] = payload.get("status") + self.taskrouter_workspace_sid: Optional[str] = payload.get( + "taskrouter_workspace_sid" + ) + self.taskrouter_target_workflow_sid: Optional[str] = payload.get( + "taskrouter_target_workflow_sid" + ) + self.taskrouter_target_taskqueue_sid: Optional[str] = payload.get( + "taskrouter_target_taskqueue_sid" + ) + self.taskrouter_taskqueues: Optional[List[Dict[str, object]]] = payload.get( + "taskrouter_taskqueues" + ) + self.taskrouter_skills: Optional[List[Dict[str, object]]] = payload.get( + "taskrouter_skills" + ) + self.taskrouter_worker_channels: Optional[Dict[str, object]] = payload.get( + "taskrouter_worker_channels" + ) + self.taskrouter_worker_attributes: Optional[Dict[str, object]] = payload.get( + "taskrouter_worker_attributes" + ) + self.taskrouter_offline_activity_sid: Optional[str] = payload.get( + "taskrouter_offline_activity_sid" + ) + self.runtime_domain: Optional[str] = payload.get("runtime_domain") + self.messaging_service_instance_sid: Optional[str] = payload.get( + "messaging_service_instance_sid" + ) + self.chat_service_instance_sid: Optional[str] = payload.get( + "chat_service_instance_sid" + ) + self.flex_service_instance_sid: Optional[str] = payload.get( + "flex_service_instance_sid" + ) + self.flex_instance_sid: Optional[str] = payload.get("flex_instance_sid") + self.ui_language: Optional[str] = payload.get("ui_language") + self.ui_attributes: Optional[Dict[str, object]] = payload.get("ui_attributes") + self.ui_dependencies: Optional[Dict[str, object]] = payload.get( + "ui_dependencies" + ) + self.ui_version: Optional[str] = payload.get("ui_version") + self.service_version: Optional[str] = payload.get("service_version") + self.call_recording_enabled: Optional[bool] = payload.get( + "call_recording_enabled" + ) + self.call_recording_webhook_url: Optional[str] = payload.get( + "call_recording_webhook_url" + ) + self.crm_enabled: Optional[bool] = payload.get("crm_enabled") + self.crm_type: Optional[str] = payload.get("crm_type") + self.crm_callback_url: Optional[str] = payload.get("crm_callback_url") + self.crm_fallback_url: Optional[str] = payload.get("crm_fallback_url") + self.crm_attributes: Optional[Dict[str, object]] = payload.get("crm_attributes") + self.public_attributes: Optional[Dict[str, object]] = payload.get( + "public_attributes" + ) + self.plugin_service_enabled: Optional[bool] = payload.get( + "plugin_service_enabled" + ) + self.plugin_service_attributes: Optional[Dict[str, object]] = payload.get( + "plugin_service_attributes" + ) + self.integrations: Optional[List[Dict[str, object]]] = payload.get( + "integrations" + ) + self.outbound_call_flows: Optional[Dict[str, object]] = payload.get( + "outbound_call_flows" + ) + self.serverless_service_sids: Optional[List[str]] = payload.get( + "serverless_service_sids" + ) + self.queue_stats_configuration: Optional[Dict[str, object]] = payload.get( + "queue_stats_configuration" + ) + self.notifications: Optional[Dict[str, object]] = payload.get("notifications") + self.markdown: Optional[Dict[str, object]] = payload.get("markdown") + self.url: Optional[str] = payload.get("url") + self.flex_insights_hr: Optional[Dict[str, object]] = payload.get( + "flex_insights_hr" + ) + self.flex_insights_drilldown: Optional[bool] = payload.get( + "flex_insights_drilldown" + ) + self.flex_url: Optional[str] = payload.get("flex_url") + self.channel_configs: Optional[List[Dict[str, object]]] = payload.get( + "channel_configs" + ) + self.debugger_integration: Optional[Dict[str, object]] = payload.get( + "debugger_integration" + ) + self.flex_ui_status_report: Optional[Dict[str, object]] = payload.get( + "flex_ui_status_report" + ) + self.agent_conv_end_methods: Optional[Dict[str, object]] = payload.get( + "agent_conv_end_methods" + ) + self.citrix_voice_vdi: Optional[Dict[str, object]] = payload.get( + "citrix_voice_vdi" + ) + self.offline_config: Optional[Dict[str, object]] = payload.get("offline_config") + + self._context: Optional[ConfigurationContext] = None + + @property + def _proxy(self) -> "ConfigurationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ConfigurationContext for this ConfigurationInstance + """ + if self._context is None: + self._context = ConfigurationContext( + self._version, + ) + return self._context + + def fetch( + self, ui_version: Union[str, object] = values.unset + ) -> "ConfigurationInstance": + """ + Fetch the ConfigurationInstance + + :param ui_version: The Pinned UI version of the Configuration resource to fetch. + + :returns: The fetched ConfigurationInstance + """ + return self._proxy.fetch( + ui_version=ui_version, + ) + + async def fetch_async( + self, ui_version: Union[str, object] = values.unset + ) -> "ConfigurationInstance": + """ + Asynchronous coroutine to fetch the ConfigurationInstance + + :param ui_version: The Pinned UI version of the Configuration resource to fetch. + + :returns: The fetched ConfigurationInstance + """ + return await self._proxy.fetch_async( + ui_version=ui_version, + ) + + def update( + self, body: Union[object, object] = values.unset + ) -> "ConfigurationInstance": + """ + Update the ConfigurationInstance + + :param body: + + :returns: The updated ConfigurationInstance + """ + return self._proxy.update( + body=body, + ) + + async def update_async( + self, body: Union[object, object] = values.unset + ) -> "ConfigurationInstance": + """ + Asynchronous coroutine to update the ConfigurationInstance + + :param body: + + :returns: The updated ConfigurationInstance + """ + return await self._proxy.update_async( + body=body, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ConfigurationContext(InstanceContext): + + def __init__(self, version: Version): + """ + Initialize the ConfigurationContext + + :param version: Version that contains the resource + """ + super().__init__(version) + + self._uri = "/Configuration" + + def fetch( + self, ui_version: Union[str, object] = values.unset + ) -> ConfigurationInstance: + """ + Fetch the ConfigurationInstance + + :param ui_version: The Pinned UI version of the Configuration resource to fetch. + + :returns: The fetched ConfigurationInstance + """ + + data = values.of( + { + "UiVersion": ui_version, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return ConfigurationInstance( + self._version, + payload, + ) + + async def fetch_async( + self, ui_version: Union[str, object] = values.unset + ) -> ConfigurationInstance: + """ + Asynchronous coroutine to fetch the ConfigurationInstance + + :param ui_version: The Pinned UI version of the Configuration resource to fetch. + + :returns: The fetched ConfigurationInstance + """ + + data = values.of( + { + "UiVersion": ui_version, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return ConfigurationInstance( + self._version, + payload, + ) + + def update( + self, body: Union[object, object] = values.unset + ) -> ConfigurationInstance: + """ + Update the ConfigurationInstance + + :param body: + + :returns: The updated ConfigurationInstance + """ + data = body.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConfigurationInstance(self._version, payload) + + async def update_async( + self, body: Union[object, object] = values.unset + ) -> ConfigurationInstance: + """ + Asynchronous coroutine to update the ConfigurationInstance + + :param body: + + :returns: The updated ConfigurationInstance + """ + data = body.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ConfigurationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ConfigurationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ConfigurationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self) -> ConfigurationContext: + """ + Constructs a ConfigurationContext + + """ + return ConfigurationContext(self._version) + + def __call__(self) -> ConfigurationContext: + """ + Constructs a ConfigurationContext + + """ + return ConfigurationContext(self._version) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/flex_flow.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/flex_flow.py new file mode 100644 index 00000000..0ae26346 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/flex_flow.py @@ -0,0 +1,965 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class FlexFlowInstance(InstanceResource): + + class ChannelType(object): + WEB = "web" + SMS = "sms" + FACEBOOK = "facebook" + WHATSAPP = "whatsapp" + LINE = "line" + CUSTOM = "custom" + + class IntegrationType(object): + STUDIO = "studio" + EXTERNAL = "external" + TASK = "task" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Flow resource and owns this Workflow. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar sid: The unique string that we created to identify the Flex Flow resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar chat_service_sid: The SID of the chat service. + :ivar channel_type: + :ivar contact_identity: The channel contact's Identity. + :ivar enabled: Whether the Flex Flow is enabled. + :ivar integration_type: + :ivar integration: An object that contains specific parameters for the integration. + :ivar long_lived: When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + :ivar janitor_enabled: When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + :ivar url: The absolute URL of the Flex Flow resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.chat_service_sid: Optional[str] = payload.get("chat_service_sid") + self.channel_type: Optional["FlexFlowInstance.ChannelType"] = payload.get( + "channel_type" + ) + self.contact_identity: Optional[str] = payload.get("contact_identity") + self.enabled: Optional[bool] = payload.get("enabled") + self.integration_type: Optional["FlexFlowInstance.IntegrationType"] = ( + payload.get("integration_type") + ) + self.integration: Optional[Dict[str, object]] = payload.get("integration") + self.long_lived: Optional[bool] = payload.get("long_lived") + self.janitor_enabled: Optional[bool] = payload.get("janitor_enabled") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[FlexFlowContext] = None + + @property + def _proxy(self) -> "FlexFlowContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: FlexFlowContext for this FlexFlowInstance + """ + if self._context is None: + self._context = FlexFlowContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the FlexFlowInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the FlexFlowInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "FlexFlowInstance": + """ + Fetch the FlexFlowInstance + + + :returns: The fetched FlexFlowInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "FlexFlowInstance": + """ + Asynchronous coroutine to fetch the FlexFlowInstance + + + :returns: The fetched FlexFlowInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + chat_service_sid: Union[str, object] = values.unset, + channel_type: Union["FlexFlowInstance.ChannelType", object] = values.unset, + contact_identity: Union[str, object] = values.unset, + enabled: Union[bool, object] = values.unset, + integration_type: Union[ + "FlexFlowInstance.IntegrationType", object + ] = values.unset, + integration_flow_sid: Union[str, object] = values.unset, + integration_url: Union[str, object] = values.unset, + integration_workspace_sid: Union[str, object] = values.unset, + integration_workflow_sid: Union[str, object] = values.unset, + integration_channel: Union[str, object] = values.unset, + integration_timeout: Union[int, object] = values.unset, + integration_priority: Union[int, object] = values.unset, + integration_creation_on_message: Union[bool, object] = values.unset, + long_lived: Union[bool, object] = values.unset, + janitor_enabled: Union[bool, object] = values.unset, + integration_retry_count: Union[int, object] = values.unset, + ) -> "FlexFlowInstance": + """ + Update the FlexFlowInstance + + :param friendly_name: A descriptive string that you create to describe the Flex Flow resource. + :param chat_service_sid: The SID of the chat service. + :param channel_type: + :param contact_identity: The channel contact's Identity. + :param enabled: Whether the new Flex Flow is enabled. + :param integration_type: + :param integration_flow_sid: The SID of the Studio Flow. Required when `integrationType` is `studio`. + :param integration_url: The URL of the external webhook. Required when `integrationType` is `external`. + :param integration_workspace_sid: The Workspace SID for a new Task. Required when `integrationType` is `task`. + :param integration_workflow_sid: The Workflow SID for a new Task. Required when `integrationType` is `task`. + :param integration_channel: The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + :param integration_timeout: The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_priority: The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_creation_on_message: In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + :param long_lived: When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + :param janitor_enabled: When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + :param integration_retry_count: The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + + :returns: The updated FlexFlowInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + chat_service_sid=chat_service_sid, + channel_type=channel_type, + contact_identity=contact_identity, + enabled=enabled, + integration_type=integration_type, + integration_flow_sid=integration_flow_sid, + integration_url=integration_url, + integration_workspace_sid=integration_workspace_sid, + integration_workflow_sid=integration_workflow_sid, + integration_channel=integration_channel, + integration_timeout=integration_timeout, + integration_priority=integration_priority, + integration_creation_on_message=integration_creation_on_message, + long_lived=long_lived, + janitor_enabled=janitor_enabled, + integration_retry_count=integration_retry_count, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + chat_service_sid: Union[str, object] = values.unset, + channel_type: Union["FlexFlowInstance.ChannelType", object] = values.unset, + contact_identity: Union[str, object] = values.unset, + enabled: Union[bool, object] = values.unset, + integration_type: Union[ + "FlexFlowInstance.IntegrationType", object + ] = values.unset, + integration_flow_sid: Union[str, object] = values.unset, + integration_url: Union[str, object] = values.unset, + integration_workspace_sid: Union[str, object] = values.unset, + integration_workflow_sid: Union[str, object] = values.unset, + integration_channel: Union[str, object] = values.unset, + integration_timeout: Union[int, object] = values.unset, + integration_priority: Union[int, object] = values.unset, + integration_creation_on_message: Union[bool, object] = values.unset, + long_lived: Union[bool, object] = values.unset, + janitor_enabled: Union[bool, object] = values.unset, + integration_retry_count: Union[int, object] = values.unset, + ) -> "FlexFlowInstance": + """ + Asynchronous coroutine to update the FlexFlowInstance + + :param friendly_name: A descriptive string that you create to describe the Flex Flow resource. + :param chat_service_sid: The SID of the chat service. + :param channel_type: + :param contact_identity: The channel contact's Identity. + :param enabled: Whether the new Flex Flow is enabled. + :param integration_type: + :param integration_flow_sid: The SID of the Studio Flow. Required when `integrationType` is `studio`. + :param integration_url: The URL of the external webhook. Required when `integrationType` is `external`. + :param integration_workspace_sid: The Workspace SID for a new Task. Required when `integrationType` is `task`. + :param integration_workflow_sid: The Workflow SID for a new Task. Required when `integrationType` is `task`. + :param integration_channel: The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + :param integration_timeout: The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_priority: The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_creation_on_message: In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + :param long_lived: When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + :param janitor_enabled: When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + :param integration_retry_count: The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + + :returns: The updated FlexFlowInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + chat_service_sid=chat_service_sid, + channel_type=channel_type, + contact_identity=contact_identity, + enabled=enabled, + integration_type=integration_type, + integration_flow_sid=integration_flow_sid, + integration_url=integration_url, + integration_workspace_sid=integration_workspace_sid, + integration_workflow_sid=integration_workflow_sid, + integration_channel=integration_channel, + integration_timeout=integration_timeout, + integration_priority=integration_priority, + integration_creation_on_message=integration_creation_on_message, + long_lived=long_lived, + janitor_enabled=janitor_enabled, + integration_retry_count=integration_retry_count, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class FlexFlowContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the FlexFlowContext + + :param version: Version that contains the resource + :param sid: The SID of the Flex Flow resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/FlexFlows/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the FlexFlowInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the FlexFlowInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> FlexFlowInstance: + """ + Fetch the FlexFlowInstance + + + :returns: The fetched FlexFlowInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return FlexFlowInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> FlexFlowInstance: + """ + Asynchronous coroutine to fetch the FlexFlowInstance + + + :returns: The fetched FlexFlowInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return FlexFlowInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + chat_service_sid: Union[str, object] = values.unset, + channel_type: Union["FlexFlowInstance.ChannelType", object] = values.unset, + contact_identity: Union[str, object] = values.unset, + enabled: Union[bool, object] = values.unset, + integration_type: Union[ + "FlexFlowInstance.IntegrationType", object + ] = values.unset, + integration_flow_sid: Union[str, object] = values.unset, + integration_url: Union[str, object] = values.unset, + integration_workspace_sid: Union[str, object] = values.unset, + integration_workflow_sid: Union[str, object] = values.unset, + integration_channel: Union[str, object] = values.unset, + integration_timeout: Union[int, object] = values.unset, + integration_priority: Union[int, object] = values.unset, + integration_creation_on_message: Union[bool, object] = values.unset, + long_lived: Union[bool, object] = values.unset, + janitor_enabled: Union[bool, object] = values.unset, + integration_retry_count: Union[int, object] = values.unset, + ) -> FlexFlowInstance: + """ + Update the FlexFlowInstance + + :param friendly_name: A descriptive string that you create to describe the Flex Flow resource. + :param chat_service_sid: The SID of the chat service. + :param channel_type: + :param contact_identity: The channel contact's Identity. + :param enabled: Whether the new Flex Flow is enabled. + :param integration_type: + :param integration_flow_sid: The SID of the Studio Flow. Required when `integrationType` is `studio`. + :param integration_url: The URL of the external webhook. Required when `integrationType` is `external`. + :param integration_workspace_sid: The Workspace SID for a new Task. Required when `integrationType` is `task`. + :param integration_workflow_sid: The Workflow SID for a new Task. Required when `integrationType` is `task`. + :param integration_channel: The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + :param integration_timeout: The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_priority: The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_creation_on_message: In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + :param long_lived: When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + :param janitor_enabled: When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + :param integration_retry_count: The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + + :returns: The updated FlexFlowInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ChatServiceSid": chat_service_sid, + "ChannelType": channel_type, + "ContactIdentity": contact_identity, + "Enabled": serialize.boolean_to_string(enabled), + "IntegrationType": integration_type, + "Integration.FlowSid": integration_flow_sid, + "Integration.Url": integration_url, + "Integration.WorkspaceSid": integration_workspace_sid, + "Integration.WorkflowSid": integration_workflow_sid, + "Integration.Channel": integration_channel, + "Integration.Timeout": integration_timeout, + "Integration.Priority": integration_priority, + "Integration.CreationOnMessage": serialize.boolean_to_string( + integration_creation_on_message + ), + "LongLived": serialize.boolean_to_string(long_lived), + "JanitorEnabled": serialize.boolean_to_string(janitor_enabled), + "Integration.RetryCount": integration_retry_count, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return FlexFlowInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + chat_service_sid: Union[str, object] = values.unset, + channel_type: Union["FlexFlowInstance.ChannelType", object] = values.unset, + contact_identity: Union[str, object] = values.unset, + enabled: Union[bool, object] = values.unset, + integration_type: Union[ + "FlexFlowInstance.IntegrationType", object + ] = values.unset, + integration_flow_sid: Union[str, object] = values.unset, + integration_url: Union[str, object] = values.unset, + integration_workspace_sid: Union[str, object] = values.unset, + integration_workflow_sid: Union[str, object] = values.unset, + integration_channel: Union[str, object] = values.unset, + integration_timeout: Union[int, object] = values.unset, + integration_priority: Union[int, object] = values.unset, + integration_creation_on_message: Union[bool, object] = values.unset, + long_lived: Union[bool, object] = values.unset, + janitor_enabled: Union[bool, object] = values.unset, + integration_retry_count: Union[int, object] = values.unset, + ) -> FlexFlowInstance: + """ + Asynchronous coroutine to update the FlexFlowInstance + + :param friendly_name: A descriptive string that you create to describe the Flex Flow resource. + :param chat_service_sid: The SID of the chat service. + :param channel_type: + :param contact_identity: The channel contact's Identity. + :param enabled: Whether the new Flex Flow is enabled. + :param integration_type: + :param integration_flow_sid: The SID of the Studio Flow. Required when `integrationType` is `studio`. + :param integration_url: The URL of the external webhook. Required when `integrationType` is `external`. + :param integration_workspace_sid: The Workspace SID for a new Task. Required when `integrationType` is `task`. + :param integration_workflow_sid: The Workflow SID for a new Task. Required when `integrationType` is `task`. + :param integration_channel: The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + :param integration_timeout: The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_priority: The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_creation_on_message: In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + :param long_lived: When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + :param janitor_enabled: When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + :param integration_retry_count: The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + + :returns: The updated FlexFlowInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ChatServiceSid": chat_service_sid, + "ChannelType": channel_type, + "ContactIdentity": contact_identity, + "Enabled": serialize.boolean_to_string(enabled), + "IntegrationType": integration_type, + "Integration.FlowSid": integration_flow_sid, + "Integration.Url": integration_url, + "Integration.WorkspaceSid": integration_workspace_sid, + "Integration.WorkflowSid": integration_workflow_sid, + "Integration.Channel": integration_channel, + "Integration.Timeout": integration_timeout, + "Integration.Priority": integration_priority, + "Integration.CreationOnMessage": serialize.boolean_to_string( + integration_creation_on_message + ), + "LongLived": serialize.boolean_to_string(long_lived), + "JanitorEnabled": serialize.boolean_to_string(janitor_enabled), + "Integration.RetryCount": integration_retry_count, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return FlexFlowInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class FlexFlowPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> FlexFlowInstance: + """ + Build an instance of FlexFlowInstance + + :param payload: Payload response from the API + """ + return FlexFlowInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class FlexFlowList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the FlexFlowList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/FlexFlows" + + def create( + self, + friendly_name: str, + chat_service_sid: str, + channel_type: "FlexFlowInstance.ChannelType", + contact_identity: Union[str, object] = values.unset, + enabled: Union[bool, object] = values.unset, + integration_type: Union[ + "FlexFlowInstance.IntegrationType", object + ] = values.unset, + integration_flow_sid: Union[str, object] = values.unset, + integration_url: Union[str, object] = values.unset, + integration_workspace_sid: Union[str, object] = values.unset, + integration_workflow_sid: Union[str, object] = values.unset, + integration_channel: Union[str, object] = values.unset, + integration_timeout: Union[int, object] = values.unset, + integration_priority: Union[int, object] = values.unset, + integration_creation_on_message: Union[bool, object] = values.unset, + long_lived: Union[bool, object] = values.unset, + janitor_enabled: Union[bool, object] = values.unset, + integration_retry_count: Union[int, object] = values.unset, + ) -> FlexFlowInstance: + """ + Create the FlexFlowInstance + + :param friendly_name: A descriptive string that you create to describe the Flex Flow resource. + :param chat_service_sid: The SID of the chat service. + :param channel_type: + :param contact_identity: The channel contact's Identity. + :param enabled: Whether the new Flex Flow is enabled. + :param integration_type: + :param integration_flow_sid: The SID of the Studio Flow. Required when `integrationType` is `studio`. + :param integration_url: The URL of the external webhook. Required when `integrationType` is `external`. + :param integration_workspace_sid: The Workspace SID for a new Task. Required when `integrationType` is `task`. + :param integration_workflow_sid: The Workflow SID for a new Task. Required when `integrationType` is `task`. + :param integration_channel: The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + :param integration_timeout: The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_priority: The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_creation_on_message: In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + :param long_lived: When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + :param janitor_enabled: When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + :param integration_retry_count: The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + + :returns: The created FlexFlowInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ChatServiceSid": chat_service_sid, + "ChannelType": channel_type, + "ContactIdentity": contact_identity, + "Enabled": serialize.boolean_to_string(enabled), + "IntegrationType": integration_type, + "Integration.FlowSid": integration_flow_sid, + "Integration.Url": integration_url, + "Integration.WorkspaceSid": integration_workspace_sid, + "Integration.WorkflowSid": integration_workflow_sid, + "Integration.Channel": integration_channel, + "Integration.Timeout": integration_timeout, + "Integration.Priority": integration_priority, + "Integration.CreationOnMessage": serialize.boolean_to_string( + integration_creation_on_message + ), + "LongLived": serialize.boolean_to_string(long_lived), + "JanitorEnabled": serialize.boolean_to_string(janitor_enabled), + "Integration.RetryCount": integration_retry_count, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return FlexFlowInstance(self._version, payload) + + async def create_async( + self, + friendly_name: str, + chat_service_sid: str, + channel_type: "FlexFlowInstance.ChannelType", + contact_identity: Union[str, object] = values.unset, + enabled: Union[bool, object] = values.unset, + integration_type: Union[ + "FlexFlowInstance.IntegrationType", object + ] = values.unset, + integration_flow_sid: Union[str, object] = values.unset, + integration_url: Union[str, object] = values.unset, + integration_workspace_sid: Union[str, object] = values.unset, + integration_workflow_sid: Union[str, object] = values.unset, + integration_channel: Union[str, object] = values.unset, + integration_timeout: Union[int, object] = values.unset, + integration_priority: Union[int, object] = values.unset, + integration_creation_on_message: Union[bool, object] = values.unset, + long_lived: Union[bool, object] = values.unset, + janitor_enabled: Union[bool, object] = values.unset, + integration_retry_count: Union[int, object] = values.unset, + ) -> FlexFlowInstance: + """ + Asynchronously create the FlexFlowInstance + + :param friendly_name: A descriptive string that you create to describe the Flex Flow resource. + :param chat_service_sid: The SID of the chat service. + :param channel_type: + :param contact_identity: The channel contact's Identity. + :param enabled: Whether the new Flex Flow is enabled. + :param integration_type: + :param integration_flow_sid: The SID of the Studio Flow. Required when `integrationType` is `studio`. + :param integration_url: The URL of the external webhook. Required when `integrationType` is `external`. + :param integration_workspace_sid: The Workspace SID for a new Task. Required when `integrationType` is `task`. + :param integration_workflow_sid: The Workflow SID for a new Task. Required when `integrationType` is `task`. + :param integration_channel: The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + :param integration_timeout: The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_priority: The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + :param integration_creation_on_message: In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + :param long_lived: When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + :param janitor_enabled: When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + :param integration_retry_count: The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + + :returns: The created FlexFlowInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ChatServiceSid": chat_service_sid, + "ChannelType": channel_type, + "ContactIdentity": contact_identity, + "Enabled": serialize.boolean_to_string(enabled), + "IntegrationType": integration_type, + "Integration.FlowSid": integration_flow_sid, + "Integration.Url": integration_url, + "Integration.WorkspaceSid": integration_workspace_sid, + "Integration.WorkflowSid": integration_workflow_sid, + "Integration.Channel": integration_channel, + "Integration.Timeout": integration_timeout, + "Integration.Priority": integration_priority, + "Integration.CreationOnMessage": serialize.boolean_to_string( + integration_creation_on_message + ), + "LongLived": serialize.boolean_to_string(long_lived), + "JanitorEnabled": serialize.boolean_to_string(janitor_enabled), + "Integration.RetryCount": integration_retry_count, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return FlexFlowInstance(self._version, payload) + + def stream( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[FlexFlowInstance]: + """ + Streams FlexFlowInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str friendly_name: The `friendly_name` of the Flex Flow resources to read. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(friendly_name=friendly_name, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[FlexFlowInstance]: + """ + Asynchronously streams FlexFlowInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str friendly_name: The `friendly_name` of the Flex Flow resources to read. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + friendly_name=friendly_name, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[FlexFlowInstance]: + """ + Lists FlexFlowInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str friendly_name: The `friendly_name` of the Flex Flow resources to read. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[FlexFlowInstance]: + """ + Asynchronously lists FlexFlowInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str friendly_name: The `friendly_name` of the Flex Flow resources to read. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> FlexFlowPage: + """ + Retrieve a single page of FlexFlowInstance records from the API. + Request is executed immediately + + :param friendly_name: The `friendly_name` of the Flex Flow resources to read. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of FlexFlowInstance + """ + data = values.of( + { + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return FlexFlowPage(self._version, response) + + async def page_async( + self, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> FlexFlowPage: + """ + Asynchronously retrieve a single page of FlexFlowInstance records from the API. + Request is executed immediately + + :param friendly_name: The `friendly_name` of the Flex Flow resources to read. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of FlexFlowInstance + """ + data = values.of( + { + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return FlexFlowPage(self._version, response) + + def get_page(self, target_url: str) -> FlexFlowPage: + """ + Retrieve a specific page of FlexFlowInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of FlexFlowInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return FlexFlowPage(self._version, response) + + async def get_page_async(self, target_url: str) -> FlexFlowPage: + """ + Asynchronously retrieve a specific page of FlexFlowInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of FlexFlowInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return FlexFlowPage(self._version, response) + + def get(self, sid: str) -> FlexFlowContext: + """ + Constructs a FlexFlowContext + + :param sid: The SID of the Flex Flow resource to update. + """ + return FlexFlowContext(self._version, sid=sid) + + def __call__(self, sid: str) -> FlexFlowContext: + """ + Constructs a FlexFlowContext + + :param sid: The SID of the Flex Flow resource to update. + """ + return FlexFlowContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_assessments_comment.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_assessments_comment.py new file mode 100644 index 00000000..2b6c7934 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_assessments_comment.py @@ -0,0 +1,469 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class InsightsAssessmentsCommentInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Insights resource and owns this resource. + :ivar assessment_sid: The SID of the assessment. + :ivar comment: The comment added for assessment. + :ivar offset: The offset + :ivar report: The flag indicating if this assessment is part of report + :ivar weight: The weightage given to this comment + :ivar agent_id: The id of the agent. + :ivar segment_id: The id of the segment. + :ivar user_name: The name of the user. + :ivar user_email: The email id of the user. + :ivar timestamp: The timestamp when the record is inserted + :ivar url: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.assessment_sid: Optional[str] = payload.get("assessment_sid") + self.comment: Optional[Dict[str, object]] = payload.get("comment") + self.offset: Optional[float] = deserialize.decimal(payload.get("offset")) + self.report: Optional[bool] = payload.get("report") + self.weight: Optional[float] = deserialize.decimal(payload.get("weight")) + self.agent_id: Optional[str] = payload.get("agent_id") + self.segment_id: Optional[str] = payload.get("segment_id") + self.user_name: Optional[str] = payload.get("user_name") + self.user_email: Optional[str] = payload.get("user_email") + self.timestamp: Optional[float] = deserialize.decimal(payload.get("timestamp")) + self.url: Optional[str] = payload.get("url") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class InsightsAssessmentsCommentPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> InsightsAssessmentsCommentInstance: + """ + Build an instance of InsightsAssessmentsCommentInstance + + :param payload: Payload response from the API + """ + return InsightsAssessmentsCommentInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InsightsAssessmentsCommentList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InsightsAssessmentsCommentList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Insights/QualityManagement/Assessments/Comments" + + def create( + self, + category_id: str, + category_name: str, + comment: str, + segment_id: str, + agent_id: str, + offset: float, + authorization: Union[str, object] = values.unset, + ) -> InsightsAssessmentsCommentInstance: + """ + Create the InsightsAssessmentsCommentInstance + + :param category_id: The ID of the category + :param category_name: The name of the category + :param comment: The Assessment comment. + :param segment_id: The id of the segment. + :param agent_id: The id of the agent. + :param offset: The offset + :param authorization: The Authorization HTTP request header + + :returns: The created InsightsAssessmentsCommentInstance + """ + + data = values.of( + { + "CategoryId": category_id, + "CategoryName": category_name, + "Comment": comment, + "SegmentId": segment_id, + "AgentId": agent_id, + "Offset": offset, + } + ) + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsAssessmentsCommentInstance(self._version, payload) + + async def create_async( + self, + category_id: str, + category_name: str, + comment: str, + segment_id: str, + agent_id: str, + offset: float, + authorization: Union[str, object] = values.unset, + ) -> InsightsAssessmentsCommentInstance: + """ + Asynchronously create the InsightsAssessmentsCommentInstance + + :param category_id: The ID of the category + :param category_name: The name of the category + :param comment: The Assessment comment. + :param segment_id: The id of the segment. + :param agent_id: The id of the agent. + :param offset: The offset + :param authorization: The Authorization HTTP request header + + :returns: The created InsightsAssessmentsCommentInstance + """ + + data = values.of( + { + "CategoryId": category_id, + "CategoryName": category_name, + "Comment": comment, + "SegmentId": segment_id, + "AgentId": agent_id, + "Offset": offset, + } + ) + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsAssessmentsCommentInstance(self._version, payload) + + def stream( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + agent_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InsightsAssessmentsCommentInstance]: + """ + Streams InsightsAssessmentsCommentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: The id of the segment. + :param str agent_id: The id of the agent. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + authorization=authorization, + segment_id=segment_id, + agent_id=agent_id, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + agent_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InsightsAssessmentsCommentInstance]: + """ + Asynchronously streams InsightsAssessmentsCommentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: The id of the segment. + :param str agent_id: The id of the agent. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + authorization=authorization, + segment_id=segment_id, + agent_id=agent_id, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + agent_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsAssessmentsCommentInstance]: + """ + Lists InsightsAssessmentsCommentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: The id of the segment. + :param str agent_id: The id of the agent. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + authorization=authorization, + segment_id=segment_id, + agent_id=agent_id, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + agent_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsAssessmentsCommentInstance]: + """ + Asynchronously lists InsightsAssessmentsCommentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: The id of the segment. + :param str agent_id: The id of the agent. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + authorization=authorization, + segment_id=segment_id, + agent_id=agent_id, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + agent_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsAssessmentsCommentPage: + """ + Retrieve a single page of InsightsAssessmentsCommentInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param segment_id: The id of the segment. + :param agent_id: The id of the agent. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsAssessmentsCommentInstance + """ + data = values.of( + { + "Authorization": authorization, + "SegmentId": segment_id, + "AgentId": agent_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsAssessmentsCommentPage(self._version, response) + + async def page_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + agent_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsAssessmentsCommentPage: + """ + Asynchronously retrieve a single page of InsightsAssessmentsCommentInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param segment_id: The id of the segment. + :param agent_id: The id of the agent. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsAssessmentsCommentInstance + """ + data = values.of( + { + "Authorization": authorization, + "SegmentId": segment_id, + "AgentId": agent_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsAssessmentsCommentPage(self._version, response) + + def get_page(self, target_url: str) -> InsightsAssessmentsCommentPage: + """ + Retrieve a specific page of InsightsAssessmentsCommentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsAssessmentsCommentInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InsightsAssessmentsCommentPage(self._version, response) + + async def get_page_async(self, target_url: str) -> InsightsAssessmentsCommentPage: + """ + Asynchronously retrieve a specific page of InsightsAssessmentsCommentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsAssessmentsCommentInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InsightsAssessmentsCommentPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_conversations.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_conversations.py new file mode 100644 index 00000000..efdcea20 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_conversations.py @@ -0,0 +1,333 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class InsightsConversationsInstance(InstanceResource): + """ + :ivar account_id: The id of the account. + :ivar conversation_id: The unique id of the conversation + :ivar segment_count: The count of segments for a conversation + :ivar segments: The Segments of a conversation + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_id: Optional[str] = payload.get("account_id") + self.conversation_id: Optional[str] = payload.get("conversation_id") + self.segment_count: Optional[int] = deserialize.integer( + payload.get("segment_count") + ) + self.segments: Optional[List[Dict[str, object]]] = payload.get("segments") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class InsightsConversationsPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InsightsConversationsInstance: + """ + Build an instance of InsightsConversationsInstance + + :param payload: Payload response from the API + """ + return InsightsConversationsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InsightsConversationsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InsightsConversationsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Insights/Conversations" + + def stream( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InsightsConversationsInstance]: + """ + Streams InsightsConversationsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: Unique Id of the segment for which conversation details needs to be fetched + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + authorization=authorization, + segment_id=segment_id, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InsightsConversationsInstance]: + """ + Asynchronously streams InsightsConversationsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: Unique Id of the segment for which conversation details needs to be fetched + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + authorization=authorization, + segment_id=segment_id, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsConversationsInstance]: + """ + Lists InsightsConversationsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: Unique Id of the segment for which conversation details needs to be fetched + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + authorization=authorization, + segment_id=segment_id, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsConversationsInstance]: + """ + Asynchronously lists InsightsConversationsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: Unique Id of the segment for which conversation details needs to be fetched + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + authorization=authorization, + segment_id=segment_id, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsConversationsPage: + """ + Retrieve a single page of InsightsConversationsInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param segment_id: Unique Id of the segment for which conversation details needs to be fetched + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsConversationsInstance + """ + data = values.of( + { + "Authorization": authorization, + "SegmentId": segment_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsConversationsPage(self._version, response) + + async def page_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsConversationsPage: + """ + Asynchronously retrieve a single page of InsightsConversationsInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param segment_id: Unique Id of the segment for which conversation details needs to be fetched + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsConversationsInstance + """ + data = values.of( + { + "Authorization": authorization, + "SegmentId": segment_id, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsConversationsPage(self._version, response) + + def get_page(self, target_url: str) -> InsightsConversationsPage: + """ + Retrieve a specific page of InsightsConversationsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsConversationsInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InsightsConversationsPage(self._version, response) + + async def get_page_async(self, target_url: str) -> InsightsConversationsPage: + """ + Asynchronously retrieve a specific page of InsightsConversationsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsConversationsInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InsightsConversationsPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires.py new file mode 100644 index 00000000..d21aff82 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires.py @@ -0,0 +1,813 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class InsightsQuestionnairesInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Insights resource and owns this resource. + :ivar questionnaire_sid: The sid of this questionnaire + :ivar name: The name of this category. + :ivar description: The description of this questionnaire + :ivar active: The flag to enable or disable questionnaire + :ivar questions: The list of questions with category for a questionnaire + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + questionnaire_sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.questionnaire_sid: Optional[str] = payload.get("questionnaire_sid") + self.name: Optional[str] = payload.get("name") + self.description: Optional[str] = payload.get("description") + self.active: Optional[bool] = payload.get("active") + self.questions: Optional[List[Dict[str, object]]] = payload.get("questions") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "questionnaire_sid": questionnaire_sid or self.questionnaire_sid, + } + self._context: Optional[InsightsQuestionnairesContext] = None + + @property + def _proxy(self) -> "InsightsQuestionnairesContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InsightsQuestionnairesContext for this InsightsQuestionnairesInstance + """ + if self._context is None: + self._context = InsightsQuestionnairesContext( + self._version, + questionnaire_sid=self._solution["questionnaire_sid"], + ) + return self._context + + def delete(self, authorization: Union[str, object] = values.unset) -> bool: + """ + Deletes the InsightsQuestionnairesInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + authorization=authorization, + ) + + async def delete_async( + self, authorization: Union[str, object] = values.unset + ) -> bool: + """ + Asynchronous coroutine that deletes the InsightsQuestionnairesInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + authorization=authorization, + ) + + def fetch( + self, authorization: Union[str, object] = values.unset + ) -> "InsightsQuestionnairesInstance": + """ + Fetch the InsightsQuestionnairesInstance + + :param authorization: The Authorization HTTP request header + + :returns: The fetched InsightsQuestionnairesInstance + """ + return self._proxy.fetch( + authorization=authorization, + ) + + async def fetch_async( + self, authorization: Union[str, object] = values.unset + ) -> "InsightsQuestionnairesInstance": + """ + Asynchronous coroutine to fetch the InsightsQuestionnairesInstance + + :param authorization: The Authorization HTTP request header + + :returns: The fetched InsightsQuestionnairesInstance + """ + return await self._proxy.fetch_async( + authorization=authorization, + ) + + def update( + self, + active: bool, + authorization: Union[str, object] = values.unset, + name: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + question_sids: Union[List[str], object] = values.unset, + ) -> "InsightsQuestionnairesInstance": + """ + Update the InsightsQuestionnairesInstance + + :param active: The flag to enable or disable questionnaire + :param authorization: The Authorization HTTP request header + :param name: The name of this questionnaire + :param description: The description of this questionnaire + :param question_sids: The list of questions sids under a questionnaire + + :returns: The updated InsightsQuestionnairesInstance + """ + return self._proxy.update( + active=active, + authorization=authorization, + name=name, + description=description, + question_sids=question_sids, + ) + + async def update_async( + self, + active: bool, + authorization: Union[str, object] = values.unset, + name: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + question_sids: Union[List[str], object] = values.unset, + ) -> "InsightsQuestionnairesInstance": + """ + Asynchronous coroutine to update the InsightsQuestionnairesInstance + + :param active: The flag to enable or disable questionnaire + :param authorization: The Authorization HTTP request header + :param name: The name of this questionnaire + :param description: The description of this questionnaire + :param question_sids: The list of questions sids under a questionnaire + + :returns: The updated InsightsQuestionnairesInstance + """ + return await self._proxy.update_async( + active=active, + authorization=authorization, + name=name, + description=description, + question_sids=question_sids, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InsightsQuestionnairesContext(InstanceContext): + + def __init__(self, version: Version, questionnaire_sid: str): + """ + Initialize the InsightsQuestionnairesContext + + :param version: Version that contains the resource + :param questionnaire_sid: The SID of the questionnaire + """ + super().__init__(version) + + # Path Solution + self._solution = { + "questionnaire_sid": questionnaire_sid, + } + self._uri = ( + "/Insights/QualityManagement/Questionnaires/{questionnaire_sid}".format( + **self._solution + ) + ) + + def delete(self, authorization: Union[str, object] = values.unset) -> bool: + """ + Deletes the InsightsQuestionnairesInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "Authorization": authorization, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, authorization: Union[str, object] = values.unset + ) -> bool: + """ + Asynchronous coroutine that deletes the InsightsQuestionnairesInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "Authorization": authorization, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch( + self, authorization: Union[str, object] = values.unset + ) -> InsightsQuestionnairesInstance: + """ + Fetch the InsightsQuestionnairesInstance + + :param authorization: The Authorization HTTP request header + + :returns: The fetched InsightsQuestionnairesInstance + """ + + data = values.of( + { + "Authorization": authorization, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return InsightsQuestionnairesInstance( + self._version, + payload, + questionnaire_sid=self._solution["questionnaire_sid"], + ) + + async def fetch_async( + self, authorization: Union[str, object] = values.unset + ) -> InsightsQuestionnairesInstance: + """ + Asynchronous coroutine to fetch the InsightsQuestionnairesInstance + + :param authorization: The Authorization HTTP request header + + :returns: The fetched InsightsQuestionnairesInstance + """ + + data = values.of( + { + "Authorization": authorization, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return InsightsQuestionnairesInstance( + self._version, + payload, + questionnaire_sid=self._solution["questionnaire_sid"], + ) + + def update( + self, + active: bool, + authorization: Union[str, object] = values.unset, + name: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + question_sids: Union[List[str], object] = values.unset, + ) -> InsightsQuestionnairesInstance: + """ + Update the InsightsQuestionnairesInstance + + :param active: The flag to enable or disable questionnaire + :param authorization: The Authorization HTTP request header + :param name: The name of this questionnaire + :param description: The description of this questionnaire + :param question_sids: The list of questions sids under a questionnaire + + :returns: The updated InsightsQuestionnairesInstance + """ + + data = values.of( + { + "Active": serialize.boolean_to_string(active), + "Name": name, + "Description": description, + "QuestionSids": serialize.map(question_sids, lambda e: e), + } + ) + headers = values.of({}) + + if not ( + authorization is values.unset + or (isinstance(authorization, str) and not authorization) + ): + headers["Authorization"] = authorization + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesInstance( + self._version, + payload, + questionnaire_sid=self._solution["questionnaire_sid"], + ) + + async def update_async( + self, + active: bool, + authorization: Union[str, object] = values.unset, + name: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + question_sids: Union[List[str], object] = values.unset, + ) -> InsightsQuestionnairesInstance: + """ + Asynchronous coroutine to update the InsightsQuestionnairesInstance + + :param active: The flag to enable or disable questionnaire + :param authorization: The Authorization HTTP request header + :param name: The name of this questionnaire + :param description: The description of this questionnaire + :param question_sids: The list of questions sids under a questionnaire + + :returns: The updated InsightsQuestionnairesInstance + """ + + data = values.of( + { + "Active": serialize.boolean_to_string(active), + "Name": name, + "Description": description, + "QuestionSids": serialize.map(question_sids, lambda e: e), + } + ) + headers = values.of({}) + + if not ( + authorization is values.unset + or (isinstance(authorization, str) and not authorization) + ): + headers["Authorization"] = authorization + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesInstance( + self._version, + payload, + questionnaire_sid=self._solution["questionnaire_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InsightsQuestionnairesPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InsightsQuestionnairesInstance: + """ + Build an instance of InsightsQuestionnairesInstance + + :param payload: Payload response from the API + """ + return InsightsQuestionnairesInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InsightsQuestionnairesList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InsightsQuestionnairesList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Insights/QualityManagement/Questionnaires" + + def create( + self, + name: str, + authorization: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + active: Union[bool, object] = values.unset, + question_sids: Union[List[str], object] = values.unset, + ) -> InsightsQuestionnairesInstance: + """ + Create the InsightsQuestionnairesInstance + + :param name: The name of this questionnaire + :param authorization: The Authorization HTTP request header + :param description: The description of this questionnaire + :param active: The flag to enable or disable questionnaire + :param question_sids: The list of questions sids under a questionnaire + + :returns: The created InsightsQuestionnairesInstance + """ + + data = values.of( + { + "Name": name, + "Description": description, + "Active": serialize.boolean_to_string(active), + "QuestionSids": serialize.map(question_sids, lambda e: e), + } + ) + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesInstance(self._version, payload) + + async def create_async( + self, + name: str, + authorization: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + active: Union[bool, object] = values.unset, + question_sids: Union[List[str], object] = values.unset, + ) -> InsightsQuestionnairesInstance: + """ + Asynchronously create the InsightsQuestionnairesInstance + + :param name: The name of this questionnaire + :param authorization: The Authorization HTTP request header + :param description: The description of this questionnaire + :param active: The flag to enable or disable questionnaire + :param question_sids: The list of questions sids under a questionnaire + + :returns: The created InsightsQuestionnairesInstance + """ + + data = values.of( + { + "Name": name, + "Description": description, + "Active": serialize.boolean_to_string(active), + "QuestionSids": serialize.map(question_sids, lambda e: e), + } + ) + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesInstance(self._version, payload) + + def stream( + self, + authorization: Union[str, object] = values.unset, + include_inactive: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InsightsQuestionnairesInstance]: + """ + Streams InsightsQuestionnairesInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param bool include_inactive: Flag indicating whether to include inactive questionnaires or not + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + authorization=authorization, + include_inactive=include_inactive, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + authorization: Union[str, object] = values.unset, + include_inactive: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InsightsQuestionnairesInstance]: + """ + Asynchronously streams InsightsQuestionnairesInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param bool include_inactive: Flag indicating whether to include inactive questionnaires or not + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + authorization=authorization, + include_inactive=include_inactive, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + authorization: Union[str, object] = values.unset, + include_inactive: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsQuestionnairesInstance]: + """ + Lists InsightsQuestionnairesInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param bool include_inactive: Flag indicating whether to include inactive questionnaires or not + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + authorization=authorization, + include_inactive=include_inactive, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + authorization: Union[str, object] = values.unset, + include_inactive: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsQuestionnairesInstance]: + """ + Asynchronously lists InsightsQuestionnairesInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param bool include_inactive: Flag indicating whether to include inactive questionnaires or not + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + authorization=authorization, + include_inactive=include_inactive, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + authorization: Union[str, object] = values.unset, + include_inactive: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsQuestionnairesPage: + """ + Retrieve a single page of InsightsQuestionnairesInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param include_inactive: Flag indicating whether to include inactive questionnaires or not + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsQuestionnairesInstance + """ + data = values.of( + { + "Authorization": authorization, + "IncludeInactive": serialize.boolean_to_string(include_inactive), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsQuestionnairesPage(self._version, response) + + async def page_async( + self, + authorization: Union[str, object] = values.unset, + include_inactive: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsQuestionnairesPage: + """ + Asynchronously retrieve a single page of InsightsQuestionnairesInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param include_inactive: Flag indicating whether to include inactive questionnaires or not + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsQuestionnairesInstance + """ + data = values.of( + { + "Authorization": authorization, + "IncludeInactive": serialize.boolean_to_string(include_inactive), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsQuestionnairesPage(self._version, response) + + def get_page(self, target_url: str) -> InsightsQuestionnairesPage: + """ + Retrieve a specific page of InsightsQuestionnairesInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsQuestionnairesInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InsightsQuestionnairesPage(self._version, response) + + async def get_page_async(self, target_url: str) -> InsightsQuestionnairesPage: + """ + Asynchronously retrieve a specific page of InsightsQuestionnairesInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsQuestionnairesInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InsightsQuestionnairesPage(self._version, response) + + def get(self, questionnaire_sid: str) -> InsightsQuestionnairesContext: + """ + Constructs a InsightsQuestionnairesContext + + :param questionnaire_sid: The SID of the questionnaire + """ + return InsightsQuestionnairesContext( + self._version, questionnaire_sid=questionnaire_sid + ) + + def __call__(self, questionnaire_sid: str) -> InsightsQuestionnairesContext: + """ + Constructs a InsightsQuestionnairesContext + + :param questionnaire_sid: The SID of the questionnaire + """ + return InsightsQuestionnairesContext( + self._version, questionnaire_sid=questionnaire_sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires_category.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires_category.py new file mode 100644 index 00000000..817a4753 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires_category.py @@ -0,0 +1,631 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class InsightsQuestionnairesCategoryInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Insights resource and owns this resource. + :ivar category_sid: The SID of the category + :ivar name: The name of this category. + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + category_sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.category_sid: Optional[str] = payload.get("category_sid") + self.name: Optional[str] = payload.get("name") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "category_sid": category_sid or self.category_sid, + } + self._context: Optional[InsightsQuestionnairesCategoryContext] = None + + @property + def _proxy(self) -> "InsightsQuestionnairesCategoryContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InsightsQuestionnairesCategoryContext for this InsightsQuestionnairesCategoryInstance + """ + if self._context is None: + self._context = InsightsQuestionnairesCategoryContext( + self._version, + category_sid=self._solution["category_sid"], + ) + return self._context + + def delete(self, authorization: Union[str, object] = values.unset) -> bool: + """ + Deletes the InsightsQuestionnairesCategoryInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + authorization=authorization, + ) + + async def delete_async( + self, authorization: Union[str, object] = values.unset + ) -> bool: + """ + Asynchronous coroutine that deletes the InsightsQuestionnairesCategoryInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + authorization=authorization, + ) + + def update( + self, name: str, authorization: Union[str, object] = values.unset + ) -> "InsightsQuestionnairesCategoryInstance": + """ + Update the InsightsQuestionnairesCategoryInstance + + :param name: The name of this category. + :param authorization: The Authorization HTTP request header + + :returns: The updated InsightsQuestionnairesCategoryInstance + """ + return self._proxy.update( + name=name, + authorization=authorization, + ) + + async def update_async( + self, name: str, authorization: Union[str, object] = values.unset + ) -> "InsightsQuestionnairesCategoryInstance": + """ + Asynchronous coroutine to update the InsightsQuestionnairesCategoryInstance + + :param name: The name of this category. + :param authorization: The Authorization HTTP request header + + :returns: The updated InsightsQuestionnairesCategoryInstance + """ + return await self._proxy.update_async( + name=name, + authorization=authorization, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class InsightsQuestionnairesCategoryContext(InstanceContext): + + def __init__(self, version: Version, category_sid: str): + """ + Initialize the InsightsQuestionnairesCategoryContext + + :param version: Version that contains the resource + :param category_sid: The SID of the category to be updated + """ + super().__init__(version) + + # Path Solution + self._solution = { + "category_sid": category_sid, + } + self._uri = "/Insights/QualityManagement/Categories/{category_sid}".format( + **self._solution + ) + + def delete(self, authorization: Union[str, object] = values.unset) -> bool: + """ + Deletes the InsightsQuestionnairesCategoryInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "Authorization": authorization, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, authorization: Union[str, object] = values.unset + ) -> bool: + """ + Asynchronous coroutine that deletes the InsightsQuestionnairesCategoryInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "Authorization": authorization, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def update( + self, name: str, authorization: Union[str, object] = values.unset + ) -> InsightsQuestionnairesCategoryInstance: + """ + Update the InsightsQuestionnairesCategoryInstance + + :param name: The name of this category. + :param authorization: The Authorization HTTP request header + + :returns: The updated InsightsQuestionnairesCategoryInstance + """ + + data = values.of( + { + "Name": name, + } + ) + headers = values.of({}) + + if not ( + authorization is values.unset + or (isinstance(authorization, str) and not authorization) + ): + headers["Authorization"] = authorization + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesCategoryInstance( + self._version, payload, category_sid=self._solution["category_sid"] + ) + + async def update_async( + self, name: str, authorization: Union[str, object] = values.unset + ) -> InsightsQuestionnairesCategoryInstance: + """ + Asynchronous coroutine to update the InsightsQuestionnairesCategoryInstance + + :param name: The name of this category. + :param authorization: The Authorization HTTP request header + + :returns: The updated InsightsQuestionnairesCategoryInstance + """ + + data = values.of( + { + "Name": name, + } + ) + headers = values.of({}) + + if not ( + authorization is values.unset + or (isinstance(authorization, str) and not authorization) + ): + headers["Authorization"] = authorization + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesCategoryInstance( + self._version, payload, category_sid=self._solution["category_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class InsightsQuestionnairesCategoryPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> InsightsQuestionnairesCategoryInstance: + """ + Build an instance of InsightsQuestionnairesCategoryInstance + + :param payload: Payload response from the API + """ + return InsightsQuestionnairesCategoryInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InsightsQuestionnairesCategoryList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InsightsQuestionnairesCategoryList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Insights/QualityManagement/Categories" + + def create( + self, name: str, authorization: Union[str, object] = values.unset + ) -> InsightsQuestionnairesCategoryInstance: + """ + Create the InsightsQuestionnairesCategoryInstance + + :param name: The name of this category. + :param authorization: The Authorization HTTP request header + + :returns: The created InsightsQuestionnairesCategoryInstance + """ + + data = values.of( + { + "Name": name, + } + ) + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesCategoryInstance(self._version, payload) + + async def create_async( + self, name: str, authorization: Union[str, object] = values.unset + ) -> InsightsQuestionnairesCategoryInstance: + """ + Asynchronously create the InsightsQuestionnairesCategoryInstance + + :param name: The name of this category. + :param authorization: The Authorization HTTP request header + + :returns: The created InsightsQuestionnairesCategoryInstance + """ + + data = values.of( + { + "Name": name, + } + ) + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesCategoryInstance(self._version, payload) + + def stream( + self, + authorization: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InsightsQuestionnairesCategoryInstance]: + """ + Streams InsightsQuestionnairesCategoryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(authorization=authorization, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + authorization: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InsightsQuestionnairesCategoryInstance]: + """ + Asynchronously streams InsightsQuestionnairesCategoryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + authorization=authorization, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + authorization: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsQuestionnairesCategoryInstance]: + """ + Lists InsightsQuestionnairesCategoryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + authorization=authorization, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + authorization: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsQuestionnairesCategoryInstance]: + """ + Asynchronously lists InsightsQuestionnairesCategoryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + authorization=authorization, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + authorization: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsQuestionnairesCategoryPage: + """ + Retrieve a single page of InsightsQuestionnairesCategoryInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsQuestionnairesCategoryInstance + """ + data = values.of( + { + "Authorization": authorization, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsQuestionnairesCategoryPage(self._version, response) + + async def page_async( + self, + authorization: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsQuestionnairesCategoryPage: + """ + Asynchronously retrieve a single page of InsightsQuestionnairesCategoryInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsQuestionnairesCategoryInstance + """ + data = values.of( + { + "Authorization": authorization, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsQuestionnairesCategoryPage(self._version, response) + + def get_page(self, target_url: str) -> InsightsQuestionnairesCategoryPage: + """ + Retrieve a specific page of InsightsQuestionnairesCategoryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsQuestionnairesCategoryInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InsightsQuestionnairesCategoryPage(self._version, response) + + async def get_page_async( + self, target_url: str + ) -> InsightsQuestionnairesCategoryPage: + """ + Asynchronously retrieve a specific page of InsightsQuestionnairesCategoryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsQuestionnairesCategoryInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InsightsQuestionnairesCategoryPage(self._version, response) + + def get(self, category_sid: str) -> InsightsQuestionnairesCategoryContext: + """ + Constructs a InsightsQuestionnairesCategoryContext + + :param category_sid: The SID of the category to be updated + """ + return InsightsQuestionnairesCategoryContext( + self._version, category_sid=category_sid + ) + + def __call__(self, category_sid: str) -> InsightsQuestionnairesCategoryContext: + """ + Constructs a InsightsQuestionnairesCategoryContext + + :param category_sid: The SID of the category to be updated + """ + return InsightsQuestionnairesCategoryContext( + self._version, category_sid=category_sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires_question.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires_question.py new file mode 100644 index 00000000..33e23045 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_questionnaires_question.py @@ -0,0 +1,749 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class InsightsQuestionnairesQuestionInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Insights resource and owns this resource. + :ivar question_sid: The SID of the question + :ivar question: The question. + :ivar description: The description for the question. + :ivar category: The Category for the question. + :ivar answer_set_id: The answer_set for the question. + :ivar allow_na: The flag to enable for disable NA for answer. + :ivar usage: Integer value that tells a particular question is used by how many questionnaires + :ivar answer_set: Set of answers for the question + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + question_sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.question_sid: Optional[str] = payload.get("question_sid") + self.question: Optional[str] = payload.get("question") + self.description: Optional[str] = payload.get("description") + self.category: Optional[Dict[str, object]] = payload.get("category") + self.answer_set_id: Optional[str] = payload.get("answer_set_id") + self.allow_na: Optional[bool] = payload.get("allow_na") + self.usage: Optional[int] = deserialize.integer(payload.get("usage")) + self.answer_set: Optional[Dict[str, object]] = payload.get("answer_set") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "question_sid": question_sid or self.question_sid, + } + self._context: Optional[InsightsQuestionnairesQuestionContext] = None + + @property + def _proxy(self) -> "InsightsQuestionnairesQuestionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InsightsQuestionnairesQuestionContext for this InsightsQuestionnairesQuestionInstance + """ + if self._context is None: + self._context = InsightsQuestionnairesQuestionContext( + self._version, + question_sid=self._solution["question_sid"], + ) + return self._context + + def delete(self, authorization: Union[str, object] = values.unset) -> bool: + """ + Deletes the InsightsQuestionnairesQuestionInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + authorization=authorization, + ) + + async def delete_async( + self, authorization: Union[str, object] = values.unset + ) -> bool: + """ + Asynchronous coroutine that deletes the InsightsQuestionnairesQuestionInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + authorization=authorization, + ) + + def update( + self, + allow_na: bool, + authorization: Union[str, object] = values.unset, + category_sid: Union[str, object] = values.unset, + question: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + answer_set_id: Union[str, object] = values.unset, + ) -> "InsightsQuestionnairesQuestionInstance": + """ + Update the InsightsQuestionnairesQuestionInstance + + :param allow_na: The flag to enable for disable NA for answer. + :param authorization: The Authorization HTTP request header + :param category_sid: The SID of the category + :param question: The question. + :param description: The description for the question. + :param answer_set_id: The answer_set for the question. + + :returns: The updated InsightsQuestionnairesQuestionInstance + """ + return self._proxy.update( + allow_na=allow_na, + authorization=authorization, + category_sid=category_sid, + question=question, + description=description, + answer_set_id=answer_set_id, + ) + + async def update_async( + self, + allow_na: bool, + authorization: Union[str, object] = values.unset, + category_sid: Union[str, object] = values.unset, + question: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + answer_set_id: Union[str, object] = values.unset, + ) -> "InsightsQuestionnairesQuestionInstance": + """ + Asynchronous coroutine to update the InsightsQuestionnairesQuestionInstance + + :param allow_na: The flag to enable for disable NA for answer. + :param authorization: The Authorization HTTP request header + :param category_sid: The SID of the category + :param question: The question. + :param description: The description for the question. + :param answer_set_id: The answer_set for the question. + + :returns: The updated InsightsQuestionnairesQuestionInstance + """ + return await self._proxy.update_async( + allow_na=allow_na, + authorization=authorization, + category_sid=category_sid, + question=question, + description=description, + answer_set_id=answer_set_id, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class InsightsQuestionnairesQuestionContext(InstanceContext): + + def __init__(self, version: Version, question_sid: str): + """ + Initialize the InsightsQuestionnairesQuestionContext + + :param version: Version that contains the resource + :param question_sid: The SID of the question + """ + super().__init__(version) + + # Path Solution + self._solution = { + "question_sid": question_sid, + } + self._uri = "/Insights/QualityManagement/Questions/{question_sid}".format( + **self._solution + ) + + def delete(self, authorization: Union[str, object] = values.unset) -> bool: + """ + Deletes the InsightsQuestionnairesQuestionInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "Authorization": authorization, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, authorization: Union[str, object] = values.unset + ) -> bool: + """ + Asynchronous coroutine that deletes the InsightsQuestionnairesQuestionInstance + + :param authorization: The Authorization HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "Authorization": authorization, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def update( + self, + allow_na: bool, + authorization: Union[str, object] = values.unset, + category_sid: Union[str, object] = values.unset, + question: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + answer_set_id: Union[str, object] = values.unset, + ) -> InsightsQuestionnairesQuestionInstance: + """ + Update the InsightsQuestionnairesQuestionInstance + + :param allow_na: The flag to enable for disable NA for answer. + :param authorization: The Authorization HTTP request header + :param category_sid: The SID of the category + :param question: The question. + :param description: The description for the question. + :param answer_set_id: The answer_set for the question. + + :returns: The updated InsightsQuestionnairesQuestionInstance + """ + + data = values.of( + { + "AllowNa": serialize.boolean_to_string(allow_na), + "CategorySid": category_sid, + "Question": question, + "Description": description, + "AnswerSetId": answer_set_id, + } + ) + headers = values.of({}) + + if not ( + authorization is values.unset + or (isinstance(authorization, str) and not authorization) + ): + headers["Authorization"] = authorization + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesQuestionInstance( + self._version, payload, question_sid=self._solution["question_sid"] + ) + + async def update_async( + self, + allow_na: bool, + authorization: Union[str, object] = values.unset, + category_sid: Union[str, object] = values.unset, + question: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + answer_set_id: Union[str, object] = values.unset, + ) -> InsightsQuestionnairesQuestionInstance: + """ + Asynchronous coroutine to update the InsightsQuestionnairesQuestionInstance + + :param allow_na: The flag to enable for disable NA for answer. + :param authorization: The Authorization HTTP request header + :param category_sid: The SID of the category + :param question: The question. + :param description: The description for the question. + :param answer_set_id: The answer_set for the question. + + :returns: The updated InsightsQuestionnairesQuestionInstance + """ + + data = values.of( + { + "AllowNa": serialize.boolean_to_string(allow_na), + "CategorySid": category_sid, + "Question": question, + "Description": description, + "AnswerSetId": answer_set_id, + } + ) + headers = values.of({}) + + if not ( + authorization is values.unset + or (isinstance(authorization, str) and not authorization) + ): + headers["Authorization"] = authorization + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesQuestionInstance( + self._version, payload, question_sid=self._solution["question_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class InsightsQuestionnairesQuestionPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> InsightsQuestionnairesQuestionInstance: + """ + Build an instance of InsightsQuestionnairesQuestionInstance + + :param payload: Payload response from the API + """ + return InsightsQuestionnairesQuestionInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InsightsQuestionnairesQuestionList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InsightsQuestionnairesQuestionList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Insights/QualityManagement/Questions" + + def create( + self, + category_sid: str, + question: str, + answer_set_id: str, + allow_na: bool, + authorization: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + ) -> InsightsQuestionnairesQuestionInstance: + """ + Create the InsightsQuestionnairesQuestionInstance + + :param category_sid: The SID of the category + :param question: The question. + :param answer_set_id: The answer_set for the question. + :param allow_na: The flag to enable for disable NA for answer. + :param authorization: The Authorization HTTP request header + :param description: The description for the question. + + :returns: The created InsightsQuestionnairesQuestionInstance + """ + + data = values.of( + { + "CategorySid": category_sid, + "Question": question, + "AnswerSetId": answer_set_id, + "AllowNa": serialize.boolean_to_string(allow_na), + "Description": description, + } + ) + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesQuestionInstance(self._version, payload) + + async def create_async( + self, + category_sid: str, + question: str, + answer_set_id: str, + allow_na: bool, + authorization: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + ) -> InsightsQuestionnairesQuestionInstance: + """ + Asynchronously create the InsightsQuestionnairesQuestionInstance + + :param category_sid: The SID of the category + :param question: The question. + :param answer_set_id: The answer_set for the question. + :param allow_na: The flag to enable for disable NA for answer. + :param authorization: The Authorization HTTP request header + :param description: The description for the question. + + :returns: The created InsightsQuestionnairesQuestionInstance + """ + + data = values.of( + { + "CategorySid": category_sid, + "Question": question, + "AnswerSetId": answer_set_id, + "AllowNa": serialize.boolean_to_string(allow_na), + "Description": description, + } + ) + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InsightsQuestionnairesQuestionInstance(self._version, payload) + + def stream( + self, + authorization: Union[str, object] = values.unset, + category_sid: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InsightsQuestionnairesQuestionInstance]: + """ + Streams InsightsQuestionnairesQuestionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param List[str] category_sid: The list of category SIDs + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + authorization=authorization, + category_sid=category_sid, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + authorization: Union[str, object] = values.unset, + category_sid: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InsightsQuestionnairesQuestionInstance]: + """ + Asynchronously streams InsightsQuestionnairesQuestionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param List[str] category_sid: The list of category SIDs + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + authorization=authorization, + category_sid=category_sid, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + authorization: Union[str, object] = values.unset, + category_sid: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsQuestionnairesQuestionInstance]: + """ + Lists InsightsQuestionnairesQuestionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param List[str] category_sid: The list of category SIDs + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + authorization=authorization, + category_sid=category_sid, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + authorization: Union[str, object] = values.unset, + category_sid: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsQuestionnairesQuestionInstance]: + """ + Asynchronously lists InsightsQuestionnairesQuestionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param List[str] category_sid: The list of category SIDs + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + authorization=authorization, + category_sid=category_sid, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + authorization: Union[str, object] = values.unset, + category_sid: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsQuestionnairesQuestionPage: + """ + Retrieve a single page of InsightsQuestionnairesQuestionInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param category_sid: The list of category SIDs + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsQuestionnairesQuestionInstance + """ + data = values.of( + { + "Authorization": authorization, + "CategorySid": serialize.map(category_sid, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsQuestionnairesQuestionPage(self._version, response) + + async def page_async( + self, + authorization: Union[str, object] = values.unset, + category_sid: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsQuestionnairesQuestionPage: + """ + Asynchronously retrieve a single page of InsightsQuestionnairesQuestionInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param category_sid: The list of category SIDs + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsQuestionnairesQuestionInstance + """ + data = values.of( + { + "Authorization": authorization, + "CategorySid": serialize.map(category_sid, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsQuestionnairesQuestionPage(self._version, response) + + def get_page(self, target_url: str) -> InsightsQuestionnairesQuestionPage: + """ + Retrieve a specific page of InsightsQuestionnairesQuestionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsQuestionnairesQuestionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InsightsQuestionnairesQuestionPage(self._version, response) + + async def get_page_async( + self, target_url: str + ) -> InsightsQuestionnairesQuestionPage: + """ + Asynchronously retrieve a specific page of InsightsQuestionnairesQuestionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsQuestionnairesQuestionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InsightsQuestionnairesQuestionPage(self._version, response) + + def get(self, question_sid: str) -> InsightsQuestionnairesQuestionContext: + """ + Constructs a InsightsQuestionnairesQuestionContext + + :param question_sid: The SID of the question + """ + return InsightsQuestionnairesQuestionContext( + self._version, question_sid=question_sid + ) + + def __call__(self, question_sid: str) -> InsightsQuestionnairesQuestionContext: + """ + Constructs a InsightsQuestionnairesQuestionContext + + :param question_sid: The SID of the question + """ + return InsightsQuestionnairesQuestionContext( + self._version, question_sid=question_sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_segments.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_segments.py new file mode 100644 index 00000000..7c98e81c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_segments.py @@ -0,0 +1,395 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class InsightsSegmentsInstance(InstanceResource): + """ + :ivar segment_id: To unique id of the segment + :ivar external_id: The unique id for the conversation. + :ivar queue: + :ivar external_contact: + :ivar external_segment_link_id: The uuid for the external_segment_link. + :ivar date: The date of the conversation. + :ivar account_id: The unique id for the account. + :ivar external_segment_link: The hyperlink to recording of the task event. + :ivar agent_id: The unique id for the agent. + :ivar agent_phone: The phone number of the agent. + :ivar agent_name: The name of the agent. + :ivar agent_team_name: The team name to which agent belongs. + :ivar agent_team_name_in_hierarchy: he team name to which agent belongs. + :ivar agent_link: The link to the agent conversation. + :ivar customer_phone: The phone number of the customer. + :ivar customer_name: The name of the customer. + :ivar customer_link: The link to the customer conversation. + :ivar segment_recording_offset: The offset value for the recording. + :ivar media: The media identifiers of the conversation. + :ivar assessment_type: The type of the assessment. + :ivar assessment_percentage: The percentage scored on the Assessments. + :ivar url: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.segment_id: Optional[str] = payload.get("segment_id") + self.external_id: Optional[str] = payload.get("external_id") + self.queue: Optional[str] = payload.get("queue") + self.external_contact: Optional[str] = payload.get("external_contact") + self.external_segment_link_id: Optional[str] = payload.get( + "external_segment_link_id" + ) + self.date: Optional[str] = payload.get("date") + self.account_id: Optional[str] = payload.get("account_id") + self.external_segment_link: Optional[str] = payload.get("external_segment_link") + self.agent_id: Optional[str] = payload.get("agent_id") + self.agent_phone: Optional[str] = payload.get("agent_phone") + self.agent_name: Optional[str] = payload.get("agent_name") + self.agent_team_name: Optional[str] = payload.get("agent_team_name") + self.agent_team_name_in_hierarchy: Optional[str] = payload.get( + "agent_team_name_in_hierarchy" + ) + self.agent_link: Optional[str] = payload.get("agent_link") + self.customer_phone: Optional[str] = payload.get("customer_phone") + self.customer_name: Optional[str] = payload.get("customer_name") + self.customer_link: Optional[str] = payload.get("customer_link") + self.segment_recording_offset: Optional[str] = payload.get( + "segment_recording_offset" + ) + self.media: Optional[Dict[str, object]] = payload.get("media") + self.assessment_type: Optional[Dict[str, object]] = payload.get( + "assessment_type" + ) + self.assessment_percentage: Optional[Dict[str, object]] = payload.get( + "assessment_percentage" + ) + self.url: Optional[str] = payload.get("url") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class InsightsSegmentsPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InsightsSegmentsInstance: + """ + Build an instance of InsightsSegmentsInstance + + :param payload: Payload response from the API + """ + return InsightsSegmentsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InsightsSegmentsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InsightsSegmentsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Insights/Segments" + + def stream( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + reservation_id: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InsightsSegmentsInstance]: + """ + Streams InsightsSegmentsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: To unique id of the segment + :param List[str] reservation_id: The list of reservation Ids + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + authorization=authorization, + segment_id=segment_id, + reservation_id=reservation_id, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + reservation_id: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InsightsSegmentsInstance]: + """ + Asynchronously streams InsightsSegmentsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: To unique id of the segment + :param List[str] reservation_id: The list of reservation Ids + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + authorization=authorization, + segment_id=segment_id, + reservation_id=reservation_id, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + reservation_id: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsSegmentsInstance]: + """ + Lists InsightsSegmentsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: To unique id of the segment + :param List[str] reservation_id: The list of reservation Ids + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + authorization=authorization, + segment_id=segment_id, + reservation_id=reservation_id, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + reservation_id: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InsightsSegmentsInstance]: + """ + Asynchronously lists InsightsSegmentsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str authorization: The Authorization HTTP request header + :param str segment_id: To unique id of the segment + :param List[str] reservation_id: The list of reservation Ids + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + authorization=authorization, + segment_id=segment_id, + reservation_id=reservation_id, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + reservation_id: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsSegmentsPage: + """ + Retrieve a single page of InsightsSegmentsInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param segment_id: To unique id of the segment + :param reservation_id: The list of reservation Ids + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsSegmentsInstance + """ + data = values.of( + { + "Authorization": authorization, + "SegmentId": segment_id, + "ReservationId": serialize.map(reservation_id, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsSegmentsPage(self._version, response) + + async def page_async( + self, + authorization: Union[str, object] = values.unset, + segment_id: Union[str, object] = values.unset, + reservation_id: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InsightsSegmentsPage: + """ + Asynchronously retrieve a single page of InsightsSegmentsInstance records from the API. + Request is executed immediately + + :param authorization: The Authorization HTTP request header + :param segment_id: To unique id of the segment + :param reservation_id: The list of reservation Ids + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InsightsSegmentsInstance + """ + data = values.of( + { + "Authorization": authorization, + "SegmentId": segment_id, + "ReservationId": serialize.map(reservation_id, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InsightsSegmentsPage(self._version, response) + + def get_page(self, target_url: str) -> InsightsSegmentsPage: + """ + Retrieve a specific page of InsightsSegmentsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsSegmentsInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InsightsSegmentsPage(self._version, response) + + async def get_page_async(self, target_url: str) -> InsightsSegmentsPage: + """ + Asynchronously retrieve a specific page of InsightsSegmentsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InsightsSegmentsInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InsightsSegmentsPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_session.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_session.py new file mode 100644 index 00000000..b4174aa9 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_session.py @@ -0,0 +1,190 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class InsightsSessionInstance(InstanceResource): + """ + :ivar workspace_id: Unique ID to identify the user's workspace + :ivar session_expiry: The session expiry date and time, given in ISO 8601 format. + :ivar session_id: The unique ID for the session + :ivar base_url: The base URL to fetch reports and dashboards + :ivar url: The URL of this resource. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.workspace_id: Optional[str] = payload.get("workspace_id") + self.session_expiry: Optional[str] = payload.get("session_expiry") + self.session_id: Optional[str] = payload.get("session_id") + self.base_url: Optional[str] = payload.get("base_url") + self.url: Optional[str] = payload.get("url") + + self._context: Optional[InsightsSessionContext] = None + + @property + def _proxy(self) -> "InsightsSessionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InsightsSessionContext for this InsightsSessionInstance + """ + if self._context is None: + self._context = InsightsSessionContext( + self._version, + ) + return self._context + + def create( + self, authorization: Union[str, object] = values.unset + ) -> "InsightsSessionInstance": + """ + Create the InsightsSessionInstance + + :param authorization: The Authorization HTTP request header + + :returns: The created InsightsSessionInstance + """ + return self._proxy.create( + authorization=authorization, + ) + + async def create_async( + self, authorization: Union[str, object] = values.unset + ) -> "InsightsSessionInstance": + """ + Asynchronous coroutine to create the InsightsSessionInstance + + :param authorization: The Authorization HTTP request header + + :returns: The created InsightsSessionInstance + """ + return await self._proxy.create_async( + authorization=authorization, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class InsightsSessionContext(InstanceContext): + + def __init__(self, version: Version): + """ + Initialize the InsightsSessionContext + + :param version: Version that contains the resource + """ + super().__init__(version) + + self._uri = "/Insights/Session" + + def create( + self, authorization: Union[str, object] = values.unset + ) -> InsightsSessionInstance: + """ + Create the InsightsSessionInstance + + :param authorization: The Authorization HTTP request header + + :returns: The created InsightsSessionInstance + """ + data = values.of( + { + "Authorization": authorization, + } + ) + + payload = self._version.create(method="POST", uri=self._uri, data=data) + + return InsightsSessionInstance(self._version, payload) + + async def create_async( + self, authorization: Union[str, object] = values.unset + ) -> InsightsSessionInstance: + """ + Asynchronous coroutine to create the InsightsSessionInstance + + :param authorization: The Authorization HTTP request header + + :returns: The created InsightsSessionInstance + """ + data = values.of( + { + "Authorization": authorization, + } + ) + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data + ) + + return InsightsSessionInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class InsightsSessionList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InsightsSessionList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self) -> InsightsSessionContext: + """ + Constructs a InsightsSessionContext + + """ + return InsightsSessionContext(self._version) + + def __call__(self) -> InsightsSessionContext: + """ + Constructs a InsightsSessionContext + + """ + return InsightsSessionContext(self._version) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_settings_answer_sets.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_settings_answer_sets.py new file mode 100644 index 00000000..9b0e89e9 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_settings_answer_sets.py @@ -0,0 +1,118 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class InsightsSettingsAnswerSetsInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Insights resource and owns this resource. + :ivar answer_sets: The lis of answer sets + :ivar answer_set_categories: The list of answer set categories + :ivar not_applicable: The details for not applicable answer set + :ivar url: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.answer_sets: Optional[Dict[str, object]] = payload.get("answer_sets") + self.answer_set_categories: Optional[Dict[str, object]] = payload.get( + "answer_set_categories" + ) + self.not_applicable: Optional[Dict[str, object]] = payload.get("not_applicable") + self.url: Optional[str] = payload.get("url") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class InsightsSettingsAnswerSetsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InsightsSettingsAnswerSetsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Insights/QualityManagement/Settings/AnswerSets" + + def fetch( + self, authorization: Union[str, object] = values.unset + ) -> InsightsSettingsAnswerSetsInstance: + """ + Asynchronously fetch the InsightsSettingsAnswerSetsInstance + + :param authorization: The Authorization HTTP request header + :returns: The fetched InsightsSettingsAnswerSetsInstance + """ + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InsightsSettingsAnswerSetsInstance(self._version, payload) + + async def fetch_async( + self, authorization: Union[str, object] = values.unset + ) -> InsightsSettingsAnswerSetsInstance: + """ + Asynchronously fetch the InsightsSettingsAnswerSetsInstance + + :param authorization: The Authorization HTTP request header + :returns: The fetched InsightsSettingsAnswerSetsInstance + """ + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InsightsSettingsAnswerSetsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_settings_comment.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_settings_comment.py new file mode 100644 index 00000000..18733a49 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_settings_comment.py @@ -0,0 +1,112 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class InsightsSettingsCommentInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Insights resource and owns this resource. + :ivar comments: + :ivar url: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.comments: Optional[Dict[str, object]] = payload.get("comments") + self.url: Optional[str] = payload.get("url") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class InsightsSettingsCommentList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InsightsSettingsCommentList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Insights/QualityManagement/Settings/CommentTags" + + def fetch( + self, authorization: Union[str, object] = values.unset + ) -> InsightsSettingsCommentInstance: + """ + Asynchronously fetch the InsightsSettingsCommentInstance + + :param authorization: The Authorization HTTP request header + :returns: The fetched InsightsSettingsCommentInstance + """ + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InsightsSettingsCommentInstance(self._version, payload) + + async def fetch_async( + self, authorization: Union[str, object] = values.unset + ) -> InsightsSettingsCommentInstance: + """ + Asynchronously fetch the InsightsSettingsCommentInstance + + :param authorization: The Authorization HTTP request header + :returns: The fetched InsightsSettingsCommentInstance + """ + headers = values.of( + { + "Authorization": authorization, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InsightsSettingsCommentInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_user_roles.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_user_roles.py new file mode 100644 index 00000000..19cb10b8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/insights_user_roles.py @@ -0,0 +1,202 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class InsightsUserRolesInstance(InstanceResource): + """ + :ivar roles: Flex Insights roles for the user + :ivar url: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.roles: Optional[List[str]] = payload.get("roles") + self.url: Optional[str] = payload.get("url") + + self._context: Optional[InsightsUserRolesContext] = None + + @property + def _proxy(self) -> "InsightsUserRolesContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InsightsUserRolesContext for this InsightsUserRolesInstance + """ + if self._context is None: + self._context = InsightsUserRolesContext( + self._version, + ) + return self._context + + def fetch( + self, authorization: Union[str, object] = values.unset + ) -> "InsightsUserRolesInstance": + """ + Fetch the InsightsUserRolesInstance + + :param authorization: The Authorization HTTP request header + + :returns: The fetched InsightsUserRolesInstance + """ + return self._proxy.fetch( + authorization=authorization, + ) + + async def fetch_async( + self, authorization: Union[str, object] = values.unset + ) -> "InsightsUserRolesInstance": + """ + Asynchronous coroutine to fetch the InsightsUserRolesInstance + + :param authorization: The Authorization HTTP request header + + :returns: The fetched InsightsUserRolesInstance + """ + return await self._proxy.fetch_async( + authorization=authorization, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class InsightsUserRolesContext(InstanceContext): + + def __init__(self, version: Version): + """ + Initialize the InsightsUserRolesContext + + :param version: Version that contains the resource + """ + super().__init__(version) + + self._uri = "/Insights/UserRoles" + + def fetch( + self, authorization: Union[str, object] = values.unset + ) -> InsightsUserRolesInstance: + """ + Fetch the InsightsUserRolesInstance + + :param authorization: The Authorization HTTP request header + + :returns: The fetched InsightsUserRolesInstance + """ + + data = values.of( + { + "Authorization": authorization, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return InsightsUserRolesInstance( + self._version, + payload, + ) + + async def fetch_async( + self, authorization: Union[str, object] = values.unset + ) -> InsightsUserRolesInstance: + """ + Asynchronous coroutine to fetch the InsightsUserRolesInstance + + :param authorization: The Authorization HTTP request header + + :returns: The fetched InsightsUserRolesInstance + """ + + data = values.of( + { + "Authorization": authorization, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return InsightsUserRolesInstance( + self._version, + payload, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class InsightsUserRolesList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InsightsUserRolesList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self) -> InsightsUserRolesContext: + """ + Constructs a InsightsUserRolesContext + + """ + return InsightsUserRolesContext(self._version) + + def __call__(self) -> InsightsUserRolesContext: + """ + Constructs a InsightsUserRolesContext + + """ + return InsightsUserRolesContext(self._version) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/__init__.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/__init__.py new file mode 100644 index 00000000..653938f2 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/__init__.py @@ -0,0 +1,386 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.flex_api.v1.interaction.interaction_channel import ( + InteractionChannelList, +) + + +class InteractionInstance(InstanceResource): + """ + :ivar sid: The unique string created by Twilio to identify an Interaction resource, prefixed with KD. + :ivar channel: A JSON object that defines the Interaction’s communication channel and includes details about the channel. See the [Outbound SMS](https://www.twilio.com/docs/flex/developer/conversations/interactions-api/interactions#agent-initiated-outbound-interactions) and [inbound (API-initiated)](https://www.twilio.com/docs/flex/developer/conversations/interactions-api/interactions#api-initiated-contact) Channel object examples. + :ivar routing: A JSON Object representing the routing rules for the Interaction Channel. See [Outbound SMS Example](https://www.twilio.com/docs/flex/developer/conversations/interactions-api/interactions#agent-initiated-outbound-interactions) for an example Routing object. The Interactions resource uses TaskRouter for all routing functionality. All attributes in the Routing object on your Interaction request body are added “as is” to the task. For a list of known attributes consumed by the Flex UI and/or Flex Insights, see [Known Task Attributes](https://www.twilio.com/docs/flex/developer/conversations/interactions-api#task-attributes). + :ivar url: + :ivar links: + :ivar interaction_context_sid: + :ivar webhook_ttid: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.channel: Optional[Dict[str, object]] = payload.get("channel") + self.routing: Optional[Dict[str, object]] = payload.get("routing") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + self.interaction_context_sid: Optional[str] = payload.get( + "interaction_context_sid" + ) + self.webhook_ttid: Optional[str] = payload.get("webhook_ttid") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[InteractionContext] = None + + @property + def _proxy(self) -> "InteractionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InteractionContext for this InteractionInstance + """ + if self._context is None: + self._context = InteractionContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "InteractionInstance": + """ + Fetch the InteractionInstance + + + :returns: The fetched InteractionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InteractionInstance": + """ + Asynchronous coroutine to fetch the InteractionInstance + + + :returns: The fetched InteractionInstance + """ + return await self._proxy.fetch_async() + + def update( + self, webhook_ttid: Union[str, object] = values.unset + ) -> "InteractionInstance": + """ + Update the InteractionInstance + + :param webhook_ttid: The unique identifier for Interaction level webhook + + :returns: The updated InteractionInstance + """ + return self._proxy.update( + webhook_ttid=webhook_ttid, + ) + + async def update_async( + self, webhook_ttid: Union[str, object] = values.unset + ) -> "InteractionInstance": + """ + Asynchronous coroutine to update the InteractionInstance + + :param webhook_ttid: The unique identifier for Interaction level webhook + + :returns: The updated InteractionInstance + """ + return await self._proxy.update_async( + webhook_ttid=webhook_ttid, + ) + + @property + def channels(self) -> InteractionChannelList: + """ + Access the channels + """ + return self._proxy.channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InteractionContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the InteractionContext + + :param version: Version that contains the resource + :param sid: The SID of the Interaction resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Interactions/{sid}".format(**self._solution) + + self._channels: Optional[InteractionChannelList] = None + + def fetch(self) -> InteractionInstance: + """ + Fetch the InteractionInstance + + + :returns: The fetched InteractionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InteractionInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InteractionInstance: + """ + Asynchronous coroutine to fetch the InteractionInstance + + + :returns: The fetched InteractionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InteractionInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, webhook_ttid: Union[str, object] = values.unset + ) -> InteractionInstance: + """ + Update the InteractionInstance + + :param webhook_ttid: The unique identifier for Interaction level webhook + + :returns: The updated InteractionInstance + """ + + data = values.of( + { + "WebhookTtid": webhook_ttid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, webhook_ttid: Union[str, object] = values.unset + ) -> InteractionInstance: + """ + Asynchronous coroutine to update the InteractionInstance + + :param webhook_ttid: The unique identifier for Interaction level webhook + + :returns: The updated InteractionInstance + """ + + data = values.of( + { + "WebhookTtid": webhook_ttid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def channels(self) -> InteractionChannelList: + """ + Access the channels + """ + if self._channels is None: + self._channels = InteractionChannelList( + self._version, + self._solution["sid"], + ) + return self._channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InteractionList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InteractionList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Interactions" + + def create( + self, + channel: object, + routing: Union[object, object] = values.unset, + interaction_context_sid: Union[str, object] = values.unset, + webhook_ttid: Union[str, object] = values.unset, + ) -> InteractionInstance: + """ + Create the InteractionInstance + + :param channel: The Interaction's channel. + :param routing: The Interaction's routing logic. + :param interaction_context_sid: The Interaction context sid is used for adding a context lookup sid + :param webhook_ttid: The unique identifier for Interaction level webhook + + :returns: The created InteractionInstance + """ + + data = values.of( + { + "Channel": serialize.object(channel), + "Routing": serialize.object(routing), + "InteractionContextSid": interaction_context_sid, + "WebhookTtid": webhook_ttid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionInstance(self._version, payload) + + async def create_async( + self, + channel: object, + routing: Union[object, object] = values.unset, + interaction_context_sid: Union[str, object] = values.unset, + webhook_ttid: Union[str, object] = values.unset, + ) -> InteractionInstance: + """ + Asynchronously create the InteractionInstance + + :param channel: The Interaction's channel. + :param routing: The Interaction's routing logic. + :param interaction_context_sid: The Interaction context sid is used for adding a context lookup sid + :param webhook_ttid: The unique identifier for Interaction level webhook + + :returns: The created InteractionInstance + """ + + data = values.of( + { + "Channel": serialize.object(channel), + "Routing": serialize.object(routing), + "InteractionContextSid": interaction_context_sid, + "WebhookTtid": webhook_ttid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionInstance(self._version, payload) + + def get(self, sid: str) -> InteractionContext: + """ + Constructs a InteractionContext + + :param sid: The SID of the Interaction resource to fetch. + """ + return InteractionContext(self._version, sid=sid) + + def __call__(self, sid: str) -> InteractionContext: + """ + Constructs a InteractionContext + + :param sid: The SID of the Interaction resource to fetch. + """ + return InteractionContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c1e9f02cf7bdd0cd615409fbbb715ec720f8089 GIT binary patch literal 15683 zcmeHOe{2+2exKQ$*?0|VyQ2D}bG5-#RPVjyq?VmJ)B$~d>T?2Pf6{o$LL zHQ3k)CET58PD450Li7jlRDrxZ{ECL^S-}7@9jTSSBC^#umAL$y+7V62>(hC_9a`H>Aykd zhM)>vf-0(>w3zX9c{1KEZ$|2pGIEzJQn@$n%lNzenLt;7Jxl3eCe#&Tc{yE`33r8A z-j}Y<)O6Lbygwbu)OOXfd?39jQ`c1|3LfE*pa!o9YDf#e0I-g3Xa!QMGFs)tSCA4t( zZ}w_RfBsB5l~hjhN++K0JgKxFKOEytJC2=vzRgLD@UYlC7msL5CQ?fZz(bSa5CX-}?WD?nYBAp(Lh5mz> zBq|lX?b*SibRd;9i-BYPW-6CWq>J*YEHY6~F=%LdDv?eNX+_^aBAwTas91~~&KhPS zo7DE_vZi*yL{Y6>bV4(7c|ED2EPOO&n6794OPX#_w_>sJFdFKKBn`K}H<8V1X{wy$ zjLXx2^)UUP$b1*FqzPRj!Gu1PwB(jRDYel!HwMFUIwVu=k zNcj1b*{d8m!1;`il;jj@Q`(gmI*)ZIxifuQlDH~iDk_>~HO}v@o_~J%4bmT(3?`RM z5SbOL7feA_QrToWucDc%nTb@|P!eZyd5cf^U@@gr(-`BPK9)D}7Ogs8?0k8X&HCrh zpO2YLvSJvgRm~-h)*eV30 z>G%vVg+sYxoN~GbavQ`FU>MR=Ry{?}qXVTUr?XNQJ?+6bS;|PFJkJOI@;?93NJFy* zdt1w(oZz2stxk+ditB?6hxe7dfp0#UFwRjEO=q7E9qBAePd>{O71W?P7=x8)$IFBX zaXW+hP~2IzTIB;O;P^pk!a3pwK{ZU}OiqO;>Y9>JRfycrFTV*Rn=*cW`Og#xD-p!R zbYjXu`XnU{&8XyhlylkK`K)_jaDtJ~FssZOkr7f(9VRAiMN9Sw?U6d$YZ_Y=1M+nG z2;5SIQW}0}*?BYb-+?dzXZ7v0tPG!#-?gE#n#fi&dTH>VTTy4&4XL@tF zb8*wO%Zq-JaVVIgzdtdU&Lz~M7mbpVOOumBM1RwN4FBdbR?yu2z63$H`54vX*L z9bKX@?CG=JI9|k3)u}No#HlxSEl}5E_lCO8Octo?b=7soU7)Vys_T2m9AsBr|3m8f zTy<^3yU;rLU3G(Yzp6Owy&xKJSBHf@XJ+_GR?)R}H0Woj+`iR3xh9;2JvvR3G2 zli9I2nW%xSZY$Mle@?7_P+x%|hnid(&Gr*wcC8JlVf+=6Utbm;_=I51RevF{bZp7T zfi?HmMt`vR?ajBe$+bI1rPl&eJ9fQyTk;{VX|j)&I-b2?2bj|4BxJ9IxpG^gv36(ErTN?Fb^+#jaG9CK>F z*us>x{g&daM1SH;T7!;vIt2H^o@K~B!`DmY@^F!u5i(-T{MdcjrOcZ2>$wXlm;=j( zSR?RogJ#*r*VSlq8>Rhav&3vFu#__`#`xnRyG13PoaSPktAW)SWXDp<`btzmgVneh zL{CLuLydfKn(W}va#!P724?TtsL3-(E(@hvAzb^tJy-WkR4G4eicQrv+^D`@J=L)E zM#uGzn@<%Qq7P*6%9_ywuf13b2(=C08@W0%5opraqIDS;5q%jKJ&nvlT-4|A5Gq-h z9Xo*T;!M(6kAs?->}BMv@ExH_D^Cu4548fFDzzax(G~URQH))bS!I0_@~-vMx8Qkb zS%nT_to~uDPO1%SS3?VO@#@995v34OCL?Pn0&C~541M#f_?td~@g-&6o@S613-t%JAGc)3>TDvirP4?=!EU|Sm$2C2Co*ZA9FJ(PD>;!JdLpB^ZD(0TX+@1G%O`d%i;|`w%Wk<4pXb>;KAX>>8%X!s)ba5);~u6l z*eipUOW}G$-;R7`rNJAX#(Sd~2?*2RF#eiCWX;sF^(C)RyLMXe)P_oeCm7;FFqari z2wp-Dk1GUjfF3kZUD=ARrwEi4H9YkoIKsBgn+Ir0_eQ?~?c2hqb#z?~=I3*inpk!m{R}MKr)7p?Fa!OSEb8(~e7jjfA)Bj|Fn6$-^ zSy0;CEP;A-F}=TjmT<|W2FQ*gHOpZ&oOd=W2kbZVvIdbA%~5d z3z6oDK=XX%J;ymx#XkDbIhX3WLT*!qkE;~z*aq)_VCUYk`Wyjl-RHy;vxCe=P*^N! zX4aQEuIC1zN|c1sqo=g2njS>#Z2=Gro2jHfUQ8r=0W2-p#MWUmqEbd-S_)DU(+82* zBK$H`OgBD!L>%#`LZ!tS7Ka`0@B88nQ50TVAqj&b*{*TVkbH4u&&83Bak1zlw=7|f zdyAgflST1dQ5-Ocqc9)l*~|oY!^_t$^y_NVof6T3OM9HUsj zy+0LuX=|*)pvuLOz2j0*>dU3F%p)txh&?if-j0qeU5n6*dxCCpr3i{ow=%!lZ!e)A zgM2FRYgnjnys_!}Cd~Bx13&8cpyTfD-vXX(z46E6fB`Wl zGP^o05}*K6*NHwlF$N2oiUGKn@UP85=3y~cN+-jwQ{Y>a^H~G2B89L;A4fWw)zL|F z>D82w{OTQ4q1p-olUh0*kHeNJC}n=ybBr5wnmtP>Tr>U=$*->n_dNkQP-+y8iJjto zZ=JkrYRRe+yGL7YC2w!P)jMuI?>+dT@j>QOdRN*c_-cOX3Ck;|y~veVuE{SqPuKb7 zRv5c&UwN;sedHs_+nrfd4|k(6WinwN0<9*N=e-YelQ8K^yB;4(09 zzm@kPAJBq*qypz$K;`{fl_qIn2lMvKH0t50w^XY{@|YivN?uR`%s+;P0Sh4#MP}k1zo(@i0Wh(Z(Kl43%&bRZ5Z8CT5;< z{iXN^gsC`hRE!h17hV|jM&+S9j!`4<8`llFXz_E6pOWw#UywLQ?50vK*>+Yfhu}B07Zf6{0?U zITnFQF;inqe-)*8UQYqJv5hAJQ&OU{l;ToJ3xyFbbHQZr$qLu3taWhElix>m;}8-; zPio506U3MVW4Pgq#akyDqIVmfEYSabw|Bg^_s(8q0B!{D?Rpl_Mh%w~Qg3DUiu4RI z()0up0F#d4u4JfFg3Abt!`N5ejaHS}qmqdx7U^@~Jv6m0xUQ1D6FlNE9bm3<&%+*+ zlZu^lsWL-Re0EQe8Na?6m1b%a{r%VpWyZd>&j7gQYljEbZx+3Wo<9j&>dRc18!1eV>aYrN5Nz2$D*`a<3MTc_TaeiZy5 z_>-Lzb?cc?`$c5!6hMj>uf8}Ht|x?|=6cOozEHdVfnTD4L$U)7hr$?+sQ)Vd*d8bM zR{rlf0Ktpw4qmO z>2kvBXYsb2*i>t1)k4JPp~<_{N=L$+t%a$+wCSztH>&S0-C9_>b*g^pnEF=gjnwTW zh$WY8Lj+B&j$w_<$x0* z4^4(`bfqj3{V-A;fC;R z3&aEAze8<k!l_IW6)nnGZ81+}%I zP`6>Ke%YA$*5Dh1x6Jpy4i>K82o`p@_vVft?0I|7?Tzo7Kf3h6rJrbpXHR|{IW-YD z#cWp@Y~?7f4dAjzQCz>>+zFKzC{uZ#pId{BTb<)p3dWxIk098vr&K#O!TIr<(X^9cMK26OahX{6^U*@vXuZ#amO zAvb_x%Z!b4Q~+%vSX%uM_4ie39sO)X#_Es&8J#w1^rJ`&iUMu3K)AwCC6=(~5X69w zgSE8XjkFgc?H_KOjJz-rc!BXlv_U^cqaUZ_Ym_j^q?2+K8F9CI3+2d{V&1oYigKj* zb%MuTpvXyjEJsH4uT$CYA#tN28>o!6Z*!KP`MGNrahuK5)Pcm(BD4Di6+0z8l_ zHTvZv7T|Hj0zBv&$XjqOJ7k(Z3hK-SJbF9~?C=2WkTkiHkMlUCJ@C~u0!jj!-#Pdw z<0vS&&}lLrVB8=IA_$jN8$HQFnYrys|EK+Q%yI#2)&P>4*f(1)S7;(!`lf z_r8~9M&=oH*h6leKgV|2dQ1l!_$;s@6Ju@Wv(GCFE1U3g$o;b-MqHeVPJ^b?bRHU( zB8>A`?P(2jsL2d-c<(IS-s+k$8o<@B4$A9p`aczLD>VsEJo#?Zc+=F=yWdOSNl$Iw`tI)W-S?~3$-C|?T2hj6$I)_3cg*DqtK`IIfOPa>^-)tN^QfS;%q7HD*BeZh5 znsO(^|DAD;iaxpRno$yPn^?Vdn(n1qBxCz|**YKuR@qZ@Lcu3nCMr5;((8)a4tGO|Ie?w!hi0A8oH#4^qpO6|2}=hW}hrr}(2-?|yHepr#0!65Xe "InteractionChannelContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InteractionChannelContext for this InteractionChannelInstance + """ + if self._context is None: + self._context = InteractionChannelContext( + self._version, + interaction_sid=self._solution["interaction_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "InteractionChannelInstance": + """ + Fetch the InteractionChannelInstance + + + :returns: The fetched InteractionChannelInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InteractionChannelInstance": + """ + Asynchronous coroutine to fetch the InteractionChannelInstance + + + :returns: The fetched InteractionChannelInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + status: "InteractionChannelInstance.UpdateChannelStatus", + routing: Union[object, object] = values.unset, + ) -> "InteractionChannelInstance": + """ + Update the InteractionChannelInstance + + :param status: + :param routing: It changes the state of associated tasks. Routing status is required, When the channel status is set to `inactive`. Allowed Value for routing status is `closed`. Otherwise Optional, if not specified, all tasks will be set to `wrapping`. + + :returns: The updated InteractionChannelInstance + """ + return self._proxy.update( + status=status, + routing=routing, + ) + + async def update_async( + self, + status: "InteractionChannelInstance.UpdateChannelStatus", + routing: Union[object, object] = values.unset, + ) -> "InteractionChannelInstance": + """ + Asynchronous coroutine to update the InteractionChannelInstance + + :param status: + :param routing: It changes the state of associated tasks. Routing status is required, When the channel status is set to `inactive`. Allowed Value for routing status is `closed`. Otherwise Optional, if not specified, all tasks will be set to `wrapping`. + + :returns: The updated InteractionChannelInstance + """ + return await self._proxy.update_async( + status=status, + routing=routing, + ) + + @property + def invites(self) -> InteractionChannelInviteList: + """ + Access the invites + """ + return self._proxy.invites + + @property + def participants(self) -> InteractionChannelParticipantList: + """ + Access the participants + """ + return self._proxy.participants + + @property + def transfers(self) -> InteractionTransferList: + """ + Access the transfers + """ + return self._proxy.transfers + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InteractionChannelContext(InstanceContext): + + def __init__(self, version: Version, interaction_sid: str, sid: str): + """ + Initialize the InteractionChannelContext + + :param version: Version that contains the resource + :param interaction_sid: The unique string created by Twilio to identify an Interaction resource, prefixed with KD. + :param sid: The unique string created by Twilio to identify an Interaction Channel resource, prefixed with UO. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "interaction_sid": interaction_sid, + "sid": sid, + } + self._uri = "/Interactions/{interaction_sid}/Channels/{sid}".format( + **self._solution + ) + + self._invites: Optional[InteractionChannelInviteList] = None + self._participants: Optional[InteractionChannelParticipantList] = None + self._transfers: Optional[InteractionTransferList] = None + + def fetch(self) -> InteractionChannelInstance: + """ + Fetch the InteractionChannelInstance + + + :returns: The fetched InteractionChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InteractionChannelInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InteractionChannelInstance: + """ + Asynchronous coroutine to fetch the InteractionChannelInstance + + + :returns: The fetched InteractionChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InteractionChannelInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + status: "InteractionChannelInstance.UpdateChannelStatus", + routing: Union[object, object] = values.unset, + ) -> InteractionChannelInstance: + """ + Update the InteractionChannelInstance + + :param status: + :param routing: It changes the state of associated tasks. Routing status is required, When the channel status is set to `inactive`. Allowed Value for routing status is `closed`. Otherwise Optional, if not specified, all tasks will be set to `wrapping`. + + :returns: The updated InteractionChannelInstance + """ + + data = values.of( + { + "Status": status, + "Routing": serialize.object(routing), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionChannelInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + status: "InteractionChannelInstance.UpdateChannelStatus", + routing: Union[object, object] = values.unset, + ) -> InteractionChannelInstance: + """ + Asynchronous coroutine to update the InteractionChannelInstance + + :param status: + :param routing: It changes the state of associated tasks. Routing status is required, When the channel status is set to `inactive`. Allowed Value for routing status is `closed`. Otherwise Optional, if not specified, all tasks will be set to `wrapping`. + + :returns: The updated InteractionChannelInstance + """ + + data = values.of( + { + "Status": status, + "Routing": serialize.object(routing), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionChannelInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + sid=self._solution["sid"], + ) + + @property + def invites(self) -> InteractionChannelInviteList: + """ + Access the invites + """ + if self._invites is None: + self._invites = InteractionChannelInviteList( + self._version, + self._solution["interaction_sid"], + self._solution["sid"], + ) + return self._invites + + @property + def participants(self) -> InteractionChannelParticipantList: + """ + Access the participants + """ + if self._participants is None: + self._participants = InteractionChannelParticipantList( + self._version, + self._solution["interaction_sid"], + self._solution["sid"], + ) + return self._participants + + @property + def transfers(self) -> InteractionTransferList: + """ + Access the transfers + """ + if self._transfers is None: + self._transfers = InteractionTransferList( + self._version, + self._solution["interaction_sid"], + self._solution["sid"], + ) + return self._transfers + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InteractionChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InteractionChannelInstance: + """ + Build an instance of InteractionChannelInstance + + :param payload: Payload response from the API + """ + return InteractionChannelInstance( + self._version, payload, interaction_sid=self._solution["interaction_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InteractionChannelList(ListResource): + + def __init__(self, version: Version, interaction_sid: str): + """ + Initialize the InteractionChannelList + + :param version: Version that contains the resource + :param interaction_sid: The unique string created by Twilio to identify an Interaction resource, prefixed with KD. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "interaction_sid": interaction_sid, + } + self._uri = "/Interactions/{interaction_sid}/Channels".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InteractionChannelInstance]: + """ + Streams InteractionChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InteractionChannelInstance]: + """ + Asynchronously streams InteractionChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InteractionChannelInstance]: + """ + Lists InteractionChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InteractionChannelInstance]: + """ + Asynchronously lists InteractionChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InteractionChannelPage: + """ + Retrieve a single page of InteractionChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InteractionChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InteractionChannelPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InteractionChannelPage: + """ + Asynchronously retrieve a single page of InteractionChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InteractionChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InteractionChannelPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> InteractionChannelPage: + """ + Retrieve a specific page of InteractionChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InteractionChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InteractionChannelPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> InteractionChannelPage: + """ + Asynchronously retrieve a specific page of InteractionChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InteractionChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InteractionChannelPage(self._version, response, self._solution) + + def get(self, sid: str) -> InteractionChannelContext: + """ + Constructs a InteractionChannelContext + + :param sid: The unique string created by Twilio to identify an Interaction Channel resource, prefixed with UO. + """ + return InteractionChannelContext( + self._version, interaction_sid=self._solution["interaction_sid"], sid=sid + ) + + def __call__(self, sid: str) -> InteractionChannelContext: + """ + Constructs a InteractionChannelContext + + :param sid: The unique string created by Twilio to identify an Interaction Channel resource, prefixed with UO. + """ + return InteractionChannelContext( + self._version, interaction_sid=self._solution["interaction_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08871700920942526cd0040d9d39656006fcd70c GIT binary patch literal 26728 zcmeHwdvH`&dgr~}x1V~nPz${UmzSgl(E@D1kpWu*Y%_qs65v^xal7fhLJj?pZ?^=J zCEH~)iAX$Svy%)Wn~L#_lR>dJ#@VeH?;~Sprz)OG)kYo7uCzDyhN*1TW~;Vpn`yc1 z;g8+@edj*uPZ9t9IkKu?bAcv0gn3zdeASM z=E;5r&t)#m4RB#TY>DzQ%YY?j9k9lP0U>4^u*K{H_LyV95pxbWc}ioAx?=7DcdTrn zELJ{H&ccLfMXYk5lKE{>PpoR7iuvu)6|w4pYUX!Dy|J2s8s>LKSH@}wYMI{^t&7zU z)HA<3+7N3TXk`AfXj80tpqb|^+@oB$`~nxQkgDFas_h^+=UQ=qeUkh0qmJ ztr5DKg;pcfD^(kz;#iGuW$?fA9Oo8s9UF=y#ZV$FiRXez@w60|JmYIuHnm zxqlQuK>^Ch?y9roQA=e?Lgi4lK!DXcA&L{mKLpbQ{*XkC2?QvFJ(5FJPMk!D>I(!q z$)^>f26r0e1}0c$HK~>kg{wtUVrniPzd;UFcv3G{6sZpNPfvf+t#;G7NHmfVH;a!% zrSobCbsYXuLy|Z=aw-}LiO1ALef#^5iQPvJ_|>evM~?09()u|XOtMVDkyIkDv&AFB zQXF~2N7WHX$bMGKP%1T??CR`HAUZf4*{lr^qEk|6h$Y#V5aWrID1{>_)|e2hBo>U1 z1f$V0zx#g>>G&LqwL3nh2>T+Tlp-98BvXp>$Z#r>hzFyJ?RXp>#d#n_qo0tKitglC zJfuJRtV&r}N=kAh7>$feiYw=}j|QV7QqspOo&)h@Di{w*dlT`LbUuZkDm|!AN+w3+ zkc6;us@nAII3dYNRE{X&Xz(;8X+D4gOxGr6sB}B|0Vt;W09=J%n?|q z6`_JD)W$+>2(_C+?Jmy6g&V>S$q{x+PRS*?2Q3Y#D(sS6VYgH!x#(%oImHd~;j#-A z1LaahxG`LDL3mSb8#hoHZVFdk5C%NBdvLFkR-9R{MVfBNUlm>vu9m!#RkCWel!v)N zd)RxyHc)fdxoVJWC0bK1)ec(1D@`q`W1;m3tu=)GcVZ}}qHYzFh!C)jRg%x`!nn>dAjKtNLUY}EO1_JS5ObP@PcOVc; zgh!&}FAoHs!R*pvZ2kL>9Y3nryZ0VDaALn=f28}sq5b<5``$xG`f+z2=v8B8xGcTV z?PvFPoji^ylstLxz=2~Y_esgKsl@Qf(L^L9bz_33PL4|P(UXTFr%on8^_z!-p|hA7 z$&)F@Upi$end%$_9}0jYbdGNAjO6Bv*&hh0lczHfh{PkQK)^pdrc~thgu_j{}Gbx5qQmp5sQ;PH4P%xDY4i75=-Y})OVp1|G#ZODJVm*B-*6S;i zS5a$MlOw`WY$uK!*t=h`_8;z7Z2J#md=%>w`+F4U6OVNt>+e2#R1x;Vr??L9@9*E= z`{@2Y#rkN^VY!t`U~k?|#R$|ac@w-F@k^4UcUh%(%BprA^LbmQoC}_nQ^G>c>M7Sk zrT3y$EoT?<6z{F{@9w?O&#+jt_^iUgr;LGm4U1;Pm=z1zjN%1Cck7Q}A-$ zVkPZC!u#<{mczljGRnx&!$SyF9HS}+R~*B^v1lR~Ry-zx3?w6A3}GZ3(nT-i;mB{r zFZ+*}=D){Z=28^Ou8Xz_?puhT;NR3(0MAWW&X{v+DZ@sJ2`)gTv8zN{i(VSi3ZIkK zYD#O=TcTXSl-917oAT(sGgZ1TcP~+rO)p8mqopoASBX4!Q(Ap7E7e;LQ`)l6Dc5OA zOGD4D3G0M#o=-ybo#4(G@2bbr()I@yw7EhL2_s#gQhyrbeC}R(FCOI{IEs*>Ic^8% zC!XwYXM%2grn zr^+57hx$fw5Ltpt$d6LcW8@ql=W7({3M3QJ5fV92UPu#R?23?-qJ#3ol&qT^YC5X{ z83Ihw3IvkW7bH}QFUZ6v+fp^W5$ebG|1K=~?Kw@9l## z2XA=hIv%4E8y5=e-1ZyqZhB|ajni}69zh0o#?FbI3*Op){?PRL*V?bN-?CX7shY}+ zliSn7PYK_uU|deI%UEIMct~Hv@rE3A5}Wc@;kisCgnQxj!p>A~B6DYqiJD7Sg7kQj zrb@&yx$7-MjssB|#T9P_

    52|G3$Z!qG%>Nesrth$iG>%fzHyaWEk>sauceP-So} zmiAV`;ozyLBqj!p0ztIM7K_ABi=#m~k{C&fsF`|R;_f*8*L?! zk0Rv^FZbb=BpMLeyin``dWo^|A_BZ#ye^B{)1FiZPKe>Zor!8(Sq9Hh(` z+GVopwCJl_%h}AS+*GEs)K{xt)yOh_Tsbi9x?3^=R9j? zooknN7j?u-_+@EG4|4n$>av#rqdbd}zH7N`{Y{&V>*scIFAM+DdXD#5ZvT$am2B%d zBq!oDFG2}90j?aEi0)bAe*vA`tM_slt1%Fy&G3@GCN47GT6)aXzE(4jB5iUFoPQ)% zk4~>`y!_;)C+Amoq*r##t@O`({IgE~tjB+wNm?(iYU8i+8-&+wZM?dGkszix)V??! zGSemTNP5ohf^#>NJi$*`-s0b+nScxQZ29T8F8@rfZR zuChUOi(^WJ%^lIo)A}y%X~t6%=Pa|wx`wIA5tFydzH^ck`gc(6(8vk zBZCZMNe)Y)$RN0IhX`y%WDOOuDT|7yBvG&UoQ$mrc>B{D{*%v~X}*sznf;FDJ0u<^ zz&wp1(y7v}=AW@L2Ahjd5*eU2RR{^=VOdVAmhwE3C0pTuEE^48uqN$Uv*2x5sA{T&RXTpa8{RFWetV&_Y(4Fi5J~1YsjZTFbGQt24Vf_H8X9N<`L>!eMPmw=r56K zTnA-JD*z*&x|kKS;LL{i#8> zAl@ps#$4BI{W^&1*au$V-uU)1uw2a?Jx+Fmcn6^yNVN3Yhbcyx*%e|VPfytHpp6U8dc~>Ap9$ zGAE(;I^!rP9FIA0hW1Lgb6cCEa$+WcgD%hD35FFoJDPVgjNe3GBEgt=m!LyL|s_I#JW%=6sKO#(N@ zlO#H08Mi$U)``gC;clKTHzW&Vg&e!%_*>i2pwa4e1I@68)KhFwC z^Wy3?{P@;gs+!49nyBvKi2uaaW$;1q*~vXKf+CzrMB;2)rr5xDVoCWt%7bu0^1R~E zHj_!B7fpU3R7Gv|=O7tsq8rGWq`egQQ90+Wz1)7O9qqoc?}xqb_0I1)n%;GEZdcz= z8vEy}`==ZWo}PKnfwbqqhi!A7zFB7`M z(lUv@@*gvEd+{5euw0q@IeX>LEETqvtQEct^R05& z)@7?5w$4mFw{gqc%`?rn991^=&8mkpHr%O#x>rZ1M_+v|y`nWkQ9yaztyvfOHr{=f z^{i&Wwr;jz`_DMswYIs2OXZsOjY_aXt7jXixa(Zy$W9rg;r4K)B|1? zT7yvN2#wH{$S)wQ3N5c?+P6Az>J@Basc>cwUW6f;A(}4wWvni5Afy187m5M%6V@=# zU|(acu|SG13J(hrT9eGRX|=w=f13v?XT*f9c%qiDi#^dC&OPa4%0WG13l3pE8SC}| zXu4E2b%{NIhE|!@AxIn8xN6u{m#8VEkv)jLDv+}vusv27mNBNrHY(FLw~?Iwjno~a z?8hcA9(e}4O>iN?`9iX!nN{dk0@$Nsp^T>@gJT3NnwAf&m})&80R5!F$a!pC&qY#0 z;=z5YQ2?!n`gZ#sRHrGAN>+RPNUmCj1&;eWP0dYqK3mWMlbu?Th(do%_A*_Q&nX|m z5He28mLj$WDMDaGj$pOX1Y0muv-AhGt05>snMKQ00r{%TmZ*ig#f-og5u>%i_v--s zkB}`HgacG&u__OM2e)Hjw;AMKd5E8_**9NvFkN%-7H3)MUZ|{oC4Mn}%L+e$a2GOl z^ZS8>zg)5KwO$oe-`x#h+@o?QTHNwP7@}k*&HYb!pauget5-4EEy9`PGJXPfOSJG6 zpHs!8HkwIioO%tp`vm`%pj$aiT2f_tO!1N@pyWAYD24R2Q2*F848B;Lo#Nhdys6D` z@FJ)DB!X^N0W5*-43iBz&m^IKvC}4FI0X&t{$mim>@g`dlz3fHUxJJnsgxiw2O}eAj*NgH?_>zFOMVJ{B7cXR-zDew$oVdu z-r~d}|2`#P)WSr-d}@*Z1!D6lgi?)fFfl%j$>mXq3UXv9^Yd_+R1d~df>i38U#qxM zF<-wmUB7j~TR$CsEpjDty)I+r8n$IQO9KE5i`PBnSafn#8}Ev2GA?Aioh0G)#cq3# zh5x|G_i(}ot_R>(AwzIHRu9z&YoQ^qn~Y{|zyOQT#85_JEh^^WOP z2wNr~pb?u33-H-AhF64%oiW%J5^Go3UYw3dlbvHmleV0`9_fpeJpr49Vw(K0Q)78m zdX2ezm>GDz<<8M6>{3o4e#WBMHA^IihH>9sW9EYAH=jFqZZqvYH$(L;#Yrh1zFp4f zES}oTj8F_Zht=GX{$n$Od>KW{({L0479l~I@i{}tQ+0SQ#wJzDr|yz}lN>e&!sN@J z12gslfLZ<{N|a-uB$R=H;xa+bW=W=ChNw8610<3BKC*&|Hgi?AuZ&$ByV)py)U4ee3KVcU_1f5#v1_Rt zPhc*2+c1~D*fdh%7g{Lv%iz9*EZhnA{eNSQfWJHQ`1=>1Gi+Xzm``rT-^+4y#^CSe z@@Wi#{DGshUkYVQ$Eqle~hr4MTbV&l(3ktPv`w+gt~+1 zn?OC4`QI}V*B6Uz>H2MjB;Ih}JzOq!_T0yR@Ed&3R^fxL2jI^WSZU7Fe8|#Blmf|L z*zr$g#-WR;cVxt2l}T31E&s4#c!dHOq{Fx#35H9c+p`EPra99GTidBTPUHLt(lQ9% zWTWtaZlj0LSm7)~;j76C=ZLDDdj8_`v(8mZJDY?@ z#!N22^Q)oDkdxGdDL8p-k6L;ke)mw-AdgZ_=g1j@lfT)RM9BE|(whw(oG+qMcn+f` zKS#yV4rF}G9q9|Su_twb`~u~D365DGz>w}@nn|5%^cI~bqS=Amcc=;Ip7%VK_B{4s z-JIv~S?A-7NPP7LaKDP{{}wfjfP8gVPh0jJd@o<5M-tCesWwbLw!lx3@AF}N`L`+E z@4zub_a`WjoWG<98(t33eMVRb4F0Mk!_oc5I`#hk-cQ(b#_zScXY00RIovZFSK?va z?ku9*0OED1eVqoi<6a20QxKr`^;sABj`DY(=W9Fz)ZMlg2Dam_f#&c5?kBL_ZClI0 zcHE7)wMN`(2DZCxtBttTnRRE0s-t}HlJOoT}tzGEJ(G!W$>BBsLfh;`xO&Wsb~imEk!U#2`V$6AOWT>V^P^03X&|j;7vCiwRSo0`X&p{L*#wPe zBF3O)9Q|^ud9a!4L34e)db6suZg6vG#rhDfB3Sf_y1uR)w$A`jVNiuLSjE^ob)(;$ z=mO2uRuqAaSa}X$nBIAP-@Co<^v>=*mcIY^qSZo3l%*IFg{&(3reVJf4JsN(>~nnM z9q}A$&>r;|0@)6k?HIpFr4&Kq*gNQ)hOE`HG~pSisoKR@N3YLS$UCTYGUFYz)~Nk? zoqSY_T7Mh)+R6D--FcCEXCt0yx;t&|tNX5buZ6DFzuudHmd-u9^YJX*Gc|VGuIY7) z9B!-utc1Ktp&RjM>oH!%G*E*A(>_^A`^3(T)#8MiU1DGtX`nQpoz9Wb1_`<)2ed@) zWz*^>%34%c!{$HP_hHDF?-U#l}cufTIX&f-yg1LD1SZZtjD;JFEL z#Po2o&U7-at{Cg16N~c0=v>AO@_;%+b|OuFfu;^Pf8i0DFpM4|q-7(X!LBc_rz7p# z`2RBa*5|6;=xu&o^=`&nvXK~Xzf%pEru(uL(|s}M0h?0B&>zO2u(DN!7BMX>2rsBy ziG-eF{E&LoP-a~rj@6BnpA}PPRjitRK4Z0L2R7{7%15Bf+B09XKTUs6d?@@)<&P`j zfwIcQ7#W?piA8X{ZWw$Tdd+c(*=7_c!tbHlQfNRiGkUWP&LpX&h@1;9QY|w)D2E(F z1x;J}!mF6FYeGPNE9KX1eaKWPID|F87|Z??)UvVVjzeInh6#E&nYU8ISXm6}$G36* z19KF`inX(PZ|v31<3+Do+#)OL&DNXv`g$Q)-3hp0KEg*kmLMp zhj@-m$m!rb*=;i$?vbQq^mTr7>50Z8thIz4dZ#zvzD0j|wDSNNiHpW;q4pvJ4BNuX z6nknU1zKX=Y|4P~Vl>t6Q=1k{!Dwrk8McGea0qBSKNFZo5BLuzL^I>fD8wrug4IJ9x3NIL?>&N{&=f_2weM1oX2GE5_=)~FGp@wW22 zn0+vZqMQ8ZaKP(GkX6d)B?2r{QW2=f=pZ0Xq8UxcPpMfx#jYlk|1Cn2#3k6!sBH1y z;c>iWsU*(WqE;X=#jhb9gv55(OkHld)H1(fV|vBLYum5;=2q;&QD={rbP!i}T-%gh zw_|E-&a-n$xQRd<9-8;8OMBKq_G`UfH`6)i>6&$RG48m84ZegrvVQ?bH$*JTsK9*+ zuP??50mxhP0QtLRjY2+a1kk>YDN=30b7-V7hGt89@F}%Zzv7tsZ2F30vgugV`HExG zw^V2?yE~34zXul4Yi5}8zd?xNW=jh@jHZ;U6Hz-;@$V5`$QwUESTPvD#2eMze@PsY z*s^+}q7;){*>E{3eJ$P^3@JMLXz>O5&{(!@^{26 z2q?oAvlYh$$tdaI#e)mAO$&|dFySleaqvpB+%Va%nWr&L_m}X?j>9p8C2blb$hb%_ z%1!jb!-3nlSF9n+X)a{BPd_#&sOO5YpR``Gyj%{ErUpOP4y2j1_QU0w?;OVj9c!@0 z%q|K99eUZXxQDS#D?#dCaSyTB=8cGFnXTKeI`@$O1Lj~aG!P%)uH#b%$Dpr!FbqS3 zs8kaf#Z51*N)*M6Ck`RjpG)!y@exwzs6xj^u5HtN>&|rRPJ@%QJpfM9R*55=Ybrmr z*{j@u*sI((Yny*&u$2(TQ?i6n#>Kv~p{gp({?QFLXQAs(4k zVL92WPlam;8j;RRp%MBtWh55E#}09vB06TmDpb6RjT;+7(zczJj?r+^w^Qg;B7N18 zpcDEyqtR$Hf}{?(no|RkG-*#oe9($yBsPqFFvK=76eaKuTVgb&XmJFxlmMhuWTit# zlo$-QeT(UJ4Csa4V)-sK>V~zv%Xn#d1;$@-(sMsyw}jBDmUG`B-|vz`HqtX@(@{I? z#U!)w^r=SmCOc_@U{rHCrX@Q{xg9Ec{UJrsmyA@f=a0yD1&-p>b)8Al)M>J(ir!Fh zC54S)w7Uwr3T8$PVMEj{MO)ey>enqaZ@A?UNY232hlQwNVg1zX=A*OCkIz;2O_^=- zy>*v&U)nwI-H`Tf$QfD-H%`Mmw5Aodb2aWMCq9-`)p|AjgV^h_>tDZ-`r&i$JvZm+ zoptuAfDf@d{W4@2e5dsetw3>Xf{sf43bKMFww?EYH9+p#pxWgJr_C&)K*|D@f5kCO zoa-0OG337nMVDj^@_$5Z?@~VSK4tngIR+n)XYsgnic`vx(g00yRbbdk6a8CAtD4My zxw+oZ@>=Qn%8gjOE;lk{0g4y+%8(D^)DV{@jl*n$WT6MY8-^>+ApG}FS&lQ_0VTm zbrkk+0-qekaWwU-tN8emDvIQ2UjG2k9C}tx!^zuAD^8*jYE?bNaHqSTQpKiE+zM&`G(DVNG4>!&= z9G~|dFG<2Ajh)aDzuqNBT8SD6UL#Bp# zE1Kk9hhg)+lzql zBA?^d2bs7+mMr5``#}BN>b3jd-ZQfYA0ka}IyBq2#6Yl+0a;N%_FfN>{9jS3{P*PC zgkyd!`fv$8vVsqBl;pd5f)v^+|C9=$x6HHm#`BjkZKN)|OVdWy>$+*JataNm|1|}Ya~a$^xdt!745lk>UuOo>bic9g6OQhg^_;kV zVO`rTN1g4#o1VI9>&3~84SrZe*ECP>y|g<+F=Px~JzL$8c5TkO=y^vjTQ_gY*G->A z$z{YNa@N5TJMG#=IT2uFt%v=!UL*XbjP!(jm9v%YX_qgH530B`59l>En6kld%0^G- zZ1mivnQkw@>bqm6W1-#ucKJ;CE!S$>5&mXP!}Pl8(dkX;n%0bsLQq(3)AW5;?b8pY zSGHvwEX>Ivop*Y0x(Qp?49kf#6>c$G#-bn5t;7H6s_5a}Xx!ENG92A!H+5&3CsR+4 z*OFTB&ck{zjACC!DA~xa28PFMWZ_KjRm0Z96rP1KyV*~3cC$n?y}mVyBM=BDLiozQ z9bbqBjHG_VM1m8sWQiqK&V19eOfSzN%{59`TIw= zqK(FXe_{6PpYtykrhPqwopMl~xR(WEInzJ$#tw5Shweq``Vk}bs8TI@No6pM{V)#F zN@2v78CG=Lxl8@e7xu`v5C+b|CC|ahSb3hmWhv){Pn$XZFh9>7N^^()p4*Y;c6`h| z@G;l*F}LkwuI*!P%_kNMZ~4ToJB#k8EPOvdyJqVm$9#)Dwn+=$$6xg%u)Uh! WHGOQ6!)bN literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/interaction_channel_invite.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/__pycache__/interaction_channel_invite.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c83bd7f0b893b4804a2a13649aacec246bc6fc00 GIT binary patch literal 17567 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 HwAudw(LH%n literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_channel_invite.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_channel_invite.py new file mode 100644 index 00000000..a81acd4f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_channel_invite.py @@ -0,0 +1,372 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class InteractionChannelInviteInstance(InstanceResource): + """ + :ivar sid: The unique string created by Twilio to identify an Interaction Channel Invite resource. + :ivar interaction_sid: The Interaction SID for this Channel. + :ivar channel_sid: The Channel SID for this Invite. + :ivar routing: A JSON object representing the routing rules for the Interaction Channel. See [Outbound SMS Example](https://www.twilio.com/docs/flex/developer/conversations/interactions-api/interactions#agent-initiated-outbound-interactions) for an example Routing object. The Interactions resource uses TaskRouter for all routing functionality. All attributes in the Routing object on your Interaction request body are added “as is” to the task. For a list of known attributes consumed by the Flex UI and/or Flex Insights, see [Known Task Attributes](https://www.twilio.com/docs/flex/developer/conversations/interactions-api#task-attributes). + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + interaction_sid: str, + channel_sid: str, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.interaction_sid: Optional[str] = payload.get("interaction_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.routing: Optional[Dict[str, object]] = payload.get("routing") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "interaction_sid": interaction_sid, + "channel_sid": channel_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InteractionChannelInvitePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InteractionChannelInviteInstance: + """ + Build an instance of InteractionChannelInviteInstance + + :param payload: Payload response from the API + """ + return InteractionChannelInviteInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InteractionChannelInviteList(ListResource): + + def __init__(self, version: Version, interaction_sid: str, channel_sid: str): + """ + Initialize the InteractionChannelInviteList + + :param version: Version that contains the resource + :param interaction_sid: The Interaction SID for this Channel. + :param channel_sid: The Channel SID for this Participant. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "interaction_sid": interaction_sid, + "channel_sid": channel_sid, + } + self._uri = ( + "/Interactions/{interaction_sid}/Channels/{channel_sid}/Invites".format( + **self._solution + ) + ) + + def create(self, routing: object) -> InteractionChannelInviteInstance: + """ + Create the InteractionChannelInviteInstance + + :param routing: The Interaction's routing logic. + + :returns: The created InteractionChannelInviteInstance + """ + + data = values.of( + { + "Routing": serialize.object(routing), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionChannelInviteInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async(self, routing: object) -> InteractionChannelInviteInstance: + """ + Asynchronously create the InteractionChannelInviteInstance + + :param routing: The Interaction's routing logic. + + :returns: The created InteractionChannelInviteInstance + """ + + data = values.of( + { + "Routing": serialize.object(routing), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionChannelInviteInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InteractionChannelInviteInstance]: + """ + Streams InteractionChannelInviteInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InteractionChannelInviteInstance]: + """ + Asynchronously streams InteractionChannelInviteInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InteractionChannelInviteInstance]: + """ + Lists InteractionChannelInviteInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InteractionChannelInviteInstance]: + """ + Asynchronously lists InteractionChannelInviteInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InteractionChannelInvitePage: + """ + Retrieve a single page of InteractionChannelInviteInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InteractionChannelInviteInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InteractionChannelInvitePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InteractionChannelInvitePage: + """ + Asynchronously retrieve a single page of InteractionChannelInviteInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InteractionChannelInviteInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InteractionChannelInvitePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> InteractionChannelInvitePage: + """ + Retrieve a specific page of InteractionChannelInviteInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InteractionChannelInviteInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InteractionChannelInvitePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> InteractionChannelInvitePage: + """ + Asynchronously retrieve a specific page of InteractionChannelInviteInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InteractionChannelInviteInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InteractionChannelInvitePage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_channel_participant.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_channel_participant.py new file mode 100644 index 00000000..53d2d40d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_channel_participant.py @@ -0,0 +1,599 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class InteractionChannelParticipantInstance(InstanceResource): + + class Status(object): + CLOSED = "closed" + WRAPUP = "wrapup" + + class Type(object): + SUPERVISOR = "supervisor" + CUSTOMER = "customer" + EXTERNAL = "external" + AGENT = "agent" + UNKNOWN = "unknown" + + """ + :ivar sid: The unique string created by Twilio to identify an Interaction Channel Participant resource. + :ivar type: + :ivar interaction_sid: The Interaction Sid for this channel. + :ivar channel_sid: The Channel Sid for this Participant. + :ivar url: + :ivar routing_properties: The Participant's routing properties. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + interaction_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.type: Optional["InteractionChannelParticipantInstance.Type"] = payload.get( + "type" + ) + self.interaction_sid: Optional[str] = payload.get("interaction_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.url: Optional[str] = payload.get("url") + self.routing_properties: Optional[Dict[str, object]] = payload.get( + "routing_properties" + ) + + self._solution = { + "interaction_sid": interaction_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[InteractionChannelParticipantContext] = None + + @property + def _proxy(self) -> "InteractionChannelParticipantContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InteractionChannelParticipantContext for this InteractionChannelParticipantInstance + """ + if self._context is None: + self._context = InteractionChannelParticipantContext( + self._version, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def update( + self, status: "InteractionChannelParticipantInstance.Status" + ) -> "InteractionChannelParticipantInstance": + """ + Update the InteractionChannelParticipantInstance + + :param status: + + :returns: The updated InteractionChannelParticipantInstance + """ + return self._proxy.update( + status=status, + ) + + async def update_async( + self, status: "InteractionChannelParticipantInstance.Status" + ) -> "InteractionChannelParticipantInstance": + """ + Asynchronous coroutine to update the InteractionChannelParticipantInstance + + :param status: + + :returns: The updated InteractionChannelParticipantInstance + """ + return await self._proxy.update_async( + status=status, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class InteractionChannelParticipantContext(InstanceContext): + + def __init__( + self, version: Version, interaction_sid: str, channel_sid: str, sid: str + ): + """ + Initialize the InteractionChannelParticipantContext + + :param version: Version that contains the resource + :param interaction_sid: The Interaction Sid for this channel. + :param channel_sid: The Channel Sid for this Participant. + :param sid: The unique string created by Twilio to identify an Interaction Channel resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "interaction_sid": interaction_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = "/Interactions/{interaction_sid}/Channels/{channel_sid}/Participants/{sid}".format( + **self._solution + ) + + def update( + self, status: "InteractionChannelParticipantInstance.Status" + ) -> InteractionChannelParticipantInstance: + """ + Update the InteractionChannelParticipantInstance + + :param status: + + :returns: The updated InteractionChannelParticipantInstance + """ + + data = values.of( + { + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionChannelParticipantInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, status: "InteractionChannelParticipantInstance.Status" + ) -> InteractionChannelParticipantInstance: + """ + Asynchronous coroutine to update the InteractionChannelParticipantInstance + + :param status: + + :returns: The updated InteractionChannelParticipantInstance + """ + + data = values.of( + { + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionChannelParticipantInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class InteractionChannelParticipantPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> InteractionChannelParticipantInstance: + """ + Build an instance of InteractionChannelParticipantInstance + + :param payload: Payload response from the API + """ + return InteractionChannelParticipantInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InteractionChannelParticipantList(ListResource): + + def __init__(self, version: Version, interaction_sid: str, channel_sid: str): + """ + Initialize the InteractionChannelParticipantList + + :param version: Version that contains the resource + :param interaction_sid: The Interaction Sid for this channel. + :param channel_sid: The Channel Sid for this Participant. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "interaction_sid": interaction_sid, + "channel_sid": channel_sid, + } + self._uri = "/Interactions/{interaction_sid}/Channels/{channel_sid}/Participants".format( + **self._solution + ) + + def create( + self, + type: "InteractionChannelParticipantInstance.Type", + media_properties: object, + routing_properties: Union[object, object] = values.unset, + ) -> InteractionChannelParticipantInstance: + """ + Create the InteractionChannelParticipantInstance + + :param type: + :param media_properties: JSON representing the Media Properties for the new Participant. + :param routing_properties: Object representing the Routing Properties for the new Participant. + + :returns: The created InteractionChannelParticipantInstance + """ + + data = values.of( + { + "Type": type, + "MediaProperties": serialize.object(media_properties), + "RoutingProperties": serialize.object(routing_properties), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionChannelParticipantInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, + type: "InteractionChannelParticipantInstance.Type", + media_properties: object, + routing_properties: Union[object, object] = values.unset, + ) -> InteractionChannelParticipantInstance: + """ + Asynchronously create the InteractionChannelParticipantInstance + + :param type: + :param media_properties: JSON representing the Media Properties for the new Participant. + :param routing_properties: Object representing the Routing Properties for the new Participant. + + :returns: The created InteractionChannelParticipantInstance + """ + + data = values.of( + { + "Type": type, + "MediaProperties": serialize.object(media_properties), + "RoutingProperties": serialize.object(routing_properties), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionChannelParticipantInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InteractionChannelParticipantInstance]: + """ + Streams InteractionChannelParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InteractionChannelParticipantInstance]: + """ + Asynchronously streams InteractionChannelParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InteractionChannelParticipantInstance]: + """ + Lists InteractionChannelParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InteractionChannelParticipantInstance]: + """ + Asynchronously lists InteractionChannelParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InteractionChannelParticipantPage: + """ + Retrieve a single page of InteractionChannelParticipantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InteractionChannelParticipantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InteractionChannelParticipantPage( + self._version, response, self._solution + ) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InteractionChannelParticipantPage: + """ + Asynchronously retrieve a single page of InteractionChannelParticipantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InteractionChannelParticipantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InteractionChannelParticipantPage( + self._version, response, self._solution + ) + + def get_page(self, target_url: str) -> InteractionChannelParticipantPage: + """ + Retrieve a specific page of InteractionChannelParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InteractionChannelParticipantInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InteractionChannelParticipantPage( + self._version, response, self._solution + ) + + async def get_page_async( + self, target_url: str + ) -> InteractionChannelParticipantPage: + """ + Asynchronously retrieve a specific page of InteractionChannelParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InteractionChannelParticipantInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InteractionChannelParticipantPage( + self._version, response, self._solution + ) + + def get(self, sid: str) -> InteractionChannelParticipantContext: + """ + Constructs a InteractionChannelParticipantContext + + :param sid: The unique string created by Twilio to identify an Interaction Channel resource. + """ + return InteractionChannelParticipantContext( + self._version, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> InteractionChannelParticipantContext: + """ + Constructs a InteractionChannelParticipantContext + + :param sid: The unique string created by Twilio to identify an Interaction Channel resource. + """ + return InteractionChannelParticipantContext( + self._version, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_transfer.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_transfer.py new file mode 100644 index 00000000..04a5afac --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/interaction/interaction_channel/interaction_transfer.py @@ -0,0 +1,423 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class InteractionTransferInstance(InstanceResource): + + class TransferStatus(object): + ACTIVE = "active" + FAILED = "failed" + COMPLETED = "completed" + + class TransferType(object): + WARM = "warm" + COLD = "cold" + EXTERNAL = "external" + + """ + :ivar sid: The unique string created by Twilio to identify an Interaction Transfer resource. + :ivar instance_sid: The SID of the Instance associated with the Transfer. + :ivar account_sid: The SID of the Account that created the Transfer. + :ivar interaction_sid: The Interaction Sid for this channel. + :ivar channel_sid: The Channel Sid for this Transfer. + :ivar execution_sid: The Execution SID associated with the Transfer. + :ivar type: + :ivar status: + :ivar _from: The SID of the Participant initiating the Transfer. + :ivar to: The SID of the Participant receiving the Transfer. + :ivar note_sid: The SID of the Note associated with the Transfer. + :ivar summary_sid: The SID of the Summary associated with the Transfer. + :ivar date_created: The date and time when the Transfer was created. + :ivar date_updated: The date and time when the Transfer was last updated. + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + interaction_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.instance_sid: Optional[str] = payload.get("instance_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.interaction_sid: Optional[str] = payload.get("interaction_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.execution_sid: Optional[str] = payload.get("execution_sid") + self.type: Optional["InteractionTransferInstance.TransferType"] = payload.get( + "type" + ) + self.status: Optional["InteractionTransferInstance.TransferStatus"] = ( + payload.get("status") + ) + self._from: Optional[str] = payload.get("from") + self.to: Optional[str] = payload.get("to") + self.note_sid: Optional[str] = payload.get("note_sid") + self.summary_sid: Optional[str] = payload.get("summary_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "interaction_sid": interaction_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[InteractionTransferContext] = None + + @property + def _proxy(self) -> "InteractionTransferContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InteractionTransferContext for this InteractionTransferInstance + """ + if self._context is None: + self._context = InteractionTransferContext( + self._version, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "InteractionTransferInstance": + """ + Fetch the InteractionTransferInstance + + + :returns: The fetched InteractionTransferInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InteractionTransferInstance": + """ + Asynchronous coroutine to fetch the InteractionTransferInstance + + + :returns: The fetched InteractionTransferInstance + """ + return await self._proxy.fetch_async() + + def update( + self, body: Union[object, object] = values.unset + ) -> "InteractionTransferInstance": + """ + Update the InteractionTransferInstance + + :param body: + + :returns: The updated InteractionTransferInstance + """ + return self._proxy.update( + body=body, + ) + + async def update_async( + self, body: Union[object, object] = values.unset + ) -> "InteractionTransferInstance": + """ + Asynchronous coroutine to update the InteractionTransferInstance + + :param body: + + :returns: The updated InteractionTransferInstance + """ + return await self._proxy.update_async( + body=body, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InteractionTransferContext(InstanceContext): + + def __init__( + self, version: Version, interaction_sid: str, channel_sid: str, sid: str + ): + """ + Initialize the InteractionTransferContext + + :param version: Version that contains the resource + :param interaction_sid: The Interaction Sid for this channel. + :param channel_sid: The Channel Sid for this Transfer. + :param sid: The unique string created by Twilio to identify a Transfer resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "interaction_sid": interaction_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = "/Interactions/{interaction_sid}/Channels/{channel_sid}/Transfers/{sid}".format( + **self._solution + ) + + def fetch(self) -> InteractionTransferInstance: + """ + Fetch the InteractionTransferInstance + + + :returns: The fetched InteractionTransferInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InteractionTransferInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InteractionTransferInstance: + """ + Asynchronous coroutine to fetch the InteractionTransferInstance + + + :returns: The fetched InteractionTransferInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InteractionTransferInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, body: Union[object, object] = values.unset + ) -> InteractionTransferInstance: + """ + Update the InteractionTransferInstance + + :param body: + + :returns: The updated InteractionTransferInstance + """ + data = body.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionTransferInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, body: Union[object, object] = values.unset + ) -> InteractionTransferInstance: + """ + Asynchronous coroutine to update the InteractionTransferInstance + + :param body: + + :returns: The updated InteractionTransferInstance + """ + data = body.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionTransferInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InteractionTransferList(ListResource): + + def __init__(self, version: Version, interaction_sid: str, channel_sid: str): + """ + Initialize the InteractionTransferList + + :param version: Version that contains the resource + :param interaction_sid: The Interaction Sid for the Interaction + :param channel_sid: The Channel Sid for the Channel. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "interaction_sid": interaction_sid, + "channel_sid": channel_sid, + } + self._uri = ( + "/Interactions/{interaction_sid}/Channels/{channel_sid}/Transfers".format( + **self._solution + ) + ) + + def create( + self, body: Union[object, object] = values.unset + ) -> InteractionTransferInstance: + """ + Create the InteractionTransferInstance + + :param body: + + :returns: The created InteractionTransferInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionTransferInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, body: Union[object, object] = values.unset + ) -> InteractionTransferInstance: + """ + Asynchronously create the InteractionTransferInstance + + :param body: + + :returns: The created InteractionTransferInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InteractionTransferInstance( + self._version, + payload, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def get(self, sid: str) -> InteractionTransferContext: + """ + Constructs a InteractionTransferContext + + :param sid: The unique string created by Twilio to identify a Transfer resource. + """ + return InteractionTransferContext( + self._version, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> InteractionTransferContext: + """ + Constructs a InteractionTransferContext + + :param sid: The unique string created by Twilio to identify a Transfer resource. + """ + return InteractionTransferContext( + self._version, + interaction_sid=self._solution["interaction_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/__init__.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/__init__.py new file mode 100644 index 00000000..2415c427 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/__init__.py @@ -0,0 +1,707 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.flex_api.v1.plugin.plugin_versions import PluginVersionsList + + +class PluginInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Flex Plugin resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Plugin resource and owns this resource. + :ivar unique_name: The name that uniquely identifies this Flex Plugin resource. + :ivar friendly_name: The friendly name this Flex Plugin resource. + :ivar description: A descriptive string that you create to describe the plugin resource. It can be up to 500 characters long + :ivar archived: Whether the Flex Plugin is archived. The default value is false. + :ivar date_created: The date and time in GMT-7 when the Flex Plugin was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT-7 when the Flex Plugin was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Flex Plugin resource. + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.unique_name: Optional[str] = payload.get("unique_name") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.description: Optional[str] = payload.get("description") + self.archived: Optional[bool] = payload.get("archived") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[PluginContext] = None + + @property + def _proxy(self) -> "PluginContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PluginContext for this PluginInstance + """ + if self._context is None: + self._context = PluginContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginInstance": + """ + Fetch the PluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginInstance + """ + return self._proxy.fetch( + flex_metadata=flex_metadata, + ) + + async def fetch_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginInstance": + """ + Asynchronous coroutine to fetch the PluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginInstance + """ + return await self._proxy.fetch_async( + flex_metadata=flex_metadata, + ) + + def update( + self, + flex_metadata: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + ) -> "PluginInstance": + """ + Update the PluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + :param friendly_name: The Flex Plugin's friendly name. + :param description: A descriptive string that you update to describe the plugin resource. It can be up to 500 characters long + + :returns: The updated PluginInstance + """ + return self._proxy.update( + flex_metadata=flex_metadata, + friendly_name=friendly_name, + description=description, + ) + + async def update_async( + self, + flex_metadata: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + ) -> "PluginInstance": + """ + Asynchronous coroutine to update the PluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + :param friendly_name: The Flex Plugin's friendly name. + :param description: A descriptive string that you update to describe the plugin resource. It can be up to 500 characters long + + :returns: The updated PluginInstance + """ + return await self._proxy.update_async( + flex_metadata=flex_metadata, + friendly_name=friendly_name, + description=description, + ) + + @property + def plugin_versions(self) -> PluginVersionsList: + """ + Access the plugin_versions + """ + return self._proxy.plugin_versions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the PluginContext + + :param version: Version that contains the resource + :param sid: The SID of the Flex Plugin resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/PluginService/Plugins/{sid}".format(**self._solution) + + self._plugin_versions: Optional[PluginVersionsList] = None + + def fetch(self, flex_metadata: Union[str, object] = values.unset) -> PluginInstance: + """ + Fetch the PluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginInstance + """ + + data = values.of( + { + "Flex-Metadata": flex_metadata, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PluginInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginInstance: + """ + Asynchronous coroutine to fetch the PluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginInstance + """ + + data = values.of( + { + "Flex-Metadata": flex_metadata, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PluginInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + flex_metadata: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + ) -> PluginInstance: + """ + Update the PluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + :param friendly_name: The Flex Plugin's friendly name. + :param description: A descriptive string that you update to describe the plugin resource. It can be up to 500 characters long + + :returns: The updated PluginInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Description": description, + } + ) + headers = values.of({}) + + if not ( + flex_metadata is values.unset + or (isinstance(flex_metadata, str) and not flex_metadata) + ): + headers["Flex-Metadata"] = flex_metadata + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + flex_metadata: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + ) -> PluginInstance: + """ + Asynchronous coroutine to update the PluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + :param friendly_name: The Flex Plugin's friendly name. + :param description: A descriptive string that you update to describe the plugin resource. It can be up to 500 characters long + + :returns: The updated PluginInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Description": description, + } + ) + headers = values.of({}) + + if not ( + flex_metadata is values.unset + or (isinstance(flex_metadata, str) and not flex_metadata) + ): + headers["Flex-Metadata"] = flex_metadata + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def plugin_versions(self) -> PluginVersionsList: + """ + Access the plugin_versions + """ + if self._plugin_versions is None: + self._plugin_versions = PluginVersionsList( + self._version, + self._solution["sid"], + ) + return self._plugin_versions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> PluginInstance: + """ + Build an instance of PluginInstance + + :param payload: Payload response from the API + """ + return PluginInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class PluginList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PluginList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/PluginService/Plugins" + + def create( + self, + unique_name: str, + flex_metadata: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + ) -> PluginInstance: + """ + Create the PluginInstance + + :param unique_name: The Flex Plugin's unique name. + :param flex_metadata: The Flex-Metadata HTTP request header + :param friendly_name: The Flex Plugin's friendly name. + :param description: A descriptive string that you create to describe the plugin resource. It can be up to 500 characters long + + :returns: The created PluginInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "FriendlyName": friendly_name, + "Description": description, + } + ) + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginInstance(self._version, payload) + + async def create_async( + self, + unique_name: str, + flex_metadata: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + ) -> PluginInstance: + """ + Asynchronously create the PluginInstance + + :param unique_name: The Flex Plugin's unique name. + :param flex_metadata: The Flex-Metadata HTTP request header + :param friendly_name: The Flex Plugin's friendly name. + :param description: A descriptive string that you create to describe the plugin resource. It can be up to 500 characters long + + :returns: The created PluginInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "FriendlyName": friendly_name, + "Description": description, + } + ) + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginInstance(self._version, payload) + + def stream( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[PluginInstance]: + """ + Streams PluginInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(flex_metadata=flex_metadata, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[PluginInstance]: + """ + Asynchronously streams PluginInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + flex_metadata=flex_metadata, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PluginInstance]: + """ + Lists PluginInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + flex_metadata=flex_metadata, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PluginInstance]: + """ + Asynchronously lists PluginInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + flex_metadata=flex_metadata, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + flex_metadata: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PluginPage: + """ + Retrieve a single page of PluginInstance records from the API. + Request is executed immediately + + :param flex_metadata: The Flex-Metadata HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PluginInstance + """ + data = values.of( + { + "Flex-Metadata": flex_metadata, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PluginPage(self._version, response) + + async def page_async( + self, + flex_metadata: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PluginPage: + """ + Asynchronously retrieve a single page of PluginInstance records from the API. + Request is executed immediately + + :param flex_metadata: The Flex-Metadata HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PluginInstance + """ + data = values.of( + { + "Flex-Metadata": flex_metadata, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PluginPage(self._version, response) + + def get_page(self, target_url: str) -> PluginPage: + """ + Retrieve a specific page of PluginInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PluginInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return PluginPage(self._version, response) + + async def get_page_async(self, target_url: str) -> PluginPage: + """ + Asynchronously retrieve a specific page of PluginInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PluginInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return PluginPage(self._version, response) + + def get(self, sid: str) -> PluginContext: + """ + Constructs a PluginContext + + :param sid: The SID of the Flex Plugin resource to update. + """ + return PluginContext(self._version, sid=sid) + + def __call__(self, sid: str) -> PluginContext: + """ + Constructs a PluginContext + + :param sid: The SID of the Flex Plugin resource to update. + """ + return PluginContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f54ec24d9128f5b4f8a9449fd9d9fa75d73fe5e GIT binary patch literal 27977 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 BCfxu4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/__pycache__/plugin_versions.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/__pycache__/plugin_versions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65ceaf0bf942be517c773bcbe3396a2cc77f0543 GIT binary patch literal 25965 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/plugin_versions.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/plugin_versions.py new file mode 100644 index 00000000..4d66ef57 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin/plugin_versions.py @@ -0,0 +1,612 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class PluginVersionsInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Flex Plugin Version resource. + :ivar plugin_sid: The SID of the Flex Plugin resource this Flex Plugin Version belongs to. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Plugin Version resource and owns this resource. + :ivar version: The unique version of this Flex Plugin Version. + :ivar plugin_url: The URL of where the Flex Plugin Version JavaScript bundle is hosted on. + :ivar changelog: A changelog that describes the changes this Flex Plugin Version brings. + :ivar private: Whether the Flex Plugin Version is validated. The default value is false. + :ivar archived: Whether the Flex Plugin Version is archived. The default value is false. + :ivar validated: + :ivar date_created: The date and time in GMT when the Flex Plugin Version was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Flex Plugin Version resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + plugin_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.plugin_sid: Optional[str] = payload.get("plugin_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.version: Optional[str] = payload.get("version") + self.plugin_url: Optional[str] = payload.get("plugin_url") + self.changelog: Optional[str] = payload.get("changelog") + self.private: Optional[bool] = payload.get("private") + self.archived: Optional[bool] = payload.get("archived") + self.validated: Optional[bool] = payload.get("validated") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "plugin_sid": plugin_sid, + "sid": sid or self.sid, + } + self._context: Optional[PluginVersionsContext] = None + + @property + def _proxy(self) -> "PluginVersionsContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PluginVersionsContext for this PluginVersionsInstance + """ + if self._context is None: + self._context = PluginVersionsContext( + self._version, + plugin_sid=self._solution["plugin_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginVersionsInstance": + """ + Fetch the PluginVersionsInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginVersionsInstance + """ + return self._proxy.fetch( + flex_metadata=flex_metadata, + ) + + async def fetch_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginVersionsInstance": + """ + Asynchronous coroutine to fetch the PluginVersionsInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginVersionsInstance + """ + return await self._proxy.fetch_async( + flex_metadata=flex_metadata, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginVersionsContext(InstanceContext): + + def __init__(self, version: Version, plugin_sid: str, sid: str): + """ + Initialize the PluginVersionsContext + + :param version: Version that contains the resource + :param plugin_sid: The SID of the Flex Plugin the resource to belongs to. + :param sid: The SID of the Flex Plugin Version resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "plugin_sid": plugin_sid, + "sid": sid, + } + self._uri = "/PluginService/Plugins/{plugin_sid}/Versions/{sid}".format( + **self._solution + ) + + def fetch( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginVersionsInstance: + """ + Fetch the PluginVersionsInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginVersionsInstance + """ + + data = values.of( + { + "Flex-Metadata": flex_metadata, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PluginVersionsInstance( + self._version, + payload, + plugin_sid=self._solution["plugin_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginVersionsInstance: + """ + Asynchronous coroutine to fetch the PluginVersionsInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginVersionsInstance + """ + + data = values.of( + { + "Flex-Metadata": flex_metadata, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PluginVersionsInstance( + self._version, + payload, + plugin_sid=self._solution["plugin_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginVersionsPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> PluginVersionsInstance: + """ + Build an instance of PluginVersionsInstance + + :param payload: Payload response from the API + """ + return PluginVersionsInstance( + self._version, payload, plugin_sid=self._solution["plugin_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class PluginVersionsList(ListResource): + + def __init__(self, version: Version, plugin_sid: str): + """ + Initialize the PluginVersionsList + + :param version: Version that contains the resource + :param plugin_sid: The SID of the Flex Plugin the resource to belongs to. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "plugin_sid": plugin_sid, + } + self._uri = "/PluginService/Plugins/{plugin_sid}/Versions".format( + **self._solution + ) + + def create( + self, + version: str, + plugin_url: str, + flex_metadata: Union[str, object] = values.unset, + changelog: Union[str, object] = values.unset, + private: Union[bool, object] = values.unset, + cli_version: Union[str, object] = values.unset, + validate_status: Union[str, object] = values.unset, + ) -> PluginVersionsInstance: + """ + Create the PluginVersionsInstance + + :param version: The Flex Plugin Version's version. + :param plugin_url: The URL of the Flex Plugin Version bundle + :param flex_metadata: The Flex-Metadata HTTP request header + :param changelog: The changelog of the Flex Plugin Version. + :param private: Whether this Flex Plugin Version requires authorization. + :param cli_version: The version of Flex Plugins CLI used to create this plugin + :param validate_status: The validation status of the plugin, indicating whether it has been validated + + :returns: The created PluginVersionsInstance + """ + + data = values.of( + { + "Version": version, + "PluginUrl": plugin_url, + "Changelog": changelog, + "Private": serialize.boolean_to_string(private), + "CliVersion": cli_version, + "ValidateStatus": validate_status, + } + ) + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginVersionsInstance( + self._version, payload, plugin_sid=self._solution["plugin_sid"] + ) + + async def create_async( + self, + version: str, + plugin_url: str, + flex_metadata: Union[str, object] = values.unset, + changelog: Union[str, object] = values.unset, + private: Union[bool, object] = values.unset, + cli_version: Union[str, object] = values.unset, + validate_status: Union[str, object] = values.unset, + ) -> PluginVersionsInstance: + """ + Asynchronously create the PluginVersionsInstance + + :param version: The Flex Plugin Version's version. + :param plugin_url: The URL of the Flex Plugin Version bundle + :param flex_metadata: The Flex-Metadata HTTP request header + :param changelog: The changelog of the Flex Plugin Version. + :param private: Whether this Flex Plugin Version requires authorization. + :param cli_version: The version of Flex Plugins CLI used to create this plugin + :param validate_status: The validation status of the plugin, indicating whether it has been validated + + :returns: The created PluginVersionsInstance + """ + + data = values.of( + { + "Version": version, + "PluginUrl": plugin_url, + "Changelog": changelog, + "Private": serialize.boolean_to_string(private), + "CliVersion": cli_version, + "ValidateStatus": validate_status, + } + ) + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginVersionsInstance( + self._version, payload, plugin_sid=self._solution["plugin_sid"] + ) + + def stream( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[PluginVersionsInstance]: + """ + Streams PluginVersionsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(flex_metadata=flex_metadata, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[PluginVersionsInstance]: + """ + Asynchronously streams PluginVersionsInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + flex_metadata=flex_metadata, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PluginVersionsInstance]: + """ + Lists PluginVersionsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + flex_metadata=flex_metadata, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PluginVersionsInstance]: + """ + Asynchronously lists PluginVersionsInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + flex_metadata=flex_metadata, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + flex_metadata: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PluginVersionsPage: + """ + Retrieve a single page of PluginVersionsInstance records from the API. + Request is executed immediately + + :param flex_metadata: The Flex-Metadata HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PluginVersionsInstance + """ + data = values.of( + { + "Flex-Metadata": flex_metadata, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PluginVersionsPage(self._version, response, self._solution) + + async def page_async( + self, + flex_metadata: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PluginVersionsPage: + """ + Asynchronously retrieve a single page of PluginVersionsInstance records from the API. + Request is executed immediately + + :param flex_metadata: The Flex-Metadata HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PluginVersionsInstance + """ + data = values.of( + { + "Flex-Metadata": flex_metadata, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PluginVersionsPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> PluginVersionsPage: + """ + Retrieve a specific page of PluginVersionsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PluginVersionsInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return PluginVersionsPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> PluginVersionsPage: + """ + Asynchronously retrieve a specific page of PluginVersionsInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PluginVersionsInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return PluginVersionsPage(self._version, response, self._solution) + + def get(self, sid: str) -> PluginVersionsContext: + """ + Constructs a PluginVersionsContext + + :param sid: The SID of the Flex Plugin Version resource to fetch. + """ + return PluginVersionsContext( + self._version, plugin_sid=self._solution["plugin_sid"], sid=sid + ) + + def __call__(self, sid: str) -> PluginVersionsContext: + """ + Constructs a PluginVersionsContext + + :param sid: The SID of the Flex Plugin Version resource to fetch. + """ + return PluginVersionsContext( + self._version, plugin_sid=self._solution["plugin_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_archive.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_archive.py new file mode 100644 index 00000000..e7f526a9 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_archive.py @@ -0,0 +1,230 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PluginArchiveInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Flex Plugin resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Plugin resource and owns this resource. + :ivar unique_name: The name that uniquely identifies this Flex Plugin resource. + :ivar friendly_name: The friendly name this Flex Plugin resource. + :ivar description: A descriptive string that you create to describe the plugin resource. It can be up to 500 characters long + :ivar archived: Whether the Flex Plugin is archived. The default value is false. + :ivar date_created: The date and time in GMT when the Flex Plugin was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Flex Plugin was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Flex Plugin resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.unique_name: Optional[str] = payload.get("unique_name") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.description: Optional[str] = payload.get("description") + self.archived: Optional[bool] = payload.get("archived") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[PluginArchiveContext] = None + + @property + def _proxy(self) -> "PluginArchiveContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PluginArchiveContext for this PluginArchiveInstance + """ + if self._context is None: + self._context = PluginArchiveContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def update( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginArchiveInstance": + """ + Update the PluginArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginArchiveInstance + """ + return self._proxy.update( + flex_metadata=flex_metadata, + ) + + async def update_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginArchiveInstance": + """ + Asynchronous coroutine to update the PluginArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginArchiveInstance + """ + return await self._proxy.update_async( + flex_metadata=flex_metadata, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginArchiveContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the PluginArchiveContext + + :param version: Version that contains the resource + :param sid: The SID of the Flex Plugin resource to archive. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/PluginService/Plugins/{sid}/Archive".format(**self._solution) + + def update( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginArchiveInstance: + """ + Update the PluginArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginArchiveInstance + """ + + data = values.of({}) + headers = values.of({}) + + if not ( + flex_metadata is values.unset + or (isinstance(flex_metadata, str) and not flex_metadata) + ): + headers["Flex-Metadata"] = flex_metadata + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginArchiveInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginArchiveInstance: + """ + Asynchronous coroutine to update the PluginArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginArchiveInstance + """ + + data = values.of({}) + headers = values.of({}) + + if not ( + flex_metadata is values.unset + or (isinstance(flex_metadata, str) and not flex_metadata) + ): + headers["Flex-Metadata"] = flex_metadata + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginArchiveInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginArchiveList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PluginArchiveList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, sid: str) -> PluginArchiveContext: + """ + Constructs a PluginArchiveContext + + :param sid: The SID of the Flex Plugin resource to archive. + """ + return PluginArchiveContext(self._version, sid=sid) + + def __call__(self, sid: str) -> PluginArchiveContext: + """ + Constructs a PluginArchiveContext + + :param sid: The SID of the Flex Plugin resource to archive. + """ + return PluginArchiveContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration/__init__.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration/__init__.py new file mode 100644 index 00000000..b17d697e --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration/__init__.py @@ -0,0 +1,583 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.flex_api.v1.plugin_configuration.configured_plugin import ( + ConfiguredPluginList, +) + + +class PluginConfigurationInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Flex Plugin Configuration resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Plugin Configuration resource and owns this resource. + :ivar name: The name of this Flex Plugin Configuration. + :ivar description: The description of the Flex Plugin Configuration resource. + :ivar archived: Whether the Flex Plugin Configuration is archived. The default value is false. + :ivar date_created: The date and time in GMT when the Flex Plugin Configuration was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Flex Plugin Configuration resource. + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.name: Optional[str] = payload.get("name") + self.description: Optional[str] = payload.get("description") + self.archived: Optional[bool] = payload.get("archived") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[PluginConfigurationContext] = None + + @property + def _proxy(self) -> "PluginConfigurationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PluginConfigurationContext for this PluginConfigurationInstance + """ + if self._context is None: + self._context = PluginConfigurationContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginConfigurationInstance": + """ + Fetch the PluginConfigurationInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginConfigurationInstance + """ + return self._proxy.fetch( + flex_metadata=flex_metadata, + ) + + async def fetch_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginConfigurationInstance": + """ + Asynchronous coroutine to fetch the PluginConfigurationInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginConfigurationInstance + """ + return await self._proxy.fetch_async( + flex_metadata=flex_metadata, + ) + + @property + def plugins(self) -> ConfiguredPluginList: + """ + Access the plugins + """ + return self._proxy.plugins + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginConfigurationContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the PluginConfigurationContext + + :param version: Version that contains the resource + :param sid: The SID of the Flex Plugin Configuration resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/PluginService/Configurations/{sid}".format(**self._solution) + + self._plugins: Optional[ConfiguredPluginList] = None + + def fetch( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginConfigurationInstance: + """ + Fetch the PluginConfigurationInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginConfigurationInstance + """ + + data = values.of( + { + "Flex-Metadata": flex_metadata, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PluginConfigurationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginConfigurationInstance: + """ + Asynchronous coroutine to fetch the PluginConfigurationInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginConfigurationInstance + """ + + data = values.of( + { + "Flex-Metadata": flex_metadata, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PluginConfigurationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + @property + def plugins(self) -> ConfiguredPluginList: + """ + Access the plugins + """ + if self._plugins is None: + self._plugins = ConfiguredPluginList( + self._version, + self._solution["sid"], + ) + return self._plugins + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginConfigurationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> PluginConfigurationInstance: + """ + Build an instance of PluginConfigurationInstance + + :param payload: Payload response from the API + """ + return PluginConfigurationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class PluginConfigurationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PluginConfigurationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/PluginService/Configurations" + + def create( + self, + name: str, + flex_metadata: Union[str, object] = values.unset, + plugins: Union[List[object], object] = values.unset, + description: Union[str, object] = values.unset, + ) -> PluginConfigurationInstance: + """ + Create the PluginConfigurationInstance + + :param name: The Flex Plugin Configuration's name. + :param flex_metadata: The Flex-Metadata HTTP request header + :param plugins: A list of objects that describe the plugin versions included in the configuration. Each object contains the sid of the plugin version. + :param description: The Flex Plugin Configuration's description. + + :returns: The created PluginConfigurationInstance + """ + + data = values.of( + { + "Name": name, + "Plugins": serialize.map(plugins, lambda e: serialize.object(e)), + "Description": description, + } + ) + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginConfigurationInstance(self._version, payload) + + async def create_async( + self, + name: str, + flex_metadata: Union[str, object] = values.unset, + plugins: Union[List[object], object] = values.unset, + description: Union[str, object] = values.unset, + ) -> PluginConfigurationInstance: + """ + Asynchronously create the PluginConfigurationInstance + + :param name: The Flex Plugin Configuration's name. + :param flex_metadata: The Flex-Metadata HTTP request header + :param plugins: A list of objects that describe the plugin versions included in the configuration. Each object contains the sid of the plugin version. + :param description: The Flex Plugin Configuration's description. + + :returns: The created PluginConfigurationInstance + """ + + data = values.of( + { + "Name": name, + "Plugins": serialize.map(plugins, lambda e: serialize.object(e)), + "Description": description, + } + ) + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginConfigurationInstance(self._version, payload) + + def stream( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[PluginConfigurationInstance]: + """ + Streams PluginConfigurationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(flex_metadata=flex_metadata, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[PluginConfigurationInstance]: + """ + Asynchronously streams PluginConfigurationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + flex_metadata=flex_metadata, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PluginConfigurationInstance]: + """ + Lists PluginConfigurationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + flex_metadata=flex_metadata, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PluginConfigurationInstance]: + """ + Asynchronously lists PluginConfigurationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + flex_metadata=flex_metadata, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + flex_metadata: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PluginConfigurationPage: + """ + Retrieve a single page of PluginConfigurationInstance records from the API. + Request is executed immediately + + :param flex_metadata: The Flex-Metadata HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PluginConfigurationInstance + """ + data = values.of( + { + "Flex-Metadata": flex_metadata, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PluginConfigurationPage(self._version, response) + + async def page_async( + self, + flex_metadata: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PluginConfigurationPage: + """ + Asynchronously retrieve a single page of PluginConfigurationInstance records from the API. + Request is executed immediately + + :param flex_metadata: The Flex-Metadata HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PluginConfigurationInstance + """ + data = values.of( + { + "Flex-Metadata": flex_metadata, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PluginConfigurationPage(self._version, response) + + def get_page(self, target_url: str) -> PluginConfigurationPage: + """ + Retrieve a specific page of PluginConfigurationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PluginConfigurationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return PluginConfigurationPage(self._version, response) + + async def get_page_async(self, target_url: str) -> PluginConfigurationPage: + """ + Asynchronously retrieve a specific page of PluginConfigurationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PluginConfigurationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return PluginConfigurationPage(self._version, response) + + def get(self, sid: str) -> PluginConfigurationContext: + """ + Constructs a PluginConfigurationContext + + :param sid: The SID of the Flex Plugin Configuration resource to fetch. + """ + return PluginConfigurationContext(self._version, sid=sid) + + def __call__(self, sid: str) -> PluginConfigurationContext: + """ + Constructs a PluginConfigurationContext + + :param sid: The SID of the Flex Plugin Configuration resource to fetch. + """ + return PluginConfigurationContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8f3748dbfd4d14b101bcd968f5ceb1e3654bcfe GIT binary patch literal 25300 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 "ConfiguredPluginContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ConfiguredPluginContext for this ConfiguredPluginInstance + """ + if self._context is None: + self._context = ConfiguredPluginContext( + self._version, + configuration_sid=self._solution["configuration_sid"], + plugin_sid=self._solution["plugin_sid"], + ) + return self._context + + def fetch( + self, flex_metadata: Union[str, object] = values.unset + ) -> "ConfiguredPluginInstance": + """ + Fetch the ConfiguredPluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched ConfiguredPluginInstance + """ + return self._proxy.fetch( + flex_metadata=flex_metadata, + ) + + async def fetch_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> "ConfiguredPluginInstance": + """ + Asynchronous coroutine to fetch the ConfiguredPluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched ConfiguredPluginInstance + """ + return await self._proxy.fetch_async( + flex_metadata=flex_metadata, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConfiguredPluginContext(InstanceContext): + + def __init__(self, version: Version, configuration_sid: str, plugin_sid: str): + """ + Initialize the ConfiguredPluginContext + + :param version: Version that contains the resource + :param configuration_sid: The SID of the Flex Plugin Configuration the resource to belongs to. + :param plugin_sid: The unique string that we created to identify the Flex Plugin resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "configuration_sid": configuration_sid, + "plugin_sid": plugin_sid, + } + self._uri = "/PluginService/Configurations/{configuration_sid}/Plugins/{plugin_sid}".format( + **self._solution + ) + + def fetch( + self, flex_metadata: Union[str, object] = values.unset + ) -> ConfiguredPluginInstance: + """ + Fetch the ConfiguredPluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched ConfiguredPluginInstance + """ + + data = values.of( + { + "Flex-Metadata": flex_metadata, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return ConfiguredPluginInstance( + self._version, + payload, + configuration_sid=self._solution["configuration_sid"], + plugin_sid=self._solution["plugin_sid"], + ) + + async def fetch_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> ConfiguredPluginInstance: + """ + Asynchronous coroutine to fetch the ConfiguredPluginInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched ConfiguredPluginInstance + """ + + data = values.of( + { + "Flex-Metadata": flex_metadata, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return ConfiguredPluginInstance( + self._version, + payload, + configuration_sid=self._solution["configuration_sid"], + plugin_sid=self._solution["plugin_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConfiguredPluginPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ConfiguredPluginInstance: + """ + Build an instance of ConfiguredPluginInstance + + :param payload: Payload response from the API + """ + return ConfiguredPluginInstance( + self._version, + payload, + configuration_sid=self._solution["configuration_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ConfiguredPluginList(ListResource): + + def __init__(self, version: Version, configuration_sid: str): + """ + Initialize the ConfiguredPluginList + + :param version: Version that contains the resource + :param configuration_sid: The SID of the Flex Plugin Configuration the resource to belongs to. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "configuration_sid": configuration_sid, + } + self._uri = "/PluginService/Configurations/{configuration_sid}/Plugins".format( + **self._solution + ) + + def stream( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ConfiguredPluginInstance]: + """ + Streams ConfiguredPluginInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(flex_metadata=flex_metadata, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ConfiguredPluginInstance]: + """ + Asynchronously streams ConfiguredPluginInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + flex_metadata=flex_metadata, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConfiguredPluginInstance]: + """ + Lists ConfiguredPluginInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + flex_metadata=flex_metadata, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConfiguredPluginInstance]: + """ + Asynchronously lists ConfiguredPluginInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + flex_metadata=flex_metadata, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + flex_metadata: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConfiguredPluginPage: + """ + Retrieve a single page of ConfiguredPluginInstance records from the API. + Request is executed immediately + + :param flex_metadata: The Flex-Metadata HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConfiguredPluginInstance + """ + data = values.of( + { + "Flex-Metadata": flex_metadata, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConfiguredPluginPage(self._version, response, self._solution) + + async def page_async( + self, + flex_metadata: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConfiguredPluginPage: + """ + Asynchronously retrieve a single page of ConfiguredPluginInstance records from the API. + Request is executed immediately + + :param flex_metadata: The Flex-Metadata HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConfiguredPluginInstance + """ + data = values.of( + { + "Flex-Metadata": flex_metadata, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConfiguredPluginPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ConfiguredPluginPage: + """ + Retrieve a specific page of ConfiguredPluginInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConfiguredPluginInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ConfiguredPluginPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ConfiguredPluginPage: + """ + Asynchronously retrieve a specific page of ConfiguredPluginInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConfiguredPluginInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ConfiguredPluginPage(self._version, response, self._solution) + + def get(self, plugin_sid: str) -> ConfiguredPluginContext: + """ + Constructs a ConfiguredPluginContext + + :param plugin_sid: The unique string that we created to identify the Flex Plugin resource. + """ + return ConfiguredPluginContext( + self._version, + configuration_sid=self._solution["configuration_sid"], + plugin_sid=plugin_sid, + ) + + def __call__(self, plugin_sid: str) -> ConfiguredPluginContext: + """ + Constructs a ConfiguredPluginContext + + :param plugin_sid: The unique string that we created to identify the Flex Plugin resource. + """ + return ConfiguredPluginContext( + self._version, + configuration_sid=self._solution["configuration_sid"], + plugin_sid=plugin_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration_archive.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration_archive.py new file mode 100644 index 00000000..3fec0733 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_configuration_archive.py @@ -0,0 +1,234 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PluginConfigurationArchiveInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Flex Plugin Configuration resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Plugin Configuration resource and owns this resource. + :ivar name: The name of this Flex Plugin Configuration. + :ivar description: The description of the Flex Plugin Configuration resource. + :ivar archived: Whether the Flex Plugin Configuration is archived. The default value is false. + :ivar date_created: The date and time in GMT when the Flex Plugin Configuration was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Flex Plugin Configuration resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.name: Optional[str] = payload.get("name") + self.description: Optional[str] = payload.get("description") + self.archived: Optional[bool] = payload.get("archived") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[PluginConfigurationArchiveContext] = None + + @property + def _proxy(self) -> "PluginConfigurationArchiveContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PluginConfigurationArchiveContext for this PluginConfigurationArchiveInstance + """ + if self._context is None: + self._context = PluginConfigurationArchiveContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def update( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginConfigurationArchiveInstance": + """ + Update the PluginConfigurationArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginConfigurationArchiveInstance + """ + return self._proxy.update( + flex_metadata=flex_metadata, + ) + + async def update_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginConfigurationArchiveInstance": + """ + Asynchronous coroutine to update the PluginConfigurationArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginConfigurationArchiveInstance + """ + return await self._proxy.update_async( + flex_metadata=flex_metadata, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class PluginConfigurationArchiveContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the PluginConfigurationArchiveContext + + :param version: Version that contains the resource + :param sid: The SID of the Flex Plugin Configuration resource to archive. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/PluginService/Configurations/{sid}/Archive".format( + **self._solution + ) + + def update( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginConfigurationArchiveInstance: + """ + Update the PluginConfigurationArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginConfigurationArchiveInstance + """ + + data = values.of({}) + headers = values.of({}) + + if not ( + flex_metadata is values.unset + or (isinstance(flex_metadata, str) and not flex_metadata) + ): + headers["Flex-Metadata"] = flex_metadata + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginConfigurationArchiveInstance( + self._version, payload, sid=self._solution["sid"] + ) + + async def update_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginConfigurationArchiveInstance: + """ + Asynchronous coroutine to update the PluginConfigurationArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginConfigurationArchiveInstance + """ + + data = values.of({}) + headers = values.of({}) + + if not ( + flex_metadata is values.unset + or (isinstance(flex_metadata, str) and not flex_metadata) + ): + headers["Flex-Metadata"] = flex_metadata + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginConfigurationArchiveInstance( + self._version, payload, sid=self._solution["sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class PluginConfigurationArchiveList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PluginConfigurationArchiveList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, sid: str) -> PluginConfigurationArchiveContext: + """ + Constructs a PluginConfigurationArchiveContext + + :param sid: The SID of the Flex Plugin Configuration resource to archive. + """ + return PluginConfigurationArchiveContext(self._version, sid=sid) + + def __call__(self, sid: str) -> PluginConfigurationArchiveContext: + """ + Constructs a PluginConfigurationArchiveContext + + :param sid: The SID of the Flex Plugin Configuration resource to archive. + """ + return PluginConfigurationArchiveContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_release.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_release.py new file mode 100644 index 00000000..0694b05f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_release.py @@ -0,0 +1,537 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class PluginReleaseInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Plugin Release resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Plugin Release resource and owns this resource. + :ivar configuration_sid: The SID of the Plugin Configuration resource to release. + :ivar date_created: The date and time in GMT when the Flex Plugin Release was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Plugin Release resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.configuration_sid: Optional[str] = payload.get("configuration_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[PluginReleaseContext] = None + + @property + def _proxy(self) -> "PluginReleaseContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PluginReleaseContext for this PluginReleaseInstance + """ + if self._context is None: + self._context = PluginReleaseContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginReleaseInstance": + """ + Fetch the PluginReleaseInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginReleaseInstance + """ + return self._proxy.fetch( + flex_metadata=flex_metadata, + ) + + async def fetch_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginReleaseInstance": + """ + Asynchronous coroutine to fetch the PluginReleaseInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginReleaseInstance + """ + return await self._proxy.fetch_async( + flex_metadata=flex_metadata, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginReleaseContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the PluginReleaseContext + + :param version: Version that contains the resource + :param sid: The SID of the Flex Plugin Release resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/PluginService/Releases/{sid}".format(**self._solution) + + def fetch( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginReleaseInstance: + """ + Fetch the PluginReleaseInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginReleaseInstance + """ + + data = values.of( + { + "Flex-Metadata": flex_metadata, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PluginReleaseInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginReleaseInstance: + """ + Asynchronous coroutine to fetch the PluginReleaseInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The fetched PluginReleaseInstance + """ + + data = values.of( + { + "Flex-Metadata": flex_metadata, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PluginReleaseInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginReleasePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> PluginReleaseInstance: + """ + Build an instance of PluginReleaseInstance + + :param payload: Payload response from the API + """ + return PluginReleaseInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class PluginReleaseList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PluginReleaseList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/PluginService/Releases" + + def create( + self, configuration_id: str, flex_metadata: Union[str, object] = values.unset + ) -> PluginReleaseInstance: + """ + Create the PluginReleaseInstance + + :param configuration_id: The SID or the Version of the Flex Plugin Configuration to release. + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The created PluginReleaseInstance + """ + + data = values.of( + { + "ConfigurationId": configuration_id, + } + ) + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginReleaseInstance(self._version, payload) + + async def create_async( + self, configuration_id: str, flex_metadata: Union[str, object] = values.unset + ) -> PluginReleaseInstance: + """ + Asynchronously create the PluginReleaseInstance + + :param configuration_id: The SID or the Version of the Flex Plugin Configuration to release. + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The created PluginReleaseInstance + """ + + data = values.of( + { + "ConfigurationId": configuration_id, + } + ) + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginReleaseInstance(self._version, payload) + + def stream( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[PluginReleaseInstance]: + """ + Streams PluginReleaseInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(flex_metadata=flex_metadata, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[PluginReleaseInstance]: + """ + Asynchronously streams PluginReleaseInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + flex_metadata=flex_metadata, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PluginReleaseInstance]: + """ + Lists PluginReleaseInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + flex_metadata=flex_metadata, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + flex_metadata: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PluginReleaseInstance]: + """ + Asynchronously lists PluginReleaseInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str flex_metadata: The Flex-Metadata HTTP request header + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + flex_metadata=flex_metadata, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + flex_metadata: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PluginReleasePage: + """ + Retrieve a single page of PluginReleaseInstance records from the API. + Request is executed immediately + + :param flex_metadata: The Flex-Metadata HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PluginReleaseInstance + """ + data = values.of( + { + "Flex-Metadata": flex_metadata, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PluginReleasePage(self._version, response) + + async def page_async( + self, + flex_metadata: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PluginReleasePage: + """ + Asynchronously retrieve a single page of PluginReleaseInstance records from the API. + Request is executed immediately + + :param flex_metadata: The Flex-Metadata HTTP request header + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PluginReleaseInstance + """ + data = values.of( + { + "Flex-Metadata": flex_metadata, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of( + { + "Flex-Metadata": flex_metadata, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PluginReleasePage(self._version, response) + + def get_page(self, target_url: str) -> PluginReleasePage: + """ + Retrieve a specific page of PluginReleaseInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PluginReleaseInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return PluginReleasePage(self._version, response) + + async def get_page_async(self, target_url: str) -> PluginReleasePage: + """ + Asynchronously retrieve a specific page of PluginReleaseInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PluginReleaseInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return PluginReleasePage(self._version, response) + + def get(self, sid: str) -> PluginReleaseContext: + """ + Constructs a PluginReleaseContext + + :param sid: The SID of the Flex Plugin Release resource to fetch. + """ + return PluginReleaseContext(self._version, sid=sid) + + def __call__(self, sid: str) -> PluginReleaseContext: + """ + Constructs a PluginReleaseContext + + :param sid: The SID of the Flex Plugin Release resource to fetch. + """ + return PluginReleaseContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_version_archive.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_version_archive.py new file mode 100644 index 00000000..be169d4d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/plugin_version_archive.py @@ -0,0 +1,256 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PluginVersionArchiveInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Flex Plugin Version resource. + :ivar plugin_sid: The SID of the Flex Plugin resource this Flex Plugin Version belongs to. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Flex Plugin Version resource and owns this resource. + :ivar version: The unique version of this Flex Plugin Version. + :ivar plugin_url: The URL of where the Flex Plugin Version JavaScript bundle is hosted on. + :ivar changelog: A changelog that describes the changes this Flex Plugin Version brings. + :ivar private: Whether to inject credentials while accessing this Plugin Version. The default value is false. + :ivar archived: Whether the Flex Plugin Version is archived. The default value is false. + :ivar date_created: The date and time in GMT when the Flex Plugin Version was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Flex Plugin Version resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + plugin_sid: Optional[str] = None, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.plugin_sid: Optional[str] = payload.get("plugin_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.version: Optional[str] = payload.get("version") + self.plugin_url: Optional[str] = payload.get("plugin_url") + self.changelog: Optional[str] = payload.get("changelog") + self.private: Optional[bool] = payload.get("private") + self.archived: Optional[bool] = payload.get("archived") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "plugin_sid": plugin_sid or self.plugin_sid, + "sid": sid or self.sid, + } + self._context: Optional[PluginVersionArchiveContext] = None + + @property + def _proxy(self) -> "PluginVersionArchiveContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PluginVersionArchiveContext for this PluginVersionArchiveInstance + """ + if self._context is None: + self._context = PluginVersionArchiveContext( + self._version, + plugin_sid=self._solution["plugin_sid"], + sid=self._solution["sid"], + ) + return self._context + + def update( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginVersionArchiveInstance": + """ + Update the PluginVersionArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginVersionArchiveInstance + """ + return self._proxy.update( + flex_metadata=flex_metadata, + ) + + async def update_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> "PluginVersionArchiveInstance": + """ + Asynchronous coroutine to update the PluginVersionArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginVersionArchiveInstance + """ + return await self._proxy.update_async( + flex_metadata=flex_metadata, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginVersionArchiveContext(InstanceContext): + + def __init__(self, version: Version, plugin_sid: str, sid: str): + """ + Initialize the PluginVersionArchiveContext + + :param version: Version that contains the resource + :param plugin_sid: The SID of the Flex Plugin the resource to belongs to. + :param sid: The SID of the Flex Plugin Version resource to archive. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "plugin_sid": plugin_sid, + "sid": sid, + } + self._uri = "/PluginService/Plugins/{plugin_sid}/Versions/{sid}/Archive".format( + **self._solution + ) + + def update( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginVersionArchiveInstance: + """ + Update the PluginVersionArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginVersionArchiveInstance + """ + + data = values.of({}) + headers = values.of({}) + + if not ( + flex_metadata is values.unset + or (isinstance(flex_metadata, str) and not flex_metadata) + ): + headers["Flex-Metadata"] = flex_metadata + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginVersionArchiveInstance( + self._version, + payload, + plugin_sid=self._solution["plugin_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, flex_metadata: Union[str, object] = values.unset + ) -> PluginVersionArchiveInstance: + """ + Asynchronous coroutine to update the PluginVersionArchiveInstance + + :param flex_metadata: The Flex-Metadata HTTP request header + + :returns: The updated PluginVersionArchiveInstance + """ + + data = values.of({}) + headers = values.of({}) + + if not ( + flex_metadata is values.unset + or (isinstance(flex_metadata, str) and not flex_metadata) + ): + headers["Flex-Metadata"] = flex_metadata + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PluginVersionArchiveInstance( + self._version, + payload, + plugin_sid=self._solution["plugin_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PluginVersionArchiveList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PluginVersionArchiveList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, plugin_sid: str, sid: str) -> PluginVersionArchiveContext: + """ + Constructs a PluginVersionArchiveContext + + :param plugin_sid: The SID of the Flex Plugin the resource to belongs to. + :param sid: The SID of the Flex Plugin Version resource to archive. + """ + return PluginVersionArchiveContext( + self._version, plugin_sid=plugin_sid, sid=sid + ) + + def __call__(self, plugin_sid: str, sid: str) -> PluginVersionArchiveContext: + """ + Constructs a PluginVersionArchiveContext + + :param plugin_sid: The SID of the Flex Plugin the resource to belongs to. + :param sid: The SID of the Flex Plugin Version resource to archive. + """ + return PluginVersionArchiveContext( + self._version, plugin_sid=plugin_sid, sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/provisioning_status.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/provisioning_status.py new file mode 100644 index 00000000..2a7bc5b4 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/provisioning_status.py @@ -0,0 +1,181 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ProvisioningStatusInstance(InstanceResource): + + class Status(object): + ACTIVE = "active" + IN_PROGRESS = "in-progress" + NOT_CONFIGURED = "not-configured" + FAILED = "failed" + + """ + :ivar status: + :ivar url: The absolute URL of the resource. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.status: Optional["ProvisioningStatusInstance.Status"] = payload.get( + "status" + ) + self.url: Optional[str] = payload.get("url") + + self._context: Optional[ProvisioningStatusContext] = None + + @property + def _proxy(self) -> "ProvisioningStatusContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ProvisioningStatusContext for this ProvisioningStatusInstance + """ + if self._context is None: + self._context = ProvisioningStatusContext( + self._version, + ) + return self._context + + def fetch(self) -> "ProvisioningStatusInstance": + """ + Fetch the ProvisioningStatusInstance + + + :returns: The fetched ProvisioningStatusInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ProvisioningStatusInstance": + """ + Asynchronous coroutine to fetch the ProvisioningStatusInstance + + + :returns: The fetched ProvisioningStatusInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ProvisioningStatusContext(InstanceContext): + + def __init__(self, version: Version): + """ + Initialize the ProvisioningStatusContext + + :param version: Version that contains the resource + """ + super().__init__(version) + + self._uri = "/account/provision/status" + + def fetch(self) -> ProvisioningStatusInstance: + """ + Fetch the ProvisioningStatusInstance + + + :returns: The fetched ProvisioningStatusInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ProvisioningStatusInstance( + self._version, + payload, + ) + + async def fetch_async(self) -> ProvisioningStatusInstance: + """ + Asynchronous coroutine to fetch the ProvisioningStatusInstance + + + :returns: The fetched ProvisioningStatusInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ProvisioningStatusInstance( + self._version, + payload, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ProvisioningStatusList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ProvisioningStatusList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self) -> ProvisioningStatusContext: + """ + Constructs a ProvisioningStatusContext + + """ + return ProvisioningStatusContext(self._version) + + def __call__(self) -> ProvisioningStatusContext: + """ + Constructs a ProvisioningStatusContext + + """ + return ProvisioningStatusContext(self._version) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v1/web_channel.py b/venv/Lib/site-packages/twilio/rest/flex_api/v1/web_channel.py new file mode 100644 index 00000000..46e44fce --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v1/web_channel.py @@ -0,0 +1,651 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class WebChannelInstance(InstanceResource): + + class ChatStatus(object): + INACTIVE = "inactive" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the WebChannel resource and owns this Workflow. + :ivar flex_flow_sid: The SID of the Flex Flow. + :ivar sid: The unique string that we created to identify the WebChannel resource. + :ivar url: The absolute URL of the WebChannel resource. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.flex_flow_sid: Optional[str] = payload.get("flex_flow_sid") + self.sid: Optional[str] = payload.get("sid") + self.url: Optional[str] = payload.get("url") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[WebChannelContext] = None + + @property + def _proxy(self) -> "WebChannelContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: WebChannelContext for this WebChannelInstance + """ + if self._context is None: + self._context = WebChannelContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the WebChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the WebChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "WebChannelInstance": + """ + Fetch the WebChannelInstance + + + :returns: The fetched WebChannelInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "WebChannelInstance": + """ + Asynchronous coroutine to fetch the WebChannelInstance + + + :returns: The fetched WebChannelInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + chat_status: Union["WebChannelInstance.ChatStatus", object] = values.unset, + post_engagement_data: Union[str, object] = values.unset, + ) -> "WebChannelInstance": + """ + Update the WebChannelInstance + + :param chat_status: + :param post_engagement_data: The post-engagement data. + + :returns: The updated WebChannelInstance + """ + return self._proxy.update( + chat_status=chat_status, + post_engagement_data=post_engagement_data, + ) + + async def update_async( + self, + chat_status: Union["WebChannelInstance.ChatStatus", object] = values.unset, + post_engagement_data: Union[str, object] = values.unset, + ) -> "WebChannelInstance": + """ + Asynchronous coroutine to update the WebChannelInstance + + :param chat_status: + :param post_engagement_data: The post-engagement data. + + :returns: The updated WebChannelInstance + """ + return await self._proxy.update_async( + chat_status=chat_status, + post_engagement_data=post_engagement_data, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebChannelContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the WebChannelContext + + :param version: Version that contains the resource + :param sid: The SID of the WebChannel resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/WebChannels/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the WebChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the WebChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> WebChannelInstance: + """ + Fetch the WebChannelInstance + + + :returns: The fetched WebChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return WebChannelInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> WebChannelInstance: + """ + Asynchronous coroutine to fetch the WebChannelInstance + + + :returns: The fetched WebChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return WebChannelInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + chat_status: Union["WebChannelInstance.ChatStatus", object] = values.unset, + post_engagement_data: Union[str, object] = values.unset, + ) -> WebChannelInstance: + """ + Update the WebChannelInstance + + :param chat_status: + :param post_engagement_data: The post-engagement data. + + :returns: The updated WebChannelInstance + """ + + data = values.of( + { + "ChatStatus": chat_status, + "PostEngagementData": post_engagement_data, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebChannelInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + chat_status: Union["WebChannelInstance.ChatStatus", object] = values.unset, + post_engagement_data: Union[str, object] = values.unset, + ) -> WebChannelInstance: + """ + Asynchronous coroutine to update the WebChannelInstance + + :param chat_status: + :param post_engagement_data: The post-engagement data. + + :returns: The updated WebChannelInstance + """ + + data = values.of( + { + "ChatStatus": chat_status, + "PostEngagementData": post_engagement_data, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebChannelInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> WebChannelInstance: + """ + Build an instance of WebChannelInstance + + :param payload: Payload response from the API + """ + return WebChannelInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class WebChannelList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the WebChannelList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/WebChannels" + + def create( + self, + flex_flow_sid: str, + identity: str, + customer_friendly_name: str, + chat_friendly_name: str, + chat_unique_name: Union[str, object] = values.unset, + pre_engagement_data: Union[str, object] = values.unset, + ) -> WebChannelInstance: + """ + Create the WebChannelInstance + + :param flex_flow_sid: The SID of the Flex Flow. + :param identity: The chat identity. + :param customer_friendly_name: The chat participant's friendly name. + :param chat_friendly_name: The chat channel's friendly name. + :param chat_unique_name: The chat channel's unique name. + :param pre_engagement_data: The pre-engagement data. + + :returns: The created WebChannelInstance + """ + + data = values.of( + { + "FlexFlowSid": flex_flow_sid, + "Identity": identity, + "CustomerFriendlyName": customer_friendly_name, + "ChatFriendlyName": chat_friendly_name, + "ChatUniqueName": chat_unique_name, + "PreEngagementData": pre_engagement_data, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebChannelInstance(self._version, payload) + + async def create_async( + self, + flex_flow_sid: str, + identity: str, + customer_friendly_name: str, + chat_friendly_name: str, + chat_unique_name: Union[str, object] = values.unset, + pre_engagement_data: Union[str, object] = values.unset, + ) -> WebChannelInstance: + """ + Asynchronously create the WebChannelInstance + + :param flex_flow_sid: The SID of the Flex Flow. + :param identity: The chat identity. + :param customer_friendly_name: The chat participant's friendly name. + :param chat_friendly_name: The chat channel's friendly name. + :param chat_unique_name: The chat channel's unique name. + :param pre_engagement_data: The pre-engagement data. + + :returns: The created WebChannelInstance + """ + + data = values.of( + { + "FlexFlowSid": flex_flow_sid, + "Identity": identity, + "CustomerFriendlyName": customer_friendly_name, + "ChatFriendlyName": chat_friendly_name, + "ChatUniqueName": chat_unique_name, + "PreEngagementData": pre_engagement_data, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebChannelInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[WebChannelInstance]: + """ + Streams WebChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[WebChannelInstance]: + """ + Asynchronously streams WebChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[WebChannelInstance]: + """ + Lists WebChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[WebChannelInstance]: + """ + Asynchronously lists WebChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> WebChannelPage: + """ + Retrieve a single page of WebChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of WebChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return WebChannelPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> WebChannelPage: + """ + Asynchronously retrieve a single page of WebChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of WebChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return WebChannelPage(self._version, response) + + def get_page(self, target_url: str) -> WebChannelPage: + """ + Retrieve a specific page of WebChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of WebChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return WebChannelPage(self._version, response) + + async def get_page_async(self, target_url: str) -> WebChannelPage: + """ + Asynchronously retrieve a specific page of WebChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of WebChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return WebChannelPage(self._version, response) + + def get(self, sid: str) -> WebChannelContext: + """ + Constructs a WebChannelContext + + :param sid: The SID of the WebChannel resource to update. + """ + return WebChannelContext(self._version, sid=sid) + + def __call__(self, sid: str) -> WebChannelContext: + """ + Constructs a WebChannelContext + + :param sid: The SID of the WebChannel resource to update. + """ + return WebChannelContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v2/__init__.py b/venv/Lib/site-packages/twilio/rest/flex_api/v2/__init__.py new file mode 100644 index 00000000..e05ffcdf --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v2/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.flex_api.v2.flex_user import FlexUserList +from twilio.rest.flex_api.v2.web_channels import WebChannelsList + + +class V2(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V2 version of FlexApi + + :param domain: The Twilio.flex_api domain + """ + super().__init__(domain, "v2") + self._flex_user: Optional[FlexUserList] = None + self._web_channels: Optional[WebChannelsList] = None + + @property + def flex_user(self) -> FlexUserList: + if self._flex_user is None: + self._flex_user = FlexUserList(self) + return self._flex_user + + @property + def web_channels(self) -> WebChannelsList: + if self._web_channels is None: + self._web_channels = WebChannelsList(self) + return self._web_channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v2/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7783895d34e31694c7a475831948da60b87dd0b5 GIT binary patch literal 2418 zcmcf?OK%%Rcy_(E*N@btiP{29n52YaQ0>Y>6|zDfG;I|qNohlnjM1?1j_ajs?=rh~ zYs*q|h=e1x>Io%Bj#RnuKe(i{sMV^GkT@W2fwZFPiEn1su2EHSV|V?{_nevU>7PbM zk_et#KYvyGD2C8)oajH%5ZNsOvW`qtLZ)J>wo+G1s>1Pz9jR+2P2idxt;b3+fk*9l zT`%bZkJ*WOvXoSiiq0c5zKTqpYMT+ccPZ6QWRu443PMQ?&tlE;aK$kxzGis%3T;qk z_|(M9Z7wE+;O8%Aa2DZ)VwK>}Qv{Dl)vkq=JKBlJSi_28RA$6nCG;F(_Oa8$V zpH%{V!SyYtVc3Ajmnidq05mr1)D4ScY3|!+9%UCS&j&j5IbA+eGa3zQdz@8~6(nI; zPH49b^tVu~6qOVxSk+W$q^kB%6$*DXUD9aOjL=wBHMLc3Gu)vR7hD~<(IIXEG?T!K zt!kxI4_#ME>B}e^57ebX5HrO!E9%fCG{E^ic0UC0owAPnfpAUjqFc~TUBy&3LmOxg z;F7@(g6jK$+G;k^u|!09fy^~5-!g2gLq$-R3b-XhhMlS?g43=g^UJl1uEC5tmUraI zreQJUst{8GnG0ou{R6dCn9piK)N8tw1v()XoJdHJB*LT#c?d?xHM&eHVGgp9K=Y_w zWqg1H2|`4s3GuiO7_U70;!Ls3^XHX6o|{`N&r7+}Qv9*nR!2hlS%k?PliT`!hZ57yY$eP(wkCQNPI=6_`DPhu@w5b}s=~M_u&w zK=d40+3Ry1@pREEBzpxGkMDrlD8L{w2zMt9-VLZJ zuE)U&`ZblgeRA#OR%+_e#5+H{cW>fYZ}#TG!_4UI8*4YV^a(ZwYX7HK>;N1He(i;Y z#W@hk81gDTTsWN!I5y098%(?-0EBN3QsZ}1<6EieN0Y~X9J@Dpyf=G4Jpt}L$V}eN zOm69uFFFXeGHtvE*HK%^svSBg?u*Q6S@4%);3~6d!?fF&Q5VV!YS7?AXrNh?CE*qE zCq|`aHRyj@bVg_7oXwqs)`Bj~Efr4Oc`*XeQT$9o!lIQ#4zBC*h^?TVB-%SIJj;&o z{%aU@D*BJq9kXe3JWa?qFh!+=@qcI027&G}7|6_Ti=tw$a)C(0>wpCj&u46cV6Xgxu&?2MtlFc}K?%oq&0Tx+O-L~MdLU#2%)k1}{77~^oNyfW|3XZnmx x#tHT=ki5V}-R?vbMfp=rE83GoNIA5Pj%=gpZB*Pwryj?~mFeDrCkPg?(Lc~eUC{sl literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v2/__pycache__/flex_user.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v2/__pycache__/flex_user.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42e37bcb269e731d26caca3b91c508dd40d31af5 GIT binary patch literal 13833 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v2/__pycache__/web_channels.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/flex_api/v2/__pycache__/web_channels.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66e4a616173839da00b14144a41fa3d42871bd5e GIT binary patch literal 7294 zcmeHMZ)_aJ6`#HTcRo8N4#5E@nP7->BzH$m6Nm!=$4O`eI8ow&bTwMmyL0wBd%MT% zo}F_J36-cd60{(-BuGe@PY|UQ$tU>A=YGKr64t6nk*ccgr(WbBkX2QEZ)Wd&{uBNd zRjL@rJ9E*)n!FLYVn^|nWKA(>)zSpV!EUN5X01_LYyJQm3-Aj~WR0pKM--9Zl(kXd$egO?F&7LX z+4<(UYE5*OO@nqYxEvB2qqtCf770!`+8CEooJ0OL+K;B>HcgwB>Ch}aYO%ADgBu6G z-UOrN%9v&9bVN2fdF0dx9XxR?C%X<;Af4peJpGaD!fsy(Jph$e>}YC9ffhUp1mbTLUuvn!fqRdcC-pgCkBet6KX z`jNw??)i!1WzTeM&GMtCZOCL4KQ^UV73M;&^O)^=nys^w%ylYUXTVE8X}VrZIsP=` zE_BqTsYx0O3X6vz^DD4$MhXg8dB{)-VI#yMMwmrejKzzgEzqJEnI%QVh@4Ls5(e;# zAtQD^Qb^8{vq~X#ie%z`*E4KvXhO4XX1NWiv^N^2J77*}9BkK~0%0^ld38Xo~pVy6F|(1OX|?TDDJg8`oytgBcq3zd&YCh zqf?Hlvq3n?-slvwr$(PN$3|V#W7)E%pV7vdJ1R{t4<_a1ivTz(TH92AewvM`dT<_c z znS!mP8ZB~@*@jhJK7ZnrN?63E19EV8fIg+^6Q<2>*#%o;n(2F3qHGRZwTd(Ybh?z~{<6SKJSWuAIG^`y7k)bUeEMV(%9OK0;_Q zf)1UV2`v`Wq6ho35~NwU7!r^i0!WUq=p;_RDt&)$5#2!Ch_D2Uv!rwd0ROF}*osno zMJd5j#k7$;A1$xYKZT%YA2(c{#4<4rjuABS`)!(GfMBk`@>IoC8@^~GAf~4_ut=O>f3se3 zJ*UL@Dt;Hl2`aP40fkF|&#Iw$8pp}?MsNdpg3ute^Ce`!jWw}xvZ(`XCR0tRg=>*o z)KK1vG~Ce(v9IY9GD1f9t)}~WA#Q|faAqEcA&n^HVwkIuNyL{`X%eMdm5eyFO{`)< zu@k#Wg{UO9!Q1bMzF(ELt_T6tin>N5 zm7~v0Fq>*C!cV*oG~zZ83Ik2_QgjUbIyk~Tf}=xJjtqMGWmqG0A$a;r^ z8J8W~z+m;1S25t;any3Asn{V-r`gzqp!eEiBu4>F;87Eb=yR7nI66eBv>!a;Mm1?RWoNZg z*l*sb{Wqo z;#qJl6?V~#zwpk~Fx?g;ZXRE3jpyg?rkSH zJJN*J!yv`d4y{~ll+RTs&fUmnnOG11gx3OE!&DtKPM*| zz&^hQ0^V&G>D>IA>dV#Z+cFFH>|5A%aN*vEZX~1a9gE?3XKFTbvy*gfxsZ81bA8*c z1v+#i8pf(BgP&8+R^rZMo>Z zU466qp7-H1^)Tt`TO=Xud^15hd*^=o?j!F!a;5LuhJlY01Hz}Sae6O-oQs>l-915+ z|0Bou5;2nJz?Z!dx)A0irLzX#D6OfAo*v^+oDO|F|}+|6%+izaJoy??ti?3A!o%5R&~!5bgN^ zAj5(8;g2C_5Qv|a2%&0-8_WKO4?*R6UgZezSG;4icojLwIQD!C$lt}~=?8Ex-92x& zzuEq2cmI5M|7!QLVdPsUf6nRPCm@&)L(P}_I`N|VmL@-;P63Bs-9Z zHy*sc%19zwu_2J>y~x1(q91d{CYkQZ#~h3TI4VuN0P%Y;cQ26ESD!v)BEj&&-461? zt4}?WjMBOI=LA0W9&+FP@Aq8lS@_9=AM{-9S=f8vgVC#_3;hp$u;=QY8|}NJ2d>}V zU5~=I9wWEkd9nB6)WzNNn|9XY$V!l{chB|CP0j6|@5$AZ$V!nNJLmNG_RXD{r~UOd zWTnZr-nj?fi_IOF- "FlexUserContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: FlexUserContext for this FlexUserInstance + """ + if self._context is None: + self._context = FlexUserContext( + self._version, + instance_sid=self._solution["instance_sid"], + flex_user_sid=self._solution["flex_user_sid"], + ) + return self._context + + def fetch(self) -> "FlexUserInstance": + """ + Fetch the FlexUserInstance + + + :returns: The fetched FlexUserInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "FlexUserInstance": + """ + Asynchronous coroutine to fetch the FlexUserInstance + + + :returns: The fetched FlexUserInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + email: Union[str, object] = values.unset, + user_sid: Union[str, object] = values.unset, + locale: Union[str, object] = values.unset, + ) -> "FlexUserInstance": + """ + Update the FlexUserInstance + + :param email: Email of the User. + :param user_sid: The unique SID identifier of the Twilio Unified User. + :param locale: The locale preference of the user. + + :returns: The updated FlexUserInstance + """ + return self._proxy.update( + email=email, + user_sid=user_sid, + locale=locale, + ) + + async def update_async( + self, + email: Union[str, object] = values.unset, + user_sid: Union[str, object] = values.unset, + locale: Union[str, object] = values.unset, + ) -> "FlexUserInstance": + """ + Asynchronous coroutine to update the FlexUserInstance + + :param email: Email of the User. + :param user_sid: The unique SID identifier of the Twilio Unified User. + :param locale: The locale preference of the user. + + :returns: The updated FlexUserInstance + """ + return await self._proxy.update_async( + email=email, + user_sid=user_sid, + locale=locale, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class FlexUserContext(InstanceContext): + + def __init__(self, version: Version, instance_sid: str, flex_user_sid: str): + """ + Initialize the FlexUserContext + + :param version: Version that contains the resource + :param instance_sid: The unique ID created by Twilio to identify a Flex instance. + :param flex_user_sid: The unique id for the flex user. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "instance_sid": instance_sid, + "flex_user_sid": flex_user_sid, + } + self._uri = "/Instances/{instance_sid}/Users/{flex_user_sid}".format( + **self._solution + ) + + def fetch(self) -> FlexUserInstance: + """ + Fetch the FlexUserInstance + + + :returns: The fetched FlexUserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return FlexUserInstance( + self._version, + payload, + instance_sid=self._solution["instance_sid"], + flex_user_sid=self._solution["flex_user_sid"], + ) + + async def fetch_async(self) -> FlexUserInstance: + """ + Asynchronous coroutine to fetch the FlexUserInstance + + + :returns: The fetched FlexUserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return FlexUserInstance( + self._version, + payload, + instance_sid=self._solution["instance_sid"], + flex_user_sid=self._solution["flex_user_sid"], + ) + + def update( + self, + email: Union[str, object] = values.unset, + user_sid: Union[str, object] = values.unset, + locale: Union[str, object] = values.unset, + ) -> FlexUserInstance: + """ + Update the FlexUserInstance + + :param email: Email of the User. + :param user_sid: The unique SID identifier of the Twilio Unified User. + :param locale: The locale preference of the user. + + :returns: The updated FlexUserInstance + """ + + data = values.of( + { + "Email": email, + "UserSid": user_sid, + "Locale": locale, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return FlexUserInstance( + self._version, + payload, + instance_sid=self._solution["instance_sid"], + flex_user_sid=self._solution["flex_user_sid"], + ) + + async def update_async( + self, + email: Union[str, object] = values.unset, + user_sid: Union[str, object] = values.unset, + locale: Union[str, object] = values.unset, + ) -> FlexUserInstance: + """ + Asynchronous coroutine to update the FlexUserInstance + + :param email: Email of the User. + :param user_sid: The unique SID identifier of the Twilio Unified User. + :param locale: The locale preference of the user. + + :returns: The updated FlexUserInstance + """ + + data = values.of( + { + "Email": email, + "UserSid": user_sid, + "Locale": locale, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return FlexUserInstance( + self._version, + payload, + instance_sid=self._solution["instance_sid"], + flex_user_sid=self._solution["flex_user_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class FlexUserList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the FlexUserList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, instance_sid: str, flex_user_sid: str) -> FlexUserContext: + """ + Constructs a FlexUserContext + + :param instance_sid: The unique ID created by Twilio to identify a Flex instance. + :param flex_user_sid: The unique id for the flex user. + """ + return FlexUserContext( + self._version, instance_sid=instance_sid, flex_user_sid=flex_user_sid + ) + + def __call__(self, instance_sid: str, flex_user_sid: str) -> FlexUserContext: + """ + Constructs a FlexUserContext + + :param instance_sid: The unique ID created by Twilio to identify a Flex instance. + :param flex_user_sid: The unique id for the flex user. + """ + return FlexUserContext( + self._version, instance_sid=instance_sid, flex_user_sid=flex_user_sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/flex_api/v2/web_channels.py b/venv/Lib/site-packages/twilio/rest/flex_api/v2/web_channels.py new file mode 100644 index 00000000..8e5aff82 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/flex_api/v2/web_channels.py @@ -0,0 +1,154 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Flex + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class WebChannelsInstance(InstanceResource): + """ + :ivar conversation_sid: The unique string representing the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource) created. + :ivar identity: The unique string representing the User created and should be authorized to participate in the Conversation. For more details, see [User Identity & Access Tokens](https://www.twilio.com/docs/conversations/identity). + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.conversation_sid: Optional[str] = payload.get("conversation_sid") + self.identity: Optional[str] = payload.get("identity") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class WebChannelsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the WebChannelsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/WebChats" + + def create( + self, + address_sid: str, + ui_version: Union[str, object] = values.unset, + chat_friendly_name: Union[str, object] = values.unset, + customer_friendly_name: Union[str, object] = values.unset, + pre_engagement_data: Union[str, object] = values.unset, + ) -> WebChannelsInstance: + """ + Create the WebChannelsInstance + + :param address_sid: The SID of the Conversations Address. See [Address Configuration Resource](https://www.twilio.com/docs/conversations/api/address-configuration-resource) for configuration details. When a conversation is created on the Flex backend, the callback URL will be set to the corresponding Studio Flow SID or webhook URL in your address configuration. + :param ui_version: The Ui-Version HTTP request header + :param chat_friendly_name: The Conversation's friendly name. See the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource) for an example. + :param customer_friendly_name: The Conversation participant's friendly name. See the [Conversation Participant Resource](https://www.twilio.com/docs/conversations/api/conversation-participant-resource) for an example. + :param pre_engagement_data: The pre-engagement data. + + :returns: The created WebChannelsInstance + """ + + data = values.of( + { + "AddressSid": address_sid, + "ChatFriendlyName": chat_friendly_name, + "CustomerFriendlyName": customer_friendly_name, + "PreEngagementData": pre_engagement_data, + } + ) + headers = values.of( + { + "Ui-Version": ui_version, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebChannelsInstance(self._version, payload) + + async def create_async( + self, + address_sid: str, + ui_version: Union[str, object] = values.unset, + chat_friendly_name: Union[str, object] = values.unset, + customer_friendly_name: Union[str, object] = values.unset, + pre_engagement_data: Union[str, object] = values.unset, + ) -> WebChannelsInstance: + """ + Asynchronously create the WebChannelsInstance + + :param address_sid: The SID of the Conversations Address. See [Address Configuration Resource](https://www.twilio.com/docs/conversations/api/address-configuration-resource) for configuration details. When a conversation is created on the Flex backend, the callback URL will be set to the corresponding Studio Flow SID or webhook URL in your address configuration. + :param ui_version: The Ui-Version HTTP request header + :param chat_friendly_name: The Conversation's friendly name. See the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource) for an example. + :param customer_friendly_name: The Conversation participant's friendly name. See the [Conversation Participant Resource](https://www.twilio.com/docs/conversations/api/conversation-participant-resource) for an example. + :param pre_engagement_data: The pre-engagement data. + + :returns: The created WebChannelsInstance + """ + + data = values.of( + { + "AddressSid": address_sid, + "ChatFriendlyName": chat_friendly_name, + "CustomerFriendlyName": customer_friendly_name, + "PreEngagementData": pre_engagement_data, + } + ) + headers = values.of( + { + "Ui-Version": ui_version, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebChannelsInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/frontline_api/FrontlineApiBase.py b/venv/Lib/site-packages/twilio/rest/frontline_api/FrontlineApiBase.py new file mode 100644 index 00000000..d9dadc16 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/frontline_api/FrontlineApiBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.frontline_api.v1 import V1 + + +class FrontlineApiBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the FrontlineApi Domain + + :returns: Domain for FrontlineApi + """ + super().__init__(twilio, "https://frontline-api.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of FrontlineApi + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/frontline_api/__init__.py b/venv/Lib/site-packages/twilio/rest/frontline_api/__init__.py new file mode 100644 index 00000000..300fafa3 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/frontline_api/__init__.py @@ -0,0 +1,15 @@ +from warnings import warn + +from twilio.rest.frontline_api.FrontlineApiBase import FrontlineApiBase +from twilio.rest.frontline_api.v1.user import UserList + + +class FrontlineApi(FrontlineApiBase): + @property + def users(self) -> UserList: + warn( + "users is deprecated. Use v1.users instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.users diff --git a/venv/Lib/site-packages/twilio/rest/frontline_api/__pycache__/FrontlineApiBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/frontline_api/__pycache__/FrontlineApiBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c873cbff58b1056569103e88e5d8c5ade6371bb GIT binary patch literal 2050 zcmahKO>Y}TbauU7ubnT`&^8fKHHDVQLa}8DK^0XMX+lc`Bo%}nETduL9mh-8yUXmx zjV&K?h(sb0wGu+fm1C8k!lfV%W!0V#2X2P6qUwqFX4j6Z6fw5nym{YWGyZ98EJtAN z|MFGiH;s_r@z7uC1UX&-mM<>Q~!0;{x(-~LCQB?Say4r9oaM+B(dt)ha&7%L%`7>UWHzFF3l zy0K&;2Hs+eC=2fJ_$31LSM8gn6kWvMzI-(Yc2`!{KAcbLPa#06!=PBpfjJ)GpbFvF<9Ca+K)6zyg&GEVR`^s>86K zaxJ@dXq%4R;j%!(5kU2@5ZI%5%?loG3OATfIJE8wI;=5}>!YU2tfORkW zZ7~Y&I@6~({aDWeJD36Re49KSCE4-4%+JQu;kkzw7k@RD9$mb=tL+=dz$cL&m#qd5 z!eC)CvWcGoazMJ|>jCQo+0KV3BUhIkCHm0JKJh>FV3?H7`-5hjwCy%j4aPj6tupoM zuWnsI6=Psu=l~ulVjQ*rJyVef7^$stXYy24TICBU_a=aC(#w(2{JkrCS00YM@%a4o z;id1lc9*{U=+VUFy{)~i-3jp;h`m$|ILFn%**+j`rJ#2BApTpzYuWICnzSz9K3Yzj z3hqN2q1Pr}+kxasrk|R%2Hd0n)##kPx+bq!aX6=I4~TdjLK#jRrWCz0_R67%S+l5< z0U(QzpOu*wMsUJiv&mt?bBr}TYtun|l(BE%9f~;u|Bd9(MTRfnK@(wH_CVmIMX4YZ zVhXXb!PW1`Bd^$aQ_|`uJHW|D$v{J}L8OAKH22tx_+qc~ffs+}XNiOs{UK&e27Xo`2 zjU)`bY%;ZIW{6U(_g@9Pe#KTf&QwNz9@JykIBzeEt8u-qiA!+AK@1S-r4&W^OU)|U cvvWk5`GZ`3LM}WZ?>yC~mD&4{Cv4Knzk87w7ytkO literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/frontline_api/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/frontline_api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..034958956dc60b9377520f536d367fad7c1e2888 GIT binary patch literal 940 zcmZ`%y-yTD6o0c{w_Xl{X#B>UQZ0!~XpAw21SJw8q3|Onn>FitGvL79?m9Df=MhOP zXebPJB>o2m{}UTxMK)5Y1>NaML*>lv-T{SEy!V@VpTGC!>(EdcwqfiP z{+`*^9V4rp%$-?`hz5&mlHTAbYASE{u@u`N1~!a@*7w5NmjMX`?_kB~TaNXLb&UJy z2{^{$+C)Q=;Z@43n52x!^FoNdm- zmhXIAiudr-uIyFre6L*JyLjoaWSl8?$}n<%tF_tMTHjpXwXb!h8!S3jW(PqW)=3a# z%G58&Zu~!>Sa05Quf+>8 s;<)W2`(Dm>nq83wwYpyK9UURG50`(z+& UserList: + if self._users is None: + self._users = UserList(self) + return self._users + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/frontline_api/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/frontline_api/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cdf664157bf66049f43725d6a0ae3449c0c3ec8 GIT binary patch literal 2028 zcmahKO=}xRbau5`t>n)-t>Y%4Oxh+z2Coo=9F!1h>Li$?c1TP}?QUmR zN~GxEgP}Imq?cktFS!Q)lwQ)(Ls%Lp^i=3Utz#N;D19@tl5I-qXnFJIeSgj9`?0YC zg0=JG{l?!KLcj9EU}aO}U$tM*Su^~uj&HNdby@i zH58<~v3)Z~d+yRKT!S8g7K`z@hk|72$R2Q)b1~!D}7PCWPRl zA181U;fi9H;9tj7>X-<(!_^28UV9k#hCd+l1AHJNIfQVEIC8*U_G&^GY?S>Fp2(TZ-m^yAOg0Y2@rscOR&+C|l-+1?nN@6UBu^af7 z2Y7CkvIq`<>I*^Baye#v7EyNFjbdBQi-hU$po1H5{tCvCqN)NTsX7YH)YUCihtb>| zt!gyuWT;+O9c@$FPc2k)Kr?`r-PEf2E%ZpK7Ve>b42`#qrfoIrgZ2|>L@F@!l&J0UQZbWcqgF^+Vi4kjZ$c8Cw4kaH zu(XJJb(V*Gk~|@zON2x`S&TQ{-2bFftc9k@1~hpxx9Huc-J z+wNK|a$`CdTJ{5Lokq1-3|)!QC@!4{vD7Y?24R?ChmC=!?#OD{91u?fAvz1-^#*!1 zit^*zxgU&~z3HcK|72WzF>7vVJ0l0cMv2a7++w~BFUN54z(uF-0XKuRI@l@8>h`KfUywxwY{1trrugo;==u{Mz)ub?l1wxvE)ABezO30V+ zGDr^Ne>Gw<5+h{r$gsF0>dmHskz}Hnv3EH(mQJiqJ&%y0!X|+#Li<>BgBjcq2O{Rn zfV|#BeJz(Q?X?dPZ2c*ukN4F~_Ut#0{zR}HWCnzOA)B4u``|AGn+RSQS}GQj93f6% z^J^4$Lf2nse43I|a^}r7E23t4qZ#j9GIg9I@32TQIiE84H92{c&9${*^eq8*+?%DI>5qnGHyOLX~_KCR4dojydc2`m2q Di|h>L literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/frontline_api/v1/__pycache__/user.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/frontline_api/v1/__pycache__/user.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66abf7c7f7f6d7521159d2fea51ebff0e09aff36 GIT binary patch literal 12710 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 KB?mV;;{O4QNjZQ3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/frontline_api/v1/user.py b/venv/Lib/site-packages/twilio/rest/frontline_api/v1/user.py new file mode 100644 index 00000000..a45ed2ff --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/frontline_api/v1/user.py @@ -0,0 +1,326 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Frontline + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class UserInstance(InstanceResource): + + class StateType(object): + ACTIVE = "active" + DEACTIVATED = "deactivated" + + """ + :ivar sid: The unique string that we created to identify the User resource. + :ivar identity: The application-defined string that uniquely identifies the resource's User. This value is often a username or an email address, and is case-sensitive. + :ivar friendly_name: The string that you assigned to describe the User. + :ivar avatar: The avatar URL which will be shown in Frontline application. + :ivar state: + :ivar is_available: Whether the User is available for new conversations. Defaults to `false` for new users. + :ivar url: An absolute API resource URL for this user. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.identity: Optional[str] = payload.get("identity") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.avatar: Optional[str] = payload.get("avatar") + self.state: Optional["UserInstance.StateType"] = payload.get("state") + self.is_available: Optional[bool] = payload.get("is_available") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[UserContext] = None + + @property + def _proxy(self) -> "UserContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserContext for this UserInstance + """ + if self._context is None: + self._context = UserContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "UserInstance": + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserInstance": + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + avatar: Union[str, object] = values.unset, + state: Union["UserInstance.StateType", object] = values.unset, + is_available: Union[bool, object] = values.unset, + ) -> "UserInstance": + """ + Update the UserInstance + + :param friendly_name: The string that you assigned to describe the User. + :param avatar: The avatar URL which will be shown in Frontline application. + :param state: + :param is_available: Whether the User is available for new conversations. Set to `false` to prevent User from receiving new inbound conversations if you are using [Pool Routing](https://www.twilio.com/docs/frontline/handle-incoming-conversations#3-pool-routing). + + :returns: The updated UserInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + avatar=avatar, + state=state, + is_available=is_available, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + avatar: Union[str, object] = values.unset, + state: Union["UserInstance.StateType", object] = values.unset, + is_available: Union[bool, object] = values.unset, + ) -> "UserInstance": + """ + Asynchronous coroutine to update the UserInstance + + :param friendly_name: The string that you assigned to describe the User. + :param avatar: The avatar URL which will be shown in Frontline application. + :param state: + :param is_available: Whether the User is available for new conversations. Set to `false` to prevent User from receiving new inbound conversations if you are using [Pool Routing](https://www.twilio.com/docs/frontline/handle-incoming-conversations#3-pool-routing). + + :returns: The updated UserInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + avatar=avatar, + state=state, + is_available=is_available, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the UserContext + + :param version: Version that contains the resource + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Users/{sid}".format(**self._solution) + + def fetch(self) -> UserInstance: + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> UserInstance: + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + avatar: Union[str, object] = values.unset, + state: Union["UserInstance.StateType", object] = values.unset, + is_available: Union[bool, object] = values.unset, + ) -> UserInstance: + """ + Update the UserInstance + + :param friendly_name: The string that you assigned to describe the User. + :param avatar: The avatar URL which will be shown in Frontline application. + :param state: + :param is_available: Whether the User is available for new conversations. Set to `false` to prevent User from receiving new inbound conversations if you are using [Pool Routing](https://www.twilio.com/docs/frontline/handle-incoming-conversations#3-pool-routing). + + :returns: The updated UserInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Avatar": avatar, + "State": state, + "IsAvailable": serialize.boolean_to_string(is_available), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + avatar: Union[str, object] = values.unset, + state: Union["UserInstance.StateType", object] = values.unset, + is_available: Union[bool, object] = values.unset, + ) -> UserInstance: + """ + Asynchronous coroutine to update the UserInstance + + :param friendly_name: The string that you assigned to describe the User. + :param avatar: The avatar URL which will be shown in Frontline application. + :param state: + :param is_available: Whether the User is available for new conversations. Set to `false` to prevent User from receiving new inbound conversations if you are using [Pool Routing](https://www.twilio.com/docs/frontline/handle-incoming-conversations#3-pool-routing). + + :returns: The updated UserInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Avatar": avatar, + "State": state, + "IsAvailable": serialize.boolean_to_string(is_available), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the UserList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + return UserContext(self._version, sid=sid) + + def __call__(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: The SID of the User resource to update. This value can be either the `sid` or the `identity` of the User resource to update. + """ + return UserContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/iam/IamBase.py b/venv/Lib/site-packages/twilio/rest/iam/IamBase.py new file mode 100644 index 00000000..2882ec14 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/iam/IamBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.iam.v1 import V1 + + +class IamBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Iam Domain + + :returns: Domain for Iam + """ + super().__init__(twilio, "https://iam.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Iam + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/iam/__init__.py b/venv/Lib/site-packages/twilio/rest/iam/__init__.py new file mode 100644 index 00000000..994ecee6 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/iam/__init__.py @@ -0,0 +1,25 @@ +from warnings import warn + +from twilio.rest.iam.IamBase import IamBase +from twilio.rest.iam.v1.api_key import ApiKeyList +from twilio.rest.iam.v1.get_api_keys import GetApiKeysList + + +class Iam(IamBase): + @property + def api_key(self) -> ApiKeyList: + warn( + "api_key is deprecated. Use v1.api_key instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.api_key + + @property + def get_api_keys(self) -> GetApiKeysList: + warn( + "get_api_keys is deprecated. Use v1.get_api_keys instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.get_api_keys diff --git a/venv/Lib/site-packages/twilio/rest/iam/__pycache__/IamBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/iam/__pycache__/IamBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bca5507f55b1363967bf1f8256060d8adccf8d7b GIT binary patch literal 1939 zcmah~&2Jk;6rWwM*K5Z~Obcl$s%Qc&$cNgpgix`ninf7bL6fS49xS6_vpbHLu6NDs z#*Hl>a)^W@5furc?Pl6W z-B5^1ZV_AGCU%Bv2dUU!J=-&iS@Q>lkQ}9}EhnIsZ*%&<4Cp%dxG+O*)3qKb8DsSL zLqUKd228xm!@rM-Rjft(_)p#fuXKRl@kgGe1Po&hW2lrzBzSw!zzdRNtc+aZBo>#) zZrMQIjV%*1h!%T9TL_28&yirf#@H>T7$W|T?Hf7pyS%dcK{e@+X-pd;?$A>+NQT* zx^AzO`yEGCR3c-g6FRAvm>VWJ5ng@!l93*!Dryyk$4?VS*>fgpO%2o56 z&@o-7&t+dAF!Tz`#)-tMDtNddyr7zBXww%I3?~NtxpDs;vt5c)E?ItixtNO5!A6IR z$Y9KYNQ^}()~$eC3%J`9Sx7y~GA75tSb%j=y7ltz&1&PbfQz8hwe&eD@1u!8o7S zKpI>C@?wiT&y(!TPUa_Let+)q;(Nas)hCOWhT5)i2znCfaUU#r&y$4-%VFFFW{(WW zmlM@7vsDPuMy>%lNbbW>#=`%&2Ut-02=9N+;U07bP#Vx~h5F4?vnZ-!8r%vU$RkC} zz!qRYDhfa&wOi@u#y#j(7Et{LkS#LGk$mCdm7Ob(r(XZ{-1+^B-)#<;zWM0M?AeE# zJDbB<@d}uosvXX8?TE-d(o>3RpHH&ABmAxdzjh{V3V1xW+oOVaU@$N}6W`dx@)%#Y zO{?X2{C{us^H*2p!ze*1*B%k^Dr9i7On@5(W9;O>W69fSngJq9E-c8pic^SC&unu* zXpXVAZ*REB=NbD7ej;Lxz<(4HN0HGH@LMCoo@}&06h)~Z6k;B^=>*XhcU{JcikJnd z%M4uU{dV2ob8-Ehm4pU>nsE|%C?7#UJ zflVea9W57gQHC+ww;*dh>~$P(T_EbBGs%No!*^iIw=HmD(NvDR;Wu*WDOq?*7N6_qm4#vR Jh`=Vj{0)Oh={o=b literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/iam/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/iam/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36c0940beb5a6fba75304ab0f3a71e15c741515c GIT binary patch literal 1316 zcmcgr%}*0S6rcU30!a+19n@!fWJJf~U?K(5GDKWtV z2RRsy@E;h0|A`m$BH74EJ#ed5E}VR`yQS6O)lK%zo8No$K7RA&Lr+f{!T0vlvls6~ zgue1k>r)b?`4E&{WFuQ}ktgVaz;)3TJxP}$U2C0oGqifD^l@Qja-yLiIW?gL4bS*0}>SFu}=39m66m`#p575^!)>iFeQtWJcfBm}$e1FP-B!n6Z^Yf35SxnbhB`~TLr-Wz9*k?u+`&DDnd2UdL;oAY^v&xtntme2* zWt?Ej#vRKWH%-TPm}wS+I>|!ljc%Z`Rd^QwG!No6`le-$GSgo&BS%A5PE&GMx{*fN z!JXQ6ZD(_P^H3XUf*bnZ{7;rKGZTjBKQ7@ ApiKeyList: + if self._api_key is None: + self._api_key = ApiKeyList(self) + return self._api_key + + @property + def get_api_keys(self) -> GetApiKeysList: + if self._get_api_keys is None: + self._get_api_keys = GetApiKeysList(self) + return self._get_api_keys + + @property + def new_api_key(self) -> NewApiKeyList: + if self._new_api_key is None: + self._new_api_key = NewApiKeyList(self) + return self._new_api_key + + @property + def token(self) -> TokenList: + if self._token is None: + self._token = TokenList(self) + return self._token + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67c7de225dbeee19d79c84fd2b265b2a3ee3fa23 GIT binary patch literal 3117 zcmc&$%Wo4$7@xJ*_WF@HJPK*zz&I3;1+g0{R2m*CY7mNmfFRAmG95PFNwUq_>+Wux z+88N^NH`Lxy;O;h}Gwa1Dk$Ni|>znU2kKcTc z$uC`9F$CY^U+>MHQxN){3GFZBF*_D8D@a3mq)A%9kV=7kKw^B*2$tl$%z4=emBRTj z=R-!Mq~sOOhmB|{mXC2hV#G^{e1h|e(N*fscS|UMt|BeEgtQoy*Mefte6kkLB-B47 zgkl)JiCNvoMN^}ALACJ=EmKQ%sD`I%%uEQuZ~vHrsR*0MM?rRpo>zwpTZc^}gzwtG zxZ(eSnhEd&7hxfUX}HJ;+pb^=Hp|Cwo*En5x$0a&p&e1Zn7Da9e>LnW5X@dL^(wm~Z1SuZSBpRF!G|@Dq z`cfh<(~uUV;pu=TFUf1(3i$}vDxeK@Xro*k18ulN8|T^tXd@lkE?Bi2bjp&PPd3rF zQoiR7%0%73FQE_PH4WP1D`Mr%#*Rj_r34pr3RoH|48g2T%sXHnb9!TEF5;avNS*-Fjof%WV0$>D5U*#`>y43O80 z=w$*$yO$&DO7H5SCkLM^CpNNYn)0KrjZe=v<>yM@#@Wx<_~FK>TvL7=-+@`k4O`Ti zx5`CmdH%;x@SxuYW(76S*S_g3v)JSKfo-5QZ$1RyciDU19rRQh&jhS};Ae$_Je8~u zV6fQ=*g6cBC8)Z1Wfy3up*44fOH~CbS70j39vd9rGfo~rKH~*zyk~$JlMMd#yiTS-VOLVWR{t0DGfwqDvtkW{L7*t#Ad^q)ebr{T6l0GOIfL$D!hBOQ&Vcs9}p%pdmolP}w8p zdya_GwMXy`wK%Jn>3`0sCohP1I14Xzc5?XA)7^oDp2+qi#OpIcxCBSFS!OSy?HKA2 z8JO9}I%rufQRtvCLQ1AKZ!kVV$T#r93X8>hJnvktQnBE%wwxL-d~1Lic)1*99M3Cu zry>N$fOCVkV_B^9p)ZRrTcn0TNJg>_ftHup=e%iHaW<0?R{i!vAg`Cuwj2w6yjp#Q zVA$?O;qL7~Ff_2*_cwxJC)id1CSe*}Ei==gZyNMX>D9Z;l=e+&-_-wojhXs=Q~!1> z6iTli`v<|mGk~9LJk#Sw2+_$Advp(n&aT6+-aWF1S4ZvgsJOj*IPp3Vq2gD698N2svL60M zxggTvl64kD*4*tOAlpGnlKu)LB>7beNvSP#atj^bLc?2VWDA|!LfMz$Q&PHl_!WYI GFZVBUs^Mh- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/api_key.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/api_key.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8026913ddf6f02871a9886409692fde500fb9d77 GIT binary patch literal 14155 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 z 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/new_api_key.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/new_api_key.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11c56f253f699eeda0f41e82802fd50cc15d3013 GIT binary patch literal 6887 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/token.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/iam/v1/__pycache__/token.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..170cc389414b1948921f10c0fa0eaec23c04cf20 GIT binary patch literal 6994 zcmeHLU2Gf25#A$@|cxRe%VG1~5>xXy0haK>|G#o!RBD zZ6$4irf89sIJY}DyF0r(`_0V#J|2${C>Q_mz3D5P3HcK?nkCSvtW}|MnV2L?Ov&`+ zrGhW(EBLeif}E8LfowoRzCRxN#ptrn}Tsrz-eb z(=@gHhYVzC*pWX4xu@BX>JY(ku$!jwS*xmAZT$fo8}JVz;*F*uhc}Vnl+{V#h?=IQ zvDO$wu+yz^wJPr{L>qE2xEKGfHpf*}oJ0IKIw549J91`19Xow2C3>DbHE|@<*ygnC2qS7FE0Gs?@Yxu8hGaDd=`t&*v+t$luT! z60+wXvn!tbtYx^Ka;oH7MO)8%f#+?gBqT35tLMwqfm+`&+i`W(I}DW{gMm|$mB7e-rj+%YJ}R4j8lXWM%K3&tA}249oMg%u zVp+ume$HnGFUZ;O0y!^bBWFk=Cc<2 zbBgxF{H$G=$)QEtx;7Kpm zX@Xw7%Sb$>d7@sVeGp!xz2^zV3pnKxWuBtJ5m>IKdH!?MWqmLUdjLs4k^v-}fWRe| z9h%RvIC6S`cwtTB_g&K*+#j&l*VoUCXC|KqlW-=FA3HWN`7Cu_c8jIS*`j68F#r&E za+cb&lP9dHNyl<&vZNa?>*uI5>2mx^gGIP$OE08n_ojuJmMUxzMxP&?=)8}qrq(LF zbEbfN`a1ce5`QDKtPIsQf1vERwR_)KNIl|A1? z#+KF5)U{WyzPglI89lThzZqXmJbq*A;?||fmBe9a_jb20_O8J!#0xU&mYHodObvOw zaO1>%xJ)Wi!ndA_;0?xdniXd)@Nv4D17xtxd_`rn1S^H@;D{iw8bvc=a3`aFTQ{aH zn{LWm|yak)r~dcJHPNegZq7y}eHA zJ)|$qwn9A-#g4XKpkONzO)C`5avtk3O?w6KzVRlcX=c%Y888-MxFMe3aT&w?;U~#< zATQo99)srdng&WDEORBF;YzX?$|HeDhB*6xe0qW0_5}k{lSofBb@;j(kf`e_*+A3yvqmq?)5>Y1fHYSzv4^y=g+l3 z;TT}9rRS}A$^)m?tQ}ZT(wSaR8(uM^Ho_hd*Ifvj0Xr;Pgc$%OJXmV?oev81Jelyb z2SHhW@jO{8GYdF~2Li|WrNbowc8hDrv9`aZP77zB03ip(0cY>@kZ?~2(ry}AkS~Tg zNO+NROt)R`_`R@^2fTAN%k<)nszVKcI8Vl)--|H_95LQOy*x!Pn;>pb?tZ{M84!4~ z5tz~l18J5hRQMtM9V!q8v~YN)wbe~g3<;{fs=q2%1Jz(PR8>srmrB#6z83!MzNXLg zTdjcMwTS7jMoiy97~GVh7QkAS%pk(uRc2bQy8Xfof~?YRH*3{!HS+7w^~NZ#MO|DU zFZUn28ol0FCzz|EFF~VaQ{#+6`qZ|kX7Jj!i;S?T_8Dc=qj+8_24|R2=qj9#35N!@ z+4fSFeGVGJ$kgH-q-modT6U+4%$gTLZ8P|_)hUWWAtrIEICKnni&JQ>_X$AJhc&cn zSxZJ8Q}-WGjcK?5h70i}Tt-xZTYlNLUMW-Xq2N+M&76p}LG@E(ppZINDv2=k-hqYf zVLC)RR|$bRUZ@MFI4kIlq#1p}?sIVkhI7=Z(BY7OjUL=UDBK+JBwe{FI;2a!tasupgeTQBuL9WXU zE`2^ZH#e8WtSVV%dB6=g8*{y{Q)I>|+Fo!BQneC5&goNUCKhEcSfF6Hrsqe@kxkvz zz0fq(O^8_&L54Ti^A&Rt>NL}lAlwL84cmjNVK}fD6A1cGE`lAxj$cQDVY7on@O@|y zfxCx+JKxvFT`}o1*x{!@0CW$KzQLbV-l*K#{^;tqU8_4%t3xBJ>Ymk+omd~CQsiS`OZrJa|@wc4f||0d4BzS> zyqtV1`C5AK6wih|D!;F{A+0aBzbeoZ~SvoBCP+e z6Sc>jifv4@qFpRI0BhplzXb8S0kA88_!7iBeb0Xb#2E&J?5jwgMDi4puOZ1Gc^b&c z2A;BKkTV9viwW!2bhP<4qOxÚX9fme+@6{GT0*9h3{3Xs3@u=GEKkV7Ny#NUp8 zIJ9qhXy4rkIlLbbayatIhA>$V1AwkO{h;Iz#`YYJO7Ewn!(sXT^j4^U-bVzs9lFgA z-!H?*y*R`kg7-`X(vjZt{Cd7Cgcn);uTZX$)yGKRZjsgZvWIbyN0979!t-`a1B5dS zlx+vT3++M%ey;L@#i<#H*+qhmZj0d&@mbj@)*c1YnaMwfOeE;ionL@+fK0wFhXdQL zggz$lsBb69{Wnf5o>+Y(aqZyMgR8su-Z;2;aCJ0!t$MY(x@RAMxAU=UC$65jJ@9zo ziCddC*8}jZ2MN?dSX0Q*w%VC1yJ{~jZ%)+1$cm8OO_#=NgO`pk_o($KvSMWONNxPe zVD0$w;G^|8vUtv#jeFaX;3qo=L;kWpLgNX{mPn^OSqT;(E*1<_ZhRQ$Z!}lhUJupmxyx~rnJXmu3J*IlzKn=9wvnjqEX#1Nz!d!Op-qtAyR6EBtIhC|4cF;k$oSL(L2FmDSdO(&N~F2 Scb=M)q}`Wd9}|4?efS6I^Zac9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/iam/v1/api_key.py b/venv/Lib/site-packages/twilio/rest/iam/v1/api_key.py new file mode 100644 index 00000000..f07512c0 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/iam/v1/api_key.py @@ -0,0 +1,342 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Iam + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ApiKeyInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Key resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar policy: The \\`Policy\\` object is a collection that specifies the allowed Twilio permissions for the restricted key. For more information on the permissions available with restricted API keys, refer to the [Twilio documentation](https://www.twilio.com/docs/iam/api-keys/restricted-api-keys#permissions-available-with-restricted-api-keys). + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.policy: Optional[Dict[str, object]] = payload.get("policy") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ApiKeyContext] = None + + @property + def _proxy(self) -> "ApiKeyContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ApiKeyContext for this ApiKeyInstance + """ + if self._context is None: + self._context = ApiKeyContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ApiKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ApiKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ApiKeyInstance": + """ + Fetch the ApiKeyInstance + + + :returns: The fetched ApiKeyInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ApiKeyInstance": + """ + Asynchronous coroutine to fetch the ApiKeyInstance + + + :returns: The fetched ApiKeyInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + policy: Union[object, object] = values.unset, + ) -> "ApiKeyInstance": + """ + Update the ApiKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param policy: The \\\\`Policy\\\\` object is a collection that specifies the allowed Twilio permissions for the restricted key. For more information on the permissions available with restricted API keys, refer to the [Twilio documentation](https://www.twilio.com/docs/iam/api-keys/restricted-api-keys#permissions-available-with-restricted-api-keys). + + :returns: The updated ApiKeyInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + policy=policy, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + policy: Union[object, object] = values.unset, + ) -> "ApiKeyInstance": + """ + Asynchronous coroutine to update the ApiKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param policy: The \\\\`Policy\\\\` object is a collection that specifies the allowed Twilio permissions for the restricted key. For more information on the permissions available with restricted API keys, refer to the [Twilio documentation](https://www.twilio.com/docs/iam/api-keys/restricted-api-keys#permissions-available-with-restricted-api-keys). + + :returns: The updated ApiKeyInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + policy=policy, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ApiKeyContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ApiKeyContext + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the Key resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Keys/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the ApiKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ApiKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ApiKeyInstance: + """ + Fetch the ApiKeyInstance + + + :returns: The fetched ApiKeyInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ApiKeyInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ApiKeyInstance: + """ + Asynchronous coroutine to fetch the ApiKeyInstance + + + :returns: The fetched ApiKeyInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ApiKeyInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + policy: Union[object, object] = values.unset, + ) -> ApiKeyInstance: + """ + Update the ApiKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param policy: The \\\\`Policy\\\\` object is a collection that specifies the allowed Twilio permissions for the restricted key. For more information on the permissions available with restricted API keys, refer to the [Twilio documentation](https://www.twilio.com/docs/iam/api-keys/restricted-api-keys#permissions-available-with-restricted-api-keys). + + :returns: The updated ApiKeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Policy": serialize.object(policy), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ApiKeyInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + policy: Union[object, object] = values.unset, + ) -> ApiKeyInstance: + """ + Asynchronous coroutine to update the ApiKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param policy: The \\\\`Policy\\\\` object is a collection that specifies the allowed Twilio permissions for the restricted key. For more information on the permissions available with restricted API keys, refer to the [Twilio documentation](https://www.twilio.com/docs/iam/api-keys/restricted-api-keys#permissions-available-with-restricted-api-keys). + + :returns: The updated ApiKeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Policy": serialize.object(policy), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ApiKeyInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ApiKeyList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ApiKeyList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, sid: str) -> ApiKeyContext: + """ + Constructs a ApiKeyContext + + :param sid: The Twilio-provided string that uniquely identifies the Key resource to update. + """ + return ApiKeyContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ApiKeyContext: + """ + Constructs a ApiKeyContext + + :param sid: The Twilio-provided string that uniquely identifies the Key resource to update. + """ + return ApiKeyContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/iam/v1/get_api_keys.py b/venv/Lib/site-packages/twilio/rest/iam/v1/get_api_keys.py new file mode 100644 index 00000000..03b29cdb --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/iam/v1/get_api_keys.py @@ -0,0 +1,304 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Iam + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class GetApiKeysInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Key resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class GetApiKeysPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> GetApiKeysInstance: + """ + Build an instance of GetApiKeysInstance + + :param payload: Payload response from the API + """ + return GetApiKeysInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class GetApiKeysList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the GetApiKeysList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Keys" + + def stream( + self, + account_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[GetApiKeysInstance]: + """ + Streams GetApiKeysInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Payments resource. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(account_sid=account_sid, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + account_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[GetApiKeysInstance]: + """ + Asynchronously streams GetApiKeysInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Payments resource. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + account_sid=account_sid, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + account_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[GetApiKeysInstance]: + """ + Lists GetApiKeysInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Payments resource. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + account_sid=account_sid, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + account_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[GetApiKeysInstance]: + """ + Asynchronously lists GetApiKeysInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Payments resource. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + account_sid=account_sid, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + account_sid: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> GetApiKeysPage: + """ + Retrieve a single page of GetApiKeysInstance records from the API. + Request is executed immediately + + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Payments resource. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of GetApiKeysInstance + """ + data = values.of( + { + "AccountSid": account_sid, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return GetApiKeysPage(self._version, response) + + async def page_async( + self, + account_sid: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> GetApiKeysPage: + """ + Asynchronously retrieve a single page of GetApiKeysInstance records from the API. + Request is executed immediately + + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Payments resource. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of GetApiKeysInstance + """ + data = values.of( + { + "AccountSid": account_sid, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return GetApiKeysPage(self._version, response) + + def get_page(self, target_url: str) -> GetApiKeysPage: + """ + Retrieve a specific page of GetApiKeysInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of GetApiKeysInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return GetApiKeysPage(self._version, response) + + async def get_page_async(self, target_url: str) -> GetApiKeysPage: + """ + Asynchronously retrieve a specific page of GetApiKeysInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of GetApiKeysInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return GetApiKeysPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/iam/v1/new_api_key.py b/venv/Lib/site-packages/twilio/rest/iam/v1/new_api_key.py new file mode 100644 index 00000000..760ce79c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/iam/v1/new_api_key.py @@ -0,0 +1,157 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Iam + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class NewApiKeyInstance(InstanceResource): + + class Keytype(object): + RESTRICTED = "restricted" + + """ + :ivar sid: The unique string that that we created to identify the NewKey resource. You will use this as the basic-auth `user` when authenticating to the API. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT that the API Key was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the new API Key was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar secret: The secret your application uses to sign Access Tokens and to authenticate to the REST API (you will use this as the basic-auth `password`). **Note that for security reasons, this field is ONLY returned when the API Key is first created.** + :ivar policy: Collection of allow assertions. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.secret: Optional[str] = payload.get("secret") + self.policy: Optional[Dict[str, object]] = payload.get("policy") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class NewApiKeyList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the NewApiKeyList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Keys" + + def create( + self, + account_sid: str, + friendly_name: Union[str, object] = values.unset, + key_type: Union["NewApiKeyInstance.Keytype", object] = values.unset, + policy: Union[object, object] = values.unset, + ) -> NewApiKeyInstance: + """ + Create the NewApiKeyInstance + + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Payments resource. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param key_type: + :param policy: The \\\\`Policy\\\\` object is a collection that specifies the allowed Twilio permissions for the restricted key. For more information on the permissions available with restricted API keys, refer to the [Twilio documentation](https://www.twilio.com/docs/iam/api-keys/restricted-api-keys#permissions-available-with-restricted-api-keys). + + :returns: The created NewApiKeyInstance + """ + + data = values.of( + { + "AccountSid": account_sid, + "FriendlyName": friendly_name, + "KeyType": key_type, + "Policy": serialize.object(policy), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return NewApiKeyInstance(self._version, payload) + + async def create_async( + self, + account_sid: str, + friendly_name: Union[str, object] = values.unset, + key_type: Union["NewApiKeyInstance.Keytype", object] = values.unset, + policy: Union[object, object] = values.unset, + ) -> NewApiKeyInstance: + """ + Asynchronously create the NewApiKeyInstance + + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Payments resource. + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param key_type: + :param policy: The \\\\`Policy\\\\` object is a collection that specifies the allowed Twilio permissions for the restricted key. For more information on the permissions available with restricted API keys, refer to the [Twilio documentation](https://www.twilio.com/docs/iam/api-keys/restricted-api-keys#permissions-available-with-restricted-api-keys). + + :returns: The created NewApiKeyInstance + """ + + data = values.of( + { + "AccountSid": account_sid, + "FriendlyName": friendly_name, + "KeyType": key_type, + "Policy": serialize.object(policy), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return NewApiKeyInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/iam/v1/token.py b/venv/Lib/site-packages/twilio/rest/iam/v1/token.py new file mode 100644 index 00000000..50d3d119 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/iam/v1/token.py @@ -0,0 +1,170 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Iam + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class TokenInstance(InstanceResource): + """ + :ivar access_token: Token which carries the necessary information to access a Twilio resource directly. + :ivar refresh_token: Token which carries the information necessary to get a new access token. + :ivar id_token: Token which carries the information necessary of user profile. + :ivar token_type: Token type + :ivar expires_in: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.access_token: Optional[str] = payload.get("access_token") + self.refresh_token: Optional[str] = payload.get("refresh_token") + self.id_token: Optional[str] = payload.get("id_token") + self.token_type: Optional[str] = payload.get("token_type") + self.expires_in: Optional[int] = payload.get("expires_in") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class TokenList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the TokenList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/token" + + def create( + self, + grant_type: str, + client_id: str, + client_secret: Union[str, object] = values.unset, + code: Union[str, object] = values.unset, + redirect_uri: Union[str, object] = values.unset, + audience: Union[str, object] = values.unset, + refresh_token: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + ) -> TokenInstance: + """ + Create the TokenInstance + + :param grant_type: Grant type is a credential representing resource owner's authorization which can be used by client to obtain access token. + :param client_id: A 34 character string that uniquely identifies this OAuth App. + :param client_secret: The credential for confidential OAuth App. + :param code: JWT token related to the authorization code grant type. + :param redirect_uri: The redirect uri + :param audience: The targeted audience uri + :param refresh_token: JWT token related to refresh access token. + :param scope: The scope of token + + :returns: The created TokenInstance + """ + + data = values.of( + { + "grant_type": grant_type, + "client_id": client_id, + "client_secret": client_secret, + "code": code, + "redirect_uri": redirect_uri, + "audience": audience, + "refresh_token": refresh_token, + "scope": scope, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TokenInstance(self._version, payload) + + async def create_async( + self, + grant_type: str, + client_id: str, + client_secret: Union[str, object] = values.unset, + code: Union[str, object] = values.unset, + redirect_uri: Union[str, object] = values.unset, + audience: Union[str, object] = values.unset, + refresh_token: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + ) -> TokenInstance: + """ + Asynchronously create the TokenInstance + + :param grant_type: Grant type is a credential representing resource owner's authorization which can be used by client to obtain access token. + :param client_id: A 34 character string that uniquely identifies this OAuth App. + :param client_secret: The credential for confidential OAuth App. + :param code: JWT token related to the authorization code grant type. + :param redirect_uri: The redirect uri + :param audience: The targeted audience uri + :param refresh_token: JWT token related to refresh access token. + :param scope: The scope of token + + :returns: The created TokenInstance + """ + + data = values.of( + { + "grant_type": grant_type, + "client_id": client_id, + "client_secret": client_secret, + "code": code, + "redirect_uri": redirect_uri, + "audience": audience, + "refresh_token": refresh_token, + "scope": scope, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TokenInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/InsightsBase.py b/venv/Lib/site-packages/twilio/rest/insights/InsightsBase.py new file mode 100644 index 00000000..458122ce --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/InsightsBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.insights.v1 import V1 + + +class InsightsBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Insights Domain + + :returns: Domain for Insights + """ + super().__init__(twilio, "https://insights.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Insights + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/__init__.py b/venv/Lib/site-packages/twilio/rest/insights/__init__.py new file mode 100644 index 00000000..0f145779 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/__init__.py @@ -0,0 +1,55 @@ +from warnings import warn + +from twilio.rest.insights.InsightsBase import InsightsBase +from twilio.rest.insights.v1.call import CallList +from twilio.rest.insights.v1.call_summaries import CallSummariesList +from twilio.rest.insights.v1.conference import ConferenceList +from twilio.rest.insights.v1.room import RoomList +from twilio.rest.insights.v1.setting import SettingList + + +class Insights(InsightsBase): + @property + def settings(self) -> SettingList: + warn( + "settings is deprecated. Use v1.settings instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.settings + + @property + def calls(self) -> CallList: + warn( + "calls is deprecated. Use v1.calls instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.calls + + @property + def call_summaries(self) -> CallSummariesList: + warn( + "call_summaries is deprecated. Use v1.call_summaries instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.call_summaries + + @property + def conferences(self) -> ConferenceList: + warn( + "conferences is deprecated. Use v1.conferences instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.conferences + + @property + def rooms(self) -> RoomList: + warn( + "rooms is deprecated. Use v1.rooms instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.rooms diff --git a/venv/Lib/site-packages/twilio/rest/insights/__pycache__/InsightsBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/insights/__pycache__/InsightsBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad1073789090fd11bbab08dd9cf271a86c132913 GIT binary patch literal 1999 zcmahK-*4MQ`0O~2lcsC8v9;5t=|;DqJS2d6YF2xURj+bdbnH^CVFLi-Q2*C#r z27(|FK$2Y^jvrI0ge&BepVR`YxG&!9k!MK(!GuGIV9KKaLc4DX1&I+-6If~_A=fgq zq%U<7$y5xyB^HG&xD&@O1rYwM%q+&jMe=6yRtfCRFD$-4oz}^>Imb{idnF2w6bmo3 zX>jY_9KM@WFl1FwZAMX>PuFT8FzvQ?EiErFBkD9kU^c`-7-8yq5ssP^JJLbR4pwa6 z?^a8Hik4NB*jQ*sUKrRu;QDOXvb{iHcYKcq5n$^5x|4J_foZGJ-Uo307KVo+Q-J|e zU4`Zv>IQ1SAgz~8jpp4P)f=j-t!ulf1+xG&18Dhm%`9%9RmCiQhAMhoo(s6Q+>H2b zo6}g29(ukPI_e?EFv3Xq-g^hY56U)*hRjX1kG5c>`--dVraCaJKqW&9UA2=(&Yn=KGR)kFAA|bLxgm952#%r&wJJZ(ZoHA~GG&i?s%~Jj# z3fopE^c;E%8Xj348g#6Wy(No#5xv&7od@c;GM zA3hs9{b+S_bz_X31hFGkfOAp>F}d5Qt5nn;9mai+g&hw*jW%vDxM{B6#f-M0W6)Mx zT*#s1L582$PSXqM|7!G3-dvOysG8+7^8~RsAdJHa!!Qbugd7`!g#4C}F949qk59=A zD>u8`A@>h2{`v|tdDWsnmsCs_#@$J76Yhbk`1e>(-FX7l#a&xNYl2c}u6eT}Y_>>UP?CdwQuWx2|^m{&^ zA@Ke3$M<(GB?pb?_oYBt?S&#qA4x4kv& zHo|p78Et~}I?&%Hl<1O0beSeBi7KnIC2uLuB7a>KXcExG5SkLG2B_p{{RVp=6~pWIdY zmO*W@g&!%in4sc>-25w<3gt%(C{4YqL} zjKjI~<#Dt?$J0b3)M*KRC%&1|H6Ht~Nn(_!=NJ(dWz}H~z3x~*BJf5uS zo#J#?n|>!`U1U%=M$r`6PC$?&l$##>!uS~v=(c&DDyX28i(Rb$FNR_yUp;OXPCDvg#shOG!$hJPs5eMryz?c z3jFbhAhyV^n%|d`YWc~fe+e|b1W6VIuzxDjO27Vurc!Jw#imNPJdd_YY^%h!nJ3?& zX(l$!#HIr?zJ%3Ff)25@=hHrn(j^6%SKj-j&1H<|kOdjh8 z1r6`KAS|f-pUdE)3r>USkCn2&P8O71hZwvLZlOtU^BU{eG=o53}M1 ty8>OTqPzlPKOsrd9y#|9xwc2<_sHTN`BW$$|ChWhl^))IMW7M$yaCKhN;3ce literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/insights/v1/__init__.py new file mode 100644 index 00000000..8f7d1946 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/v1/__init__.py @@ -0,0 +1,75 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Insights + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.insights.v1.call import CallList +from twilio.rest.insights.v1.call_summaries import CallSummariesList +from twilio.rest.insights.v1.conference import ConferenceList +from twilio.rest.insights.v1.room import RoomList +from twilio.rest.insights.v1.setting import SettingList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Insights + + :param domain: The Twilio.insights domain + """ + super().__init__(domain, "v1") + self._calls: Optional[CallList] = None + self._call_summaries: Optional[CallSummariesList] = None + self._conferences: Optional[ConferenceList] = None + self._rooms: Optional[RoomList] = None + self._settings: Optional[SettingList] = None + + @property + def calls(self) -> CallList: + if self._calls is None: + self._calls = CallList(self) + return self._calls + + @property + def call_summaries(self) -> CallSummariesList: + if self._call_summaries is None: + self._call_summaries = CallSummariesList(self) + return self._call_summaries + + @property + def conferences(self) -> ConferenceList: + if self._conferences is None: + self._conferences = ConferenceList(self) + return self._conferences + + @property + def rooms(self) -> RoomList: + if self._rooms is None: + self._rooms = RoomList(self) + return self._rooms + + @property + def settings(self) -> SettingList: + if self._settings is None: + self._settings = SettingList(self) + return self._settings + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/insights/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94f60f8b336d4dfb5c8be9720428b1390cee90fc GIT binary patch literal 3498 zcmc&$&2JM&6rc6y#&(&=_rdv9jn zypP$R+S?NZo@+mUI_tI(@+(f7Pt<2NuK;s{lt`YGv{J~@%AtHnLq2SU%aMFU@)0Xq zj^$&Lk6Q7vp4TNGv)amud_wYZD_KtEQLDZUg5%Ud5K=AqnI&9w|)p9#L!TViaay* zwOUkg9W-N1?z%wfLhu6^C-4UqC1DH^IYok7E))P!9Am@C`HLucI9Qi0NMohy>%rn` zNmRzyh3UsgaKl1#T}p8e^>6AI66%;Po0e(QLv+02m=|YVN1=Fl@ONi9t(oT4Yrjc1kl#M!C$a{gIch9ixPIoJNjfzz{9UI80=N=3mIS-H!s>sFoI@URVH zqiP=Vg9Kui7iXo)m`y9TOL@t3<;xW1CS{{CXING}oA?cbpV2)1Y}GaGieUjCpXS1W z39zv-yKI=q=_kS9jOn<*cOgGHS1udEMdvo?9~Za+fpRowM@Ry^4lg!CgFvqN4!``o=Gv( z;zk5`^kmZl@{M+bxPfpbv_P&wjW1{=?Y3_N)d(mHR**gt*J;-duA&?1NB_h5Js6QcQ6ULpQKsS&t+d0Sa_k@ z$V4XYMV+}S7oN_T30pGe#aIzi!tpxf$edW;AFyH#NpPA zXa}DFXEH$2iz!}9v`17jB)3ZYgY?3+br@EknnDy#w)eL8S_HH zFF^3<;d0K{iDa1BX{-g`)}oN+}(r^k1j{9r8mKtcrn4 zGYuZ}Nao0SU~Z5F@>w9-Vir5yAP*MEZQmYpB~bZyyGe3Oo5+O3HqaB8AGb8I69xxY zpkg;rFDhd+uYx+2U_)?cI}9R@q!&o5Gih{TE79h=e6O~kEL!XbBHg=}>|0CrHIn-u42=Fb zb!Q;AJa#ul!Nq$W18W@v4SnFHIk^M<(~&&wWU{4r=F{lmRxyn}{zm2 zG$+SF)!7F`mC&)3V~u40gPsFF?6}i|H8g=WbYrI zbHc8f@bzWT8MtLDC96&auR=S6o@d})9cboMvvG3t1EV-=R``Ef%{g0zO=XTbKPx^r1kOI-aMhhe70I>I@+#1A|@53p=h52a#*{uZ$vxcEB>4 z*afI;6vt)P6DhPrf<4gr9?0V*vJpu}-(0OdA~0<1A+hvEC>-7U^%s8<7&gOA0K8M8 z!3G^c*xs-ZFV0xW zF5)%o)~oOlCGd*ywyPU1d%EQI%`Q#1WX{h36aw vvJuua?T=7Oi#+NkTK78HzfN9TCnM`*Y@NI-nYSOt-q41YcRnI8$QAzvjgU5V literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/__pycache__/call_summaries.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/insights/v1/__pycache__/call_summaries.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d19901aae8ab25bc26e4b8711e72148963e747dc GIT binary patch literal 68809 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 "CallContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CallContext for this CallInstance + """ + if self._context is None: + self._context = CallContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "CallInstance": + """ + Fetch the CallInstance + + + :returns: The fetched CallInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CallInstance": + """ + Asynchronous coroutine to fetch the CallInstance + + + :returns: The fetched CallInstance + """ + return await self._proxy.fetch_async() + + @property + def annotation(self) -> AnnotationList: + """ + Access the annotation + """ + return self._proxy.annotation + + @property + def summary(self) -> CallSummaryList: + """ + Access the summary + """ + return self._proxy.summary + + @property + def events(self) -> EventList: + """ + Access the events + """ + return self._proxy.events + + @property + def metrics(self) -> MetricList: + """ + Access the metrics + """ + return self._proxy.metrics + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CallContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the CallContext + + :param version: Version that contains the resource + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Voice/{sid}".format(**self._solution) + + self._annotation: Optional[AnnotationList] = None + self._summary: Optional[CallSummaryList] = None + self._events: Optional[EventList] = None + self._metrics: Optional[MetricList] = None + + def fetch(self) -> CallInstance: + """ + Fetch the CallInstance + + + :returns: The fetched CallInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CallInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CallInstance: + """ + Asynchronous coroutine to fetch the CallInstance + + + :returns: The fetched CallInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CallInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + @property + def annotation(self) -> AnnotationList: + """ + Access the annotation + """ + if self._annotation is None: + self._annotation = AnnotationList( + self._version, + self._solution["sid"], + ) + return self._annotation + + @property + def summary(self) -> CallSummaryList: + """ + Access the summary + """ + if self._summary is None: + self._summary = CallSummaryList( + self._version, + self._solution["sid"], + ) + return self._summary + + @property + def events(self) -> EventList: + """ + Access the events + """ + if self._events is None: + self._events = EventList( + self._version, + self._solution["sid"], + ) + return self._events + + @property + def metrics(self) -> MetricList: + """ + Access the metrics + """ + if self._metrics is None: + self._metrics = MetricList( + self._version, + self._solution["sid"], + ) + return self._metrics + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CallList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CallList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, sid: str) -> CallContext: + """ + Constructs a CallContext + + :param sid: + """ + return CallContext(self._version, sid=sid) + + def __call__(self, sid: str) -> CallContext: + """ + Constructs a CallContext + + :param sid: + """ + return CallContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b60641e8a7e55a349add0ec5bc756542afcd990 GIT binary patch literal 10439 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 GLH`T>s+~~) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/annotation.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/annotation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43144622227f08a66ec19ee9e6c95374b76bae6b GIT binary patch literal 16489 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/call_summary.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/insights/v1/call/__pycache__/call_summary.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74e96c6cea36c6bbe9108f20a3f5ff0f8bb7d862 GIT binary patch literal 11972 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 lJe(!dM0bD+x9=Xc>m-megWi?(RWI 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 "AnnotationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AnnotationContext for this AnnotationInstance + """ + if self._context is None: + self._context = AnnotationContext( + self._version, + call_sid=self._solution["call_sid"], + ) + return self._context + + def fetch(self) -> "AnnotationInstance": + """ + Fetch the AnnotationInstance + + + :returns: The fetched AnnotationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AnnotationInstance": + """ + Asynchronous coroutine to fetch the AnnotationInstance + + + :returns: The fetched AnnotationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + answered_by: Union["AnnotationInstance.AnsweredBy", object] = values.unset, + connectivity_issue: Union[ + "AnnotationInstance.ConnectivityIssue", object + ] = values.unset, + quality_issues: Union[str, object] = values.unset, + spam: Union[bool, object] = values.unset, + call_score: Union[int, object] = values.unset, + comment: Union[str, object] = values.unset, + incident: Union[str, object] = values.unset, + ) -> "AnnotationInstance": + """ + Update the AnnotationInstance + + :param answered_by: + :param connectivity_issue: + :param quality_issues: Specify if the call had any subjective quality issues. Possible values, one or more of `no_quality_issue`, `low_volume`, `choppy_robotic`, `echo`, `dtmf`, `latency`, `owa`, `static_noise`. Use comma separated values to indicate multiple quality issues for the same call. + :param spam: A boolean flag to indicate if the call was a spam call. Use this to provide feedback on whether calls placed from your account were marked as spam, or if inbound calls received by your account were unwanted spam. Use `true` if the call was a spam call. + :param call_score: Specify the call score. This is of type integer. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for rating the call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + :param comment: Specify any comments pertaining to the call. `comment` has a maximum character limit of 100. Twilio does not treat this field as PII, so no PII should be included in the `comment`. + :param incident: Associate this call with an incident or support ticket. The `incident` parameter is of type string with a maximum character limit of 100. Twilio does not treat this field as PII, so no PII should be included in `incident`. + + :returns: The updated AnnotationInstance + """ + return self._proxy.update( + answered_by=answered_by, + connectivity_issue=connectivity_issue, + quality_issues=quality_issues, + spam=spam, + call_score=call_score, + comment=comment, + incident=incident, + ) + + async def update_async( + self, + answered_by: Union["AnnotationInstance.AnsweredBy", object] = values.unset, + connectivity_issue: Union[ + "AnnotationInstance.ConnectivityIssue", object + ] = values.unset, + quality_issues: Union[str, object] = values.unset, + spam: Union[bool, object] = values.unset, + call_score: Union[int, object] = values.unset, + comment: Union[str, object] = values.unset, + incident: Union[str, object] = values.unset, + ) -> "AnnotationInstance": + """ + Asynchronous coroutine to update the AnnotationInstance + + :param answered_by: + :param connectivity_issue: + :param quality_issues: Specify if the call had any subjective quality issues. Possible values, one or more of `no_quality_issue`, `low_volume`, `choppy_robotic`, `echo`, `dtmf`, `latency`, `owa`, `static_noise`. Use comma separated values to indicate multiple quality issues for the same call. + :param spam: A boolean flag to indicate if the call was a spam call. Use this to provide feedback on whether calls placed from your account were marked as spam, or if inbound calls received by your account were unwanted spam. Use `true` if the call was a spam call. + :param call_score: Specify the call score. This is of type integer. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for rating the call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + :param comment: Specify any comments pertaining to the call. `comment` has a maximum character limit of 100. Twilio does not treat this field as PII, so no PII should be included in the `comment`. + :param incident: Associate this call with an incident or support ticket. The `incident` parameter is of type string with a maximum character limit of 100. Twilio does not treat this field as PII, so no PII should be included in `incident`. + + :returns: The updated AnnotationInstance + """ + return await self._proxy.update_async( + answered_by=answered_by, + connectivity_issue=connectivity_issue, + quality_issues=quality_issues, + spam=spam, + call_score=call_score, + comment=comment, + incident=incident, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AnnotationContext(InstanceContext): + + def __init__(self, version: Version, call_sid: str): + """ + Initialize the AnnotationContext + + :param version: Version that contains the resource + :param call_sid: The unique string that Twilio created to identify this Call resource. It always starts with a CA. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "call_sid": call_sid, + } + self._uri = "/Voice/{call_sid}/Annotation".format(**self._solution) + + def fetch(self) -> AnnotationInstance: + """ + Fetch the AnnotationInstance + + + :returns: The fetched AnnotationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AnnotationInstance( + self._version, + payload, + call_sid=self._solution["call_sid"], + ) + + async def fetch_async(self) -> AnnotationInstance: + """ + Asynchronous coroutine to fetch the AnnotationInstance + + + :returns: The fetched AnnotationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AnnotationInstance( + self._version, + payload, + call_sid=self._solution["call_sid"], + ) + + def update( + self, + answered_by: Union["AnnotationInstance.AnsweredBy", object] = values.unset, + connectivity_issue: Union[ + "AnnotationInstance.ConnectivityIssue", object + ] = values.unset, + quality_issues: Union[str, object] = values.unset, + spam: Union[bool, object] = values.unset, + call_score: Union[int, object] = values.unset, + comment: Union[str, object] = values.unset, + incident: Union[str, object] = values.unset, + ) -> AnnotationInstance: + """ + Update the AnnotationInstance + + :param answered_by: + :param connectivity_issue: + :param quality_issues: Specify if the call had any subjective quality issues. Possible values, one or more of `no_quality_issue`, `low_volume`, `choppy_robotic`, `echo`, `dtmf`, `latency`, `owa`, `static_noise`. Use comma separated values to indicate multiple quality issues for the same call. + :param spam: A boolean flag to indicate if the call was a spam call. Use this to provide feedback on whether calls placed from your account were marked as spam, or if inbound calls received by your account were unwanted spam. Use `true` if the call was a spam call. + :param call_score: Specify the call score. This is of type integer. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for rating the call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + :param comment: Specify any comments pertaining to the call. `comment` has a maximum character limit of 100. Twilio does not treat this field as PII, so no PII should be included in the `comment`. + :param incident: Associate this call with an incident or support ticket. The `incident` parameter is of type string with a maximum character limit of 100. Twilio does not treat this field as PII, so no PII should be included in `incident`. + + :returns: The updated AnnotationInstance + """ + + data = values.of( + { + "AnsweredBy": answered_by, + "ConnectivityIssue": connectivity_issue, + "QualityIssues": quality_issues, + "Spam": serialize.boolean_to_string(spam), + "CallScore": call_score, + "Comment": comment, + "Incident": incident, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AnnotationInstance( + self._version, payload, call_sid=self._solution["call_sid"] + ) + + async def update_async( + self, + answered_by: Union["AnnotationInstance.AnsweredBy", object] = values.unset, + connectivity_issue: Union[ + "AnnotationInstance.ConnectivityIssue", object + ] = values.unset, + quality_issues: Union[str, object] = values.unset, + spam: Union[bool, object] = values.unset, + call_score: Union[int, object] = values.unset, + comment: Union[str, object] = values.unset, + incident: Union[str, object] = values.unset, + ) -> AnnotationInstance: + """ + Asynchronous coroutine to update the AnnotationInstance + + :param answered_by: + :param connectivity_issue: + :param quality_issues: Specify if the call had any subjective quality issues. Possible values, one or more of `no_quality_issue`, `low_volume`, `choppy_robotic`, `echo`, `dtmf`, `latency`, `owa`, `static_noise`. Use comma separated values to indicate multiple quality issues for the same call. + :param spam: A boolean flag to indicate if the call was a spam call. Use this to provide feedback on whether calls placed from your account were marked as spam, or if inbound calls received by your account were unwanted spam. Use `true` if the call was a spam call. + :param call_score: Specify the call score. This is of type integer. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for rating the call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + :param comment: Specify any comments pertaining to the call. `comment` has a maximum character limit of 100. Twilio does not treat this field as PII, so no PII should be included in the `comment`. + :param incident: Associate this call with an incident or support ticket. The `incident` parameter is of type string with a maximum character limit of 100. Twilio does not treat this field as PII, so no PII should be included in `incident`. + + :returns: The updated AnnotationInstance + """ + + data = values.of( + { + "AnsweredBy": answered_by, + "ConnectivityIssue": connectivity_issue, + "QualityIssues": quality_issues, + "Spam": serialize.boolean_to_string(spam), + "CallScore": call_score, + "Comment": comment, + "Incident": incident, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AnnotationInstance( + self._version, payload, call_sid=self._solution["call_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AnnotationList(ListResource): + + def __init__(self, version: Version, call_sid: str): + """ + Initialize the AnnotationList + + :param version: Version that contains the resource + :param call_sid: The unique SID identifier of the Call. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "call_sid": call_sid, + } + + def get(self) -> AnnotationContext: + """ + Constructs a AnnotationContext + + """ + return AnnotationContext(self._version, call_sid=self._solution["call_sid"]) + + def __call__(self) -> AnnotationContext: + """ + Constructs a AnnotationContext + + """ + return AnnotationContext(self._version, call_sid=self._solution["call_sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/call/call_summary.py b/venv/Lib/site-packages/twilio/rest/insights/v1/call/call_summary.py new file mode 100644 index 00000000..e21af100 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/v1/call/call_summary.py @@ -0,0 +1,321 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Insights + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class CallSummaryInstance(InstanceResource): + + class AnsweredBy(object): + UNKNOWN = "unknown" + MACHINE_START = "machine_start" + MACHINE_END_BEEP = "machine_end_beep" + MACHINE_END_SILENCE = "machine_end_silence" + MACHINE_END_OTHER = "machine_end_other" + HUMAN = "human" + FAX = "fax" + + class CallState(object): + RINGING = "ringing" + COMPLETED = "completed" + BUSY = "busy" + FAIL = "fail" + NOANSWER = "noanswer" + CANCELED = "canceled" + ANSWERED = "answered" + UNDIALED = "undialed" + + class CallType(object): + CARRIER = "carrier" + SIP = "sip" + TRUNKING = "trunking" + CLIENT = "client" + WHATSAPP = "whatsapp" + + class ProcessingState(object): + COMPLETE = "complete" + PARTIAL = "partial" + + """ + :ivar account_sid: The unique SID identifier of the Account. + :ivar call_sid: The unique SID identifier of the Call. + :ivar call_type: + :ivar call_state: + :ivar answered_by: + :ivar processing_state: + :ivar created_time: The time at which the Call was created, given in ISO 8601 format. Can be different from `start_time` in the event of queueing due to CPS + :ivar start_time: The time at which the Call was started, given in ISO 8601 format. + :ivar end_time: The time at which the Call was ended, given in ISO 8601 format. + :ivar duration: Duration between when the call was initiated and the call was ended + :ivar connect_duration: Duration between when the call was answered and when it ended + :ivar _from: The calling party. + :ivar to: The called party. + :ivar carrier_edge: Contains metrics and properties for the Twilio media gateway of a PSTN call. + :ivar client_edge: Contains metrics and properties for the Twilio media gateway of a Client call. + :ivar sdk_edge: Contains metrics and properties for the SDK sensor library for Client calls. + :ivar sip_edge: Contains metrics and properties for the Twilio media gateway of a SIP Interface or Trunking call. + :ivar tags: Tags applied to calls by Voice Insights analysis indicating a condition that could result in subjective degradation of the call quality. + :ivar url: The URL of this resource. + :ivar attributes: Attributes capturing call-flow-specific details. + :ivar properties: Contains edge-agnostic call-level details. + :ivar trust: Contains trusted communications details including Branded Call and verified caller ID. + :ivar annotation: Programmatically labeled annotations for the Call. Developers can update the Call Summary records with Annotation during or after a Call. Annotations can be updated as long as the Call Summary record is addressable via the API. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], call_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.call_type: Optional["CallSummaryInstance.CallType"] = payload.get( + "call_type" + ) + self.call_state: Optional["CallSummaryInstance.CallState"] = payload.get( + "call_state" + ) + self.answered_by: Optional["CallSummaryInstance.AnsweredBy"] = payload.get( + "answered_by" + ) + self.processing_state: Optional["CallSummaryInstance.ProcessingState"] = ( + payload.get("processing_state") + ) + self.created_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("created_time") + ) + self.start_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("start_time") + ) + self.end_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("end_time") + ) + self.duration: Optional[int] = deserialize.integer(payload.get("duration")) + self.connect_duration: Optional[int] = deserialize.integer( + payload.get("connect_duration") + ) + self._from: Optional[Dict[str, object]] = payload.get("from") + self.to: Optional[Dict[str, object]] = payload.get("to") + self.carrier_edge: Optional[Dict[str, object]] = payload.get("carrier_edge") + self.client_edge: Optional[Dict[str, object]] = payload.get("client_edge") + self.sdk_edge: Optional[Dict[str, object]] = payload.get("sdk_edge") + self.sip_edge: Optional[Dict[str, object]] = payload.get("sip_edge") + self.tags: Optional[List[str]] = payload.get("tags") + self.url: Optional[str] = payload.get("url") + self.attributes: Optional[Dict[str, object]] = payload.get("attributes") + self.properties: Optional[Dict[str, object]] = payload.get("properties") + self.trust: Optional[Dict[str, object]] = payload.get("trust") + self.annotation: Optional[Dict[str, object]] = payload.get("annotation") + + self._solution = { + "call_sid": call_sid, + } + self._context: Optional[CallSummaryContext] = None + + @property + def _proxy(self) -> "CallSummaryContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CallSummaryContext for this CallSummaryInstance + """ + if self._context is None: + self._context = CallSummaryContext( + self._version, + call_sid=self._solution["call_sid"], + ) + return self._context + + def fetch( + self, + processing_state: Union[ + "CallSummaryInstance.ProcessingState", object + ] = values.unset, + ) -> "CallSummaryInstance": + """ + Fetch the CallSummaryInstance + + :param processing_state: The Processing State of this Call Summary. One of `complete`, `partial` or `all`. + + :returns: The fetched CallSummaryInstance + """ + return self._proxy.fetch( + processing_state=processing_state, + ) + + async def fetch_async( + self, + processing_state: Union[ + "CallSummaryInstance.ProcessingState", object + ] = values.unset, + ) -> "CallSummaryInstance": + """ + Asynchronous coroutine to fetch the CallSummaryInstance + + :param processing_state: The Processing State of this Call Summary. One of `complete`, `partial` or `all`. + + :returns: The fetched CallSummaryInstance + """ + return await self._proxy.fetch_async( + processing_state=processing_state, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CallSummaryContext(InstanceContext): + + def __init__(self, version: Version, call_sid: str): + """ + Initialize the CallSummaryContext + + :param version: Version that contains the resource + :param call_sid: The unique SID identifier of the Call. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "call_sid": call_sid, + } + self._uri = "/Voice/{call_sid}/Summary".format(**self._solution) + + def fetch( + self, + processing_state: Union[ + "CallSummaryInstance.ProcessingState", object + ] = values.unset, + ) -> CallSummaryInstance: + """ + Fetch the CallSummaryInstance + + :param processing_state: The Processing State of this Call Summary. One of `complete`, `partial` or `all`. + + :returns: The fetched CallSummaryInstance + """ + + data = values.of( + { + "ProcessingState": processing_state, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return CallSummaryInstance( + self._version, + payload, + call_sid=self._solution["call_sid"], + ) + + async def fetch_async( + self, + processing_state: Union[ + "CallSummaryInstance.ProcessingState", object + ] = values.unset, + ) -> CallSummaryInstance: + """ + Asynchronous coroutine to fetch the CallSummaryInstance + + :param processing_state: The Processing State of this Call Summary. One of `complete`, `partial` or `all`. + + :returns: The fetched CallSummaryInstance + """ + + data = values.of( + { + "ProcessingState": processing_state, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return CallSummaryInstance( + self._version, + payload, + call_sid=self._solution["call_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CallSummaryList(ListResource): + + def __init__(self, version: Version, call_sid: str): + """ + Initialize the CallSummaryList + + :param version: Version that contains the resource + :param call_sid: The unique SID identifier of the Call. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "call_sid": call_sid, + } + + def get(self) -> CallSummaryContext: + """ + Constructs a CallSummaryContext + + """ + return CallSummaryContext(self._version, call_sid=self._solution["call_sid"]) + + def __call__(self) -> CallSummaryContext: + """ + Constructs a CallSummaryContext + + """ + return CallSummaryContext(self._version, call_sid=self._solution["call_sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/call/event.py b/venv/Lib/site-packages/twilio/rest/insights/v1/call/event.py new file mode 100644 index 00000000..98dce5eb --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/v1/call/event.py @@ -0,0 +1,337 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Insights + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class EventInstance(InstanceResource): + + class Level(object): + UNKNOWN = "UNKNOWN" + DEBUG = "DEBUG" + INFO = "INFO" + WARNING = "WARNING" + ERROR = "ERROR" + + class TwilioEdge(object): + UNKNOWN_EDGE = "unknown_edge" + CARRIER_EDGE = "carrier_edge" + SIP_EDGE = "sip_edge" + SDK_EDGE = "sdk_edge" + CLIENT_EDGE = "client_edge" + + """ + :ivar timestamp: Event time. + :ivar call_sid: The unique SID identifier of the Call. + :ivar account_sid: The unique SID identifier of the Account. + :ivar edge: + :ivar group: Event group. + :ivar level: + :ivar name: Event name. + :ivar carrier_edge: Represents the connection between Twilio and our immediate carrier partners. The events here describe the call lifecycle as reported by Twilio's carrier media gateways. + :ivar sip_edge: Represents the Twilio media gateway for SIP interface and SIP trunking calls. The events here describe the call lifecycle as reported by Twilio's public media gateways. + :ivar sdk_edge: Represents the Voice SDK running locally in the browser or in the Android/iOS application. The events here are emitted by the Voice SDK in response to certain call progress events, network changes, or call quality conditions. + :ivar client_edge: Represents the Twilio media gateway for Client calls. The events here describe the call lifecycle as reported by Twilio's Voice SDK media gateways. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], call_sid: str): + super().__init__(version) + + self.timestamp: Optional[str] = payload.get("timestamp") + self.call_sid: Optional[str] = payload.get("call_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.edge: Optional["EventInstance.TwilioEdge"] = payload.get("edge") + self.group: Optional[str] = payload.get("group") + self.level: Optional["EventInstance.Level"] = payload.get("level") + self.name: Optional[str] = payload.get("name") + self.carrier_edge: Optional[Dict[str, object]] = payload.get("carrier_edge") + self.sip_edge: Optional[Dict[str, object]] = payload.get("sip_edge") + self.sdk_edge: Optional[Dict[str, object]] = payload.get("sdk_edge") + self.client_edge: Optional[Dict[str, object]] = payload.get("client_edge") + + self._solution = { + "call_sid": call_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EventPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> EventInstance: + """ + Build an instance of EventInstance + + :param payload: Payload response from the API + """ + return EventInstance( + self._version, payload, call_sid=self._solution["call_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class EventList(ListResource): + + def __init__(self, version: Version, call_sid: str): + """ + Initialize the EventList + + :param version: Version that contains the resource + :param call_sid: The unique SID identifier of the Call. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "call_sid": call_sid, + } + self._uri = "/Voice/{call_sid}/Events".format(**self._solution) + + def stream( + self, + edge: Union["EventInstance.TwilioEdge", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[EventInstance]: + """ + Streams EventInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "EventInstance.TwilioEdge" edge: The Edge of this Event. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(edge=edge, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + edge: Union["EventInstance.TwilioEdge", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[EventInstance]: + """ + Asynchronously streams EventInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "EventInstance.TwilioEdge" edge: The Edge of this Event. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(edge=edge, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + edge: Union["EventInstance.TwilioEdge", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EventInstance]: + """ + Lists EventInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "EventInstance.TwilioEdge" edge: The Edge of this Event. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + edge=edge, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + edge: Union["EventInstance.TwilioEdge", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EventInstance]: + """ + Asynchronously lists EventInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "EventInstance.TwilioEdge" edge: The Edge of this Event. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + edge=edge, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + edge: Union["EventInstance.TwilioEdge", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EventPage: + """ + Retrieve a single page of EventInstance records from the API. + Request is executed immediately + + :param edge: The Edge of this Event. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EventInstance + """ + data = values.of( + { + "Edge": edge, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EventPage(self._version, response, self._solution) + + async def page_async( + self, + edge: Union["EventInstance.TwilioEdge", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EventPage: + """ + Asynchronously retrieve a single page of EventInstance records from the API. + Request is executed immediately + + :param edge: The Edge of this Event. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EventInstance + """ + data = values.of( + { + "Edge": edge, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EventPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> EventPage: + """ + Retrieve a specific page of EventInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EventInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return EventPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> EventPage: + """ + Asynchronously retrieve a specific page of EventInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EventInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return EventPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/call/metric.py b/venv/Lib/site-packages/twilio/rest/insights/v1/call/metric.py new file mode 100644 index 00000000..77f770ae --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/v1/call/metric.py @@ -0,0 +1,352 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Insights + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MetricInstance(InstanceResource): + + class StreamDirection(object): + UNKNOWN = "unknown" + INBOUND = "inbound" + OUTBOUND = "outbound" + BOTH = "both" + + class TwilioEdge(object): + UNKNOWN_EDGE = "unknown_edge" + CARRIER_EDGE = "carrier_edge" + SIP_EDGE = "sip_edge" + SDK_EDGE = "sdk_edge" + CLIENT_EDGE = "client_edge" + + """ + :ivar timestamp: Timestamp of metric sample. Samples are taken every 10 seconds and contain the metrics for the previous 10 seconds. + :ivar call_sid: The unique SID identifier of the Call. + :ivar account_sid: The unique SID identifier of the Account. + :ivar edge: + :ivar direction: + :ivar carrier_edge: Contains metrics and properties for the Twilio media gateway of a PSTN call. + :ivar sip_edge: Contains metrics and properties for the Twilio media gateway of a SIP Interface or Trunking call. + :ivar sdk_edge: Contains metrics and properties for the SDK sensor library for Client calls. + :ivar client_edge: Contains metrics and properties for the Twilio media gateway of a Client call. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], call_sid: str): + super().__init__(version) + + self.timestamp: Optional[str] = payload.get("timestamp") + self.call_sid: Optional[str] = payload.get("call_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.edge: Optional["MetricInstance.TwilioEdge"] = payload.get("edge") + self.direction: Optional["MetricInstance.StreamDirection"] = payload.get( + "direction" + ) + self.carrier_edge: Optional[Dict[str, object]] = payload.get("carrier_edge") + self.sip_edge: Optional[Dict[str, object]] = payload.get("sip_edge") + self.sdk_edge: Optional[Dict[str, object]] = payload.get("sdk_edge") + self.client_edge: Optional[Dict[str, object]] = payload.get("client_edge") + + self._solution = { + "call_sid": call_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MetricPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MetricInstance: + """ + Build an instance of MetricInstance + + :param payload: Payload response from the API + """ + return MetricInstance( + self._version, payload, call_sid=self._solution["call_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MetricList(ListResource): + + def __init__(self, version: Version, call_sid: str): + """ + Initialize the MetricList + + :param version: Version that contains the resource + :param call_sid: The unique SID identifier of the Call. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "call_sid": call_sid, + } + self._uri = "/Voice/{call_sid}/Metrics".format(**self._solution) + + def stream( + self, + edge: Union["MetricInstance.TwilioEdge", object] = values.unset, + direction: Union["MetricInstance.StreamDirection", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MetricInstance]: + """ + Streams MetricInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MetricInstance.TwilioEdge" edge: The Edge of this Metric. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param "MetricInstance.StreamDirection" direction: The Direction of this Metric. One of `unknown`, `inbound`, `outbound` or `both`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(edge=edge, direction=direction, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + edge: Union["MetricInstance.TwilioEdge", object] = values.unset, + direction: Union["MetricInstance.StreamDirection", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MetricInstance]: + """ + Asynchronously streams MetricInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MetricInstance.TwilioEdge" edge: The Edge of this Metric. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param "MetricInstance.StreamDirection" direction: The Direction of this Metric. One of `unknown`, `inbound`, `outbound` or `both`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + edge=edge, direction=direction, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + edge: Union["MetricInstance.TwilioEdge", object] = values.unset, + direction: Union["MetricInstance.StreamDirection", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MetricInstance]: + """ + Lists MetricInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MetricInstance.TwilioEdge" edge: The Edge of this Metric. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param "MetricInstance.StreamDirection" direction: The Direction of this Metric. One of `unknown`, `inbound`, `outbound` or `both`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + edge=edge, + direction=direction, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + edge: Union["MetricInstance.TwilioEdge", object] = values.unset, + direction: Union["MetricInstance.StreamDirection", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MetricInstance]: + """ + Asynchronously lists MetricInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MetricInstance.TwilioEdge" edge: The Edge of this Metric. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param "MetricInstance.StreamDirection" direction: The Direction of this Metric. One of `unknown`, `inbound`, `outbound` or `both`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + edge=edge, + direction=direction, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + edge: Union["MetricInstance.TwilioEdge", object] = values.unset, + direction: Union["MetricInstance.StreamDirection", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MetricPage: + """ + Retrieve a single page of MetricInstance records from the API. + Request is executed immediately + + :param edge: The Edge of this Metric. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param direction: The Direction of this Metric. One of `unknown`, `inbound`, `outbound` or `both`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MetricInstance + """ + data = values.of( + { + "Edge": edge, + "Direction": direction, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MetricPage(self._version, response, self._solution) + + async def page_async( + self, + edge: Union["MetricInstance.TwilioEdge", object] = values.unset, + direction: Union["MetricInstance.StreamDirection", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MetricPage: + """ + Asynchronously retrieve a single page of MetricInstance records from the API. + Request is executed immediately + + :param edge: The Edge of this Metric. One of `unknown_edge`, `carrier_edge`, `sip_edge`, `sdk_edge` or `client_edge`. + :param direction: The Direction of this Metric. One of `unknown`, `inbound`, `outbound` or `both`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MetricInstance + """ + data = values.of( + { + "Edge": edge, + "Direction": direction, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MetricPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MetricPage: + """ + Retrieve a specific page of MetricInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MetricInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MetricPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MetricPage: + """ + Asynchronously retrieve a specific page of MetricInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MetricInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MetricPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/call_summaries.py b/venv/Lib/site-packages/twilio/rest/insights/v1/call_summaries.py new file mode 100644 index 00000000..0a75e384 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/v1/call_summaries.py @@ -0,0 +1,973 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Insights + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CallSummariesInstance(InstanceResource): + + class AnsweredBy(object): + UNKNOWN = "unknown" + MACHINE_START = "machine_start" + MACHINE_END_BEEP = "machine_end_beep" + MACHINE_END_SILENCE = "machine_end_silence" + MACHINE_END_OTHER = "machine_end_other" + HUMAN = "human" + FAX = "fax" + + class CallState(object): + RINGING = "ringing" + COMPLETED = "completed" + BUSY = "busy" + FAIL = "fail" + NOANSWER = "noanswer" + CANCELED = "canceled" + ANSWERED = "answered" + UNDIALED = "undialed" + + class CallType(object): + CARRIER = "carrier" + SIP = "sip" + TRUNKING = "trunking" + CLIENT = "client" + WHATSAPP = "whatsapp" + + class ProcessingState(object): + COMPLETE = "complete" + PARTIAL = "partial" + + class ProcessingStateRequest(object): + COMPLETED = "completed" + STARTED = "started" + PARTIAL = "partial" + ALL = "all" + + class SortBy(object): + START_TIME = "start_time" + END_TIME = "end_time" + + """ + :ivar account_sid: The unique SID identifier of the Account. + :ivar call_sid: The unique SID identifier of the Call. + :ivar answered_by: + :ivar call_type: + :ivar call_state: + :ivar processing_state: + :ivar created_time: The time at which the Call was created, given in ISO 8601 format. Can be different from `start_time` in the event of queueing due to CPS + :ivar start_time: The time at which the Call was started, given in ISO 8601 format. + :ivar end_time: The time at which the Call was ended, given in ISO 8601 format. + :ivar duration: Duration between when the call was initiated and the call was ended + :ivar connect_duration: Duration between when the call was answered and when it ended + :ivar _from: The calling party. + :ivar to: The called party. + :ivar carrier_edge: Contains metrics and properties for the Twilio media gateway of a PSTN call. + :ivar client_edge: Contains metrics and properties for the Twilio media gateway of a Client call. + :ivar sdk_edge: Contains metrics and properties for the SDK sensor library for Client calls. + :ivar sip_edge: Contains metrics and properties for the Twilio media gateway of a SIP Interface or Trunking call. + :ivar tags: Tags applied to calls by Voice Insights analysis indicating a condition that could result in subjective degradation of the call quality. + :ivar url: The URL of this resource. + :ivar attributes: Attributes capturing call-flow-specific details. + :ivar properties: Contains edge-agnostic call-level details. + :ivar trust: Contains trusted communications details including Branded Call and verified caller ID. + :ivar annotation: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.answered_by: Optional["CallSummariesInstance.AnsweredBy"] = payload.get( + "answered_by" + ) + self.call_type: Optional["CallSummariesInstance.CallType"] = payload.get( + "call_type" + ) + self.call_state: Optional["CallSummariesInstance.CallState"] = payload.get( + "call_state" + ) + self.processing_state: Optional["CallSummariesInstance.ProcessingState"] = ( + payload.get("processing_state") + ) + self.created_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("created_time") + ) + self.start_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("start_time") + ) + self.end_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("end_time") + ) + self.duration: Optional[int] = deserialize.integer(payload.get("duration")) + self.connect_duration: Optional[int] = deserialize.integer( + payload.get("connect_duration") + ) + self._from: Optional[Dict[str, object]] = payload.get("from") + self.to: Optional[Dict[str, object]] = payload.get("to") + self.carrier_edge: Optional[Dict[str, object]] = payload.get("carrier_edge") + self.client_edge: Optional[Dict[str, object]] = payload.get("client_edge") + self.sdk_edge: Optional[Dict[str, object]] = payload.get("sdk_edge") + self.sip_edge: Optional[Dict[str, object]] = payload.get("sip_edge") + self.tags: Optional[List[str]] = payload.get("tags") + self.url: Optional[str] = payload.get("url") + self.attributes: Optional[Dict[str, object]] = payload.get("attributes") + self.properties: Optional[Dict[str, object]] = payload.get("properties") + self.trust: Optional[Dict[str, object]] = payload.get("trust") + self.annotation: Optional[Dict[str, object]] = payload.get("annotation") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class CallSummariesPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CallSummariesInstance: + """ + Build an instance of CallSummariesInstance + + :param payload: Payload response from the API + """ + return CallSummariesInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CallSummariesList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CallSummariesList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Voice/Summaries" + + def stream( + self, + from_: Union[str, object] = values.unset, + to: Union[str, object] = values.unset, + from_carrier: Union[str, object] = values.unset, + to_carrier: Union[str, object] = values.unset, + from_country_code: Union[str, object] = values.unset, + to_country_code: Union[str, object] = values.unset, + verified_caller: Union[bool, object] = values.unset, + has_tag: Union[bool, object] = values.unset, + start_time: Union[str, object] = values.unset, + end_time: Union[str, object] = values.unset, + call_type: Union[str, object] = values.unset, + call_state: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + processing_state: Union[ + "CallSummariesInstance.ProcessingStateRequest", object + ] = values.unset, + sort_by: Union["CallSummariesInstance.SortBy", object] = values.unset, + subaccount: Union[str, object] = values.unset, + abnormal_session: Union[bool, object] = values.unset, + answered_by: Union["CallSummariesInstance.AnsweredBy", object] = values.unset, + answered_by_annotation: Union[str, object] = values.unset, + connectivity_issue_annotation: Union[str, object] = values.unset, + quality_issue_annotation: Union[str, object] = values.unset, + spam_annotation: Union[bool, object] = values.unset, + call_score_annotation: Union[str, object] = values.unset, + branded_enabled: Union[bool, object] = values.unset, + voice_integrity_enabled: Union[bool, object] = values.unset, + branded_bundle_sid: Union[str, object] = values.unset, + voice_integrity_bundle_sid: Union[str, object] = values.unset, + voice_integrity_use_case: Union[str, object] = values.unset, + business_profile_identity: Union[str, object] = values.unset, + business_profile_industry: Union[str, object] = values.unset, + business_profile_bundle_sid: Union[str, object] = values.unset, + business_profile_type: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CallSummariesInstance]: + """ + Streams CallSummariesInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str from_: A calling party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param str to: A called party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param str from_carrier: An origination carrier. + :param str to_carrier: A destination carrier. + :param str from_country_code: A source country code based on phone number in From. + :param str to_country_code: A destination country code. Based on phone number in To. + :param bool verified_caller: A boolean flag indicating whether or not the caller was verified using SHAKEN/STIR.One of 'true' or 'false'. + :param bool has_tag: A boolean flag indicating the presence of one or more [Voice Insights Call Tags](https://www.twilio.com/docs/voice/voice-insights/api/call/details-call-tags). + :param str start_time: A Start time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 4h. + :param str end_time: An End Time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 0m. + :param str call_type: A Call Type of the calls. One of `carrier`, `sip`, `trunking` or `client`. + :param str call_state: A Call State of the calls. One of `ringing`, `completed`, `busy`, `fail`, `noanswer`, `canceled`, `answered`, `undialed`. + :param str direction: A Direction of the calls. One of `outbound_api`, `outbound_dial`, `inbound`, `trunking_originating`, `trunking_terminating`. + :param "CallSummariesInstance.ProcessingStateRequest" processing_state: A Processing State of the Call Summaries. One of `completed`, `partial` or `all`. + :param "CallSummariesInstance.SortBy" sort_by: A Sort By criterion for the returned list of Call Summaries. One of `start_time` or `end_time`. + :param str subaccount: A unique SID identifier of a Subaccount. + :param bool abnormal_session: A boolean flag indicating an abnormal session where the last SIP response was not 200 OK. + :param "CallSummariesInstance.AnsweredBy" answered_by: An Answered By value for the calls based on `Answering Machine Detection (AMD)`. One of `unknown`, `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`, `human` or `fax`. + :param str answered_by_annotation: Either machine or human. + :param str connectivity_issue_annotation: A Connectivity Issue with the calls. One of `no_connectivity_issue`, `invalid_number`, `caller_id`, `dropped_call`, or `number_reachability`. + :param str quality_issue_annotation: A subjective Quality Issue with the calls. One of `no_quality_issue`, `low_volume`, `choppy_robotic`, `echo`, `dtmf`, `latency`, `owa`, `static_noise`. + :param bool spam_annotation: A boolean flag indicating spam calls. + :param str call_score_annotation: A Call Score of the calls. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for the rated call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + :param bool branded_enabled: A boolean flag indicating whether or not the calls were branded using Twilio Branded Calls. One of 'true' or 'false' + :param bool voice_integrity_enabled: A boolean flag indicating whether or not the phone number had voice integrity enabled.One of 'true' or 'false' + :param str branded_bundle_sid: A unique SID identifier of the Branded Call. + :param str voice_integrity_bundle_sid: A unique SID identifier of the Voice Integrity Profile. + :param str voice_integrity_use_case: A Voice Integrity Use Case . Is of type enum. One of 'abandoned_cart', 'appointment_reminders', 'appointment_scheduling', 'asset_management', 'automated_support', 'call_tracking', 'click_to_call', 'contact_tracing', 'contactless_delivery', 'customer_support', 'dating/social', 'delivery_notifications', 'distance_learning', 'emergency_notifications', 'employee_notifications', 'exam_proctoring', 'field_notifications', 'first_responder', 'fraud_alerts', 'group_messaging', 'identify_&_verification', 'intelligent_routing', 'lead_alerts', 'lead_distribution', 'lead_generation', 'lead_management', 'lead_nurturing', 'marketing_events', 'mass_alerts', 'meetings/collaboration', 'order_notifications', 'outbound_dialer', 'pharmacy', 'phone_system', 'purchase_confirmation', 'remote_appointments', 'rewards_program', 'self-service', 'service_alerts', 'shift_management', 'survey/research', 'telehealth', 'telemarketing', 'therapy_(individual+group)'. + :param str business_profile_identity: A Business Identity of the calls. Is of type enum. One of 'direct_customer', 'isv_reseller_or_partner'. + :param str business_profile_industry: A Business Industry of the calls. Is of type enum. One of 'automotive', 'agriculture', 'banking', 'consumer', 'construction', 'education', 'engineering', 'energy', 'oil_and_gas', 'fast_moving_consumer_goods', 'financial', 'fintech', 'food_and_beverage', 'government', 'healthcare', 'hospitality', 'insurance', 'legal', 'manufacturing', 'media', 'online', 'professional_services', 'raw_materials', 'real_estate', 'religion', 'retail', 'jewelry', 'technology', 'telecommunications', 'transportation', 'travel', 'electronics', 'not_for_profit' + :param str business_profile_bundle_sid: A unique SID identifier of the Business Profile. + :param str business_profile_type: A Business Profile Type of the calls. Is of type enum. One of 'primary', 'secondary'. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + from_=from_, + to=to, + from_carrier=from_carrier, + to_carrier=to_carrier, + from_country_code=from_country_code, + to_country_code=to_country_code, + verified_caller=verified_caller, + has_tag=has_tag, + start_time=start_time, + end_time=end_time, + call_type=call_type, + call_state=call_state, + direction=direction, + processing_state=processing_state, + sort_by=sort_by, + subaccount=subaccount, + abnormal_session=abnormal_session, + answered_by=answered_by, + answered_by_annotation=answered_by_annotation, + connectivity_issue_annotation=connectivity_issue_annotation, + quality_issue_annotation=quality_issue_annotation, + spam_annotation=spam_annotation, + call_score_annotation=call_score_annotation, + branded_enabled=branded_enabled, + voice_integrity_enabled=voice_integrity_enabled, + branded_bundle_sid=branded_bundle_sid, + voice_integrity_bundle_sid=voice_integrity_bundle_sid, + voice_integrity_use_case=voice_integrity_use_case, + business_profile_identity=business_profile_identity, + business_profile_industry=business_profile_industry, + business_profile_bundle_sid=business_profile_bundle_sid, + business_profile_type=business_profile_type, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + from_: Union[str, object] = values.unset, + to: Union[str, object] = values.unset, + from_carrier: Union[str, object] = values.unset, + to_carrier: Union[str, object] = values.unset, + from_country_code: Union[str, object] = values.unset, + to_country_code: Union[str, object] = values.unset, + verified_caller: Union[bool, object] = values.unset, + has_tag: Union[bool, object] = values.unset, + start_time: Union[str, object] = values.unset, + end_time: Union[str, object] = values.unset, + call_type: Union[str, object] = values.unset, + call_state: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + processing_state: Union[ + "CallSummariesInstance.ProcessingStateRequest", object + ] = values.unset, + sort_by: Union["CallSummariesInstance.SortBy", object] = values.unset, + subaccount: Union[str, object] = values.unset, + abnormal_session: Union[bool, object] = values.unset, + answered_by: Union["CallSummariesInstance.AnsweredBy", object] = values.unset, + answered_by_annotation: Union[str, object] = values.unset, + connectivity_issue_annotation: Union[str, object] = values.unset, + quality_issue_annotation: Union[str, object] = values.unset, + spam_annotation: Union[bool, object] = values.unset, + call_score_annotation: Union[str, object] = values.unset, + branded_enabled: Union[bool, object] = values.unset, + voice_integrity_enabled: Union[bool, object] = values.unset, + branded_bundle_sid: Union[str, object] = values.unset, + voice_integrity_bundle_sid: Union[str, object] = values.unset, + voice_integrity_use_case: Union[str, object] = values.unset, + business_profile_identity: Union[str, object] = values.unset, + business_profile_industry: Union[str, object] = values.unset, + business_profile_bundle_sid: Union[str, object] = values.unset, + business_profile_type: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CallSummariesInstance]: + """ + Asynchronously streams CallSummariesInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str from_: A calling party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param str to: A called party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param str from_carrier: An origination carrier. + :param str to_carrier: A destination carrier. + :param str from_country_code: A source country code based on phone number in From. + :param str to_country_code: A destination country code. Based on phone number in To. + :param bool verified_caller: A boolean flag indicating whether or not the caller was verified using SHAKEN/STIR.One of 'true' or 'false'. + :param bool has_tag: A boolean flag indicating the presence of one or more [Voice Insights Call Tags](https://www.twilio.com/docs/voice/voice-insights/api/call/details-call-tags). + :param str start_time: A Start time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 4h. + :param str end_time: An End Time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 0m. + :param str call_type: A Call Type of the calls. One of `carrier`, `sip`, `trunking` or `client`. + :param str call_state: A Call State of the calls. One of `ringing`, `completed`, `busy`, `fail`, `noanswer`, `canceled`, `answered`, `undialed`. + :param str direction: A Direction of the calls. One of `outbound_api`, `outbound_dial`, `inbound`, `trunking_originating`, `trunking_terminating`. + :param "CallSummariesInstance.ProcessingStateRequest" processing_state: A Processing State of the Call Summaries. One of `completed`, `partial` or `all`. + :param "CallSummariesInstance.SortBy" sort_by: A Sort By criterion for the returned list of Call Summaries. One of `start_time` or `end_time`. + :param str subaccount: A unique SID identifier of a Subaccount. + :param bool abnormal_session: A boolean flag indicating an abnormal session where the last SIP response was not 200 OK. + :param "CallSummariesInstance.AnsweredBy" answered_by: An Answered By value for the calls based on `Answering Machine Detection (AMD)`. One of `unknown`, `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`, `human` or `fax`. + :param str answered_by_annotation: Either machine or human. + :param str connectivity_issue_annotation: A Connectivity Issue with the calls. One of `no_connectivity_issue`, `invalid_number`, `caller_id`, `dropped_call`, or `number_reachability`. + :param str quality_issue_annotation: A subjective Quality Issue with the calls. One of `no_quality_issue`, `low_volume`, `choppy_robotic`, `echo`, `dtmf`, `latency`, `owa`, `static_noise`. + :param bool spam_annotation: A boolean flag indicating spam calls. + :param str call_score_annotation: A Call Score of the calls. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for the rated call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + :param bool branded_enabled: A boolean flag indicating whether or not the calls were branded using Twilio Branded Calls. One of 'true' or 'false' + :param bool voice_integrity_enabled: A boolean flag indicating whether or not the phone number had voice integrity enabled.One of 'true' or 'false' + :param str branded_bundle_sid: A unique SID identifier of the Branded Call. + :param str voice_integrity_bundle_sid: A unique SID identifier of the Voice Integrity Profile. + :param str voice_integrity_use_case: A Voice Integrity Use Case . Is of type enum. One of 'abandoned_cart', 'appointment_reminders', 'appointment_scheduling', 'asset_management', 'automated_support', 'call_tracking', 'click_to_call', 'contact_tracing', 'contactless_delivery', 'customer_support', 'dating/social', 'delivery_notifications', 'distance_learning', 'emergency_notifications', 'employee_notifications', 'exam_proctoring', 'field_notifications', 'first_responder', 'fraud_alerts', 'group_messaging', 'identify_&_verification', 'intelligent_routing', 'lead_alerts', 'lead_distribution', 'lead_generation', 'lead_management', 'lead_nurturing', 'marketing_events', 'mass_alerts', 'meetings/collaboration', 'order_notifications', 'outbound_dialer', 'pharmacy', 'phone_system', 'purchase_confirmation', 'remote_appointments', 'rewards_program', 'self-service', 'service_alerts', 'shift_management', 'survey/research', 'telehealth', 'telemarketing', 'therapy_(individual+group)'. + :param str business_profile_identity: A Business Identity of the calls. Is of type enum. One of 'direct_customer', 'isv_reseller_or_partner'. + :param str business_profile_industry: A Business Industry of the calls. Is of type enum. One of 'automotive', 'agriculture', 'banking', 'consumer', 'construction', 'education', 'engineering', 'energy', 'oil_and_gas', 'fast_moving_consumer_goods', 'financial', 'fintech', 'food_and_beverage', 'government', 'healthcare', 'hospitality', 'insurance', 'legal', 'manufacturing', 'media', 'online', 'professional_services', 'raw_materials', 'real_estate', 'religion', 'retail', 'jewelry', 'technology', 'telecommunications', 'transportation', 'travel', 'electronics', 'not_for_profit' + :param str business_profile_bundle_sid: A unique SID identifier of the Business Profile. + :param str business_profile_type: A Business Profile Type of the calls. Is of type enum. One of 'primary', 'secondary'. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + from_=from_, + to=to, + from_carrier=from_carrier, + to_carrier=to_carrier, + from_country_code=from_country_code, + to_country_code=to_country_code, + verified_caller=verified_caller, + has_tag=has_tag, + start_time=start_time, + end_time=end_time, + call_type=call_type, + call_state=call_state, + direction=direction, + processing_state=processing_state, + sort_by=sort_by, + subaccount=subaccount, + abnormal_session=abnormal_session, + answered_by=answered_by, + answered_by_annotation=answered_by_annotation, + connectivity_issue_annotation=connectivity_issue_annotation, + quality_issue_annotation=quality_issue_annotation, + spam_annotation=spam_annotation, + call_score_annotation=call_score_annotation, + branded_enabled=branded_enabled, + voice_integrity_enabled=voice_integrity_enabled, + branded_bundle_sid=branded_bundle_sid, + voice_integrity_bundle_sid=voice_integrity_bundle_sid, + voice_integrity_use_case=voice_integrity_use_case, + business_profile_identity=business_profile_identity, + business_profile_industry=business_profile_industry, + business_profile_bundle_sid=business_profile_bundle_sid, + business_profile_type=business_profile_type, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + from_: Union[str, object] = values.unset, + to: Union[str, object] = values.unset, + from_carrier: Union[str, object] = values.unset, + to_carrier: Union[str, object] = values.unset, + from_country_code: Union[str, object] = values.unset, + to_country_code: Union[str, object] = values.unset, + verified_caller: Union[bool, object] = values.unset, + has_tag: Union[bool, object] = values.unset, + start_time: Union[str, object] = values.unset, + end_time: Union[str, object] = values.unset, + call_type: Union[str, object] = values.unset, + call_state: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + processing_state: Union[ + "CallSummariesInstance.ProcessingStateRequest", object + ] = values.unset, + sort_by: Union["CallSummariesInstance.SortBy", object] = values.unset, + subaccount: Union[str, object] = values.unset, + abnormal_session: Union[bool, object] = values.unset, + answered_by: Union["CallSummariesInstance.AnsweredBy", object] = values.unset, + answered_by_annotation: Union[str, object] = values.unset, + connectivity_issue_annotation: Union[str, object] = values.unset, + quality_issue_annotation: Union[str, object] = values.unset, + spam_annotation: Union[bool, object] = values.unset, + call_score_annotation: Union[str, object] = values.unset, + branded_enabled: Union[bool, object] = values.unset, + voice_integrity_enabled: Union[bool, object] = values.unset, + branded_bundle_sid: Union[str, object] = values.unset, + voice_integrity_bundle_sid: Union[str, object] = values.unset, + voice_integrity_use_case: Union[str, object] = values.unset, + business_profile_identity: Union[str, object] = values.unset, + business_profile_industry: Union[str, object] = values.unset, + business_profile_bundle_sid: Union[str, object] = values.unset, + business_profile_type: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CallSummariesInstance]: + """ + Lists CallSummariesInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str from_: A calling party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param str to: A called party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param str from_carrier: An origination carrier. + :param str to_carrier: A destination carrier. + :param str from_country_code: A source country code based on phone number in From. + :param str to_country_code: A destination country code. Based on phone number in To. + :param bool verified_caller: A boolean flag indicating whether or not the caller was verified using SHAKEN/STIR.One of 'true' or 'false'. + :param bool has_tag: A boolean flag indicating the presence of one or more [Voice Insights Call Tags](https://www.twilio.com/docs/voice/voice-insights/api/call/details-call-tags). + :param str start_time: A Start time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 4h. + :param str end_time: An End Time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 0m. + :param str call_type: A Call Type of the calls. One of `carrier`, `sip`, `trunking` or `client`. + :param str call_state: A Call State of the calls. One of `ringing`, `completed`, `busy`, `fail`, `noanswer`, `canceled`, `answered`, `undialed`. + :param str direction: A Direction of the calls. One of `outbound_api`, `outbound_dial`, `inbound`, `trunking_originating`, `trunking_terminating`. + :param "CallSummariesInstance.ProcessingStateRequest" processing_state: A Processing State of the Call Summaries. One of `completed`, `partial` or `all`. + :param "CallSummariesInstance.SortBy" sort_by: A Sort By criterion for the returned list of Call Summaries. One of `start_time` or `end_time`. + :param str subaccount: A unique SID identifier of a Subaccount. + :param bool abnormal_session: A boolean flag indicating an abnormal session where the last SIP response was not 200 OK. + :param "CallSummariesInstance.AnsweredBy" answered_by: An Answered By value for the calls based on `Answering Machine Detection (AMD)`. One of `unknown`, `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`, `human` or `fax`. + :param str answered_by_annotation: Either machine or human. + :param str connectivity_issue_annotation: A Connectivity Issue with the calls. One of `no_connectivity_issue`, `invalid_number`, `caller_id`, `dropped_call`, or `number_reachability`. + :param str quality_issue_annotation: A subjective Quality Issue with the calls. One of `no_quality_issue`, `low_volume`, `choppy_robotic`, `echo`, `dtmf`, `latency`, `owa`, `static_noise`. + :param bool spam_annotation: A boolean flag indicating spam calls. + :param str call_score_annotation: A Call Score of the calls. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for the rated call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + :param bool branded_enabled: A boolean flag indicating whether or not the calls were branded using Twilio Branded Calls. One of 'true' or 'false' + :param bool voice_integrity_enabled: A boolean flag indicating whether or not the phone number had voice integrity enabled.One of 'true' or 'false' + :param str branded_bundle_sid: A unique SID identifier of the Branded Call. + :param str voice_integrity_bundle_sid: A unique SID identifier of the Voice Integrity Profile. + :param str voice_integrity_use_case: A Voice Integrity Use Case . Is of type enum. One of 'abandoned_cart', 'appointment_reminders', 'appointment_scheduling', 'asset_management', 'automated_support', 'call_tracking', 'click_to_call', 'contact_tracing', 'contactless_delivery', 'customer_support', 'dating/social', 'delivery_notifications', 'distance_learning', 'emergency_notifications', 'employee_notifications', 'exam_proctoring', 'field_notifications', 'first_responder', 'fraud_alerts', 'group_messaging', 'identify_&_verification', 'intelligent_routing', 'lead_alerts', 'lead_distribution', 'lead_generation', 'lead_management', 'lead_nurturing', 'marketing_events', 'mass_alerts', 'meetings/collaboration', 'order_notifications', 'outbound_dialer', 'pharmacy', 'phone_system', 'purchase_confirmation', 'remote_appointments', 'rewards_program', 'self-service', 'service_alerts', 'shift_management', 'survey/research', 'telehealth', 'telemarketing', 'therapy_(individual+group)'. + :param str business_profile_identity: A Business Identity of the calls. Is of type enum. One of 'direct_customer', 'isv_reseller_or_partner'. + :param str business_profile_industry: A Business Industry of the calls. Is of type enum. One of 'automotive', 'agriculture', 'banking', 'consumer', 'construction', 'education', 'engineering', 'energy', 'oil_and_gas', 'fast_moving_consumer_goods', 'financial', 'fintech', 'food_and_beverage', 'government', 'healthcare', 'hospitality', 'insurance', 'legal', 'manufacturing', 'media', 'online', 'professional_services', 'raw_materials', 'real_estate', 'religion', 'retail', 'jewelry', 'technology', 'telecommunications', 'transportation', 'travel', 'electronics', 'not_for_profit' + :param str business_profile_bundle_sid: A unique SID identifier of the Business Profile. + :param str business_profile_type: A Business Profile Type of the calls. Is of type enum. One of 'primary', 'secondary'. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + from_=from_, + to=to, + from_carrier=from_carrier, + to_carrier=to_carrier, + from_country_code=from_country_code, + to_country_code=to_country_code, + verified_caller=verified_caller, + has_tag=has_tag, + start_time=start_time, + end_time=end_time, + call_type=call_type, + call_state=call_state, + direction=direction, + processing_state=processing_state, + sort_by=sort_by, + subaccount=subaccount, + abnormal_session=abnormal_session, + answered_by=answered_by, + answered_by_annotation=answered_by_annotation, + connectivity_issue_annotation=connectivity_issue_annotation, + quality_issue_annotation=quality_issue_annotation, + spam_annotation=spam_annotation, + call_score_annotation=call_score_annotation, + branded_enabled=branded_enabled, + voice_integrity_enabled=voice_integrity_enabled, + branded_bundle_sid=branded_bundle_sid, + voice_integrity_bundle_sid=voice_integrity_bundle_sid, + voice_integrity_use_case=voice_integrity_use_case, + business_profile_identity=business_profile_identity, + business_profile_industry=business_profile_industry, + business_profile_bundle_sid=business_profile_bundle_sid, + business_profile_type=business_profile_type, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + from_: Union[str, object] = values.unset, + to: Union[str, object] = values.unset, + from_carrier: Union[str, object] = values.unset, + to_carrier: Union[str, object] = values.unset, + from_country_code: Union[str, object] = values.unset, + to_country_code: Union[str, object] = values.unset, + verified_caller: Union[bool, object] = values.unset, + has_tag: Union[bool, object] = values.unset, + start_time: Union[str, object] = values.unset, + end_time: Union[str, object] = values.unset, + call_type: Union[str, object] = values.unset, + call_state: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + processing_state: Union[ + "CallSummariesInstance.ProcessingStateRequest", object + ] = values.unset, + sort_by: Union["CallSummariesInstance.SortBy", object] = values.unset, + subaccount: Union[str, object] = values.unset, + abnormal_session: Union[bool, object] = values.unset, + answered_by: Union["CallSummariesInstance.AnsweredBy", object] = values.unset, + answered_by_annotation: Union[str, object] = values.unset, + connectivity_issue_annotation: Union[str, object] = values.unset, + quality_issue_annotation: Union[str, object] = values.unset, + spam_annotation: Union[bool, object] = values.unset, + call_score_annotation: Union[str, object] = values.unset, + branded_enabled: Union[bool, object] = values.unset, + voice_integrity_enabled: Union[bool, object] = values.unset, + branded_bundle_sid: Union[str, object] = values.unset, + voice_integrity_bundle_sid: Union[str, object] = values.unset, + voice_integrity_use_case: Union[str, object] = values.unset, + business_profile_identity: Union[str, object] = values.unset, + business_profile_industry: Union[str, object] = values.unset, + business_profile_bundle_sid: Union[str, object] = values.unset, + business_profile_type: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CallSummariesInstance]: + """ + Asynchronously lists CallSummariesInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str from_: A calling party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param str to: A called party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param str from_carrier: An origination carrier. + :param str to_carrier: A destination carrier. + :param str from_country_code: A source country code based on phone number in From. + :param str to_country_code: A destination country code. Based on phone number in To. + :param bool verified_caller: A boolean flag indicating whether or not the caller was verified using SHAKEN/STIR.One of 'true' or 'false'. + :param bool has_tag: A boolean flag indicating the presence of one or more [Voice Insights Call Tags](https://www.twilio.com/docs/voice/voice-insights/api/call/details-call-tags). + :param str start_time: A Start time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 4h. + :param str end_time: An End Time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 0m. + :param str call_type: A Call Type of the calls. One of `carrier`, `sip`, `trunking` or `client`. + :param str call_state: A Call State of the calls. One of `ringing`, `completed`, `busy`, `fail`, `noanswer`, `canceled`, `answered`, `undialed`. + :param str direction: A Direction of the calls. One of `outbound_api`, `outbound_dial`, `inbound`, `trunking_originating`, `trunking_terminating`. + :param "CallSummariesInstance.ProcessingStateRequest" processing_state: A Processing State of the Call Summaries. One of `completed`, `partial` or `all`. + :param "CallSummariesInstance.SortBy" sort_by: A Sort By criterion for the returned list of Call Summaries. One of `start_time` or `end_time`. + :param str subaccount: A unique SID identifier of a Subaccount. + :param bool abnormal_session: A boolean flag indicating an abnormal session where the last SIP response was not 200 OK. + :param "CallSummariesInstance.AnsweredBy" answered_by: An Answered By value for the calls based on `Answering Machine Detection (AMD)`. One of `unknown`, `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`, `human` or `fax`. + :param str answered_by_annotation: Either machine or human. + :param str connectivity_issue_annotation: A Connectivity Issue with the calls. One of `no_connectivity_issue`, `invalid_number`, `caller_id`, `dropped_call`, or `number_reachability`. + :param str quality_issue_annotation: A subjective Quality Issue with the calls. One of `no_quality_issue`, `low_volume`, `choppy_robotic`, `echo`, `dtmf`, `latency`, `owa`, `static_noise`. + :param bool spam_annotation: A boolean flag indicating spam calls. + :param str call_score_annotation: A Call Score of the calls. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for the rated call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + :param bool branded_enabled: A boolean flag indicating whether or not the calls were branded using Twilio Branded Calls. One of 'true' or 'false' + :param bool voice_integrity_enabled: A boolean flag indicating whether or not the phone number had voice integrity enabled.One of 'true' or 'false' + :param str branded_bundle_sid: A unique SID identifier of the Branded Call. + :param str voice_integrity_bundle_sid: A unique SID identifier of the Voice Integrity Profile. + :param str voice_integrity_use_case: A Voice Integrity Use Case . Is of type enum. One of 'abandoned_cart', 'appointment_reminders', 'appointment_scheduling', 'asset_management', 'automated_support', 'call_tracking', 'click_to_call', 'contact_tracing', 'contactless_delivery', 'customer_support', 'dating/social', 'delivery_notifications', 'distance_learning', 'emergency_notifications', 'employee_notifications', 'exam_proctoring', 'field_notifications', 'first_responder', 'fraud_alerts', 'group_messaging', 'identify_&_verification', 'intelligent_routing', 'lead_alerts', 'lead_distribution', 'lead_generation', 'lead_management', 'lead_nurturing', 'marketing_events', 'mass_alerts', 'meetings/collaboration', 'order_notifications', 'outbound_dialer', 'pharmacy', 'phone_system', 'purchase_confirmation', 'remote_appointments', 'rewards_program', 'self-service', 'service_alerts', 'shift_management', 'survey/research', 'telehealth', 'telemarketing', 'therapy_(individual+group)'. + :param str business_profile_identity: A Business Identity of the calls. Is of type enum. One of 'direct_customer', 'isv_reseller_or_partner'. + :param str business_profile_industry: A Business Industry of the calls. Is of type enum. One of 'automotive', 'agriculture', 'banking', 'consumer', 'construction', 'education', 'engineering', 'energy', 'oil_and_gas', 'fast_moving_consumer_goods', 'financial', 'fintech', 'food_and_beverage', 'government', 'healthcare', 'hospitality', 'insurance', 'legal', 'manufacturing', 'media', 'online', 'professional_services', 'raw_materials', 'real_estate', 'religion', 'retail', 'jewelry', 'technology', 'telecommunications', 'transportation', 'travel', 'electronics', 'not_for_profit' + :param str business_profile_bundle_sid: A unique SID identifier of the Business Profile. + :param str business_profile_type: A Business Profile Type of the calls. Is of type enum. One of 'primary', 'secondary'. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + from_=from_, + to=to, + from_carrier=from_carrier, + to_carrier=to_carrier, + from_country_code=from_country_code, + to_country_code=to_country_code, + verified_caller=verified_caller, + has_tag=has_tag, + start_time=start_time, + end_time=end_time, + call_type=call_type, + call_state=call_state, + direction=direction, + processing_state=processing_state, + sort_by=sort_by, + subaccount=subaccount, + abnormal_session=abnormal_session, + answered_by=answered_by, + answered_by_annotation=answered_by_annotation, + connectivity_issue_annotation=connectivity_issue_annotation, + quality_issue_annotation=quality_issue_annotation, + spam_annotation=spam_annotation, + call_score_annotation=call_score_annotation, + branded_enabled=branded_enabled, + voice_integrity_enabled=voice_integrity_enabled, + branded_bundle_sid=branded_bundle_sid, + voice_integrity_bundle_sid=voice_integrity_bundle_sid, + voice_integrity_use_case=voice_integrity_use_case, + business_profile_identity=business_profile_identity, + business_profile_industry=business_profile_industry, + business_profile_bundle_sid=business_profile_bundle_sid, + business_profile_type=business_profile_type, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + from_: Union[str, object] = values.unset, + to: Union[str, object] = values.unset, + from_carrier: Union[str, object] = values.unset, + to_carrier: Union[str, object] = values.unset, + from_country_code: Union[str, object] = values.unset, + to_country_code: Union[str, object] = values.unset, + verified_caller: Union[bool, object] = values.unset, + has_tag: Union[bool, object] = values.unset, + start_time: Union[str, object] = values.unset, + end_time: Union[str, object] = values.unset, + call_type: Union[str, object] = values.unset, + call_state: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + processing_state: Union[ + "CallSummariesInstance.ProcessingStateRequest", object + ] = values.unset, + sort_by: Union["CallSummariesInstance.SortBy", object] = values.unset, + subaccount: Union[str, object] = values.unset, + abnormal_session: Union[bool, object] = values.unset, + answered_by: Union["CallSummariesInstance.AnsweredBy", object] = values.unset, + answered_by_annotation: Union[str, object] = values.unset, + connectivity_issue_annotation: Union[str, object] = values.unset, + quality_issue_annotation: Union[str, object] = values.unset, + spam_annotation: Union[bool, object] = values.unset, + call_score_annotation: Union[str, object] = values.unset, + branded_enabled: Union[bool, object] = values.unset, + voice_integrity_enabled: Union[bool, object] = values.unset, + branded_bundle_sid: Union[str, object] = values.unset, + voice_integrity_bundle_sid: Union[str, object] = values.unset, + voice_integrity_use_case: Union[str, object] = values.unset, + business_profile_identity: Union[str, object] = values.unset, + business_profile_industry: Union[str, object] = values.unset, + business_profile_bundle_sid: Union[str, object] = values.unset, + business_profile_type: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CallSummariesPage: + """ + Retrieve a single page of CallSummariesInstance records from the API. + Request is executed immediately + + :param from_: A calling party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param to: A called party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param from_carrier: An origination carrier. + :param to_carrier: A destination carrier. + :param from_country_code: A source country code based on phone number in From. + :param to_country_code: A destination country code. Based on phone number in To. + :param verified_caller: A boolean flag indicating whether or not the caller was verified using SHAKEN/STIR.One of 'true' or 'false'. + :param has_tag: A boolean flag indicating the presence of one or more [Voice Insights Call Tags](https://www.twilio.com/docs/voice/voice-insights/api/call/details-call-tags). + :param start_time: A Start time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 4h. + :param end_time: An End Time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 0m. + :param call_type: A Call Type of the calls. One of `carrier`, `sip`, `trunking` or `client`. + :param call_state: A Call State of the calls. One of `ringing`, `completed`, `busy`, `fail`, `noanswer`, `canceled`, `answered`, `undialed`. + :param direction: A Direction of the calls. One of `outbound_api`, `outbound_dial`, `inbound`, `trunking_originating`, `trunking_terminating`. + :param processing_state: A Processing State of the Call Summaries. One of `completed`, `partial` or `all`. + :param sort_by: A Sort By criterion for the returned list of Call Summaries. One of `start_time` or `end_time`. + :param subaccount: A unique SID identifier of a Subaccount. + :param abnormal_session: A boolean flag indicating an abnormal session where the last SIP response was not 200 OK. + :param answered_by: An Answered By value for the calls based on `Answering Machine Detection (AMD)`. One of `unknown`, `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`, `human` or `fax`. + :param answered_by_annotation: Either machine or human. + :param connectivity_issue_annotation: A Connectivity Issue with the calls. One of `no_connectivity_issue`, `invalid_number`, `caller_id`, `dropped_call`, or `number_reachability`. + :param quality_issue_annotation: A subjective Quality Issue with the calls. One of `no_quality_issue`, `low_volume`, `choppy_robotic`, `echo`, `dtmf`, `latency`, `owa`, `static_noise`. + :param spam_annotation: A boolean flag indicating spam calls. + :param call_score_annotation: A Call Score of the calls. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for the rated call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + :param branded_enabled: A boolean flag indicating whether or not the calls were branded using Twilio Branded Calls. One of 'true' or 'false' + :param voice_integrity_enabled: A boolean flag indicating whether or not the phone number had voice integrity enabled.One of 'true' or 'false' + :param branded_bundle_sid: A unique SID identifier of the Branded Call. + :param voice_integrity_bundle_sid: A unique SID identifier of the Voice Integrity Profile. + :param voice_integrity_use_case: A Voice Integrity Use Case . Is of type enum. One of 'abandoned_cart', 'appointment_reminders', 'appointment_scheduling', 'asset_management', 'automated_support', 'call_tracking', 'click_to_call', 'contact_tracing', 'contactless_delivery', 'customer_support', 'dating/social', 'delivery_notifications', 'distance_learning', 'emergency_notifications', 'employee_notifications', 'exam_proctoring', 'field_notifications', 'first_responder', 'fraud_alerts', 'group_messaging', 'identify_&_verification', 'intelligent_routing', 'lead_alerts', 'lead_distribution', 'lead_generation', 'lead_management', 'lead_nurturing', 'marketing_events', 'mass_alerts', 'meetings/collaboration', 'order_notifications', 'outbound_dialer', 'pharmacy', 'phone_system', 'purchase_confirmation', 'remote_appointments', 'rewards_program', 'self-service', 'service_alerts', 'shift_management', 'survey/research', 'telehealth', 'telemarketing', 'therapy_(individual+group)'. + :param business_profile_identity: A Business Identity of the calls. Is of type enum. One of 'direct_customer', 'isv_reseller_or_partner'. + :param business_profile_industry: A Business Industry of the calls. Is of type enum. One of 'automotive', 'agriculture', 'banking', 'consumer', 'construction', 'education', 'engineering', 'energy', 'oil_and_gas', 'fast_moving_consumer_goods', 'financial', 'fintech', 'food_and_beverage', 'government', 'healthcare', 'hospitality', 'insurance', 'legal', 'manufacturing', 'media', 'online', 'professional_services', 'raw_materials', 'real_estate', 'religion', 'retail', 'jewelry', 'technology', 'telecommunications', 'transportation', 'travel', 'electronics', 'not_for_profit' + :param business_profile_bundle_sid: A unique SID identifier of the Business Profile. + :param business_profile_type: A Business Profile Type of the calls. Is of type enum. One of 'primary', 'secondary'. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CallSummariesInstance + """ + data = values.of( + { + "From": from_, + "To": to, + "FromCarrier": from_carrier, + "ToCarrier": to_carrier, + "FromCountryCode": from_country_code, + "ToCountryCode": to_country_code, + "VerifiedCaller": serialize.boolean_to_string(verified_caller), + "HasTag": serialize.boolean_to_string(has_tag), + "StartTime": start_time, + "EndTime": end_time, + "CallType": call_type, + "CallState": call_state, + "Direction": direction, + "ProcessingState": processing_state, + "SortBy": sort_by, + "Subaccount": subaccount, + "AbnormalSession": serialize.boolean_to_string(abnormal_session), + "AnsweredBy": answered_by, + "AnsweredByAnnotation": answered_by_annotation, + "ConnectivityIssueAnnotation": connectivity_issue_annotation, + "QualityIssueAnnotation": quality_issue_annotation, + "SpamAnnotation": serialize.boolean_to_string(spam_annotation), + "CallScoreAnnotation": call_score_annotation, + "BrandedEnabled": serialize.boolean_to_string(branded_enabled), + "VoiceIntegrityEnabled": serialize.boolean_to_string( + voice_integrity_enabled + ), + "BrandedBundleSid": branded_bundle_sid, + "VoiceIntegrityBundleSid": voice_integrity_bundle_sid, + "VoiceIntegrityUseCase": voice_integrity_use_case, + "BusinessProfileIdentity": business_profile_identity, + "BusinessProfileIndustry": business_profile_industry, + "BusinessProfileBundleSid": business_profile_bundle_sid, + "BusinessProfileType": business_profile_type, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CallSummariesPage(self._version, response) + + async def page_async( + self, + from_: Union[str, object] = values.unset, + to: Union[str, object] = values.unset, + from_carrier: Union[str, object] = values.unset, + to_carrier: Union[str, object] = values.unset, + from_country_code: Union[str, object] = values.unset, + to_country_code: Union[str, object] = values.unset, + verified_caller: Union[bool, object] = values.unset, + has_tag: Union[bool, object] = values.unset, + start_time: Union[str, object] = values.unset, + end_time: Union[str, object] = values.unset, + call_type: Union[str, object] = values.unset, + call_state: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + processing_state: Union[ + "CallSummariesInstance.ProcessingStateRequest", object + ] = values.unset, + sort_by: Union["CallSummariesInstance.SortBy", object] = values.unset, + subaccount: Union[str, object] = values.unset, + abnormal_session: Union[bool, object] = values.unset, + answered_by: Union["CallSummariesInstance.AnsweredBy", object] = values.unset, + answered_by_annotation: Union[str, object] = values.unset, + connectivity_issue_annotation: Union[str, object] = values.unset, + quality_issue_annotation: Union[str, object] = values.unset, + spam_annotation: Union[bool, object] = values.unset, + call_score_annotation: Union[str, object] = values.unset, + branded_enabled: Union[bool, object] = values.unset, + voice_integrity_enabled: Union[bool, object] = values.unset, + branded_bundle_sid: Union[str, object] = values.unset, + voice_integrity_bundle_sid: Union[str, object] = values.unset, + voice_integrity_use_case: Union[str, object] = values.unset, + business_profile_identity: Union[str, object] = values.unset, + business_profile_industry: Union[str, object] = values.unset, + business_profile_bundle_sid: Union[str, object] = values.unset, + business_profile_type: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CallSummariesPage: + """ + Asynchronously retrieve a single page of CallSummariesInstance records from the API. + Request is executed immediately + + :param from_: A calling party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param to: A called party. Could be an E.164 number, a SIP URI, or a Twilio Client registered name. + :param from_carrier: An origination carrier. + :param to_carrier: A destination carrier. + :param from_country_code: A source country code based on phone number in From. + :param to_country_code: A destination country code. Based on phone number in To. + :param verified_caller: A boolean flag indicating whether or not the caller was verified using SHAKEN/STIR.One of 'true' or 'false'. + :param has_tag: A boolean flag indicating the presence of one or more [Voice Insights Call Tags](https://www.twilio.com/docs/voice/voice-insights/api/call/details-call-tags). + :param start_time: A Start time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 4h. + :param end_time: An End Time of the calls. xm (x minutes), xh (x hours), xd (x days), 1w, 30m, 3d, 4w or datetime-ISO. Defaults to 0m. + :param call_type: A Call Type of the calls. One of `carrier`, `sip`, `trunking` or `client`. + :param call_state: A Call State of the calls. One of `ringing`, `completed`, `busy`, `fail`, `noanswer`, `canceled`, `answered`, `undialed`. + :param direction: A Direction of the calls. One of `outbound_api`, `outbound_dial`, `inbound`, `trunking_originating`, `trunking_terminating`. + :param processing_state: A Processing State of the Call Summaries. One of `completed`, `partial` or `all`. + :param sort_by: A Sort By criterion for the returned list of Call Summaries. One of `start_time` or `end_time`. + :param subaccount: A unique SID identifier of a Subaccount. + :param abnormal_session: A boolean flag indicating an abnormal session where the last SIP response was not 200 OK. + :param answered_by: An Answered By value for the calls based on `Answering Machine Detection (AMD)`. One of `unknown`, `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`, `human` or `fax`. + :param answered_by_annotation: Either machine or human. + :param connectivity_issue_annotation: A Connectivity Issue with the calls. One of `no_connectivity_issue`, `invalid_number`, `caller_id`, `dropped_call`, or `number_reachability`. + :param quality_issue_annotation: A subjective Quality Issue with the calls. One of `no_quality_issue`, `low_volume`, `choppy_robotic`, `echo`, `dtmf`, `latency`, `owa`, `static_noise`. + :param spam_annotation: A boolean flag indicating spam calls. + :param call_score_annotation: A Call Score of the calls. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for the rated call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + :param branded_enabled: A boolean flag indicating whether or not the calls were branded using Twilio Branded Calls. One of 'true' or 'false' + :param voice_integrity_enabled: A boolean flag indicating whether or not the phone number had voice integrity enabled.One of 'true' or 'false' + :param branded_bundle_sid: A unique SID identifier of the Branded Call. + :param voice_integrity_bundle_sid: A unique SID identifier of the Voice Integrity Profile. + :param voice_integrity_use_case: A Voice Integrity Use Case . Is of type enum. One of 'abandoned_cart', 'appointment_reminders', 'appointment_scheduling', 'asset_management', 'automated_support', 'call_tracking', 'click_to_call', 'contact_tracing', 'contactless_delivery', 'customer_support', 'dating/social', 'delivery_notifications', 'distance_learning', 'emergency_notifications', 'employee_notifications', 'exam_proctoring', 'field_notifications', 'first_responder', 'fraud_alerts', 'group_messaging', 'identify_&_verification', 'intelligent_routing', 'lead_alerts', 'lead_distribution', 'lead_generation', 'lead_management', 'lead_nurturing', 'marketing_events', 'mass_alerts', 'meetings/collaboration', 'order_notifications', 'outbound_dialer', 'pharmacy', 'phone_system', 'purchase_confirmation', 'remote_appointments', 'rewards_program', 'self-service', 'service_alerts', 'shift_management', 'survey/research', 'telehealth', 'telemarketing', 'therapy_(individual+group)'. + :param business_profile_identity: A Business Identity of the calls. Is of type enum. One of 'direct_customer', 'isv_reseller_or_partner'. + :param business_profile_industry: A Business Industry of the calls. Is of type enum. One of 'automotive', 'agriculture', 'banking', 'consumer', 'construction', 'education', 'engineering', 'energy', 'oil_and_gas', 'fast_moving_consumer_goods', 'financial', 'fintech', 'food_and_beverage', 'government', 'healthcare', 'hospitality', 'insurance', 'legal', 'manufacturing', 'media', 'online', 'professional_services', 'raw_materials', 'real_estate', 'religion', 'retail', 'jewelry', 'technology', 'telecommunications', 'transportation', 'travel', 'electronics', 'not_for_profit' + :param business_profile_bundle_sid: A unique SID identifier of the Business Profile. + :param business_profile_type: A Business Profile Type of the calls. Is of type enum. One of 'primary', 'secondary'. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CallSummariesInstance + """ + data = values.of( + { + "From": from_, + "To": to, + "FromCarrier": from_carrier, + "ToCarrier": to_carrier, + "FromCountryCode": from_country_code, + "ToCountryCode": to_country_code, + "VerifiedCaller": serialize.boolean_to_string(verified_caller), + "HasTag": serialize.boolean_to_string(has_tag), + "StartTime": start_time, + "EndTime": end_time, + "CallType": call_type, + "CallState": call_state, + "Direction": direction, + "ProcessingState": processing_state, + "SortBy": sort_by, + "Subaccount": subaccount, + "AbnormalSession": serialize.boolean_to_string(abnormal_session), + "AnsweredBy": answered_by, + "AnsweredByAnnotation": answered_by_annotation, + "ConnectivityIssueAnnotation": connectivity_issue_annotation, + "QualityIssueAnnotation": quality_issue_annotation, + "SpamAnnotation": serialize.boolean_to_string(spam_annotation), + "CallScoreAnnotation": call_score_annotation, + "BrandedEnabled": serialize.boolean_to_string(branded_enabled), + "VoiceIntegrityEnabled": serialize.boolean_to_string( + voice_integrity_enabled + ), + "BrandedBundleSid": branded_bundle_sid, + "VoiceIntegrityBundleSid": voice_integrity_bundle_sid, + "VoiceIntegrityUseCase": voice_integrity_use_case, + "BusinessProfileIdentity": business_profile_identity, + "BusinessProfileIndustry": business_profile_industry, + "BusinessProfileBundleSid": business_profile_bundle_sid, + "BusinessProfileType": business_profile_type, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CallSummariesPage(self._version, response) + + def get_page(self, target_url: str) -> CallSummariesPage: + """ + Retrieve a specific page of CallSummariesInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CallSummariesInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CallSummariesPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CallSummariesPage: + """ + Asynchronously retrieve a specific page of CallSummariesInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CallSummariesInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CallSummariesPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/conference/__init__.py b/venv/Lib/site-packages/twilio/rest/insights/v1/conference/__init__.py new file mode 100644 index 00000000..ef3c51da --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/v1/conference/__init__.py @@ -0,0 +1,732 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Insights + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.insights.v1.conference.conference_participant import ( + ConferenceParticipantList, +) + + +class ConferenceInstance(InstanceResource): + + class ConferenceEndReason(object): + LAST_PARTICIPANT_LEFT = "last_participant_left" + CONFERENCE_ENDED_VIA_API = "conference_ended_via_api" + PARTICIPANT_WITH_END_CONFERENCE_ON_EXIT_LEFT = ( + "participant_with_end_conference_on_exit_left" + ) + LAST_PARTICIPANT_KICKED = "last_participant_kicked" + PARTICIPANT_WITH_END_CONFERENCE_ON_EXIT_KICKED = ( + "participant_with_end_conference_on_exit_kicked" + ) + + class ConferenceStatus(object): + IN_PROGRESS = "in_progress" + NOT_STARTED = "not_started" + COMPLETED = "completed" + SUMMARY_TIMEOUT = "summary_timeout" + + class ProcessingState(object): + COMPLETE = "complete" + IN_PROGRESS = "in_progress" + TIMEOUT = "timeout" + + class Region(object): + US1 = "us1" + US2 = "us2" + AU1 = "au1" + BR1 = "br1" + IE1 = "ie1" + JP1 = "jp1" + SG1 = "sg1" + DE1 = "de1" + IN1 = "in1" + + class Tag(object): + INVALID_REQUESTED_REGION = "invalid_requested_region" + DUPLICATE_IDENTITY = "duplicate_identity" + START_FAILURE = "start_failure" + REGION_CONFIGURATION_ISSUES = "region_configuration_issues" + QUALITY_WARNINGS = "quality_warnings" + PARTICIPANT_BEHAVIOR_ISSUES = "participant_behavior_issues" + HIGH_PACKET_LOSS = "high_packet_loss" + HIGH_JITTER = "high_jitter" + HIGH_LATENCY = "high_latency" + LOW_MOS = "low_mos" + DETECTED_SILENCE = "detected_silence" + NO_CONCURRENT_PARTICIPANTS = "no_concurrent_participants" + + """ + :ivar conference_sid: The unique SID identifier of the Conference. + :ivar account_sid: The unique SID identifier of the Account. + :ivar friendly_name: Custom label for the conference resource, up to 64 characters. + :ivar create_time: Conference creation date and time in ISO 8601 format. + :ivar start_time: Timestamp in ISO 8601 format when the conference started. Conferences do not start until at least two participants join, at least one of whom has startConferenceOnEnter=true. + :ivar end_time: Conference end date and time in ISO 8601 format. + :ivar duration_seconds: Conference duration in seconds. + :ivar connect_duration_seconds: Duration of the between conference start event and conference end event in seconds. + :ivar status: + :ivar max_participants: Maximum number of concurrent participants as specified by the configuration. + :ivar max_concurrent_participants: Actual maximum number of concurrent participants in the conference. + :ivar unique_participants: Unique conference participants based on caller ID. + :ivar end_reason: + :ivar ended_by: Call SID of the participant whose actions ended the conference. + :ivar mixer_region: + :ivar mixer_region_requested: + :ivar recording_enabled: Boolean. Indicates whether recording was enabled at the conference mixer. + :ivar detected_issues: Potential issues detected by Twilio during the conference. + :ivar tags: Tags for detected conference conditions and participant behaviors which may be of interest. + :ivar tag_info: Object. Contains details about conference tags including severity. + :ivar processing_state: + :ivar url: The URL of this resource. + :ivar links: Contains a dictionary of URL links to nested resources of this Conference. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + conference_sid: Optional[str] = None, + ): + super().__init__(version) + + self.conference_sid: Optional[str] = payload.get("conference_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.create_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("create_time") + ) + self.start_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("start_time") + ) + self.end_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("end_time") + ) + self.duration_seconds: Optional[int] = deserialize.integer( + payload.get("duration_seconds") + ) + self.connect_duration_seconds: Optional[int] = deserialize.integer( + payload.get("connect_duration_seconds") + ) + self.status: Optional["ConferenceInstance.ConferenceStatus"] = payload.get( + "status" + ) + self.max_participants: Optional[int] = deserialize.integer( + payload.get("max_participants") + ) + self.max_concurrent_participants: Optional[int] = deserialize.integer( + payload.get("max_concurrent_participants") + ) + self.unique_participants: Optional[int] = deserialize.integer( + payload.get("unique_participants") + ) + self.end_reason: Optional["ConferenceInstance.ConferenceEndReason"] = ( + payload.get("end_reason") + ) + self.ended_by: Optional[str] = payload.get("ended_by") + self.mixer_region: Optional["ConferenceInstance.Region"] = payload.get( + "mixer_region" + ) + self.mixer_region_requested: Optional["ConferenceInstance.Region"] = ( + payload.get("mixer_region_requested") + ) + self.recording_enabled: Optional[bool] = payload.get("recording_enabled") + self.detected_issues: Optional[Dict[str, object]] = payload.get( + "detected_issues" + ) + self.tags: Optional[List["ConferenceInstance.Tag"]] = payload.get("tags") + self.tag_info: Optional[Dict[str, object]] = payload.get("tag_info") + self.processing_state: Optional["ConferenceInstance.ProcessingState"] = ( + payload.get("processing_state") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "conference_sid": conference_sid or self.conference_sid, + } + self._context: Optional[ConferenceContext] = None + + @property + def _proxy(self) -> "ConferenceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ConferenceContext for this ConferenceInstance + """ + if self._context is None: + self._context = ConferenceContext( + self._version, + conference_sid=self._solution["conference_sid"], + ) + return self._context + + def fetch(self) -> "ConferenceInstance": + """ + Fetch the ConferenceInstance + + + :returns: The fetched ConferenceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ConferenceInstance": + """ + Asynchronous coroutine to fetch the ConferenceInstance + + + :returns: The fetched ConferenceInstance + """ + return await self._proxy.fetch_async() + + @property + def conference_participants(self) -> ConferenceParticipantList: + """ + Access the conference_participants + """ + return self._proxy.conference_participants + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConferenceContext(InstanceContext): + + def __init__(self, version: Version, conference_sid: str): + """ + Initialize the ConferenceContext + + :param version: Version that contains the resource + :param conference_sid: The unique SID identifier of the Conference. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conference_sid": conference_sid, + } + self._uri = "/Conferences/{conference_sid}".format(**self._solution) + + self._conference_participants: Optional[ConferenceParticipantList] = None + + def fetch(self) -> ConferenceInstance: + """ + Fetch the ConferenceInstance + + + :returns: The fetched ConferenceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ConferenceInstance( + self._version, + payload, + conference_sid=self._solution["conference_sid"], + ) + + async def fetch_async(self) -> ConferenceInstance: + """ + Asynchronous coroutine to fetch the ConferenceInstance + + + :returns: The fetched ConferenceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ConferenceInstance( + self._version, + payload, + conference_sid=self._solution["conference_sid"], + ) + + @property + def conference_participants(self) -> ConferenceParticipantList: + """ + Access the conference_participants + """ + if self._conference_participants is None: + self._conference_participants = ConferenceParticipantList( + self._version, + self._solution["conference_sid"], + ) + return self._conference_participants + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConferencePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ConferenceInstance: + """ + Build an instance of ConferenceInstance + + :param payload: Payload response from the API + """ + return ConferenceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ConferenceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ConferenceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Conferences" + + def stream( + self, + conference_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + created_after: Union[str, object] = values.unset, + created_before: Union[str, object] = values.unset, + mixer_region: Union[str, object] = values.unset, + tags: Union[str, object] = values.unset, + subaccount: Union[str, object] = values.unset, + detected_issues: Union[str, object] = values.unset, + end_reason: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ConferenceInstance]: + """ + Streams ConferenceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str conference_sid: The SID of the conference. + :param str friendly_name: Custom label for the conference resource, up to 64 characters. + :param str status: Conference status. + :param str created_after: Conferences created after the provided timestamp specified in ISO 8601 format + :param str created_before: Conferences created before the provided timestamp specified in ISO 8601 format. + :param str mixer_region: Twilio region where the conference media was mixed. + :param str tags: Tags applied by Twilio for common potential configuration, quality, or performance issues. + :param str subaccount: Account SID for the subaccount whose resources you wish to retrieve. + :param str detected_issues: Potential configuration, behavior, or performance issues detected during the conference. + :param str end_reason: Conference end reason; e.g. last participant left, modified by API, etc. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + conference_sid=conference_sid, + friendly_name=friendly_name, + status=status, + created_after=created_after, + created_before=created_before, + mixer_region=mixer_region, + tags=tags, + subaccount=subaccount, + detected_issues=detected_issues, + end_reason=end_reason, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + conference_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + created_after: Union[str, object] = values.unset, + created_before: Union[str, object] = values.unset, + mixer_region: Union[str, object] = values.unset, + tags: Union[str, object] = values.unset, + subaccount: Union[str, object] = values.unset, + detected_issues: Union[str, object] = values.unset, + end_reason: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ConferenceInstance]: + """ + Asynchronously streams ConferenceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str conference_sid: The SID of the conference. + :param str friendly_name: Custom label for the conference resource, up to 64 characters. + :param str status: Conference status. + :param str created_after: Conferences created after the provided timestamp specified in ISO 8601 format + :param str created_before: Conferences created before the provided timestamp specified in ISO 8601 format. + :param str mixer_region: Twilio region where the conference media was mixed. + :param str tags: Tags applied by Twilio for common potential configuration, quality, or performance issues. + :param str subaccount: Account SID for the subaccount whose resources you wish to retrieve. + :param str detected_issues: Potential configuration, behavior, or performance issues detected during the conference. + :param str end_reason: Conference end reason; e.g. last participant left, modified by API, etc. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + conference_sid=conference_sid, + friendly_name=friendly_name, + status=status, + created_after=created_after, + created_before=created_before, + mixer_region=mixer_region, + tags=tags, + subaccount=subaccount, + detected_issues=detected_issues, + end_reason=end_reason, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + conference_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + created_after: Union[str, object] = values.unset, + created_before: Union[str, object] = values.unset, + mixer_region: Union[str, object] = values.unset, + tags: Union[str, object] = values.unset, + subaccount: Union[str, object] = values.unset, + detected_issues: Union[str, object] = values.unset, + end_reason: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConferenceInstance]: + """ + Lists ConferenceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str conference_sid: The SID of the conference. + :param str friendly_name: Custom label for the conference resource, up to 64 characters. + :param str status: Conference status. + :param str created_after: Conferences created after the provided timestamp specified in ISO 8601 format + :param str created_before: Conferences created before the provided timestamp specified in ISO 8601 format. + :param str mixer_region: Twilio region where the conference media was mixed. + :param str tags: Tags applied by Twilio for common potential configuration, quality, or performance issues. + :param str subaccount: Account SID for the subaccount whose resources you wish to retrieve. + :param str detected_issues: Potential configuration, behavior, or performance issues detected during the conference. + :param str end_reason: Conference end reason; e.g. last participant left, modified by API, etc. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + conference_sid=conference_sid, + friendly_name=friendly_name, + status=status, + created_after=created_after, + created_before=created_before, + mixer_region=mixer_region, + tags=tags, + subaccount=subaccount, + detected_issues=detected_issues, + end_reason=end_reason, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + conference_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + created_after: Union[str, object] = values.unset, + created_before: Union[str, object] = values.unset, + mixer_region: Union[str, object] = values.unset, + tags: Union[str, object] = values.unset, + subaccount: Union[str, object] = values.unset, + detected_issues: Union[str, object] = values.unset, + end_reason: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConferenceInstance]: + """ + Asynchronously lists ConferenceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str conference_sid: The SID of the conference. + :param str friendly_name: Custom label for the conference resource, up to 64 characters. + :param str status: Conference status. + :param str created_after: Conferences created after the provided timestamp specified in ISO 8601 format + :param str created_before: Conferences created before the provided timestamp specified in ISO 8601 format. + :param str mixer_region: Twilio region where the conference media was mixed. + :param str tags: Tags applied by Twilio for common potential configuration, quality, or performance issues. + :param str subaccount: Account SID for the subaccount whose resources you wish to retrieve. + :param str detected_issues: Potential configuration, behavior, or performance issues detected during the conference. + :param str end_reason: Conference end reason; e.g. last participant left, modified by API, etc. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + conference_sid=conference_sid, + friendly_name=friendly_name, + status=status, + created_after=created_after, + created_before=created_before, + mixer_region=mixer_region, + tags=tags, + subaccount=subaccount, + detected_issues=detected_issues, + end_reason=end_reason, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + conference_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + created_after: Union[str, object] = values.unset, + created_before: Union[str, object] = values.unset, + mixer_region: Union[str, object] = values.unset, + tags: Union[str, object] = values.unset, + subaccount: Union[str, object] = values.unset, + detected_issues: Union[str, object] = values.unset, + end_reason: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConferencePage: + """ + Retrieve a single page of ConferenceInstance records from the API. + Request is executed immediately + + :param conference_sid: The SID of the conference. + :param friendly_name: Custom label for the conference resource, up to 64 characters. + :param status: Conference status. + :param created_after: Conferences created after the provided timestamp specified in ISO 8601 format + :param created_before: Conferences created before the provided timestamp specified in ISO 8601 format. + :param mixer_region: Twilio region where the conference media was mixed. + :param tags: Tags applied by Twilio for common potential configuration, quality, or performance issues. + :param subaccount: Account SID for the subaccount whose resources you wish to retrieve. + :param detected_issues: Potential configuration, behavior, or performance issues detected during the conference. + :param end_reason: Conference end reason; e.g. last participant left, modified by API, etc. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConferenceInstance + """ + data = values.of( + { + "ConferenceSid": conference_sid, + "FriendlyName": friendly_name, + "Status": status, + "CreatedAfter": created_after, + "CreatedBefore": created_before, + "MixerRegion": mixer_region, + "Tags": tags, + "Subaccount": subaccount, + "DetectedIssues": detected_issues, + "EndReason": end_reason, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConferencePage(self._version, response) + + async def page_async( + self, + conference_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + created_after: Union[str, object] = values.unset, + created_before: Union[str, object] = values.unset, + mixer_region: Union[str, object] = values.unset, + tags: Union[str, object] = values.unset, + subaccount: Union[str, object] = values.unset, + detected_issues: Union[str, object] = values.unset, + end_reason: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConferencePage: + """ + Asynchronously retrieve a single page of ConferenceInstance records from the API. + Request is executed immediately + + :param conference_sid: The SID of the conference. + :param friendly_name: Custom label for the conference resource, up to 64 characters. + :param status: Conference status. + :param created_after: Conferences created after the provided timestamp specified in ISO 8601 format + :param created_before: Conferences created before the provided timestamp specified in ISO 8601 format. + :param mixer_region: Twilio region where the conference media was mixed. + :param tags: Tags applied by Twilio for common potential configuration, quality, or performance issues. + :param subaccount: Account SID for the subaccount whose resources you wish to retrieve. + :param detected_issues: Potential configuration, behavior, or performance issues detected during the conference. + :param end_reason: Conference end reason; e.g. last participant left, modified by API, etc. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConferenceInstance + """ + data = values.of( + { + "ConferenceSid": conference_sid, + "FriendlyName": friendly_name, + "Status": status, + "CreatedAfter": created_after, + "CreatedBefore": created_before, + "MixerRegion": mixer_region, + "Tags": tags, + "Subaccount": subaccount, + "DetectedIssues": detected_issues, + "EndReason": end_reason, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConferencePage(self._version, response) + + def get_page(self, target_url: str) -> ConferencePage: + """ + Retrieve a specific page of ConferenceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConferenceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ConferencePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ConferencePage: + """ + Asynchronously retrieve a specific page of ConferenceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConferenceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ConferencePage(self._version, response) + + def get(self, conference_sid: str) -> ConferenceContext: + """ + Constructs a ConferenceContext + + :param conference_sid: The unique SID identifier of the Conference. + """ + return ConferenceContext(self._version, conference_sid=conference_sid) + + def __call__(self, conference_sid: str) -> ConferenceContext: + """ + Constructs a ConferenceContext + + :param conference_sid: The unique SID identifier of the Conference. + """ + return ConferenceContext(self._version, conference_sid=conference_sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/conference/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/insights/v1/conference/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64d4d8346c11462ee7dd6f2e60483bc1091140c1 GIT binary patch literal 33438 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 N2ps=_qc>~K{{uWD!k+*D literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/conference/__pycache__/conference_participant.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/insights/v1/conference/__pycache__/conference_participant.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d4e6d8cb52508357b63d817d941b9d4cfcaec14 GIT binary patch literal 27647 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 M*8e%jGORQI9~&g`tpET3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/conference/conference_participant.py b/venv/Lib/site-packages/twilio/rest/insights/v1/conference/conference_participant.py new file mode 100644 index 00000000..171f4f1f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/v1/conference/conference_participant.py @@ -0,0 +1,655 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Insights + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ConferenceParticipantInstance(InstanceResource): + + class CallDirection(object): + INBOUND = "inbound" + OUTBOUND = "outbound" + + class CallStatus(object): + ANSWERED = "answered" + COMPLETED = "completed" + BUSY = "busy" + FAIL = "fail" + NOANSWER = "noanswer" + RINGING = "ringing" + CANCELED = "canceled" + + class CallType(object): + CARRIER = "carrier" + CLIENT = "client" + SIP = "sip" + + class JitterBufferSize(object): + LARGE = "large" + SMALL = "small" + MEDIUM = "medium" + OFF = "off" + + class ProcessingState(object): + COMPLETE = "complete" + IN_PROGRESS = "in_progress" + TIMEOUT = "timeout" + + class Region(object): + US1 = "us1" + US2 = "us2" + AU1 = "au1" + BR1 = "br1" + IE1 = "ie1" + JP1 = "jp1" + SG1 = "sg1" + DE1 = "de1" + IN1 = "in1" + + """ + :ivar participant_sid: SID for this participant. + :ivar label: The user-specified label of this participant. + :ivar conference_sid: The unique SID identifier of the Conference. + :ivar call_sid: Unique SID identifier of the call that generated the Participant resource. + :ivar account_sid: The unique SID identifier of the Account. + :ivar call_direction: + :ivar _from: Caller ID of the calling party. + :ivar to: Called party. + :ivar call_status: + :ivar country_code: ISO alpha-2 country code of the participant based on caller ID or called number. + :ivar is_moderator: Boolean. Indicates whether participant had startConferenceOnEnter=true or endConferenceOnExit=true. + :ivar join_time: ISO 8601 timestamp of participant join event. + :ivar leave_time: ISO 8601 timestamp of participant leave event. + :ivar duration_seconds: Participant durations in seconds. + :ivar outbound_queue_length: Add Participant API only. Estimated time in queue at call creation. + :ivar outbound_time_in_queue: Add Participant API only. Actual time in queue in seconds. + :ivar jitter_buffer_size: + :ivar is_coach: Boolean. Indicated whether participant was a coach. + :ivar coached_participants: Call SIDs coached by this participant. + :ivar participant_region: + :ivar conference_region: + :ivar call_type: + :ivar processing_state: + :ivar properties: Participant properties and metadata. + :ivar events: Object containing information of actions taken by participants. Contains a dictionary of URL links to nested resources of this Conference Participant. + :ivar metrics: Object. Contains participant call quality metrics. + :ivar url: The URL of this resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + conference_sid: str, + participant_sid: Optional[str] = None, + ): + super().__init__(version) + + self.participant_sid: Optional[str] = payload.get("participant_sid") + self.label: Optional[str] = payload.get("label") + self.conference_sid: Optional[str] = payload.get("conference_sid") + self.call_sid: Optional[str] = payload.get("call_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.call_direction: Optional["ConferenceParticipantInstance.CallDirection"] = ( + payload.get("call_direction") + ) + self._from: Optional[str] = payload.get("from") + self.to: Optional[str] = payload.get("to") + self.call_status: Optional["ConferenceParticipantInstance.CallStatus"] = ( + payload.get("call_status") + ) + self.country_code: Optional[str] = payload.get("country_code") + self.is_moderator: Optional[bool] = payload.get("is_moderator") + self.join_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("join_time") + ) + self.leave_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("leave_time") + ) + self.duration_seconds: Optional[int] = deserialize.integer( + payload.get("duration_seconds") + ) + self.outbound_queue_length: Optional[int] = deserialize.integer( + payload.get("outbound_queue_length") + ) + self.outbound_time_in_queue: Optional[int] = deserialize.integer( + payload.get("outbound_time_in_queue") + ) + self.jitter_buffer_size: Optional[ + "ConferenceParticipantInstance.JitterBufferSize" + ] = payload.get("jitter_buffer_size") + self.is_coach: Optional[bool] = payload.get("is_coach") + self.coached_participants: Optional[List[str]] = payload.get( + "coached_participants" + ) + self.participant_region: Optional["ConferenceParticipantInstance.Region"] = ( + payload.get("participant_region") + ) + self.conference_region: Optional["ConferenceParticipantInstance.Region"] = ( + payload.get("conference_region") + ) + self.call_type: Optional["ConferenceParticipantInstance.CallType"] = ( + payload.get("call_type") + ) + self.processing_state: Optional[ + "ConferenceParticipantInstance.ProcessingState" + ] = payload.get("processing_state") + self.properties: Optional[Dict[str, object]] = payload.get("properties") + self.events: Optional[Dict[str, object]] = payload.get("events") + self.metrics: Optional[Dict[str, object]] = payload.get("metrics") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "conference_sid": conference_sid, + "participant_sid": participant_sid or self.participant_sid, + } + self._context: Optional[ConferenceParticipantContext] = None + + @property + def _proxy(self) -> "ConferenceParticipantContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ConferenceParticipantContext for this ConferenceParticipantInstance + """ + if self._context is None: + self._context = ConferenceParticipantContext( + self._version, + conference_sid=self._solution["conference_sid"], + participant_sid=self._solution["participant_sid"], + ) + return self._context + + def fetch( + self, + events: Union[str, object] = values.unset, + metrics: Union[str, object] = values.unset, + ) -> "ConferenceParticipantInstance": + """ + Fetch the ConferenceParticipantInstance + + :param events: Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + :param metrics: Object. Contains participant call quality metrics. + + :returns: The fetched ConferenceParticipantInstance + """ + return self._proxy.fetch( + events=events, + metrics=metrics, + ) + + async def fetch_async( + self, + events: Union[str, object] = values.unset, + metrics: Union[str, object] = values.unset, + ) -> "ConferenceParticipantInstance": + """ + Asynchronous coroutine to fetch the ConferenceParticipantInstance + + :param events: Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + :param metrics: Object. Contains participant call quality metrics. + + :returns: The fetched ConferenceParticipantInstance + """ + return await self._proxy.fetch_async( + events=events, + metrics=metrics, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConferenceParticipantContext(InstanceContext): + + def __init__(self, version: Version, conference_sid: str, participant_sid: str): + """ + Initialize the ConferenceParticipantContext + + :param version: Version that contains the resource + :param conference_sid: The unique SID identifier of the Conference. + :param participant_sid: The unique SID identifier of the Participant. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conference_sid": conference_sid, + "participant_sid": participant_sid, + } + self._uri = ( + "/Conferences/{conference_sid}/Participants/{participant_sid}".format( + **self._solution + ) + ) + + def fetch( + self, + events: Union[str, object] = values.unset, + metrics: Union[str, object] = values.unset, + ) -> ConferenceParticipantInstance: + """ + Fetch the ConferenceParticipantInstance + + :param events: Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + :param metrics: Object. Contains participant call quality metrics. + + :returns: The fetched ConferenceParticipantInstance + """ + + data = values.of( + { + "Events": events, + "Metrics": metrics, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return ConferenceParticipantInstance( + self._version, + payload, + conference_sid=self._solution["conference_sid"], + participant_sid=self._solution["participant_sid"], + ) + + async def fetch_async( + self, + events: Union[str, object] = values.unset, + metrics: Union[str, object] = values.unset, + ) -> ConferenceParticipantInstance: + """ + Asynchronous coroutine to fetch the ConferenceParticipantInstance + + :param events: Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + :param metrics: Object. Contains participant call quality metrics. + + :returns: The fetched ConferenceParticipantInstance + """ + + data = values.of( + { + "Events": events, + "Metrics": metrics, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return ConferenceParticipantInstance( + self._version, + payload, + conference_sid=self._solution["conference_sid"], + participant_sid=self._solution["participant_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ConferenceParticipantPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ConferenceParticipantInstance: + """ + Build an instance of ConferenceParticipantInstance + + :param payload: Payload response from the API + """ + return ConferenceParticipantInstance( + self._version, payload, conference_sid=self._solution["conference_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ConferenceParticipantList(ListResource): + + def __init__(self, version: Version, conference_sid: str): + """ + Initialize the ConferenceParticipantList + + :param version: Version that contains the resource + :param conference_sid: The unique SID identifier of the Conference. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "conference_sid": conference_sid, + } + self._uri = "/Conferences/{conference_sid}/Participants".format( + **self._solution + ) + + def stream( + self, + participant_sid: Union[str, object] = values.unset, + label: Union[str, object] = values.unset, + events: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ConferenceParticipantInstance]: + """ + Streams ConferenceParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str participant_sid: The unique SID identifier of the Participant. + :param str label: User-specified label for a participant. + :param str events: Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + participant_sid=participant_sid, + label=label, + events=events, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + participant_sid: Union[str, object] = values.unset, + label: Union[str, object] = values.unset, + events: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ConferenceParticipantInstance]: + """ + Asynchronously streams ConferenceParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str participant_sid: The unique SID identifier of the Participant. + :param str label: User-specified label for a participant. + :param str events: Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + participant_sid=participant_sid, + label=label, + events=events, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + participant_sid: Union[str, object] = values.unset, + label: Union[str, object] = values.unset, + events: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConferenceParticipantInstance]: + """ + Lists ConferenceParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str participant_sid: The unique SID identifier of the Participant. + :param str label: User-specified label for a participant. + :param str events: Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + participant_sid=participant_sid, + label=label, + events=events, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + participant_sid: Union[str, object] = values.unset, + label: Union[str, object] = values.unset, + events: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ConferenceParticipantInstance]: + """ + Asynchronously lists ConferenceParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str participant_sid: The unique SID identifier of the Participant. + :param str label: User-specified label for a participant. + :param str events: Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + participant_sid=participant_sid, + label=label, + events=events, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + participant_sid: Union[str, object] = values.unset, + label: Union[str, object] = values.unset, + events: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConferenceParticipantPage: + """ + Retrieve a single page of ConferenceParticipantInstance records from the API. + Request is executed immediately + + :param participant_sid: The unique SID identifier of the Participant. + :param label: User-specified label for a participant. + :param events: Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConferenceParticipantInstance + """ + data = values.of( + { + "ParticipantSid": participant_sid, + "Label": label, + "Events": events, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConferenceParticipantPage(self._version, response, self._solution) + + async def page_async( + self, + participant_sid: Union[str, object] = values.unset, + label: Union[str, object] = values.unset, + events: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ConferenceParticipantPage: + """ + Asynchronously retrieve a single page of ConferenceParticipantInstance records from the API. + Request is executed immediately + + :param participant_sid: The unique SID identifier of the Participant. + :param label: User-specified label for a participant. + :param events: Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ConferenceParticipantInstance + """ + data = values.of( + { + "ParticipantSid": participant_sid, + "Label": label, + "Events": events, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ConferenceParticipantPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ConferenceParticipantPage: + """ + Retrieve a specific page of ConferenceParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConferenceParticipantInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ConferenceParticipantPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ConferenceParticipantPage: + """ + Asynchronously retrieve a specific page of ConferenceParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ConferenceParticipantInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ConferenceParticipantPage(self._version, response, self._solution) + + def get(self, participant_sid: str) -> ConferenceParticipantContext: + """ + Constructs a ConferenceParticipantContext + + :param participant_sid: The unique SID identifier of the Participant. + """ + return ConferenceParticipantContext( + self._version, + conference_sid=self._solution["conference_sid"], + participant_sid=participant_sid, + ) + + def __call__(self, participant_sid: str) -> ConferenceParticipantContext: + """ + Constructs a ConferenceParticipantContext + + :param participant_sid: The unique SID identifier of the Participant. + """ + return ConferenceParticipantContext( + self._version, + conference_sid=self._solution["conference_sid"], + participant_sid=participant_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/room/__init__.py b/venv/Lib/site-packages/twilio/rest/insights/v1/room/__init__.py new file mode 100644 index 00000000..6fe0c476 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/v1/room/__init__.py @@ -0,0 +1,664 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Insights + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.insights.v1.room.participant import ParticipantList + + +class RoomInstance(InstanceResource): + + class Codec(object): + VP8 = "VP8" + H264 = "H264" + VP9 = "VP9" + OPUS = "opus" + + class CreatedMethod(object): + SDK = "sdk" + AD_HOC = "ad_hoc" + API = "api" + + class EdgeLocation(object): + ASHBURN = "ashburn" + DUBLIN = "dublin" + FRANKFURT = "frankfurt" + SINGAPORE = "singapore" + SYDNEY = "sydney" + SAO_PAULO = "sao_paulo" + ROAMING = "roaming" + UMATILLA = "umatilla" + TOKYO = "tokyo" + + class EndReason(object): + ROOM_ENDED_VIA_API = "room_ended_via_api" + TIMEOUT = "timeout" + + class ProcessingState(object): + COMPLETE = "complete" + IN_PROGRESS = "in_progress" + TIMEOUT = "timeout" + NOT_STARTED = "not_started" + + class RoomStatus(object): + IN_PROGRESS = "in_progress" + COMPLETED = "completed" + + class RoomType(object): + GO = "go" + PEER_TO_PEER = "peer_to_peer" + GROUP = "group" + GROUP_SMALL = "group_small" + + class TwilioRealm(object): + US1 = "us1" + US2 = "us2" + AU1 = "au1" + BR1 = "br1" + IE1 = "ie1" + JP1 = "jp1" + SG1 = "sg1" + IN1 = "in1" + DE1 = "de1" + GLL = "gll" + STAGE_US1 = "stage_us1" + STAGE_US2 = "stage_us2" + DEV_US1 = "dev_us1" + DEV_US2 = "dev_us2" + STAGE_DE1 = "stage_de1" + STAGE_IN1 = "stage_in1" + STAGE_IE1 = "stage_ie1" + STAGE_BR1 = "stage_br1" + STAGE_AU1 = "stage_au1" + STAGE_SG1 = "stage_sg1" + STAGE_JP1 = "stage_jp1" + OUTSIDE = "outside" + + """ + :ivar account_sid: Account SID associated with this room. + :ivar room_sid: Unique identifier for the room. + :ivar room_name: Room friendly name. + :ivar create_time: Creation time of the room. + :ivar end_time: End time for the room. + :ivar room_type: + :ivar room_status: + :ivar status_callback: Webhook provided for status callbacks. + :ivar status_callback_method: HTTP method provided for status callback URL. + :ivar created_method: + :ivar end_reason: + :ivar max_participants: Max number of total participants allowed by the application settings. + :ivar unique_participants: Number of participants. May include duplicate identities for participants who left and rejoined. + :ivar unique_participant_identities: Unique number of participant identities. + :ivar concurrent_participants: Actual number of concurrent participants. + :ivar max_concurrent_participants: Maximum number of participants allowed in the room at the same time allowed by the application settings. + :ivar codecs: Codecs used by participants in the room. Can be `VP8`, `H264`, or `VP9`. + :ivar media_region: + :ivar duration_sec: Total room duration from create time to end time. + :ivar total_participant_duration_sec: Combined amount of participant time in the room. + :ivar total_recording_duration_sec: Combined amount of recorded seconds for participants in the room. + :ivar processing_state: + :ivar recording_enabled: Boolean indicating if recording is enabled for the room. + :ivar edge_location: + :ivar url: URL for the room resource. + :ivar links: Room subresources. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], room_sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.room_sid: Optional[str] = payload.get("room_sid") + self.room_name: Optional[str] = payload.get("room_name") + self.create_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("create_time") + ) + self.end_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("end_time") + ) + self.room_type: Optional["RoomInstance.RoomType"] = payload.get("room_type") + self.room_status: Optional["RoomInstance.RoomStatus"] = payload.get( + "room_status" + ) + self.status_callback: Optional[str] = payload.get("status_callback") + self.status_callback_method: Optional[str] = payload.get( + "status_callback_method" + ) + self.created_method: Optional["RoomInstance.CreatedMethod"] = payload.get( + "created_method" + ) + self.end_reason: Optional["RoomInstance.EndReason"] = payload.get("end_reason") + self.max_participants: Optional[int] = deserialize.integer( + payload.get("max_participants") + ) + self.unique_participants: Optional[int] = deserialize.integer( + payload.get("unique_participants") + ) + self.unique_participant_identities: Optional[int] = deserialize.integer( + payload.get("unique_participant_identities") + ) + self.concurrent_participants: Optional[int] = deserialize.integer( + payload.get("concurrent_participants") + ) + self.max_concurrent_participants: Optional[int] = deserialize.integer( + payload.get("max_concurrent_participants") + ) + self.codecs: Optional[List["RoomInstance.Codec"]] = payload.get("codecs") + self.media_region: Optional["RoomInstance.TwilioRealm"] = payload.get( + "media_region" + ) + self.duration_sec: Optional[int] = payload.get("duration_sec") + self.total_participant_duration_sec: Optional[int] = payload.get( + "total_participant_duration_sec" + ) + self.total_recording_duration_sec: Optional[int] = payload.get( + "total_recording_duration_sec" + ) + self.processing_state: Optional["RoomInstance.ProcessingState"] = payload.get( + "processing_state" + ) + self.recording_enabled: Optional[bool] = payload.get("recording_enabled") + self.edge_location: Optional["RoomInstance.EdgeLocation"] = payload.get( + "edge_location" + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "room_sid": room_sid or self.room_sid, + } + self._context: Optional[RoomContext] = None + + @property + def _proxy(self) -> "RoomContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RoomContext for this RoomInstance + """ + if self._context is None: + self._context = RoomContext( + self._version, + room_sid=self._solution["room_sid"], + ) + return self._context + + def fetch(self) -> "RoomInstance": + """ + Fetch the RoomInstance + + + :returns: The fetched RoomInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "RoomInstance": + """ + Asynchronous coroutine to fetch the RoomInstance + + + :returns: The fetched RoomInstance + """ + return await self._proxy.fetch_async() + + @property + def participants(self) -> ParticipantList: + """ + Access the participants + """ + return self._proxy.participants + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RoomContext(InstanceContext): + + def __init__(self, version: Version, room_sid: str): + """ + Initialize the RoomContext + + :param version: Version that contains the resource + :param room_sid: The SID of the Room resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "room_sid": room_sid, + } + self._uri = "/Video/Rooms/{room_sid}".format(**self._solution) + + self._participants: Optional[ParticipantList] = None + + def fetch(self) -> RoomInstance: + """ + Fetch the RoomInstance + + + :returns: The fetched RoomInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return RoomInstance( + self._version, + payload, + room_sid=self._solution["room_sid"], + ) + + async def fetch_async(self) -> RoomInstance: + """ + Asynchronous coroutine to fetch the RoomInstance + + + :returns: The fetched RoomInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return RoomInstance( + self._version, + payload, + room_sid=self._solution["room_sid"], + ) + + @property + def participants(self) -> ParticipantList: + """ + Access the participants + """ + if self._participants is None: + self._participants = ParticipantList( + self._version, + self._solution["room_sid"], + ) + return self._participants + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RoomPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RoomInstance: + """ + Build an instance of RoomInstance + + :param payload: Payload response from the API + """ + return RoomInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RoomList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the RoomList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Video/Rooms" + + def stream( + self, + room_type: Union[List["RoomInstance.RoomType"], object] = values.unset, + codec: Union[List["RoomInstance.Codec"], object] = values.unset, + room_name: Union[str, object] = values.unset, + created_after: Union[datetime, object] = values.unset, + created_before: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RoomInstance]: + """ + Streams RoomInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["RoomInstance.RoomType"] room_type: Type of room. Can be `go`, `peer_to_peer`, `group`, or `group_small`. + :param List["RoomInstance.Codec"] codec: Codecs used by participants in the room. Can be `VP8`, `H264`, or `VP9`. + :param str room_name: Room friendly name. + :param datetime created_after: Only read rooms that started on or after this ISO 8601 timestamp. + :param datetime created_before: Only read rooms that started before this ISO 8601 timestamp. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + room_type=room_type, + codec=codec, + room_name=room_name, + created_after=created_after, + created_before=created_before, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + room_type: Union[List["RoomInstance.RoomType"], object] = values.unset, + codec: Union[List["RoomInstance.Codec"], object] = values.unset, + room_name: Union[str, object] = values.unset, + created_after: Union[datetime, object] = values.unset, + created_before: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RoomInstance]: + """ + Asynchronously streams RoomInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["RoomInstance.RoomType"] room_type: Type of room. Can be `go`, `peer_to_peer`, `group`, or `group_small`. + :param List["RoomInstance.Codec"] codec: Codecs used by participants in the room. Can be `VP8`, `H264`, or `VP9`. + :param str room_name: Room friendly name. + :param datetime created_after: Only read rooms that started on or after this ISO 8601 timestamp. + :param datetime created_before: Only read rooms that started before this ISO 8601 timestamp. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + room_type=room_type, + codec=codec, + room_name=room_name, + created_after=created_after, + created_before=created_before, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + room_type: Union[List["RoomInstance.RoomType"], object] = values.unset, + codec: Union[List["RoomInstance.Codec"], object] = values.unset, + room_name: Union[str, object] = values.unset, + created_after: Union[datetime, object] = values.unset, + created_before: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoomInstance]: + """ + Lists RoomInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["RoomInstance.RoomType"] room_type: Type of room. Can be `go`, `peer_to_peer`, `group`, or `group_small`. + :param List["RoomInstance.Codec"] codec: Codecs used by participants in the room. Can be `VP8`, `H264`, or `VP9`. + :param str room_name: Room friendly name. + :param datetime created_after: Only read rooms that started on or after this ISO 8601 timestamp. + :param datetime created_before: Only read rooms that started before this ISO 8601 timestamp. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + room_type=room_type, + codec=codec, + room_name=room_name, + created_after=created_after, + created_before=created_before, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + room_type: Union[List["RoomInstance.RoomType"], object] = values.unset, + codec: Union[List["RoomInstance.Codec"], object] = values.unset, + room_name: Union[str, object] = values.unset, + created_after: Union[datetime, object] = values.unset, + created_before: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoomInstance]: + """ + Asynchronously lists RoomInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["RoomInstance.RoomType"] room_type: Type of room. Can be `go`, `peer_to_peer`, `group`, or `group_small`. + :param List["RoomInstance.Codec"] codec: Codecs used by participants in the room. Can be `VP8`, `H264`, or `VP9`. + :param str room_name: Room friendly name. + :param datetime created_after: Only read rooms that started on or after this ISO 8601 timestamp. + :param datetime created_before: Only read rooms that started before this ISO 8601 timestamp. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + room_type=room_type, + codec=codec, + room_name=room_name, + created_after=created_after, + created_before=created_before, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + room_type: Union[List["RoomInstance.RoomType"], object] = values.unset, + codec: Union[List["RoomInstance.Codec"], object] = values.unset, + room_name: Union[str, object] = values.unset, + created_after: Union[datetime, object] = values.unset, + created_before: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RoomPage: + """ + Retrieve a single page of RoomInstance records from the API. + Request is executed immediately + + :param room_type: Type of room. Can be `go`, `peer_to_peer`, `group`, or `group_small`. + :param codec: Codecs used by participants in the room. Can be `VP8`, `H264`, or `VP9`. + :param room_name: Room friendly name. + :param created_after: Only read rooms that started on or after this ISO 8601 timestamp. + :param created_before: Only read rooms that started before this ISO 8601 timestamp. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoomInstance + """ + data = values.of( + { + "RoomType": serialize.map(room_type, lambda e: e), + "Codec": serialize.map(codec, lambda e: e), + "RoomName": room_name, + "CreatedAfter": serialize.iso8601_datetime(created_after), + "CreatedBefore": serialize.iso8601_datetime(created_before), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RoomPage(self._version, response) + + async def page_async( + self, + room_type: Union[List["RoomInstance.RoomType"], object] = values.unset, + codec: Union[List["RoomInstance.Codec"], object] = values.unset, + room_name: Union[str, object] = values.unset, + created_after: Union[datetime, object] = values.unset, + created_before: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RoomPage: + """ + Asynchronously retrieve a single page of RoomInstance records from the API. + Request is executed immediately + + :param room_type: Type of room. Can be `go`, `peer_to_peer`, `group`, or `group_small`. + :param codec: Codecs used by participants in the room. Can be `VP8`, `H264`, or `VP9`. + :param room_name: Room friendly name. + :param created_after: Only read rooms that started on or after this ISO 8601 timestamp. + :param created_before: Only read rooms that started before this ISO 8601 timestamp. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoomInstance + """ + data = values.of( + { + "RoomType": serialize.map(room_type, lambda e: e), + "Codec": serialize.map(codec, lambda e: e), + "RoomName": room_name, + "CreatedAfter": serialize.iso8601_datetime(created_after), + "CreatedBefore": serialize.iso8601_datetime(created_before), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RoomPage(self._version, response) + + def get_page(self, target_url: str) -> RoomPage: + """ + Retrieve a specific page of RoomInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoomInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RoomPage(self._version, response) + + async def get_page_async(self, target_url: str) -> RoomPage: + """ + Asynchronously retrieve a specific page of RoomInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoomInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RoomPage(self._version, response) + + def get(self, room_sid: str) -> RoomContext: + """ + Constructs a RoomContext + + :param room_sid: The SID of the Room resource. + """ + return RoomContext(self._version, room_sid=room_sid) + + def __call__(self, room_sid: str) -> RoomContext: + """ + Constructs a RoomContext + + :param room_sid: The SID of the Room resource. + """ + return RoomContext(self._version, room_sid=room_sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/room/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/insights/v1/room/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f65107e474bcce91b73993194b19b8d8f9063f7 GIT binary patch literal 29668 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 D&hm0O literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/room/__pycache__/participant.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/insights/v1/room/__pycache__/participant.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b73a6b760ef444c29bad5c489374d6454fee1db GIT binary patch literal 21688 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 z%0DGQ(v<2LMi6CACS_f|MSyK%(tcznUM*7UV**zR5Mjs^>?ePh!1oFK0Kgg{`+_xs3m$rY!sxNlQVnTKHF~mEqvuv`+s<1}Q%&=@?U>pz|48_jZ_0Pav(E7q z{&sESfZFgZB68fs#J)x`H{-o}Lr zR{SLYkKRQG@5SJ5Ag-D2H@~#N?u7>Sq-eR*zf;WhYN+0s?fWUyOPJo9c0%;d?Cj9< zSS0Aj#Yj-1n4ZvT)fJ73nK*U=F=B{ABUu=7v=0l3cW6{h)UFXNqjsWkwL+7e!lz^S zS-1*9U=-eD$qpOQy~dAP$dy!cO<5F(c-faK? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/room/participant.py b/venv/Lib/site-packages/twilio/rest/insights/v1/room/participant.py new file mode 100644 index 00000000..d0d3e592 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/v1/room/participant.py @@ -0,0 +1,516 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Insights + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ParticipantInstance(InstanceResource): + + class Codec(object): + VP8 = "VP8" + H264 = "H264" + VP9 = "VP9" + OPUS = "opus" + + class EdgeLocation(object): + ASHBURN = "ashburn" + DUBLIN = "dublin" + FRANKFURT = "frankfurt" + SINGAPORE = "singapore" + SYDNEY = "sydney" + SAO_PAULO = "sao_paulo" + ROAMING = "roaming" + UMATILLA = "umatilla" + TOKYO = "tokyo" + + class RoomStatus(object): + IN_PROGRESS = "in_progress" + CONNECTED = "connected" + COMPLETED = "completed" + DISCONNECTED = "disconnected" + + class TwilioRealm(object): + US1 = "us1" + US2 = "us2" + AU1 = "au1" + BR1 = "br1" + IE1 = "ie1" + JP1 = "jp1" + SG1 = "sg1" + IN1 = "in1" + DE1 = "de1" + GLL = "gll" + STAGE_US1 = "stage_us1" + DEV_US1 = "dev_us1" + STAGE_AU1 = "stage_au1" + STAGE_SG1 = "stage_sg1" + STAGE_BR1 = "stage_br1" + STAGE_IN1 = "stage_in1" + STAGE_JP1 = "stage_jp1" + STAGE_DE1 = "stage_de1" + STAGE_IE1 = "stage_ie1" + STAGE_US2 = "stage_us2" + DEV_US2 = "dev_us2" + OUTSIDE = "outside" + + """ + :ivar participant_sid: Unique identifier for the participant. + :ivar participant_identity: The application-defined string that uniquely identifies the participant within a Room. + :ivar join_time: When the participant joined the room. + :ivar leave_time: When the participant left the room. + :ivar duration_sec: Amount of time in seconds the participant was in the room. + :ivar account_sid: Account SID associated with the room. + :ivar room_sid: Unique identifier for the room. + :ivar status: + :ivar codecs: Codecs detected from the participant. Can be `VP8`, `H264`, or `VP9`. + :ivar end_reason: Reason the participant left the room. See [the list of possible values here](https://www.twilio.com/docs/video/troubleshooting/video-log-analyzer-api#end_reason). + :ivar error_code: Errors encountered by the participant. + :ivar error_code_url: Twilio error code dictionary link. + :ivar media_region: + :ivar properties: Object containing information about the participant's data from the room. See [below](https://www.twilio.com/docs/video/troubleshooting/video-log-analyzer-api#properties) for more information. + :ivar edge_location: + :ivar publisher_info: Object containing information about the SDK name and version. See [below](https://www.twilio.com/docs/video/troubleshooting/video-log-analyzer-api#publisher_info) for more information. + :ivar url: URL of the participant resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + room_sid: str, + participant_sid: Optional[str] = None, + ): + super().__init__(version) + + self.participant_sid: Optional[str] = payload.get("participant_sid") + self.participant_identity: Optional[str] = payload.get("participant_identity") + self.join_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("join_time") + ) + self.leave_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("leave_time") + ) + self.duration_sec: Optional[int] = payload.get("duration_sec") + self.account_sid: Optional[str] = payload.get("account_sid") + self.room_sid: Optional[str] = payload.get("room_sid") + self.status: Optional["ParticipantInstance.RoomStatus"] = payload.get("status") + self.codecs: Optional[List["ParticipantInstance.Codec"]] = payload.get("codecs") + self.end_reason: Optional[str] = payload.get("end_reason") + self.error_code: Optional[int] = deserialize.integer(payload.get("error_code")) + self.error_code_url: Optional[str] = payload.get("error_code_url") + self.media_region: Optional["ParticipantInstance.TwilioRealm"] = payload.get( + "media_region" + ) + self.properties: Optional[Dict[str, object]] = payload.get("properties") + self.edge_location: Optional["ParticipantInstance.EdgeLocation"] = payload.get( + "edge_location" + ) + self.publisher_info: Optional[Dict[str, object]] = payload.get("publisher_info") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "room_sid": room_sid, + "participant_sid": participant_sid or self.participant_sid, + } + self._context: Optional[ParticipantContext] = None + + @property + def _proxy(self) -> "ParticipantContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ParticipantContext for this ParticipantInstance + """ + if self._context is None: + self._context = ParticipantContext( + self._version, + room_sid=self._solution["room_sid"], + participant_sid=self._solution["participant_sid"], + ) + return self._context + + def fetch(self) -> "ParticipantInstance": + """ + Fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ParticipantInstance": + """ + Asynchronous coroutine to fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ParticipantContext(InstanceContext): + + def __init__(self, version: Version, room_sid: str, participant_sid: str): + """ + Initialize the ParticipantContext + + :param version: Version that contains the resource + :param room_sid: The SID of the Room resource. + :param participant_sid: The SID of the Participant resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "room_sid": room_sid, + "participant_sid": participant_sid, + } + self._uri = "/Video/Rooms/{room_sid}/Participants/{participant_sid}".format( + **self._solution + ) + + def fetch(self) -> ParticipantInstance: + """ + Fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ParticipantInstance( + self._version, + payload, + room_sid=self._solution["room_sid"], + participant_sid=self._solution["participant_sid"], + ) + + async def fetch_async(self) -> ParticipantInstance: + """ + Asynchronous coroutine to fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + room_sid=self._solution["room_sid"], + participant_sid=self._solution["participant_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ParticipantPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ParticipantInstance: + """ + Build an instance of ParticipantInstance + + :param payload: Payload response from the API + """ + return ParticipantInstance( + self._version, payload, room_sid=self._solution["room_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ParticipantList(ListResource): + + def __init__(self, version: Version, room_sid: str): + """ + Initialize the ParticipantList + + :param version: Version that contains the resource + :param room_sid: The SID of the Room resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "room_sid": room_sid, + } + self._uri = "/Video/Rooms/{room_sid}/Participants".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ParticipantInstance]: + """ + Streams ParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ParticipantInstance]: + """ + Asynchronously streams ParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantInstance]: + """ + Lists ParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantInstance]: + """ + Asynchronously lists ParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantPage: + """ + Retrieve a single page of ParticipantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantPage: + """ + Asynchronously retrieve a single page of ParticipantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ParticipantPage: + """ + Retrieve a specific page of ParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ParticipantPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ParticipantPage: + """ + Asynchronously retrieve a specific page of ParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ParticipantPage(self._version, response, self._solution) + + def get(self, participant_sid: str) -> ParticipantContext: + """ + Constructs a ParticipantContext + + :param participant_sid: The SID of the Participant resource. + """ + return ParticipantContext( + self._version, + room_sid=self._solution["room_sid"], + participant_sid=participant_sid, + ) + + def __call__(self, participant_sid: str) -> ParticipantContext: + """ + Constructs a ParticipantContext + + :param participant_sid: The SID of the Participant resource. + """ + return ParticipantContext( + self._version, + room_sid=self._solution["room_sid"], + participant_sid=participant_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/insights/v1/setting.py b/venv/Lib/site-packages/twilio/rest/insights/v1/setting.py new file mode 100644 index 00000000..3c6b746f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/insights/v1/setting.py @@ -0,0 +1,318 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Insights + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class SettingInstance(InstanceResource): + """ + :ivar account_sid: The unique SID identifier of the Account. + :ivar advanced_features: A boolean flag indicating whether Advanced Features for Voice Insights are enabled. + :ivar voice_trace: A boolean flag indicating whether Voice Trace is enabled. + :ivar url: The URL of this resource. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.advanced_features: Optional[bool] = payload.get("advanced_features") + self.voice_trace: Optional[bool] = payload.get("voice_trace") + self.url: Optional[str] = payload.get("url") + + self._context: Optional[SettingContext] = None + + @property + def _proxy(self) -> "SettingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SettingContext for this SettingInstance + """ + if self._context is None: + self._context = SettingContext( + self._version, + ) + return self._context + + def fetch( + self, subaccount_sid: Union[str, object] = values.unset + ) -> "SettingInstance": + """ + Fetch the SettingInstance + + :param subaccount_sid: The unique SID identifier of the Subaccount. + + :returns: The fetched SettingInstance + """ + return self._proxy.fetch( + subaccount_sid=subaccount_sid, + ) + + async def fetch_async( + self, subaccount_sid: Union[str, object] = values.unset + ) -> "SettingInstance": + """ + Asynchronous coroutine to fetch the SettingInstance + + :param subaccount_sid: The unique SID identifier of the Subaccount. + + :returns: The fetched SettingInstance + """ + return await self._proxy.fetch_async( + subaccount_sid=subaccount_sid, + ) + + def update( + self, + advanced_features: Union[bool, object] = values.unset, + voice_trace: Union[bool, object] = values.unset, + subaccount_sid: Union[str, object] = values.unset, + ) -> "SettingInstance": + """ + Update the SettingInstance + + :param advanced_features: A boolean flag to enable Advanced Features for Voice Insights. + :param voice_trace: A boolean flag to enable Voice Trace. + :param subaccount_sid: The unique SID identifier of the Subaccount. + + :returns: The updated SettingInstance + """ + return self._proxy.update( + advanced_features=advanced_features, + voice_trace=voice_trace, + subaccount_sid=subaccount_sid, + ) + + async def update_async( + self, + advanced_features: Union[bool, object] = values.unset, + voice_trace: Union[bool, object] = values.unset, + subaccount_sid: Union[str, object] = values.unset, + ) -> "SettingInstance": + """ + Asynchronous coroutine to update the SettingInstance + + :param advanced_features: A boolean flag to enable Advanced Features for Voice Insights. + :param voice_trace: A boolean flag to enable Voice Trace. + :param subaccount_sid: The unique SID identifier of the Subaccount. + + :returns: The updated SettingInstance + """ + return await self._proxy.update_async( + advanced_features=advanced_features, + voice_trace=voice_trace, + subaccount_sid=subaccount_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class SettingContext(InstanceContext): + + def __init__(self, version: Version): + """ + Initialize the SettingContext + + :param version: Version that contains the resource + """ + super().__init__(version) + + self._uri = "/Voice/Settings" + + def fetch( + self, subaccount_sid: Union[str, object] = values.unset + ) -> SettingInstance: + """ + Fetch the SettingInstance + + :param subaccount_sid: The unique SID identifier of the Subaccount. + + :returns: The fetched SettingInstance + """ + + data = values.of( + { + "SubaccountSid": subaccount_sid, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return SettingInstance( + self._version, + payload, + ) + + async def fetch_async( + self, subaccount_sid: Union[str, object] = values.unset + ) -> SettingInstance: + """ + Asynchronous coroutine to fetch the SettingInstance + + :param subaccount_sid: The unique SID identifier of the Subaccount. + + :returns: The fetched SettingInstance + """ + + data = values.of( + { + "SubaccountSid": subaccount_sid, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return SettingInstance( + self._version, + payload, + ) + + def update( + self, + advanced_features: Union[bool, object] = values.unset, + voice_trace: Union[bool, object] = values.unset, + subaccount_sid: Union[str, object] = values.unset, + ) -> SettingInstance: + """ + Update the SettingInstance + + :param advanced_features: A boolean flag to enable Advanced Features for Voice Insights. + :param voice_trace: A boolean flag to enable Voice Trace. + :param subaccount_sid: The unique SID identifier of the Subaccount. + + :returns: The updated SettingInstance + """ + + data = values.of( + { + "AdvancedFeatures": serialize.boolean_to_string(advanced_features), + "VoiceTrace": serialize.boolean_to_string(voice_trace), + "SubaccountSid": subaccount_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SettingInstance(self._version, payload) + + async def update_async( + self, + advanced_features: Union[bool, object] = values.unset, + voice_trace: Union[bool, object] = values.unset, + subaccount_sid: Union[str, object] = values.unset, + ) -> SettingInstance: + """ + Asynchronous coroutine to update the SettingInstance + + :param advanced_features: A boolean flag to enable Advanced Features for Voice Insights. + :param voice_trace: A boolean flag to enable Voice Trace. + :param subaccount_sid: The unique SID identifier of the Subaccount. + + :returns: The updated SettingInstance + """ + + data = values.of( + { + "AdvancedFeatures": serialize.boolean_to_string(advanced_features), + "VoiceTrace": serialize.boolean_to_string(voice_trace), + "SubaccountSid": subaccount_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SettingInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class SettingList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SettingList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self) -> SettingContext: + """ + Constructs a SettingContext + + """ + return SettingContext(self._version) + + def __call__(self) -> SettingContext: + """ + Constructs a SettingContext + + """ + return SettingContext(self._version) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/IntelligenceBase.py b/venv/Lib/site-packages/twilio/rest/intelligence/IntelligenceBase.py new file mode 100644 index 00000000..0546bc15 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/IntelligenceBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.intelligence.v2 import V2 + + +class IntelligenceBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Intelligence Domain + + :returns: Domain for Intelligence + """ + super().__init__(twilio, "https://intelligence.twilio.com") + self._v2: Optional[V2] = None + + @property + def v2(self) -> V2: + """ + :returns: Versions v2 of Intelligence + """ + if self._v2 is None: + self._v2 = V2(self) + return self._v2 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/__init__.py b/venv/Lib/site-packages/twilio/rest/intelligence/__init__.py new file mode 100644 index 00000000..6d565b43 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/__init__.py @@ -0,0 +1,13 @@ +from twilio.rest.intelligence.IntelligenceBase import IntelligenceBase +from twilio.rest.intelligence.v2.service import ServiceList +from twilio.rest.intelligence.v2.transcript import TranscriptList + + +class Intelligence(IntelligenceBase): + @property + def transcripts(self) -> TranscriptList: + return self.v2.transcripts + + @property + def services(self) -> ServiceList: + return self.v2.services diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/__pycache__/IntelligenceBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/intelligence/__pycache__/IntelligenceBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18106714d2df0ff83e1a7373157ce9431077a9ce GIT binary patch literal 2047 zcmahKO>Y}TbauU7uN@~b4Q&&(DpP2Qj8t2)5L8iB(IikJAgLhqU>OaY-Eq8hy=!JS zZfyCGLnIQ3sFe^(t{kiU6fOlJQLX3+ao}c1E2^G&Z+7jtN)coG&71fAHRB)0$8!YM z-p^k)e$@#19S?(*PLQKzK=z4Es>D`o)m55mRaFpAxv8dB)g-RD>84)QC7yOOO`~ck zL?t(gt#1=M!?nXyY_FQ_7{#plgF;A-($$6&P|LSDy=w+^oqJrEA-CyT2bhd8dic~+T6$ZnW_QS@Qq6rvih5L7@TM>U3$-PZ=KaYj-q#o3fBzqwpY zMd@Ip#YJQ==0FgPMJd*<09^~XTNhc#D#|h@TgF&`DO0-j++LWgeI9TT)IM5TTCFYe z;7;hbYHi=K_zkFBSZi~yUHjNss|8NTue40-j=9c*TI{?mco3FHqbiSPfK@NGIwB9= zx-%y@gHTTcJ2(&E*%o<{C)tVJ%umMj!I_5_=YKI49$mb=qwN_-z$cL&7tMm_V7M?B z*}_i&*(W{n)sS_JY!yP3k*h}z6MbmqfcPJJFiJ}I-C-+^n|2$D216duc7^)&mp87c zigBE}qkaPR8w)rVu}emgsJaOu0v zoyBiId^9uvI)-38|0LUT~ zW@VWCWDuTmW#P4!*5j|aSj7S`YAs5ilvv^hUpvc-dk zUOb4$_UduzpW>zUq68KMPu{Alm!5o+WV=z&lLLA4dmr=Wz2BR>uT*9L*P9PdpT8pj zUxYGQY7WNB2oAslj|9*r79j#lfz*~QImL3Iv{g$bAi+cMlzs42N{;00yrm5^qx4lM z21({u!-xifzfHpyz3Xy{w(l9!qUppWHQeQ|HK4 zX%$tb%IB0;?iq zqLRIfzZE-)6(|3!bn&FRc&sn7dGxItdZIf{=(efjBr}fF?s&aG;919c(Q|{`qjy=S zOIb8v;#H^gFhwA7_Yl%tSuuheCWM9`zky;OKB<*ciKvakC*J|Lu?*T=YB<$$R6D#T zT(#8o4P$FrN|9*YC?!TVHB(H@EKbcVwk`e#CLUeV_-lN;Wai|g4J23p6*--G)_2<6 tCA?tT@R@!m<7}B-L5FypT!2%V5Hf-XBe*?+l^ CustomOperatorList: + if self._custom_operators is None: + self._custom_operators = CustomOperatorList(self) + return self._custom_operators + + @property + def operators(self) -> OperatorList: + if self._operators is None: + self._operators = OperatorList(self) + return self._operators + + @property + def operator_attachment(self) -> OperatorAttachmentList: + if self._operator_attachment is None: + self._operator_attachment = OperatorAttachmentList(self) + return self._operator_attachment + + @property + def operator_attachments(self) -> OperatorAttachmentsList: + if self._operator_attachments is None: + self._operator_attachments = OperatorAttachmentsList(self) + return self._operator_attachments + + @property + def operator_type(self) -> OperatorTypeList: + if self._operator_type is None: + self._operator_type = OperatorTypeList(self) + return self._operator_type + + @property + def prebuilt_operators(self) -> PrebuiltOperatorList: + if self._prebuilt_operators is None: + self._prebuilt_operators = PrebuiltOperatorList(self) + return self._prebuilt_operators + + @property + def services(self) -> ServiceList: + if self._services is None: + self._services = ServiceList(self) + return self._services + + @property + def transcripts(self) -> TranscriptList: + if self._transcripts is None: + self._transcripts = TranscriptList(self) + return self._transcripts + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3723431d4a3cdeb0f3e40f781144ac2c0a573dbe GIT binary patch literal 4963 zcmc&%OH3Te8Lple&GaxchT-8XhUPIq<1ph8;;g{NMrQ4>aj<0*6pbd^X=WPJ*`7zb zo7pfzyBv@L(yn~km}8WaEi2LOK66w zzrL>?{Z;){_4l9K+QI~$&;IhOwLe7(`5P7*PtY-r{|Lqtk|!CGXYxLkDfluz25rCU zF9b3HY6sL{A(RPGJE*o4*bGbUklI=ZXTsEOQMp1S6QMS%wiTk8D79PFSRtN?Q#-6) zD70tVsm-Y!g+wMn?TFf0=*o04#7FLseA_n3N9DkCzx|Gx?v0obm;S*J66WDqT2pjB zSIW!$N0QDzl8dq?8FHRq*+5zpMgGkn0tkuNkmh#MRCH>2s$f6ZOcd#;n>@ei{sD{y z_(2t$5k*935fdD8GYg1qiDDWprxP1ayZwrrw6R^)sRy0gU1DW?T`2w%6C5zx=$Gel z4ExuppAFm7^pT<}C4PcmC>pY=Dlkzw*=BG8;b*MLe0hCERdW22UHQR#51074`wJ<% zi^Y3O?@c@Ntx7s=B&{2z6O+#0E6YV_!{4!2qNJthC~JmM)~D0y63|jvnQ#^gXhY7e z(JJ#LzF0DNIj

    WpZ?of>d0WRCOa2{yRE=z*y|PvZ0iUk_vXqvaIP)05ddSDo6@i z?YGu-qf~%50aqw#cNN_LG;*rk)hN#yhLl??$VJ1c+1=+)lEy-BOBY zXF9yw%JNkv7lp7D)YrkQEmjm27+Msq3u2BsyI69(UAMv>JK@@*fEM@0q{X?Tv&Q?mWMdsi*FtQc7Sjpa1RWiK8>ufz&zvazle zb8r{A56Y!3i~~O*o8;Fn^~TtW8?KvflIKo)aAmj3+3g;ZXUwAD(>kG^hVJ`}(Jn!z zV-LL652+PD?GV)tn3L0B3R{grvPHh;Vqb9sHEzJIUj+7(*LUV$Mg|XJ9bd(g zwOG<*lNt|o|DQs&As7&(c0s1$-qeO6@d|BqUA`Itg>GpI>kUFer9Hl}d&A@g5BtWS zPVM(y*_r?J9_V`f$?hj6+jnlNx=|3GF-@vE8ag~1w%X;<=fS5@sb>*~YuvEOegAN5 z_Jy%OHjj&#q>DIKi;bD=*tyB=L8W+zHpxw#Ay=<hZ_BADir@bJNs| za@x+)#Ch)ZY7|z^Q~m`i^PD-oHLlm>h7bAFQ)8c>!X>*zmyEB)c$4LuYu^h3TJ*@gj21mhCeWf= zE{zuT#~+|YSMi5nS$^Hnw5w>fIU!gMKKDdXU^E&IVW4o61`1jXTVjHapudLX^)@*Q zM1wPXl~)9^Bc6n!M?QaW#2lRZ7lHiP-#|dT&GqkHL#p4U`dvyelQYN(E+@F$xH)ni zxp9{pcex?6KaJdw%MH2Qm^u6|a$_zx=5l>|myzmosXmt)*!uvf0hby$3I~JZdqe*w zkkLh?Q?V%YSS_NMFXdqMLU0}{#YY;3YF39GhNe~|T~0YszJ?xbwR;&muBS_FU3LhJ zTu(&zsY+8oMjgQ#ep`#i#X&vAN`IHCo>+l;m38HRY^75dw1n@}46iThsMf^W>Ni~j z)TOPVx3zK3RqFEA$lGeZIjZbkLB0G(uuk?OV~G4Md(GaVv)Td_aZBhkkR16LhWV#2 y!USIR5~jCKM(ZS5C-2wE^*VV_Crfp5yG|DCWTsB$z6sr7nDL$NR|Ip~`F{Wy+^j7C literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/custom_operator.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/custom_operator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66c502973a25aec4e2411be292ee175e65883099 GIT binary patch literal 29281 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 Iepz4sFNsVJegFUf literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/operator.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/operator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84eb7230bfc06c539c7fc558b27a03b501789159 GIT binary patch literal 21361 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 Ta(LZb+an;b`#p}{tRw#m8%ea+ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/operator_attachment.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/operator_attachment.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fa6abfbaeaeb66dfb10819c4ce1861c14b381d1 GIT binary patch literal 10250 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 N9u9v2Ut(<@{x5})NbUdt literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/operator_attachments.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/operator_attachments.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1186ae566b35342285a3d51f4f0db17cd12ca4e5 GIT binary patch literal 8350 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/prebuilt_operator.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/intelligence/v2/__pycache__/prebuilt_operator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59544cb070f251d709eef14f53e356bc27e9d9bf GIT binary patch literal 22022 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/custom_operator.py b/venv/Lib/site-packages/twilio/rest/intelligence/v2/custom_operator.py new file mode 100644 index 00000000..3dd73d47 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/v2/custom_operator.py @@ -0,0 +1,716 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Intelligence + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CustomOperatorInstance(InstanceResource): + + class Availability(object): + INTERNAL = "internal" + BETA = "beta" + PUBLIC = "public" + RETIRED = "retired" + + """ + :ivar account_sid: The unique SID identifier of the Account the Custom Operator belongs to. + :ivar sid: A 34 character string that uniquely identifies this Custom Operator. + :ivar friendly_name: A human-readable name of this resource, up to 64 characters. + :ivar description: A human-readable description of this resource, longer than the friendly name. + :ivar author: The creator of the Custom Operator. Custom Operators can only be created by a Twilio Account. + :ivar operator_type: Operator Type for this Operator. References an existing Operator Type resource. + :ivar version: Numeric Custom Operator version. Incremented with each update on the resource, used to ensure integrity when updating the Custom Operator. + :ivar availability: + :ivar config: Operator configuration, following the schema defined by the Operator Type. Only available on Operators created by the Account. + :ivar date_created: The date that this Custom Operator was created, given in ISO 8601 format. + :ivar date_updated: The date that this Custom Operator was updated, given in ISO 8601 format. + :ivar url: The URL of this resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.description: Optional[str] = payload.get("description") + self.author: Optional[str] = payload.get("author") + self.operator_type: Optional[str] = payload.get("operator_type") + self.version: Optional[int] = deserialize.integer(payload.get("version")) + self.availability: Optional["CustomOperatorInstance.Availability"] = ( + payload.get("availability") + ) + self.config: Optional[Dict[str, object]] = payload.get("config") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[CustomOperatorContext] = None + + @property + def _proxy(self) -> "CustomOperatorContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CustomOperatorContext for this CustomOperatorInstance + """ + if self._context is None: + self._context = CustomOperatorContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CustomOperatorInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CustomOperatorInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CustomOperatorInstance": + """ + Fetch the CustomOperatorInstance + + + :returns: The fetched CustomOperatorInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CustomOperatorInstance": + """ + Asynchronous coroutine to fetch the CustomOperatorInstance + + + :returns: The fetched CustomOperatorInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: str, + config: object, + if_match: Union[str, object] = values.unset, + ) -> "CustomOperatorInstance": + """ + Update the CustomOperatorInstance + + :param friendly_name: A human-readable name of this resource, up to 64 characters. + :param config: Operator configuration, following the schema defined by the Operator Type. + :param if_match: The If-Match HTTP request header + + :returns: The updated CustomOperatorInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + config=config, + if_match=if_match, + ) + + async def update_async( + self, + friendly_name: str, + config: object, + if_match: Union[str, object] = values.unset, + ) -> "CustomOperatorInstance": + """ + Asynchronous coroutine to update the CustomOperatorInstance + + :param friendly_name: A human-readable name of this resource, up to 64 characters. + :param config: Operator configuration, following the schema defined by the Operator Type. + :param if_match: The If-Match HTTP request header + + :returns: The updated CustomOperatorInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + config=config, + if_match=if_match, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CustomOperatorContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the CustomOperatorContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this Custom Operator. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Operators/Custom/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the CustomOperatorInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CustomOperatorInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CustomOperatorInstance: + """ + Fetch the CustomOperatorInstance + + + :returns: The fetched CustomOperatorInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CustomOperatorInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CustomOperatorInstance: + """ + Asynchronous coroutine to fetch the CustomOperatorInstance + + + :returns: The fetched CustomOperatorInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CustomOperatorInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: str, + config: object, + if_match: Union[str, object] = values.unset, + ) -> CustomOperatorInstance: + """ + Update the CustomOperatorInstance + + :param friendly_name: A human-readable name of this resource, up to 64 characters. + :param config: Operator configuration, following the schema defined by the Operator Type. + :param if_match: The If-Match HTTP request header + + :returns: The updated CustomOperatorInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Config": serialize.object(config), + } + ) + headers = values.of({}) + + if not ( + if_match is values.unset or (isinstance(if_match, str) and not if_match) + ): + headers["If-Match"] = if_match + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CustomOperatorInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: str, + config: object, + if_match: Union[str, object] = values.unset, + ) -> CustomOperatorInstance: + """ + Asynchronous coroutine to update the CustomOperatorInstance + + :param friendly_name: A human-readable name of this resource, up to 64 characters. + :param config: Operator configuration, following the schema defined by the Operator Type. + :param if_match: The If-Match HTTP request header + + :returns: The updated CustomOperatorInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Config": serialize.object(config), + } + ) + headers = values.of({}) + + if not ( + if_match is values.unset or (isinstance(if_match, str) and not if_match) + ): + headers["If-Match"] = if_match + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CustomOperatorInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CustomOperatorPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CustomOperatorInstance: + """ + Build an instance of CustomOperatorInstance + + :param payload: Payload response from the API + """ + return CustomOperatorInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CustomOperatorList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CustomOperatorList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Operators/Custom" + + def create( + self, friendly_name: str, operator_type: str, config: object + ) -> CustomOperatorInstance: + """ + Create the CustomOperatorInstance + + :param friendly_name: A human readable description of the new Operator, up to 64 characters. + :param operator_type: Operator Type for this Operator. References an existing Operator Type resource. + :param config: Operator configuration, following the schema defined by the Operator Type. + + :returns: The created CustomOperatorInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "OperatorType": operator_type, + "Config": serialize.object(config), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CustomOperatorInstance(self._version, payload) + + async def create_async( + self, friendly_name: str, operator_type: str, config: object + ) -> CustomOperatorInstance: + """ + Asynchronously create the CustomOperatorInstance + + :param friendly_name: A human readable description of the new Operator, up to 64 characters. + :param operator_type: Operator Type for this Operator. References an existing Operator Type resource. + :param config: Operator configuration, following the schema defined by the Operator Type. + + :returns: The created CustomOperatorInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "OperatorType": operator_type, + "Config": serialize.object(config), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CustomOperatorInstance(self._version, payload) + + def stream( + self, + availability: Union[ + "CustomOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CustomOperatorInstance]: + """ + Streams CustomOperatorInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "CustomOperatorInstance.Availability" availability: Returns Custom Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Custom Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + availability=availability, + language_code=language_code, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + availability: Union[ + "CustomOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CustomOperatorInstance]: + """ + Asynchronously streams CustomOperatorInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "CustomOperatorInstance.Availability" availability: Returns Custom Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Custom Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + availability=availability, + language_code=language_code, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + availability: Union[ + "CustomOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CustomOperatorInstance]: + """ + Lists CustomOperatorInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "CustomOperatorInstance.Availability" availability: Returns Custom Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Custom Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + availability=availability, + language_code=language_code, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + availability: Union[ + "CustomOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CustomOperatorInstance]: + """ + Asynchronously lists CustomOperatorInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "CustomOperatorInstance.Availability" availability: Returns Custom Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Custom Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + availability=availability, + language_code=language_code, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + availability: Union[ + "CustomOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CustomOperatorPage: + """ + Retrieve a single page of CustomOperatorInstance records from the API. + Request is executed immediately + + :param availability: Returns Custom Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param language_code: Returns Custom Operators that support the provided language code. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CustomOperatorInstance + """ + data = values.of( + { + "Availability": availability, + "LanguageCode": language_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CustomOperatorPage(self._version, response) + + async def page_async( + self, + availability: Union[ + "CustomOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CustomOperatorPage: + """ + Asynchronously retrieve a single page of CustomOperatorInstance records from the API. + Request is executed immediately + + :param availability: Returns Custom Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param language_code: Returns Custom Operators that support the provided language code. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CustomOperatorInstance + """ + data = values.of( + { + "Availability": availability, + "LanguageCode": language_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CustomOperatorPage(self._version, response) + + def get_page(self, target_url: str) -> CustomOperatorPage: + """ + Retrieve a specific page of CustomOperatorInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CustomOperatorInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CustomOperatorPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CustomOperatorPage: + """ + Asynchronously retrieve a specific page of CustomOperatorInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CustomOperatorInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CustomOperatorPage(self._version, response) + + def get(self, sid: str) -> CustomOperatorContext: + """ + Constructs a CustomOperatorContext + + :param sid: A 34 character string that uniquely identifies this Custom Operator. + """ + return CustomOperatorContext(self._version, sid=sid) + + def __call__(self, sid: str) -> CustomOperatorContext: + """ + Constructs a CustomOperatorContext + + :param sid: A 34 character string that uniquely identifies this Custom Operator. + """ + return CustomOperatorContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator.py b/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator.py new file mode 100644 index 00000000..984c46d7 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator.py @@ -0,0 +1,476 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Intelligence + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class OperatorInstance(InstanceResource): + + class Availability(object): + INTERNAL = "internal" + BETA = "beta" + PUBLIC = "public" + RETIRED = "retired" + + """ + :ivar account_sid: The unique SID identifier of the Account the Operator belongs to. + :ivar sid: A 34 character string that uniquely identifies this Operator. + :ivar friendly_name: A human-readable name of this resource, up to 64 characters. + :ivar description: A human-readable description of this resource, longer than the friendly name. + :ivar author: The creator of the Operator. Either Twilio or the creating Account. + :ivar operator_type: Operator Type for this Operator. References an existing Operator Type resource. + :ivar version: Numeric Operator version. Incremented with each update on the resource, used to ensure integrity when updating the Operator. + :ivar availability: + :ivar config: Operator configuration, following the schema defined by the Operator Type. Only available on Custom Operators created by the Account. + :ivar date_created: The date that this Operator was created, given in ISO 8601 format. + :ivar date_updated: The date that this Operator was updated, given in ISO 8601 format. + :ivar url: The URL of this resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.description: Optional[str] = payload.get("description") + self.author: Optional[str] = payload.get("author") + self.operator_type: Optional[str] = payload.get("operator_type") + self.version: Optional[int] = deserialize.integer(payload.get("version")) + self.availability: Optional["OperatorInstance.Availability"] = payload.get( + "availability" + ) + self.config: Optional[Dict[str, object]] = payload.get("config") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[OperatorContext] = None + + @property + def _proxy(self) -> "OperatorContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: OperatorContext for this OperatorInstance + """ + if self._context is None: + self._context = OperatorContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "OperatorInstance": + """ + Fetch the OperatorInstance + + + :returns: The fetched OperatorInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "OperatorInstance": + """ + Asynchronous coroutine to fetch the OperatorInstance + + + :returns: The fetched OperatorInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OperatorContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the OperatorContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this Operator. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Operators/{sid}".format(**self._solution) + + def fetch(self) -> OperatorInstance: + """ + Fetch the OperatorInstance + + + :returns: The fetched OperatorInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return OperatorInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> OperatorInstance: + """ + Asynchronous coroutine to fetch the OperatorInstance + + + :returns: The fetched OperatorInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return OperatorInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OperatorPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> OperatorInstance: + """ + Build an instance of OperatorInstance + + :param payload: Payload response from the API + """ + return OperatorInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class OperatorList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the OperatorList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Operators" + + def stream( + self, + availability: Union["OperatorInstance.Availability", object] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[OperatorInstance]: + """ + Streams OperatorInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "OperatorInstance.Availability" availability: Returns Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + availability=availability, + language_code=language_code, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + availability: Union["OperatorInstance.Availability", object] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[OperatorInstance]: + """ + Asynchronously streams OperatorInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "OperatorInstance.Availability" availability: Returns Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + availability=availability, + language_code=language_code, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + availability: Union["OperatorInstance.Availability", object] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[OperatorInstance]: + """ + Lists OperatorInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "OperatorInstance.Availability" availability: Returns Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + availability=availability, + language_code=language_code, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + availability: Union["OperatorInstance.Availability", object] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[OperatorInstance]: + """ + Asynchronously lists OperatorInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "OperatorInstance.Availability" availability: Returns Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + availability=availability, + language_code=language_code, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + availability: Union["OperatorInstance.Availability", object] = values.unset, + language_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> OperatorPage: + """ + Retrieve a single page of OperatorInstance records from the API. + Request is executed immediately + + :param availability: Returns Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param language_code: Returns Operators that support the provided language code. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of OperatorInstance + """ + data = values.of( + { + "Availability": availability, + "LanguageCode": language_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return OperatorPage(self._version, response) + + async def page_async( + self, + availability: Union["OperatorInstance.Availability", object] = values.unset, + language_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> OperatorPage: + """ + Asynchronously retrieve a single page of OperatorInstance records from the API. + Request is executed immediately + + :param availability: Returns Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param language_code: Returns Operators that support the provided language code. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of OperatorInstance + """ + data = values.of( + { + "Availability": availability, + "LanguageCode": language_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return OperatorPage(self._version, response) + + def get_page(self, target_url: str) -> OperatorPage: + """ + Retrieve a specific page of OperatorInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of OperatorInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return OperatorPage(self._version, response) + + async def get_page_async(self, target_url: str) -> OperatorPage: + """ + Asynchronously retrieve a specific page of OperatorInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of OperatorInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return OperatorPage(self._version, response) + + def get(self, sid: str) -> OperatorContext: + """ + Constructs a OperatorContext + + :param sid: A 34 character string that uniquely identifies this Operator. + """ + return OperatorContext(self._version, sid=sid) + + def __call__(self, sid: str) -> OperatorContext: + """ + Constructs a OperatorContext + + :param sid: A 34 character string that uniquely identifies this Operator. + """ + return OperatorContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_attachment.py b/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_attachment.py new file mode 100644 index 00000000..6080bc5e --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_attachment.py @@ -0,0 +1,247 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Intelligence + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class OperatorAttachmentInstance(InstanceResource): + """ + :ivar service_sid: The unique SID identifier of the Service. + :ivar operator_sid: The unique SID identifier of the Operator. + :ivar url: The URL of this resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: Optional[str] = None, + operator_sid: Optional[str] = None, + ): + super().__init__(version) + + self.service_sid: Optional[str] = payload.get("service_sid") + self.operator_sid: Optional[str] = payload.get("operator_sid") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid or self.service_sid, + "operator_sid": operator_sid or self.operator_sid, + } + self._context: Optional[OperatorAttachmentContext] = None + + @property + def _proxy(self) -> "OperatorAttachmentContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: OperatorAttachmentContext for this OperatorAttachmentInstance + """ + if self._context is None: + self._context = OperatorAttachmentContext( + self._version, + service_sid=self._solution["service_sid"], + operator_sid=self._solution["operator_sid"], + ) + return self._context + + def create(self) -> "OperatorAttachmentInstance": + """ + Create the OperatorAttachmentInstance + + + :returns: The created OperatorAttachmentInstance + """ + return self._proxy.create() + + async def create_async(self) -> "OperatorAttachmentInstance": + """ + Asynchronous coroutine to create the OperatorAttachmentInstance + + + :returns: The created OperatorAttachmentInstance + """ + return await self._proxy.create_async() + + def delete(self) -> bool: + """ + Deletes the OperatorAttachmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the OperatorAttachmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OperatorAttachmentContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, operator_sid: str): + """ + Initialize the OperatorAttachmentContext + + :param version: Version that contains the resource + :param service_sid: The unique SID identifier of the Service. + :param operator_sid: The unique SID identifier of the Operator. Allows both Custom and Pre-built Operators. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "operator_sid": operator_sid, + } + self._uri = "/Services/{service_sid}/Operators/{operator_sid}".format( + **self._solution + ) + + def create(self) -> OperatorAttachmentInstance: + """ + Create the OperatorAttachmentInstance + + + :returns: The created OperatorAttachmentInstance + """ + data = values.of({}) + + payload = self._version.create(method="POST", uri=self._uri, data=data) + + return OperatorAttachmentInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + operator_sid=self._solution["operator_sid"], + ) + + async def create_async(self) -> OperatorAttachmentInstance: + """ + Asynchronous coroutine to create the OperatorAttachmentInstance + + + :returns: The created OperatorAttachmentInstance + """ + data = values.of({}) + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data + ) + + return OperatorAttachmentInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + operator_sid=self._solution["operator_sid"], + ) + + def delete(self) -> bool: + """ + Deletes the OperatorAttachmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the OperatorAttachmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OperatorAttachmentList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the OperatorAttachmentList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, service_sid: str, operator_sid: str) -> OperatorAttachmentContext: + """ + Constructs a OperatorAttachmentContext + + :param service_sid: The unique SID identifier of the Service. + :param operator_sid: The unique SID identifier of the Operator. Allows both Custom and Pre-built Operators. + """ + return OperatorAttachmentContext( + self._version, service_sid=service_sid, operator_sid=operator_sid + ) + + def __call__( + self, service_sid: str, operator_sid: str + ) -> OperatorAttachmentContext: + """ + Constructs a OperatorAttachmentContext + + :param service_sid: The unique SID identifier of the Service. + :param operator_sid: The unique SID identifier of the Operator. Allows both Custom and Pre-built Operators. + """ + return OperatorAttachmentContext( + self._version, service_sid=service_sid, operator_sid=operator_sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_attachments.py b/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_attachments.py new file mode 100644 index 00000000..19a875f7 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_attachments.py @@ -0,0 +1,192 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Intelligence + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class OperatorAttachmentsInstance(InstanceResource): + """ + :ivar service_sid: The unique SID identifier of the Service. + :ivar operator_sids: List of Operator SIDs attached to the service. Includes both Custom and Pre-built Operators. + :ivar url: The URL of this resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: Optional[str] = None, + ): + super().__init__(version) + + self.service_sid: Optional[str] = payload.get("service_sid") + self.operator_sids: Optional[List[str]] = payload.get("operator_sids") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid or self.service_sid, + } + self._context: Optional[OperatorAttachmentsContext] = None + + @property + def _proxy(self) -> "OperatorAttachmentsContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: OperatorAttachmentsContext for this OperatorAttachmentsInstance + """ + if self._context is None: + self._context = OperatorAttachmentsContext( + self._version, + service_sid=self._solution["service_sid"], + ) + return self._context + + def fetch(self) -> "OperatorAttachmentsInstance": + """ + Fetch the OperatorAttachmentsInstance + + + :returns: The fetched OperatorAttachmentsInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "OperatorAttachmentsInstance": + """ + Asynchronous coroutine to fetch the OperatorAttachmentsInstance + + + :returns: The fetched OperatorAttachmentsInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OperatorAttachmentsContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the OperatorAttachmentsContext + + :param version: Version that contains the resource + :param service_sid: The unique SID identifier of the Service. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Operators".format(**self._solution) + + def fetch(self) -> OperatorAttachmentsInstance: + """ + Fetch the OperatorAttachmentsInstance + + + :returns: The fetched OperatorAttachmentsInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return OperatorAttachmentsInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + ) + + async def fetch_async(self) -> OperatorAttachmentsInstance: + """ + Asynchronous coroutine to fetch the OperatorAttachmentsInstance + + + :returns: The fetched OperatorAttachmentsInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return OperatorAttachmentsInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OperatorAttachmentsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the OperatorAttachmentsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, service_sid: str) -> OperatorAttachmentsContext: + """ + Constructs a OperatorAttachmentsContext + + :param service_sid: The unique SID identifier of the Service. + """ + return OperatorAttachmentsContext(self._version, service_sid=service_sid) + + def __call__(self, service_sid: str) -> OperatorAttachmentsContext: + """ + Constructs a OperatorAttachmentsContext + + :param service_sid: The unique SID identifier of the Service. + """ + return OperatorAttachmentsContext(self._version, service_sid=service_sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_type.py b/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_type.py new file mode 100644 index 00000000..b14e677a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/v2/operator_type.py @@ -0,0 +1,458 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Intelligence + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class OperatorTypeInstance(InstanceResource): + + class Availability(object): + INTERNAL = "internal" + BETA = "beta" + GENERAL_AVAILABILITY = "general-availability" + RETIRED = "retired" + DEPRECATED = "deprecated" + + class OutputType(object): + TEXT_CLASSIFICATION = "text-classification" + TEXT_EXTRACTION = "text-extraction" + TEXT_EXTRACTION_NORMALIZED = "text-extraction-normalized" + TEXT_GENERATION = "text-generation" + + class Provider(object): + TWILIO = "twilio" + AMAZON = "amazon" + OPENAI = "openai" + + """ + :ivar name: A unique name that references an Operator's Operator Type. + :ivar sid: A 34 character string that uniquely identifies this Operator Type. + :ivar friendly_name: A human-readable name of this resource, up to 64 characters. + :ivar description: A human-readable description of this resource, longer than the friendly name. + :ivar docs_link: Additional documentation for the Operator Type. + :ivar output_type: + :ivar supported_languages: List of languages this Operator Type supports. + :ivar provider: + :ivar availability: + :ivar configurable: Operators can be created from configurable Operator Types. + :ivar config_schema: JSON Schema for configuring an Operator with this Operator Type. Following https://json-schema.org/ + :ivar date_created: The date that this Operator Type was created, given in ISO 8601 format. + :ivar date_updated: The date that this Operator Type was updated, given in ISO 8601 format. + :ivar url: The URL of this resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.name: Optional[str] = payload.get("name") + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.description: Optional[str] = payload.get("description") + self.docs_link: Optional[str] = payload.get("docs_link") + self.output_type: Optional["OperatorTypeInstance.OutputType"] = payload.get( + "output_type" + ) + self.supported_languages: Optional[List[str]] = payload.get( + "supported_languages" + ) + self.provider: Optional["OperatorTypeInstance.Provider"] = payload.get( + "provider" + ) + self.availability: Optional["OperatorTypeInstance.Availability"] = payload.get( + "availability" + ) + self.configurable: Optional[bool] = payload.get("configurable") + self.config_schema: Optional[Dict[str, object]] = payload.get("config_schema") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[OperatorTypeContext] = None + + @property + def _proxy(self) -> "OperatorTypeContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: OperatorTypeContext for this OperatorTypeInstance + """ + if self._context is None: + self._context = OperatorTypeContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "OperatorTypeInstance": + """ + Fetch the OperatorTypeInstance + + + :returns: The fetched OperatorTypeInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "OperatorTypeInstance": + """ + Asynchronous coroutine to fetch the OperatorTypeInstance + + + :returns: The fetched OperatorTypeInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OperatorTypeContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the OperatorTypeContext + + :param version: Version that contains the resource + :param sid: Either a 34 character string that uniquely identifies this Operator Type or the unique name that references an Operator Type. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/OperatorTypes/{sid}".format(**self._solution) + + def fetch(self) -> OperatorTypeInstance: + """ + Fetch the OperatorTypeInstance + + + :returns: The fetched OperatorTypeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return OperatorTypeInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> OperatorTypeInstance: + """ + Asynchronous coroutine to fetch the OperatorTypeInstance + + + :returns: The fetched OperatorTypeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return OperatorTypeInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OperatorTypePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> OperatorTypeInstance: + """ + Build an instance of OperatorTypeInstance + + :param payload: Payload response from the API + """ + return OperatorTypeInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class OperatorTypeList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the OperatorTypeList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/OperatorTypes" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[OperatorTypeInstance]: + """ + Streams OperatorTypeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[OperatorTypeInstance]: + """ + Asynchronously streams OperatorTypeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[OperatorTypeInstance]: + """ + Lists OperatorTypeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[OperatorTypeInstance]: + """ + Asynchronously lists OperatorTypeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> OperatorTypePage: + """ + Retrieve a single page of OperatorTypeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of OperatorTypeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return OperatorTypePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> OperatorTypePage: + """ + Asynchronously retrieve a single page of OperatorTypeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of OperatorTypeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return OperatorTypePage(self._version, response) + + def get_page(self, target_url: str) -> OperatorTypePage: + """ + Retrieve a specific page of OperatorTypeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of OperatorTypeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return OperatorTypePage(self._version, response) + + async def get_page_async(self, target_url: str) -> OperatorTypePage: + """ + Asynchronously retrieve a specific page of OperatorTypeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of OperatorTypeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return OperatorTypePage(self._version, response) + + def get(self, sid: str) -> OperatorTypeContext: + """ + Constructs a OperatorTypeContext + + :param sid: Either a 34 character string that uniquely identifies this Operator Type or the unique name that references an Operator Type. + """ + return OperatorTypeContext(self._version, sid=sid) + + def __call__(self, sid: str) -> OperatorTypeContext: + """ + Constructs a OperatorTypeContext + + :param sid: Either a 34 character string that uniquely identifies this Operator Type or the unique name that references an Operator Type. + """ + return OperatorTypeContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/prebuilt_operator.py b/venv/Lib/site-packages/twilio/rest/intelligence/v2/prebuilt_operator.py new file mode 100644 index 00000000..50693f29 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/v2/prebuilt_operator.py @@ -0,0 +1,488 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Intelligence + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class PrebuiltOperatorInstance(InstanceResource): + + class Availability(object): + INTERNAL = "internal" + BETA = "beta" + PUBLIC = "public" + RETIRED = "retired" + + """ + :ivar account_sid: The unique SID identifier of the Account the Pre-built Operator belongs to. + :ivar sid: A 34 character string that uniquely identifies this Pre-built Operator. + :ivar friendly_name: A human-readable name of this resource, up to 64 characters. + :ivar description: A human-readable description of this resource, longer than the friendly name. + :ivar author: The creator of the Operator. Pre-built Operators can only be created by Twilio. + :ivar operator_type: Operator Type for this Operator. References an existing Operator Type resource. + :ivar version: Numeric Operator version. Incremented with each update on the resource, used to ensure integrity when updating the Operator. + :ivar availability: + :ivar config: Operator configuration, following the schema defined by the Operator Type. Only available on Custom Operators created by the Account, will be empty for Pre-Built Operators. + :ivar date_created: The date that this Pre-built Operator was created, given in ISO 8601 format. + :ivar date_updated: The date that this Pre-built Operator was updated, given in ISO 8601 format. + :ivar url: The URL of this resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.description: Optional[str] = payload.get("description") + self.author: Optional[str] = payload.get("author") + self.operator_type: Optional[str] = payload.get("operator_type") + self.version: Optional[int] = deserialize.integer(payload.get("version")) + self.availability: Optional["PrebuiltOperatorInstance.Availability"] = ( + payload.get("availability") + ) + self.config: Optional[Dict[str, object]] = payload.get("config") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[PrebuiltOperatorContext] = None + + @property + def _proxy(self) -> "PrebuiltOperatorContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PrebuiltOperatorContext for this PrebuiltOperatorInstance + """ + if self._context is None: + self._context = PrebuiltOperatorContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "PrebuiltOperatorInstance": + """ + Fetch the PrebuiltOperatorInstance + + + :returns: The fetched PrebuiltOperatorInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "PrebuiltOperatorInstance": + """ + Asynchronous coroutine to fetch the PrebuiltOperatorInstance + + + :returns: The fetched PrebuiltOperatorInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PrebuiltOperatorContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the PrebuiltOperatorContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this Pre-built Operator. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Operators/PreBuilt/{sid}".format(**self._solution) + + def fetch(self) -> PrebuiltOperatorInstance: + """ + Fetch the PrebuiltOperatorInstance + + + :returns: The fetched PrebuiltOperatorInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return PrebuiltOperatorInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> PrebuiltOperatorInstance: + """ + Asynchronous coroutine to fetch the PrebuiltOperatorInstance + + + :returns: The fetched PrebuiltOperatorInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return PrebuiltOperatorInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PrebuiltOperatorPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> PrebuiltOperatorInstance: + """ + Build an instance of PrebuiltOperatorInstance + + :param payload: Payload response from the API + """ + return PrebuiltOperatorInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class PrebuiltOperatorList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PrebuiltOperatorList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Operators/PreBuilt" + + def stream( + self, + availability: Union[ + "PrebuiltOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[PrebuiltOperatorInstance]: + """ + Streams PrebuiltOperatorInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "PrebuiltOperatorInstance.Availability" availability: Returns Pre-built Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Pre-built Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + availability=availability, + language_code=language_code, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + availability: Union[ + "PrebuiltOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[PrebuiltOperatorInstance]: + """ + Asynchronously streams PrebuiltOperatorInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "PrebuiltOperatorInstance.Availability" availability: Returns Pre-built Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Pre-built Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + availability=availability, + language_code=language_code, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + availability: Union[ + "PrebuiltOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PrebuiltOperatorInstance]: + """ + Lists PrebuiltOperatorInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "PrebuiltOperatorInstance.Availability" availability: Returns Pre-built Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Pre-built Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + availability=availability, + language_code=language_code, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + availability: Union[ + "PrebuiltOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PrebuiltOperatorInstance]: + """ + Asynchronously lists PrebuiltOperatorInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "PrebuiltOperatorInstance.Availability" availability: Returns Pre-built Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param str language_code: Returns Pre-built Operators that support the provided language code. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + availability=availability, + language_code=language_code, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + availability: Union[ + "PrebuiltOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PrebuiltOperatorPage: + """ + Retrieve a single page of PrebuiltOperatorInstance records from the API. + Request is executed immediately + + :param availability: Returns Pre-built Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param language_code: Returns Pre-built Operators that support the provided language code. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PrebuiltOperatorInstance + """ + data = values.of( + { + "Availability": availability, + "LanguageCode": language_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PrebuiltOperatorPage(self._version, response) + + async def page_async( + self, + availability: Union[ + "PrebuiltOperatorInstance.Availability", object + ] = values.unset, + language_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PrebuiltOperatorPage: + """ + Asynchronously retrieve a single page of PrebuiltOperatorInstance records from the API. + Request is executed immediately + + :param availability: Returns Pre-built Operators with the provided availability type. Possible values: internal, beta, public, retired. + :param language_code: Returns Pre-built Operators that support the provided language code. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PrebuiltOperatorInstance + """ + data = values.of( + { + "Availability": availability, + "LanguageCode": language_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PrebuiltOperatorPage(self._version, response) + + def get_page(self, target_url: str) -> PrebuiltOperatorPage: + """ + Retrieve a specific page of PrebuiltOperatorInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PrebuiltOperatorInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return PrebuiltOperatorPage(self._version, response) + + async def get_page_async(self, target_url: str) -> PrebuiltOperatorPage: + """ + Asynchronously retrieve a specific page of PrebuiltOperatorInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PrebuiltOperatorInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return PrebuiltOperatorPage(self._version, response) + + def get(self, sid: str) -> PrebuiltOperatorContext: + """ + Constructs a PrebuiltOperatorContext + + :param sid: A 34 character string that uniquely identifies this Pre-built Operator. + """ + return PrebuiltOperatorContext(self._version, sid=sid) + + def __call__(self, sid: str) -> PrebuiltOperatorContext: + """ + Constructs a PrebuiltOperatorContext + + :param sid: A 34 character string that uniquely identifies this Pre-built Operator. + """ + return PrebuiltOperatorContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/service.py b/venv/Lib/site-packages/twilio/rest/intelligence/v2/service.py new file mode 100644 index 00000000..fac3eb84 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/v2/service.py @@ -0,0 +1,787 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Intelligence + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ServiceInstance(InstanceResource): + + class HttpMethod(object): + GET = "GET" + POST = "POST" + NULL = "NULL" + + """ + :ivar account_sid: The unique SID identifier of the Account the Service belongs to. + :ivar auto_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts made on this service. + :ivar media_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts media made on this service. The auto_redaction flag must be enabled, results in error otherwise. + :ivar auto_transcribe: Instructs the Speech Recognition service to automatically transcribe all recordings made on the account. + :ivar data_logging: Data logging allows Twilio to improve the quality of the speech recognition & language understanding services through using customer data to refine, fine tune and evaluate machine learning models. Note: Data logging cannot be activated via API, only via www.twilio.com, as it requires additional consent. + :ivar date_created: The date that this Service was created, given in ISO 8601 format. + :ivar date_updated: The date that this Service was updated, given in ISO 8601 format. + :ivar friendly_name: A human readable description of this resource, up to 64 characters. + :ivar language_code: The language code set during Service creation determines the Transcription language for all call recordings processed by that Service. The default is en-US if no language code is set. A Service can only support one language code, and it cannot be updated once it's set. + :ivar sid: A 34 character string that uniquely identifies this Service. + :ivar unique_name: Provides a unique and addressable name to be assigned to this Service, assigned by the developer, to be optionally used in addition to SID. + :ivar url: The URL of this resource. + :ivar webhook_url: The URL Twilio will request when executing the Webhook. + :ivar webhook_http_method: + :ivar read_only_attached_operator_sids: Operator sids attached to this service, read only + :ivar version: The version number of this Service. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.auto_redaction: Optional[bool] = payload.get("auto_redaction") + self.media_redaction: Optional[bool] = payload.get("media_redaction") + self.auto_transcribe: Optional[bool] = payload.get("auto_transcribe") + self.data_logging: Optional[bool] = payload.get("data_logging") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.language_code: Optional[str] = payload.get("language_code") + self.sid: Optional[str] = payload.get("sid") + self.unique_name: Optional[str] = payload.get("unique_name") + self.url: Optional[str] = payload.get("url") + self.webhook_url: Optional[str] = payload.get("webhook_url") + self.webhook_http_method: Optional["ServiceInstance.HttpMethod"] = payload.get( + "webhook_http_method" + ) + self.read_only_attached_operator_sids: Optional[List[str]] = payload.get( + "read_only_attached_operator_sids" + ) + self.version: Optional[int] = deserialize.integer(payload.get("version")) + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ServiceContext] = None + + @property + def _proxy(self) -> "ServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ServiceContext for this ServiceInstance + """ + if self._context is None: + self._context = ServiceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ServiceInstance": + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ServiceInstance": + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + if_match: Union[str, object] = values.unset, + auto_transcribe: Union[bool, object] = values.unset, + data_logging: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + auto_redaction: Union[bool, object] = values.unset, + media_redaction: Union[bool, object] = values.unset, + webhook_url: Union[str, object] = values.unset, + webhook_http_method: Union["ServiceInstance.HttpMethod", object] = values.unset, + ) -> "ServiceInstance": + """ + Update the ServiceInstance + + :param if_match: The If-Match HTTP request header + :param auto_transcribe: Instructs the Speech Recognition service to automatically transcribe all recordings made on the account. + :param data_logging: Data logging allows Twilio to improve the quality of the speech recognition & language understanding services through using customer data to refine, fine tune and evaluate machine learning models. Note: Data logging cannot be activated via API, only via www.twilio.com, as it requires additional consent. + :param friendly_name: A human readable description of this resource, up to 64 characters. + :param unique_name: Provides a unique and addressable name to be assigned to this Service, assigned by the developer, to be optionally used in addition to SID. + :param auto_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts made on this service. + :param media_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts media made on this service. The auto_redaction flag must be enabled, results in error otherwise. + :param webhook_url: The URL Twilio will request when executing the Webhook. + :param webhook_http_method: + + :returns: The updated ServiceInstance + """ + return self._proxy.update( + if_match=if_match, + auto_transcribe=auto_transcribe, + data_logging=data_logging, + friendly_name=friendly_name, + unique_name=unique_name, + auto_redaction=auto_redaction, + media_redaction=media_redaction, + webhook_url=webhook_url, + webhook_http_method=webhook_http_method, + ) + + async def update_async( + self, + if_match: Union[str, object] = values.unset, + auto_transcribe: Union[bool, object] = values.unset, + data_logging: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + auto_redaction: Union[bool, object] = values.unset, + media_redaction: Union[bool, object] = values.unset, + webhook_url: Union[str, object] = values.unset, + webhook_http_method: Union["ServiceInstance.HttpMethod", object] = values.unset, + ) -> "ServiceInstance": + """ + Asynchronous coroutine to update the ServiceInstance + + :param if_match: The If-Match HTTP request header + :param auto_transcribe: Instructs the Speech Recognition service to automatically transcribe all recordings made on the account. + :param data_logging: Data logging allows Twilio to improve the quality of the speech recognition & language understanding services through using customer data to refine, fine tune and evaluate machine learning models. Note: Data logging cannot be activated via API, only via www.twilio.com, as it requires additional consent. + :param friendly_name: A human readable description of this resource, up to 64 characters. + :param unique_name: Provides a unique and addressable name to be assigned to this Service, assigned by the developer, to be optionally used in addition to SID. + :param auto_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts made on this service. + :param media_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts media made on this service. The auto_redaction flag must be enabled, results in error otherwise. + :param webhook_url: The URL Twilio will request when executing the Webhook. + :param webhook_http_method: + + :returns: The updated ServiceInstance + """ + return await self._proxy.update_async( + if_match=if_match, + auto_transcribe=auto_transcribe, + data_logging=data_logging, + friendly_name=friendly_name, + unique_name=unique_name, + auto_redaction=auto_redaction, + media_redaction=media_redaction, + webhook_url=webhook_url, + webhook_http_method=webhook_http_method, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServiceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ServiceContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this Service. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Services/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ServiceInstance: + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ServiceInstance: + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + if_match: Union[str, object] = values.unset, + auto_transcribe: Union[bool, object] = values.unset, + data_logging: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + auto_redaction: Union[bool, object] = values.unset, + media_redaction: Union[bool, object] = values.unset, + webhook_url: Union[str, object] = values.unset, + webhook_http_method: Union["ServiceInstance.HttpMethod", object] = values.unset, + ) -> ServiceInstance: + """ + Update the ServiceInstance + + :param if_match: The If-Match HTTP request header + :param auto_transcribe: Instructs the Speech Recognition service to automatically transcribe all recordings made on the account. + :param data_logging: Data logging allows Twilio to improve the quality of the speech recognition & language understanding services through using customer data to refine, fine tune and evaluate machine learning models. Note: Data logging cannot be activated via API, only via www.twilio.com, as it requires additional consent. + :param friendly_name: A human readable description of this resource, up to 64 characters. + :param unique_name: Provides a unique and addressable name to be assigned to this Service, assigned by the developer, to be optionally used in addition to SID. + :param auto_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts made on this service. + :param media_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts media made on this service. The auto_redaction flag must be enabled, results in error otherwise. + :param webhook_url: The URL Twilio will request when executing the Webhook. + :param webhook_http_method: + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "AutoTranscribe": serialize.boolean_to_string(auto_transcribe), + "DataLogging": serialize.boolean_to_string(data_logging), + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "AutoRedaction": serialize.boolean_to_string(auto_redaction), + "MediaRedaction": serialize.boolean_to_string(media_redaction), + "WebhookUrl": webhook_url, + "WebhookHttpMethod": webhook_http_method, + } + ) + headers = values.of({}) + + if not ( + if_match is values.unset or (isinstance(if_match, str) and not if_match) + ): + headers["If-Match"] = if_match + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + if_match: Union[str, object] = values.unset, + auto_transcribe: Union[bool, object] = values.unset, + data_logging: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + auto_redaction: Union[bool, object] = values.unset, + media_redaction: Union[bool, object] = values.unset, + webhook_url: Union[str, object] = values.unset, + webhook_http_method: Union["ServiceInstance.HttpMethod", object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronous coroutine to update the ServiceInstance + + :param if_match: The If-Match HTTP request header + :param auto_transcribe: Instructs the Speech Recognition service to automatically transcribe all recordings made on the account. + :param data_logging: Data logging allows Twilio to improve the quality of the speech recognition & language understanding services through using customer data to refine, fine tune and evaluate machine learning models. Note: Data logging cannot be activated via API, only via www.twilio.com, as it requires additional consent. + :param friendly_name: A human readable description of this resource, up to 64 characters. + :param unique_name: Provides a unique and addressable name to be assigned to this Service, assigned by the developer, to be optionally used in addition to SID. + :param auto_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts made on this service. + :param media_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts media made on this service. The auto_redaction flag must be enabled, results in error otherwise. + :param webhook_url: The URL Twilio will request when executing the Webhook. + :param webhook_http_method: + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "AutoTranscribe": serialize.boolean_to_string(auto_transcribe), + "DataLogging": serialize.boolean_to_string(data_logging), + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "AutoRedaction": serialize.boolean_to_string(auto_redaction), + "MediaRedaction": serialize.boolean_to_string(media_redaction), + "WebhookUrl": webhook_url, + "WebhookHttpMethod": webhook_http_method, + } + ) + headers = values.of({}) + + if not ( + if_match is values.unset or (isinstance(if_match, str) and not if_match) + ): + headers["If-Match"] = if_match + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ServiceInstance: + """ + Build an instance of ServiceInstance + + :param payload: Payload response from the API + """ + return ServiceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services" + + def create( + self, + unique_name: str, + auto_transcribe: Union[bool, object] = values.unset, + data_logging: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + language_code: Union[str, object] = values.unset, + auto_redaction: Union[bool, object] = values.unset, + media_redaction: Union[bool, object] = values.unset, + webhook_url: Union[str, object] = values.unset, + webhook_http_method: Union["ServiceInstance.HttpMethod", object] = values.unset, + ) -> ServiceInstance: + """ + Create the ServiceInstance + + :param unique_name: Provides a unique and addressable name to be assigned to this Service, assigned by the developer, to be optionally used in addition to SID. + :param auto_transcribe: Instructs the Speech Recognition service to automatically transcribe all recordings made on the account. + :param data_logging: Data logging allows Twilio to improve the quality of the speech recognition & language understanding services through using customer data to refine, fine tune and evaluate machine learning models. Note: Data logging cannot be activated via API, only via www.twilio.com, as it requires additional consent. + :param friendly_name: A human readable description of this resource, up to 64 characters. + :param language_code: The language code set during Service creation determines the Transcription language for all call recordings processed by that Service. The default is en-US if no language code is set. A Service can only support one language code, and it cannot be updated once it's set. + :param auto_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts made on this service. + :param media_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts media made on this service. The auto_redaction flag must be enabled, results in error otherwise. + :param webhook_url: The URL Twilio will request when executing the Webhook. + :param webhook_http_method: + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "AutoTranscribe": serialize.boolean_to_string(auto_transcribe), + "DataLogging": serialize.boolean_to_string(data_logging), + "FriendlyName": friendly_name, + "LanguageCode": language_code, + "AutoRedaction": serialize.boolean_to_string(auto_redaction), + "MediaRedaction": serialize.boolean_to_string(media_redaction), + "WebhookUrl": webhook_url, + "WebhookHttpMethod": webhook_http_method, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + async def create_async( + self, + unique_name: str, + auto_transcribe: Union[bool, object] = values.unset, + data_logging: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + language_code: Union[str, object] = values.unset, + auto_redaction: Union[bool, object] = values.unset, + media_redaction: Union[bool, object] = values.unset, + webhook_url: Union[str, object] = values.unset, + webhook_http_method: Union["ServiceInstance.HttpMethod", object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronously create the ServiceInstance + + :param unique_name: Provides a unique and addressable name to be assigned to this Service, assigned by the developer, to be optionally used in addition to SID. + :param auto_transcribe: Instructs the Speech Recognition service to automatically transcribe all recordings made on the account. + :param data_logging: Data logging allows Twilio to improve the quality of the speech recognition & language understanding services through using customer data to refine, fine tune and evaluate machine learning models. Note: Data logging cannot be activated via API, only via www.twilio.com, as it requires additional consent. + :param friendly_name: A human readable description of this resource, up to 64 characters. + :param language_code: The language code set during Service creation determines the Transcription language for all call recordings processed by that Service. The default is en-US if no language code is set. A Service can only support one language code, and it cannot be updated once it's set. + :param auto_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts made on this service. + :param media_redaction: Instructs the Speech Recognition service to automatically redact PII from all transcripts media made on this service. The auto_redaction flag must be enabled, results in error otherwise. + :param webhook_url: The URL Twilio will request when executing the Webhook. + :param webhook_http_method: + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "AutoTranscribe": serialize.boolean_to_string(auto_transcribe), + "DataLogging": serialize.boolean_to_string(data_logging), + "FriendlyName": friendly_name, + "LanguageCode": language_code, + "AutoRedaction": serialize.boolean_to_string(auto_redaction), + "MediaRedaction": serialize.boolean_to_string(media_redaction), + "WebhookUrl": webhook_url, + "WebhookHttpMethod": webhook_http_method, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ServiceInstance]: + """ + Streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ServiceInstance]: + """ + Asynchronously streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Asynchronously lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Asynchronously retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + def get_page(self, target_url: str) -> ServicePage: + """ + Retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ServicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ServicePage: + """ + Asynchronously retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ServicePage(self._version, response) + + def get(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: A 34 character string that uniquely identifies this Service. + """ + return ServiceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: A 34 character string that uniquely identifies this Service. + """ + return ServiceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__init__.py b/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__init__.py new file mode 100644 index 00000000..c2141bb5 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__init__.py @@ -0,0 +1,775 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Intelligence + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.intelligence.v2.transcript.media import MediaList +from twilio.rest.intelligence.v2.transcript.operator_result import OperatorResultList +from twilio.rest.intelligence.v2.transcript.sentence import SentenceList + + +class TranscriptInstance(InstanceResource): + + class Status(object): + QUEUED = "queued" + IN_PROGRESS = "in-progress" + COMPLETED = "completed" + FAILED = "failed" + CANCELED = "canceled" + + """ + :ivar account_sid: The unique SID identifier of the Account. + :ivar service_sid: The unique SID identifier of the Service. + :ivar sid: A 34 character string that uniquely identifies this Transcript. + :ivar date_created: The date that this Transcript was created, given in ISO 8601 format. + :ivar date_updated: The date that this Transcript was updated, given in ISO 8601 format. + :ivar status: + :ivar channel: Media Channel describing Transcript Source and Participant Mapping + :ivar data_logging: Data logging allows Twilio to improve the quality of the speech recognition & language understanding services through using customer data to refine, fine tune and evaluate machine learning models. Note: Data logging cannot be activated via API, only via www.twilio.com, as it requires additional consent. + :ivar language_code: The default language code of the audio. + :ivar customer_key: + :ivar media_start_time: The date that this Transcript's media was started, given in ISO 8601 format. + :ivar duration: The duration of this Transcript's source + :ivar url: The URL of this resource. + :ivar redaction: If the transcript has been redacted, a redacted alternative of the transcript will be available. + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.sid: Optional[str] = payload.get("sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.status: Optional["TranscriptInstance.Status"] = payload.get("status") + self.channel: Optional[Dict[str, object]] = payload.get("channel") + self.data_logging: Optional[bool] = payload.get("data_logging") + self.language_code: Optional[str] = payload.get("language_code") + self.customer_key: Optional[str] = payload.get("customer_key") + self.media_start_time: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("media_start_time") + ) + self.duration: Optional[int] = deserialize.integer(payload.get("duration")) + self.url: Optional[str] = payload.get("url") + self.redaction: Optional[bool] = payload.get("redaction") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[TranscriptContext] = None + + @property + def _proxy(self) -> "TranscriptContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: TranscriptContext for this TranscriptInstance + """ + if self._context is None: + self._context = TranscriptContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the TranscriptInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the TranscriptInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "TranscriptInstance": + """ + Fetch the TranscriptInstance + + + :returns: The fetched TranscriptInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "TranscriptInstance": + """ + Asynchronous coroutine to fetch the TranscriptInstance + + + :returns: The fetched TranscriptInstance + """ + return await self._proxy.fetch_async() + + @property + def media(self) -> MediaList: + """ + Access the media + """ + return self._proxy.media + + @property + def operator_results(self) -> OperatorResultList: + """ + Access the operator_results + """ + return self._proxy.operator_results + + @property + def sentences(self) -> SentenceList: + """ + Access the sentences + """ + return self._proxy.sentences + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TranscriptContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the TranscriptContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this Transcript. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Transcripts/{sid}".format(**self._solution) + + self._media: Optional[MediaList] = None + self._operator_results: Optional[OperatorResultList] = None + self._sentences: Optional[SentenceList] = None + + def delete(self) -> bool: + """ + Deletes the TranscriptInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the TranscriptInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> TranscriptInstance: + """ + Fetch the TranscriptInstance + + + :returns: The fetched TranscriptInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return TranscriptInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> TranscriptInstance: + """ + Asynchronous coroutine to fetch the TranscriptInstance + + + :returns: The fetched TranscriptInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return TranscriptInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + @property + def media(self) -> MediaList: + """ + Access the media + """ + if self._media is None: + self._media = MediaList( + self._version, + self._solution["sid"], + ) + return self._media + + @property + def operator_results(self) -> OperatorResultList: + """ + Access the operator_results + """ + if self._operator_results is None: + self._operator_results = OperatorResultList( + self._version, + self._solution["sid"], + ) + return self._operator_results + + @property + def sentences(self) -> SentenceList: + """ + Access the sentences + """ + if self._sentences is None: + self._sentences = SentenceList( + self._version, + self._solution["sid"], + ) + return self._sentences + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TranscriptPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> TranscriptInstance: + """ + Build an instance of TranscriptInstance + + :param payload: Payload response from the API + """ + return TranscriptInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class TranscriptList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the TranscriptList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Transcripts" + + def create( + self, + service_sid: str, + channel: object, + customer_key: Union[str, object] = values.unset, + media_start_time: Union[datetime, object] = values.unset, + ) -> TranscriptInstance: + """ + Create the TranscriptInstance + + :param service_sid: The unique SID identifier of the Service. + :param channel: JSON object describing Media Channel including Source and Participants + :param customer_key: Used to store client provided metadata. Maximum of 64 double-byte UTF8 characters. + :param media_start_time: The date that this Transcript's media was started, given in ISO 8601 format. + + :returns: The created TranscriptInstance + """ + + data = values.of( + { + "ServiceSid": service_sid, + "Channel": serialize.object(channel), + "CustomerKey": customer_key, + "MediaStartTime": serialize.iso8601_datetime(media_start_time), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TranscriptInstance(self._version, payload) + + async def create_async( + self, + service_sid: str, + channel: object, + customer_key: Union[str, object] = values.unset, + media_start_time: Union[datetime, object] = values.unset, + ) -> TranscriptInstance: + """ + Asynchronously create the TranscriptInstance + + :param service_sid: The unique SID identifier of the Service. + :param channel: JSON object describing Media Channel including Source and Participants + :param customer_key: Used to store client provided metadata. Maximum of 64 double-byte UTF8 characters. + :param media_start_time: The date that this Transcript's media was started, given in ISO 8601 format. + + :returns: The created TranscriptInstance + """ + + data = values.of( + { + "ServiceSid": service_sid, + "Channel": serialize.object(channel), + "CustomerKey": customer_key, + "MediaStartTime": serialize.iso8601_datetime(media_start_time), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TranscriptInstance(self._version, payload) + + def stream( + self, + service_sid: Union[str, object] = values.unset, + before_start_time: Union[str, object] = values.unset, + after_start_time: Union[str, object] = values.unset, + before_date_created: Union[str, object] = values.unset, + after_date_created: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + language_code: Union[str, object] = values.unset, + source_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[TranscriptInstance]: + """ + Streams TranscriptInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str service_sid: The unique SID identifier of the Service. + :param str before_start_time: Filter by before StartTime. + :param str after_start_time: Filter by after StartTime. + :param str before_date_created: Filter by before DateCreated. + :param str after_date_created: Filter by after DateCreated. + :param str status: Filter by status. + :param str language_code: Filter by Language Code. + :param str source_sid: Filter by SourceSid. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + service_sid=service_sid, + before_start_time=before_start_time, + after_start_time=after_start_time, + before_date_created=before_date_created, + after_date_created=after_date_created, + status=status, + language_code=language_code, + source_sid=source_sid, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + service_sid: Union[str, object] = values.unset, + before_start_time: Union[str, object] = values.unset, + after_start_time: Union[str, object] = values.unset, + before_date_created: Union[str, object] = values.unset, + after_date_created: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + language_code: Union[str, object] = values.unset, + source_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[TranscriptInstance]: + """ + Asynchronously streams TranscriptInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str service_sid: The unique SID identifier of the Service. + :param str before_start_time: Filter by before StartTime. + :param str after_start_time: Filter by after StartTime. + :param str before_date_created: Filter by before DateCreated. + :param str after_date_created: Filter by after DateCreated. + :param str status: Filter by status. + :param str language_code: Filter by Language Code. + :param str source_sid: Filter by SourceSid. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + service_sid=service_sid, + before_start_time=before_start_time, + after_start_time=after_start_time, + before_date_created=before_date_created, + after_date_created=after_date_created, + status=status, + language_code=language_code, + source_sid=source_sid, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + service_sid: Union[str, object] = values.unset, + before_start_time: Union[str, object] = values.unset, + after_start_time: Union[str, object] = values.unset, + before_date_created: Union[str, object] = values.unset, + after_date_created: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + language_code: Union[str, object] = values.unset, + source_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TranscriptInstance]: + """ + Lists TranscriptInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str service_sid: The unique SID identifier of the Service. + :param str before_start_time: Filter by before StartTime. + :param str after_start_time: Filter by after StartTime. + :param str before_date_created: Filter by before DateCreated. + :param str after_date_created: Filter by after DateCreated. + :param str status: Filter by status. + :param str language_code: Filter by Language Code. + :param str source_sid: Filter by SourceSid. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + service_sid=service_sid, + before_start_time=before_start_time, + after_start_time=after_start_time, + before_date_created=before_date_created, + after_date_created=after_date_created, + status=status, + language_code=language_code, + source_sid=source_sid, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + service_sid: Union[str, object] = values.unset, + before_start_time: Union[str, object] = values.unset, + after_start_time: Union[str, object] = values.unset, + before_date_created: Union[str, object] = values.unset, + after_date_created: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + language_code: Union[str, object] = values.unset, + source_sid: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TranscriptInstance]: + """ + Asynchronously lists TranscriptInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str service_sid: The unique SID identifier of the Service. + :param str before_start_time: Filter by before StartTime. + :param str after_start_time: Filter by after StartTime. + :param str before_date_created: Filter by before DateCreated. + :param str after_date_created: Filter by after DateCreated. + :param str status: Filter by status. + :param str language_code: Filter by Language Code. + :param str source_sid: Filter by SourceSid. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + service_sid=service_sid, + before_start_time=before_start_time, + after_start_time=after_start_time, + before_date_created=before_date_created, + after_date_created=after_date_created, + status=status, + language_code=language_code, + source_sid=source_sid, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + service_sid: Union[str, object] = values.unset, + before_start_time: Union[str, object] = values.unset, + after_start_time: Union[str, object] = values.unset, + before_date_created: Union[str, object] = values.unset, + after_date_created: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + language_code: Union[str, object] = values.unset, + source_sid: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TranscriptPage: + """ + Retrieve a single page of TranscriptInstance records from the API. + Request is executed immediately + + :param service_sid: The unique SID identifier of the Service. + :param before_start_time: Filter by before StartTime. + :param after_start_time: Filter by after StartTime. + :param before_date_created: Filter by before DateCreated. + :param after_date_created: Filter by after DateCreated. + :param status: Filter by status. + :param language_code: Filter by Language Code. + :param source_sid: Filter by SourceSid. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TranscriptInstance + """ + data = values.of( + { + "ServiceSid": service_sid, + "BeforeStartTime": before_start_time, + "AfterStartTime": after_start_time, + "BeforeDateCreated": before_date_created, + "AfterDateCreated": after_date_created, + "Status": status, + "LanguageCode": language_code, + "SourceSid": source_sid, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TranscriptPage(self._version, response) + + async def page_async( + self, + service_sid: Union[str, object] = values.unset, + before_start_time: Union[str, object] = values.unset, + after_start_time: Union[str, object] = values.unset, + before_date_created: Union[str, object] = values.unset, + after_date_created: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + language_code: Union[str, object] = values.unset, + source_sid: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TranscriptPage: + """ + Asynchronously retrieve a single page of TranscriptInstance records from the API. + Request is executed immediately + + :param service_sid: The unique SID identifier of the Service. + :param before_start_time: Filter by before StartTime. + :param after_start_time: Filter by after StartTime. + :param before_date_created: Filter by before DateCreated. + :param after_date_created: Filter by after DateCreated. + :param status: Filter by status. + :param language_code: Filter by Language Code. + :param source_sid: Filter by SourceSid. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TranscriptInstance + """ + data = values.of( + { + "ServiceSid": service_sid, + "BeforeStartTime": before_start_time, + "AfterStartTime": after_start_time, + "BeforeDateCreated": before_date_created, + "AfterDateCreated": after_date_created, + "Status": status, + "LanguageCode": language_code, + "SourceSid": source_sid, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TranscriptPage(self._version, response) + + def get_page(self, target_url: str) -> TranscriptPage: + """ + Retrieve a specific page of TranscriptInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TranscriptInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return TranscriptPage(self._version, response) + + async def get_page_async(self, target_url: str) -> TranscriptPage: + """ + Asynchronously retrieve a specific page of TranscriptInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TranscriptInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return TranscriptPage(self._version, response) + + def get(self, sid: str) -> TranscriptContext: + """ + Constructs a TranscriptContext + + :param sid: A 34 character string that uniquely identifies this Transcript. + """ + return TranscriptContext(self._version, sid=sid) + + def __call__(self, sid: str) -> TranscriptContext: + """ + Constructs a TranscriptContext + + :param sid: A 34 character string that uniquely identifies this Transcript. + """ + return TranscriptContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0778d9ba56bd070734ebe46bdfd3ea45a67578f GIT binary patch literal 32717 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 SYXxB!fACuDa}Hi~FaHz1=O9Y} literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__pycache__/operator_result.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__pycache__/operator_result.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24f7877dc67cdbe158a3db259b945247921b213b GIT binary patch literal 23187 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__pycache__/sentence.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/__pycache__/sentence.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3b3b75a21fbce77c723fc69527bea8d920637a8 GIT binary patch literal 17881 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 eC~|9rujM "MediaContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MediaContext for this MediaInstance + """ + if self._context is None: + self._context = MediaContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self, redacted: Union[bool, object] = values.unset) -> "MediaInstance": + """ + Fetch the MediaInstance + + :param redacted: Grant access to PII Redacted/Unredacted Media. If redaction is enabled, the default is `true` to access redacted media. + + :returns: The fetched MediaInstance + """ + return self._proxy.fetch( + redacted=redacted, + ) + + async def fetch_async( + self, redacted: Union[bool, object] = values.unset + ) -> "MediaInstance": + """ + Asynchronous coroutine to fetch the MediaInstance + + :param redacted: Grant access to PII Redacted/Unredacted Media. If redaction is enabled, the default is `true` to access redacted media. + + :returns: The fetched MediaInstance + """ + return await self._proxy.fetch_async( + redacted=redacted, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MediaContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the MediaContext + + :param version: Version that contains the resource + :param sid: The unique SID identifier of the Transcript. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Transcripts/{sid}/Media".format(**self._solution) + + def fetch(self, redacted: Union[bool, object] = values.unset) -> MediaInstance: + """ + Fetch the MediaInstance + + :param redacted: Grant access to PII Redacted/Unredacted Media. If redaction is enabled, the default is `true` to access redacted media. + + :returns: The fetched MediaInstance + """ + + data = values.of( + { + "Redacted": serialize.boolean_to_string(redacted), + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return MediaInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async( + self, redacted: Union[bool, object] = values.unset + ) -> MediaInstance: + """ + Asynchronous coroutine to fetch the MediaInstance + + :param redacted: Grant access to PII Redacted/Unredacted Media. If redaction is enabled, the default is `true` to access redacted media. + + :returns: The fetched MediaInstance + """ + + data = values.of( + { + "Redacted": serialize.boolean_to_string(redacted), + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return MediaInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MediaList(ListResource): + + def __init__(self, version: Version, sid: str): + """ + Initialize the MediaList + + :param version: Version that contains the resource + :param sid: The unique SID identifier of the Transcript. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + + def get(self) -> MediaContext: + """ + Constructs a MediaContext + + """ + return MediaContext(self._version, sid=self._solution["sid"]) + + def __call__(self) -> MediaContext: + """ + Constructs a MediaContext + + """ + return MediaContext(self._version, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/operator_result.py b/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/operator_result.py new file mode 100644 index 00000000..9ba2c57f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/operator_result.py @@ -0,0 +1,531 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Intelligence + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class OperatorResultInstance(InstanceResource): + + class OperatorType(object): + CONVERSATION_CLASSIFY = "conversation_classify" + UTTERANCE_CLASSIFY = "utterance_classify" + EXTRACT = "extract" + EXTRACT_NORMALIZE = "extract_normalize" + PII_EXTRACT = "pii_extract" + TEXT_GENERATION = "text_generation" + JSON = "json" + + """ + :ivar operator_type: + :ivar name: The name of the applied Language Understanding. + :ivar operator_sid: A 34 character string that identifies this Language Understanding operator sid. + :ivar extract_match: Boolean to tell if extract Language Understanding Processing model matches results. + :ivar match_probability: Percentage of 'matching' class needed to consider a sentence matches + :ivar normalized_result: Normalized output of extraction stage which matches Label. + :ivar utterance_results: List of mapped utterance object which matches sentences. + :ivar utterance_match: Boolean to tell if Utterance matches results. + :ivar predicted_label: The 'matching' class. This might be available on conversation classify model outputs. + :ivar predicted_probability: Percentage of 'matching' class needed to consider a sentence matches. + :ivar label_probabilities: The labels probabilities. This might be available on conversation classify model outputs. + :ivar extract_results: List of text extraction results. This might be available on classify-extract model outputs. + :ivar text_generation_results: Output of a text generation operator for example Conversation Sumamary. + :ivar json_results: + :ivar transcript_sid: A 34 character string that uniquely identifies this Transcript. + :ivar url: The URL of this resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + transcript_sid: str, + operator_sid: Optional[str] = None, + ): + super().__init__(version) + + self.operator_type: Optional["OperatorResultInstance.OperatorType"] = ( + payload.get("operator_type") + ) + self.name: Optional[str] = payload.get("name") + self.operator_sid: Optional[str] = payload.get("operator_sid") + self.extract_match: Optional[bool] = payload.get("extract_match") + self.match_probability: Optional[float] = deserialize.decimal( + payload.get("match_probability") + ) + self.normalized_result: Optional[str] = payload.get("normalized_result") + self.utterance_results: Optional[List[Dict[str, object]]] = payload.get( + "utterance_results" + ) + self.utterance_match: Optional[bool] = payload.get("utterance_match") + self.predicted_label: Optional[str] = payload.get("predicted_label") + self.predicted_probability: Optional[float] = deserialize.decimal( + payload.get("predicted_probability") + ) + self.label_probabilities: Optional[Dict[str, object]] = payload.get( + "label_probabilities" + ) + self.extract_results: Optional[Dict[str, object]] = payload.get( + "extract_results" + ) + self.text_generation_results: Optional[Dict[str, object]] = payload.get( + "text_generation_results" + ) + self.json_results: Optional[Dict[str, object]] = payload.get("json_results") + self.transcript_sid: Optional[str] = payload.get("transcript_sid") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "transcript_sid": transcript_sid, + "operator_sid": operator_sid or self.operator_sid, + } + self._context: Optional[OperatorResultContext] = None + + @property + def _proxy(self) -> "OperatorResultContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: OperatorResultContext for this OperatorResultInstance + """ + if self._context is None: + self._context = OperatorResultContext( + self._version, + transcript_sid=self._solution["transcript_sid"], + operator_sid=self._solution["operator_sid"], + ) + return self._context + + def fetch( + self, redacted: Union[bool, object] = values.unset + ) -> "OperatorResultInstance": + """ + Fetch the OperatorResultInstance + + :param redacted: Grant access to PII redacted/unredacted Language Understanding operator. If redaction is enabled, the default is True. + + :returns: The fetched OperatorResultInstance + """ + return self._proxy.fetch( + redacted=redacted, + ) + + async def fetch_async( + self, redacted: Union[bool, object] = values.unset + ) -> "OperatorResultInstance": + """ + Asynchronous coroutine to fetch the OperatorResultInstance + + :param redacted: Grant access to PII redacted/unredacted Language Understanding operator. If redaction is enabled, the default is True. + + :returns: The fetched OperatorResultInstance + """ + return await self._proxy.fetch_async( + redacted=redacted, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OperatorResultContext(InstanceContext): + + def __init__(self, version: Version, transcript_sid: str, operator_sid: str): + """ + Initialize the OperatorResultContext + + :param version: Version that contains the resource + :param transcript_sid: A 34 character string that uniquely identifies this Transcript. + :param operator_sid: A 34 character string that identifies this Language Understanding operator sid. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "transcript_sid": transcript_sid, + "operator_sid": operator_sid, + } + self._uri = ( + "/Transcripts/{transcript_sid}/OperatorResults/{operator_sid}".format( + **self._solution + ) + ) + + def fetch( + self, redacted: Union[bool, object] = values.unset + ) -> OperatorResultInstance: + """ + Fetch the OperatorResultInstance + + :param redacted: Grant access to PII redacted/unredacted Language Understanding operator. If redaction is enabled, the default is True. + + :returns: The fetched OperatorResultInstance + """ + + data = values.of( + { + "Redacted": serialize.boolean_to_string(redacted), + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return OperatorResultInstance( + self._version, + payload, + transcript_sid=self._solution["transcript_sid"], + operator_sid=self._solution["operator_sid"], + ) + + async def fetch_async( + self, redacted: Union[bool, object] = values.unset + ) -> OperatorResultInstance: + """ + Asynchronous coroutine to fetch the OperatorResultInstance + + :param redacted: Grant access to PII redacted/unredacted Language Understanding operator. If redaction is enabled, the default is True. + + :returns: The fetched OperatorResultInstance + """ + + data = values.of( + { + "Redacted": serialize.boolean_to_string(redacted), + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return OperatorResultInstance( + self._version, + payload, + transcript_sid=self._solution["transcript_sid"], + operator_sid=self._solution["operator_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OperatorResultPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> OperatorResultInstance: + """ + Build an instance of OperatorResultInstance + + :param payload: Payload response from the API + """ + return OperatorResultInstance( + self._version, payload, transcript_sid=self._solution["transcript_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class OperatorResultList(ListResource): + + def __init__(self, version: Version, transcript_sid: str): + """ + Initialize the OperatorResultList + + :param version: Version that contains the resource + :param transcript_sid: A 34 character string that uniquely identifies this Transcript. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "transcript_sid": transcript_sid, + } + self._uri = "/Transcripts/{transcript_sid}/OperatorResults".format( + **self._solution + ) + + def stream( + self, + redacted: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[OperatorResultInstance]: + """ + Streams OperatorResultInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool redacted: Grant access to PII redacted/unredacted Language Understanding operator. If redaction is enabled, the default is True. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(redacted=redacted, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + redacted: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[OperatorResultInstance]: + """ + Asynchronously streams OperatorResultInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool redacted: Grant access to PII redacted/unredacted Language Understanding operator. If redaction is enabled, the default is True. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(redacted=redacted, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + redacted: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[OperatorResultInstance]: + """ + Lists OperatorResultInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool redacted: Grant access to PII redacted/unredacted Language Understanding operator. If redaction is enabled, the default is True. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + redacted=redacted, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + redacted: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[OperatorResultInstance]: + """ + Asynchronously lists OperatorResultInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool redacted: Grant access to PII redacted/unredacted Language Understanding operator. If redaction is enabled, the default is True. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + redacted=redacted, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + redacted: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> OperatorResultPage: + """ + Retrieve a single page of OperatorResultInstance records from the API. + Request is executed immediately + + :param redacted: Grant access to PII redacted/unredacted Language Understanding operator. If redaction is enabled, the default is True. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of OperatorResultInstance + """ + data = values.of( + { + "Redacted": serialize.boolean_to_string(redacted), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return OperatorResultPage(self._version, response, self._solution) + + async def page_async( + self, + redacted: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> OperatorResultPage: + """ + Asynchronously retrieve a single page of OperatorResultInstance records from the API. + Request is executed immediately + + :param redacted: Grant access to PII redacted/unredacted Language Understanding operator. If redaction is enabled, the default is True. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of OperatorResultInstance + """ + data = values.of( + { + "Redacted": serialize.boolean_to_string(redacted), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return OperatorResultPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> OperatorResultPage: + """ + Retrieve a specific page of OperatorResultInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of OperatorResultInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return OperatorResultPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> OperatorResultPage: + """ + Asynchronously retrieve a specific page of OperatorResultInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of OperatorResultInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return OperatorResultPage(self._version, response, self._solution) + + def get(self, operator_sid: str) -> OperatorResultContext: + """ + Constructs a OperatorResultContext + + :param operator_sid: A 34 character string that identifies this Language Understanding operator sid. + """ + return OperatorResultContext( + self._version, + transcript_sid=self._solution["transcript_sid"], + operator_sid=operator_sid, + ) + + def __call__(self, operator_sid: str) -> OperatorResultContext: + """ + Constructs a OperatorResultContext + + :param operator_sid: A 34 character string that identifies this Language Understanding operator sid. + """ + return OperatorResultContext( + self._version, + transcript_sid=self._solution["transcript_sid"], + operator_sid=operator_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/sentence.py b/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/sentence.py new file mode 100644 index 00000000..f4fb0b3b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/intelligence/v2/transcript/sentence.py @@ -0,0 +1,348 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Intelligence + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class SentenceInstance(InstanceResource): + """ + :ivar media_channel: The channel number. + :ivar sentence_index: The index of the sentence in the transcript. + :ivar start_time: Offset from the beginning of the transcript when this sentence starts. + :ivar end_time: Offset from the beginning of the transcript when this sentence ends. + :ivar transcript: Transcript text. + :ivar sid: A 34 character string that uniquely identifies this Sentence. + :ivar confidence: + :ivar words: Detailed information for each of the words of the given Sentence. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], transcript_sid: str): + super().__init__(version) + + self.media_channel: Optional[int] = deserialize.integer( + payload.get("media_channel") + ) + self.sentence_index: Optional[int] = deserialize.integer( + payload.get("sentence_index") + ) + self.start_time: Optional[float] = deserialize.decimal( + payload.get("start_time") + ) + self.end_time: Optional[float] = deserialize.decimal(payload.get("end_time")) + self.transcript: Optional[str] = payload.get("transcript") + self.sid: Optional[str] = payload.get("sid") + self.confidence: Optional[float] = deserialize.decimal( + payload.get("confidence") + ) + self.words: Optional[List[Dict[str, object]]] = payload.get("words") + + self._solution = { + "transcript_sid": transcript_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SentencePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SentenceInstance: + """ + Build an instance of SentenceInstance + + :param payload: Payload response from the API + """ + return SentenceInstance( + self._version, payload, transcript_sid=self._solution["transcript_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SentenceList(ListResource): + + def __init__(self, version: Version, transcript_sid: str): + """ + Initialize the SentenceList + + :param version: Version that contains the resource + :param transcript_sid: The unique SID identifier of the Transcript. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "transcript_sid": transcript_sid, + } + self._uri = "/Transcripts/{transcript_sid}/Sentences".format(**self._solution) + + def stream( + self, + redacted: Union[bool, object] = values.unset, + word_timestamps: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SentenceInstance]: + """ + Streams SentenceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool redacted: Grant access to PII Redacted/Unredacted Sentences. If redaction is enabled, the default is `true` to access redacted sentences. + :param bool word_timestamps: Returns word level timestamps information, if word_timestamps is enabled. The default is `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + redacted=redacted, + word_timestamps=word_timestamps, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + redacted: Union[bool, object] = values.unset, + word_timestamps: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SentenceInstance]: + """ + Asynchronously streams SentenceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool redacted: Grant access to PII Redacted/Unredacted Sentences. If redaction is enabled, the default is `true` to access redacted sentences. + :param bool word_timestamps: Returns word level timestamps information, if word_timestamps is enabled. The default is `false`. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + redacted=redacted, + word_timestamps=word_timestamps, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + redacted: Union[bool, object] = values.unset, + word_timestamps: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SentenceInstance]: + """ + Lists SentenceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool redacted: Grant access to PII Redacted/Unredacted Sentences. If redaction is enabled, the default is `true` to access redacted sentences. + :param bool word_timestamps: Returns word level timestamps information, if word_timestamps is enabled. The default is `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + redacted=redacted, + word_timestamps=word_timestamps, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + redacted: Union[bool, object] = values.unset, + word_timestamps: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SentenceInstance]: + """ + Asynchronously lists SentenceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool redacted: Grant access to PII Redacted/Unredacted Sentences. If redaction is enabled, the default is `true` to access redacted sentences. + :param bool word_timestamps: Returns word level timestamps information, if word_timestamps is enabled. The default is `false`. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + redacted=redacted, + word_timestamps=word_timestamps, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + redacted: Union[bool, object] = values.unset, + word_timestamps: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SentencePage: + """ + Retrieve a single page of SentenceInstance records from the API. + Request is executed immediately + + :param redacted: Grant access to PII Redacted/Unredacted Sentences. If redaction is enabled, the default is `true` to access redacted sentences. + :param word_timestamps: Returns word level timestamps information, if word_timestamps is enabled. The default is `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SentenceInstance + """ + data = values.of( + { + "Redacted": serialize.boolean_to_string(redacted), + "WordTimestamps": serialize.boolean_to_string(word_timestamps), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SentencePage(self._version, response, self._solution) + + async def page_async( + self, + redacted: Union[bool, object] = values.unset, + word_timestamps: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SentencePage: + """ + Asynchronously retrieve a single page of SentenceInstance records from the API. + Request is executed immediately + + :param redacted: Grant access to PII Redacted/Unredacted Sentences. If redaction is enabled, the default is `true` to access redacted sentences. + :param word_timestamps: Returns word level timestamps information, if word_timestamps is enabled. The default is `false`. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SentenceInstance + """ + data = values.of( + { + "Redacted": serialize.boolean_to_string(redacted), + "WordTimestamps": serialize.boolean_to_string(word_timestamps), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SentencePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> SentencePage: + """ + Retrieve a specific page of SentenceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SentenceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SentencePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> SentencePage: + """ + Asynchronously retrieve a specific page of SentenceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SentenceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SentencePage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/IpMessagingBase.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/IpMessagingBase.py new file mode 100644 index 00000000..752d41ad --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/IpMessagingBase.py @@ -0,0 +1,55 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.ip_messaging.v1 import V1 +from twilio.rest.ip_messaging.v2 import V2 + + +class IpMessagingBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the IpMessaging Domain + + :returns: Domain for IpMessaging + """ + super().__init__(twilio, "https://ip-messaging.twilio.com") + self._v1: Optional[V1] = None + self._v2: Optional[V2] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of IpMessaging + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + @property + def v2(self) -> V2: + """ + :returns: Versions v2 of IpMessaging + """ + if self._v2 is None: + self._v2 = V2(self) + return self._v2 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/__init__.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/__init__.py new file mode 100644 index 00000000..61158f8e --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/__init__.py @@ -0,0 +1,25 @@ +from warnings import warn + +from twilio.rest.ip_messaging.IpMessagingBase import IpMessagingBase +from twilio.rest.ip_messaging.v2.credential import CredentialList +from twilio.rest.ip_messaging.v2.service import ServiceList + + +class IpMessaging(IpMessagingBase): + @property + def credentials(self) -> CredentialList: + warn( + "credentials is deprecated. Use v2.credentials instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.credentials + + @property + def services(self) -> ServiceList: + warn( + "services is deprecated. Use v2.services instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.services diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/__pycache__/IpMessagingBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/__pycache__/IpMessagingBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa07cb1aea2f4eb482cd1c5e14358bce898a02f8 GIT binary patch literal 2410 zcmd57O>Y}TbauU7ubrd`ZPW%@U`l9_E5%lPKvh&#Gz}^d^aBVztXvJ--Ep#Xy}QhA z+}QFVhe#w+t5!lNy>hJbQ@9kwp<2-saNrhjE2^G&Z+7jtZ75g9_M7)T^FHSJhq18| zfpz<*FIRrc6Y?t({ROmKJrlNV;t-QKilcf;Q#Dlu@tl`yYNjS}&C54+QMz$ zkhty@n7-Ln$ zGAAj!+IP#k(l*u1)Znz#BkIC&NM1vL=hgdeDa9kwZ(qM&0>76oFMT+d<;k<6h(f}w z)i`)AS@d$q{c~3q>4h|dfvAA#N*ssLT(ug2&dE@44KM0aLHeN?5bg8mBNTIO)}a z{s!8K6H|efQXPfo8tNu#Kx=J`ni|hLIj%QUN88YLG7n}!at+|-hqy)1ECEm7(9Drd zvZk1$pObPS8D9)9@+h*FU4MDrig=>OH(k#SY<1{H8sK=T-aLTslx-3Zgj;Ht+=lM& zDvq*~*+4G?mkm5fsvi_-tL0qh8WvuzMc<8G%X2$iW^(8{kY!95)-qjlg2$`EkLEH7 zZ3Kc284MIVZ}%(chBM86c$GA=iXAjBm9-=vt%h7A24gNjDgbiXZHEI`WF!wQT^k^#ijZJk8Z?4SZ@Wc&Cfxz#Pt^UTlG)e>-ETu z`AlfpH>_nI)zceP1&`vY8?wRGszXs=6)Is{jKN`@sTT$P+a3mKG!5YCI(a-wiU+m| zKN?f_4nH_P|Fd!a;qeoj+ATwFw~ZdCkwj0kXT$s$EDQ*Lz0Uw_lP>vcAlgILCt}o* zt4nq=dnj<9`7d_RUrOiwK~eUqcNH=RuOgzYSsFCE>ViW8V=&GA)lleSV;JA6>3DBrBO?>B%?kC{?ohR(|l%}Nwa=d voB|R%HF^)gZcb5@Kh>h5JvmI2W51IVkH}k($SL?f)~A(|cN9kn) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e93e52bbbcd81bbfe8660586bd518e6f9a4d550 GIT binary patch literal 1393 zcmcgs%}*0S6rb6Tc4-R*B%(3O2BNVswuS>SYDkbK21O2{G1+Wf*X~dkw%c`PX;b3C z0~ZfQZ}2Y={7<}q7s*C0ejK<}D;H0`+1=755syx?Z{EE3_I>=`oB7b+pFyzRe0=)+ zi-6Eqe&{YaW;%C)*+3Suu!Cw?!6X)TSBfbJkmUPo4n zh}&Z1OH*3uf^xtQ1sq6Cle)0y=e+xbF|%sB)!QZ`AR3sZ#3HV5o6fw=e2`=p32oRF z!jF~6TSQ~msB<088;BqcTSya#Xkj8P36`)fZO8VS97SFfT9&$+-oBjb@m+2a6{Ll=smf8=OtqP6 z5s#9J=@YA{K4L^|Ocsw>xXdS}RXpI~w{VbQzFApuNP{>9iSk^7;d1Q4uDg!`Zh$xt z8k0db;RpVd7;%;uuSor^&)(1>7-jmsxw(gWnXnbV?&*y>pg&WErsxggHuQP>na*sV zT=gKPStU&Oo3>-uOO!CbWP3)f+tZR^*skpxM$v20L5Q(7n!q|)Q6DJTMIf)xHzl{1 zD}T;i*c&}_n3no7?FvbD*+QYOC_RNsIpH6h0phk|#Ew{6w&IM3fo`1?|C@Q#Y@0l^UvkfUO$2I89Yh@N2`)18IvG b<9&4YJ1Xy^nSFHgS852W?@EUVw($2q{JvF& literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/__init__.py new file mode 100644 index 00000000..d1f40c79 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.ip_messaging.v1.credential import CredentialList +from twilio.rest.ip_messaging.v1.service import ServiceList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of IpMessaging + + :param domain: The Twilio.ip_messaging domain + """ + super().__init__(domain, "v1") + self._credentials: Optional[CredentialList] = None + self._services: Optional[ServiceList] = None + + @property + def credentials(self) -> CredentialList: + if self._credentials is None: + self._credentials = CredentialList(self) + return self._credentials + + @property + def services(self) -> ServiceList: + if self._services is None: + self._services = ServiceList(self) + return self._services + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58da81da051f2d43e940a9ffa2d65a8aec12996e GIT binary patch literal 2438 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/credential.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/credential.py new file mode 100644 index 00000000..4aa6d3fc --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/credential.py @@ -0,0 +1,711 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CredentialInstance(InstanceResource): + + class PushService(object): + GCM = "gcm" + APN = "apn" + FCM = "fcm" + + """ + :ivar sid: + :ivar account_sid: + :ivar friendly_name: + :ivar type: + :ivar sandbox: + :ivar date_created: + :ivar date_updated: + :ivar url: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["CredentialInstance.PushService"] = payload.get("type") + self.sandbox: Optional[str] = payload.get("sandbox") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[CredentialContext] = None + + @property + def _proxy(self) -> "CredentialContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CredentialContext for this CredentialInstance + """ + if self._context is None: + self._context = CredentialContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CredentialInstance": + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CredentialInstance": + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Update the CredentialInstance + + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The updated CredentialInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Asynchronous coroutine to update the CredentialInstance + + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The updated CredentialInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the CredentialContext + + :param version: Version that contains the resource + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Credentials/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CredentialInstance: + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CredentialInstance: + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Update the CredentialInstance + + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronous coroutine to update the CredentialInstance + + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CredentialInstance: + """ + Build an instance of CredentialInstance + + :param payload: Payload response from the API + """ + return CredentialInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CredentialList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CredentialList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Credentials" + + def create( + self, + type: "CredentialInstance.PushService", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Create the CredentialInstance + + :param type: + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + async def create_async( + self, + type: "CredentialInstance.PushService", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronously create the CredentialInstance + + :param type: + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CredentialInstance]: + """ + Streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CredentialInstance]: + """ + Asynchronously streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Asynchronously lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Asynchronously retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + def get_page(self, target_url: str) -> CredentialPage: + """ + Retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CredentialPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CredentialPage: + """ + Asynchronously retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CredentialPage(self._version, response) + + def get(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: + """ + return CredentialContext(self._version, sid=sid) + + def __call__(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: + """ + return CredentialContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/__init__.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/__init__.py new file mode 100644 index 00000000..3a77cf76 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/__init__.py @@ -0,0 +1,1359 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.ip_messaging.v1.service.channel import ChannelList +from twilio.rest.ip_messaging.v1.service.role import RoleList +from twilio.rest.ip_messaging.v1.service.user import UserList + + +class ServiceInstance(InstanceResource): + """ + :ivar sid: + :ivar account_sid: + :ivar friendly_name: + :ivar date_created: + :ivar date_updated: + :ivar default_service_role_sid: + :ivar default_channel_role_sid: + :ivar default_channel_creator_role_sid: + :ivar read_status_enabled: + :ivar reachability_enabled: + :ivar typing_indicator_timeout: + :ivar consumption_report_interval: + :ivar limits: + :ivar webhooks: + :ivar pre_webhook_url: + :ivar post_webhook_url: + :ivar webhook_method: + :ivar webhook_filters: + :ivar notifications: + :ivar url: + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.default_service_role_sid: Optional[str] = payload.get( + "default_service_role_sid" + ) + self.default_channel_role_sid: Optional[str] = payload.get( + "default_channel_role_sid" + ) + self.default_channel_creator_role_sid: Optional[str] = payload.get( + "default_channel_creator_role_sid" + ) + self.read_status_enabled: Optional[bool] = payload.get("read_status_enabled") + self.reachability_enabled: Optional[bool] = payload.get("reachability_enabled") + self.typing_indicator_timeout: Optional[int] = deserialize.integer( + payload.get("typing_indicator_timeout") + ) + self.consumption_report_interval: Optional[int] = deserialize.integer( + payload.get("consumption_report_interval") + ) + self.limits: Optional[Dict[str, object]] = payload.get("limits") + self.webhooks: Optional[Dict[str, object]] = payload.get("webhooks") + self.pre_webhook_url: Optional[str] = payload.get("pre_webhook_url") + self.post_webhook_url: Optional[str] = payload.get("post_webhook_url") + self.webhook_method: Optional[str] = payload.get("webhook_method") + self.webhook_filters: Optional[List[str]] = payload.get("webhook_filters") + self.notifications: Optional[Dict[str, object]] = payload.get("notifications") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ServiceContext] = None + + @property + def _proxy(self) -> "ServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ServiceContext for this ServiceInstance + """ + if self._context is None: + self._context = ServiceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ServiceInstance": + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ServiceInstance": + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + webhooks_on_message_send_url: Union[str, object] = values.unset, + webhooks_on_message_send_method: Union[str, object] = values.unset, + webhooks_on_message_update_url: Union[str, object] = values.unset, + webhooks_on_message_update_method: Union[str, object] = values.unset, + webhooks_on_message_remove_url: Union[str, object] = values.unset, + webhooks_on_message_remove_method: Union[str, object] = values.unset, + webhooks_on_channel_add_url: Union[str, object] = values.unset, + webhooks_on_channel_add_method: Union[str, object] = values.unset, + webhooks_on_channel_destroy_url: Union[str, object] = values.unset, + webhooks_on_channel_destroy_method: Union[str, object] = values.unset, + webhooks_on_channel_update_url: Union[str, object] = values.unset, + webhooks_on_channel_update_method: Union[str, object] = values.unset, + webhooks_on_member_add_url: Union[str, object] = values.unset, + webhooks_on_member_add_method: Union[str, object] = values.unset, + webhooks_on_member_remove_url: Union[str, object] = values.unset, + webhooks_on_member_remove_method: Union[str, object] = values.unset, + webhooks_on_message_sent_url: Union[str, object] = values.unset, + webhooks_on_message_sent_method: Union[str, object] = values.unset, + webhooks_on_message_updated_url: Union[str, object] = values.unset, + webhooks_on_message_updated_method: Union[str, object] = values.unset, + webhooks_on_message_removed_url: Union[str, object] = values.unset, + webhooks_on_message_removed_method: Union[str, object] = values.unset, + webhooks_on_channel_added_url: Union[str, object] = values.unset, + webhooks_on_channel_added_method: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_url: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_method: Union[str, object] = values.unset, + webhooks_on_channel_updated_url: Union[str, object] = values.unset, + webhooks_on_channel_updated_method: Union[str, object] = values.unset, + webhooks_on_member_added_url: Union[str, object] = values.unset, + webhooks_on_member_added_method: Union[str, object] = values.unset, + webhooks_on_member_removed_url: Union[str, object] = values.unset, + webhooks_on_member_removed_method: Union[str, object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + ) -> "ServiceInstance": + """ + Update the ServiceInstance + + :param friendly_name: + :param default_service_role_sid: + :param default_channel_role_sid: + :param default_channel_creator_role_sid: + :param read_status_enabled: + :param reachability_enabled: + :param typing_indicator_timeout: + :param consumption_report_interval: + :param notifications_new_message_enabled: + :param notifications_new_message_template: + :param notifications_added_to_channel_enabled: + :param notifications_added_to_channel_template: + :param notifications_removed_from_channel_enabled: + :param notifications_removed_from_channel_template: + :param notifications_invited_to_channel_enabled: + :param notifications_invited_to_channel_template: + :param pre_webhook_url: + :param post_webhook_url: + :param webhook_method: + :param webhook_filters: + :param webhooks_on_message_send_url: + :param webhooks_on_message_send_method: + :param webhooks_on_message_update_url: + :param webhooks_on_message_update_method: + :param webhooks_on_message_remove_url: + :param webhooks_on_message_remove_method: + :param webhooks_on_channel_add_url: + :param webhooks_on_channel_add_method: + :param webhooks_on_channel_destroy_url: + :param webhooks_on_channel_destroy_method: + :param webhooks_on_channel_update_url: + :param webhooks_on_channel_update_method: + :param webhooks_on_member_add_url: + :param webhooks_on_member_add_method: + :param webhooks_on_member_remove_url: + :param webhooks_on_member_remove_method: + :param webhooks_on_message_sent_url: + :param webhooks_on_message_sent_method: + :param webhooks_on_message_updated_url: + :param webhooks_on_message_updated_method: + :param webhooks_on_message_removed_url: + :param webhooks_on_message_removed_method: + :param webhooks_on_channel_added_url: + :param webhooks_on_channel_added_method: + :param webhooks_on_channel_destroyed_url: + :param webhooks_on_channel_destroyed_method: + :param webhooks_on_channel_updated_url: + :param webhooks_on_channel_updated_method: + :param webhooks_on_member_added_url: + :param webhooks_on_member_added_method: + :param webhooks_on_member_removed_url: + :param webhooks_on_member_removed_method: + :param limits_channel_members: + :param limits_user_channels: + + :returns: The updated ServiceInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + default_service_role_sid=default_service_role_sid, + default_channel_role_sid=default_channel_role_sid, + default_channel_creator_role_sid=default_channel_creator_role_sid, + read_status_enabled=read_status_enabled, + reachability_enabled=reachability_enabled, + typing_indicator_timeout=typing_indicator_timeout, + consumption_report_interval=consumption_report_interval, + notifications_new_message_enabled=notifications_new_message_enabled, + notifications_new_message_template=notifications_new_message_template, + notifications_added_to_channel_enabled=notifications_added_to_channel_enabled, + notifications_added_to_channel_template=notifications_added_to_channel_template, + notifications_removed_from_channel_enabled=notifications_removed_from_channel_enabled, + notifications_removed_from_channel_template=notifications_removed_from_channel_template, + notifications_invited_to_channel_enabled=notifications_invited_to_channel_enabled, + notifications_invited_to_channel_template=notifications_invited_to_channel_template, + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + webhook_method=webhook_method, + webhook_filters=webhook_filters, + webhooks_on_message_send_url=webhooks_on_message_send_url, + webhooks_on_message_send_method=webhooks_on_message_send_method, + webhooks_on_message_update_url=webhooks_on_message_update_url, + webhooks_on_message_update_method=webhooks_on_message_update_method, + webhooks_on_message_remove_url=webhooks_on_message_remove_url, + webhooks_on_message_remove_method=webhooks_on_message_remove_method, + webhooks_on_channel_add_url=webhooks_on_channel_add_url, + webhooks_on_channel_add_method=webhooks_on_channel_add_method, + webhooks_on_channel_destroy_url=webhooks_on_channel_destroy_url, + webhooks_on_channel_destroy_method=webhooks_on_channel_destroy_method, + webhooks_on_channel_update_url=webhooks_on_channel_update_url, + webhooks_on_channel_update_method=webhooks_on_channel_update_method, + webhooks_on_member_add_url=webhooks_on_member_add_url, + webhooks_on_member_add_method=webhooks_on_member_add_method, + webhooks_on_member_remove_url=webhooks_on_member_remove_url, + webhooks_on_member_remove_method=webhooks_on_member_remove_method, + webhooks_on_message_sent_url=webhooks_on_message_sent_url, + webhooks_on_message_sent_method=webhooks_on_message_sent_method, + webhooks_on_message_updated_url=webhooks_on_message_updated_url, + webhooks_on_message_updated_method=webhooks_on_message_updated_method, + webhooks_on_message_removed_url=webhooks_on_message_removed_url, + webhooks_on_message_removed_method=webhooks_on_message_removed_method, + webhooks_on_channel_added_url=webhooks_on_channel_added_url, + webhooks_on_channel_added_method=webhooks_on_channel_added_method, + webhooks_on_channel_destroyed_url=webhooks_on_channel_destroyed_url, + webhooks_on_channel_destroyed_method=webhooks_on_channel_destroyed_method, + webhooks_on_channel_updated_url=webhooks_on_channel_updated_url, + webhooks_on_channel_updated_method=webhooks_on_channel_updated_method, + webhooks_on_member_added_url=webhooks_on_member_added_url, + webhooks_on_member_added_method=webhooks_on_member_added_method, + webhooks_on_member_removed_url=webhooks_on_member_removed_url, + webhooks_on_member_removed_method=webhooks_on_member_removed_method, + limits_channel_members=limits_channel_members, + limits_user_channels=limits_user_channels, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + webhooks_on_message_send_url: Union[str, object] = values.unset, + webhooks_on_message_send_method: Union[str, object] = values.unset, + webhooks_on_message_update_url: Union[str, object] = values.unset, + webhooks_on_message_update_method: Union[str, object] = values.unset, + webhooks_on_message_remove_url: Union[str, object] = values.unset, + webhooks_on_message_remove_method: Union[str, object] = values.unset, + webhooks_on_channel_add_url: Union[str, object] = values.unset, + webhooks_on_channel_add_method: Union[str, object] = values.unset, + webhooks_on_channel_destroy_url: Union[str, object] = values.unset, + webhooks_on_channel_destroy_method: Union[str, object] = values.unset, + webhooks_on_channel_update_url: Union[str, object] = values.unset, + webhooks_on_channel_update_method: Union[str, object] = values.unset, + webhooks_on_member_add_url: Union[str, object] = values.unset, + webhooks_on_member_add_method: Union[str, object] = values.unset, + webhooks_on_member_remove_url: Union[str, object] = values.unset, + webhooks_on_member_remove_method: Union[str, object] = values.unset, + webhooks_on_message_sent_url: Union[str, object] = values.unset, + webhooks_on_message_sent_method: Union[str, object] = values.unset, + webhooks_on_message_updated_url: Union[str, object] = values.unset, + webhooks_on_message_updated_method: Union[str, object] = values.unset, + webhooks_on_message_removed_url: Union[str, object] = values.unset, + webhooks_on_message_removed_method: Union[str, object] = values.unset, + webhooks_on_channel_added_url: Union[str, object] = values.unset, + webhooks_on_channel_added_method: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_url: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_method: Union[str, object] = values.unset, + webhooks_on_channel_updated_url: Union[str, object] = values.unset, + webhooks_on_channel_updated_method: Union[str, object] = values.unset, + webhooks_on_member_added_url: Union[str, object] = values.unset, + webhooks_on_member_added_method: Union[str, object] = values.unset, + webhooks_on_member_removed_url: Union[str, object] = values.unset, + webhooks_on_member_removed_method: Union[str, object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + ) -> "ServiceInstance": + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: + :param default_service_role_sid: + :param default_channel_role_sid: + :param default_channel_creator_role_sid: + :param read_status_enabled: + :param reachability_enabled: + :param typing_indicator_timeout: + :param consumption_report_interval: + :param notifications_new_message_enabled: + :param notifications_new_message_template: + :param notifications_added_to_channel_enabled: + :param notifications_added_to_channel_template: + :param notifications_removed_from_channel_enabled: + :param notifications_removed_from_channel_template: + :param notifications_invited_to_channel_enabled: + :param notifications_invited_to_channel_template: + :param pre_webhook_url: + :param post_webhook_url: + :param webhook_method: + :param webhook_filters: + :param webhooks_on_message_send_url: + :param webhooks_on_message_send_method: + :param webhooks_on_message_update_url: + :param webhooks_on_message_update_method: + :param webhooks_on_message_remove_url: + :param webhooks_on_message_remove_method: + :param webhooks_on_channel_add_url: + :param webhooks_on_channel_add_method: + :param webhooks_on_channel_destroy_url: + :param webhooks_on_channel_destroy_method: + :param webhooks_on_channel_update_url: + :param webhooks_on_channel_update_method: + :param webhooks_on_member_add_url: + :param webhooks_on_member_add_method: + :param webhooks_on_member_remove_url: + :param webhooks_on_member_remove_method: + :param webhooks_on_message_sent_url: + :param webhooks_on_message_sent_method: + :param webhooks_on_message_updated_url: + :param webhooks_on_message_updated_method: + :param webhooks_on_message_removed_url: + :param webhooks_on_message_removed_method: + :param webhooks_on_channel_added_url: + :param webhooks_on_channel_added_method: + :param webhooks_on_channel_destroyed_url: + :param webhooks_on_channel_destroyed_method: + :param webhooks_on_channel_updated_url: + :param webhooks_on_channel_updated_method: + :param webhooks_on_member_added_url: + :param webhooks_on_member_added_method: + :param webhooks_on_member_removed_url: + :param webhooks_on_member_removed_method: + :param limits_channel_members: + :param limits_user_channels: + + :returns: The updated ServiceInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + default_service_role_sid=default_service_role_sid, + default_channel_role_sid=default_channel_role_sid, + default_channel_creator_role_sid=default_channel_creator_role_sid, + read_status_enabled=read_status_enabled, + reachability_enabled=reachability_enabled, + typing_indicator_timeout=typing_indicator_timeout, + consumption_report_interval=consumption_report_interval, + notifications_new_message_enabled=notifications_new_message_enabled, + notifications_new_message_template=notifications_new_message_template, + notifications_added_to_channel_enabled=notifications_added_to_channel_enabled, + notifications_added_to_channel_template=notifications_added_to_channel_template, + notifications_removed_from_channel_enabled=notifications_removed_from_channel_enabled, + notifications_removed_from_channel_template=notifications_removed_from_channel_template, + notifications_invited_to_channel_enabled=notifications_invited_to_channel_enabled, + notifications_invited_to_channel_template=notifications_invited_to_channel_template, + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + webhook_method=webhook_method, + webhook_filters=webhook_filters, + webhooks_on_message_send_url=webhooks_on_message_send_url, + webhooks_on_message_send_method=webhooks_on_message_send_method, + webhooks_on_message_update_url=webhooks_on_message_update_url, + webhooks_on_message_update_method=webhooks_on_message_update_method, + webhooks_on_message_remove_url=webhooks_on_message_remove_url, + webhooks_on_message_remove_method=webhooks_on_message_remove_method, + webhooks_on_channel_add_url=webhooks_on_channel_add_url, + webhooks_on_channel_add_method=webhooks_on_channel_add_method, + webhooks_on_channel_destroy_url=webhooks_on_channel_destroy_url, + webhooks_on_channel_destroy_method=webhooks_on_channel_destroy_method, + webhooks_on_channel_update_url=webhooks_on_channel_update_url, + webhooks_on_channel_update_method=webhooks_on_channel_update_method, + webhooks_on_member_add_url=webhooks_on_member_add_url, + webhooks_on_member_add_method=webhooks_on_member_add_method, + webhooks_on_member_remove_url=webhooks_on_member_remove_url, + webhooks_on_member_remove_method=webhooks_on_member_remove_method, + webhooks_on_message_sent_url=webhooks_on_message_sent_url, + webhooks_on_message_sent_method=webhooks_on_message_sent_method, + webhooks_on_message_updated_url=webhooks_on_message_updated_url, + webhooks_on_message_updated_method=webhooks_on_message_updated_method, + webhooks_on_message_removed_url=webhooks_on_message_removed_url, + webhooks_on_message_removed_method=webhooks_on_message_removed_method, + webhooks_on_channel_added_url=webhooks_on_channel_added_url, + webhooks_on_channel_added_method=webhooks_on_channel_added_method, + webhooks_on_channel_destroyed_url=webhooks_on_channel_destroyed_url, + webhooks_on_channel_destroyed_method=webhooks_on_channel_destroyed_method, + webhooks_on_channel_updated_url=webhooks_on_channel_updated_url, + webhooks_on_channel_updated_method=webhooks_on_channel_updated_method, + webhooks_on_member_added_url=webhooks_on_member_added_url, + webhooks_on_member_added_method=webhooks_on_member_added_method, + webhooks_on_member_removed_url=webhooks_on_member_removed_url, + webhooks_on_member_removed_method=webhooks_on_member_removed_method, + limits_channel_members=limits_channel_members, + limits_user_channels=limits_user_channels, + ) + + @property + def channels(self) -> ChannelList: + """ + Access the channels + """ + return self._proxy.channels + + @property + def roles(self) -> RoleList: + """ + Access the roles + """ + return self._proxy.roles + + @property + def users(self) -> UserList: + """ + Access the users + """ + return self._proxy.users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServiceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ServiceContext + + :param version: Version that contains the resource + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Services/{sid}".format(**self._solution) + + self._channels: Optional[ChannelList] = None + self._roles: Optional[RoleList] = None + self._users: Optional[UserList] = None + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ServiceInstance: + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ServiceInstance: + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + webhooks_on_message_send_url: Union[str, object] = values.unset, + webhooks_on_message_send_method: Union[str, object] = values.unset, + webhooks_on_message_update_url: Union[str, object] = values.unset, + webhooks_on_message_update_method: Union[str, object] = values.unset, + webhooks_on_message_remove_url: Union[str, object] = values.unset, + webhooks_on_message_remove_method: Union[str, object] = values.unset, + webhooks_on_channel_add_url: Union[str, object] = values.unset, + webhooks_on_channel_add_method: Union[str, object] = values.unset, + webhooks_on_channel_destroy_url: Union[str, object] = values.unset, + webhooks_on_channel_destroy_method: Union[str, object] = values.unset, + webhooks_on_channel_update_url: Union[str, object] = values.unset, + webhooks_on_channel_update_method: Union[str, object] = values.unset, + webhooks_on_member_add_url: Union[str, object] = values.unset, + webhooks_on_member_add_method: Union[str, object] = values.unset, + webhooks_on_member_remove_url: Union[str, object] = values.unset, + webhooks_on_member_remove_method: Union[str, object] = values.unset, + webhooks_on_message_sent_url: Union[str, object] = values.unset, + webhooks_on_message_sent_method: Union[str, object] = values.unset, + webhooks_on_message_updated_url: Union[str, object] = values.unset, + webhooks_on_message_updated_method: Union[str, object] = values.unset, + webhooks_on_message_removed_url: Union[str, object] = values.unset, + webhooks_on_message_removed_method: Union[str, object] = values.unset, + webhooks_on_channel_added_url: Union[str, object] = values.unset, + webhooks_on_channel_added_method: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_url: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_method: Union[str, object] = values.unset, + webhooks_on_channel_updated_url: Union[str, object] = values.unset, + webhooks_on_channel_updated_method: Union[str, object] = values.unset, + webhooks_on_member_added_url: Union[str, object] = values.unset, + webhooks_on_member_added_method: Union[str, object] = values.unset, + webhooks_on_member_removed_url: Union[str, object] = values.unset, + webhooks_on_member_removed_method: Union[str, object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + ) -> ServiceInstance: + """ + Update the ServiceInstance + + :param friendly_name: + :param default_service_role_sid: + :param default_channel_role_sid: + :param default_channel_creator_role_sid: + :param read_status_enabled: + :param reachability_enabled: + :param typing_indicator_timeout: + :param consumption_report_interval: + :param notifications_new_message_enabled: + :param notifications_new_message_template: + :param notifications_added_to_channel_enabled: + :param notifications_added_to_channel_template: + :param notifications_removed_from_channel_enabled: + :param notifications_removed_from_channel_template: + :param notifications_invited_to_channel_enabled: + :param notifications_invited_to_channel_template: + :param pre_webhook_url: + :param post_webhook_url: + :param webhook_method: + :param webhook_filters: + :param webhooks_on_message_send_url: + :param webhooks_on_message_send_method: + :param webhooks_on_message_update_url: + :param webhooks_on_message_update_method: + :param webhooks_on_message_remove_url: + :param webhooks_on_message_remove_method: + :param webhooks_on_channel_add_url: + :param webhooks_on_channel_add_method: + :param webhooks_on_channel_destroy_url: + :param webhooks_on_channel_destroy_method: + :param webhooks_on_channel_update_url: + :param webhooks_on_channel_update_method: + :param webhooks_on_member_add_url: + :param webhooks_on_member_add_method: + :param webhooks_on_member_remove_url: + :param webhooks_on_member_remove_method: + :param webhooks_on_message_sent_url: + :param webhooks_on_message_sent_method: + :param webhooks_on_message_updated_url: + :param webhooks_on_message_updated_method: + :param webhooks_on_message_removed_url: + :param webhooks_on_message_removed_method: + :param webhooks_on_channel_added_url: + :param webhooks_on_channel_added_method: + :param webhooks_on_channel_destroyed_url: + :param webhooks_on_channel_destroyed_method: + :param webhooks_on_channel_updated_url: + :param webhooks_on_channel_updated_method: + :param webhooks_on_member_added_url: + :param webhooks_on_member_added_method: + :param webhooks_on_member_removed_url: + :param webhooks_on_member_removed_method: + :param limits_channel_members: + :param limits_user_channels: + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DefaultServiceRoleSid": default_service_role_sid, + "DefaultChannelRoleSid": default_channel_role_sid, + "DefaultChannelCreatorRoleSid": default_channel_creator_role_sid, + "ReadStatusEnabled": serialize.boolean_to_string(read_status_enabled), + "ReachabilityEnabled": serialize.boolean_to_string( + reachability_enabled + ), + "TypingIndicatorTimeout": typing_indicator_timeout, + "ConsumptionReportInterval": consumption_report_interval, + "Notifications.NewMessage.Enabled": serialize.boolean_to_string( + notifications_new_message_enabled + ), + "Notifications.NewMessage.Template": notifications_new_message_template, + "Notifications.AddedToChannel.Enabled": serialize.boolean_to_string( + notifications_added_to_channel_enabled + ), + "Notifications.AddedToChannel.Template": notifications_added_to_channel_template, + "Notifications.RemovedFromChannel.Enabled": serialize.boolean_to_string( + notifications_removed_from_channel_enabled + ), + "Notifications.RemovedFromChannel.Template": notifications_removed_from_channel_template, + "Notifications.InvitedToChannel.Enabled": serialize.boolean_to_string( + notifications_invited_to_channel_enabled + ), + "Notifications.InvitedToChannel.Template": notifications_invited_to_channel_template, + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "WebhookMethod": webhook_method, + "WebhookFilters": serialize.map(webhook_filters, lambda e: e), + "Webhooks.OnMessageSend.Url": webhooks_on_message_send_url, + "Webhooks.OnMessageSend.Method": webhooks_on_message_send_method, + "Webhooks.OnMessageUpdate.Url": webhooks_on_message_update_url, + "Webhooks.OnMessageUpdate.Method": webhooks_on_message_update_method, + "Webhooks.OnMessageRemove.Url": webhooks_on_message_remove_url, + "Webhooks.OnMessageRemove.Method": webhooks_on_message_remove_method, + "Webhooks.OnChannelAdd.Url": webhooks_on_channel_add_url, + "Webhooks.OnChannelAdd.Method": webhooks_on_channel_add_method, + "Webhooks.OnChannelDestroy.Url": webhooks_on_channel_destroy_url, + "Webhooks.OnChannelDestroy.Method": webhooks_on_channel_destroy_method, + "Webhooks.OnChannelUpdate.Url": webhooks_on_channel_update_url, + "Webhooks.OnChannelUpdate.Method": webhooks_on_channel_update_method, + "Webhooks.OnMemberAdd.Url": webhooks_on_member_add_url, + "Webhooks.OnMemberAdd.Method": webhooks_on_member_add_method, + "Webhooks.OnMemberRemove.Url": webhooks_on_member_remove_url, + "Webhooks.OnMemberRemove.Method": webhooks_on_member_remove_method, + "Webhooks.OnMessageSent.Url": webhooks_on_message_sent_url, + "Webhooks.OnMessageSent.Method": webhooks_on_message_sent_method, + "Webhooks.OnMessageUpdated.Url": webhooks_on_message_updated_url, + "Webhooks.OnMessageUpdated.Method": webhooks_on_message_updated_method, + "Webhooks.OnMessageRemoved.Url": webhooks_on_message_removed_url, + "Webhooks.OnMessageRemoved.Method": webhooks_on_message_removed_method, + "Webhooks.OnChannelAdded.Url": webhooks_on_channel_added_url, + "Webhooks.OnChannelAdded.Method": webhooks_on_channel_added_method, + "Webhooks.OnChannelDestroyed.Url": webhooks_on_channel_destroyed_url, + "Webhooks.OnChannelDestroyed.Method": webhooks_on_channel_destroyed_method, + "Webhooks.OnChannelUpdated.Url": webhooks_on_channel_updated_url, + "Webhooks.OnChannelUpdated.Method": webhooks_on_channel_updated_method, + "Webhooks.OnMemberAdded.Url": webhooks_on_member_added_url, + "Webhooks.OnMemberAdded.Method": webhooks_on_member_added_method, + "Webhooks.OnMemberRemoved.Url": webhooks_on_member_removed_url, + "Webhooks.OnMemberRemoved.Method": webhooks_on_member_removed_method, + "Limits.ChannelMembers": limits_channel_members, + "Limits.UserChannels": limits_user_channels, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + webhooks_on_message_send_url: Union[str, object] = values.unset, + webhooks_on_message_send_method: Union[str, object] = values.unset, + webhooks_on_message_update_url: Union[str, object] = values.unset, + webhooks_on_message_update_method: Union[str, object] = values.unset, + webhooks_on_message_remove_url: Union[str, object] = values.unset, + webhooks_on_message_remove_method: Union[str, object] = values.unset, + webhooks_on_channel_add_url: Union[str, object] = values.unset, + webhooks_on_channel_add_method: Union[str, object] = values.unset, + webhooks_on_channel_destroy_url: Union[str, object] = values.unset, + webhooks_on_channel_destroy_method: Union[str, object] = values.unset, + webhooks_on_channel_update_url: Union[str, object] = values.unset, + webhooks_on_channel_update_method: Union[str, object] = values.unset, + webhooks_on_member_add_url: Union[str, object] = values.unset, + webhooks_on_member_add_method: Union[str, object] = values.unset, + webhooks_on_member_remove_url: Union[str, object] = values.unset, + webhooks_on_member_remove_method: Union[str, object] = values.unset, + webhooks_on_message_sent_url: Union[str, object] = values.unset, + webhooks_on_message_sent_method: Union[str, object] = values.unset, + webhooks_on_message_updated_url: Union[str, object] = values.unset, + webhooks_on_message_updated_method: Union[str, object] = values.unset, + webhooks_on_message_removed_url: Union[str, object] = values.unset, + webhooks_on_message_removed_method: Union[str, object] = values.unset, + webhooks_on_channel_added_url: Union[str, object] = values.unset, + webhooks_on_channel_added_method: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_url: Union[str, object] = values.unset, + webhooks_on_channel_destroyed_method: Union[str, object] = values.unset, + webhooks_on_channel_updated_url: Union[str, object] = values.unset, + webhooks_on_channel_updated_method: Union[str, object] = values.unset, + webhooks_on_member_added_url: Union[str, object] = values.unset, + webhooks_on_member_added_method: Union[str, object] = values.unset, + webhooks_on_member_removed_url: Union[str, object] = values.unset, + webhooks_on_member_removed_method: Union[str, object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: + :param default_service_role_sid: + :param default_channel_role_sid: + :param default_channel_creator_role_sid: + :param read_status_enabled: + :param reachability_enabled: + :param typing_indicator_timeout: + :param consumption_report_interval: + :param notifications_new_message_enabled: + :param notifications_new_message_template: + :param notifications_added_to_channel_enabled: + :param notifications_added_to_channel_template: + :param notifications_removed_from_channel_enabled: + :param notifications_removed_from_channel_template: + :param notifications_invited_to_channel_enabled: + :param notifications_invited_to_channel_template: + :param pre_webhook_url: + :param post_webhook_url: + :param webhook_method: + :param webhook_filters: + :param webhooks_on_message_send_url: + :param webhooks_on_message_send_method: + :param webhooks_on_message_update_url: + :param webhooks_on_message_update_method: + :param webhooks_on_message_remove_url: + :param webhooks_on_message_remove_method: + :param webhooks_on_channel_add_url: + :param webhooks_on_channel_add_method: + :param webhooks_on_channel_destroy_url: + :param webhooks_on_channel_destroy_method: + :param webhooks_on_channel_update_url: + :param webhooks_on_channel_update_method: + :param webhooks_on_member_add_url: + :param webhooks_on_member_add_method: + :param webhooks_on_member_remove_url: + :param webhooks_on_member_remove_method: + :param webhooks_on_message_sent_url: + :param webhooks_on_message_sent_method: + :param webhooks_on_message_updated_url: + :param webhooks_on_message_updated_method: + :param webhooks_on_message_removed_url: + :param webhooks_on_message_removed_method: + :param webhooks_on_channel_added_url: + :param webhooks_on_channel_added_method: + :param webhooks_on_channel_destroyed_url: + :param webhooks_on_channel_destroyed_method: + :param webhooks_on_channel_updated_url: + :param webhooks_on_channel_updated_method: + :param webhooks_on_member_added_url: + :param webhooks_on_member_added_method: + :param webhooks_on_member_removed_url: + :param webhooks_on_member_removed_method: + :param limits_channel_members: + :param limits_user_channels: + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DefaultServiceRoleSid": default_service_role_sid, + "DefaultChannelRoleSid": default_channel_role_sid, + "DefaultChannelCreatorRoleSid": default_channel_creator_role_sid, + "ReadStatusEnabled": serialize.boolean_to_string(read_status_enabled), + "ReachabilityEnabled": serialize.boolean_to_string( + reachability_enabled + ), + "TypingIndicatorTimeout": typing_indicator_timeout, + "ConsumptionReportInterval": consumption_report_interval, + "Notifications.NewMessage.Enabled": serialize.boolean_to_string( + notifications_new_message_enabled + ), + "Notifications.NewMessage.Template": notifications_new_message_template, + "Notifications.AddedToChannel.Enabled": serialize.boolean_to_string( + notifications_added_to_channel_enabled + ), + "Notifications.AddedToChannel.Template": notifications_added_to_channel_template, + "Notifications.RemovedFromChannel.Enabled": serialize.boolean_to_string( + notifications_removed_from_channel_enabled + ), + "Notifications.RemovedFromChannel.Template": notifications_removed_from_channel_template, + "Notifications.InvitedToChannel.Enabled": serialize.boolean_to_string( + notifications_invited_to_channel_enabled + ), + "Notifications.InvitedToChannel.Template": notifications_invited_to_channel_template, + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "WebhookMethod": webhook_method, + "WebhookFilters": serialize.map(webhook_filters, lambda e: e), + "Webhooks.OnMessageSend.Url": webhooks_on_message_send_url, + "Webhooks.OnMessageSend.Method": webhooks_on_message_send_method, + "Webhooks.OnMessageUpdate.Url": webhooks_on_message_update_url, + "Webhooks.OnMessageUpdate.Method": webhooks_on_message_update_method, + "Webhooks.OnMessageRemove.Url": webhooks_on_message_remove_url, + "Webhooks.OnMessageRemove.Method": webhooks_on_message_remove_method, + "Webhooks.OnChannelAdd.Url": webhooks_on_channel_add_url, + "Webhooks.OnChannelAdd.Method": webhooks_on_channel_add_method, + "Webhooks.OnChannelDestroy.Url": webhooks_on_channel_destroy_url, + "Webhooks.OnChannelDestroy.Method": webhooks_on_channel_destroy_method, + "Webhooks.OnChannelUpdate.Url": webhooks_on_channel_update_url, + "Webhooks.OnChannelUpdate.Method": webhooks_on_channel_update_method, + "Webhooks.OnMemberAdd.Url": webhooks_on_member_add_url, + "Webhooks.OnMemberAdd.Method": webhooks_on_member_add_method, + "Webhooks.OnMemberRemove.Url": webhooks_on_member_remove_url, + "Webhooks.OnMemberRemove.Method": webhooks_on_member_remove_method, + "Webhooks.OnMessageSent.Url": webhooks_on_message_sent_url, + "Webhooks.OnMessageSent.Method": webhooks_on_message_sent_method, + "Webhooks.OnMessageUpdated.Url": webhooks_on_message_updated_url, + "Webhooks.OnMessageUpdated.Method": webhooks_on_message_updated_method, + "Webhooks.OnMessageRemoved.Url": webhooks_on_message_removed_url, + "Webhooks.OnMessageRemoved.Method": webhooks_on_message_removed_method, + "Webhooks.OnChannelAdded.Url": webhooks_on_channel_added_url, + "Webhooks.OnChannelAdded.Method": webhooks_on_channel_added_method, + "Webhooks.OnChannelDestroyed.Url": webhooks_on_channel_destroyed_url, + "Webhooks.OnChannelDestroyed.Method": webhooks_on_channel_destroyed_method, + "Webhooks.OnChannelUpdated.Url": webhooks_on_channel_updated_url, + "Webhooks.OnChannelUpdated.Method": webhooks_on_channel_updated_method, + "Webhooks.OnMemberAdded.Url": webhooks_on_member_added_url, + "Webhooks.OnMemberAdded.Method": webhooks_on_member_added_method, + "Webhooks.OnMemberRemoved.Url": webhooks_on_member_removed_url, + "Webhooks.OnMemberRemoved.Method": webhooks_on_member_removed_method, + "Limits.ChannelMembers": limits_channel_members, + "Limits.UserChannels": limits_user_channels, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def channels(self) -> ChannelList: + """ + Access the channels + """ + if self._channels is None: + self._channels = ChannelList( + self._version, + self._solution["sid"], + ) + return self._channels + + @property + def roles(self) -> RoleList: + """ + Access the roles + """ + if self._roles is None: + self._roles = RoleList( + self._version, + self._solution["sid"], + ) + return self._roles + + @property + def users(self) -> UserList: + """ + Access the users + """ + if self._users is None: + self._users = UserList( + self._version, + self._solution["sid"], + ) + return self._users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ServiceInstance: + """ + Build an instance of ServiceInstance + + :param payload: Payload response from the API + """ + return ServiceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services" + + def create(self, friendly_name: str) -> ServiceInstance: + """ + Create the ServiceInstance + + :param friendly_name: + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + async def create_async(self, friendly_name: str) -> ServiceInstance: + """ + Asynchronously create the ServiceInstance + + :param friendly_name: + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ServiceInstance]: + """ + Streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ServiceInstance]: + """ + Asynchronously streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Asynchronously lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Asynchronously retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + def get_page(self, target_url: str) -> ServicePage: + """ + Retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ServicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ServicePage: + """ + Asynchronously retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ServicePage(self._version, response) + + def get(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: + """ + return ServiceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: + """ + return ServiceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c56aa3e81814da409fbdb4d7d7fe9c3b52dd5f0 GIT binary patch literal 56127 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 "ChannelContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ChannelContext for this ChannelInstance + """ + if self._context is None: + self._context = ChannelContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ChannelInstance": + """ + Fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ChannelInstance": + """ + Asynchronous coroutine to fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "ChannelInstance": + """ + Update the ChannelInstance + + :param friendly_name: + :param unique_name: + :param attributes: + + :returns: The updated ChannelInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + unique_name=unique_name, + attributes=attributes, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "ChannelInstance": + """ + Asynchronous coroutine to update the ChannelInstance + + :param friendly_name: + :param unique_name: + :param attributes: + + :returns: The updated ChannelInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + unique_name=unique_name, + attributes=attributes, + ) + + @property + def invites(self) -> InviteList: + """ + Access the invites + """ + return self._proxy.invites + + @property + def members(self) -> MemberList: + """ + Access the members + """ + return self._proxy.members + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + return self._proxy.messages + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the ChannelContext + + :param version: Version that contains the resource + :param service_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Channels/{sid}".format(**self._solution) + + self._invites: Optional[InviteList] = None + self._members: Optional[MemberList] = None + self._messages: Optional[MessageList] = None + + def delete(self) -> bool: + """ + Deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ChannelInstance: + """ + Fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ChannelInstance: + """ + Asynchronous coroutine to fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Update the ChannelInstance + + :param friendly_name: + :param unique_name: + :param attributes: + + :returns: The updated ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Asynchronous coroutine to update the ChannelInstance + + :param friendly_name: + :param unique_name: + :param attributes: + + :returns: The updated ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + @property + def invites(self) -> InviteList: + """ + Access the invites + """ + if self._invites is None: + self._invites = InviteList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._invites + + @property + def members(self) -> MemberList: + """ + Access the members + """ + if self._members is None: + self._members = MemberList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._members + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + if self._messages is None: + self._messages = MessageList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._messages + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ChannelInstance: + """ + Build an instance of ChannelInstance + + :param payload: Payload response from the API + """ + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ChannelList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the ChannelList + + :param version: Version that contains the resource + :param service_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Channels".format(**self._solution) + + def create( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + ) -> ChannelInstance: + """ + Create the ChannelInstance + + :param friendly_name: + :param unique_name: + :param attributes: + :param type: + + :returns: The created ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "Type": type, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + ) -> ChannelInstance: + """ + Asynchronously create the ChannelInstance + + :param friendly_name: + :param unique_name: + :param attributes: + :param type: + + :returns: The created ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "Type": type, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ChannelInstance]: + """ + Streams ChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["ChannelInstance.ChannelType"] type: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(type=type, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ChannelInstance]: + """ + Asynchronously streams ChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["ChannelInstance.ChannelType"] type: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(type=type, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelInstance]: + """ + Lists ChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["ChannelInstance.ChannelType"] type: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + type=type, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelInstance]: + """ + Asynchronously lists ChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["ChannelInstance.ChannelType"] type: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + type=type, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelPage: + """ + Retrieve a single page of ChannelInstance records from the API. + Request is executed immediately + + :param type: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelInstance + """ + data = values.of( + { + "Type": serialize.map(type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelPage(self._version, response, self._solution) + + async def page_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelPage: + """ + Asynchronously retrieve a single page of ChannelInstance records from the API. + Request is executed immediately + + :param type: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelInstance + """ + data = values.of( + { + "Type": serialize.map(type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ChannelPage: + """ + Retrieve a specific page of ChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ChannelPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ChannelPage: + """ + Asynchronously retrieve a specific page of ChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ChannelPage(self._version, response, self._solution) + + def get(self, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param sid: + """ + return ChannelContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param sid: + """ + return ChannelContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a51f22e27adb85c536d48bb9969caada04c7fbd GIT binary patch literal 30236 zcmeHwdvH`&n%}+Mx1VZt3%$?_xj}$vkXk&HAa|&pW zMfGGQQ4r1xVPQZBi(yk#jEMuHNPctF6f+N)W72>WvkX{b)&XnGHeid{2kbG&fP>|c zqRv>wKt;?o;EGiaRI)fr)E)B-c$nWBt%@xeSit-6 zdhC5Hb^&6m<%N2zm&Mi~wpOmuV;7Is`RarJ8=!D{@$5SiNq9r?uhAdPM6$=E|SI52Has3~nDS-dT!czhPieW)= z=#%3I5yO3fKo|McN_cdaUTa+M1s-Cn4EUxyw+pE z=!l%ar#w4{63O6DNZt`2O3KeA5mlu{Jt-&RBT7g{oQpnf2-}{Ll>|PHBxz6ZFlBM> z96AKP?Q3VcV(70jFFMZU{S0NpG^x z3BrIYY?mtsO=0ILX~3=eE8zEp8^bQVtMIPGdx2bibh%o{@Vb-OK{E(LEm~<-Tj|LQ zRpo{3VYEBE;FM*c?oPf@I`3V4xf)-t2ej<+LO`d+0I>!Z+lbg&Lu?a^ZANUJA+`nO zZHTJ}1Q(qao)ZUJ_X@tIv}ebW;Lwm9)le%B2{82R$=2ePLxHe3U=EuGq*1d^y3t%v zfnN>p8y%L@Rz9oKwqYf53{$7yXGz-wfuUeb4g}K9Kp++mk3`Au3Iv|TWK&bDd-nJA z?c9;J?Rj$NQ``4FJSAkQAvfYXx)1KhY)Ks4wR7jbgS~R%nPhzU;IVilByY#OP98ia z4;?$$7ddn=0hI3?4u+n=BuE@gGP2U8$cbcE#6X6+j;-lJeaBF~E5squ6$nIzBFR9& zKRlYQF!V+t6mG>Y;evBYm|xI%+B#p|e8#3ML4>jtPTF>i&p&iII2w%y!|4jO{y-uU zPMhI`v_%#91@hAZl|2OakHzysl499&#xgFvjP!BwO?4ndVcc}oSX#{))^m&t0jiBX zW%8P|+K^YeMP9QZum0UK^-6}k)?3tTG32$~BCpku*M5t)#%V_(%z`CQme5{E1ZVBZY{6j>x7L3Pnnu3w3@UxzFwsjy{j5s zT20y;H7?LT&{s(xh!QqmQ{P$)h!l%!dyv{Ovwpc0XX!qHJip3)T~Ly>1kWFBw^lSw6VXe22o z(o&Krn~OMsKuD2^<5NQ;!xR}#JJsmGq0w|@j4ii`0Q*|n%^4tB3!6t2unW=1&@+iC z6Ke-+p07S_NsJ833Q3^NTYW?eqy@UtAvsIqNkJ|NaU@b0R2R$V?kyY>+@+KC)3?ejJDfB4Yk($`j8 zSn;vN+=Q|(xifZQ-Nw_>%av?>N?R2Vw&pJm2L&t6>033PKH}>R3=~c28X;6l~u-OjPc6e z!MMWscrBrWbMkTT{wJ7oDBG~d_D?*zX_4|C&LM`p)Fi&)Q)fuoOuZ3ty!OYN`lbc=220+FqDO>PL zyYuV8{8SkZWiyheL}e>p2^wNAn}2C*fZ8}ZR$uTTKac+!Wq%mXNg-1uxT;>+a%Rg+ zh4;gjmGf1#=PS=u&bN49>%Y){X-lf*f%)2o^Zn=gFRoA3`mWogMeftRFYV4ag{sJ9#P^$gxaCF5(kAJk^#wJQU%ZF2-bcLt}YI$K#+FC zMbO;^FpRYn46Hw|2y!GA!}&W}GXUoLrt=5R9hj@@Ox1PH)^*K!x@PQMGoG#+S>o4T zXl)lSip!+eE$!mxfS3n#=sqGRLq~2OEkP^>sRU?8L2vaMHHcYQ#v)KXL7=KDDC}o> zPY{fX@X(v`cxOFJX6#FT8+bUP_p2Np#yLdpDGYVAt6+dBgLO3d#)>wwh7zX;prw$m zBURTiTj!ti_-E|?8IS*l(ub@{K3^7+5T`w~jiOnfB|?2C1aVv(H;tR$5;dU<2&3u7 zJ33VNGv>22@U%6vdpM{BW8OSQw_C44O*QbnMQJ%UxVt2=1y-v}a9OOLG8aHcLvt%H zIVG_rtRPc@KuF!-OyyGu6%%1z!OKWX_~3v#wB`}v`KI>yhPL^Ii!(N%YDrd*s+<`? zaya>PC>$h4mIqMJos#9kfdY9pl_AgO8$Z^;Uw&Hfetq$WR@o0|=`+s7o2^c{uhOXG z4enw4Jt|rVWN&ODSr7m|9=7SJkrrJESH^vXD0%ZK*P>olfXap$JrG;!)~k!4o!} zq770BBr7H7(|F=uLG!(-);R%1+)-VUmitIfc1YW&8@b)i9wmM(0?k!WUk$v9JPi3L zgs4H<^^~ITyMv)4#4>6NNMR9eow*@;^G26IK|B5IBXBfw`ZP9&2hs5fal#Z9N&$xm z>6# zdSUCO#h1P^*W8tA+WVU<5w;iZTP%*P+{_hN{++|SHC31YsWqBVT$6uzPfTo`lG4)A zcw~re+|m}1hgd>+1{F=2*b11osk_Mpfk0jPNFKzSTa2e#%HJY;g0@@0Qz<-uL_8>z~`aC$)Lc?B*wb+O&7Jdhco5yyw9=PfyCzb7kYKXV;8<7n__@BGK_} zs6^?3qxp%a^xdblQ2ZitTH&Ov@k2-DP?8D26%qj|G~keRCl!StqYz>;K~UO`%_uh7 z$x*(^k`Be=QMRR0c2OSUX%*te6q1alEh9q-2)#(^tI(3K(2}8$Fi;`FsnBFph~y|F z;#0!pJO?LTsmh~5ax@wUU|0MQV%aWk8)qP>BMLdxmBdBNqEAl=*Cmss)Hh}vMZuj}oWsg{o&H5TW!g)NhNFD{=vkXq==SP+5M)HhGAyJ($!Fjd!{u~C#=sB4;R zn>;qTDpk8YL&eZ8XLGiKeE!d~@|CQYlBI33=~n_?YPaD78WI3*nzVFs6_r}5ms*-} z*(`nHWZSO+p+1qJB^$C3hD?7nDS!4)F@{DxWmuG?4*B&9(s(>qG1Tmu$pB(2bc zS)m8BseT*$cK98Lx5MvL{m@PhRLHKQP5Re#&z;0V=jW8&vLt&{ZDU1V$dwnOR@kBE zvsc&mCKniD8&FFOx7}`M3=f0QgkFd z(XT8EPU&>jLPc+%xN#d6U%X) zRzTx>RS4-yfqCRjd=(A^JlCu8lmZ}cOxA6bao6>VGqs!NYImgQ|NblC9}Qg{f`i9 z{iNc3%VgNso0UhAmbUgj-1jh)-{!P6CMS=?p+2TTupN%~M0--8m1jx|cRx zu6@7py~Yn7o$<8IdiKrO_c3r5L6X{$orJ^rz26ozvH3Qa*?ddN<7l38nw&Fma5#Yh zR3QlhhbUu8s3*!Fz{vw8CFwGwd{FW&?{BCCF}#d<1Rm$Xw65{|)90R^tLsYDbqP?t%#1ke5IkcCpMpZ9t7q>gbt7dV#UAih+;Ln3Q5hgQ! z+5ZLSPB0jFiBo->QR)tG8Dz2yE=w9NPnePwsFXdWYlciqIO@{!Z zY;US08%v8_=||L!s^IW2PLZ(#KirWkQ3Uja;%bL9LXIo~3Ok%3!c2-~3KV~FxcD4vfMlxwW16jpHh&_cNJ zJTjG}4>|O}kXK%)oNHK9!XGOV~7S37csS zh9&qccSxeFWk?k2%8`!=>n({C)l-TP*>6Im9E?agbGYZLQ1+oCSk7IKs7FouaS$%; z#A#8SG~xd3`azQ$i;cwWxz6Lqk9U%sqZ3C)U(q2W9jMRrRloo*BL7?VNA*&9|=j*d|rFvu0}*jxpd=NZ!J^ zwcHfZDCqK3_44_e#>wPsqZdXmB`<#!lcc5{ljN@E2j^?lH3ls;kkUtP zlazk(kspNEo=1r9eljqGFEde`Y%)~jCWB6hUCP%0S>-%A-zDc&a&mO}Pbm1OaQbga zmzi`ZA90n7C|Qh{l(UF=Gin|V5PDuhE>4_3GlptJd~K>>Z6Ss>uDf?+d|A(8@oKx+ zbDwl|#U}Xk*hAXIn(@mLILj$KPHyGT)>KCSfiQnK1I`io6_T z$l66t{0UJLBj#;AvvsCo@rR36+#2&*>5x@F*Z)0#=J^@>qGI@xaK(&YmZr!TL)D}V zqAAK@IC+>rExpH@Acgi<3Y}Y2qHyw=@L|M^tt?=|HAP7Yjn6b8@v~HyLM44SSLdkX zOxheJL4}UN$&(V0HlheEwD12*LJQ)-Zc|ayJ?Gh;@@&7-KI?gW#{M|N17CB2Hij!; z=mZcK;Z2b5F>**^!35|9Y8HhyAzaBaMn1;>v9)xZf{fzcRNbO{gYun(V^pz_-iQf& z|1%|!eh(^^j8tP;f6*A??86w0i0TK0>i8=-fm!DVrhas;nT3se_pzmY{Q zXJ%y`;vdQicxBd>(Pk_!RFxp2P*p-v1*#H?f~ur3TS2~k;^$fW9#RfvOis%pQkLMA z$s>IoAR zBv6|`bZ;XC3dHyl{Pt0c&#K$QkZBn|1ilSbg>>mV0{Sx8$3BwV>wz^i=0hqyV3A8o z<-_doaK2b{ET&7sdqyJBaNgP9_+ZhQBR#h&H&;z^y1je2Z4UI;iD4Y@C5?7G#zgM0 zAJj{+MF7e}S_^z;K6UgJ04mX~i03;W>X)XWb>W;o#N^y~PuJ2C!2HIPAJXJshH}^d zxpF)A$&J&}yY6?~mnTxIcV9PaGQeV*kCL3`)1aP*RvZl?nmg8ZbDBjB*~%pSMa&Z; zR+=1(HCUrmSJ2q34Ye~$RkfZqr{Cu&q&-C56-IlgRUBe(k&mk8A6-JeHgcvk=LZA| zA3{VQ>@@E$)m#c)YIwarBOo}9sgGBt)@oTl*>+vPi+!I}kcZ!ztTDR>pD(2h9F&+M z&`gRz*?QECZx%eCJr;9ElI@sJP$$x^2dXe*$eI^|p(G6Rw44svIp~A|qy=inFKX*5 z&^lM?)`eYR7gUbulUx~Qq7l7kl~8he7&P3v&mmXIY+ne4r-!K>OZNGWYpvF6twOCe z_o%IvdaYy%T6@oHB{R>u(zSl}Sm0!-QK`wp#ae_s`iQynLJqkem|2H5F8u7RDP6-o zYGXax*brU_#Xq%K3OA4n+7NC;xGCJk(wmXqjBtw~+=B2Tl%;iV5&W%8eSIHv46XX= zN5<1RHFn5spdmUdP86>|gAIjAp*<($>!t{4pY@gTv+J*!R{Hn#RjjmDn!510sigI9 zv!!#)dn^63s(H4Q(mX3K0+86Avc;CxOI9aWD$^nZVdF`@o@_#BOk2LFf4V~X$F#s~ zL-MCg4`Z}40~1);H2Gl0Y*KBetU}$^nc59=wOdm3|A{NokK9+?@IZ6y;OkC-6qJsS zGTUHwUMkPJmzGSzj%+PjaC?&SaS5_=-IjL3lH;FBaZh1W*c{QVe?I}f3jNF0Cnb4}AfsjCw+3iC1DXT{im(&wDf>L5Dm<@oSBIt7*Q10}frpxlI0l?bJ0 zoQwBfwOAnh%FR3FhX^K$r_^Oc>zh2ol;V|`v8*TFKo+h>xQBD=?i31TCRm;(ctuaW zcy*=NQ!8CvwG#e*vQLjil4-{ z^A_tNZ5$v8P24lOu5v7t8oj;o2k538f%UeyogDmPl3HjtUIwHOI!#CU?dq% z{c5fAXy?vBYMnJ z!;KU`M-JIs0Sq}q%N0J}G+6D)v0>b7MGy|cSp7)O+*zwB_vW=7k0iM@Yb>6?#aJ4? zvIcsI26T8Me%bGZz5EJRqQkpp_3G6=1E;2&zN@DC%qAa4Tp74VBQoT7Bg51v{zVm+ z_1-FfiCK%2jEuD*zw#a&>;!h;m9C(k1XxL2$w6RCTY0aiteit)<){d&C~f6=mA^(z zf@GAu$DA>GAK`q)h}X4>=r_qRA@}OQ$^Y|<&Mlf-urjq^<)!u0zS#wvaRCrcN8;?l zWcbqH^nsLr`{~hH5AK%8J2VM_*7E6vQ(d#3?iqVGm*q*QReOkpzKCD;3LMQorX-0o zBSXP+w`8>NWaJ%_RVkmWLZjct*b7VWZ8TFK#{v$61NKX5t4+8sscpd`@FlhVtx;R$ zuRvS+jdWJ|*N90w*|HR*8ynItK7myx`3jPYsOi5&WIj)9Eb|D_)UP26W&66uOTY*@8Q1Gn`Mg6ijt*)( zBCfdkLa}=U1@J04woY%oMkM*0b9y?T_$9MP++hdUCk8&oR+V7&ID1tFqy*S|$?8#C zfVLW!7vk1TH|6tixIUj%^O@2T)uRwsrb&MDvlQGU@FQd#t1`;9sC7;pn`XN&yh1KU~C= zyPpI6Ro=A^YlT;&km)d#N_DNn-%T~ydgj2oCWlE)T2M=J^< z5Db^mM?pGh%~=Oc*pkFJvZr+2<5W+TmM8Z%=(8Nb(*T*i+CGWv3nCCud4mv|3>}7u zk3dd4o&uSg&b=8=BIQ`aC%NE>q(bs@atIfZhP{zk3>TK;#?k1gLF&Sdi%W{*awAVC zpbpFX2npy4L%IosuB|7@5Z$`2H{U2A<7mQ5s&X=wL*)W3G%XQ{4MU;{R?{1bl6Vum zEZSGHI+7ukk+*TdQHLflV^Y5Ls||hBB}>$c62R0yn0NM+)@(Y=n58A11l4;5WfWd^ zE(y1Yh%!6A$Zc0{*f&Rmu|whD*0Ci<#)4pII5(>1nZ{IS)t(flgD3e3Xeb1KfZEdz z9n?xSh3ypHi{6*iRD26rP%>w@V`T%HU}iQra77ls+(6Yum6>C~VI~k`axJbaWap}A zf@r!zM$vvu1^<>DCQH+Gg=xEX2(E;7gM?-Ij1~3&RU&L;Bx_I?{-R+qnW55TEfRL^tYoW{KrDczO7R@JK$~>j*Am`tZ^CCGq@lyT^f+a{2WzFZfh$Qi5 zULnFn4airw-V55)xahS-7Z%Mmu1Pf-tZ+GPY9c$_CbGl5DS^t^kgnO=Zt7VgUhNip zywcSNm&2cS!aS4C2gABE?>IFPG&6qLH{g_2ucG6HPpPX;N~uW6#9L#}V216`>H({x zc@1x7ukSQOs9pmLWE#ur6Try-49lSi)SmxP9FPvqZenS)zxo0`XaAFZx*Aed=pj~9 zr4lyX4XeQn$bD9>owA1GG2G&kw(`F_k+!Md$)UG)rNBpkpOS`?ph3n4gKsbFgbLJ@ z`~z)T>@Nt>x1a#@Qq=-(WoGMUd#a{=uEw9L@z2$4NY!kZ9=UvUwr1yP`-h&U@++nh zbqLvL8s1tFWh{jP^xO@?6$(l21p?|Tl{p9jN{$!5$x8MA0c!TExT*XML#14Ulde>; zk`vDyZYuu`srmTm)-aFf)$cW6Ti*P%4B_VEsDW>LtA(akPC7eNjh%Ci_oo`~pKI(% zHTGOt|G~=H#{F|O`^#b|F@8^J0{#0T#{VG+^xs_$AG2UDO({uXYuvPgl9fPL#7f9m z@bJSX`Sq;zW7?nS(O~_5kt4edDPX^0Iig(;axwY6=U;z*I+kkh{h+PTa>Uqw zeMPy~a8mvbjZ%I|&i{a8>+ZyKiAsf^A;MoETE(lGu8$ndQ@a#8Ij&`aX;o{nxF*>E1jd(-d6v|aiA=KkeRf_8-opsqtmW*3C^>O(vHsdkTiB4Ty zmx0x0uXyP}vT{Wy8(1j8W2aAOv9NYKi%7gCpI2?)$iIU{UFSZZV|! zHS0$0Zv!cAD!!;>7Vy>V4nu`xtLa8#o+ydX^>mV}rfZDp+Fv#yqMNQVrVwY$rDHinQb+z5@wO`e2SJcK>(7L~IiW8l^!-fO zkPAAp`;pN8k+Aq9VJG{)>$>&0N$eA6>X%;^nD2Vha=6f&7=hD~J=+06x4_SQ-lZduL~=jN8}|6G+nt|r=wR9))|RY_GIRk!Z2!euXY z>sEf>Io&-yqmgY`cD+ftL1)hMJCFWe=R4o&zpbqF3wYl6yO#$4|6xJ+M@pEF%ZM!A zM&ybR7y5*_7aDQBNECG|-uSD!28?sKO+eV&xJ&zth~`B)t(=}%Sk zRipxafmCH*CChUqt5U(fAd9<`)u|PID_Go1 zLGa6Xjt?d@IhKhl^4X{+pHk9_8qF$k`Q!){MqiccMIs#(Gl1~y4hwE%j5X#}jd}piK~iNJ zE|M=&Kppm*aAleL;Q!6~{eHeoXA{XpMsAl64MkFlrbSOB(x-R{Eg=492Nii}_+&B> zlaKSt#}4)$m%E=m6y_j$o;iN7%UJJZRAY^z!`V#HqRY<=DQUEkpW<&KqlQ^8gW2qm z*45FGL2+~_(Qdpb6lay#Aggj9Bd0T2S&1jIY%np_Nh+EijwX{MVgJ7p3WY@78^;UI zCQ?esqdU9PBf4}T5zFe*k%X4jz0V9~6Pa{0sk=_35z)PevV;*CRj=&UM$$1e8FK0s zaYa+qL^PQgRdin=>OK=q4l5eE3LZ*p*=RbZ?9ZgL$}3r9RhwDI6fHBX#uVfQsB2r= z^Sq*J=p04Tv(ZyZj3Yk}14d%;dx(4+w5kYwBIwl-7yFz(P(a+FNO7m)QrwDXz|n+S zaY=EkSJNwmYV@i@=`)F}Vor4Q@7e3=N}P$RvX+Q<*^<#% zEHj+WMoO|{gVA(aNtR|~iO(crN@;c?uB5Yx?1&vOz2itsRfv|C@Dtf;_AyIY8ZWhQB7=GZY<3W}U zE>l;s)wO20OkJ0)uE!ihc7+)`U1P=yzso>!n~=<3%!-LOYWYAAJtidc7Z5AVaV#?m zudS|0n9Hrd&sMkcbKv@Ib*rqp&M|4s^@^wkfDgiHYpu<45PHQAofvh{%!#93q}oi4 z2%$iaO60Fs*a%N;M2@a#14;1vI_Fu+S>P#6u*a5gL+2l;!jHQv195Pk@HC z{=nbi{8{VIGKtrrDq6N9 zVUv&@XSQ`1JfXv22OSB<9m7K->IQT@y0VyChRt2$+ z7a%Hs+WEwM=aF3Jk%d6*n};tRo~)V+v@SXw+x!Hu>8@MYw)?Xx7y^aSd&x+*_H2u#=LKl?cX%BI$%$kDW%FmwlKr%ZW}2Qn&CY|Mf-uI3n}q{c>v zq9>DzoEfkHg7nZV1!YZ!_)TPnH8~n1YSF@ScQRS%#K@JSD%3bN^GX6bFmyB0>Wu!m z7DprP;_pN2k~!|~FB%{QQjF5pU`nV^U5CX9N$O_&=#@pFK+A@3Rf!I!MKy#UjSxUq zw^Ds~ghn|sT3_5(m}fslwVy+9UdUGqf$BH+T--BTA^)@`v`}4lrSfv+LW_K@=W5T? zo?Oef*`y%e{i*>aZdw2IM$vCTqj7n4-kBHu>w( zqy}8T8&uCGG{u4+a;T4D1iG8IP`4prTUqrnq?ar!ulrk6l~^g3wTjl{+{JVA!L_;I z+PUERS?~I#i$l|X4S$Qr5FCag^B@cK8up*(0O|XVE6(3@xrAO}m+-puKb&X9kmKI( zS`%aX`JkFf6PCv^Y6fB+P5gcHCPeedESfYqx6=mRs1C& zm1^w+*wZ#O9ZxpqvZJ zbHR19-gRFF3ToCeEr)^`z8(*80WE~9V9T-$zWoNRV4g*_6usC2I&_?}fWXQ0i>QF%a3DCu}|L{^m{C}_~)q9g#z@zSHw*dVct<(in- zdry>?EX8(=Z1L*|OfL5#bb)?Md|VuN#D#K;GbWBXZWv4ReesGY3a>Xy!iY$mZQ3#F zIyb)O+<4ElsJlsqN3+vT-4X88#g}#Qj7FRl<6+Y9o^Ll9L|z$E_l|BUdE1c)%{vka z?@nf75D9z3R^3-=$fQp*X7hKedfz!P(>?R8$z9j>UfnyjcIvtL=8oK|-k&d$I`iry zYsJyfZf@HN9~wGpT7kmPZwnXqDW4nPJ1yzb=}aQcm|qZadmG1S&b(tnL7JV@O9+3U(^~NF$w&k`&lcn|$^0aH%PI|!1*Bzae}LfA3&I^oh0B}YB&=C? zr*e&J=j|1Zc^7`6Ue`2SicN06GFtqs(TZa`5;;$P{-<$qr`XWWh=3o1+5~oJ7E7?U%Kf*q1n$*_TM_E(}kN zQ=lN|G1gN}P!3yACIVWY}1%R@rJmfJ4@-3^ZSr=AP z7s=0M%GmM9GG!iWchh^r5F4N+pZWx{?o~&JhH&u3^vaIY8f=m7ZfwJcvbyuBgU1;H zl(l_$7>(I*f|f~TIKgB+vwb)@%Oi4Qw#*{UkLeJjwZ#mM?FimQeQg-QQkrWCPk1hQ zbKa)gU|;Q*+vjUG=4v)howy~v=X=-p;jY=5jZAy`r{L-Z*iMdKJPNDeLSxIds;gDk z$8(L36~$ptsk&S>Ih?EBc(=k$h~@VAm(ndE5Tn}-K%o1j+g}zEfr4Fj3jPI<>T?li z8Km+ur1BMz3bu`d%(mfI_tHC0QIMt}LjmI^Uksa=YFUg;>JVTQV-VFEZ7PF7oY(ws zYVaKdWqC~jm4F_VS1acmx8)kQEz~wn#;+x=CT3QG>oh$IuG2(Zr`A8=x$70G*E}d% z<$Zv0PpidnUhQ`8s}?`-iu^#NeUoAvD0qPa zGIH`w7-O`I?^-)CwVz5~L}1^2(N>XdC4P?zhzzm&%1iYw|8-AZz|TyK{e0+TKeNY9 zd`!9du-|n;qzx4P<{Ja3j~x_#@-1~P|E1qv6!4R8Ye4?qMFBtgPLJzpV?Xt@v7e&O zWB9Wk$%rkIE!XY@pg0vtaTy2y4(y-c41oQRhxS<58%cTl_6;YJ z@uI_!%s{D0(W-20SB%5>F8Nu0Di6DlHiQEYGV5egY!?Iv6RTB$l|r$#_J`1t8DcO^ zjl?jF1at(!B`{6iG+6|2oQb1N?&o2eEof20_JT#U(1^$(jd7ar1sEVsA4rzE%E?l| z;V*_(^a?CS7#;DJ(RH6moHVMv>Px7&#Nf)P(oiGV;7x`gKw2*nA~1VP^$td3Jy3i~ zh>X~+%7~1{#24=siVXT;f53_Uyh^1aQBPKn6-t#7WPJy$m`ABr{FFD~ zh4+oCZ^c7`T4O=20@T`v1hvwF8U)n3hYqzGQ0vP>{l#;^GRwV{6-8K4gH+IZV}YWS zM`;-F$7?ahmB09C%0qZaW30m%8{_rBc^b16Z-97cvZYrdy(-?w%9~N%gmjB7y$b2o zXiK7{8SypD?Dh!Qc#A1u$hob=U=t%AVLq0kHj11Q!<$sz@CLIR_I43V20bLR+jUDQ zlr_82M7|W8n>8%;ES6|==Ytv8dN>!30tAc^OqkUpUXXd*f<~_cs$!7=%@7Q<0G9Qv z0)jz%3Y9-y)_Qiw`yh8nPaklQrd|hv@t{0}WdjCRI&70|qX_(IH;qzhI&01(g zk5It05z;=)$I?dH(6e0|SwndDD$UXM%B;SuNrcVlGk; z%WF4fEphPRD{H?1)SDht*BN(xt_1^z=duz z)*+p3KRz;~+*@n6sJzmC_UzeqIsh7uAV}mOK=>E zG7F^*y@_~2r6w2M%|}~mbukRh1$-o}pF?awOmib(voSVR-$r_L1y`vVop7*^5S9E_ zlz~VZh3bYkM=p-sZrQNVydK0+S+(edk~bkiB{VE}|7EuQ+1Zxo=4y^jcy6yd2s=$x z&ilyi!ZzEq*lfzxz;&u=GJ9?0>c~{~);F-xu5HCe`#$#Ar7C7AwY`RMFa9QG@I}lu zbeQ?;PH`~zc#F(E4^DxM%9f!(rl#GjC{Q3wI=h%jCouX0ixTa=0yv%K`0}L^rusX0 z;p(dt(5o*{n0kSdzl)&fbLlC-Ct^4xoTP@9EmNI9atY~>amm~`*+_>&*hd6(6E(Q` z>7me&X{vfO*Z62D4K;0l0Ap2wkPHJAH>hvgw@&IWPfp(COxzwAMLmEFss!*ga- zmy^-a1c-#Z>@^D>KqvzPi5UDlvM5AyD5Gf!a)HF9f<%%L6I*d>gm6woKjfKY?@A#X z!EiE*A;JBT%QE;b6%VmZ*2o_c5DLRWBBi7<>PTTA#%&jxgJF;$oPGiGdr@9iq_RPF z$tQ*|VVNZ?Z_o5_>LfB@_b`_cZkc?DVPn-chphQgw}t1_FwTYHJWAe#xE-V5fY@j% zW6;bsF3r0O%klwbAc{4hyFBR(&$Yl>rWFHiyX2m7!(s;yGR;9%zJ)6=**5v?pps_y zax^6?!%I3T58HeZ3qv(yiQ3?Ja%J`9)$=R1*hxR5UnHJwiVES2=Wnkb+rO$&h$zezlj=5uU(dD!j~g*IWjf){-zI`bNfzQip|P_@61!WZcQ+tbq;6UU z6*6wv4JuFy%kfWa@Wz}sMbiP}24+AH)IdkH#m>n{;kggSl_ay0#RgBLlZlrVOEA+V z7YOVkl}mvTQ*kO3=Ms{XLir^owO%sy1YB&%W-OS7j&@Rk4Z+m!a3$tfs;bc}p=T6S zGHZ0EKEZ#vmS*XAUny#&*|kCSVavx1~os*R4 zL^R{C7z=HsE&dQTDdQ`~@?bka!l}>L|NXi%7M0v!dqSd0+JWqaEt2jl0D^5<8?HxOa}s6L(2}?%gdKYFIY&vXa&-m`cWNBt`E0mU8n& zPK&a%GVCemybu3X@q%D(;D`az+0YNI?;hYB$6}S`&Z6SZxMVw9!lyXK@F@;bx}a#0 zTV%;|x}qcl$+!n~155K^m2<-*)nMl1o-8SS>?sd>jNnw8bqc?xQU_(u7yS;VV~NsZ zxUHXnkw4dE9OmNk{J7tUTjdH9@CjuRfxm1Vl_Mc?fqs||g2#+rfMc*QY=w=`^6hK9+F zO&Fe*NDaZ72vt#zCCRi1T@+(13y$nN%hE&disWRr=wS5S{5%FcFiQ%qEBS9$MwcPFE%lkw=@(X}?cfmYDw=Vw&;H-KhP z&kMJr=LKeb!I|250M~uiLaSui*1eSO#oWst7GzMR=rqpFUa7`T&)_*!iE{4qObD$z zQ_&&r5l)`=XxNMX2mX+%z>GSS1;CIVWdHqrF| z9+TDHKnc{Q4aTwDKecSUcJ%7esm<>ko@;q>VRh?5YpGz+FHWvxGuAl<5j_bNc|C7aG%2eMzL~-pTy79DFo#9Sj@cC|4wD3 z#i)Ns0Xy!rn3sA3d1Y7TZj2@z-{=G`Q=voJH);ALxj&#ibo@2-BFjd>;|Zj)8dTQ%+5P5Ns>8e>@EA zv&57$DttjP^`9Oudkn->-@%(y{}h2o$XI3K9j|L%b}B+iUbKY} z^JxI!8{QgW)f&z;+jC9r^G!Q)O*`hB_T`%Pz5m#UTjrWh%-5b+7ClMjd)_p|?|||B zFUbu5SDO%HpFb<&k)+Nu9yy3ei7noa;V7jC98BUdd-(YmEpQdscGY598tu0D9Nh0< zjU0}V6NIs~GcNPkn2B*&-28|m)3U8Q6YTmo44oYq6PJmMQ5Y8|$n&J=BG5);j2hpH zG+)I|%yqGFO~SfX$L z4Kl6jFDUO81q`(aan$!HV0TOUDOP$}Ym71}z=w$;YCu}-vQ`bhtc4%Ctc9NsogdRr zev7bYzxdvfcaPk0u66kr8k_U%x3z7mcV^Sn3%S;>v5eckm5VM^$YVcte+`}%h47BI z`=|RC9$CMzzV(i;$@RqTnw68%Wbakq^_{bgp@1Df{iSt@!XkF zGZ&YtE+G>?ljFt}D~j)DS=W!+Z(V&-xOGMJ)Dvn^e~XBVq!skTks%lb`FC$f`zp{m z;|840iNy5^u1bbaM)6S)vT&+o{ox;(Xt9-r&AW8w*F06ar=_nhTLn5V`<#gyq&iLZ zI!Q8aTjkYMUTZHmzb{DqOs}?=klM=ZT%3n7p2Ij2V=6D9KHo6Xu^UWm{1ZWY)xSj& z%tp{oBgi{NQM}^_h|9>w&UJbCZUbIv{YoO|wns;>45_`UYm&mTYk9YOe8O6Wg_ z7Af37gXwZ+ARI3$V`x5sS>`;a{$4M_>dkR#z7awc3uu7rEYo$w5KSREsOW=xvea>7P-rmdLy@OtS(R= z{=cFicxC(!9*?EvNGhtxr^0FZn37b~a7KyBN5`l*6bi}3f0RL4A!^8;JXn&{YMH7K z9BLK{vA0gh@`UjZ*_6P4RN*C|5aqBW1@y{^!^q*WP^gz;8W5h{YrqXnu*STqRu8~A zNUBWTMe+y*^uohBTv?`f@c(-K!(Kj3r(*F~O74;Oj)W3QIvqY1OCIATG=cb^Ij+bf zqetVhhEa-3D!osyHOjI2as8P=Hydr2ak91X|gV?po#CKL*Y zId>EvI1@`K0awo6pB&3cyJL||PTChsXL9bRMl!KfG91r24kZ!Ex%XxWBT{Ovx<5UZ zjOfXLJy#V~(ux`j$7AD4&Qpv!Pln^8N*b^7?@gvN;bcVFl}cum7cC~ti zQIO}OSDVtVXB9P#m!n8}I($rtaOCHqPfHZG1BJg2T2+K05%g+{ibHmf5Ur2e6e(&~ z9EwwM4cl5!Jt`^ADAG}<;#QoLGweMp42x0Mnd%{r;*B;$J!hmV8sMR-s9W(3+dzBL zP_-7XLcAv081>=l$FmyGT4mXZ)mkIdqkJyl)hPAoQ-jtgKT?fG${iJkozdDej-jUV z?aSxh5!7XXx*X$hqIMnn-F#MfQ5o#sS=7MqsohBkfv%3)k8!Iz|zEsxz?x}=gFMwBuB=aYa~1t zPlcnoD$~GnRi?q`?3kE{(}WAOtPtxi+^`A4ABq=+j8S;bIU&4;@(J+@=A3?_Fkw5P zFGM_xg;Ar%gb>me0<f49ReC=v^ulebtFs^T+gtVa#b*Ub9vzbY#M^81 zR`)a>uMSCn0-|4sSfLkHrnNK33mM;X zObApDsKi`zRVF^6HX}z}PT6jq@^d~jy=y6r%5!d=wsUPJQZ1$ET&t6w?m;cQ4WbJvi#ER#IC->hro8yho9WL_u%2(O8SLNYUJ?A6!>dDWP!}#lS=aB z;eD~Ahtsi)(lZi{ynux>eK^BJkzN%Xt~X{9U3yP$=+)R*ug1Z86Kp96j*O{m@apm9 z)})9b;rK7C2JRV#RE&bhMg=BedBbFaLyD)9D0Z$31w%&*#XR(jRFxNgHc z56wI@o0wm>`>gacck>-&bOzr({pRV}zWL7W08#z(^^YyA-Rq2ZMCJ?*vs`5RAMBy0!pI(l%vM$0ZayTi+G(iws z4Mqv_a7txTs$S5|Wmc_}_9Wqv@X@#;r-luHAYL>}K=PI$oWxS2X*nDr3QGs&{&>9j z5-nE_tB}dn)Qd4}Xdq~lh_1b#i{#YPKK?z@eKN=QU6u}_BUUmnI#WWqY6m7KAgSx{ z$W>cFf&MiaLJgpFMpPfdBTWb(t36cT8KPc}jW=4~73A6bsrEAnUJ~-Pg0J@VZRfVl zRmneZ4=mO;T&%uOz1S|lF>q;MdRw;r8Qg5+pDsNE2gKVkW0rO+aV4Yh-H~;0-g2Md zpgO9^v0*vNn#t+WNJLSh>2CR(;dmOjfG?EzI`U%_AD0D>nWuieW8y#i&zX+ZiT z+eQ2DIvm2Futj)P`WN<7V!(F$cZ`9t&DL=>l_V^Wq|_9alB5C@4rjF4`SK=pK%Z3~ zpQ%uoc799dwhyx~-e&!(L34{^sF0==@qf`;fk|#^z4+XP=N1}!vW-3SjlB#0-Z^*g zoWJ*WfyAnpALtY>i)*Ae9i8HrfRx`c=JuOPCUTr{18e8Yqa>KdFf{-VDXFeAI(@nv ztlpA&+D`M-U~L;@RYz!omY|@V^~>}ARdeoDUj+)LjcKZcf+;>9_i+LZgsWoHQUTxk zX&zh4%_DCxMzdKC-MX`l-SdsX1%GhP9h~zAZ>x`?DihzB)D|)GGg|E^UD%4?ZU}rr zoUmOLuMh{t4}8#e`we3*53xOL*(uYpsBa{!h7+52Hjtlbl`58}X;RP~wqmJ!kXXW3dCQkklwOMfB;RV`tBZ{*7Q1%k z9YXD@f?%)p<^{XQ%W=H)3%r8%h2KDMw`|t>6~Jt56_~C4_It+Hsf_7-NWX61P2G)| zF^I;;JE>94H&JB$R(p}Ngio8>{D7L!GRpaMtA$S+AFU~fkJjY<#Q1Xfe6`-&X~w!& zt`px9yQCjG)>&CMsTCMCok0Y8b@2p=Jte=W?F`AM8s(S^%c(m!h{4`bky;-oDql$#tvXq~D2k$6!Qg;(1oVN4{6Va7J@ zI6b-T^yI*dm~)bB9L~(xbGG36ocKacJZZs$+n%kYHGXkK-9Emqgo}nkH11F+xHX=N zK-AhEH0oZZF4InzA;(|04!*m4wtx0}Q(NBHerfyk%IRko+Iq9CgTE{g<9zwSmEw3{ zD_4LA_m1q>Rpr5FHw3Nkluu7?pOJFXiBv4fwIJJ&>7eHw7Un27u2T$;F^Cfv|? z5AEN1Z_8{^dBHzJ?KDZSU_m~izUgAug)a2*+V1xU-Wyoh`gC^d)AL&o{H%3wzHacW zYti4g;P21+`#})b)T#}WJrc!Yxx2hyy zsU$t9wDhUf2y%|mWEx5fH^rT)qbC%o?(I-PFpjJesjEk*tXfkfM3i_u6vCdP8@Ws} z-oZII4Me4Yc6sR*kkF@Rgqt>>!=3LE9$0m=y2G*g#zd9-rZ%2Ge&K<< zi*npTQ%l}MF)zicDCQGtQ0v^0kEw0`2~lv?{K8h_SW&PemZw-=b~#p0Nd*Cqe4Wd& z{_<{$uP-3pK|yc6N$3i`J@MwmV&9JUyWi`+>8f>jZ`3WHvQIrbRh6w|pHO{3obx@g;Cm+Pd*-HKtFBqBYq}V`5WHzeoGIsC^Ke=vw!LKW zWpW6i7tAo4#2}QFI$}amq9~6x<)n-#5b1=@6Yv)OHz8iN>DG79gI%SCDd*h1XWyQK zd$3wN6H4ZIDoR@GSk84^2}hyl4LCTvx21;Fhf$v|2r0z0rBNM4+`KHZ8u~Ue^HohIgnN4h;a*a|f$pi_qd-M4pv|Xxl5*IDvc;7qR6T{j zGLuxKZ#1nl$z|;SP7O$kV-fUy&GjtXVWI$xp8MeVM-uV~8#Xvw2)L)Puu z@W=?xT`-Bg_e2^N7iT{dha-@T9^Z42AwXGet&7o^2`8AW#c+a2M@(C*?SqNjn8n5- zQ#0voyxz*-m=5D_Q9n(MmeO2%@T}{+JL_(_0ru5%p=Y6PO}1{$^r36g`=0kaA8whe zTf^kizw@tHgtmA8IkHqNHn+b~bE)R?WVZPcOB^cTnhP~kquJUux2l|kSWbOYZKhj7 zAV#;Vk$bmv`(+^!DA-}9;4gqwpNlvZkjl-F%2PxtXk+&$E%!uG2zXr`~(k1?yJr1NVwnc@JRRPS>M5FZVll){58N;?5fBx`!o-x+050 z&0t--fq9?Dx@flxsm?gXFloQz)kTWhAQ9S$)kP)59Cyj|a2}&9(}SFO)ukK3CLN#4 z_8_g6WqS ze7U{S%o|_qId$q(59tYdU?NwNbnY*D+sD?pWTxlf81|tCzT@oGQ-cR*BsGnfsTl-0 z2}bZRlRWN>0`^c#D+SDGA|z=PnDSNqKE;ac)es@gnnq1~t}n)1d4+S7Li#PV28(SM zYMWjkJ2!Tttz)tK@tY2NbxpzUsD%Oc78C$xiD%UwaNnA&`@tJU;?eo=+H4(6xGhte zH^wfFO=qrs8{|{p3G(^El*0unJ36cX42JwXhH)nh`PZE^z|7qiW`6Ia^10+tfsCpc zsrZVdVleY+^;?*D^(6{u8C1_uVBos?JCyug1Os=5*-X)5#ccH~nx{+AmnxRZl4jlO z7DD28QHk^SFNVkZBJgmw`QcJLZrS+dECZ`|2F2@Z#hu;K^-e4UL95(KvKnE1f#&gjz}&#D9Trl%-)27z_mKZKm|fOXy16`N($u+&%eSpxNKYS{Ie zI#!KOl8RL&BZ~SQ0?QVMbc9Pc=3IMvgiw+;sduP7{lsrpjMW7i zRXQ!AK2JfIf@Ks$C|E;*LctaaXt%|bYbB~qb(ji>O{!!_R*zG#hXO`?Gy*k70Ueex zYc@AfCIz!p@P80MvzeC~9p1~Xynx4SggrjAv&Y1={_ZPfaU!Xbc^i#?S`sB!nnv@LZ(9gf>q?+&$(9ICEZ(taKuq zpIz$(q==z>LxPmrjN0j2nMFPDYjZu6(hnP2%xJl7?25r?-|YJ3m*<0;s7E)7_XZ!Xi|gbf*27Y@goQ~II(jFB0Em_ z(C*JsZudu1$36_r=tWqM&^uy-ll0raEp3c(C`gwia^Gl^2CGn3qb*`(YaJUP(8^c7Rn!~x4%_iQw^FT0^d{qtr1tl-cazGW z$6QeTv%SNxTT}X%9l>2gtuvsK(jP7j<>uwCp;jAE{eaqV-=UIgMPqrWUpyBqv)or% zX2FU&r2NJg^I1|ZrD@n3tw$f1fAQXwhj5?z*nmDZM;n3j)MqK$gyo^dlwOW>YqXh_ zx1qcR>2_1P73mddOG`@|;tw!G(Su;)?fL>k-asYxq6qN_{YRXGF*6e1OH4&lc~cRo z6kz5t)}Z@jD7tJc3S|vNG?1^vN@R3PeH~LYzWLrvLIa%hCjkQLbGDc@B3@kcxXp(? zN2$q2TNr2p413RS6YG8)l|RLjR^Hx&eYf8wO$QY4k4E)V-cO zmxQsW5!-s*($h{oV#)+2jSybwKSLVn#+%L3NCjEst`tvEThtyi9CIciGePCV^z45> zl}}f_CW)$Q{8a;mb}_FkllgP6Cb}%aY~8(MiIuW=q|Ja@Jav5#$J8{>uTnvcu!?@r zbh-CxUSsNS>m=I|5KC!&6{<#RQu}1wvO^@sqfD9JU!R`%zWK}v#uLowsxviNGzonn$yC!FoG{b zBlT6#%&$@_b+xKUL(n{JVP*v1_zw-NH=i@aSu>6=Unyy+7YWDDP*91S%o?%s^yK3M z(GDP{2$*3%Q~wyrC0el`AyeP_m`I01xJCp-$IiG)?7q;@eba?+K!mb|+oP^X%57%JJ}c3`9aMw`l_&Kq$k*u?S9UW>ARaNGhF< zk)seClVfp4Ol-!D9>RqO@1gVi=2t1S%O8zr&?PttaUUR@@V9ocTTYYL5Fix0g+xM0 zq|~uuM>Ge28iS@%Ae?><<2xc(TohR+`{Y9-7_iI|hEG&-lzg(``D6?m&P%+DL2cH$ z0>=30wZ-4DQJf-&ixv6Y;6eZehmy3WGCIv1NRs?@L0R6d42LlXbbUcG#d8g?hH^wh z+dg@qT(_99Tc$Cn%J<;)pXruQ9aoaXUA~9_N-(%bOZ&?+S%nZz4QLQId>m7lSzQ8 z|7dsd3jPWoAmBnt1qNnEg_0kRpxhIaEInCt*G!XXXNpV{!axTT1{~qvM>mbnSRxPb ziT#?FYBc;cFa4UA{;GJXdKs)^z|2L}H<6R`vPCCM{*O5yr%z4HC4p@Tubf7vMXohB z`G3SQzk?b~uC2&4aegp#AvAsbgS8*FWp^GrADVA`cESIwiEjq7{=oF=S?BDjcm4DJ z9dqs-Xe?Yt@_P0y#twziuZW=0)t*B^LiGZh;C&iG#1`j3Uu@@9$VJ25_EZ7#2OTi+h!mbnLDv&5-fF7Su?x>xSsV zrjLn4WyCZt8daE5n%4U%rcqx^5?X{G>ik3liev^iYnlHmnE=_HrUs?zMN;=Gki!l~kRxUQREw*;#UAVuZAV_oq%6cBu zELYJvl~?drm_T62RT_OG%lOf;BQpJ#0 zXkqP^?Ak46{?hp<_)BNaCxW!H<`ajj)_Y4paHFaH7j~h#K5s+zr+Lc%^cPf+7hE3i zFIn`L>Ggp9a`RU4kHuc;ht93yo3<^|Thd17+u{cAw0)!VinK*~N8BpDD{gfDnYcyz zbN5zJ6T>p87nEeKiiu=gM`CdyGlZKvvG-(XX4tQs!x(%f#50E0ix?nTcYb7Cf`((j z2CFP*O^Vv1lF2%R+Xp9b``}i*4}z9kd$H+pqRN!eqEQ#>mhqo}R?Z182#uLfx-um6 zv0r)E69lJLuTy;LLLG!TPx$vR9Ahax00+|;G)Hn6+Kl8e=+>0N)tJe$V5LbHW5&Z*hItMM~sbL0)j{k+jlIk z=v-{>SZrT&)8ioF37iYZ$LsXt;}$zz@$7j0@{8LpY+I;bldWGaypD@FOF7;dFah-^ zXu(ef{*+>8C?JY6oh2ZCrv57gba2tiywty>GIq@KZHh5-r@_3`e~r8{EQzXGBrak} zyq6=yn0|KSJ>;AJ@wxpusAg2+=K|! z6Wt${?JV@n9}t#rLnD}r>I7U&$QI4cY<=fKeK1=eT&Ulit=~L5dhNt~{ob?gpZi-X zFPCP#AxvY-lK4Y1(hlM*_rvAa><$#8m>c7R8RR0}< zT(yRhoNpEpQ~fKHT9L6v$2(qEcd)gfBrm#5i1`En@C|RB(E0#pnmyT;o`sf8*_KTU zEjzOu4=9#_u{fa(|QLk8*KJ< zmyN%oUi^XHi-26}sw>?$`Wl#SOkwoY|Sot%0o+psq8VtKg7 ztZi!JW#`mm*~ZSihvj*NhL)-Nso|+M?CJ9iBs z5~usfXAuKzW~nsKogLS6;SqHnnRrZ1YW`6a-^H>n?>DWkj6P+_w!04PvJXgh~$l%d1?w}&&rb>z*#yWECrm~>!2&Z3>uhvlW z6=kbH+-0|Csig7DwV3O~Nv~~`leRNgZ!Xs_;3ig{e3B*u*Eq^H1FpSmajH(I{>@-*8L77xlU4p4UD1-0%C&cYfdbF8`^z+Q;E|>#u)!`0szfasQnz z%tJIHg-;PV&&9cZF3!gtNj}B*^E}0!Nk_`r?@S5(LQ3oxQ?7nj%H8iydHOvmZ@-t7 z5t6=CRex2=-|uJFVzN3F=nt^CD;Z4H^w+SsJGmfL+h5D#o@8CBzQ3Nuy~&1DV}B#h zIk@MzxbGAfuaavnJN3TxFJ!5Hq*luTE47KG29O$*8?Dr4mRf_<1#+#G+A>@ls*C6pANlg`S=vq-8jllI7JW=M(2Nb}SE zY}f9WWJSdtktOVo9+G1^#p|KpxG3xa-Tnm3DRcci7}UW?oCk?JWT!>qf|v7h@%p$^ z7UP2KlHIarz|o8*;-c)1<2vq^y|SB927ITv0Y2_IRo(BCtKtn{IN`E!vwnZvD_0LV z;#H@F{(uqpBOZ)5#;b9z!8w34*z3p&qmu1ZITh^%<$CnVY4oY4b}x|`?un!5*41}W&?GnowLD)GlH@h35tY3b05{IS91?Whm)CTT&pq~kEjV; z7)=*ZsOIfF_taaac+7)bNttXtPtY|CizDplmwz3|xY_`sf9U;0bJLb8o z+ib}^V+5+qst?qn$85sHI5?D*Ri&MB9hjt+QN&LZTqLH*q{tXoLxYqU*L=`& zA~Z!JE(|D{lqMX^#D_I8k&es9HRq6$oOH7GSX=DAp$1J56M}U zsdV6$%1R2T7fOf%>V`s8rPU4$+j1o5zd^)vXDtoE%V=P_d;Huv@dcvVrnOB5d}LL{#D|Qg|fkb>%TC zx*owuQ@OAVfIdRul-%EwE(ed##sRC-zM*c^n1Ya|(Rg zwP~iSH`moW>#uuz*O^`8foXq7!Rc7%qZ>5ea&hZ6->E>}#jSpvbt*Z%Y8&grveobH zy0q)6YkJv6T>EC*SG~9C(x!={)9p{<+WYCU&Y5K!bIUefbAMFzVb#aaO+VE;z3c^6 zwCs7&cw5J8>x$XB#y|P)__B9aURZh4EwrF(ZwB%{Zavz6tC~#-noE(hLrOYk&YKui zj$QF4wSG&vzdm8pfU^bq|D5d$5fwr@|;xfig4Mu6By6B z6>3=VVg$;9IP!NsounjFO_il+T1pstAC?nL@skEJ3e!Z*j5WGmYUI+oBRUv8n3Sc= zfYl(_4AoN5uBD?ATQ3u_f2` zosxKc)A_!0eHS<6>O;4@;-bLm?Qg!2_j5J%Z;zcBoAR_Vsw|;K2X4ct@kvDHqsAi^ zEuxTdn94EefWLjj8mH}YQiddE!(aAvzDn<5pE4v%i2*6j>PhNQEGElwb&d3FG^v6h z@EVn4301ak5OOFz=z`|bYbej)!ZxUw?KqotamVV|q@BFbSa(lUr+?&EbbspnGj@v)Bo{TN4 z4l9{7(RwVSWFYR-GDb3*HHPOa9M(Q_T>bh`MWVFGn=`u4VHif*%3f^PUL}bV>JkKh zOH&7ixv}N^%jaI6X;_O^cbKT5GG|$Yqe;On8*sw8LC}0R1Ia7!>sHOjnN!BlyX67I=FPov-Inr z!y)Ur=A*-mJ|d5F3@x&&VgoY|)%DR(wpJWUy~ZEXfL0>9HMxd0(+%O7V0g+Co(hI< zE5C=LOv_@rT8tRnJZSEt>%wLP_ah5O`BBFe{xZo@9FT~P+izOKxu0pAl}F8-J-Y{^ zN;D;r2HI^^G!l#IZFfZh3Q9GU+IcB;(ouY3lWJXhB`CQxI~DU)8Ugf6R}x9=&6TEl z)t?|wCAb4@-clk>XBRZgE?klqxtgT~&ROHjb55^MC+hO?egpLjzmMR4g=^`UL&Q4f z5wXtOe{K!w{G_cv(%1Ty6q@oahVbh>GB{!{vP$2~OGue3iS3mxP@N|b=#sdlL=s!C zs42L+ zTw%|w1Y4N;#CFb%T{hYr1KxgwwC1v-2!(*-gxf{cakr8=ngEa;l?IfAoQ@}lB}Eg6=>53@Ze+om?O?r8XO{D zQ(*jzKhN{ro2>#j%#&6y=@=1DjBPnF);Gy(F4BUd*-5A72zP1xs~Uf_gb;3fHxmYY zd{B9MWOccSj6~?cBa!gtWF`iM>gljm_yg)QEd&{L{B_IT54Koncbv!$~b5Oqzbo1~_>%wI>l}?O3Jt=6ykxU}Z6kx2W zvvNvRUO_{UL?muBx1pM=L>-2(p;fis-Ac<+J%?yRB~=wN$IsO@o?m%xC3<;n`$v5r z_RVbGo!h*7dh?#&wCtU(-FwxGfuEW zs99;EbXp84EeJGM=HL-ImQ^H5siA;gxaL%|ib5l!5Mi>lwB~_Qk5x-{SXWSiCuEXL z9aTtcQb-?AXeLug@6p7ev>r;gt6TL{EMVw|MEz>LudF8w;B9BFWn^HVnV{_h1F(1XMDCXw^D0SwQ+yS)OwRe(MN`iwaJ}@)XNUZgJVTP~dRN z*Sf{7i`yyQRY1I*g3f#+w`|pWn=fsi4RyZXHraO5T_gH#1nSOi8*eNLBQ59 zX3?Rhc05KA7K;%_n1?kpj3T8B!WJt**rR|2<2(cYteL`r*}Nh^C?se`A-*d+e#!qa z56r^Kfh9s5`L#9g?*v$<+o$X^ys`MV%?7#}W~|=3CBqVhI#_~{#EJsJU@c%WVfHKQ z4u-O3!}{kaayICHP97`)#WV&kjBM%Lt6L@1&J(s~$2zy^MhYa`S{&;%#4wdk#K-!S zMHr$@n1)cj%dC(lg< z+oyy3rab#}72FyvG(qh827ZNc1iJR}b&V!ec;`GSyr7VBr5vN+I09G?*?=na{`C=M zQ!I_BGKQdJC@ITYJ(doou3c+XgYLjoA)wtQW7^Ps{*`mD%rtc78aij|S})eW*LT{sb#;yYAAl2DHOB{!n0#co8(bUNvzQ@O3ck(?R;kqCqUP8e{S&V``cpLXa!JtcQ zMIny34_by*Wgc1OeZFE@ektBrRl~Jl7ranBDz~=dv+}S&+b5W+-g!iY$-~tHSa2|_IiK6Hk5NFmz#?`Cxyy-ysa%XGn8x%J3YqI& zVmM|pDN&}Gk~UIbCgT`1@wcd;Qd@Jmt}T4peb$rnG~a*(TYGNpOzrYq?edBJ*MyI} zA9_F8I90oxsiXfRxOf(5?h9vLfLUXg}}wJT+@bga_y-6oN}D1rfj+7)RL?Z6%QdZ= zt!o;OzmvF-xVjK>r}=Tnoo13db-vT?TOO|Fu?MBAycccUR*5}M_PDmz@Yg;3)_`!` z%PxwjPzg?E39s$11t0X*ih_@k+B|vQI|x1>BhjiNiH7{jZan0qLld@=5!%;dnY3>&u?xfFYmXf} zww4fqwJ=c2Y1*$BzwKv}S~|OyHrW*E8{4N|+`Dg5P=?XAGJ*hmZ=%^KQ#S66;@QHq zl;S51wJ}VMuB6~C3X1a7QXB0MV!0-x<5bw($f@t5I%H}aSJU|R@R{KoO>MJ_SKbtz z)q#RjtbtYa78d$;C1>dlh}%HU^Vp3dvzUT+MXnZh+2--=JHr=-C$iVR4|b{R0J}Ui zr|7y9&DrK*N#GyeqXhn@vjU{Ir$l-`IBVRM{O4htD#jZAB5PREyIR?gfmeP^!5Ioj zgcgZi`G<7*CW5|uBW(t^l#;gc$EdEB(=QdAqdwYk*3Cr41gGf&{ox4Nl=_e7njSAF z@>A!|L2sN5BtRZJfV_w&Nul{97B!HC71uw;R^AF!fFYgw288GE81E!=wAX>2w!H5+I(XsEnl>tx6q5%~;07XJ) z0(9pl=n^oVfVgK^47s!_gH&l(HCy{I5IknVZfMtyAI)(EA~yTF6!O|$4!Lw-Mym+N z#m#LJ^<0ZR@G6QoAn^tK9b~EjfePCOv94Fmcd_1$qX^G{aFJgJW+)< z=qOBpXy=3O2V4xc7YMeOT}J|X6?<4Y6}%$?_;<-3@E1URQcd76V88Onz5x%weh~ow zSJAQ$E&D6C9IuL34LIX|*#i$Cvv&a*-axFMK`Z8wgECujpro#coR5)dMm`6F^@Fcu3K>35^rVst;lb~b(`&a5v~`ZF3mxU5ns$qNsmF? zKW5EDoFdeI^ZKPy-+U(-K6WgC^3P9?`J}LWD{v z#!_Iy=zv{;nMZwbj5^8scp0VX7!&S{PQ@K@XTox@8585qQBjBEfl!H$4530>HiXJ` zSA>d?u1e7ST@k7)KARd=HS&)wYTCxUChXSIorbaF)sX;(3A|31e?)-=2iPc>7-Wu-Ky&GLR7$acNw>}fL~+V5 zC|F5B8P-MAW^_zfaV{cZq}I^08AIr;|D4$25;DOJk`3u23U5;;#2mL`UEr6@xu;EUw69hTTQC6nAWG=dXwOtxJUKtDZuUgbxnO%$Ud*>9-6c_&)zM=xNpW>Nm$EM}V29LF21;Nb!hS4$S~6243jHQnUl zQv~G^b#=#h62t5p2DAr{nU1AobR+?0A}?IkY7b4w0|SW|Hil-AiOa!^swT+$2p)xr zBx5=@6LO~yoGPQ67}YCT(GWHM)#Wxel~_77qtBz9qWV5Nsr2ayO!#T;L_ zO6h$M8^gIWWIZ_br+6G1!X|Y%bdh%tJ~1F;o0L&i!qYHEm9&1luq17l2cj4p`XE9& zqo-QUTA+|bNUHJp%vt_=-Rr}R4-L~K2+^5DRtnqIK^v}+byonS2-AG+$gdLq}g?ey?;5Zn7t+={yvU57v zJ>}`v4R``tH4l=VZ{Sz>7=gKUyP|A^z$!mT#WAJY{m4(K9VOeG?pvM;rScT&L_1R_ z#3+Ga)_W||DD;8-R?M1A{H>T}vn#~Fw_^5d6SK+$q)MM%z$%kS(R^$^ijoJW=GQsb zP?oPCdyW{rio{ao*j`5j6sG4x1i!QD2I z8p;Jj6U!iPk9`oF4n8yGd4@c^zQ^BIgJ}KalRb<1YkW_e@ZmDVN|aO!lp(mr4$454 ztR!05`VkIwM&4yi2XsJrbVQ%D3prW|+>cC45=3Q*$o=VL;#Jw2waF_Tvw4Z4CS!(E zV2z6F($)A&Tj=uz->P?{53Yg2#DdSh4e6JcntL|EuxaXM19xctzY44q{a?!v3`(*S&b}!TdUv*N}Cb!(T>^1 zR{Cpc&%3$mrUGYzT(%9Z)Vg`lzMD7jW1IRdZOmYOvk;wic&R8Jpi!0hem>5bz!##s#&?TDaHFy9w@$9Q zF7H6{mw8J6^0$J(G?ibdF z)v#~bl8u$>lv%1=uur)jnSDweb=mAw?z`Hj+?DN9rh*5>&J#U@$FU~QJ#dXp0AZ4% zKt0lj0M5}s5_(exiCJ2heWOoN#oMDJM+EE0$K@D45*C*dsT4l^g|C1mhv#Tzl>s&O z64?u-9Y%-bee`bWV?*R-PM=66Y=^$^Y4zU@ap`YguW2A%hN`JUQs|qSNDTsvgw80% zl7vh`DMbe>Hb*GXJcyYN{j4z|FNV`?=(0Veg$>bDR2WU`hH&5(UnC4#^I8wAEC4rX z9=hI(K2)>NXWN$F^onGJg9LyPuC}5P zuDIR2ZsGYY=eEq$Ezi|0FZyN(*A8L3dHo9P(yjNM_TVdJHLc@MytC!PmWh>DxBt5D zgTCqDwkgjx9f=}wXC9V`Z84bO-c4-ZREaRhwDt%j1oXA#Ogr;N$L*4$OgjUGe=9h? zM!}){OVISZqCxpL$nBde2gr6;CI^&{kye4bsc5M_K-{hC2|pqpKZ^po9q^&qym`?( zi!LmhX^T8X3c8tQA zr(_#0$p$PzxB{t4^IG-rwB<)7-}p+FIdTBB&}&E5YqnF_w#QsQeP)^B**1SWMhe#C zVV}GQU9mh+nZ9eLzDv}-1r=Zw zspasgKQ;w*cY9Y@J!v4xw4qZDkUAObJ=hI-z{F9HJbne{@Vy}gM(D5Jy zSH56}m*_(ipfx=>qoh$=w0MW<;r|2D>@#Rn`S*BL%6~whRU1@k0Lqr$rF??iQhE%S zlxM8MOsCcos?_t|C)#`-E$Az;TCQcWE;`rdn%B-WKap#GVy1a(u6gUn8$MYz-MoLM zZvVU#N;=d_CaU}du;jlaRQcB{5My83Es>Oj8Zk+E7?Cn)xdORDz6mH;cHG@v0iS)a zIV?;HBU>#BgP#r{w4oSn1Ta@8hVPC|r0Ae;>1RIL(GC4GD&)Qnc#eEN^v@YEX<@h@ zEJv!{{Xn5_dX1RhX*XZSzrxcN)*}b{Eu0N3PxE=*%iF=1++BKoUkz{BqJGAtI$-;5EX^qlkzJH z{*r>9Qt%fPFpcUzQtUrdz$lC8MwzDI2nB-_l>1)&oDwNG1u3e&3f5x2SGBtD6;9-P zh0`a_&*_v8bIVu1*L$hg{LGVg1$j^{$cs3`ajK@_?B4MeXJ5uAR`YI3!d73~2cM`k zK0F0qsw#@T#6QZ`_VL`7ZTv^QANI~Z);`R~oaxrUCs zm!0+PV%jt`vmlJVcU#L}cM "InviteContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InviteContext for this InviteInstance + """ + if self._context is None: + self._context = InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "InviteInstance": + """ + Fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InviteInstance": + """ + Asynchronous coroutine to fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InviteContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the InviteContext + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Invites/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> InviteInstance: + """ + Fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InviteInstance: + """ + Asynchronous coroutine to fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InvitePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InviteInstance: + """ + Build an instance of InviteInstance + + :param payload: Payload response from the API + """ + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InviteList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the InviteList + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Invites".format( + **self._solution + ) + + def create( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> InviteInstance: + """ + Create the InviteInstance + + :param identity: + :param role_sid: + + :returns: The created InviteInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> InviteInstance: + """ + Asynchronously create the InviteInstance + + :param identity: + :param role_sid: + + :returns: The created InviteInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InviteInstance]: + """ + Streams InviteInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(identity=identity, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InviteInstance]: + """ + Asynchronously streams InviteInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(identity=identity, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InviteInstance]: + """ + Lists InviteInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InviteInstance]: + """ + Asynchronously lists InviteInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InvitePage: + """ + Retrieve a single page of InviteInstance records from the API. + Request is executed immediately + + :param identity: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InviteInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InvitePage(self._version, response, self._solution) + + async def page_async( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InvitePage: + """ + Asynchronously retrieve a single page of InviteInstance records from the API. + Request is executed immediately + + :param identity: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InviteInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InvitePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> InvitePage: + """ + Retrieve a specific page of InviteInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InviteInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InvitePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> InvitePage: + """ + Asynchronously retrieve a specific page of InviteInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InviteInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InvitePage(self._version, response, self._solution) + + def get(self, sid: str) -> InviteContext: + """ + Constructs a InviteContext + + :param sid: + """ + return InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> InviteContext: + """ + Constructs a InviteContext + + :param sid: + """ + return InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/member.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/member.py new file mode 100644 index 00000000..26a68650 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/member.py @@ -0,0 +1,716 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MemberInstance(InstanceResource): + """ + :ivar sid: + :ivar account_sid: + :ivar channel_sid: + :ivar service_sid: + :ivar identity: + :ivar date_created: + :ivar date_updated: + :ivar role_sid: + :ivar last_consumed_message_index: + :ivar last_consumption_timestamp: + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.identity: Optional[str] = payload.get("identity") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.role_sid: Optional[str] = payload.get("role_sid") + self.last_consumed_message_index: Optional[int] = deserialize.integer( + payload.get("last_consumed_message_index") + ) + self.last_consumption_timestamp: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("last_consumption_timestamp")) + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[MemberContext] = None + + @property + def _proxy(self) -> "MemberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MemberContext for this MemberInstance + """ + if self._context is None: + self._context = MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the MemberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MemberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "MemberInstance": + """ + Fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MemberInstance": + """ + Asynchronous coroutine to fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + ) -> "MemberInstance": + """ + Update the MemberInstance + + :param role_sid: + :param last_consumed_message_index: + + :returns: The updated MemberInstance + """ + return self._proxy.update( + role_sid=role_sid, + last_consumed_message_index=last_consumed_message_index, + ) + + async def update_async( + self, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + ) -> "MemberInstance": + """ + Asynchronous coroutine to update the MemberInstance + + :param role_sid: + :param last_consumed_message_index: + + :returns: The updated MemberInstance + """ + return await self._proxy.update_async( + role_sid=role_sid, + last_consumed_message_index=last_consumed_message_index, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MemberContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the MemberContext + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Members/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the MemberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MemberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MemberInstance: + """ + Fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MemberInstance: + """ + Asynchronous coroutine to fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + ) -> MemberInstance: + """ + Update the MemberInstance + + :param role_sid: + :param last_consumed_message_index: + + :returns: The updated MemberInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + ) -> MemberInstance: + """ + Asynchronous coroutine to update the MemberInstance + + :param role_sid: + :param last_consumed_message_index: + + :returns: The updated MemberInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MemberPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MemberInstance: + """ + Build an instance of MemberInstance + + :param payload: Payload response from the API + """ + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MemberList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the MemberList + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Members".format( + **self._solution + ) + + def create( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> MemberInstance: + """ + Create the MemberInstance + + :param identity: + :param role_sid: + + :returns: The created MemberInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> MemberInstance: + """ + Asynchronously create the MemberInstance + + :param identity: + :param role_sid: + + :returns: The created MemberInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MemberInstance]: + """ + Streams MemberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(identity=identity, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MemberInstance]: + """ + Asynchronously streams MemberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(identity=identity, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MemberInstance]: + """ + Lists MemberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MemberInstance]: + """ + Asynchronously lists MemberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MemberPage: + """ + Retrieve a single page of MemberInstance records from the API. + Request is executed immediately + + :param identity: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MemberInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MemberPage(self._version, response, self._solution) + + async def page_async( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MemberPage: + """ + Asynchronously retrieve a single page of MemberInstance records from the API. + Request is executed immediately + + :param identity: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MemberInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MemberPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MemberPage: + """ + Retrieve a specific page of MemberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MemberInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MemberPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MemberPage: + """ + Asynchronously retrieve a specific page of MemberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MemberInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MemberPage(self._version, response, self._solution) + + def get(self, sid: str) -> MemberContext: + """ + Constructs a MemberContext + + :param sid: + """ + return MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MemberContext: + """ + Constructs a MemberContext + + :param sid: + """ + return MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/message.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/message.py new file mode 100644 index 00000000..ad7c05d8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/channel/message.py @@ -0,0 +1,731 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MessageInstance(InstanceResource): + + class OrderType(object): + ASC = "asc" + DESC = "desc" + + """ + :ivar sid: + :ivar account_sid: + :ivar attributes: + :ivar service_sid: + :ivar to: + :ivar channel_sid: + :ivar date_created: + :ivar date_updated: + :ivar was_edited: + :ivar _from: + :ivar body: + :ivar index: + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.attributes: Optional[str] = payload.get("attributes") + self.service_sid: Optional[str] = payload.get("service_sid") + self.to: Optional[str] = payload.get("to") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.was_edited: Optional[bool] = payload.get("was_edited") + self._from: Optional[str] = payload.get("from") + self.body: Optional[str] = payload.get("body") + self.index: Optional[int] = deserialize.integer(payload.get("index")) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[MessageContext] = None + + @property + def _proxy(self) -> "MessageContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MessageContext for this MessageInstance + """ + if self._context is None: + self._context = MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "MessageInstance": + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MessageInstance": + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Update the MessageInstance + + :param body: + :param attributes: + + :returns: The updated MessageInstance + """ + return self._proxy.update( + body=body, + attributes=attributes, + ) + + async def update_async( + self, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Asynchronous coroutine to update the MessageInstance + + :param body: + :param attributes: + + :returns: The updated MessageInstance + """ + return await self._proxy.update_async( + body=body, + attributes=attributes, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessageContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the MessageContext + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Messages/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MessageInstance: + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MessageInstance: + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Update the MessageInstance + + :param body: + :param attributes: + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Body": body, + "Attributes": attributes, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronous coroutine to update the MessageInstance + + :param body: + :param attributes: + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Body": body, + "Attributes": attributes, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessagePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MessageInstance: + """ + Build an instance of MessageInstance + + :param payload: Payload response from the API + """ + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MessageList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the MessageList + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Messages".format( + **self._solution + ) + + def create( + self, + body: str, + from_: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Create the MessageInstance + + :param body: + :param from_: + :param attributes: + + :returns: The created MessageInstance + """ + + data = values.of( + { + "Body": body, + "From": from_, + "Attributes": attributes, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, + body: str, + from_: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronously create the MessageInstance + + :param body: + :param from_: + :param attributes: + + :returns: The created MessageInstance + """ + + data = values.of( + { + "Body": body, + "From": from_, + "Attributes": attributes, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MessageInstance]: + """ + Streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(order=order, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MessageInstance]: + """ + Asynchronously streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(order=order, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + order=order, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Asynchronously lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + order=order, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + async def page_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Asynchronously retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MessagePage: + """ + Retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MessagePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MessagePage: + """ + Asynchronously retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MessagePage(self._version, response, self._solution) + + def get(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: + """ + return MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: + """ + return MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/role.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/role.py new file mode 100644 index 00000000..d5d06280 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/role.py @@ -0,0 +1,645 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RoleInstance(InstanceResource): + + class RoleType(object): + CHANNEL = "channel" + DEPLOYMENT = "deployment" + + """ + :ivar sid: + :ivar account_sid: + :ivar service_sid: + :ivar friendly_name: + :ivar type: + :ivar permissions: + :ivar date_created: + :ivar date_updated: + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["RoleInstance.RoleType"] = payload.get("type") + self.permissions: Optional[List[str]] = payload.get("permissions") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[RoleContext] = None + + @property + def _proxy(self) -> "RoleContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RoleContext for this RoleInstance + """ + if self._context is None: + self._context = RoleContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "RoleInstance": + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "RoleInstance": + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return await self._proxy.fetch_async() + + def update(self, permission: List[str]) -> "RoleInstance": + """ + Update the RoleInstance + + :param permission: + + :returns: The updated RoleInstance + """ + return self._proxy.update( + permission=permission, + ) + + async def update_async(self, permission: List[str]) -> "RoleInstance": + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: + + :returns: The updated RoleInstance + """ + return await self._proxy.update_async( + permission=permission, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RoleContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the RoleContext + + :param version: Version that contains the resource + :param service_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Roles/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> RoleInstance: + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> RoleInstance: + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update(self, permission: List[str]) -> RoleInstance: + """ + Update the RoleInstance + + :param permission: + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async(self, permission: List[str]) -> RoleInstance: + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RolePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RoleInstance: + """ + Build an instance of RoleInstance + + :param payload: Payload response from the API + """ + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RoleList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the RoleList + + :param version: Version that contains the resource + :param service_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Roles".format(**self._solution) + + def create( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Create the RoleInstance + + :param friendly_name: + :param type: + :param permission: + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Asynchronously create the RoleInstance + + :param friendly_name: + :param type: + :param permission: + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RoleInstance]: + """ + Streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RoleInstance]: + """ + Asynchronously streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Asynchronously lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Asynchronously retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> RolePage: + """ + Retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RolePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> RolePage: + """ + Asynchronously retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RolePage(self._version, response, self._solution) + + def get(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: + """ + return RoleContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: + """ + return RoleContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/__init__.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/__init__.py new file mode 100644 index 00000000..5f37f2d3 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/__init__.py @@ -0,0 +1,723 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.ip_messaging.v1.service.user.user_channel import UserChannelList + + +class UserInstance(InstanceResource): + """ + :ivar sid: + :ivar account_sid: + :ivar service_sid: + :ivar attributes: + :ivar friendly_name: + :ivar role_sid: + :ivar identity: + :ivar is_online: + :ivar is_notifiable: + :ivar date_created: + :ivar date_updated: + :ivar joined_channels_count: + :ivar links: + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.attributes: Optional[str] = payload.get("attributes") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.role_sid: Optional[str] = payload.get("role_sid") + self.identity: Optional[str] = payload.get("identity") + self.is_online: Optional[bool] = payload.get("is_online") + self.is_notifiable: Optional[bool] = payload.get("is_notifiable") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.joined_channels_count: Optional[int] = deserialize.integer( + payload.get("joined_channels_count") + ) + self.links: Optional[Dict[str, object]] = payload.get("links") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[UserContext] = None + + @property + def _proxy(self) -> "UserContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserContext for this UserInstance + """ + if self._context is None: + self._context = UserContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UserInstance": + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserInstance": + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Update the UserInstance + + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The updated UserInstance + """ + return self._proxy.update( + role_sid=role_sid, + attributes=attributes, + friendly_name=friendly_name, + ) + + async def update_async( + self, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Asynchronous coroutine to update the UserInstance + + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The updated UserInstance + """ + return await self._proxy.update_async( + role_sid=role_sid, + attributes=attributes, + friendly_name=friendly_name, + ) + + @property + def user_channels(self) -> UserChannelList: + """ + Access the user_channels + """ + return self._proxy.user_channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the UserContext + + :param version: Version that contains the resource + :param service_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Users/{sid}".format(**self._solution) + + self._user_channels: Optional[UserChannelList] = None + + def delete(self) -> bool: + """ + Deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserInstance: + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> UserInstance: + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Update the UserInstance + + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The updated UserInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronous coroutine to update the UserInstance + + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The updated UserInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + @property + def user_channels(self) -> UserChannelList: + """ + Access the user_channels + """ + if self._user_channels is None: + self._user_channels = UserChannelList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._user_channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserInstance: + """ + Build an instance of UserInstance + + :param payload: Payload response from the API + """ + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the UserList + + :param version: Version that contains the resource + :param service_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Users".format(**self._solution) + + def create( + self, + identity: str, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Create the UserInstance + + :param identity: + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + identity: str, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronously create the UserInstance + + :param identity: + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserInstance]: + """ + Streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserInstance]: + """ + Asynchronously streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Asynchronously lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Asynchronously retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserPage: + """ + Retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserPage: + """ + Asynchronously retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserPage(self._version, response, self._solution) + + def get(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: + """ + return UserContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: + """ + return UserContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..154ecf7d87c7bb3c76b0029419ba4dac191fcc0f GIT binary patch literal 27234 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/user_channel.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/user_channel.py new file mode 100644 index 00000000..42454498 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v1/service/user/user_channel.py @@ -0,0 +1,322 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class UserChannelInstance(InstanceResource): + + class ChannelStatus(object): + JOINED = "joined" + INVITED = "invited" + NOT_PARTICIPATING = "not_participating" + + """ + :ivar account_sid: + :ivar service_sid: + :ivar channel_sid: + :ivar member_sid: + :ivar status: + :ivar last_consumed_message_index: + :ivar unread_messages_count: + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], service_sid: str, user_sid: str + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.member_sid: Optional[str] = payload.get("member_sid") + self.status: Optional["UserChannelInstance.ChannelStatus"] = payload.get( + "status" + ) + self.last_consumed_message_index: Optional[int] = deserialize.integer( + payload.get("last_consumed_message_index") + ) + self.unread_messages_count: Optional[int] = deserialize.integer( + payload.get("unread_messages_count") + ) + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserChannelInstance: + """ + Build an instance of UserChannelInstance + + :param payload: Payload response from the API + """ + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserChannelList(ListResource): + + def __init__(self, version: Version, service_sid: str, user_sid: str): + """ + Initialize the UserChannelList + + :param version: Version that contains the resource + :param service_sid: + :param user_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + } + self._uri = "/Services/{service_sid}/Users/{user_sid}/Channels".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserChannelInstance]: + """ + Streams UserChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserChannelInstance]: + """ + Asynchronously streams UserChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserChannelInstance]: + """ + Lists UserChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserChannelInstance]: + """ + Asynchronously lists UserChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserChannelPage: + """ + Retrieve a single page of UserChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserChannelPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserChannelPage: + """ + Asynchronously retrieve a single page of UserChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserChannelPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserChannelPage: + """ + Retrieve a specific page of UserChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserChannelPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserChannelPage: + """ + Asynchronously retrieve a specific page of UserChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserChannelPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/__init__.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/__init__.py new file mode 100644 index 00000000..6003c86b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.ip_messaging.v2.credential import CredentialList +from twilio.rest.ip_messaging.v2.service import ServiceList + + +class V2(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V2 version of IpMessaging + + :param domain: The Twilio.ip_messaging domain + """ + super().__init__(domain, "v2") + self._credentials: Optional[CredentialList] = None + self._services: Optional[ServiceList] = None + + @property + def credentials(self) -> CredentialList: + if self._credentials is None: + self._credentials = CredentialList(self) + return self._credentials + + @property + def services(self) -> ServiceList: + if self._services is None: + self._services = ServiceList(self) + return self._services + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69a4b37cdc9730ae1700552dcff569fe9210cfc8 GIT binary patch literal 2438 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/credential.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/credential.py new file mode 100644 index 00000000..065c5048 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/credential.py @@ -0,0 +1,711 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CredentialInstance(InstanceResource): + + class PushService(object): + GCM = "gcm" + APN = "apn" + FCM = "fcm" + + """ + :ivar sid: + :ivar account_sid: + :ivar friendly_name: + :ivar type: + :ivar sandbox: + :ivar date_created: + :ivar date_updated: + :ivar url: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["CredentialInstance.PushService"] = payload.get("type") + self.sandbox: Optional[str] = payload.get("sandbox") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[CredentialContext] = None + + @property + def _proxy(self) -> "CredentialContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CredentialContext for this CredentialInstance + """ + if self._context is None: + self._context = CredentialContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CredentialInstance": + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CredentialInstance": + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Update the CredentialInstance + + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The updated CredentialInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Asynchronous coroutine to update the CredentialInstance + + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The updated CredentialInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the CredentialContext + + :param version: Version that contains the resource + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Credentials/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CredentialInstance: + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CredentialInstance: + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Update the CredentialInstance + + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronous coroutine to update the CredentialInstance + + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CredentialInstance: + """ + Build an instance of CredentialInstance + + :param payload: Payload response from the API + """ + return CredentialInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CredentialList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CredentialList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Credentials" + + def create( + self, + type: "CredentialInstance.PushService", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Create the CredentialInstance + + :param type: + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + async def create_async( + self, + type: "CredentialInstance.PushService", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronously create the CredentialInstance + + :param type: + :param friendly_name: + :param certificate: + :param private_key: + :param sandbox: + :param api_key: + :param secret: + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CredentialInstance]: + """ + Streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CredentialInstance]: + """ + Asynchronously streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Asynchronously lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Asynchronously retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + def get_page(self, target_url: str) -> CredentialPage: + """ + Retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CredentialPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CredentialPage: + """ + Asynchronously retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CredentialPage(self._version, response) + + def get(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: + """ + return CredentialContext(self._version, sid=sid) + + def __call__(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: + """ + return CredentialContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__init__.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__init__.py new file mode 100644 index 00000000..a303f10f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__init__.py @@ -0,0 +1,1128 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.ip_messaging.v2.service.binding import BindingList +from twilio.rest.ip_messaging.v2.service.channel import ChannelList +from twilio.rest.ip_messaging.v2.service.role import RoleList +from twilio.rest.ip_messaging.v2.service.user import UserList + + +class ServiceInstance(InstanceResource): + """ + :ivar sid: + :ivar account_sid: + :ivar friendly_name: + :ivar date_created: + :ivar date_updated: + :ivar default_service_role_sid: + :ivar default_channel_role_sid: + :ivar default_channel_creator_role_sid: + :ivar read_status_enabled: + :ivar reachability_enabled: + :ivar typing_indicator_timeout: + :ivar consumption_report_interval: + :ivar limits: + :ivar pre_webhook_url: + :ivar post_webhook_url: + :ivar webhook_method: + :ivar webhook_filters: + :ivar pre_webhook_retry_count: + :ivar post_webhook_retry_count: + :ivar notifications: + :ivar media: + :ivar url: + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.default_service_role_sid: Optional[str] = payload.get( + "default_service_role_sid" + ) + self.default_channel_role_sid: Optional[str] = payload.get( + "default_channel_role_sid" + ) + self.default_channel_creator_role_sid: Optional[str] = payload.get( + "default_channel_creator_role_sid" + ) + self.read_status_enabled: Optional[bool] = payload.get("read_status_enabled") + self.reachability_enabled: Optional[bool] = payload.get("reachability_enabled") + self.typing_indicator_timeout: Optional[int] = deserialize.integer( + payload.get("typing_indicator_timeout") + ) + self.consumption_report_interval: Optional[int] = deserialize.integer( + payload.get("consumption_report_interval") + ) + self.limits: Optional[Dict[str, object]] = payload.get("limits") + self.pre_webhook_url: Optional[str] = payload.get("pre_webhook_url") + self.post_webhook_url: Optional[str] = payload.get("post_webhook_url") + self.webhook_method: Optional[str] = payload.get("webhook_method") + self.webhook_filters: Optional[List[str]] = payload.get("webhook_filters") + self.pre_webhook_retry_count: Optional[int] = deserialize.integer( + payload.get("pre_webhook_retry_count") + ) + self.post_webhook_retry_count: Optional[int] = deserialize.integer( + payload.get("post_webhook_retry_count") + ) + self.notifications: Optional[Dict[str, object]] = payload.get("notifications") + self.media: Optional[Dict[str, object]] = payload.get("media") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ServiceContext] = None + + @property + def _proxy(self) -> "ServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ServiceContext for this ServiceInstance + """ + if self._context is None: + self._context = ServiceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ServiceInstance": + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ServiceInstance": + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_new_message_sound: Union[str, object] = values.unset, + notifications_new_message_badge_count_enabled: Union[ + bool, object + ] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_added_to_channel_sound: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_sound: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_sound: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + media_compatibility_message: Union[str, object] = values.unset, + pre_webhook_retry_count: Union[int, object] = values.unset, + post_webhook_retry_count: Union[int, object] = values.unset, + notifications_log_enabled: Union[bool, object] = values.unset, + ) -> "ServiceInstance": + """ + Update the ServiceInstance + + :param friendly_name: + :param default_service_role_sid: + :param default_channel_role_sid: + :param default_channel_creator_role_sid: + :param read_status_enabled: + :param reachability_enabled: + :param typing_indicator_timeout: + :param consumption_report_interval: + :param notifications_new_message_enabled: + :param notifications_new_message_template: + :param notifications_new_message_sound: + :param notifications_new_message_badge_count_enabled: + :param notifications_added_to_channel_enabled: + :param notifications_added_to_channel_template: + :param notifications_added_to_channel_sound: + :param notifications_removed_from_channel_enabled: + :param notifications_removed_from_channel_template: + :param notifications_removed_from_channel_sound: + :param notifications_invited_to_channel_enabled: + :param notifications_invited_to_channel_template: + :param notifications_invited_to_channel_sound: + :param pre_webhook_url: + :param post_webhook_url: + :param webhook_method: + :param webhook_filters: + :param limits_channel_members: + :param limits_user_channels: + :param media_compatibility_message: + :param pre_webhook_retry_count: + :param post_webhook_retry_count: + :param notifications_log_enabled: + + :returns: The updated ServiceInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + default_service_role_sid=default_service_role_sid, + default_channel_role_sid=default_channel_role_sid, + default_channel_creator_role_sid=default_channel_creator_role_sid, + read_status_enabled=read_status_enabled, + reachability_enabled=reachability_enabled, + typing_indicator_timeout=typing_indicator_timeout, + consumption_report_interval=consumption_report_interval, + notifications_new_message_enabled=notifications_new_message_enabled, + notifications_new_message_template=notifications_new_message_template, + notifications_new_message_sound=notifications_new_message_sound, + notifications_new_message_badge_count_enabled=notifications_new_message_badge_count_enabled, + notifications_added_to_channel_enabled=notifications_added_to_channel_enabled, + notifications_added_to_channel_template=notifications_added_to_channel_template, + notifications_added_to_channel_sound=notifications_added_to_channel_sound, + notifications_removed_from_channel_enabled=notifications_removed_from_channel_enabled, + notifications_removed_from_channel_template=notifications_removed_from_channel_template, + notifications_removed_from_channel_sound=notifications_removed_from_channel_sound, + notifications_invited_to_channel_enabled=notifications_invited_to_channel_enabled, + notifications_invited_to_channel_template=notifications_invited_to_channel_template, + notifications_invited_to_channel_sound=notifications_invited_to_channel_sound, + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + webhook_method=webhook_method, + webhook_filters=webhook_filters, + limits_channel_members=limits_channel_members, + limits_user_channels=limits_user_channels, + media_compatibility_message=media_compatibility_message, + pre_webhook_retry_count=pre_webhook_retry_count, + post_webhook_retry_count=post_webhook_retry_count, + notifications_log_enabled=notifications_log_enabled, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_new_message_sound: Union[str, object] = values.unset, + notifications_new_message_badge_count_enabled: Union[ + bool, object + ] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_added_to_channel_sound: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_sound: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_sound: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + media_compatibility_message: Union[str, object] = values.unset, + pre_webhook_retry_count: Union[int, object] = values.unset, + post_webhook_retry_count: Union[int, object] = values.unset, + notifications_log_enabled: Union[bool, object] = values.unset, + ) -> "ServiceInstance": + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: + :param default_service_role_sid: + :param default_channel_role_sid: + :param default_channel_creator_role_sid: + :param read_status_enabled: + :param reachability_enabled: + :param typing_indicator_timeout: + :param consumption_report_interval: + :param notifications_new_message_enabled: + :param notifications_new_message_template: + :param notifications_new_message_sound: + :param notifications_new_message_badge_count_enabled: + :param notifications_added_to_channel_enabled: + :param notifications_added_to_channel_template: + :param notifications_added_to_channel_sound: + :param notifications_removed_from_channel_enabled: + :param notifications_removed_from_channel_template: + :param notifications_removed_from_channel_sound: + :param notifications_invited_to_channel_enabled: + :param notifications_invited_to_channel_template: + :param notifications_invited_to_channel_sound: + :param pre_webhook_url: + :param post_webhook_url: + :param webhook_method: + :param webhook_filters: + :param limits_channel_members: + :param limits_user_channels: + :param media_compatibility_message: + :param pre_webhook_retry_count: + :param post_webhook_retry_count: + :param notifications_log_enabled: + + :returns: The updated ServiceInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + default_service_role_sid=default_service_role_sid, + default_channel_role_sid=default_channel_role_sid, + default_channel_creator_role_sid=default_channel_creator_role_sid, + read_status_enabled=read_status_enabled, + reachability_enabled=reachability_enabled, + typing_indicator_timeout=typing_indicator_timeout, + consumption_report_interval=consumption_report_interval, + notifications_new_message_enabled=notifications_new_message_enabled, + notifications_new_message_template=notifications_new_message_template, + notifications_new_message_sound=notifications_new_message_sound, + notifications_new_message_badge_count_enabled=notifications_new_message_badge_count_enabled, + notifications_added_to_channel_enabled=notifications_added_to_channel_enabled, + notifications_added_to_channel_template=notifications_added_to_channel_template, + notifications_added_to_channel_sound=notifications_added_to_channel_sound, + notifications_removed_from_channel_enabled=notifications_removed_from_channel_enabled, + notifications_removed_from_channel_template=notifications_removed_from_channel_template, + notifications_removed_from_channel_sound=notifications_removed_from_channel_sound, + notifications_invited_to_channel_enabled=notifications_invited_to_channel_enabled, + notifications_invited_to_channel_template=notifications_invited_to_channel_template, + notifications_invited_to_channel_sound=notifications_invited_to_channel_sound, + pre_webhook_url=pre_webhook_url, + post_webhook_url=post_webhook_url, + webhook_method=webhook_method, + webhook_filters=webhook_filters, + limits_channel_members=limits_channel_members, + limits_user_channels=limits_user_channels, + media_compatibility_message=media_compatibility_message, + pre_webhook_retry_count=pre_webhook_retry_count, + post_webhook_retry_count=post_webhook_retry_count, + notifications_log_enabled=notifications_log_enabled, + ) + + @property + def bindings(self) -> BindingList: + """ + Access the bindings + """ + return self._proxy.bindings + + @property + def channels(self) -> ChannelList: + """ + Access the channels + """ + return self._proxy.channels + + @property + def roles(self) -> RoleList: + """ + Access the roles + """ + return self._proxy.roles + + @property + def users(self) -> UserList: + """ + Access the users + """ + return self._proxy.users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServiceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ServiceContext + + :param version: Version that contains the resource + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Services/{sid}".format(**self._solution) + + self._bindings: Optional[BindingList] = None + self._channels: Optional[ChannelList] = None + self._roles: Optional[RoleList] = None + self._users: Optional[UserList] = None + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ServiceInstance: + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ServiceInstance: + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_new_message_sound: Union[str, object] = values.unset, + notifications_new_message_badge_count_enabled: Union[ + bool, object + ] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_added_to_channel_sound: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_sound: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_sound: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + media_compatibility_message: Union[str, object] = values.unset, + pre_webhook_retry_count: Union[int, object] = values.unset, + post_webhook_retry_count: Union[int, object] = values.unset, + notifications_log_enabled: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Update the ServiceInstance + + :param friendly_name: + :param default_service_role_sid: + :param default_channel_role_sid: + :param default_channel_creator_role_sid: + :param read_status_enabled: + :param reachability_enabled: + :param typing_indicator_timeout: + :param consumption_report_interval: + :param notifications_new_message_enabled: + :param notifications_new_message_template: + :param notifications_new_message_sound: + :param notifications_new_message_badge_count_enabled: + :param notifications_added_to_channel_enabled: + :param notifications_added_to_channel_template: + :param notifications_added_to_channel_sound: + :param notifications_removed_from_channel_enabled: + :param notifications_removed_from_channel_template: + :param notifications_removed_from_channel_sound: + :param notifications_invited_to_channel_enabled: + :param notifications_invited_to_channel_template: + :param notifications_invited_to_channel_sound: + :param pre_webhook_url: + :param post_webhook_url: + :param webhook_method: + :param webhook_filters: + :param limits_channel_members: + :param limits_user_channels: + :param media_compatibility_message: + :param pre_webhook_retry_count: + :param post_webhook_retry_count: + :param notifications_log_enabled: + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DefaultServiceRoleSid": default_service_role_sid, + "DefaultChannelRoleSid": default_channel_role_sid, + "DefaultChannelCreatorRoleSid": default_channel_creator_role_sid, + "ReadStatusEnabled": serialize.boolean_to_string(read_status_enabled), + "ReachabilityEnabled": serialize.boolean_to_string( + reachability_enabled + ), + "TypingIndicatorTimeout": typing_indicator_timeout, + "ConsumptionReportInterval": consumption_report_interval, + "Notifications.NewMessage.Enabled": serialize.boolean_to_string( + notifications_new_message_enabled + ), + "Notifications.NewMessage.Template": notifications_new_message_template, + "Notifications.NewMessage.Sound": notifications_new_message_sound, + "Notifications.NewMessage.BadgeCountEnabled": serialize.boolean_to_string( + notifications_new_message_badge_count_enabled + ), + "Notifications.AddedToChannel.Enabled": serialize.boolean_to_string( + notifications_added_to_channel_enabled + ), + "Notifications.AddedToChannel.Template": notifications_added_to_channel_template, + "Notifications.AddedToChannel.Sound": notifications_added_to_channel_sound, + "Notifications.RemovedFromChannel.Enabled": serialize.boolean_to_string( + notifications_removed_from_channel_enabled + ), + "Notifications.RemovedFromChannel.Template": notifications_removed_from_channel_template, + "Notifications.RemovedFromChannel.Sound": notifications_removed_from_channel_sound, + "Notifications.InvitedToChannel.Enabled": serialize.boolean_to_string( + notifications_invited_to_channel_enabled + ), + "Notifications.InvitedToChannel.Template": notifications_invited_to_channel_template, + "Notifications.InvitedToChannel.Sound": notifications_invited_to_channel_sound, + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "WebhookMethod": webhook_method, + "WebhookFilters": serialize.map(webhook_filters, lambda e: e), + "Limits.ChannelMembers": limits_channel_members, + "Limits.UserChannels": limits_user_channels, + "Media.CompatibilityMessage": media_compatibility_message, + "PreWebhookRetryCount": pre_webhook_retry_count, + "PostWebhookRetryCount": post_webhook_retry_count, + "Notifications.LogEnabled": serialize.boolean_to_string( + notifications_log_enabled + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + default_service_role_sid: Union[str, object] = values.unset, + default_channel_role_sid: Union[str, object] = values.unset, + default_channel_creator_role_sid: Union[str, object] = values.unset, + read_status_enabled: Union[bool, object] = values.unset, + reachability_enabled: Union[bool, object] = values.unset, + typing_indicator_timeout: Union[int, object] = values.unset, + consumption_report_interval: Union[int, object] = values.unset, + notifications_new_message_enabled: Union[bool, object] = values.unset, + notifications_new_message_template: Union[str, object] = values.unset, + notifications_new_message_sound: Union[str, object] = values.unset, + notifications_new_message_badge_count_enabled: Union[ + bool, object + ] = values.unset, + notifications_added_to_channel_enabled: Union[bool, object] = values.unset, + notifications_added_to_channel_template: Union[str, object] = values.unset, + notifications_added_to_channel_sound: Union[str, object] = values.unset, + notifications_removed_from_channel_enabled: Union[bool, object] = values.unset, + notifications_removed_from_channel_template: Union[str, object] = values.unset, + notifications_removed_from_channel_sound: Union[str, object] = values.unset, + notifications_invited_to_channel_enabled: Union[bool, object] = values.unset, + notifications_invited_to_channel_template: Union[str, object] = values.unset, + notifications_invited_to_channel_sound: Union[str, object] = values.unset, + pre_webhook_url: Union[str, object] = values.unset, + post_webhook_url: Union[str, object] = values.unset, + webhook_method: Union[str, object] = values.unset, + webhook_filters: Union[List[str], object] = values.unset, + limits_channel_members: Union[int, object] = values.unset, + limits_user_channels: Union[int, object] = values.unset, + media_compatibility_message: Union[str, object] = values.unset, + pre_webhook_retry_count: Union[int, object] = values.unset, + post_webhook_retry_count: Union[int, object] = values.unset, + notifications_log_enabled: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: + :param default_service_role_sid: + :param default_channel_role_sid: + :param default_channel_creator_role_sid: + :param read_status_enabled: + :param reachability_enabled: + :param typing_indicator_timeout: + :param consumption_report_interval: + :param notifications_new_message_enabled: + :param notifications_new_message_template: + :param notifications_new_message_sound: + :param notifications_new_message_badge_count_enabled: + :param notifications_added_to_channel_enabled: + :param notifications_added_to_channel_template: + :param notifications_added_to_channel_sound: + :param notifications_removed_from_channel_enabled: + :param notifications_removed_from_channel_template: + :param notifications_removed_from_channel_sound: + :param notifications_invited_to_channel_enabled: + :param notifications_invited_to_channel_template: + :param notifications_invited_to_channel_sound: + :param pre_webhook_url: + :param post_webhook_url: + :param webhook_method: + :param webhook_filters: + :param limits_channel_members: + :param limits_user_channels: + :param media_compatibility_message: + :param pre_webhook_retry_count: + :param post_webhook_retry_count: + :param notifications_log_enabled: + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "DefaultServiceRoleSid": default_service_role_sid, + "DefaultChannelRoleSid": default_channel_role_sid, + "DefaultChannelCreatorRoleSid": default_channel_creator_role_sid, + "ReadStatusEnabled": serialize.boolean_to_string(read_status_enabled), + "ReachabilityEnabled": serialize.boolean_to_string( + reachability_enabled + ), + "TypingIndicatorTimeout": typing_indicator_timeout, + "ConsumptionReportInterval": consumption_report_interval, + "Notifications.NewMessage.Enabled": serialize.boolean_to_string( + notifications_new_message_enabled + ), + "Notifications.NewMessage.Template": notifications_new_message_template, + "Notifications.NewMessage.Sound": notifications_new_message_sound, + "Notifications.NewMessage.BadgeCountEnabled": serialize.boolean_to_string( + notifications_new_message_badge_count_enabled + ), + "Notifications.AddedToChannel.Enabled": serialize.boolean_to_string( + notifications_added_to_channel_enabled + ), + "Notifications.AddedToChannel.Template": notifications_added_to_channel_template, + "Notifications.AddedToChannel.Sound": notifications_added_to_channel_sound, + "Notifications.RemovedFromChannel.Enabled": serialize.boolean_to_string( + notifications_removed_from_channel_enabled + ), + "Notifications.RemovedFromChannel.Template": notifications_removed_from_channel_template, + "Notifications.RemovedFromChannel.Sound": notifications_removed_from_channel_sound, + "Notifications.InvitedToChannel.Enabled": serialize.boolean_to_string( + notifications_invited_to_channel_enabled + ), + "Notifications.InvitedToChannel.Template": notifications_invited_to_channel_template, + "Notifications.InvitedToChannel.Sound": notifications_invited_to_channel_sound, + "PreWebhookUrl": pre_webhook_url, + "PostWebhookUrl": post_webhook_url, + "WebhookMethod": webhook_method, + "WebhookFilters": serialize.map(webhook_filters, lambda e: e), + "Limits.ChannelMembers": limits_channel_members, + "Limits.UserChannels": limits_user_channels, + "Media.CompatibilityMessage": media_compatibility_message, + "PreWebhookRetryCount": pre_webhook_retry_count, + "PostWebhookRetryCount": post_webhook_retry_count, + "Notifications.LogEnabled": serialize.boolean_to_string( + notifications_log_enabled + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def bindings(self) -> BindingList: + """ + Access the bindings + """ + if self._bindings is None: + self._bindings = BindingList( + self._version, + self._solution["sid"], + ) + return self._bindings + + @property + def channels(self) -> ChannelList: + """ + Access the channels + """ + if self._channels is None: + self._channels = ChannelList( + self._version, + self._solution["sid"], + ) + return self._channels + + @property + def roles(self) -> RoleList: + """ + Access the roles + """ + if self._roles is None: + self._roles = RoleList( + self._version, + self._solution["sid"], + ) + return self._roles + + @property + def users(self) -> UserList: + """ + Access the users + """ + if self._users is None: + self._users = UserList( + self._version, + self._solution["sid"], + ) + return self._users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ServiceInstance: + """ + Build an instance of ServiceInstance + + :param payload: Payload response from the API + """ + return ServiceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services" + + def create(self, friendly_name: str) -> ServiceInstance: + """ + Create the ServiceInstance + + :param friendly_name: + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + async def create_async(self, friendly_name: str) -> ServiceInstance: + """ + Asynchronously create the ServiceInstance + + :param friendly_name: + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ServiceInstance]: + """ + Streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ServiceInstance]: + """ + Asynchronously streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Asynchronously lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Asynchronously retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + def get_page(self, target_url: str) -> ServicePage: + """ + Retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ServicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ServicePage: + """ + Asynchronously retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ServicePage(self._version, response) + + def get(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: + """ + return ServiceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: + """ + return ServiceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4581e14f756f516b5e863527376e7d7228067006 GIT binary patch literal 44564 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__pycache__/binding.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/__pycache__/binding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..434ea0a91742b06fe75ebc717f1bfd0c475cc486 GIT binary patch literal 23158 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 "BindingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: BindingContext for this BindingInstance + """ + if self._context is None: + self._context = BindingContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "BindingInstance": + """ + Fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "BindingInstance": + """ + Asynchronous coroutine to fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BindingContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the BindingContext + + :param version: Version that contains the resource + :param service_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Bindings/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> BindingInstance: + """ + Fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return BindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> BindingInstance: + """ + Asynchronous coroutine to fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return BindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BindingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> BindingInstance: + """ + Build an instance of BindingInstance + + :param payload: Payload response from the API + """ + return BindingInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class BindingList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the BindingList + + :param version: Version that contains the resource + :param service_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Bindings".format(**self._solution) + + def stream( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[BindingInstance]: + """ + Streams BindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["BindingInstance.BindingType"] binding_type: + :param List[str] identity: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + binding_type=binding_type, identity=identity, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[BindingInstance]: + """ + Asynchronously streams BindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["BindingInstance.BindingType"] binding_type: + :param List[str] identity: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + binding_type=binding_type, identity=identity, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BindingInstance]: + """ + Lists BindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["BindingInstance.BindingType"] binding_type: + :param List[str] identity: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + binding_type=binding_type, + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BindingInstance]: + """ + Asynchronously lists BindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["BindingInstance.BindingType"] binding_type: + :param List[str] identity: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + binding_type=binding_type, + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BindingPage: + """ + Retrieve a single page of BindingInstance records from the API. + Request is executed immediately + + :param binding_type: + :param identity: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BindingInstance + """ + data = values.of( + { + "BindingType": serialize.map(binding_type, lambda e: e), + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BindingPage(self._version, response, self._solution) + + async def page_async( + self, + binding_type: Union[List["BindingInstance.BindingType"], object] = values.unset, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BindingPage: + """ + Asynchronously retrieve a single page of BindingInstance records from the API. + Request is executed immediately + + :param binding_type: + :param identity: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BindingInstance + """ + data = values.of( + { + "BindingType": serialize.map(binding_type, lambda e: e), + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BindingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> BindingPage: + """ + Retrieve a specific page of BindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BindingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return BindingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> BindingPage: + """ + Asynchronously retrieve a specific page of BindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BindingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return BindingPage(self._version, response, self._solution) + + def get(self, sid: str) -> BindingContext: + """ + Constructs a BindingContext + + :param sid: + """ + return BindingContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> BindingContext: + """ + Constructs a BindingContext + + :param sid: + """ + return BindingContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__init__.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__init__.py new file mode 100644 index 00000000..8220a4be --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__init__.py @@ -0,0 +1,962 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.ip_messaging.v2.service.channel.invite import InviteList +from twilio.rest.ip_messaging.v2.service.channel.member import MemberList +from twilio.rest.ip_messaging.v2.service.channel.message import MessageList +from twilio.rest.ip_messaging.v2.service.channel.webhook import WebhookList + + +class ChannelInstance(InstanceResource): + + class ChannelType(object): + PUBLIC = "public" + PRIVATE = "private" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: + :ivar account_sid: + :ivar service_sid: + :ivar friendly_name: + :ivar unique_name: + :ivar attributes: + :ivar type: + :ivar date_created: + :ivar date_updated: + :ivar created_by: + :ivar members_count: + :ivar messages_count: + :ivar url: + :ivar links: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.unique_name: Optional[str] = payload.get("unique_name") + self.attributes: Optional[str] = payload.get("attributes") + self.type: Optional["ChannelInstance.ChannelType"] = payload.get("type") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.created_by: Optional[str] = payload.get("created_by") + self.members_count: Optional[int] = deserialize.integer( + payload.get("members_count") + ) + self.messages_count: Optional[int] = deserialize.integer( + payload.get("messages_count") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[ChannelContext] = None + + @property + def _proxy(self) -> "ChannelContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ChannelContext for this ChannelInstance + """ + if self._context is None: + self._context = ChannelContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "ChannelInstance": + """ + Fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ChannelInstance": + """ + Asynchronous coroutine to fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> "ChannelInstance": + """ + Update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: + :param unique_name: + :param attributes: + :param date_created: + :param date_updated: + :param created_by: + + :returns: The updated ChannelInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + unique_name=unique_name, + attributes=attributes, + date_created=date_created, + date_updated=date_updated, + created_by=created_by, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> "ChannelInstance": + """ + Asynchronous coroutine to update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: + :param unique_name: + :param attributes: + :param date_created: + :param date_updated: + :param created_by: + + :returns: The updated ChannelInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + friendly_name=friendly_name, + unique_name=unique_name, + attributes=attributes, + date_created=date_created, + date_updated=date_updated, + created_by=created_by, + ) + + @property + def invites(self) -> InviteList: + """ + Access the invites + """ + return self._proxy.invites + + @property + def members(self) -> MemberList: + """ + Access the members + """ + return self._proxy.members + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + return self._proxy.messages + + @property + def webhooks(self) -> WebhookList: + """ + Access the webhooks + """ + return self._proxy.webhooks + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the ChannelContext + + :param version: Version that contains the resource + :param service_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Channels/{sid}".format(**self._solution) + + self._invites: Optional[InviteList] = None + self._members: Optional[MemberList] = None + self._messages: Optional[MessageList] = None + self._webhooks: Optional[WebhookList] = None + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ChannelInstance: + """ + Fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ChannelInstance: + """ + Asynchronous coroutine to fetch the ChannelInstance + + + :returns: The fetched ChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: + :param unique_name: + :param attributes: + :param date_created: + :param date_updated: + :param created_by: + + :returns: The updated ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "CreatedBy": created_by, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Asynchronous coroutine to update the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: + :param unique_name: + :param attributes: + :param date_created: + :param date_updated: + :param created_by: + + :returns: The updated ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "CreatedBy": created_by, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + @property + def invites(self) -> InviteList: + """ + Access the invites + """ + if self._invites is None: + self._invites = InviteList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._invites + + @property + def members(self) -> MemberList: + """ + Access the members + """ + if self._members is None: + self._members = MemberList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._members + + @property + def messages(self) -> MessageList: + """ + Access the messages + """ + if self._messages is None: + self._messages = MessageList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._messages + + @property + def webhooks(self) -> WebhookList: + """ + Access the webhooks + """ + if self._webhooks is None: + self._webhooks = WebhookList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._webhooks + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ChannelInstance: + """ + Build an instance of ChannelInstance + + :param payload: Payload response from the API + """ + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ChannelList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the ChannelList + + :param version: Version that contains the resource + :param service_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Channels".format(**self._solution) + + def create( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Create the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: + :param unique_name: + :param attributes: + :param type: + :param date_created: + :param date_updated: + :param created_by: + + :returns: The created ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "Type": type, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "CreatedBy": created_by, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "ChannelInstance.WebhookEnabledType", object + ] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + type: Union["ChannelInstance.ChannelType", object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + created_by: Union[str, object] = values.unset, + ) -> ChannelInstance: + """ + Asynchronously create the ChannelInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param friendly_name: + :param unique_name: + :param attributes: + :param type: + :param date_created: + :param date_updated: + :param created_by: + + :returns: The created ChannelInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Attributes": attributes, + "Type": type, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "CreatedBy": created_by, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ChannelInstance]: + """ + Streams ChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["ChannelInstance.ChannelType"] type: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(type=type, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ChannelInstance]: + """ + Asynchronously streams ChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["ChannelInstance.ChannelType"] type: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(type=type, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelInstance]: + """ + Lists ChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["ChannelInstance.ChannelType"] type: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + type=type, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelInstance]: + """ + Asynchronously lists ChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["ChannelInstance.ChannelType"] type: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + type=type, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelPage: + """ + Retrieve a single page of ChannelInstance records from the API. + Request is executed immediately + + :param type: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelInstance + """ + data = values.of( + { + "Type": serialize.map(type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelPage(self._version, response, self._solution) + + async def page_async( + self, + type: Union[List["ChannelInstance.ChannelType"], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelPage: + """ + Asynchronously retrieve a single page of ChannelInstance records from the API. + Request is executed immediately + + :param type: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelInstance + """ + data = values.of( + { + "Type": serialize.map(type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ChannelPage: + """ + Retrieve a specific page of ChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ChannelPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ChannelPage: + """ + Asynchronously retrieve a specific page of ChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ChannelPage(self._version, response, self._solution) + + def get(self, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param sid: + """ + return ChannelContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ChannelContext: + """ + Constructs a ChannelContext + + :param sid: + """ + return ChannelContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9afc36f821a52b9a9450278ad8da78cc202ae35d GIT binary patch literal 35273 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/invite.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/invite.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9eed124bb71e24118ede56fb0fee517621d28d89 GIT binary patch literal 24028 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 Dng6w0 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/member.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/member.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70fab23af556c39b90ee4be1c379dc5190605635 GIT binary patch literal 32572 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/message.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/message.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b548b2ba5e1e8f4f91f78bb1e937edbae4a44da GIT binary patch literal 32441 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/webhook.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/__pycache__/webhook.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a7b904fc8ff738ddc69dbcaa295006bd8b096cc GIT binary patch literal 30757 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 "InviteContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InviteContext for this InviteInstance + """ + if self._context is None: + self._context = InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "InviteInstance": + """ + Fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InviteInstance": + """ + Asynchronous coroutine to fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InviteContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the InviteContext + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Invites/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InviteInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> InviteInstance: + """ + Fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InviteInstance: + """ + Asynchronous coroutine to fetch the InviteInstance + + + :returns: The fetched InviteInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InvitePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InviteInstance: + """ + Build an instance of InviteInstance + + :param payload: Payload response from the API + """ + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InviteList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the InviteList + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Invites".format( + **self._solution + ) + + def create( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> InviteInstance: + """ + Create the InviteInstance + + :param identity: + :param role_sid: + + :returns: The created InviteInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, identity: str, role_sid: Union[str, object] = values.unset + ) -> InviteInstance: + """ + Asynchronously create the InviteInstance + + :param identity: + :param role_sid: + + :returns: The created InviteInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InviteInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InviteInstance]: + """ + Streams InviteInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(identity=identity, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InviteInstance]: + """ + Asynchronously streams InviteInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(identity=identity, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InviteInstance]: + """ + Lists InviteInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InviteInstance]: + """ + Asynchronously lists InviteInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InvitePage: + """ + Retrieve a single page of InviteInstance records from the API. + Request is executed immediately + + :param identity: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InviteInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InvitePage(self._version, response, self._solution) + + async def page_async( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InvitePage: + """ + Asynchronously retrieve a single page of InviteInstance records from the API. + Request is executed immediately + + :param identity: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InviteInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InvitePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> InvitePage: + """ + Retrieve a specific page of InviteInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InviteInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InvitePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> InvitePage: + """ + Asynchronously retrieve a specific page of InviteInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InviteInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InvitePage(self._version, response, self._solution) + + def get(self, sid: str) -> InviteContext: + """ + Constructs a InviteContext + + :param sid: + """ + return InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> InviteContext: + """ + Constructs a InviteContext + + :param sid: + """ + return InviteContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/member.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/member.py new file mode 100644 index 00000000..6456d3be --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/member.py @@ -0,0 +1,905 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MemberInstance(InstanceResource): + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: + :ivar account_sid: + :ivar channel_sid: + :ivar service_sid: + :ivar identity: + :ivar date_created: + :ivar date_updated: + :ivar role_sid: + :ivar last_consumed_message_index: + :ivar last_consumption_timestamp: + :ivar url: + :ivar attributes: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.identity: Optional[str] = payload.get("identity") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.role_sid: Optional[str] = payload.get("role_sid") + self.last_consumed_message_index: Optional[int] = deserialize.integer( + payload.get("last_consumed_message_index") + ) + self.last_consumption_timestamp: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("last_consumption_timestamp")) + ) + self.url: Optional[str] = payload.get("url") + self.attributes: Optional[str] = payload.get("attributes") + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[MemberContext] = None + + @property + def _proxy(self) -> "MemberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MemberContext for this MemberInstance + """ + if self._context is None: + self._context = MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "MemberInstance": + """ + Fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MemberInstance": + """ + Asynchronous coroutine to fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "MemberInstance": + """ + Update the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param last_consumed_message_index: + :param last_consumption_timestamp: + :param date_created: + :param date_updated: + :param attributes: + + :returns: The updated MemberInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + role_sid=role_sid, + last_consumed_message_index=last_consumed_message_index, + last_consumption_timestamp=last_consumption_timestamp, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> "MemberInstance": + """ + Asynchronous coroutine to update the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param last_consumed_message_index: + :param last_consumption_timestamp: + :param date_created: + :param date_updated: + :param attributes: + + :returns: The updated MemberInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + role_sid=role_sid, + last_consumed_message_index=last_consumed_message_index, + last_consumption_timestamp=last_consumption_timestamp, + date_created=date_created, + date_updated=date_updated, + attributes=attributes, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MemberContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the MemberContext + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Members/{sid}".format( + **self._solution + ) + ) + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MemberInstance: + """ + Fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MemberInstance: + """ + Asynchronous coroutine to fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MemberInstance: + """ + Update the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param last_consumed_message_index: + :param last_consumption_timestamp: + :param date_created: + :param date_updated: + :param attributes: + + :returns: The updated MemberInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MemberInstance: + """ + Asynchronous coroutine to update the MemberInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param last_consumed_message_index: + :param last_consumption_timestamp: + :param date_created: + :param date_updated: + :param attributes: + + :returns: The updated MemberInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MemberPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MemberInstance: + """ + Build an instance of MemberInstance + + :param payload: Payload response from the API + """ + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MemberList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the MemberList + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Members".format( + **self._solution + ) + + def create( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MemberInstance: + """ + Create the MemberInstance + + :param identity: + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param last_consumed_message_index: + :param last_consumption_timestamp: + :param date_created: + :param date_updated: + :param attributes: + + :returns: The created MemberInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "MemberInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + attributes: Union[str, object] = values.unset, + ) -> MemberInstance: + """ + Asynchronously create the MemberInstance + + :param identity: + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param last_consumed_message_index: + :param last_consumption_timestamp: + :param date_created: + :param date_updated: + :param attributes: + + :returns: The created MemberInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "Attributes": attributes, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MemberInstance]: + """ + Streams MemberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(identity=identity, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MemberInstance]: + """ + Asynchronously streams MemberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(identity=identity, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MemberInstance]: + """ + Lists MemberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MemberInstance]: + """ + Asynchronously lists MemberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List[str] identity: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MemberPage: + """ + Retrieve a single page of MemberInstance records from the API. + Request is executed immediately + + :param identity: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MemberInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MemberPage(self._version, response, self._solution) + + async def page_async( + self, + identity: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MemberPage: + """ + Asynchronously retrieve a single page of MemberInstance records from the API. + Request is executed immediately + + :param identity: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MemberInstance + """ + data = values.of( + { + "Identity": serialize.map(identity, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MemberPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MemberPage: + """ + Retrieve a specific page of MemberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MemberInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MemberPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MemberPage: + """ + Asynchronously retrieve a specific page of MemberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MemberInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MemberPage(self._version, response, self._solution) + + def get(self, sid: str) -> MemberContext: + """ + Constructs a MemberContext + + :param sid: + """ + return MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MemberContext: + """ + Constructs a MemberContext + + :param sid: + """ + return MemberContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/message.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/message.py new file mode 100644 index 00000000..838b3c72 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/message.py @@ -0,0 +1,905 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MessageInstance(InstanceResource): + + class OrderType(object): + ASC = "asc" + DESC = "desc" + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: + :ivar account_sid: + :ivar attributes: + :ivar service_sid: + :ivar to: + :ivar channel_sid: + :ivar date_created: + :ivar date_updated: + :ivar last_updated_by: + :ivar was_edited: + :ivar _from: + :ivar body: + :ivar index: + :ivar type: + :ivar media: + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.attributes: Optional[str] = payload.get("attributes") + self.service_sid: Optional[str] = payload.get("service_sid") + self.to: Optional[str] = payload.get("to") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.last_updated_by: Optional[str] = payload.get("last_updated_by") + self.was_edited: Optional[bool] = payload.get("was_edited") + self._from: Optional[str] = payload.get("from") + self.body: Optional[str] = payload.get("body") + self.index: Optional[int] = deserialize.integer(payload.get("index")) + self.type: Optional[str] = payload.get("type") + self.media: Optional[Dict[str, object]] = payload.get("media") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[MessageContext] = None + + @property + def _proxy(self) -> "MessageContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MessageContext for this MessageInstance + """ + if self._context is None: + self._context = MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + ) + + def fetch(self) -> "MessageInstance": + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MessageInstance": + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param body: + :param attributes: + :param date_created: + :param date_updated: + :param last_updated_by: + :param from_: + + :returns: The updated MessageInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + body=body, + attributes=attributes, + date_created=date_created, + date_updated=date_updated, + last_updated_by=last_updated_by, + from_=from_, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + ) -> "MessageInstance": + """ + Asynchronous coroutine to update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param body: + :param attributes: + :param date_created: + :param date_updated: + :param last_updated_by: + :param from_: + + :returns: The updated MessageInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + body=body, + attributes=attributes, + date_created=date_created, + date_updated=date_updated, + last_updated_by=last_updated_by, + from_=from_, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessageContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the MessageContext + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Messages/{sid}".format( + **self._solution + ) + ) + + def delete( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + ) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + + :returns: True if delete succeeds, False otherwise + """ + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + } + ) + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MessageInstance: + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MessageInstance: + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param body: + :param attributes: + :param date_created: + :param date_updated: + :param last_updated_by: + :param from_: + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Body": body, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "LastUpdatedBy": last_updated_by, + "From": from_, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + body: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronous coroutine to update the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param body: + :param attributes: + :param date_created: + :param date_updated: + :param last_updated_by: + :param from_: + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Body": body, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "LastUpdatedBy": last_updated_by, + "From": from_, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessagePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MessageInstance: + """ + Build an instance of MessageInstance + + :param payload: Payload response from the API + """ + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MessageList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the MessageList + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Messages".format( + **self._solution + ) + + def create( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + from_: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + media_sid: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Create the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param from_: + :param attributes: + :param date_created: + :param date_updated: + :param last_updated_by: + :param body: + :param media_sid: + + :returns: The created MessageInstance + """ + + data = values.of( + { + "From": from_, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "LastUpdatedBy": last_updated_by, + "Body": body, + "MediaSid": media_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, + x_twilio_webhook_enabled: Union[ + "MessageInstance.WebhookEnabledType", object + ] = values.unset, + from_: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + date_created: Union[datetime, object] = values.unset, + date_updated: Union[datetime, object] = values.unset, + last_updated_by: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + media_sid: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronously create the MessageInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param from_: + :param attributes: + :param date_created: + :param date_updated: + :param last_updated_by: + :param body: + :param media_sid: + + :returns: The created MessageInstance + """ + + data = values.of( + { + "From": from_, + "Attributes": attributes, + "DateCreated": serialize.iso8601_datetime(date_created), + "DateUpdated": serialize.iso8601_datetime(date_updated), + "LastUpdatedBy": last_updated_by, + "Body": body, + "MediaSid": media_sid, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MessageInstance]: + """ + Streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(order=order, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MessageInstance]: + """ + Asynchronously streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "MessageInstance.OrderType" order: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(order=order, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + order=order, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Asynchronously lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "MessageInstance.OrderType" order: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + order=order, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + async def page_async( + self, + order: Union["MessageInstance.OrderType", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Asynchronously retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param order: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "Order": order, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MessagePage: + """ + Retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MessagePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MessagePage: + """ + Asynchronously retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MessagePage(self._version, response, self._solution) + + def get(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: + """ + return MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: + """ + return MessageContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/webhook.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/webhook.py new file mode 100644 index 00000000..3c7570fd --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/channel/webhook.py @@ -0,0 +1,800 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class WebhookInstance(InstanceResource): + + class Method(object): + GET = "GET" + POST = "POST" + + class Type(object): + WEBHOOK = "webhook" + TRIGGER = "trigger" + STUDIO = "studio" + + """ + :ivar sid: + :ivar account_sid: + :ivar service_sid: + :ivar channel_sid: + :ivar type: + :ivar url: + :ivar configuration: + :ivar date_created: + :ivar date_updated: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + channel_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.type: Optional[str] = payload.get("type") + self.url: Optional[str] = payload.get("url") + self.configuration: Optional[Dict[str, object]] = payload.get("configuration") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid or self.sid, + } + self._context: Optional[WebhookContext] = None + + @property + def _proxy(self) -> "WebhookContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: WebhookContext for this WebhookInstance + """ + if self._context is None: + self._context = WebhookContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "WebhookInstance": + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "WebhookInstance": + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> "WebhookInstance": + """ + Update the WebhookInstance + + :param configuration_url: + :param configuration_method: + :param configuration_filters: + :param configuration_triggers: + :param configuration_flow_sid: + :param configuration_retry_count: + + :returns: The updated WebhookInstance + """ + return self._proxy.update( + configuration_url=configuration_url, + configuration_method=configuration_method, + configuration_filters=configuration_filters, + configuration_triggers=configuration_triggers, + configuration_flow_sid=configuration_flow_sid, + configuration_retry_count=configuration_retry_count, + ) + + async def update_async( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> "WebhookInstance": + """ + Asynchronous coroutine to update the WebhookInstance + + :param configuration_url: + :param configuration_method: + :param configuration_filters: + :param configuration_triggers: + :param configuration_flow_sid: + :param configuration_retry_count: + + :returns: The updated WebhookInstance + """ + return await self._proxy.update_async( + configuration_url=configuration_url, + configuration_method=configuration_method, + configuration_filters=configuration_filters, + configuration_triggers=configuration_triggers, + configuration_flow_sid=configuration_flow_sid, + configuration_retry_count=configuration_retry_count, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebhookContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, channel_sid: str, sid: str): + """ + Initialize the WebhookContext + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Channels/{channel_sid}/Webhooks/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the WebhookInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> WebhookInstance: + """ + Fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> WebhookInstance: + """ + Asynchronous coroutine to fetch the WebhookInstance + + + :returns: The fetched WebhookInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Update the WebhookInstance + + :param configuration_url: + :param configuration_method: + :param configuration_filters: + :param configuration_triggers: + :param configuration_flow_sid: + :param configuration_retry_count: + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.RetryCount": configuration_retry_count, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Asynchronous coroutine to update the WebhookInstance + + :param configuration_url: + :param configuration_method: + :param configuration_filters: + :param configuration_triggers: + :param configuration_flow_sid: + :param configuration_retry_count: + + :returns: The updated WebhookInstance + """ + + data = values.of( + { + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.RetryCount": configuration_retry_count, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class WebhookPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> WebhookInstance: + """ + Build an instance of WebhookInstance + + :param payload: Payload response from the API + """ + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class WebhookList(ListResource): + + def __init__(self, version: Version, service_sid: str, channel_sid: str): + """ + Initialize the WebhookList + + :param version: Version that contains the resource + :param service_sid: + :param channel_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "channel_sid": channel_sid, + } + self._uri = "/Services/{service_sid}/Channels/{channel_sid}/Webhooks".format( + **self._solution + ) + + def create( + self, + type: "WebhookInstance.Type", + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Create the WebhookInstance + + :param type: + :param configuration_url: + :param configuration_method: + :param configuration_filters: + :param configuration_triggers: + :param configuration_flow_sid: + :param configuration_retry_count: + + :returns: The created WebhookInstance + """ + + data = values.of( + { + "Type": type, + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.RetryCount": configuration_retry_count, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def create_async( + self, + type: "WebhookInstance.Type", + configuration_url: Union[str, object] = values.unset, + configuration_method: Union["WebhookInstance.Method", object] = values.unset, + configuration_filters: Union[List[str], object] = values.unset, + configuration_triggers: Union[List[str], object] = values.unset, + configuration_flow_sid: Union[str, object] = values.unset, + configuration_retry_count: Union[int, object] = values.unset, + ) -> WebhookInstance: + """ + Asynchronously create the WebhookInstance + + :param type: + :param configuration_url: + :param configuration_method: + :param configuration_filters: + :param configuration_triggers: + :param configuration_flow_sid: + :param configuration_retry_count: + + :returns: The created WebhookInstance + """ + + data = values.of( + { + "Type": type, + "Configuration.Url": configuration_url, + "Configuration.Method": configuration_method, + "Configuration.Filters": serialize.map( + configuration_filters, lambda e: e + ), + "Configuration.Triggers": serialize.map( + configuration_triggers, lambda e: e + ), + "Configuration.FlowSid": configuration_flow_sid, + "Configuration.RetryCount": configuration_retry_count, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return WebhookInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[WebhookInstance]: + """ + Streams WebhookInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[WebhookInstance]: + """ + Asynchronously streams WebhookInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[WebhookInstance]: + """ + Lists WebhookInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[WebhookInstance]: + """ + Asynchronously lists WebhookInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> WebhookPage: + """ + Retrieve a single page of WebhookInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of WebhookInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return WebhookPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> WebhookPage: + """ + Asynchronously retrieve a single page of WebhookInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of WebhookInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return WebhookPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> WebhookPage: + """ + Retrieve a specific page of WebhookInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of WebhookInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return WebhookPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> WebhookPage: + """ + Asynchronously retrieve a specific page of WebhookInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of WebhookInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return WebhookPage(self._version, response, self._solution) + + def get(self, sid: str) -> WebhookContext: + """ + Constructs a WebhookContext + + :param sid: + """ + return WebhookContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> WebhookContext: + """ + Constructs a WebhookContext + + :param sid: + """ + return WebhookContext( + self._version, + service_sid=self._solution["service_sid"], + channel_sid=self._solution["channel_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/role.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/role.py new file mode 100644 index 00000000..32f70c22 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/role.py @@ -0,0 +1,645 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RoleInstance(InstanceResource): + + class RoleType(object): + CHANNEL = "channel" + DEPLOYMENT = "deployment" + + """ + :ivar sid: + :ivar account_sid: + :ivar service_sid: + :ivar friendly_name: + :ivar type: + :ivar permissions: + :ivar date_created: + :ivar date_updated: + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["RoleInstance.RoleType"] = payload.get("type") + self.permissions: Optional[List[str]] = payload.get("permissions") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[RoleContext] = None + + @property + def _proxy(self) -> "RoleContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RoleContext for this RoleInstance + """ + if self._context is None: + self._context = RoleContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "RoleInstance": + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "RoleInstance": + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + return await self._proxy.fetch_async() + + def update(self, permission: List[str]) -> "RoleInstance": + """ + Update the RoleInstance + + :param permission: + + :returns: The updated RoleInstance + """ + return self._proxy.update( + permission=permission, + ) + + async def update_async(self, permission: List[str]) -> "RoleInstance": + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: + + :returns: The updated RoleInstance + """ + return await self._proxy.update_async( + permission=permission, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RoleContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the RoleContext + + :param version: Version that contains the resource + :param service_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Roles/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> RoleInstance: + """ + Fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> RoleInstance: + """ + Asynchronous coroutine to fetch the RoleInstance + + + :returns: The fetched RoleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update(self, permission: List[str]) -> RoleInstance: + """ + Update the RoleInstance + + :param permission: + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async(self, permission: List[str]) -> RoleInstance: + """ + Asynchronous coroutine to update the RoleInstance + + :param permission: + + :returns: The updated RoleInstance + """ + + data = values.of( + { + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RolePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RoleInstance: + """ + Build an instance of RoleInstance + + :param payload: Payload response from the API + """ + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RoleList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the RoleList + + :param version: Version that contains the resource + :param service_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Roles".format(**self._solution) + + def create( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Create the RoleInstance + + :param friendly_name: + :param type: + :param permission: + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, friendly_name: str, type: "RoleInstance.RoleType", permission: List[str] + ) -> RoleInstance: + """ + Asynchronously create the RoleInstance + + :param friendly_name: + :param type: + :param permission: + + :returns: The created RoleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Permission": serialize.map(permission, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RoleInstance]: + """ + Streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RoleInstance]: + """ + Asynchronously streams RoleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleInstance]: + """ + Asynchronously lists RoleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RolePage: + """ + Asynchronously retrieve a single page of RoleInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RolePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> RolePage: + """ + Retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RolePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> RolePage: + """ + Asynchronously retrieve a specific page of RoleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RolePage(self._version, response, self._solution) + + def get(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: + """ + return RoleContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> RoleContext: + """ + Constructs a RoleContext + + :param sid: + """ + return RoleContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__init__.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__init__.py new file mode 100644 index 00000000..f5f1454c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__init__.py @@ -0,0 +1,804 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.ip_messaging.v2.service.user.user_binding import UserBindingList +from twilio.rest.ip_messaging.v2.service.user.user_channel import UserChannelList + + +class UserInstance(InstanceResource): + + class WebhookEnabledType(object): + TRUE = "true" + FALSE = "false" + + """ + :ivar sid: + :ivar account_sid: + :ivar service_sid: + :ivar attributes: + :ivar friendly_name: + :ivar role_sid: + :ivar identity: + :ivar is_online: + :ivar is_notifiable: + :ivar date_created: + :ivar date_updated: + :ivar joined_channels_count: + :ivar links: + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.attributes: Optional[str] = payload.get("attributes") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.role_sid: Optional[str] = payload.get("role_sid") + self.identity: Optional[str] = payload.get("identity") + self.is_online: Optional[bool] = payload.get("is_online") + self.is_notifiable: Optional[bool] = payload.get("is_notifiable") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.joined_channels_count: Optional[int] = deserialize.integer( + payload.get("joined_channels_count") + ) + self.links: Optional[Dict[str, object]] = payload.get("links") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[UserContext] = None + + @property + def _proxy(self) -> "UserContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserContext for this UserInstance + """ + if self._context is None: + self._context = UserContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UserInstance": + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserInstance": + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The updated UserInstance + """ + return self._proxy.update( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + role_sid=role_sid, + attributes=attributes, + friendly_name=friendly_name, + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "UserInstance": + """ + Asynchronous coroutine to update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The updated UserInstance + """ + return await self._proxy.update_async( + x_twilio_webhook_enabled=x_twilio_webhook_enabled, + role_sid=role_sid, + attributes=attributes, + friendly_name=friendly_name, + ) + + @property + def user_bindings(self) -> UserBindingList: + """ + Access the user_bindings + """ + return self._proxy.user_bindings + + @property + def user_channels(self) -> UserChannelList: + """ + Access the user_channels + """ + return self._proxy.user_channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the UserContext + + :param version: Version that contains the resource + :param service_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Users/{sid}".format(**self._solution) + + self._user_bindings: Optional[UserBindingList] = None + self._user_channels: Optional[UserChannelList] = None + + def delete(self) -> bool: + """ + Deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserInstance: + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> UserInstance: + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The updated UserInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronous coroutine to update the UserInstance + + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The updated UserInstance + """ + + data = values.of( + { + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + if not ( + x_twilio_webhook_enabled is values.unset + or ( + isinstance(x_twilio_webhook_enabled, str) + and not x_twilio_webhook_enabled + ) + ): + headers["X-Twilio-Webhook-Enabled"] = x_twilio_webhook_enabled + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + @property + def user_bindings(self) -> UserBindingList: + """ + Access the user_bindings + """ + if self._user_bindings is None: + self._user_bindings = UserBindingList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._user_bindings + + @property + def user_channels(self) -> UserChannelList: + """ + Access the user_channels + """ + if self._user_channels is None: + self._user_channels = UserChannelList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._user_channels + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserInstance: + """ + Build an instance of UserInstance + + :param payload: Payload response from the API + """ + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the UserList + + :param version: Version that contains the resource + :param service_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Users".format(**self._solution) + + def create( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Create the UserInstance + + :param identity: + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + identity: str, + x_twilio_webhook_enabled: Union[ + "UserInstance.WebhookEnabledType", object + ] = values.unset, + role_sid: Union[str, object] = values.unset, + attributes: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> UserInstance: + """ + Asynchronously create the UserInstance + + :param identity: + :param x_twilio_webhook_enabled: The X-Twilio-Webhook-Enabled HTTP request header + :param role_sid: + :param attributes: + :param friendly_name: + + :returns: The created UserInstance + """ + + data = values.of( + { + "Identity": identity, + "RoleSid": role_sid, + "Attributes": attributes, + "FriendlyName": friendly_name, + } + ) + headers = values.of( + { + "X-Twilio-Webhook-Enabled": x_twilio_webhook_enabled, + "Content-Type": "application/x-www-form-urlencoded", + } + ) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserInstance]: + """ + Streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserInstance]: + """ + Asynchronously streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Asynchronously lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Asynchronously retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserPage: + """ + Retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserPage: + """ + Asynchronously retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserPage(self._version, response, self._solution) + + def get(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: + """ + return UserContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> UserContext: + """ + Constructs a UserContext + + :param sid: + """ + return UserContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cc77c54848482bd7f77808a1cf84ab7d6d0fa1e GIT binary patch literal 29091 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 b^t-CWjgzSx0&X|fJ>o!O{HFrl*>L_JU~RPY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__pycache__/user_binding.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/__pycache__/user_binding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea93b202b51da7eed36e4c97968121af0bd8bca6 GIT binary patch literal 22834 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/user_binding.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/user_binding.py new file mode 100644 index 00000000..4f1d9f10 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/user_binding.py @@ -0,0 +1,552 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class UserBindingInstance(InstanceResource): + + class BindingType(object): + GCM = "gcm" + APN = "apn" + FCM = "fcm" + + """ + :ivar sid: + :ivar account_sid: + :ivar service_sid: + :ivar date_created: + :ivar date_updated: + :ivar endpoint: + :ivar identity: + :ivar user_sid: + :ivar credential_sid: + :ivar binding_type: + :ivar message_types: + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + user_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.endpoint: Optional[str] = payload.get("endpoint") + self.identity: Optional[str] = payload.get("identity") + self.user_sid: Optional[str] = payload.get("user_sid") + self.credential_sid: Optional[str] = payload.get("credential_sid") + self.binding_type: Optional["UserBindingInstance.BindingType"] = payload.get( + "binding_type" + ) + self.message_types: Optional[List[str]] = payload.get("message_types") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + "sid": sid or self.sid, + } + self._context: Optional[UserBindingContext] = None + + @property + def _proxy(self) -> "UserBindingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserBindingContext for this UserBindingInstance + """ + if self._context is None: + self._context = UserBindingContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserBindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserBindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UserBindingInstance": + """ + Fetch the UserBindingInstance + + + :returns: The fetched UserBindingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserBindingInstance": + """ + Asynchronous coroutine to fetch the UserBindingInstance + + + :returns: The fetched UserBindingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserBindingContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, user_sid: str, sid: str): + """ + Initialize the UserBindingContext + + :param version: Version that contains the resource + :param service_sid: + :param user_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Users/{user_sid}/Bindings/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the UserBindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserBindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserBindingInstance: + """ + Fetch the UserBindingInstance + + + :returns: The fetched UserBindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserBindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> UserBindingInstance: + """ + Asynchronous coroutine to fetch the UserBindingInstance + + + :returns: The fetched UserBindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserBindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserBindingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserBindingInstance: + """ + Build an instance of UserBindingInstance + + :param payload: Payload response from the API + """ + return UserBindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserBindingList(ListResource): + + def __init__(self, version: Version, service_sid: str, user_sid: str): + """ + Initialize the UserBindingList + + :param version: Version that contains the resource + :param service_sid: + :param user_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + } + self._uri = "/Services/{service_sid}/Users/{user_sid}/Bindings".format( + **self._solution + ) + + def stream( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserBindingInstance]: + """ + Streams UserBindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["UserBindingInstance.BindingType"] binding_type: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(binding_type=binding_type, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserBindingInstance]: + """ + Asynchronously streams UserBindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param List["UserBindingInstance.BindingType"] binding_type: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + binding_type=binding_type, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserBindingInstance]: + """ + Lists UserBindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["UserBindingInstance.BindingType"] binding_type: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + binding_type=binding_type, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserBindingInstance]: + """ + Asynchronously lists UserBindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param List["UserBindingInstance.BindingType"] binding_type: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + binding_type=binding_type, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserBindingPage: + """ + Retrieve a single page of UserBindingInstance records from the API. + Request is executed immediately + + :param binding_type: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserBindingInstance + """ + data = values.of( + { + "BindingType": serialize.map(binding_type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserBindingPage(self._version, response, self._solution) + + async def page_async( + self, + binding_type: Union[ + List["UserBindingInstance.BindingType"], object + ] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserBindingPage: + """ + Asynchronously retrieve a single page of UserBindingInstance records from the API. + Request is executed immediately + + :param binding_type: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserBindingInstance + """ + data = values.of( + { + "BindingType": serialize.map(binding_type, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserBindingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserBindingPage: + """ + Retrieve a specific page of UserBindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserBindingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserBindingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserBindingPage: + """ + Asynchronously retrieve a specific page of UserBindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserBindingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserBindingPage(self._version, response, self._solution) + + def get(self, sid: str) -> UserBindingContext: + """ + Constructs a UserBindingContext + + :param sid: + """ + return UserBindingContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> UserBindingContext: + """ + Constructs a UserBindingContext + + :param sid: + """ + return UserBindingContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/user_channel.py b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/user_channel.py new file mode 100644 index 00000000..5cb544fc --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/ip_messaging/v2/service/user/user_channel.py @@ -0,0 +1,666 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Ip_messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class UserChannelInstance(InstanceResource): + + class ChannelStatus(object): + JOINED = "joined" + INVITED = "invited" + NOT_PARTICIPATING = "not_participating" + + class NotificationLevel(object): + DEFAULT = "default" + MUTED = "muted" + + """ + :ivar account_sid: + :ivar service_sid: + :ivar channel_sid: + :ivar user_sid: + :ivar member_sid: + :ivar status: + :ivar last_consumed_message_index: + :ivar unread_messages_count: + :ivar links: + :ivar url: + :ivar notification_level: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + user_sid: str, + channel_sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.channel_sid: Optional[str] = payload.get("channel_sid") + self.user_sid: Optional[str] = payload.get("user_sid") + self.member_sid: Optional[str] = payload.get("member_sid") + self.status: Optional["UserChannelInstance.ChannelStatus"] = payload.get( + "status" + ) + self.last_consumed_message_index: Optional[int] = deserialize.integer( + payload.get("last_consumed_message_index") + ) + self.unread_messages_count: Optional[int] = deserialize.integer( + payload.get("unread_messages_count") + ) + self.links: Optional[Dict[str, object]] = payload.get("links") + self.url: Optional[str] = payload.get("url") + self.notification_level: Optional["UserChannelInstance.NotificationLevel"] = ( + payload.get("notification_level") + ) + + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + "channel_sid": channel_sid or self.channel_sid, + } + self._context: Optional[UserChannelContext] = None + + @property + def _proxy(self) -> "UserChannelContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserChannelContext for this UserChannelInstance + """ + if self._context is None: + self._context = UserChannelContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=self._solution["channel_sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UserChannelInstance": + """ + Fetch the UserChannelInstance + + + :returns: The fetched UserChannelInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserChannelInstance": + """ + Asynchronous coroutine to fetch the UserChannelInstance + + + :returns: The fetched UserChannelInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + notification_level: Union[ + "UserChannelInstance.NotificationLevel", object + ] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + ) -> "UserChannelInstance": + """ + Update the UserChannelInstance + + :param notification_level: + :param last_consumed_message_index: + :param last_consumption_timestamp: + + :returns: The updated UserChannelInstance + """ + return self._proxy.update( + notification_level=notification_level, + last_consumed_message_index=last_consumed_message_index, + last_consumption_timestamp=last_consumption_timestamp, + ) + + async def update_async( + self, + notification_level: Union[ + "UserChannelInstance.NotificationLevel", object + ] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + ) -> "UserChannelInstance": + """ + Asynchronous coroutine to update the UserChannelInstance + + :param notification_level: + :param last_consumed_message_index: + :param last_consumption_timestamp: + + :returns: The updated UserChannelInstance + """ + return await self._proxy.update_async( + notification_level=notification_level, + last_consumed_message_index=last_consumed_message_index, + last_consumption_timestamp=last_consumption_timestamp, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserChannelContext(InstanceContext): + + def __init__( + self, version: Version, service_sid: str, user_sid: str, channel_sid: str + ): + """ + Initialize the UserChannelContext + + :param version: Version that contains the resource + :param service_sid: + :param user_sid: + :param channel_sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + "channel_sid": channel_sid, + } + self._uri = ( + "/Services/{service_sid}/Users/{user_sid}/Channels/{channel_sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the UserChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserChannelInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserChannelInstance: + """ + Fetch the UserChannelInstance + + + :returns: The fetched UserChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def fetch_async(self) -> UserChannelInstance: + """ + Asynchronous coroutine to fetch the UserChannelInstance + + + :returns: The fetched UserChannelInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def update( + self, + notification_level: Union[ + "UserChannelInstance.NotificationLevel", object + ] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + ) -> UserChannelInstance: + """ + Update the UserChannelInstance + + :param notification_level: + :param last_consumed_message_index: + :param last_consumption_timestamp: + + :returns: The updated UserChannelInstance + """ + + data = values.of( + { + "NotificationLevel": notification_level, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=self._solution["channel_sid"], + ) + + async def update_async( + self, + notification_level: Union[ + "UserChannelInstance.NotificationLevel", object + ] = values.unset, + last_consumed_message_index: Union[int, object] = values.unset, + last_consumption_timestamp: Union[datetime, object] = values.unset, + ) -> UserChannelInstance: + """ + Asynchronous coroutine to update the UserChannelInstance + + :param notification_level: + :param last_consumed_message_index: + :param last_consumption_timestamp: + + :returns: The updated UserChannelInstance + """ + + data = values.of( + { + "NotificationLevel": notification_level, + "LastConsumedMessageIndex": last_consumed_message_index, + "LastConsumptionTimestamp": serialize.iso8601_datetime( + last_consumption_timestamp + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=self._solution["channel_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserChannelPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserChannelInstance: + """ + Build an instance of UserChannelInstance + + :param payload: Payload response from the API + """ + return UserChannelInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserChannelList(ListResource): + + def __init__(self, version: Version, service_sid: str, user_sid: str): + """ + Initialize the UserChannelList + + :param version: Version that contains the resource + :param service_sid: + :param user_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "user_sid": user_sid, + } + self._uri = "/Services/{service_sid}/Users/{user_sid}/Channels".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserChannelInstance]: + """ + Streams UserChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserChannelInstance]: + """ + Asynchronously streams UserChannelInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserChannelInstance]: + """ + Lists UserChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserChannelInstance]: + """ + Asynchronously lists UserChannelInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserChannelPage: + """ + Retrieve a single page of UserChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserChannelPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserChannelPage: + """ + Asynchronously retrieve a single page of UserChannelInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserChannelInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserChannelPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserChannelPage: + """ + Retrieve a specific page of UserChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserChannelInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserChannelPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserChannelPage: + """ + Asynchronously retrieve a specific page of UserChannelInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserChannelInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserChannelPage(self._version, response, self._solution) + + def get(self, channel_sid: str) -> UserChannelContext: + """ + Constructs a UserChannelContext + + :param channel_sid: + """ + return UserChannelContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=channel_sid, + ) + + def __call__(self, channel_sid: str) -> UserChannelContext: + """ + Constructs a UserChannelContext + + :param channel_sid: + """ + return UserChannelContext( + self._version, + service_sid=self._solution["service_sid"], + user_sid=self._solution["user_sid"], + channel_sid=channel_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/lookups/LookupsBase.py b/venv/Lib/site-packages/twilio/rest/lookups/LookupsBase.py new file mode 100644 index 00000000..e24f8dc6 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/lookups/LookupsBase.py @@ -0,0 +1,55 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.lookups.v1 import V1 +from twilio.rest.lookups.v2 import V2 + + +class LookupsBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Lookups Domain + + :returns: Domain for Lookups + """ + super().__init__(twilio, "https://lookups.twilio.com") + self._v1: Optional[V1] = None + self._v2: Optional[V2] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Lookups + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + @property + def v2(self) -> V2: + """ + :returns: Versions v2 of Lookups + """ + if self._v2 is None: + self._v2 = V2(self) + return self._v2 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/lookups/__init__.py b/venv/Lib/site-packages/twilio/rest/lookups/__init__.py new file mode 100644 index 00000000..6a984f81 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/lookups/__init__.py @@ -0,0 +1,15 @@ +from warnings import warn + +from twilio.rest.lookups.LookupsBase import LookupsBase +from twilio.rest.lookups.v1.phone_number import PhoneNumberList + + +class Lookups(LookupsBase): + @property + def phone_numbers(self) -> PhoneNumberList: + warn( + "phone_numbers is deprecated. Use v1.phone_numbers instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.phone_numbers diff --git a/venv/Lib/site-packages/twilio/rest/lookups/__pycache__/LookupsBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/lookups/__pycache__/LookupsBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fd9dadc90d0e03a370533a4e2e74c62b8da85df GIT binary patch literal 2346 zcmd57O>Y}TbauU7ubofYC=I2cX+nyOR9o?>ib_P&pb}A%0%;E`qhaG6Crj45W_IJo zmJc~ZB9R)k5<Kw^v) z5lf83>|)m}Ys<5-W}*hS#THQ)u0!%m1bAP$YnD>HBK~&u%Q>*Su(C&pVN!6? zDFgj2v=b+$0xhN53QtwlZBm8S+Uhqop0-n5ud24Tr5z*|%#7q3z)hdvW(11APo!*0Ug~Za}1|=2NZPSaiAOJtuT5*J*K?#l#iJE+z_V7_Vu;!*$^W(}{#u zeL)lDo>J?4w`y)2Q6UbdQ1NREc`Zr@>vb+7gE0qgWh_du#uS25J{4&JcdG)Qca&vJ zR+F&+-KKQ&g?W9td^_MGD1S0Pzf_*%!CL6o%MIVD@N3W;VY$J*M){_*Tn?O&U#?q~ zHEV?j<=BIw;6YeSyecMsW4;UZrWk-bS|cZ!T?a=&5=;PizDb_-lkDJ5=4WGUfArDC z4}LXf9$%c?*6tZ{+ci3%Mj}1VQw1hOZ($7h>wFGikF?3xJ<&0;IUJ&nTy1iYoQE=Y znXfqq9i+5My%HSP=?)|d`aYnIDe6~G)he%wK``(Ndt^qL$D zfukaWK-T)D43u8UKq-%UV+c;g2h6y}_*VBwQ^~6>-mA(j;Wr%kpRj0Ez}T_fCKbF6 zJqe9#;dJV09@pHS_RvF!1E?LdIV0^O#!#rvuD_EbZ{P zj4wZcFV(YZ9A0XUv6^qMyNLHQ_6-c#SR(LmS3aT0s0*0ZB5ca066a7LQ+pn;C>4Z4 zyp7mE^1LhDbs5Vm;tk-+=KD}KpUC1#1S2T;48Zd(a;O>UOZ$x@0^8vT(FYGzJw5hd z_AdfkC)H&f4tKGC5v9}P`xAc?*kpwAj)i=Glwr*FD-fCsBP_+ak+EI?tFcG;_+A)S<6O^(_kqNo4Bi89 mm{JtwPc^G(N25f!@H?4&O5S;jaPpZxp^QJcbVOj2hW-IXoIxl6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/lookups/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/lookups/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c405b4e72ed52b1e8b9773597732f58469e6e4a6 GIT binary patch literal 950 zcmZuvy>HV%6o2Qhn2@vu@r?u#w1Wp+bwa985l{&#q6qP!N|q(#=B}+9$2NDDM5&Nq z=l}y^EdK&31OEpLuuxfa0)}pd(4`Z1v6HA3H@x?Iejk3n-`%Hjxd`IC`TBJABLes# zgTc{r(3=xr6EI*DLK8U%NvwoQQ+3onRzt0+J30ad?gG{}0P95EQnP-?=o(gGR|XbJ zwT@3C;g472xY0`3ZJ!Yljz3t9BT{QMmk6x}jMuZ?%;tljcSXdTK)^v59EGSD5p7w) z%7(U;*E@PwwY0R5Pfra>c#B4L!EJaXFFCUJP?$~N!yHCj8B}5A!;k@j=dh*?G9$lc zjPL+G0!yo{&nA+N7xnqDO28_ZB$U*BPOx2h!bqh(V;`xB7$-iqcjXE~ks{-My%CZ& z2`!DvebbZk`H&!v7KMyKw2~_AnY4Upk`$SdaG6P7m4n4Qv#$6dW$yijg~#qZVGSN9 zZaWU@kVF>Zwtmpt!T%MbI6nb0^Ply|AT#{LrTfu4|fLYl(BNWd-%vjN+B zc~3F)sdq2_fN(t(jIrPHL)IrNYgQpO<6{mssZp3$}k=8cTz9K9eC^1_$|dn!U`2hRV3>pO7suVJF8SB-rTuHX9)rTg-+ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/lookups/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/lookups/v1/__init__.py new file mode 100644 index 00000000..72204da3 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/lookups/v1/__init__.py @@ -0,0 +1,43 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Lookups + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.lookups.v1.phone_number import PhoneNumberList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Lookups + + :param domain: The Twilio.lookups domain + """ + super().__init__(domain, "v1") + self._phone_numbers: Optional[PhoneNumberList] = None + + @property + def phone_numbers(self) -> PhoneNumberList: + if self._phone_numbers is None: + self._phone_numbers = PhoneNumberList(self) + return self._phone_numbers + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/lookups/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/lookups/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c15056dbc09a5dfc8a2ab456f707211347e3e47c GIT binary patch literal 2044 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/lookups/v1/phone_number.py b/venv/Lib/site-packages/twilio/rest/lookups/v1/phone_number.py new file mode 100644 index 00000000..304b89ab --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/lookups/v1/phone_number.py @@ -0,0 +1,272 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Lookups + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PhoneNumberInstance(InstanceResource): + """ + :ivar caller_name: The name of the phone number's owner. If `null`, that information was not available. + :ivar country_code: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) for the phone number. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar national_format: The phone number, in national format. + :ivar carrier: The telecom company that provides the phone number. + :ivar add_ons: A JSON string with the results of the Add-ons you specified in the `add_ons` parameters. For the format of the object, see [Using Add-ons](https://www.twilio.com/docs/add-ons). + :ivar url: The absolute URL of the resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + phone_number: Optional[str] = None, + ): + super().__init__(version) + + self.caller_name: Optional[Dict[str, object]] = payload.get("caller_name") + self.country_code: Optional[str] = payload.get("country_code") + self.phone_number: Optional[str] = payload.get("phone_number") + self.national_format: Optional[str] = payload.get("national_format") + self.carrier: Optional[Dict[str, object]] = payload.get("carrier") + self.add_ons: Optional[Dict[str, object]] = payload.get("add_ons") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "phone_number": phone_number or self.phone_number, + } + self._context: Optional[PhoneNumberContext] = None + + @property + def _proxy(self) -> "PhoneNumberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PhoneNumberContext for this PhoneNumberInstance + """ + if self._context is None: + self._context = PhoneNumberContext( + self._version, + phone_number=self._solution["phone_number"], + ) + return self._context + + def fetch( + self, + country_code: Union[str, object] = values.unset, + type: Union[List[str], object] = values.unset, + add_ons: Union[List[str], object] = values.unset, + add_ons_data: Union[Dict[str, object], object] = values.unset, + ) -> "PhoneNumberInstance": + """ + Fetch the PhoneNumberInstance + + :param country_code: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the phone number to fetch. This is used to specify the country when the phone number is provided in a national format. + :param type: The type of information to return. Can be: `carrier` or `caller-name`. The default is null. To retrieve both types of information, specify this parameter twice; once with `carrier` and once with `caller-name` as the value. + :param add_ons: The `unique_name` of an Add-on you would like to invoke. Can be the `unique_name` of an Add-on that is installed on your account. You can specify multiple instances of this parameter to invoke multiple Add-ons. For more information about Add-ons, see the [Add-ons documentation](https://www.twilio.com/docs/add-ons). + :param add_ons_data: Data specific to the add-on you would like to invoke. The content and format of this value depends on the add-on. + + :returns: The fetched PhoneNumberInstance + """ + return self._proxy.fetch( + country_code=country_code, + type=type, + add_ons=add_ons, + add_ons_data=add_ons_data, + ) + + async def fetch_async( + self, + country_code: Union[str, object] = values.unset, + type: Union[List[str], object] = values.unset, + add_ons: Union[List[str], object] = values.unset, + add_ons_data: Union[Dict[str, object], object] = values.unset, + ) -> "PhoneNumberInstance": + """ + Asynchronous coroutine to fetch the PhoneNumberInstance + + :param country_code: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the phone number to fetch. This is used to specify the country when the phone number is provided in a national format. + :param type: The type of information to return. Can be: `carrier` or `caller-name`. The default is null. To retrieve both types of information, specify this parameter twice; once with `carrier` and once with `caller-name` as the value. + :param add_ons: The `unique_name` of an Add-on you would like to invoke. Can be the `unique_name` of an Add-on that is installed on your account. You can specify multiple instances of this parameter to invoke multiple Add-ons. For more information about Add-ons, see the [Add-ons documentation](https://www.twilio.com/docs/add-ons). + :param add_ons_data: Data specific to the add-on you would like to invoke. The content and format of this value depends on the add-on. + + :returns: The fetched PhoneNumberInstance + """ + return await self._proxy.fetch_async( + country_code=country_code, + type=type, + add_ons=add_ons, + add_ons_data=add_ons_data, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PhoneNumberContext(InstanceContext): + + def __init__(self, version: Version, phone_number: str): + """ + Initialize the PhoneNumberContext + + :param version: Version that contains the resource + :param phone_number: The phone number to lookup in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "phone_number": phone_number, + } + self._uri = "/PhoneNumbers/{phone_number}".format(**self._solution) + + def fetch( + self, + country_code: Union[str, object] = values.unset, + type: Union[List[str], object] = values.unset, + add_ons: Union[List[str], object] = values.unset, + add_ons_data: Union[Dict[str, object], object] = values.unset, + ) -> PhoneNumberInstance: + """ + Fetch the PhoneNumberInstance + + :param country_code: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the phone number to fetch. This is used to specify the country when the phone number is provided in a national format. + :param type: The type of information to return. Can be: `carrier` or `caller-name`. The default is null. To retrieve both types of information, specify this parameter twice; once with `carrier` and once with `caller-name` as the value. + :param add_ons: The `unique_name` of an Add-on you would like to invoke. Can be the `unique_name` of an Add-on that is installed on your account. You can specify multiple instances of this parameter to invoke multiple Add-ons. For more information about Add-ons, see the [Add-ons documentation](https://www.twilio.com/docs/add-ons). + :param add_ons_data: Data specific to the add-on you would like to invoke. The content and format of this value depends on the add-on. + + :returns: The fetched PhoneNumberInstance + """ + + data = values.of( + { + "CountryCode": country_code, + "Type": serialize.map(type, lambda e: e), + "AddOns": serialize.map(add_ons, lambda e: e), + } + ) + + data.update(serialize.prefixed_collapsible_map(add_ons_data, "AddOns")) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, + payload, + phone_number=self._solution["phone_number"], + ) + + async def fetch_async( + self, + country_code: Union[str, object] = values.unset, + type: Union[List[str], object] = values.unset, + add_ons: Union[List[str], object] = values.unset, + add_ons_data: Union[Dict[str, object], object] = values.unset, + ) -> PhoneNumberInstance: + """ + Asynchronous coroutine to fetch the PhoneNumberInstance + + :param country_code: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the phone number to fetch. This is used to specify the country when the phone number is provided in a national format. + :param type: The type of information to return. Can be: `carrier` or `caller-name`. The default is null. To retrieve both types of information, specify this parameter twice; once with `carrier` and once with `caller-name` as the value. + :param add_ons: The `unique_name` of an Add-on you would like to invoke. Can be the `unique_name` of an Add-on that is installed on your account. You can specify multiple instances of this parameter to invoke multiple Add-ons. For more information about Add-ons, see the [Add-ons documentation](https://www.twilio.com/docs/add-ons). + :param add_ons_data: Data specific to the add-on you would like to invoke. The content and format of this value depends on the add-on. + + :returns: The fetched PhoneNumberInstance + """ + + data = values.of( + { + "CountryCode": country_code, + "Type": serialize.map(type, lambda e: e), + "AddOns": serialize.map(add_ons, lambda e: e), + } + ) + + data.update(serialize.prefixed_collapsible_map(add_ons_data, "AddOns")) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, + payload, + phone_number=self._solution["phone_number"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PhoneNumberList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PhoneNumberList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, phone_number: str) -> PhoneNumberContext: + """ + Constructs a PhoneNumberContext + + :param phone_number: The phone number to lookup in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + """ + return PhoneNumberContext(self._version, phone_number=phone_number) + + def __call__(self, phone_number: str) -> PhoneNumberContext: + """ + Constructs a PhoneNumberContext + + :param phone_number: The phone number to lookup in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + """ + return PhoneNumberContext(self._version, phone_number=phone_number) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/lookups/v2/__init__.py b/venv/Lib/site-packages/twilio/rest/lookups/v2/__init__.py new file mode 100644 index 00000000..d795aea1 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/lookups/v2/__init__.py @@ -0,0 +1,43 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Lookups + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.lookups.v2.phone_number import PhoneNumberList + + +class V2(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V2 version of Lookups + + :param domain: The Twilio.lookups domain + """ + super().__init__(domain, "v2") + self._phone_numbers: Optional[PhoneNumberList] = None + + @property + def phone_numbers(self) -> PhoneNumberList: + if self._phone_numbers is None: + self._phone_numbers = PhoneNumberList(self) + return self._phone_numbers + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/lookups/v2/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/lookups/v2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42b88d6bad1f3d95b1ae45cad1fb42d990eaef72 GIT binary patch literal 2044 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/lookups/v2/phone_number.py b/venv/Lib/site-packages/twilio/rest/lookups/v2/phone_number.py new file mode 100644 index 00000000..fc60eed6 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/lookups/v2/phone_number.py @@ -0,0 +1,443 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Lookups + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PhoneNumberInstance(InstanceResource): + + class ValidationError(object): + TOO_SHORT = "TOO_SHORT" + TOO_LONG = "TOO_LONG" + INVALID_BUT_POSSIBLE = "INVALID_BUT_POSSIBLE" + INVALID_COUNTRY_CODE = "INVALID_COUNTRY_CODE" + INVALID_LENGTH = "INVALID_LENGTH" + NOT_A_NUMBER = "NOT_A_NUMBER" + + """ + :ivar calling_country_code: International dialing prefix of the phone number defined in the E.164 standard. + :ivar country_code: The phone number's [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar national_format: The phone number in [national format](https://en.wikipedia.org/wiki/National_conventions_for_writing_telephone_numbers). + :ivar valid: Boolean which indicates if the phone number is in a valid range that can be freely assigned by a carrier to a user. + :ivar validation_errors: Contains reasons why a phone number is invalid. Possible values: TOO_SHORT, TOO_LONG, INVALID_BUT_POSSIBLE, INVALID_COUNTRY_CODE, INVALID_LENGTH, NOT_A_NUMBER. + :ivar caller_name: An object that contains caller name information based on [CNAM](https://support.twilio.com/hc/en-us/articles/360051670533-Getting-Started-with-CNAM-Caller-ID). + :ivar sim_swap: An object that contains information on the last date the subscriber identity module (SIM) was changed for a mobile phone number. + :ivar call_forwarding: An object that contains information on the unconditional call forwarding status of mobile phone number. + :ivar line_status: An object that contains line status information for a mobile phone number. + :ivar line_type_intelligence: An object that contains line type information including the carrier name, mobile country code, and mobile network code. + :ivar identity_match: An object that contains identity match information. The result of comparing user-provided information including name, address, date of birth, national ID, against authoritative phone-based data sources + :ivar reassigned_number: An object that contains reassigned number information. Reassigned Numbers will return a phone number's reassignment status given a phone number and date + :ivar sms_pumping_risk: An object that contains information on if a phone number has been currently or previously blocked by Verify Fraud Guard for receiving malicious SMS pumping traffic as well as other signals associated with risky carriers and low conversion rates. + :ivar phone_number_quality_score: An object that contains information of a mobile phone number quality score. Quality score will return a risk score about the phone number. + :ivar pre_fill: An object that contains pre fill information. pre_fill will return PII information associated with the phone number like first name, last name, address line, country code, state and postal code. + :ivar url: The absolute URL of the resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + phone_number: Optional[str] = None, + ): + super().__init__(version) + + self.calling_country_code: Optional[str] = payload.get("calling_country_code") + self.country_code: Optional[str] = payload.get("country_code") + self.phone_number: Optional[str] = payload.get("phone_number") + self.national_format: Optional[str] = payload.get("national_format") + self.valid: Optional[bool] = payload.get("valid") + self.validation_errors: Optional[ + List["PhoneNumberInstance.ValidationError"] + ] = payload.get("validation_errors") + self.caller_name: Optional[Dict[str, object]] = payload.get("caller_name") + self.sim_swap: Optional[Dict[str, object]] = payload.get("sim_swap") + self.call_forwarding: Optional[Dict[str, object]] = payload.get( + "call_forwarding" + ) + self.line_status: Optional[Dict[str, object]] = payload.get("line_status") + self.line_type_intelligence: Optional[Dict[str, object]] = payload.get( + "line_type_intelligence" + ) + self.identity_match: Optional[Dict[str, object]] = payload.get("identity_match") + self.reassigned_number: Optional[Dict[str, object]] = payload.get( + "reassigned_number" + ) + self.sms_pumping_risk: Optional[Dict[str, object]] = payload.get( + "sms_pumping_risk" + ) + self.phone_number_quality_score: Optional[Dict[str, object]] = payload.get( + "phone_number_quality_score" + ) + self.pre_fill: Optional[Dict[str, object]] = payload.get("pre_fill") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "phone_number": phone_number or self.phone_number, + } + self._context: Optional[PhoneNumberContext] = None + + @property + def _proxy(self) -> "PhoneNumberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PhoneNumberContext for this PhoneNumberInstance + """ + if self._context is None: + self._context = PhoneNumberContext( + self._version, + phone_number=self._solution["phone_number"], + ) + return self._context + + def fetch( + self, + fields: Union[str, object] = values.unset, + country_code: Union[str, object] = values.unset, + first_name: Union[str, object] = values.unset, + last_name: Union[str, object] = values.unset, + address_line1: Union[str, object] = values.unset, + address_line2: Union[str, object] = values.unset, + city: Union[str, object] = values.unset, + state: Union[str, object] = values.unset, + postal_code: Union[str, object] = values.unset, + address_country_code: Union[str, object] = values.unset, + national_id: Union[str, object] = values.unset, + date_of_birth: Union[str, object] = values.unset, + last_verified_date: Union[str, object] = values.unset, + verification_sid: Union[str, object] = values.unset, + partner_sub_id: Union[str, object] = values.unset, + ) -> "PhoneNumberInstance": + """ + Fetch the PhoneNumberInstance + + :param fields: A comma-separated list of fields to return. Possible values are validation, caller_name, sim_swap, call_forwarding, line_status, line_type_intelligence, identity_match, reassigned_number, sms_pumping_risk, phone_number_quality_score, pre_fill. + :param country_code: The [country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) used if the phone number provided is in national format. + :param first_name: User’s first name. This query parameter is only used (optionally) for identity_match package requests. + :param last_name: User’s last name. This query parameter is only used (optionally) for identity_match package requests. + :param address_line1: User’s first address line. This query parameter is only used (optionally) for identity_match package requests. + :param address_line2: User’s second address line. This query parameter is only used (optionally) for identity_match package requests. + :param city: User’s city. This query parameter is only used (optionally) for identity_match package requests. + :param state: User’s country subdivision, such as state, province, or locality. This query parameter is only used (optionally) for identity_match package requests. + :param postal_code: User’s postal zip code. This query parameter is only used (optionally) for identity_match package requests. + :param address_country_code: User’s country, up to two characters. This query parameter is only used (optionally) for identity_match package requests. + :param national_id: User’s national ID, such as SSN or Passport ID. This query parameter is only used (optionally) for identity_match package requests. + :param date_of_birth: User’s date of birth, in YYYYMMDD format. This query parameter is only used (optionally) for identity_match package requests. + :param last_verified_date: The date you obtained consent to call or text the end-user of the phone number or a date on which you are reasonably certain that the end-user could still be reached at that number. This query parameter is only used (optionally) for reassigned_number package requests. + :param verification_sid: The unique identifier associated with a verification process through verify API. This query parameter is only used (optionally) for pre_fill package requests. + :param partner_sub_id: The optional partnerSubId parameter to provide context for your sub-accounts, tenantIDs, sender IDs or other segmentation, enhancing the accuracy of the risk analysis. + + :returns: The fetched PhoneNumberInstance + """ + return self._proxy.fetch( + fields=fields, + country_code=country_code, + first_name=first_name, + last_name=last_name, + address_line1=address_line1, + address_line2=address_line2, + city=city, + state=state, + postal_code=postal_code, + address_country_code=address_country_code, + national_id=national_id, + date_of_birth=date_of_birth, + last_verified_date=last_verified_date, + verification_sid=verification_sid, + partner_sub_id=partner_sub_id, + ) + + async def fetch_async( + self, + fields: Union[str, object] = values.unset, + country_code: Union[str, object] = values.unset, + first_name: Union[str, object] = values.unset, + last_name: Union[str, object] = values.unset, + address_line1: Union[str, object] = values.unset, + address_line2: Union[str, object] = values.unset, + city: Union[str, object] = values.unset, + state: Union[str, object] = values.unset, + postal_code: Union[str, object] = values.unset, + address_country_code: Union[str, object] = values.unset, + national_id: Union[str, object] = values.unset, + date_of_birth: Union[str, object] = values.unset, + last_verified_date: Union[str, object] = values.unset, + verification_sid: Union[str, object] = values.unset, + partner_sub_id: Union[str, object] = values.unset, + ) -> "PhoneNumberInstance": + """ + Asynchronous coroutine to fetch the PhoneNumberInstance + + :param fields: A comma-separated list of fields to return. Possible values are validation, caller_name, sim_swap, call_forwarding, line_status, line_type_intelligence, identity_match, reassigned_number, sms_pumping_risk, phone_number_quality_score, pre_fill. + :param country_code: The [country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) used if the phone number provided is in national format. + :param first_name: User’s first name. This query parameter is only used (optionally) for identity_match package requests. + :param last_name: User’s last name. This query parameter is only used (optionally) for identity_match package requests. + :param address_line1: User’s first address line. This query parameter is only used (optionally) for identity_match package requests. + :param address_line2: User’s second address line. This query parameter is only used (optionally) for identity_match package requests. + :param city: User’s city. This query parameter is only used (optionally) for identity_match package requests. + :param state: User’s country subdivision, such as state, province, or locality. This query parameter is only used (optionally) for identity_match package requests. + :param postal_code: User’s postal zip code. This query parameter is only used (optionally) for identity_match package requests. + :param address_country_code: User’s country, up to two characters. This query parameter is only used (optionally) for identity_match package requests. + :param national_id: User’s national ID, such as SSN or Passport ID. This query parameter is only used (optionally) for identity_match package requests. + :param date_of_birth: User’s date of birth, in YYYYMMDD format. This query parameter is only used (optionally) for identity_match package requests. + :param last_verified_date: The date you obtained consent to call or text the end-user of the phone number or a date on which you are reasonably certain that the end-user could still be reached at that number. This query parameter is only used (optionally) for reassigned_number package requests. + :param verification_sid: The unique identifier associated with a verification process through verify API. This query parameter is only used (optionally) for pre_fill package requests. + :param partner_sub_id: The optional partnerSubId parameter to provide context for your sub-accounts, tenantIDs, sender IDs or other segmentation, enhancing the accuracy of the risk analysis. + + :returns: The fetched PhoneNumberInstance + """ + return await self._proxy.fetch_async( + fields=fields, + country_code=country_code, + first_name=first_name, + last_name=last_name, + address_line1=address_line1, + address_line2=address_line2, + city=city, + state=state, + postal_code=postal_code, + address_country_code=address_country_code, + national_id=national_id, + date_of_birth=date_of_birth, + last_verified_date=last_verified_date, + verification_sid=verification_sid, + partner_sub_id=partner_sub_id, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PhoneNumberContext(InstanceContext): + + def __init__(self, version: Version, phone_number: str): + """ + Initialize the PhoneNumberContext + + :param version: Version that contains the resource + :param phone_number: The phone number to lookup in E.164 or national format. Default country code is +1 (North America). + """ + super().__init__(version) + + # Path Solution + self._solution = { + "phone_number": phone_number, + } + self._uri = "/PhoneNumbers/{phone_number}".format(**self._solution) + + def fetch( + self, + fields: Union[str, object] = values.unset, + country_code: Union[str, object] = values.unset, + first_name: Union[str, object] = values.unset, + last_name: Union[str, object] = values.unset, + address_line1: Union[str, object] = values.unset, + address_line2: Union[str, object] = values.unset, + city: Union[str, object] = values.unset, + state: Union[str, object] = values.unset, + postal_code: Union[str, object] = values.unset, + address_country_code: Union[str, object] = values.unset, + national_id: Union[str, object] = values.unset, + date_of_birth: Union[str, object] = values.unset, + last_verified_date: Union[str, object] = values.unset, + verification_sid: Union[str, object] = values.unset, + partner_sub_id: Union[str, object] = values.unset, + ) -> PhoneNumberInstance: + """ + Fetch the PhoneNumberInstance + + :param fields: A comma-separated list of fields to return. Possible values are validation, caller_name, sim_swap, call_forwarding, line_status, line_type_intelligence, identity_match, reassigned_number, sms_pumping_risk, phone_number_quality_score, pre_fill. + :param country_code: The [country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) used if the phone number provided is in national format. + :param first_name: User’s first name. This query parameter is only used (optionally) for identity_match package requests. + :param last_name: User’s last name. This query parameter is only used (optionally) for identity_match package requests. + :param address_line1: User’s first address line. This query parameter is only used (optionally) for identity_match package requests. + :param address_line2: User’s second address line. This query parameter is only used (optionally) for identity_match package requests. + :param city: User’s city. This query parameter is only used (optionally) for identity_match package requests. + :param state: User’s country subdivision, such as state, province, or locality. This query parameter is only used (optionally) for identity_match package requests. + :param postal_code: User’s postal zip code. This query parameter is only used (optionally) for identity_match package requests. + :param address_country_code: User’s country, up to two characters. This query parameter is only used (optionally) for identity_match package requests. + :param national_id: User’s national ID, such as SSN or Passport ID. This query parameter is only used (optionally) for identity_match package requests. + :param date_of_birth: User’s date of birth, in YYYYMMDD format. This query parameter is only used (optionally) for identity_match package requests. + :param last_verified_date: The date you obtained consent to call or text the end-user of the phone number or a date on which you are reasonably certain that the end-user could still be reached at that number. This query parameter is only used (optionally) for reassigned_number package requests. + :param verification_sid: The unique identifier associated with a verification process through verify API. This query parameter is only used (optionally) for pre_fill package requests. + :param partner_sub_id: The optional partnerSubId parameter to provide context for your sub-accounts, tenantIDs, sender IDs or other segmentation, enhancing the accuracy of the risk analysis. + + :returns: The fetched PhoneNumberInstance + """ + + data = values.of( + { + "Fields": fields, + "CountryCode": country_code, + "FirstName": first_name, + "LastName": last_name, + "AddressLine1": address_line1, + "AddressLine2": address_line2, + "City": city, + "State": state, + "PostalCode": postal_code, + "AddressCountryCode": address_country_code, + "NationalId": national_id, + "DateOfBirth": date_of_birth, + "LastVerifiedDate": last_verified_date, + "VerificationSid": verification_sid, + "PartnerSubId": partner_sub_id, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, + payload, + phone_number=self._solution["phone_number"], + ) + + async def fetch_async( + self, + fields: Union[str, object] = values.unset, + country_code: Union[str, object] = values.unset, + first_name: Union[str, object] = values.unset, + last_name: Union[str, object] = values.unset, + address_line1: Union[str, object] = values.unset, + address_line2: Union[str, object] = values.unset, + city: Union[str, object] = values.unset, + state: Union[str, object] = values.unset, + postal_code: Union[str, object] = values.unset, + address_country_code: Union[str, object] = values.unset, + national_id: Union[str, object] = values.unset, + date_of_birth: Union[str, object] = values.unset, + last_verified_date: Union[str, object] = values.unset, + verification_sid: Union[str, object] = values.unset, + partner_sub_id: Union[str, object] = values.unset, + ) -> PhoneNumberInstance: + """ + Asynchronous coroutine to fetch the PhoneNumberInstance + + :param fields: A comma-separated list of fields to return. Possible values are validation, caller_name, sim_swap, call_forwarding, line_status, line_type_intelligence, identity_match, reassigned_number, sms_pumping_risk, phone_number_quality_score, pre_fill. + :param country_code: The [country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) used if the phone number provided is in national format. + :param first_name: User’s first name. This query parameter is only used (optionally) for identity_match package requests. + :param last_name: User’s last name. This query parameter is only used (optionally) for identity_match package requests. + :param address_line1: User’s first address line. This query parameter is only used (optionally) for identity_match package requests. + :param address_line2: User’s second address line. This query parameter is only used (optionally) for identity_match package requests. + :param city: User’s city. This query parameter is only used (optionally) for identity_match package requests. + :param state: User’s country subdivision, such as state, province, or locality. This query parameter is only used (optionally) for identity_match package requests. + :param postal_code: User’s postal zip code. This query parameter is only used (optionally) for identity_match package requests. + :param address_country_code: User’s country, up to two characters. This query parameter is only used (optionally) for identity_match package requests. + :param national_id: User’s national ID, such as SSN or Passport ID. This query parameter is only used (optionally) for identity_match package requests. + :param date_of_birth: User’s date of birth, in YYYYMMDD format. This query parameter is only used (optionally) for identity_match package requests. + :param last_verified_date: The date you obtained consent to call or text the end-user of the phone number or a date on which you are reasonably certain that the end-user could still be reached at that number. This query parameter is only used (optionally) for reassigned_number package requests. + :param verification_sid: The unique identifier associated with a verification process through verify API. This query parameter is only used (optionally) for pre_fill package requests. + :param partner_sub_id: The optional partnerSubId parameter to provide context for your sub-accounts, tenantIDs, sender IDs or other segmentation, enhancing the accuracy of the risk analysis. + + :returns: The fetched PhoneNumberInstance + """ + + data = values.of( + { + "Fields": fields, + "CountryCode": country_code, + "FirstName": first_name, + "LastName": last_name, + "AddressLine1": address_line1, + "AddressLine2": address_line2, + "City": city, + "State": state, + "PostalCode": postal_code, + "AddressCountryCode": address_country_code, + "NationalId": national_id, + "DateOfBirth": date_of_birth, + "LastVerifiedDate": last_verified_date, + "VerificationSid": verification_sid, + "PartnerSubId": partner_sub_id, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, + payload, + phone_number=self._solution["phone_number"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PhoneNumberList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PhoneNumberList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, phone_number: str) -> PhoneNumberContext: + """ + Constructs a PhoneNumberContext + + :param phone_number: The phone number to lookup in E.164 or national format. Default country code is +1 (North America). + """ + return PhoneNumberContext(self._version, phone_number=phone_number) + + def __call__(self, phone_number: str) -> PhoneNumberContext: + """ + Constructs a PhoneNumberContext + + :param phone_number: The phone number to lookup in E.164 or national format. Default country code is +1 (North America). + """ + return PhoneNumberContext(self._version, phone_number=phone_number) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/MarketplaceBase.py b/venv/Lib/site-packages/twilio/rest/marketplace/MarketplaceBase.py new file mode 100644 index 00000000..9fbe193d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/marketplace/MarketplaceBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.marketplace.v1 import V1 + + +class MarketplaceBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Marketplace Domain + + :returns: Domain for Marketplace + """ + super().__init__(twilio, "https://marketplace.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Marketplace + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/__init__.py b/venv/Lib/site-packages/twilio/rest/marketplace/__init__.py new file mode 100644 index 00000000..f0276a8f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/marketplace/__init__.py @@ -0,0 +1,9 @@ +from twilio.rest.marketplace.MarketplaceBase import MarketplaceBase + + +class Marketplace(MarketplaceBase): + def available_add_ons(self): + return self.v1.available_add_ons + + def installed_add_ons(self): + return self.v1.installed_add_ons diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/__pycache__/MarketplaceBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/marketplace/__pycache__/MarketplaceBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72357561da43945af748a5a42f867c504bd02310 GIT binary patch literal 2035 zcmahKO>Y}TbauU7ubofQ(xy;FQ)q*Hs4YvVs-mhQX`n>Vq=L|cf=`_J~cY#8zz8Rhnv5RS?g(nWk3NB(AyHre4)0o^^9gqiQHb zCAW#KZxK7kwS!DzubOWg#k~20LP&wq<%Sbd%eOgwV1{&+dt8_ix9Lh7n2a%c`k_ET z5(6aJ<>BAQR4U=3eDaf8V3l_9+xy6~q<~<;VGNn_hyb;_HB^uoV`aorBMG_OGt0VC zH<3)mz*}MwWx*XD?;}8ewVqi@(M9s@$=3>CcX4U?!Bt{H|D3TCcH{!7K8O9A(0 z?=H~WNdsD&>;uyboU3Vhff;eD0RrU{sxAJld1v(q}mG4 z)YWZLhe6sJu4+7MXSiNhZEZ_CNG()zKr?`r-O{T0ZL*mF1LraPpq3ia!+?O9P3 zBVbjom>yoV||0I~$* z(=yNE5KgvdHaSdofw87Xt z-UN%gE@MSSi~&`~`GIVYFwhW!Gsw6G;Q1Cg(sJ49{niPA?P!ANqerTqoqRO+7lG|K z(<2;>XF=@UzX@zIcxh;{Scr3s*}er)>rp#!yj6iy8Be4ac?Iu_E#C-%9gK%k23|6m zTKv`krPLgF3tE*VPZ{@lP);1HV%6o2QB5=uiTAjE>i1o40)R)mnCNT>p`0E@A7TzyBm#<9bl>nMnUAqxY7 zEq_DApTYtxpp%%G*bs)L3*56C5!#iL{CgkwzWlrQuH9Y*dtQBf^yIgdU(r|`e_yFC zSY-wrI7wkhB0|7{Tfm(ua95DGZW9+d6EE<;p%D<%xy#f*6r+?S;s(qg$h4LoyfsYtR&!d%p`Z53LW!E@NL^5EHV4tfCY!JPC1$2jF> zv(8E;Q?``~$~dQarsu?XTBMIP)<3`ZaN|n+Kntbg+nbyB3dFW9pGg(j?jwb4;ZSm~f(hr7*#=!@u zPFi>YpF5{sk6(^Ib-Euq-S@3-WxepfC{agjvA|I+E6lpgbivY8@C7RhSEQjttyxu_ zu<-BbhjOr#Y9k!C&<}jmqBLVeL8)1#beQv9OFK1dls?^MX>(I^Qdgfhc}+W{K_Phd z(>TEtemKMrsuc@$gZjE3xaML*eTdYDOVo!;MB_Rt+@3m1okk6(th?>Ct~SG6Q)jFX a7eQmhcb5?I1vY-J_#}AK`vq3iS$_c0SG=+S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/marketplace/v1/__init__.py new file mode 100644 index 00000000..6a84b31c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/marketplace/v1/__init__.py @@ -0,0 +1,75 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Marketplace + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.marketplace.v1.available_add_on import AvailableAddOnList +from twilio.rest.marketplace.v1.installed_add_on import InstalledAddOnList +from twilio.rest.marketplace.v1.module_data import ModuleDataList +from twilio.rest.marketplace.v1.module_data_management import ModuleDataManagementList +from twilio.rest.marketplace.v1.referral_conversion import ReferralConversionList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Marketplace + + :param domain: The Twilio.marketplace domain + """ + super().__init__(domain, "v1") + self._available_add_ons: Optional[AvailableAddOnList] = None + self._installed_add_ons: Optional[InstalledAddOnList] = None + self._module_data: Optional[ModuleDataList] = None + self._module_data_management: Optional[ModuleDataManagementList] = None + self._referral_conversion: Optional[ReferralConversionList] = None + + @property + def available_add_ons(self) -> AvailableAddOnList: + if self._available_add_ons is None: + self._available_add_ons = AvailableAddOnList(self) + return self._available_add_ons + + @property + def installed_add_ons(self) -> InstalledAddOnList: + if self._installed_add_ons is None: + self._installed_add_ons = InstalledAddOnList(self) + return self._installed_add_ons + + @property + def module_data(self) -> ModuleDataList: + if self._module_data is None: + self._module_data = ModuleDataList(self) + return self._module_data + + @property + def module_data_management(self) -> ModuleDataManagementList: + if self._module_data_management is None: + self._module_data_management = ModuleDataManagementList(self) + return self._module_data_management + + @property + def referral_conversion(self) -> ReferralConversionList: + if self._referral_conversion is None: + self._referral_conversion = ReferralConversionList(self) + return self._referral_conversion + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/marketplace/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a902da623e59b2d185e8183aba8edc4092d42ee2 GIT binary patch literal 3759 zcmc&$&u`qu6&~(SYPr(Nk|Nuw(~NCd5+i%JD$=4*48wwz1d3xTu@xN_+f1qD$YRVT zw?k^vT?mB^0;(KxEbLR!V+{WTIriSmZtNfiVF3kt>ZMSt7zuL9dqXZwdj+Sbnj~i4 zd~e=7elu_0%-@HH3k06ezxv(goJPn$vC)6Bk#P7&5bh9@REepWDO+izswoBKw4H8b zsu?L~>}(@f%}F_H=NoEOm2%D=Y80vkDd%miQLGlFtlGnkk?M$)hwM^gv^uJg6nU4J zgaW!us? z>>Blh!NVc3GyX0#e~Se=to6sG6n%tWzkjU|PSdBBZMpOUy=I8p+;7@OoremXKluDj zPMcfnwpFLAVc#2X-(01OA1s%{5w5SSzP%7lw{3XR$k_7TXXc!)G`Ryd^xbeFTv3)@ zHhsV8EmSHlsEwv|AzCL;`@Fs>yDYiXaec~7%a=b>mrfdnvt`(JyIlAeuD`AX>PpkM zT*t6M&aZLdK?B6xlG`vWl*SfYhGiS;HeWQ&73Y1+^ATNkJRe5lW)dB_=9*hJUow0n z>UZKPa?NmzTfD&?KhjO!;2T^B!@lA=tS1JtWfZ35@GsE*6KoVtstRnDl&SFa zMrx02z^2(PRx>Mn2^txYk;$PA#h;Zs#E+GqrMAiEkPNmJ zQ@J16z_taH#Usd8enD>?m+R}=DLvh3%5cCSUv@0tGHk2EWkjsa(`eSI zyYWmQ#}*4sLl_MjGQw!(Q8bquPvbsP$3{V_HGf^t2U%~c$wihU_JHdo%i-KU#q7N!JY&;!Tl}a)FD~N5Au?sbpwPu zWSe{vtDXuwqkbGd+vI*^4`>EC=g@nHJW-qOS3*+-@EZ%Wg>(sWmy7Oz6z z|0h-P8aM>9<4}n_7C(pL8L9)ZDya^jWi+N(yetkA=v>9(c@A1)Z*@jsp%U#k!N5x_ z(W#zxs;f;srsXgE2lP!`qSxdS(O!vmRr=ECy@Je!j-of2pp!@zos-WpO{f;0BR$j8 zX1ZGC@!XZaEj^f9M$)sA^jxnr*H!0U8tF;oix!U$8gvA}x zZd1XVkToH-8hF!)&xwUFn|TXx_S82mhySES=lI3&GF47oyUJ_xm+lSD2^>4!J0^xcoq>~w5)IyO7s zoxO~@^Re!Htkb*a-a?%o>-2*{Hmlz~`yGKwPOJR&>-t!bXUuf#Ft<6s-L#xr0?(pg zJUmd#>xRe6(M3dHNCjg_O?dZ^lON1Q3Os|8H;{5`@Vt>r^FoW~)3#i~VEP3<61hdL zaxnkDbxvd(852SI1$Ia5*)V)$IJ^N96wWRN#SiMm@SiS;x1foqviA!p4$_LE{3lgZ nGEYts<O42@PVC~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/__pycache__/module_data.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/marketplace/v1/__pycache__/module_data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..231658e878cc38eda11e934a30fb53c09bdac579 GIT binary patch literal 8190 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 W97L!gGuPv8;encCpL6)8ef}>IXcN@{ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/__pycache__/referral_conversion.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/marketplace/v1/__pycache__/referral_conversion.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d62c60e623a7dac6a13b8905eae0fd9883dc81c0 GIT binary patch literal 5833 zcmdTITWl29_0D5=XV+`vVgiOj7#=Zf+Fb_+LhJZtwmD}ksbB)LB?kso4 zhFunkHYhbxk(!Uz&@lZCJi)CUQ4`*9)@l0GIGC54_$W>x%RJ)~!H8QQ7 z8U<>M#v0VNVoM@!{!=0(rb8PXaXj5}ZK_`|J^d`rQ)c?q*3T5N+b|4$;SUK&GH@b) z3b5?8HmYd|^1*3_!B;Kodb#ljWPE{t7$SNM11bC!0WMh{0*b&4qZ_dr6G857@HNVO zvKU$$2h0Ua9E{tA*Y6|11&8W`d0N^g%K9VBs>iLka9qrb@#O)hMwQ8nRUyrV*+Q%Nt?VusT78B|CIA zo{8E(AC|$Y)l6)HT$C~`r$|BzHl3uylrb~g=jO-7F6tXzv>Ua)n{NZMuoqj(D6kKe zhG@99rfe&)M#NUHl8jaiCBpN)tFMvjV-y@@`GAx3JjlBj0qwIvzT>F+mdVh#RqyY{;Dqlm?ULs6x?-bv!z=#YMB^~{vw%{2ZD7g ztvW3S%312OwZI8*)uY*Awgz52TwB-Yoxa|ocRi5l(9t7D28a5ocg}YUL*uSv(KMKx zKQvDB<3q=sGee%^(`3Q4&Y5SaH{^4R?`ClR?%aZdbdT==n$VVEHPn?V6a&pLoV?>3 zMyYSPDC_!snygcGCeOqEtLp(=A+xU@`1I19OAp(-s*3zt+eH88@fWJlL#&2~-~|uN z1&lKx3`=D)3fR)-NT&$<22iIZAvKBNDju@Z*#>|?#CHuFoT+r^zc@#Y$4+2aMXqp+ z_O2=Q!S3|T?sP?w*R@rM+}g%ALEpf16s4CpbJQ?`m|^5xdn}81+%V3Av)6hehGDyw zVK8)rK=FLW@WiYW0UmpraDL(#Tc2XqtQBUUhgNj}SIHN$9F12rHQIKwf2w23n(F-J zK$XC2HLgU(M%gYH8ANJ6$_>rJ9n>4*Tn8rr`MESn{CW?$rj*HbNR{P=iA$s`kJgiC zV;lj^H90|pdyyo-37!)s2idII_Y!Il^2Q1fLbxQ>0W$S*?)_G&YAGK|>d-r{M^v=Bgk~y_4)Hc;MN8nM><&aj3KSROP8r<*89?de*B3@P)KmH9s{ zgtInSPs9d{$@PZH!{0L{KpwGK2TW(r0jOoSCf9xQ+4kBOMxt#^A%9(BLcJd40uHuYyo!XFxU4z?8ZRVS3fL@?Ki1dWDgF$|YE|Ja=)-nd z_Hit4qjkrw6X1!rPN$JPFDtfER%~fM_8_Jr21OCBxulI^pk31J5RB!w-o+hdxvcy; ze5O;40nEqYD&j-FO%4_dbbgyzD8Mz4C*SUi$qN@QB!^v=OOCND&Erkmo^Nj+ zGU~bcAe^==TJQt)#PL&u(`pdTQGdj>0|g8-P;JvUgUARqZ79wY5gs2HswR-#VW+BeGdP}St1M*5GXOmS6KId`rj{y7~WA`(gcjx9$T0d@m(AhK7*|XHVH@*z! zy)pJ=RU5BF!TRStyr2I#{e1cj=`&qQ?^8e9_D#SSl^HN%>79V#w}MjYKQ7o&0xK8m z3=8Jc>ZwlD=+|ISy+)6d_Jg$=y>&^A&ahZ$D$x0*3u|JA0f(V}M7@rSvX>F;1;FnP zwaWYzBqG4D=3x+8R+&dbFW!tiCh(}NUmrRoJ?wd>q98IG-BAr8Qh8}LdN_2Dm+bfy zPDv7oVdyd82$#dZ0TXDROaK4? literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/__init__.py b/venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/__init__.py new file mode 100644 index 00000000..297d5dd6 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/__init__.py @@ -0,0 +1,438 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Marketplace + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.marketplace.v1.available_add_on.available_add_on_extension import ( + AvailableAddOnExtensionList, +) + + +class AvailableAddOnInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the AvailableAddOn resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar description: A short description of the Add-on's functionality. + :ivar pricing_type: How customers are charged for using this Add-on. + :ivar configuration_schema: The JSON object with the configuration that must be provided when installing a given Add-on. + :ivar url: The absolute URL of the resource. + :ivar links: The URLs of related resources. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.description: Optional[str] = payload.get("description") + self.pricing_type: Optional[str] = payload.get("pricing_type") + self.configuration_schema: Optional[Dict[str, object]] = payload.get( + "configuration_schema" + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[AvailableAddOnContext] = None + + @property + def _proxy(self) -> "AvailableAddOnContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AvailableAddOnContext for this AvailableAddOnInstance + """ + if self._context is None: + self._context = AvailableAddOnContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "AvailableAddOnInstance": + """ + Fetch the AvailableAddOnInstance + + + :returns: The fetched AvailableAddOnInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AvailableAddOnInstance": + """ + Asynchronous coroutine to fetch the AvailableAddOnInstance + + + :returns: The fetched AvailableAddOnInstance + """ + return await self._proxy.fetch_async() + + @property + def extensions(self) -> AvailableAddOnExtensionList: + """ + Access the extensions + """ + return self._proxy.extensions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AvailableAddOnContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the AvailableAddOnContext + + :param version: Version that contains the resource + :param sid: The SID of the AvailableAddOn resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/AvailableAddOns/{sid}".format(**self._solution) + + self._extensions: Optional[AvailableAddOnExtensionList] = None + + def fetch(self) -> AvailableAddOnInstance: + """ + Fetch the AvailableAddOnInstance + + + :returns: The fetched AvailableAddOnInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AvailableAddOnInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AvailableAddOnInstance: + """ + Asynchronous coroutine to fetch the AvailableAddOnInstance + + + :returns: The fetched AvailableAddOnInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AvailableAddOnInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + @property + def extensions(self) -> AvailableAddOnExtensionList: + """ + Access the extensions + """ + if self._extensions is None: + self._extensions = AvailableAddOnExtensionList( + self._version, + self._solution["sid"], + ) + return self._extensions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AvailableAddOnPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AvailableAddOnInstance: + """ + Build an instance of AvailableAddOnInstance + + :param payload: Payload response from the API + """ + return AvailableAddOnInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AvailableAddOnList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AvailableAddOnList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/AvailableAddOns" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AvailableAddOnInstance]: + """ + Streams AvailableAddOnInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AvailableAddOnInstance]: + """ + Asynchronously streams AvailableAddOnInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AvailableAddOnInstance]: + """ + Lists AvailableAddOnInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AvailableAddOnInstance]: + """ + Asynchronously lists AvailableAddOnInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AvailableAddOnPage: + """ + Retrieve a single page of AvailableAddOnInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AvailableAddOnInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AvailableAddOnPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AvailableAddOnPage: + """ + Asynchronously retrieve a single page of AvailableAddOnInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AvailableAddOnInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AvailableAddOnPage(self._version, response) + + def get_page(self, target_url: str) -> AvailableAddOnPage: + """ + Retrieve a specific page of AvailableAddOnInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AvailableAddOnInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AvailableAddOnPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AvailableAddOnPage: + """ + Asynchronously retrieve a specific page of AvailableAddOnInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AvailableAddOnInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AvailableAddOnPage(self._version, response) + + def get(self, sid: str) -> AvailableAddOnContext: + """ + Constructs a AvailableAddOnContext + + :param sid: The SID of the AvailableAddOn resource to fetch. + """ + return AvailableAddOnContext(self._version, sid=sid) + + def __call__(self, sid: str) -> AvailableAddOnContext: + """ + Constructs a AvailableAddOnContext + + :param sid: The SID of the AvailableAddOn resource to fetch. + """ + return AvailableAddOnContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64c73789faab218b51f1066865164f4f60d95ae8 GIT binary patch literal 19687 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 a)gbPkXuc!hc4v*^#zXrD@TU;DVE-TAnAiFM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/__pycache__/available_add_on_extension.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/marketplace/v1/available_add_on/__pycache__/available_add_on_extension.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..835d05323a28a06878e0974aa5a40df9969fcfab GIT binary patch literal 20220 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 "AvailableAddOnExtensionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AvailableAddOnExtensionContext for this AvailableAddOnExtensionInstance + """ + if self._context is None: + self._context = AvailableAddOnExtensionContext( + self._version, + available_add_on_sid=self._solution["available_add_on_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "AvailableAddOnExtensionInstance": + """ + Fetch the AvailableAddOnExtensionInstance + + + :returns: The fetched AvailableAddOnExtensionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AvailableAddOnExtensionInstance": + """ + Asynchronous coroutine to fetch the AvailableAddOnExtensionInstance + + + :returns: The fetched AvailableAddOnExtensionInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AvailableAddOnExtensionContext(InstanceContext): + + def __init__(self, version: Version, available_add_on_sid: str, sid: str): + """ + Initialize the AvailableAddOnExtensionContext + + :param version: Version that contains the resource + :param available_add_on_sid: The SID of the AvailableAddOn resource with the extension to fetch. + :param sid: The SID of the AvailableAddOn Extension resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "available_add_on_sid": available_add_on_sid, + "sid": sid, + } + self._uri = "/AvailableAddOns/{available_add_on_sid}/Extensions/{sid}".format( + **self._solution + ) + + def fetch(self) -> AvailableAddOnExtensionInstance: + """ + Fetch the AvailableAddOnExtensionInstance + + + :returns: The fetched AvailableAddOnExtensionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AvailableAddOnExtensionInstance( + self._version, + payload, + available_add_on_sid=self._solution["available_add_on_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AvailableAddOnExtensionInstance: + """ + Asynchronous coroutine to fetch the AvailableAddOnExtensionInstance + + + :returns: The fetched AvailableAddOnExtensionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AvailableAddOnExtensionInstance( + self._version, + payload, + available_add_on_sid=self._solution["available_add_on_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AvailableAddOnExtensionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AvailableAddOnExtensionInstance: + """ + Build an instance of AvailableAddOnExtensionInstance + + :param payload: Payload response from the API + """ + return AvailableAddOnExtensionInstance( + self._version, + payload, + available_add_on_sid=self._solution["available_add_on_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AvailableAddOnExtensionList(ListResource): + + def __init__(self, version: Version, available_add_on_sid: str): + """ + Initialize the AvailableAddOnExtensionList + + :param version: Version that contains the resource + :param available_add_on_sid: The SID of the AvailableAddOn resource with the extensions to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "available_add_on_sid": available_add_on_sid, + } + self._uri = "/AvailableAddOns/{available_add_on_sid}/Extensions".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AvailableAddOnExtensionInstance]: + """ + Streams AvailableAddOnExtensionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AvailableAddOnExtensionInstance]: + """ + Asynchronously streams AvailableAddOnExtensionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AvailableAddOnExtensionInstance]: + """ + Lists AvailableAddOnExtensionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AvailableAddOnExtensionInstance]: + """ + Asynchronously lists AvailableAddOnExtensionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AvailableAddOnExtensionPage: + """ + Retrieve a single page of AvailableAddOnExtensionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AvailableAddOnExtensionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AvailableAddOnExtensionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AvailableAddOnExtensionPage: + """ + Asynchronously retrieve a single page of AvailableAddOnExtensionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AvailableAddOnExtensionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AvailableAddOnExtensionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AvailableAddOnExtensionPage: + """ + Retrieve a specific page of AvailableAddOnExtensionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AvailableAddOnExtensionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AvailableAddOnExtensionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AvailableAddOnExtensionPage: + """ + Asynchronously retrieve a specific page of AvailableAddOnExtensionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AvailableAddOnExtensionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AvailableAddOnExtensionPage(self._version, response, self._solution) + + def get(self, sid: str) -> AvailableAddOnExtensionContext: + """ + Constructs a AvailableAddOnExtensionContext + + :param sid: The SID of the AvailableAddOn Extension resource to fetch. + """ + return AvailableAddOnExtensionContext( + self._version, + available_add_on_sid=self._solution["available_add_on_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> AvailableAddOnExtensionContext: + """ + Constructs a AvailableAddOnExtensionContext + + :param sid: The SID of the AvailableAddOn Extension resource to fetch. + """ + return AvailableAddOnExtensionContext( + self._version, + available_add_on_sid=self._solution["available_add_on_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__init__.py b/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__init__.py new file mode 100644 index 00000000..8fedfb9b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__init__.py @@ -0,0 +1,694 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Marketplace + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.marketplace.v1.installed_add_on.installed_add_on_extension import ( + InstalledAddOnExtensionList, +) +from twilio.rest.marketplace.v1.installed_add_on.installed_add_on_usage import ( + InstalledAddOnUsageList, +) + + +class InstalledAddOnInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the InstalledAddOn resource. This Sid can also be found in the Console on that specific Add-ons page as the 'Available Add-on Sid'. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the InstalledAddOn resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar description: A short description of the Add-on's functionality. + :ivar configuration: The JSON object that represents the current configuration of installed Add-on. + :ivar unique_name: An application-defined string that uniquely identifies the resource. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the resource. + :ivar links: The URLs of related resources. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.description: Optional[str] = payload.get("description") + self.configuration: Optional[Dict[str, object]] = payload.get("configuration") + self.unique_name: Optional[str] = payload.get("unique_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[InstalledAddOnContext] = None + + @property + def _proxy(self) -> "InstalledAddOnContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InstalledAddOnContext for this InstalledAddOnInstance + """ + if self._context is None: + self._context = InstalledAddOnContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the InstalledAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InstalledAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "InstalledAddOnInstance": + """ + Fetch the InstalledAddOnInstance + + + :returns: The fetched InstalledAddOnInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InstalledAddOnInstance": + """ + Asynchronous coroutine to fetch the InstalledAddOnInstance + + + :returns: The fetched InstalledAddOnInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> "InstalledAddOnInstance": + """ + Update the InstalledAddOnInstance + + :param configuration: Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The updated InstalledAddOnInstance + """ + return self._proxy.update( + configuration=configuration, + unique_name=unique_name, + ) + + async def update_async( + self, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> "InstalledAddOnInstance": + """ + Asynchronous coroutine to update the InstalledAddOnInstance + + :param configuration: Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The updated InstalledAddOnInstance + """ + return await self._proxy.update_async( + configuration=configuration, + unique_name=unique_name, + ) + + @property + def extensions(self) -> InstalledAddOnExtensionList: + """ + Access the extensions + """ + return self._proxy.extensions + + @property + def usage(self) -> InstalledAddOnUsageList: + """ + Access the usage + """ + return self._proxy.usage + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InstalledAddOnContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the InstalledAddOnContext + + :param version: Version that contains the resource + :param sid: The SID of the InstalledAddOn resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/InstalledAddOns/{sid}".format(**self._solution) + + self._extensions: Optional[InstalledAddOnExtensionList] = None + self._usage: Optional[InstalledAddOnUsageList] = None + + def delete(self) -> bool: + """ + Deletes the InstalledAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InstalledAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> InstalledAddOnInstance: + """ + Fetch the InstalledAddOnInstance + + + :returns: The fetched InstalledAddOnInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InstalledAddOnInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InstalledAddOnInstance: + """ + Asynchronous coroutine to fetch the InstalledAddOnInstance + + + :returns: The fetched InstalledAddOnInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InstalledAddOnInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> InstalledAddOnInstance: + """ + Update the InstalledAddOnInstance + + :param configuration: Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The updated InstalledAddOnInstance + """ + + data = values.of( + { + "Configuration": serialize.object(configuration), + "UniqueName": unique_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> InstalledAddOnInstance: + """ + Asynchronous coroutine to update the InstalledAddOnInstance + + :param configuration: Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The updated InstalledAddOnInstance + """ + + data = values.of( + { + "Configuration": serialize.object(configuration), + "UniqueName": unique_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def extensions(self) -> InstalledAddOnExtensionList: + """ + Access the extensions + """ + if self._extensions is None: + self._extensions = InstalledAddOnExtensionList( + self._version, + self._solution["sid"], + ) + return self._extensions + + @property + def usage(self) -> InstalledAddOnUsageList: + """ + Access the usage + """ + if self._usage is None: + self._usage = InstalledAddOnUsageList( + self._version, + self._solution["sid"], + ) + return self._usage + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InstalledAddOnPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InstalledAddOnInstance: + """ + Build an instance of InstalledAddOnInstance + + :param payload: Payload response from the API + """ + return InstalledAddOnInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InstalledAddOnList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InstalledAddOnList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/InstalledAddOns" + + def create( + self, + available_add_on_sid: str, + accept_terms_of_service: bool, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> InstalledAddOnInstance: + """ + Create the InstalledAddOnInstance + + :param available_add_on_sid: The SID of the AvaliableAddOn to install. + :param accept_terms_of_service: Whether the Terms of Service were accepted. + :param configuration: The JSON object that represents the configuration of the new Add-on being installed. + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The created InstalledAddOnInstance + """ + + data = values.of( + { + "AvailableAddOnSid": available_add_on_sid, + "AcceptTermsOfService": serialize.boolean_to_string( + accept_terms_of_service + ), + "Configuration": serialize.object(configuration), + "UniqueName": unique_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnInstance(self._version, payload) + + async def create_async( + self, + available_add_on_sid: str, + accept_terms_of_service: bool, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> InstalledAddOnInstance: + """ + Asynchronously create the InstalledAddOnInstance + + :param available_add_on_sid: The SID of the AvaliableAddOn to install. + :param accept_terms_of_service: Whether the Terms of Service were accepted. + :param configuration: The JSON object that represents the configuration of the new Add-on being installed. + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The created InstalledAddOnInstance + """ + + data = values.of( + { + "AvailableAddOnSid": available_add_on_sid, + "AcceptTermsOfService": serialize.boolean_to_string( + accept_terms_of_service + ), + "Configuration": serialize.object(configuration), + "UniqueName": unique_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InstalledAddOnInstance]: + """ + Streams InstalledAddOnInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InstalledAddOnInstance]: + """ + Asynchronously streams InstalledAddOnInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InstalledAddOnInstance]: + """ + Lists InstalledAddOnInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InstalledAddOnInstance]: + """ + Asynchronously lists InstalledAddOnInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InstalledAddOnPage: + """ + Retrieve a single page of InstalledAddOnInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InstalledAddOnInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InstalledAddOnPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InstalledAddOnPage: + """ + Asynchronously retrieve a single page of InstalledAddOnInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InstalledAddOnInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InstalledAddOnPage(self._version, response) + + def get_page(self, target_url: str) -> InstalledAddOnPage: + """ + Retrieve a specific page of InstalledAddOnInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InstalledAddOnInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InstalledAddOnPage(self._version, response) + + async def get_page_async(self, target_url: str) -> InstalledAddOnPage: + """ + Asynchronously retrieve a specific page of InstalledAddOnInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InstalledAddOnInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InstalledAddOnPage(self._version, response) + + def get(self, sid: str) -> InstalledAddOnContext: + """ + Constructs a InstalledAddOnContext + + :param sid: The SID of the InstalledAddOn resource to update. + """ + return InstalledAddOnContext(self._version, sid=sid) + + def __call__(self, sid: str) -> InstalledAddOnContext: + """ + Constructs a InstalledAddOnContext + + :param sid: The SID of the InstalledAddOn resource to update. + """ + return InstalledAddOnContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89734b7b6bc80a87f8abffd801d642de8e3c3e95 GIT binary patch literal 29552 zcmeHwYj6}-mS$#E)>Dtt`wgT3feKIwuno3&w8g`2##q=0>>e4rx~NJ)K|SQm5+GT` zx(z!mcI>g)nQ7#S-Zh@?Xrr-bjC&u(8yoAUV`Im&8yj2I@`e<(b~F<+KXx}ZHp*Q% z?B>^g=ibb$tWp(5HlFe9I6*h>`*HHzbI(2Jo?HK=rp7DadFfZ*KmN*5LHHXA7>`5u zxO>DM_l$U09x3LH zSB+G~t4FHiH6t}F&JnAP`$l}s?~K*O>qqLD-xX_!H;yzizdP0xZysr8eow3=-a69C z{N7kwynUpd`Kw|b@y?M>QLqUQ3z6#cLZn8if78zUJ<`QuYZ2>Hd}i!27F&nddZpEj zUCv?~5ZkCUnz1V;n*7b7|0@cDSH^SbcvO?a$%rDK4r%f+C84OHloFATPEc|%7?cbD zD1xGbRFJ*7vnZ(NvSgups8}$_TAh;RDf1tqDS-dT!c&4lieW)=sL81#h~d6qu%CQ- zB|N&{tT#Bt3iGUbK2*-Dq|DS^1fM2{8a!guE6dad|8L|!;^kmE9gRhka-aNYNIj{f z#$utc!V?I7_@6qi$YbM2W6`jDi03`HcleMz_}IPxuVLuGp}hk-xMLxW6$*`~l0`6= z4~!`Zl#w6iA0nv+SS!a2trgjpl; zP+~k3i%kT)|BEolFJ|2leBV?wuJ~P9`(R=sEA5GfQ(0+$R7+*u2gXv-WFi#HIu0k` z$-4KY2qBVcwq{V9NQ8}`-=3|CD4L>1L$TpPbjK}#*rjF7CJ^*I$5z;Oo-ABO(ZZEh3KCJ(wgBn<7Q*ibHWKu2EY%vPUGv ztvJay>YNrv#fam4&4@?wMw%k7^U|Aog(FoFr&2v?i@48ABQ?6;1AlF#IpW3Jhj$g; zbxQq-)p{Yzt9&f#t5zD7CZ$R5OASI!Gvth*Pm$X5j*;f_<;%z3QLR4I+JaF!l~&}h zvy8Nj#kM21-V)n^oKD0wV2qv9!WnU-Ygq8NWLt_qi}C40-;s3UGY~x$Qe`a~p^2f$ zR!v|B_BX297gS_pgEA?eS75OC@cNcAWwX{*ONjklkxsYGOYDS zL-Bsh>wdi^Kkt?~a`d9oXxZH7-56D)N+J@Q2qr>tg+tT|%8BGShNMN0B|zQ*OibUf z8U<)*kS6pj_3;dhAPmTZvUWVFru0%Q(ikF#%34hx9Z!Tg`G}@Kafr_Ho`sW%(de;p z5E9H;-m~8sJ}@LFkDgG%M6U1+RAmgE!1v`)509%V0$7?XMXALo(G;Qt`q!|w!x2ay z{~$j8*cb>hYqc+;j7DkXR*>-gu?YjQq6%-kEHr?GLH&#HArK*zL%=Gcri5A#KYB<$ zeO%!(`_8kI(%@yfi(tvtb>U~ z6DKuZ1UWUzswy!Wnu(wq&!2Uj;)_JqH5QtPB}0*{9n&ui%3?mm>k;3SkJtp^kHt$u z%1pW-O$jd{eM)>2ivc~NFl9SoaECmKxe+tRln~UpFqA8w*Jjj)yk<`-#*c?eL-HQC9knO3aLh;)QKj;S9n)w)n(LVya9nKqtutG(QVXZyisGd zQDcQ(cr1Bqz96sHlDF2#8xg1MXGEKml@jxy2~hNwx)=@WveU%EL+W{woWY#$_rQ_EU=Xz$?!~(1x;mc${NJXkYUSPcY zPi^Wqmw{j?5(y>~{l?$}V-so*nx0%yykxQvc+r57u@9NFTW~&qUbyKLJhc~G8F$-E z>xb^{8!P>9tbcv|6=iPaz0=Z*?uB)m-d;bu{%U+~-JWUbLwDQ4hI`(AWcHD3zPSzG zrHGEjIR*ybU;p0vUnJ)So+zK=qmA3=Lg zY5VOm{J^{G-&ud{*xcra&}}br)HJ+u&p-dp%<9*AU+vA=Z5^ol#ahG< z?3|Wfs>x&YLe{A&sc|(C)+r&y3H0$8?K}_9C7KNsTk<^bPZcPlaKfZ`g>2<#QA8wM zdCT@D=rTQ+Mcl*u^QNZ7zaMk?)g zLt~7aOOBcqV*1e1N^B=M(r9vAlS7P^(E{>dELLblkCj6zwtH&wOcYBKcqw9`^cMJT zk9s-4;fe*V7!!9Fbrc;cPBswL>>Qg}vm$%>CDjioWt)r3=v9IQ=*yzoi(DwP4lj*9 ztgLRJa?T+2dSY@}ae1T708f61N<9GQc_CLPRM)+{V%0;$fQ5U zHVZf)-g?%A${r=Aq;!6*{9wH0KE)vwJB;Wk_*g0~YvbXtqC~U}@sK++i!(4M<-WN!_18HC2 zmbwjD3v651N*`&xrEq>boTU(mDRIj7mT0WLpsTjOzK%7*1oL6GoxCkH8MeV07z?SP zc=0ZMKz;&3!HB$Qi;oqOR$0q}S&$0I8t^+Fl9e-KNezg8lnZ$vutIc> zB0nuVAmVD$Zh7&5N;ba{@dORAeY#KBgv5K@lQ{WJ9ooMNgNVGf{WBZO@~jFcur|k-CncvS9#0>^%{J~&gdn_5oE^cSQEb|U^ zo#b6?R{yGF_?ZOhM{-8m~|r4z|$f^E684hXQ~n)(Fl!*Wd9@2m^_21zC~!WDhRC1D-!^=;%- zJOd$&Mw@2L#%iIlxS?aTP~ zeXw@UcQEZf$k5v_62&C?qi%v@_*=-ojQT<k-TLuqq-gD*ntRCL^&@Z(2;-6Al zZnNO5{f({Ku`F+gFGs#ym&>twM#>9#T-kzGBT3EO7 z?G3XVK5^AKyf<3AW}dkG#LP39)(traA|Qrq>72RevU6rzrg?3S@<4>*U77cgulK80 zv6}T*a;!;rZT*daw>}2=fJrnO$RFUdN^+7o?M1v}liKE=7NYloB15eX$M;`U@M=QJBk;4XkoGO-4kD z((*;qx8(V$_y?rrFjFFECrJHZ4+}Ys(1hLZn7n2#)cc@*;0Hp=@YTAE(y}`7y`wI% z#IBKR^!Rp-Xl5u1RXnjfhOW?TNZ+oNQ@9rsYO^S9{W!nJ6^OLhF^TGAOMh_@t^YaH zi`7Z+yVTVfDWhzRx-+t#m4f4HG+PxcFia4uGCl*+S)%xbZ^L%Vr9*qbd=_YE6bQ2&EB-FPG^PBHYH*J`2x+g>b_g;;>n|LPy4@CW*8@r$h zAce&PJ0S3{;**)yfkmr4vCa7@IM9>otcg&Ty@?71)}=fKm1AdsnZgNE$B1V1XG(+~ zfZE1`$zWG$rOP_^?A^cj&|a_w&bX2~o`iOnVD37ugd)Hazk{zIw&bX~8Tt7Nqr#`J zx#}eR*7cUp|Smv|Du0p*B|yxyKeXzNvu8ZTb1#xx^n-u zruW<5YyaTkv~Sg%?@-!(s5}RG4prr6;BdC-?+d8dE88pVl_iyA{OT!kPQw|};i^7I zF$}P5)h58Igc?NaX6 z-O_(T!(lxq?V!d|S^L9#53vu*2%NeRxlxEXF3Xo?tQh;Uj9X&*B3(#ClZWYai&$~S zyiJyz#4|oPlZyTg%4tu-Sv-Tf0@JQn+!=TKjfR#>eHZ)Y8+tMgJy#B2liv5d=lNi3 zx}k@$uYc?7S%ALj(F>14D@w|y+KaU_VRQL*-+qvC6@Pp61;iD9 zZ^~6FEhzfle13mM1*x*K^Skij+qzz>d9`M~ZBwRg(?Vn0OysrbtI?~inCb1CG1J>= zrZ;-0T{oddT=PXpkncDPo(#aZ{o-5eYtrPIbzxkta;rfz0|7ah9hSQ}!tds6s3U zp0kdWd0M3cm2x1yj_0bW9E@t)eMIcslG!K*eRN*i?hB5h7Zk3>KQbmPQb}ZIF=G(OSuJ^ zJr+Vn^iqwHvzeT|izK{6m}DS5=O1z0U(jAbF;KZK zp|0iSi3<~d+r4hSdsC)+)78GY?gtl^`#*8mYijd$M;#7a+{CWk%1x}?3tCv4aj&>h zm>dRGT$5>7v(VT+lX`99)rl*qYfoZ&G_J+;FlWZ)$Q$w3<5!>j#p=HdTo0rleT||1n{4DUWS>P?q0+aMssow>d)qhIP zG&vW@G0|E5XB7N>IQ&c)UxjajyiDX#jJ)bgD6W-aC}pg~cUdLceT1j~5}7$&zH6vz z(DBWgw#}ue+J4U>N?sXXi)i@PT|MIU2gF^gr0WCg;4k9mh!zuG=V_6uBtd_^_p6*n zGNhGvbQZ~`K7x)gqJ%A0a1^81l*7669`N;J6uz!dqJ zjIS~PnUKE%^U3z!ze})tpa8pF-X6X?II69A$c6ZzcZ0Aug zti`?oiU9R-0@gt|i)P4OmeZ?;s3khPq&^9!m^XY1F_W7r2{9_l<4@uvsYj?v+9phH zydz<|K2J#2u0BI$LvV_=qG776qDY1JMj`wl;ldq?(Ff;!-_7{G`$6lR@A0(zafTfJ zb~QpBP{$-LD# zr6%B5<=iB#VA8{XLkTiQ2sw97s&nkT?8*svT?v0muiR>{u)K zYH)bdt$ld`?_6&a0;?X#3wY-?mI|PkJAPLz7GhIOsT7;VL5wZuJe6h28{v%kNV+di1juR`rr04% zcIc928>HA^*&)4kF$uRVBEj#TaQL0shT^$Ec5D1tG!wR&;#gEqZ82I*Db{TW7;$Sp zq|$?}h8~Npzc`sPWuUvpqp?WQ30Rm*6!(IKa0GUd%vHCU7?2<1#uFqa9fRQ$DF~A| zpaYpJtPstnpf6&mOwfU!$vElEw{;R`t8wTY2hh32U#V7$;1RH9c$TJPGwJ{rU5yQ& z!6wZ4cBI`q7L#J+H9I4uc^k~UHK@1owt1V(yv*S84)by|$|bd!z{%Lp_lq%^;8+mT(Kgosm|S-i7owgqK;u z?FcVNSs36(I^bWy)MPS9UsoxKB?DikX$f1YCQ(-UW0br^VFnRvsnHjyC4y%82^-7| z#!RwzTXhySzlg3bMVDnZGg()vff|AyWHkoCnFk-WDsAZZxfdYRJQ=TDB=<7`y6rHDuJ9Z4EKOauBxQaV?k}4Z@h`6pVKY zf;M)xAWRg{c!*%K53vhPTbH@=i`*AT9!v?FB_AWOJ@my^#k?f0??c zT$ZKZ9r6KBO{Ce)tfI@PSu3vj<-RPpwX~Qke)d62Vk5$gQUfGS{q=_p~5(opp0c^<%1^ zP7+#(#ETRx$X;mz8zbRd(N7RF*Q5=F{y-A?@*sX`%Y3REP;~XfK?t=D4IEKPN_wZ~J}Sq1sKYIpUCzpN8?t(SgT-w8jNsmG(KtY-{c zaB!28N|92QNF-wu39^+$`{m3+tw)T{(h&?Ru|-|tQhFAp#l@Z*GVv(xQy)q%=)+g91V@X971zw2V z$VG=}* zAtOR-Q|xTrcnp`WkVP{$ScaWcaThnpxI+iVO5o(oZXpm?;z@O)&=ITo5lW7$Duzl}Pefvs#^%H8FEQ9xB%@cDO~RF_3i`E+g2$uX&;Sws3wK zmRv9qAJ+;73&q`~5HZ8Jfrj;jTZ3Wb_iaRlZ1CvkzESF**%j)qer1i>-Nn@&9Zvz5 zIAjY2@VyvL_4;|&LMfa{AHzL61mO^@;Evy}tGqU{PGh}}CtIh#)JZWhH`G*2xDv>)^a6(mDL){{tM(6;>cn)>3-uFGm8wV-+0;Trx?N zib*24u2qcda)d}IVSc|7u8RZpTS`eJ`&&x6n3NeY-%?7tZV{w+iIh_PGf;&gE1^{1 zL`>GpmXr|Pr;x4YlTc?@{{qRSH1X$%E6br;OMXt2k#xe0L#;?0akMvhF?i+F)svb2 zU9SY^ns?9pc3bG9KjZUXS$)-c_4GTwIp2e6_k(0ZyhpsH(V4Xu?i*YtzAFxPO4nAy zSHv{ZZkXs{p0uo1*&=9X1v*)t`yt=28Mx;ea$k=7H4oOfRq4xH<>N!i-me%lTUUu zx8<~8G+}Z~ep^DN&H`*`SUaSTS(}X|I7UVf=ABHP3-)Vs{Hug}Rl}wZ{HZ<68sRrAQ zRY37?sfJu`lSYVhn=RTmoocB68uM?+FRH{dU~je#uL2#RTjki+Rzft1NdiGI)#G|ptK6V|SuU$Zr{W~)g-*4_^avbGkNF?82{=5W?|aX6yR zd!wc6H+G?>F=s>c=Q)c1{5O<<;}jn6Z<+VE8rj6W(7H{0RSZaf;@l=)wr!FARNCzP znYhvWhJCa1&!jEVUx?eptKw$o&&4g$zjALAbyg~sJgFqIRgA6TQjDToM@`=3f1?R2 zZ&FV0NQ8@oR6jQLmS?3UX)0k_JLNF-lLYIMr<`Dm=_g4#S@J;O<*?`{onL6P7Ek+`ISXo<^6HW;!YCeXTXqh&az5QRoj8GL5DFq!n216CXG zg|lu752FudrQJV3mRYOSg_A*0V|qHj(;@&T;R_R_aAhBzV48LDY5yK2{X24)w8qr) zW!=WXGR=ilq62ui_=Q9=Wx0njboU{e{S(Lm?m;#*eaq;cp@puVPh1i)4w%z0t}snC zi*$Jf%ZkRwQ<-tg;&G zj565~ClLM4G#=A`mYKb^or2fco!gDwb38(`;AY zhcmQzYQIBiDmmNWw zHOQxL2iXmFklkQ~Ih=DL#jp}wxl0tUuNDWtBVF(5gg@(raTy&+g>72V5i*+d;P-|6 zAHb=olENTMpK`Y;lwE&eWo)dRFbnk<^^}+V7H-nv5)12mv#zqnZy3;rsJu{^0tTx} z>dUXQ1rXxCyvOz#KTLupmaclI)sf_Ry4nP>x{#kuiLbEAF*{dStJ9K%n^}`_Y;m(r zeqD6dr8mdWcve3+_aBi{{Uw~DEo|0J2tW`kHEd?wsF65L7){6ep$cdaaQ7`+QPyS} z*UmQvGL3=x#x0q~Emy~{otSIfH|_q&*IjNcv0@D2*g5>=Nor?qZQ(C{%5jZf2G2n6 zi>}OD8s3@o9$R56{@sS&|D!`kx;=rhNdF1nQ2k3d*%}=ab%84*tAB-rVjQeB&`jSK zm0ZwPgo!-M9}zz8K}CFT)F5;$=Tx#U)804Ves8Az-ud=jnf6`3xbK5?bM1%c8xNPk zN@9SXFr=;b4mOJaRvfIC-tB~sS!R_dinMdGZfiiatcZG9=4bNn9>moDMtx0_lPT#WUDt(c&T#WpS(;@eUO{)& zUr_~paEgq@5atUUQK6;VQV>9vU`xT^XV_9)rC!mcD6Ch0+t84|Ta8dyA!n4FdUATm zVTW&+!PIdIo*;+zt^5QIGfDXg1%E~kZ7{NS$jwz+P?`Kv^^))BhqD_jibp(tbOPOZ6TS z1$p(tsVN_*!S|7tZD!@T0FyT{F8c?#NLJ`s-~-H}qya{=A36TMESnMN7Fs zG7T#fL=YugVQZH01gIn;%%W|$9?fVGeoH|Lp9OELH@#VBMg zM&SVgx3P82cIlV0E%XN7uAZ&_#Ipj!ZEBxcHFIiaeWqzm&VdM2RdhESMY#p!YMdFJ z>BLqtN5$}=yj}S!@;xMeowe^0y^d{{@5#Y_Z(Dl(4zlChmTQA^MdNW>_vvv?$BtJJ zhgW*Vy<|DGgDi)3%TmENOwLZXRa*jEG97%a4l$PHp1dq*K?r5yYa1 z!rfoYVl%tzD^J0=zd;~28CubK$ z@e^CMD1F)`h|7O1?4K9*XN3K~7Pe%BEguW_e=H1qENuQ*So^Wi{i)3++CFu{x#=CY xiNj)gS>H{8`EJIf(>4(nlLu}J%yTp4s1vu(G~E>Ny16DLA<*@yKyTKo{|Ak011bOj literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__pycache__/installed_add_on_extension.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__pycache__/installed_add_on_extension.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba0cdded994593a7f7ef5a5fa1840b05fe750fa0 GIT binary patch literal 23008 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 I4-=063wuZi)Bpeg literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__pycache__/installed_add_on_usage.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/__pycache__/installed_add_on_usage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4a2f1190ff8256bc4e5a574ba85f02f388ad2d1 GIT binary patch literal 10013 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 "InstalledAddOnExtensionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InstalledAddOnExtensionContext for this InstalledAddOnExtensionInstance + """ + if self._context is None: + self._context = InstalledAddOnExtensionContext( + self._version, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "InstalledAddOnExtensionInstance": + """ + Fetch the InstalledAddOnExtensionInstance + + + :returns: The fetched InstalledAddOnExtensionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InstalledAddOnExtensionInstance": + """ + Asynchronous coroutine to fetch the InstalledAddOnExtensionInstance + + + :returns: The fetched InstalledAddOnExtensionInstance + """ + return await self._proxy.fetch_async() + + def update(self, enabled: bool) -> "InstalledAddOnExtensionInstance": + """ + Update the InstalledAddOnExtensionInstance + + :param enabled: Whether the Extension should be invoked. + + :returns: The updated InstalledAddOnExtensionInstance + """ + return self._proxy.update( + enabled=enabled, + ) + + async def update_async(self, enabled: bool) -> "InstalledAddOnExtensionInstance": + """ + Asynchronous coroutine to update the InstalledAddOnExtensionInstance + + :param enabled: Whether the Extension should be invoked. + + :returns: The updated InstalledAddOnExtensionInstance + """ + return await self._proxy.update_async( + enabled=enabled, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class InstalledAddOnExtensionContext(InstanceContext): + + def __init__(self, version: Version, installed_add_on_sid: str, sid: str): + """ + Initialize the InstalledAddOnExtensionContext + + :param version: Version that contains the resource + :param installed_add_on_sid: The SID of the InstalledAddOn resource with the extension to update. + :param sid: The SID of the InstalledAddOn Extension resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "installed_add_on_sid": installed_add_on_sid, + "sid": sid, + } + self._uri = "/InstalledAddOns/{installed_add_on_sid}/Extensions/{sid}".format( + **self._solution + ) + + def fetch(self) -> InstalledAddOnExtensionInstance: + """ + Fetch the InstalledAddOnExtensionInstance + + + :returns: The fetched InstalledAddOnExtensionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InstalledAddOnExtensionInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InstalledAddOnExtensionInstance: + """ + Asynchronous coroutine to fetch the InstalledAddOnExtensionInstance + + + :returns: The fetched InstalledAddOnExtensionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InstalledAddOnExtensionInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=self._solution["sid"], + ) + + def update(self, enabled: bool) -> InstalledAddOnExtensionInstance: + """ + Update the InstalledAddOnExtensionInstance + + :param enabled: Whether the Extension should be invoked. + + :returns: The updated InstalledAddOnExtensionInstance + """ + + data = values.of( + { + "Enabled": serialize.boolean_to_string(enabled), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnExtensionInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=self._solution["sid"], + ) + + async def update_async(self, enabled: bool) -> InstalledAddOnExtensionInstance: + """ + Asynchronous coroutine to update the InstalledAddOnExtensionInstance + + :param enabled: Whether the Extension should be invoked. + + :returns: The updated InstalledAddOnExtensionInstance + """ + + data = values.of( + { + "Enabled": serialize.boolean_to_string(enabled), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnExtensionInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class InstalledAddOnExtensionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InstalledAddOnExtensionInstance: + """ + Build an instance of InstalledAddOnExtensionInstance + + :param payload: Payload response from the API + """ + return InstalledAddOnExtensionInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InstalledAddOnExtensionList(ListResource): + + def __init__(self, version: Version, installed_add_on_sid: str): + """ + Initialize the InstalledAddOnExtensionList + + :param version: Version that contains the resource + :param installed_add_on_sid: The SID of the InstalledAddOn resource with the extensions to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "installed_add_on_sid": installed_add_on_sid, + } + self._uri = "/InstalledAddOns/{installed_add_on_sid}/Extensions".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InstalledAddOnExtensionInstance]: + """ + Streams InstalledAddOnExtensionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InstalledAddOnExtensionInstance]: + """ + Asynchronously streams InstalledAddOnExtensionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InstalledAddOnExtensionInstance]: + """ + Lists InstalledAddOnExtensionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InstalledAddOnExtensionInstance]: + """ + Asynchronously lists InstalledAddOnExtensionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InstalledAddOnExtensionPage: + """ + Retrieve a single page of InstalledAddOnExtensionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InstalledAddOnExtensionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InstalledAddOnExtensionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InstalledAddOnExtensionPage: + """ + Asynchronously retrieve a single page of InstalledAddOnExtensionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InstalledAddOnExtensionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InstalledAddOnExtensionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> InstalledAddOnExtensionPage: + """ + Retrieve a specific page of InstalledAddOnExtensionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InstalledAddOnExtensionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InstalledAddOnExtensionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> InstalledAddOnExtensionPage: + """ + Asynchronously retrieve a specific page of InstalledAddOnExtensionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InstalledAddOnExtensionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InstalledAddOnExtensionPage(self._version, response, self._solution) + + def get(self, sid: str) -> InstalledAddOnExtensionContext: + """ + Constructs a InstalledAddOnExtensionContext + + :param sid: The SID of the InstalledAddOn Extension resource to update. + """ + return InstalledAddOnExtensionContext( + self._version, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> InstalledAddOnExtensionContext: + """ + Constructs a InstalledAddOnExtensionContext + + :param sid: The SID of the InstalledAddOn Extension resource to update. + """ + return InstalledAddOnExtensionContext( + self._version, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/installed_add_on_usage.py b/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/installed_add_on_usage.py new file mode 100644 index 00000000..1a547564 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/marketplace/v1/installed_add_on/installed_add_on_usage.py @@ -0,0 +1,234 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Marketplace + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class InstalledAddOnUsageInstance(InstanceResource): + + class MarketplaceV1InstalledAddOnInstalledAddOnUsage(object): + """ + :ivar total_submitted: Total amount in local currency that was billed in this request. Aggregates all billable_items that were successfully submitted. + :ivar billable_items: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.total_submitted: Optional[float] = deserialize.decimal( + payload.get("total_submitted") + ) + self.billable_items: Optional[ + List[ + InstalledAddOnUsageList.MarketplaceV1InstalledAddOnInstalledAddOnUsageBillableItems + ] + ] = payload.get("billable_items") + + def to_dict(self): + return { + "total_submitted": self.total_submitted, + "billable_items": ( + [billable_items.to_dict() for billable_items in self.billable_items] + if self.billable_items is not None + else None + ), + } + + class MarketplaceV1InstalledAddOnInstalledAddOnUsageBillableItems(object): + """ + :ivar quantity: Total amount in local currency that was billed for this Billing Item. Can be any floating number greater than 0. + :ivar sid: BillingSid to use for billing. + :ivar submitted: Whether the billing event was successfully generated for this Billable Item. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.quantity: Optional[float] = payload.get("quantity") + self.sid: Optional[str] = payload.get("sid") + self.submitted: Optional[bool] = payload.get("submitted") + + def to_dict(self): + return { + "quantity": self.quantity, + "sid": self.sid, + "submitted": self.submitted, + } + + """ + :ivar total_submitted: Total amount in local currency that was billed in this request. Aggregates all billable_items that were successfully submitted. + :ivar billable_items: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], installed_add_on_sid: str + ): + super().__init__(version) + + self.total_submitted: Optional[float] = deserialize.decimal( + payload.get("total_submitted") + ) + self.billable_items: Optional[List[InstalledAddOnUsageList.str]] = payload.get( + "billable_items" + ) + + self._solution = { + "installed_add_on_sid": installed_add_on_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InstalledAddOnUsageList(ListResource): + + class MarketplaceV1InstalledAddOnInstalledAddOnUsage(object): + """ + :ivar total_submitted: Total amount in local currency that was billed in this request. Aggregates all billable_items that were successfully submitted. + :ivar billable_items: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.total_submitted: Optional[float] = deserialize.decimal( + payload.get("total_submitted") + ) + self.billable_items: Optional[ + List[ + InstalledAddOnUsageList.MarketplaceV1InstalledAddOnInstalledAddOnUsageBillableItems + ] + ] = payload.get("billable_items") + + def to_dict(self): + return { + "total_submitted": self.total_submitted, + "billable_items": ( + [billable_items.to_dict() for billable_items in self.billable_items] + if self.billable_items is not None + else None + ), + } + + class MarketplaceV1InstalledAddOnInstalledAddOnUsageBillableItems(object): + """ + :ivar quantity: Total amount in local currency that was billed for this Billing Item. Can be any floating number greater than 0. + :ivar sid: BillingSid to use for billing. + :ivar submitted: Whether the billing event was successfully generated for this Billable Item. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.quantity: Optional[float] = payload.get("quantity") + self.sid: Optional[str] = payload.get("sid") + self.submitted: Optional[bool] = payload.get("submitted") + + def to_dict(self): + return { + "quantity": self.quantity, + "sid": self.sid, + "submitted": self.submitted, + } + + def __init__(self, version: Version, installed_add_on_sid: str): + """ + Initialize the InstalledAddOnUsageList + + :param version: Version that contains the resource + :param installed_add_on_sid: Customer Installation SID to report usage on. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "installed_add_on_sid": installed_add_on_sid, + } + self._uri = "/InstalledAddOns/{installed_add_on_sid}/Usage".format( + **self._solution + ) + + def create( + self, + marketplace_v1_installed_add_on_installed_add_on_usage: MarketplaceV1InstalledAddOnInstalledAddOnUsage, + ) -> InstalledAddOnUsageInstance: + """ + Create the InstalledAddOnUsageInstance + + :param marketplace_v1_installed_add_on_installed_add_on_usage: + + :returns: The created InstalledAddOnUsageInstance + """ + data = marketplace_v1_installed_add_on_installed_add_on_usage.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnUsageInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + ) + + async def create_async( + self, + marketplace_v1_installed_add_on_installed_add_on_usage: MarketplaceV1InstalledAddOnInstalledAddOnUsage, + ) -> InstalledAddOnUsageInstance: + """ + Asynchronously create the InstalledAddOnUsageInstance + + :param marketplace_v1_installed_add_on_installed_add_on_usage: + + :returns: The created InstalledAddOnUsageInstance + """ + data = marketplace_v1_installed_add_on_installed_add_on_usage.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnUsageInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/module_data.py b/venv/Lib/site-packages/twilio/rest/marketplace/v1/module_data.py new file mode 100644 index 00000000..1308c17a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/marketplace/v1/module_data.py @@ -0,0 +1,176 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Marketplace + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ModuleDataInstance(InstanceResource): + """ + :ivar url: URL to query the subresource. + :ivar sid: ModuleSid that identifies this Listing. + :ivar description: A JSON object describing the module and is displayed under the Description tab of the Module detail page. You can define the main body of the description, highlight key features or aspects of the module and if applicable, provide code samples for developers + :ivar support: A JSON object containing information on how customers can obtain support for the module. Use this parameter to provide details such as contact information and support description. + :ivar policies: A JSON object describing the module's privacy and legal policies and is displayed under the Policies tab of the Module detail page. The maximum file size for Policies is 5MB + :ivar module_info: A JSON object containing essential attributes that define a module. This information is presented on the Module detail page in the Twilio Marketplace Catalog. You can pass the following attributes in the JSON object + :ivar documentation: A JSON object for providing comprehensive information, instructions, and resources related to the module + :ivar configuration: A JSON object for providing listing specific configuration. Contains button setup, notification url, among others. + :ivar pricing: A JSON object for providing Listing specific pricing information. + :ivar listings: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.url: Optional[str] = payload.get("url") + self.sid: Optional[str] = payload.get("sid") + self.description: Optional[Dict[str, object]] = payload.get("description") + self.support: Optional[Dict[str, object]] = payload.get("support") + self.policies: Optional[Dict[str, object]] = payload.get("policies") + self.module_info: Optional[Dict[str, object]] = payload.get("module_info") + self.documentation: Optional[Dict[str, object]] = payload.get("documentation") + self.configuration: Optional[Dict[str, object]] = payload.get("configuration") + self.pricing: Optional[Dict[str, object]] = payload.get("pricing") + self.listings: Optional[List[Dict[str, object]]] = payload.get("listings") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ModuleDataList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ModuleDataList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Listings" + + def create( + self, + module_info: Union[str, object] = values.unset, + configuration: Union[str, object] = values.unset, + ) -> ModuleDataInstance: + """ + Create the ModuleDataInstance + + :param module_info: A JSON object containing essential attributes that define a Listing. + :param configuration: A JSON object for providing Listing-specific configuration. Contains button setup, notification URL, and more. + + :returns: The created ModuleDataInstance + """ + + data = values.of( + { + "ModuleInfo": module_info, + "Configuration": configuration, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ModuleDataInstance(self._version, payload) + + async def create_async( + self, + module_info: Union[str, object] = values.unset, + configuration: Union[str, object] = values.unset, + ) -> ModuleDataInstance: + """ + Asynchronously create the ModuleDataInstance + + :param module_info: A JSON object containing essential attributes that define a Listing. + :param configuration: A JSON object for providing Listing-specific configuration. Contains button setup, notification URL, and more. + + :returns: The created ModuleDataInstance + """ + + data = values.of( + { + "ModuleInfo": module_info, + "Configuration": configuration, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ModuleDataInstance(self._version, payload) + + def fetch(self) -> ModuleDataInstance: + """ + Asynchronously fetch the ModuleDataInstance + + + :returns: The fetched ModuleDataInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ModuleDataInstance(self._version, payload) + + async def fetch_async(self) -> ModuleDataInstance: + """ + Asynchronously fetch the ModuleDataInstance + + + :returns: The fetched ModuleDataInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ModuleDataInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/module_data_management.py b/venv/Lib/site-packages/twilio/rest/marketplace/v1/module_data_management.py new file mode 100644 index 00000000..6ed82d84 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/marketplace/v1/module_data_management.py @@ -0,0 +1,367 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Marketplace + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ModuleDataManagementInstance(InstanceResource): + """ + :ivar url: URL to query the subresource. + :ivar sid: ModuleSid that identifies this Listing. + :ivar description: A JSON object describing the module and is displayed under the Description tab of the Module detail page. You can define the main body of the description, highlight key features or aspects of the module and if applicable, provide code samples for developers + :ivar support: A JSON object containing information on how customers can obtain support for the module. Use this parameter to provide details such as contact information and support description. + :ivar policies: A JSON object describing the module's privacy and legal policies and is displayed under the Policies tab of the Module detail page. The maximum file size for Policies is 5MB + :ivar module_info: A JSON object containing essential attributes that define a module. This information is presented on the Module detail page in the Twilio Marketplace Catalog. You can pass the following attributes in the JSON object + :ivar documentation: A JSON object for providing comprehensive information, instructions, and resources related to the module + :ivar configuration: A JSON object for providing listing specific configuration. Contains button setup, notification url, among others. + :ivar pricing: A JSON object for providing Listing specific pricing information. + :ivar listings: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.url: Optional[str] = payload.get("url") + self.sid: Optional[str] = payload.get("sid") + self.description: Optional[Dict[str, object]] = payload.get("description") + self.support: Optional[Dict[str, object]] = payload.get("support") + self.policies: Optional[Dict[str, object]] = payload.get("policies") + self.module_info: Optional[Dict[str, object]] = payload.get("module_info") + self.documentation: Optional[Dict[str, object]] = payload.get("documentation") + self.configuration: Optional[Dict[str, object]] = payload.get("configuration") + self.pricing: Optional[Dict[str, object]] = payload.get("pricing") + self.listings: Optional[List[Dict[str, object]]] = payload.get("listings") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ModuleDataManagementContext] = None + + @property + def _proxy(self) -> "ModuleDataManagementContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ModuleDataManagementContext for this ModuleDataManagementInstance + """ + if self._context is None: + self._context = ModuleDataManagementContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "ModuleDataManagementInstance": + """ + Fetch the ModuleDataManagementInstance + + + :returns: The fetched ModuleDataManagementInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ModuleDataManagementInstance": + """ + Asynchronous coroutine to fetch the ModuleDataManagementInstance + + + :returns: The fetched ModuleDataManagementInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + module_info: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + documentation: Union[str, object] = values.unset, + policies: Union[str, object] = values.unset, + support: Union[str, object] = values.unset, + configuration: Union[str, object] = values.unset, + pricing: Union[str, object] = values.unset, + ) -> "ModuleDataManagementInstance": + """ + Update the ModuleDataManagementInstance + + :param module_info: A JSON object containing essential attributes that define a Listing. + :param description: A JSON object describing the Listing. You can define the main body of the description, highlight key features or aspects of the Listing, and provide code samples for developers if applicable. + :param documentation: A JSON object for providing comprehensive information, instructions, and resources related to the Listing. + :param policies: A JSON object describing the Listing's privacy and legal policies. The maximum file size for Policies is 5MB. + :param support: A JSON object containing information on how Marketplace users can obtain support for the Listing. Use this parameter to provide details such as contact information and support description. + :param configuration: A JSON object for providing Listing-specific configuration. Contains button setup, notification URL, and more. + :param pricing: A JSON object for providing Listing's purchase options. + + :returns: The updated ModuleDataManagementInstance + """ + return self._proxy.update( + module_info=module_info, + description=description, + documentation=documentation, + policies=policies, + support=support, + configuration=configuration, + pricing=pricing, + ) + + async def update_async( + self, + module_info: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + documentation: Union[str, object] = values.unset, + policies: Union[str, object] = values.unset, + support: Union[str, object] = values.unset, + configuration: Union[str, object] = values.unset, + pricing: Union[str, object] = values.unset, + ) -> "ModuleDataManagementInstance": + """ + Asynchronous coroutine to update the ModuleDataManagementInstance + + :param module_info: A JSON object containing essential attributes that define a Listing. + :param description: A JSON object describing the Listing. You can define the main body of the description, highlight key features or aspects of the Listing, and provide code samples for developers if applicable. + :param documentation: A JSON object for providing comprehensive information, instructions, and resources related to the Listing. + :param policies: A JSON object describing the Listing's privacy and legal policies. The maximum file size for Policies is 5MB. + :param support: A JSON object containing information on how Marketplace users can obtain support for the Listing. Use this parameter to provide details such as contact information and support description. + :param configuration: A JSON object for providing Listing-specific configuration. Contains button setup, notification URL, and more. + :param pricing: A JSON object for providing Listing's purchase options. + + :returns: The updated ModuleDataManagementInstance + """ + return await self._proxy.update_async( + module_info=module_info, + description=description, + documentation=documentation, + policies=policies, + support=support, + configuration=configuration, + pricing=pricing, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ModuleDataManagementContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ModuleDataManagementContext + + :param version: Version that contains the resource + :param sid: SID that uniquely identifies the Listing. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Listing/{sid}".format(**self._solution) + + def fetch(self) -> ModuleDataManagementInstance: + """ + Fetch the ModuleDataManagementInstance + + + :returns: The fetched ModuleDataManagementInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ModuleDataManagementInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ModuleDataManagementInstance: + """ + Asynchronous coroutine to fetch the ModuleDataManagementInstance + + + :returns: The fetched ModuleDataManagementInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ModuleDataManagementInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + module_info: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + documentation: Union[str, object] = values.unset, + policies: Union[str, object] = values.unset, + support: Union[str, object] = values.unset, + configuration: Union[str, object] = values.unset, + pricing: Union[str, object] = values.unset, + ) -> ModuleDataManagementInstance: + """ + Update the ModuleDataManagementInstance + + :param module_info: A JSON object containing essential attributes that define a Listing. + :param description: A JSON object describing the Listing. You can define the main body of the description, highlight key features or aspects of the Listing, and provide code samples for developers if applicable. + :param documentation: A JSON object for providing comprehensive information, instructions, and resources related to the Listing. + :param policies: A JSON object describing the Listing's privacy and legal policies. The maximum file size for Policies is 5MB. + :param support: A JSON object containing information on how Marketplace users can obtain support for the Listing. Use this parameter to provide details such as contact information and support description. + :param configuration: A JSON object for providing Listing-specific configuration. Contains button setup, notification URL, and more. + :param pricing: A JSON object for providing Listing's purchase options. + + :returns: The updated ModuleDataManagementInstance + """ + + data = values.of( + { + "ModuleInfo": module_info, + "Description": description, + "Documentation": documentation, + "Policies": policies, + "Support": support, + "Configuration": configuration, + "Pricing": pricing, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ModuleDataManagementInstance( + self._version, payload, sid=self._solution["sid"] + ) + + async def update_async( + self, + module_info: Union[str, object] = values.unset, + description: Union[str, object] = values.unset, + documentation: Union[str, object] = values.unset, + policies: Union[str, object] = values.unset, + support: Union[str, object] = values.unset, + configuration: Union[str, object] = values.unset, + pricing: Union[str, object] = values.unset, + ) -> ModuleDataManagementInstance: + """ + Asynchronous coroutine to update the ModuleDataManagementInstance + + :param module_info: A JSON object containing essential attributes that define a Listing. + :param description: A JSON object describing the Listing. You can define the main body of the description, highlight key features or aspects of the Listing, and provide code samples for developers if applicable. + :param documentation: A JSON object for providing comprehensive information, instructions, and resources related to the Listing. + :param policies: A JSON object describing the Listing's privacy and legal policies. The maximum file size for Policies is 5MB. + :param support: A JSON object containing information on how Marketplace users can obtain support for the Listing. Use this parameter to provide details such as contact information and support description. + :param configuration: A JSON object for providing Listing-specific configuration. Contains button setup, notification URL, and more. + :param pricing: A JSON object for providing Listing's purchase options. + + :returns: The updated ModuleDataManagementInstance + """ + + data = values.of( + { + "ModuleInfo": module_info, + "Description": description, + "Documentation": documentation, + "Policies": policies, + "Support": support, + "Configuration": configuration, + "Pricing": pricing, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ModuleDataManagementInstance( + self._version, payload, sid=self._solution["sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ModuleDataManagementList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ModuleDataManagementList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, sid: str) -> ModuleDataManagementContext: + """ + Constructs a ModuleDataManagementContext + + :param sid: SID that uniquely identifies the Listing. + """ + return ModuleDataManagementContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ModuleDataManagementContext: + """ + Constructs a ModuleDataManagementContext + + :param sid: SID that uniquely identifies the Listing. + """ + return ModuleDataManagementContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/marketplace/v1/referral_conversion.py b/venv/Lib/site-packages/twilio/rest/marketplace/v1/referral_conversion.py new file mode 100644 index 00000000..9d9f3c2f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/marketplace/v1/referral_conversion.py @@ -0,0 +1,143 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Marketplace + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ReferralConversionInstance(InstanceResource): + + class CreateReferralConversionRequest(object): + """ + :ivar referral_account_sid: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.referral_account_sid: Optional[str] = payload.get( + "referral_account_sid" + ) + + def to_dict(self): + return { + "referral_account_sid": self.referral_account_sid, + } + + """ + :ivar converted_account_sid: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.converted_account_sid: Optional[str] = payload.get("converted_account_sid") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ReferralConversionList(ListResource): + + class CreateReferralConversionRequest(object): + """ + :ivar referral_account_sid: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.referral_account_sid: Optional[str] = payload.get( + "referral_account_sid" + ) + + def to_dict(self): + return { + "referral_account_sid": self.referral_account_sid, + } + + def __init__(self, version: Version): + """ + Initialize the ReferralConversionList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/ReferralConversion" + + def create( + self, create_referral_conversion_request: CreateReferralConversionRequest + ) -> ReferralConversionInstance: + """ + Create the ReferralConversionInstance + + :param create_referral_conversion_request: + + :returns: The created ReferralConversionInstance + """ + data = create_referral_conversion_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ReferralConversionInstance(self._version, payload) + + async def create_async( + self, create_referral_conversion_request: CreateReferralConversionRequest + ) -> ReferralConversionInstance: + """ + Asynchronously create the ReferralConversionInstance + + :param create_referral_conversion_request: + + :returns: The created ReferralConversionInstance + """ + data = create_referral_conversion_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ReferralConversionInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/MessagingBase.py b/venv/Lib/site-packages/twilio/rest/messaging/MessagingBase.py new file mode 100644 index 00000000..e45ed56f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/MessagingBase.py @@ -0,0 +1,55 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.messaging.v1 import V1 +from twilio.rest.messaging.v2 import V2 + + +class MessagingBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Messaging Domain + + :returns: Domain for Messaging + """ + super().__init__(twilio, "https://messaging.twilio.com") + self._v1: Optional[V1] = None + self._v2: Optional[V2] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Messaging + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + @property + def v2(self) -> V2: + """ + :returns: Versions v2 of Messaging + """ + if self._v2 is None: + self._v2 = V2(self) + return self._v2 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/__init__.py b/venv/Lib/site-packages/twilio/rest/messaging/__init__.py new file mode 100644 index 00000000..4e628325 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/__init__.py @@ -0,0 +1,99 @@ +from warnings import warn + +from twilio.rest.messaging.MessagingBase import MessagingBase +from twilio.rest.messaging.v1.brand_registration import BrandRegistrationList +from twilio.rest.messaging.v1.deactivations import DeactivationsList +from twilio.rest.messaging.v1.domain_certs import DomainCertsList +from twilio.rest.messaging.v1.domain_config import DomainConfigList +from twilio.rest.messaging.v1.domain_config_messaging_service import ( + DomainConfigMessagingServiceList, +) +from twilio.rest.messaging.v1.external_campaign import ExternalCampaignList +from twilio.rest.messaging.v1.linkshortening_messaging_service import ( + LinkshorteningMessagingServiceList, +) +from twilio.rest.messaging.v1.service import ServiceList +from twilio.rest.messaging.v1.usecase import UsecaseList + + +class Messaging(MessagingBase): + @property + def brand_registrations(self) -> BrandRegistrationList: + warn( + "brand_registrations is deprecated. Use v1.brand_registrations instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.brand_registrations + + @property + def deactivations(self) -> DeactivationsList: + warn( + "deactivations is deprecated. Use v1.deactivations instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.deactivations + + @property + def domain_certs(self) -> DomainCertsList: + warn( + "domain_certs is deprecated. Use v1.domain_certs instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.domain_certs + + @property + def domain_config(self) -> DomainConfigList: + warn( + "domain_config is deprecated. Use v1.domain_config instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.domain_config + + @property + def domain_config_messaging_service(self) -> DomainConfigMessagingServiceList: + warn( + "domain_config_messaging_service is deprecated. Use v1.domain_config_messaging_service instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.domain_config_messaging_service + + @property + def external_campaign(self) -> ExternalCampaignList: + warn( + "external_campaign is deprecated. Use v1.external_campaign instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.external_campaign + + @property + def linkshortening_messaging_service(self) -> LinkshorteningMessagingServiceList: + warn( + "linkshortening_messaging_service is deprecated. Use v1.linkshortening_messaging_service instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.linkshortening_messaging_service + + @property + def services(self) -> ServiceList: + warn( + "services is deprecated. Use v1.services instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.services + + @property + def usecases(self) -> UsecaseList: + warn( + "usecases is deprecated. Use v1.usecases instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.usecases diff --git a/venv/Lib/site-packages/twilio/rest/messaging/__pycache__/MessagingBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/__pycache__/MessagingBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dab8beeb7ee16ed00d9e739709c6f4dfe2ff1c54 GIT binary patch literal 2376 zcmd57O>Y}TbauU7ubrd`X_W>jXi8HmBh^+c4pmf@HVu>r+7t+tSQ&w%@$3dGo&J`KO_w z0)e&p=lPi`c{@wqmQU(ojuRK|JGT8k(s|TywJx-P9$Xb#o2F zG$gLO`9{GkC`2XKh@D#_w!yWXOl;a5Xy=Os>qmu<0;TgyPC#qE&FLL0po`q&!V0-f z7uq0XjM4oM1qQMhAn`7V!(^frOHn`m$x~pJcJbT)NLq40F_tifLP;XP)7>f_kQifS z#1bPhyWBU+y7FwSnW({Su|?E{>yZ2s0p3^bo23-5h`)XPY60xtn45opD#?>;1p$SG zS<9h+AX#*-$-OH#XX&*#gT5%i(WNkK22wbTayx2YH^KYm=v7! zsz84S?Zk#D7-X*-DpGbgzQaI-IP^PpJ(p1!7; z1M6f(F$X^*#auLWodP-XqLD?cZw}iRKIqOeq5zEq*Bdq+$d^MHdtI#vBV;3BAgG&?(Ao#Dal&~H{-zEk5@phv=Li+io=$Ie1Ea6*2* zY1M99i#({t9+U+S!gA_YIrSbhUuw3+5Zu!lJIL<4IR>)e41i~=JW#|4Yyn4Mz5F1J!e2u#c59EowtIr;$97dc zJAQxqZvtB{(`W3C^s$$Sve}94Gyf3SWQ6jL8^ysW$C&NcAT&K}H(^2xe3sE@GS3!p zYS?m23M_FnkO*+h$oQl27dWLxIuKivG8IRPD{+2gyr;l&>=i!6=f=f2-Z(CJj;sSws;1d^Pt6sO7b z&;yqqI_(Wky)*Pb>Ba7)jHWrYJuuTl+BAo9>b|us%dv!gB04-h{oZ@KtKWP3^>Z$l zM)djamwONY$|CeTd~}|;tL*RBTv<(SUvBZeReOi$^f#+Wq5^t3*1Oh^+<&*+oJlr+Vm z2>Jl2*(XTN;pmHKdwkOL_DDf^1s?^@iESywr0?7fY*|W8Giz5B3sYd~Dp5@JHm+%w zO%z+Jo9k4ghOsrQRBf%nFv|snwYs5b<|-z32O4#uy7@q>xo)B#^Lo64Nkgk**Jtwm zuWU?AMPF5n4MnSU`aQL-nUAf9bz)Lp z7)hLpqzI0x9F9GRsF5eJ7p}h)XJ~?=Q6HLQC{NLt4^1&NP0_dy%`h}e(S#4BNuj-s zP&Da71%{4Nl=q=y3>~Lv%7;!cbdsWJA3C+2DP*0L$B>gC*xn>&mGdzG)e0o+-=^Xz zvOSy1*^!Q)8u`hq8xDPq9>qGA?)y=qt9P_Js1UokbL~EqkW73vWQm$3s(6FYtk_sB ziZnlB<6JS&)3j`?sKr+>oadaAwrr*PSjP>l7h(j)?u@UwP0{lFj21Gj3n$Vz=S&2& zM_Y(lSbt!_pNg+PUtOut&WTm|`1}Mx9pTl^QnfN&}mX%DQ&HVre!$ zvqAe-YS^mSTbi!bmkGA)Wur4`mStHpHCvX88{1@tcCd58qd(~9CaH@xPsKOr4?g=c zd-u2O$(J+74wA7{dM}MeC%@nNcI#JRu_Y`v`Ne(eh~9SgR#g8y56RmhA2(xUoQ{`F zP~j$uOaU-Wg_G+EA;&1z&IoxId`?iYGt=d+#~Y0MKGr@AW-Z?m@=ZQZj#Kxy&01My z3!z+vl`xF79+x3F%laGbqf7+KrhSz8nmtLB0$w?4LQ9@tzj9m8C7@4kCuul#{QBc$nq|FZKx{t;@ z&{*iNJw{{yAj;I;UygckIbLW97n=NqBVqq4c8?!&)jfZN@Ezbc1jA!}VSSv!oZUIz z<+Ly2${`kS1+%!&5*C{L!jZ6ePwzRb^;bd&se{9Y;8+~gN+0D5K>1>q@<9!JbSML6 za0W^(q15C{N0NcF?rIUX33bgwFv@ql`z2gPxV;FE9IZMHwftMhb zWao5fM9=A%)qyh~?(91kvPyYV!~WwCD<-Eru;GwRpH-l<7#iNUzp+AfE`|mSTAf*W zJ7Q?OyGF6ve}kJlQQH%P&4cqaf9)!OyUJ_+z4j!%OfJ(;xK>)1sMw2g9Jh BrandRegistrationList: + if self._brand_registrations is None: + self._brand_registrations = BrandRegistrationList(self) + return self._brand_registrations + + @property + def deactivations(self) -> DeactivationsList: + if self._deactivations is None: + self._deactivations = DeactivationsList(self) + return self._deactivations + + @property + def domain_certs(self) -> DomainCertsList: + if self._domain_certs is None: + self._domain_certs = DomainCertsList(self) + return self._domain_certs + + @property + def domain_config(self) -> DomainConfigList: + if self._domain_config is None: + self._domain_config = DomainConfigList(self) + return self._domain_config + + @property + def domain_config_messaging_service(self) -> DomainConfigMessagingServiceList: + if self._domain_config_messaging_service is None: + self._domain_config_messaging_service = DomainConfigMessagingServiceList( + self + ) + return self._domain_config_messaging_service + + @property + def external_campaign(self) -> ExternalCampaignList: + if self._external_campaign is None: + self._external_campaign = ExternalCampaignList(self) + return self._external_campaign + + @property + def linkshortening_messaging_service(self) -> LinkshorteningMessagingServiceList: + if self._linkshortening_messaging_service is None: + self._linkshortening_messaging_service = LinkshorteningMessagingServiceList( + self + ) + return self._linkshortening_messaging_service + + @property + def linkshortening_messaging_service_domain_association( + self, + ) -> LinkshorteningMessagingServiceDomainAssociationList: + if self._linkshortening_messaging_service_domain_association is None: + self._linkshortening_messaging_service_domain_association = ( + LinkshorteningMessagingServiceDomainAssociationList(self) + ) + return self._linkshortening_messaging_service_domain_association + + @property + def request_managed_cert(self) -> RequestManagedCertList: + if self._request_managed_cert is None: + self._request_managed_cert = RequestManagedCertList(self) + return self._request_managed_cert + + @property + def services(self) -> ServiceList: + if self._services is None: + self._services = ServiceList(self) + return self._services + + @property + def tollfree_verifications(self) -> TollfreeVerificationList: + if self._tollfree_verifications is None: + self._tollfree_verifications = TollfreeVerificationList(self) + return self._tollfree_verifications + + @property + def usecases(self) -> UsecaseList: + if self._usecases is None: + self._usecases = UsecaseList(self) + return self._usecases + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97089eea006033be4cfa2d39e2fb6ecfaf36ab59 GIT binary patch literal 6960 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 PXPEwtqi+a)X{Y}N0)d?t literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/deactivations.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/deactivations.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ea290d4ea3f07d00471650232186f207f2836e1 GIT binary patch literal 7558 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/domain_config.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/domain_config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0caba94de5469ad79b8d8a1f2f1fa44f8e2f6ba2 GIT binary patch literal 15173 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 uaGM{x4>m5nI2d7 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 RiF<^z!bc-d2;R9c{}(_N<{tn6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/external_campaign.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/external_campaign.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bb720d37c8c344ebb445aa2229934fde18904d0 GIT binary patch literal 7041 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/linkshortening_messaging_service.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/linkshortening_messaging_service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46abedcdf32a1cfb50089e9b46324a59606e67c7 GIT binary patch literal 11208 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 PALS=Ee8%CO%I|*xCk(&M literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/linkshortening_messaging_service_domain_association.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/linkshortening_messaging_service_domain_association.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a5e134656e83ce6073a60c45caa60fe51930987 GIT binary patch literal 9363 zcmd5?TWl2989sB{8@pa(F5zOx;DpO2VGRiht!o?{90&mn!H`57r;}l4j0g6XGqVOS zwuBPYm?&w2s>Y-*300+lNL%vMRNA|W*ot(1o)>nN$8`u}Gx-nExj zHmJ?u{m+>*=lti)IsfJR|KTsOScJg!<`*yZzrKc$zvGQ}Np7X`E2xYTjiiXiX?%vu z@+m$mq=c-P5;<%WGEz2>3b4AE31&m75UWd>a5j>PuzDb~C>u>hSv{DEWgAir9O20x zqJ_>8Ev!eb3eJ3~IBShS>mohmw>GlYD741(sNcGHuptpwzvc*u$Z#F$H%vL5*L3-m zYRbp;oK96s*W_b^_*hXCdFCHBV3UFaS?Q2Dw{EYhF31OmDGHl)NS25Ef6$CK@CRL- zCyIhC>=p@5In)a+PEAo-vF0*ynp=Io$`BjubandybB85%#^u88i%4+7UXQOV;~dVP z*S|O7Y||+tW8~${@&Vm6)#FC)xYLZg2Y*(-E*FZ&GDccH;`BWHWX}<~^U&U;Grs%a zktf^S&CaMM8>AMke9ex_2Mc-*#>jh|W60Aao2B2f3T9htYaSk}1!J>&O7Pgy)BUVV zS6(OY6JxIZHonK~tmGbXYg@MVi*3ExO+@t*ZOrvpO|_TiTIGhlbpn$^cYe z1BK8@iUXzKH7+HDL0C0j7d1hb^nf1h<5xm2P1Hkr0Be1L5z@zL(z#d)L|uz&!E@qO zmtks=76T;^Q_(O1J~1r}^_UjW1AV*}fqKITInAZwJtWa!Z{Kg^PMZCBYUw#RH~#>8 zbUI+9^{#wYHFBM%nNJ%kZix4`r9ZKqZ8HW`Dr>BlVj3ErqAnM6#>+)rHZ2M)VaHWV zKBdcPsx#$*b2T(QXBmBi>@=J?Wa{ppbE*#GtS3*3>8$5J&f#)3bVua;!LmEJYQ;sG zX=Ar`aKJemJ6KQ$GkI0Bm-z#$XHARl_F{pi1%H*Vfc%mhB^H#`)$hxD+@P<&lH2qZs`~o#YW$FJnlr&*4v`a{>{YGC z;DB?$YtW#V67=o{NkZ(lBQwWL6f1TQZ9Uo!TKqF>;2bD7J81x9DQ%!Mf2V z>>F0he5QyJ1Rc|^_DHs9>X|+o!@dpP0O+eQ4OJ8qmyZ_d?DT89+Io+|L7Kh$_U=8> z+ohW)t$d+(AP-X72|91}4(Pdo-u=e0UemDj%>^}mQa!Gly%sY$tsq`jtADbs16x}& zHIlFR&-_z&-xmy$C;iF7AYBSeD(zgL+9bVAS_@pvJdp3tlBp;OH=GZShgMv?=gZK# zn~5#IUwviuwchKACq~3K;*;Bc@`rsN?Hk+q-1TkGkBDD}S|(c(A3S*J!OQyfmTk}@ zR1T2X{bTFfz9HO(2PWf7CgO?lc%m!`t0M5Yp&TW##bt?vV{gVPFeR}ARJV#Wmv$u- z+X!wolj(C%8AU0<)>+rtgf%0ndEFGVx08i!WvL;fo7w1IT_59`ka)=5x* z>^WkT0oU&9vYL|(*A9boW`%_Ln8Y=G$sC`=R|nXW>{0R=Z^u+%Zn z3A|M&o$(JN+cqF)Nx6|k8{gV-e#h7%`ESjKCmWZJ#xBGrH$3n`?ow{-(f#8a4opeH znud|CHx86Tq;ct6!{>*`Ld|qF46l)FlsP8Zk3r>jl6}ILYv|-&o<{{)a{*b-w%*FnANu;_ZYFYQ?1BuU1z6Ir52 z!9g|P=ASu#W+E<+$K~tsma$OF+*82)eHDI{!$9_dS6s+Ryb9sL8Q}B|KPvo8l1LBP zPTmlIE1cpI{PgGk33Zx-xpY6x=TN89d71~$lhaXW+2ViDXV>i=-XgYEMa6fSbA+2< z6HB}9=m;IoPXi+p1>_&-ipou7`Kr+uF1#?Y?4j{x4_#lDoQNmKLdmgsa@veSuUFP? zV{x58^}~7q$y2{B;?=IYJcl7hJmJHW89py#Hc*mLH?kf2g^Gxx;07s5vOSYes~NK+=`(!+ z-|b!?Ok}=T)$>u;wa#lVU)=s)$GaVu*Ij;QVs-2Is-AyU5FWg8?>eq@sND(tk_S9M zpL}*}a)C>e&kT255pD5A-pDa`WJ>_}vL8|k1HQ7PeF`FoB?!F*IbzbUD@SDTo zD6lnu0t9p>N|r1i-E?6Syz|FhpLT!JJ<)z>y#3Ji_QPMU>bc(3GZLJPs}u45@p%7a zbV)_v8zW`Hha=2JCOB01X5d6|OT9YkTA~qGoKv$pfa-{%Wb;}vgY~GQybPhM`y{9+ zT0RZ0hN%~ddu|I5dQlV!ifYLqs~rLd4T#4YWUhhv0E$+Gw&RGHi@DQ!CZj0e;1RDe zpRtq46vYKGf=1uW0QvqLxy6f8sJxVH*>)@3BrU$Vctu%)67Xo#^0(6$A9=g~!rF2W zTS7$MbXjC7BfD+up{w9MwEOL-8F`c4K*Pns22+W%L4C)e9-VL zHx})lh#nn}9=%2QSi@w~^3mjl0vl`$ZY-0(elJC+sK7}=AD_Niur{Pb+f8IXUw4V8{4f>RJ+@8SNdoRq`Rd)mZ|-z%Mg&TZUhA+Gab@w4y)P_L06--VuozVI>V2M{jM z2Vg1mK_GKhdY92W-HbCOk!%4{D+1e~rF3|KBH#hsI;j0JPWLDhOoNmT-VI3Zq6S3d zbUU)f)J-+yX5g~4aL?y}?O!9;d4TPgCgR7(Peykk=>k#>hY_nYh^XQN><4hTEH0KJ?+42Sia!e9Vo~1EBt^#V>8=nc%bS)< zk(=S26$#4nmf7$Yd7_i|FVU@4(0|N^w|zW=wmd*v_L+!5TG55K@Y%?{_aLq`7vkEF z%u~wnvlat7X&=eL!VoFouW~<-S!fu%^6ZZxgOI8zUGTx;oxxUI(H&t{e;pWw`5-Uh z`fc`Mf<;33g0*mNzJ42*>SMWUz>b;8?`yH#UqkC0OolNBiwbMD8U=!FHJXiTUgSk|GJ>LaF)fi1v&4#6)V(*(QWeo4)7x^g9HH6P1&h4Y>t~* zW0jUcLutOBKG^}nr>#$5aHSat!(5HKJ-0Zvb@x9h z8i?9U3lvFb^ykR@MI@_%)VM&ncf<|>?QPC79Zur@0tm>ahz

    kd0G;JscMq>*$^$SeZJ)KMlpl$`rwJD#bqtcMp9_pkTZAZ;b%7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/request_managed_cert.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/request_managed_cert.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89a3775b3761accddc3fadfa7716579f6a022d4f GIT binary patch literal 9807 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/usecase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/__pycache__/usecase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d41a4a7adcea9de8518c4b95ed4a60d962d6dfc6 GIT binary patch literal 3917 zcmd5EiLF^E&~ z)mSN3jhEsI$~8ApO_q{^kGZL8x|9}t+|5+`N_~P)xc${^DXS2boFR7d60uV>eM^)3 zl(q?J8l)N8*Od-5`f~l|zZF6(g`W*ErGXrYtvke?J3`5`eK>>;k zoG8AMJl2i0dQ@;7oMsqe*Osogx<4Ss4*Y_O95D=(h%OS`vQ-9&xX}F(65O!dSy$I_5Bb~CFK48gmK@jd^}PND<=mWeyg4aG>%ng@ zPxV@T)^#j>Mrux-o}SUi&rKBM{K>O3r^g~=yCxTt%zEH&vbcV>Mm?CLpOJ3xSwZYF z9|Sc%RxJ83Y}TB76zr9Js*=j|Zk_(J9LPIpcvqjMY|*i(4!i3oVIeME5hfSqt;1x^Y`DH@ zTT!}+izAPJYv+LcMp+?&5F>e4Ymv(U0WIYgpwg> zR)+gAUVd$2Vy1kG^0x!OR$lbs;^PoxL3xpSi{;my*)n$mny;DG+vXhQE*>gIrz_MNYzTH~4#V=j&MS1zx(7zN4&=*=J{ct z&vqLS95pyGT+76WmwAb*V{&l_qBl%y-tp*vor2ofn){E-G%s}FpzzkA!j{XPxJhm* zY$u$K#9LX8KEp{0aR*fS{0M&V#l*EI|{=GQbn^E34+;-Oznw|ON3TBrh`>jjTP$M1{BFae zU|V|?$YzY7T16FzpaLQYtN=ua0U{(2H-L`=p9DVj1f=MT?2kAlBHvQQK9bolnV+n#-UqN-*xv#LjMF{Vdo2@}i!3NA#U zwoW{1p(S;Mkm{DgANHDr&mJ0{s1tGJg3q=O*>^WRF z`|_a15q}~39&97&Z9Vz7^8ln>TDoo+R5s-tqLnb>hrj^3b@OqdYbqFs8a{5EE|y(@ zCrt~W{y2=b$O1;@mbQQ)zopr6&`oU-Lbs*-F41|?Tu_6)j>eN$ZmGAT^I=I@U+6k= zoHsmcp81|%=YS9u8d&qaF6|VZ%!Y3^&|(IPzL){erO3)%eE}0d*85L_s{wQJGmRQu z-)Gip@JJ8Q?|JIyEXTj>itbh)BbmQNSEQ0hR?W14cp=;?ey_dWC<2(6tclLaLb!ciid4Eq~Ie8^@H#Ks9XxB>qz5M4x`|l3z zfB(&oVxOcxPXBTA&d~nVq3Px1-v{Qy#o*IpMkl4tFCCjjK|6U7ImZK*H8UkTT*f<_I0=z`v#JONH7;!0Z9?bH-St> z-eliG$+v-oeZmuliSfGOPc{l;n|=6QkTiEc=0iF2464ro`Dc{*U+v7{J=e3>vY!th zx;uR6FFS^>+Si?H&h6c8jf@;#BkD-z5m9$!mXi-sWboO|j%}x5WSt`f{bD>d{*v-( zMj789`?T+A;5RuOG$f=TBFHk%o&vVH@2hGoV*CmAH0Uw$l-MY+qP{h^z@DtDKLGVk zUF|1>N20pQ_Tnza*-Wq{V`?*B?2-ZyaNZ`d)CUb)fUjktwXw={z z4q3v{N(^C`;Zr;8lTWe2EId&q0zA_rDL{!4&v~9T!ZwF`mZp9lhfb zm`JmTXMwn=usuEwM6p><9hVQ16YOP>p*uJRXIoPg90=c#rJ;2N}CZ h4&Ng$JxFX "BrandRegistrationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: BrandRegistrationContext for this BrandRegistrationInstance + """ + if self._context is None: + self._context = BrandRegistrationContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "BrandRegistrationInstance": + """ + Fetch the BrandRegistrationInstance + + + :returns: The fetched BrandRegistrationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "BrandRegistrationInstance": + """ + Asynchronous coroutine to fetch the BrandRegistrationInstance + + + :returns: The fetched BrandRegistrationInstance + """ + return await self._proxy.fetch_async() + + def update(self) -> "BrandRegistrationInstance": + """ + Update the BrandRegistrationInstance + + + :returns: The updated BrandRegistrationInstance + """ + return self._proxy.update() + + async def update_async(self) -> "BrandRegistrationInstance": + """ + Asynchronous coroutine to update the BrandRegistrationInstance + + + :returns: The updated BrandRegistrationInstance + """ + return await self._proxy.update_async() + + @property + def brand_registration_otps(self) -> BrandRegistrationOtpList: + """ + Access the brand_registration_otps + """ + return self._proxy.brand_registration_otps + + @property + def brand_vettings(self) -> BrandVettingList: + """ + Access the brand_vettings + """ + return self._proxy.brand_vettings + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BrandRegistrationContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the BrandRegistrationContext + + :param version: Version that contains the resource + :param sid: The SID of the Brand Registration resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/a2p/BrandRegistrations/{sid}".format(**self._solution) + + self._brand_registration_otps: Optional[BrandRegistrationOtpList] = None + self._brand_vettings: Optional[BrandVettingList] = None + + def fetch(self) -> BrandRegistrationInstance: + """ + Fetch the BrandRegistrationInstance + + + :returns: The fetched BrandRegistrationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return BrandRegistrationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> BrandRegistrationInstance: + """ + Asynchronous coroutine to fetch the BrandRegistrationInstance + + + :returns: The fetched BrandRegistrationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return BrandRegistrationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update(self) -> BrandRegistrationInstance: + """ + Update the BrandRegistrationInstance + + + :returns: The updated BrandRegistrationInstance + """ + + data = values.of({}) + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BrandRegistrationInstance( + self._version, payload, sid=self._solution["sid"] + ) + + async def update_async(self) -> BrandRegistrationInstance: + """ + Asynchronous coroutine to update the BrandRegistrationInstance + + + :returns: The updated BrandRegistrationInstance + """ + + data = values.of({}) + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BrandRegistrationInstance( + self._version, payload, sid=self._solution["sid"] + ) + + @property + def brand_registration_otps(self) -> BrandRegistrationOtpList: + """ + Access the brand_registration_otps + """ + if self._brand_registration_otps is None: + self._brand_registration_otps = BrandRegistrationOtpList( + self._version, + self._solution["sid"], + ) + return self._brand_registration_otps + + @property + def brand_vettings(self) -> BrandVettingList: + """ + Access the brand_vettings + """ + if self._brand_vettings is None: + self._brand_vettings = BrandVettingList( + self._version, + self._solution["sid"], + ) + return self._brand_vettings + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BrandRegistrationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> BrandRegistrationInstance: + """ + Build an instance of BrandRegistrationInstance + + :param payload: Payload response from the API + """ + return BrandRegistrationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class BrandRegistrationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the BrandRegistrationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/a2p/BrandRegistrations" + + def create( + self, + customer_profile_bundle_sid: str, + a2p_profile_bundle_sid: str, + brand_type: Union[str, object] = values.unset, + mock: Union[bool, object] = values.unset, + skip_automatic_sec_vet: Union[bool, object] = values.unset, + ) -> BrandRegistrationInstance: + """ + Create the BrandRegistrationInstance + + :param customer_profile_bundle_sid: Customer Profile Bundle Sid. + :param a2p_profile_bundle_sid: A2P Messaging Profile Bundle Sid. + :param brand_type: Type of brand being created. One of: \\\"STANDARD\\\", \\\"SOLE_PROPRIETOR\\\". SOLE_PROPRIETOR is for low volume, SOLE_PROPRIETOR use cases. STANDARD is for all other use cases. + :param mock: A boolean that specifies whether brand should be a mock or not. If true, brand will be registered as a mock brand. Defaults to false if no value is provided. + :param skip_automatic_sec_vet: A flag to disable automatic secondary vetting for brands which it would otherwise be done. + + :returns: The created BrandRegistrationInstance + """ + + data = values.of( + { + "CustomerProfileBundleSid": customer_profile_bundle_sid, + "A2PProfileBundleSid": a2p_profile_bundle_sid, + "BrandType": brand_type, + "Mock": serialize.boolean_to_string(mock), + "SkipAutomaticSecVet": serialize.boolean_to_string( + skip_automatic_sec_vet + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BrandRegistrationInstance(self._version, payload) + + async def create_async( + self, + customer_profile_bundle_sid: str, + a2p_profile_bundle_sid: str, + brand_type: Union[str, object] = values.unset, + mock: Union[bool, object] = values.unset, + skip_automatic_sec_vet: Union[bool, object] = values.unset, + ) -> BrandRegistrationInstance: + """ + Asynchronously create the BrandRegistrationInstance + + :param customer_profile_bundle_sid: Customer Profile Bundle Sid. + :param a2p_profile_bundle_sid: A2P Messaging Profile Bundle Sid. + :param brand_type: Type of brand being created. One of: \\\"STANDARD\\\", \\\"SOLE_PROPRIETOR\\\". SOLE_PROPRIETOR is for low volume, SOLE_PROPRIETOR use cases. STANDARD is for all other use cases. + :param mock: A boolean that specifies whether brand should be a mock or not. If true, brand will be registered as a mock brand. Defaults to false if no value is provided. + :param skip_automatic_sec_vet: A flag to disable automatic secondary vetting for brands which it would otherwise be done. + + :returns: The created BrandRegistrationInstance + """ + + data = values.of( + { + "CustomerProfileBundleSid": customer_profile_bundle_sid, + "A2PProfileBundleSid": a2p_profile_bundle_sid, + "BrandType": brand_type, + "Mock": serialize.boolean_to_string(mock), + "SkipAutomaticSecVet": serialize.boolean_to_string( + skip_automatic_sec_vet + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BrandRegistrationInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[BrandRegistrationInstance]: + """ + Streams BrandRegistrationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[BrandRegistrationInstance]: + """ + Asynchronously streams BrandRegistrationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BrandRegistrationInstance]: + """ + Lists BrandRegistrationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BrandRegistrationInstance]: + """ + Asynchronously lists BrandRegistrationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BrandRegistrationPage: + """ + Retrieve a single page of BrandRegistrationInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BrandRegistrationInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BrandRegistrationPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BrandRegistrationPage: + """ + Asynchronously retrieve a single page of BrandRegistrationInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BrandRegistrationInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BrandRegistrationPage(self._version, response) + + def get_page(self, target_url: str) -> BrandRegistrationPage: + """ + Retrieve a specific page of BrandRegistrationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BrandRegistrationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return BrandRegistrationPage(self._version, response) + + async def get_page_async(self, target_url: str) -> BrandRegistrationPage: + """ + Asynchronously retrieve a specific page of BrandRegistrationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BrandRegistrationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return BrandRegistrationPage(self._version, response) + + def get(self, sid: str) -> BrandRegistrationContext: + """ + Constructs a BrandRegistrationContext + + :param sid: The SID of the Brand Registration resource to update. + """ + return BrandRegistrationContext(self._version, sid=sid) + + def __call__(self, sid: str) -> BrandRegistrationContext: + """ + Constructs a BrandRegistrationContext + + :param sid: The SID of the Brand Registration resource to update. + """ + return BrandRegistrationContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e283294676b4fa73b41668aea672102d057c4e9c GIT binary patch literal 28241 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 Kk2pHBVf{aFAhuTk literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/__pycache__/brand_registration_otp.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/__pycache__/brand_registration_otp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..260902b40b12f22647569771a30cd990fb4d705a GIT binary patch literal 5419 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 XeIvib;kLB>3mzmUe#p_Cb>zPQaICBn literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/brand_registration_otp.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/brand_registration_otp.py new file mode 100644 index 00000000..415dec95 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/brand_registration_otp.py @@ -0,0 +1,121 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class BrandRegistrationOtpInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Brand Registration resource. + :ivar brand_registration_sid: The unique string to identify Brand Registration of Sole Proprietor Brand + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], brand_registration_sid: str + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.brand_registration_sid: Optional[str] = payload.get( + "brand_registration_sid" + ) + + self._solution = { + "brand_registration_sid": brand_registration_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BrandRegistrationOtpList(ListResource): + + def __init__(self, version: Version, brand_registration_sid: str): + """ + Initialize the BrandRegistrationOtpList + + :param version: Version that contains the resource + :param brand_registration_sid: Brand Registration Sid of Sole Proprietor Brand. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "brand_registration_sid": brand_registration_sid, + } + self._uri = "/a2p/BrandRegistrations/{brand_registration_sid}/SmsOtp".format( + **self._solution + ) + + def create(self) -> BrandRegistrationOtpInstance: + """ + Create the BrandRegistrationOtpInstance + + + :returns: The created BrandRegistrationOtpInstance + """ + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = self._version.create(method="POST", uri=self._uri, headers=headers) + + return BrandRegistrationOtpInstance( + self._version, + payload, + brand_registration_sid=self._solution["brand_registration_sid"], + ) + + async def create_async(self) -> BrandRegistrationOtpInstance: + """ + Asynchronously create the BrandRegistrationOtpInstance + + + :returns: The created BrandRegistrationOtpInstance + """ + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, headers=headers + ) + + return BrandRegistrationOtpInstance( + self._version, + payload, + brand_registration_sid=self._solution["brand_registration_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/brand_vetting.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/brand_vetting.py new file mode 100644 index 00000000..b633144a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/brand_registration/brand_vetting.py @@ -0,0 +1,561 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class BrandVettingInstance(InstanceResource): + + class VettingProvider(object): + CAMPAIGN_VERIFY = "campaign-verify" + AEGIS = "aegis" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the vetting record. + :ivar brand_sid: The unique string to identify Brand Registration. + :ivar brand_vetting_sid: The Twilio SID of the third-party vetting record. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar vetting_id: The unique identifier of the vetting from the third-party provider. + :ivar vetting_class: The type of vetting that has been conducted. One of “STANDARD” (Aegis) or “POLITICAL” (Campaign Verify). + :ivar vetting_status: The status of the import vetting attempt. One of “PENDING,” “SUCCESS,” or “FAILED”. + :ivar vetting_provider: + :ivar url: The absolute URL of the Brand Vetting resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + brand_sid: str, + brand_vetting_sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.brand_sid: Optional[str] = payload.get("brand_sid") + self.brand_vetting_sid: Optional[str] = payload.get("brand_vetting_sid") + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.vetting_id: Optional[str] = payload.get("vetting_id") + self.vetting_class: Optional[str] = payload.get("vetting_class") + self.vetting_status: Optional[str] = payload.get("vetting_status") + self.vetting_provider: Optional["BrandVettingInstance.VettingProvider"] = ( + payload.get("vetting_provider") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "brand_sid": brand_sid, + "brand_vetting_sid": brand_vetting_sid or self.brand_vetting_sid, + } + self._context: Optional[BrandVettingContext] = None + + @property + def _proxy(self) -> "BrandVettingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: BrandVettingContext for this BrandVettingInstance + """ + if self._context is None: + self._context = BrandVettingContext( + self._version, + brand_sid=self._solution["brand_sid"], + brand_vetting_sid=self._solution["brand_vetting_sid"], + ) + return self._context + + def fetch(self) -> "BrandVettingInstance": + """ + Fetch the BrandVettingInstance + + + :returns: The fetched BrandVettingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "BrandVettingInstance": + """ + Asynchronous coroutine to fetch the BrandVettingInstance + + + :returns: The fetched BrandVettingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BrandVettingContext(InstanceContext): + + def __init__(self, version: Version, brand_sid: str, brand_vetting_sid: str): + """ + Initialize the BrandVettingContext + + :param version: Version that contains the resource + :param brand_sid: The SID of the Brand Registration resource of the vettings to read . + :param brand_vetting_sid: The Twilio SID of the third-party vetting record. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "brand_sid": brand_sid, + "brand_vetting_sid": brand_vetting_sid, + } + self._uri = ( + "/a2p/BrandRegistrations/{brand_sid}/Vettings/{brand_vetting_sid}".format( + **self._solution + ) + ) + + def fetch(self) -> BrandVettingInstance: + """ + Fetch the BrandVettingInstance + + + :returns: The fetched BrandVettingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return BrandVettingInstance( + self._version, + payload, + brand_sid=self._solution["brand_sid"], + brand_vetting_sid=self._solution["brand_vetting_sid"], + ) + + async def fetch_async(self) -> BrandVettingInstance: + """ + Asynchronous coroutine to fetch the BrandVettingInstance + + + :returns: The fetched BrandVettingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return BrandVettingInstance( + self._version, + payload, + brand_sid=self._solution["brand_sid"], + brand_vetting_sid=self._solution["brand_vetting_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BrandVettingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> BrandVettingInstance: + """ + Build an instance of BrandVettingInstance + + :param payload: Payload response from the API + """ + return BrandVettingInstance( + self._version, payload, brand_sid=self._solution["brand_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class BrandVettingList(ListResource): + + def __init__(self, version: Version, brand_sid: str): + """ + Initialize the BrandVettingList + + :param version: Version that contains the resource + :param brand_sid: The SID of the Brand Registration resource of the vettings to read . + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "brand_sid": brand_sid, + } + self._uri = "/a2p/BrandRegistrations/{brand_sid}/Vettings".format( + **self._solution + ) + + def create( + self, + vetting_provider: "BrandVettingInstance.VettingProvider", + vetting_id: Union[str, object] = values.unset, + ) -> BrandVettingInstance: + """ + Create the BrandVettingInstance + + :param vetting_provider: + :param vetting_id: The unique ID of the vetting + + :returns: The created BrandVettingInstance + """ + + data = values.of( + { + "VettingProvider": vetting_provider, + "VettingId": vetting_id, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BrandVettingInstance( + self._version, payload, brand_sid=self._solution["brand_sid"] + ) + + async def create_async( + self, + vetting_provider: "BrandVettingInstance.VettingProvider", + vetting_id: Union[str, object] = values.unset, + ) -> BrandVettingInstance: + """ + Asynchronously create the BrandVettingInstance + + :param vetting_provider: + :param vetting_id: The unique ID of the vetting + + :returns: The created BrandVettingInstance + """ + + data = values.of( + { + "VettingProvider": vetting_provider, + "VettingId": vetting_id, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BrandVettingInstance( + self._version, payload, brand_sid=self._solution["brand_sid"] + ) + + def stream( + self, + vetting_provider: Union[ + "BrandVettingInstance.VettingProvider", object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[BrandVettingInstance]: + """ + Streams BrandVettingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "BrandVettingInstance.VettingProvider" vetting_provider: The third-party provider of the vettings to read + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + vetting_provider=vetting_provider, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + vetting_provider: Union[ + "BrandVettingInstance.VettingProvider", object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[BrandVettingInstance]: + """ + Asynchronously streams BrandVettingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "BrandVettingInstance.VettingProvider" vetting_provider: The third-party provider of the vettings to read + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + vetting_provider=vetting_provider, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + vetting_provider: Union[ + "BrandVettingInstance.VettingProvider", object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BrandVettingInstance]: + """ + Lists BrandVettingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "BrandVettingInstance.VettingProvider" vetting_provider: The third-party provider of the vettings to read + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + vetting_provider=vetting_provider, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + vetting_provider: Union[ + "BrandVettingInstance.VettingProvider", object + ] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BrandVettingInstance]: + """ + Asynchronously lists BrandVettingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "BrandVettingInstance.VettingProvider" vetting_provider: The third-party provider of the vettings to read + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + vetting_provider=vetting_provider, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + vetting_provider: Union[ + "BrandVettingInstance.VettingProvider", object + ] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BrandVettingPage: + """ + Retrieve a single page of BrandVettingInstance records from the API. + Request is executed immediately + + :param vetting_provider: The third-party provider of the vettings to read + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BrandVettingInstance + """ + data = values.of( + { + "VettingProvider": vetting_provider, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BrandVettingPage(self._version, response, self._solution) + + async def page_async( + self, + vetting_provider: Union[ + "BrandVettingInstance.VettingProvider", object + ] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BrandVettingPage: + """ + Asynchronously retrieve a single page of BrandVettingInstance records from the API. + Request is executed immediately + + :param vetting_provider: The third-party provider of the vettings to read + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BrandVettingInstance + """ + data = values.of( + { + "VettingProvider": vetting_provider, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BrandVettingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> BrandVettingPage: + """ + Retrieve a specific page of BrandVettingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BrandVettingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return BrandVettingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> BrandVettingPage: + """ + Asynchronously retrieve a specific page of BrandVettingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BrandVettingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return BrandVettingPage(self._version, response, self._solution) + + def get(self, brand_vetting_sid: str) -> BrandVettingContext: + """ + Constructs a BrandVettingContext + + :param brand_vetting_sid: The Twilio SID of the third-party vetting record. + """ + return BrandVettingContext( + self._version, + brand_sid=self._solution["brand_sid"], + brand_vetting_sid=brand_vetting_sid, + ) + + def __call__(self, brand_vetting_sid: str) -> BrandVettingContext: + """ + Constructs a BrandVettingContext + + :param brand_vetting_sid: The Twilio SID of the third-party vetting record. + """ + return BrandVettingContext( + self._version, + brand_sid=self._solution["brand_sid"], + brand_vetting_sid=brand_vetting_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/deactivations.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/deactivations.py new file mode 100644 index 00000000..e2cbf17a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/deactivations.py @@ -0,0 +1,199 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date +from typing import Any, Dict, Optional, Union +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class DeactivationsInstance(InstanceResource): + """ + :ivar redirect_to: Returns an authenticated url that redirects to a file containing the deactivated numbers for the requested day. This url is valid for up to two minutes. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.redirect_to: Optional[str] = payload.get("redirect_to") + + self._context: Optional[DeactivationsContext] = None + + @property + def _proxy(self) -> "DeactivationsContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DeactivationsContext for this DeactivationsInstance + """ + if self._context is None: + self._context = DeactivationsContext( + self._version, + ) + return self._context + + def fetch( + self, date: Union[date, object] = values.unset + ) -> "DeactivationsInstance": + """ + Fetch the DeactivationsInstance + + :param date: The request will return a list of all United States Phone Numbers that were deactivated on the day specified by this parameter. This date should be specified in YYYY-MM-DD format. + + :returns: The fetched DeactivationsInstance + """ + return self._proxy.fetch( + date=date, + ) + + async def fetch_async( + self, date: Union[date, object] = values.unset + ) -> "DeactivationsInstance": + """ + Asynchronous coroutine to fetch the DeactivationsInstance + + :param date: The request will return a list of all United States Phone Numbers that were deactivated on the day specified by this parameter. This date should be specified in YYYY-MM-DD format. + + :returns: The fetched DeactivationsInstance + """ + return await self._proxy.fetch_async( + date=date, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class DeactivationsContext(InstanceContext): + + def __init__(self, version: Version): + """ + Initialize the DeactivationsContext + + :param version: Version that contains the resource + """ + super().__init__(version) + + self._uri = "/Deactivations" + + def fetch(self, date: Union[date, object] = values.unset) -> DeactivationsInstance: + """ + Fetch the DeactivationsInstance + + :param date: The request will return a list of all United States Phone Numbers that were deactivated on the day specified by this parameter. This date should be specified in YYYY-MM-DD format. + + :returns: The fetched DeactivationsInstance + """ + + data = values.of( + { + "Date": serialize.iso8601_date(date), + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return DeactivationsInstance( + self._version, + payload, + ) + + async def fetch_async( + self, date: Union[date, object] = values.unset + ) -> DeactivationsInstance: + """ + Asynchronous coroutine to fetch the DeactivationsInstance + + :param date: The request will return a list of all United States Phone Numbers that were deactivated on the day specified by this parameter. This date should be specified in YYYY-MM-DD format. + + :returns: The fetched DeactivationsInstance + """ + + data = values.of( + { + "Date": serialize.iso8601_date(date), + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return DeactivationsInstance( + self._version, + payload, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class DeactivationsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the DeactivationsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self) -> DeactivationsContext: + """ + Constructs a DeactivationsContext + + """ + return DeactivationsContext(self._version) + + def __call__(self) -> DeactivationsContext: + """ + Constructs a DeactivationsContext + + """ + return DeactivationsContext(self._version) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/domain_certs.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/domain_certs.py new file mode 100644 index 00000000..6da256cd --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/domain_certs.py @@ -0,0 +1,337 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class DomainCertsInstance(InstanceResource): + """ + :ivar domain_sid: The unique string that we created to identify the Domain resource. + :ivar date_updated: Date that this Domain was last updated. + :ivar date_expires: Date that the private certificate associated with this domain expires. You will need to update the certificate before that date to ensure your shortened links will continue to work. + :ivar date_created: Date that this Domain was registered to the Twilio platform to create a new Domain object. + :ivar domain_name: Full url path for this domain. + :ivar certificate_sid: The unique string that we created to identify this Certificate resource. + :ivar url: + :ivar cert_in_validation: Optional JSON field describing the status and upload date of a new certificate in the process of validation + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + domain_sid: Optional[str] = None, + ): + super().__init__(version) + + self.domain_sid: Optional[str] = payload.get("domain_sid") + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.date_expires: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_expires") + ) + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.domain_name: Optional[str] = payload.get("domain_name") + self.certificate_sid: Optional[str] = payload.get("certificate_sid") + self.url: Optional[str] = payload.get("url") + self.cert_in_validation: Optional[Dict[str, object]] = payload.get( + "cert_in_validation" + ) + + self._solution = { + "domain_sid": domain_sid or self.domain_sid, + } + self._context: Optional[DomainCertsContext] = None + + @property + def _proxy(self) -> "DomainCertsContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DomainCertsContext for this DomainCertsInstance + """ + if self._context is None: + self._context = DomainCertsContext( + self._version, + domain_sid=self._solution["domain_sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the DomainCertsInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the DomainCertsInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "DomainCertsInstance": + """ + Fetch the DomainCertsInstance + + + :returns: The fetched DomainCertsInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DomainCertsInstance": + """ + Asynchronous coroutine to fetch the DomainCertsInstance + + + :returns: The fetched DomainCertsInstance + """ + return await self._proxy.fetch_async() + + def update(self, tls_cert: str) -> "DomainCertsInstance": + """ + Update the DomainCertsInstance + + :param tls_cert: Contains the full TLS certificate and private for this domain in PEM format: https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail. Twilio uses this information to process HTTPS traffic sent to your domain. + + :returns: The updated DomainCertsInstance + """ + return self._proxy.update( + tls_cert=tls_cert, + ) + + async def update_async(self, tls_cert: str) -> "DomainCertsInstance": + """ + Asynchronous coroutine to update the DomainCertsInstance + + :param tls_cert: Contains the full TLS certificate and private for this domain in PEM format: https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail. Twilio uses this information to process HTTPS traffic sent to your domain. + + :returns: The updated DomainCertsInstance + """ + return await self._proxy.update_async( + tls_cert=tls_cert, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DomainCertsContext(InstanceContext): + + def __init__(self, version: Version, domain_sid: str): + """ + Initialize the DomainCertsContext + + :param version: Version that contains the resource + :param domain_sid: Unique string used to identify the domain that this certificate should be associated with. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "domain_sid": domain_sid, + } + self._uri = "/LinkShortening/Domains/{domain_sid}/Certificate".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the DomainCertsInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the DomainCertsInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> DomainCertsInstance: + """ + Fetch the DomainCertsInstance + + + :returns: The fetched DomainCertsInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DomainCertsInstance( + self._version, + payload, + domain_sid=self._solution["domain_sid"], + ) + + async def fetch_async(self) -> DomainCertsInstance: + """ + Asynchronous coroutine to fetch the DomainCertsInstance + + + :returns: The fetched DomainCertsInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DomainCertsInstance( + self._version, + payload, + domain_sid=self._solution["domain_sid"], + ) + + def update(self, tls_cert: str) -> DomainCertsInstance: + """ + Update the DomainCertsInstance + + :param tls_cert: Contains the full TLS certificate and private for this domain in PEM format: https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail. Twilio uses this information to process HTTPS traffic sent to your domain. + + :returns: The updated DomainCertsInstance + """ + + data = values.of( + { + "TlsCert": tls_cert, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DomainCertsInstance( + self._version, payload, domain_sid=self._solution["domain_sid"] + ) + + async def update_async(self, tls_cert: str) -> DomainCertsInstance: + """ + Asynchronous coroutine to update the DomainCertsInstance + + :param tls_cert: Contains the full TLS certificate and private for this domain in PEM format: https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail. Twilio uses this information to process HTTPS traffic sent to your domain. + + :returns: The updated DomainCertsInstance + """ + + data = values.of( + { + "TlsCert": tls_cert, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DomainCertsInstance( + self._version, payload, domain_sid=self._solution["domain_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DomainCertsList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the DomainCertsList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, domain_sid: str) -> DomainCertsContext: + """ + Constructs a DomainCertsContext + + :param domain_sid: Unique string used to identify the domain that this certificate should be associated with. + """ + return DomainCertsContext(self._version, domain_sid=domain_sid) + + def __call__(self, domain_sid: str) -> DomainCertsContext: + """ + Constructs a DomainCertsContext + + :param domain_sid: Unique string used to identify the domain that this certificate should be associated with. + """ + return DomainCertsContext(self._version, domain_sid=domain_sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/domain_config.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/domain_config.py new file mode 100644 index 00000000..ed703510 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/domain_config.py @@ -0,0 +1,339 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class DomainConfigInstance(InstanceResource): + """ + :ivar domain_sid: The unique string that we created to identify the Domain resource. + :ivar config_sid: The unique string that we created to identify the Domain config (prefix ZK). + :ivar fallback_url: Any requests we receive to this domain that do not match an existing shortened message will be redirected to the fallback url. These will likely be either expired messages, random misdirected traffic, or intentional scraping. + :ivar callback_url: URL to receive click events to your webhook whenever the recipients click on the shortened links. + :ivar continue_on_failure: Boolean field to set customer delivery preference when there is a failure in linkShortening service + :ivar date_created: Date this Domain Config was created. + :ivar date_updated: Date that this Domain Config was last updated. + :ivar url: + :ivar disable_https: Customer's choice to send links with/without \"https://\" attached to shortened url. If true, messages will not be sent with https:// at the beginning of the url. If false, messages will be sent with https:// at the beginning of the url. False is the default behavior if it is not specified. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + domain_sid: Optional[str] = None, + ): + super().__init__(version) + + self.domain_sid: Optional[str] = payload.get("domain_sid") + self.config_sid: Optional[str] = payload.get("config_sid") + self.fallback_url: Optional[str] = payload.get("fallback_url") + self.callback_url: Optional[str] = payload.get("callback_url") + self.continue_on_failure: Optional[bool] = payload.get("continue_on_failure") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.disable_https: Optional[bool] = payload.get("disable_https") + + self._solution = { + "domain_sid": domain_sid or self.domain_sid, + } + self._context: Optional[DomainConfigContext] = None + + @property + def _proxy(self) -> "DomainConfigContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DomainConfigContext for this DomainConfigInstance + """ + if self._context is None: + self._context = DomainConfigContext( + self._version, + domain_sid=self._solution["domain_sid"], + ) + return self._context + + def fetch(self) -> "DomainConfigInstance": + """ + Fetch the DomainConfigInstance + + + :returns: The fetched DomainConfigInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DomainConfigInstance": + """ + Asynchronous coroutine to fetch the DomainConfigInstance + + + :returns: The fetched DomainConfigInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + fallback_url: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + continue_on_failure: Union[bool, object] = values.unset, + disable_https: Union[bool, object] = values.unset, + ) -> "DomainConfigInstance": + """ + Update the DomainConfigInstance + + :param fallback_url: Any requests we receive to this domain that do not match an existing shortened message will be redirected to the fallback url. These will likely be either expired messages, random misdirected traffic, or intentional scraping. + :param callback_url: URL to receive click events to your webhook whenever the recipients click on the shortened links + :param continue_on_failure: Boolean field to set customer delivery preference when there is a failure in linkShortening service + :param disable_https: Customer's choice to send links with/without \\\"https://\\\" attached to shortened url. If true, messages will not be sent with https:// at the beginning of the url. If false, messages will be sent with https:// at the beginning of the url. False is the default behavior if it is not specified. + + :returns: The updated DomainConfigInstance + """ + return self._proxy.update( + fallback_url=fallback_url, + callback_url=callback_url, + continue_on_failure=continue_on_failure, + disable_https=disable_https, + ) + + async def update_async( + self, + fallback_url: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + continue_on_failure: Union[bool, object] = values.unset, + disable_https: Union[bool, object] = values.unset, + ) -> "DomainConfigInstance": + """ + Asynchronous coroutine to update the DomainConfigInstance + + :param fallback_url: Any requests we receive to this domain that do not match an existing shortened message will be redirected to the fallback url. These will likely be either expired messages, random misdirected traffic, or intentional scraping. + :param callback_url: URL to receive click events to your webhook whenever the recipients click on the shortened links + :param continue_on_failure: Boolean field to set customer delivery preference when there is a failure in linkShortening service + :param disable_https: Customer's choice to send links with/without \\\"https://\\\" attached to shortened url. If true, messages will not be sent with https:// at the beginning of the url. If false, messages will be sent with https:// at the beginning of the url. False is the default behavior if it is not specified. + + :returns: The updated DomainConfigInstance + """ + return await self._proxy.update_async( + fallback_url=fallback_url, + callback_url=callback_url, + continue_on_failure=continue_on_failure, + disable_https=disable_https, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DomainConfigContext(InstanceContext): + + def __init__(self, version: Version, domain_sid: str): + """ + Initialize the DomainConfigContext + + :param version: Version that contains the resource + :param domain_sid: Unique string used to identify the domain that this config should be associated with. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "domain_sid": domain_sid, + } + self._uri = "/LinkShortening/Domains/{domain_sid}/Config".format( + **self._solution + ) + + def fetch(self) -> DomainConfigInstance: + """ + Fetch the DomainConfigInstance + + + :returns: The fetched DomainConfigInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DomainConfigInstance( + self._version, + payload, + domain_sid=self._solution["domain_sid"], + ) + + async def fetch_async(self) -> DomainConfigInstance: + """ + Asynchronous coroutine to fetch the DomainConfigInstance + + + :returns: The fetched DomainConfigInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DomainConfigInstance( + self._version, + payload, + domain_sid=self._solution["domain_sid"], + ) + + def update( + self, + fallback_url: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + continue_on_failure: Union[bool, object] = values.unset, + disable_https: Union[bool, object] = values.unset, + ) -> DomainConfigInstance: + """ + Update the DomainConfigInstance + + :param fallback_url: Any requests we receive to this domain that do not match an existing shortened message will be redirected to the fallback url. These will likely be either expired messages, random misdirected traffic, or intentional scraping. + :param callback_url: URL to receive click events to your webhook whenever the recipients click on the shortened links + :param continue_on_failure: Boolean field to set customer delivery preference when there is a failure in linkShortening service + :param disable_https: Customer's choice to send links with/without \\\"https://\\\" attached to shortened url. If true, messages will not be sent with https:// at the beginning of the url. If false, messages will be sent with https:// at the beginning of the url. False is the default behavior if it is not specified. + + :returns: The updated DomainConfigInstance + """ + + data = values.of( + { + "FallbackUrl": fallback_url, + "CallbackUrl": callback_url, + "ContinueOnFailure": serialize.boolean_to_string(continue_on_failure), + "DisableHttps": serialize.boolean_to_string(disable_https), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DomainConfigInstance( + self._version, payload, domain_sid=self._solution["domain_sid"] + ) + + async def update_async( + self, + fallback_url: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + continue_on_failure: Union[bool, object] = values.unset, + disable_https: Union[bool, object] = values.unset, + ) -> DomainConfigInstance: + """ + Asynchronous coroutine to update the DomainConfigInstance + + :param fallback_url: Any requests we receive to this domain that do not match an existing shortened message will be redirected to the fallback url. These will likely be either expired messages, random misdirected traffic, or intentional scraping. + :param callback_url: URL to receive click events to your webhook whenever the recipients click on the shortened links + :param continue_on_failure: Boolean field to set customer delivery preference when there is a failure in linkShortening service + :param disable_https: Customer's choice to send links with/without \\\"https://\\\" attached to shortened url. If true, messages will not be sent with https:// at the beginning of the url. If false, messages will be sent with https:// at the beginning of the url. False is the default behavior if it is not specified. + + :returns: The updated DomainConfigInstance + """ + + data = values.of( + { + "FallbackUrl": fallback_url, + "CallbackUrl": callback_url, + "ContinueOnFailure": serialize.boolean_to_string(continue_on_failure), + "DisableHttps": serialize.boolean_to_string(disable_https), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DomainConfigInstance( + self._version, payload, domain_sid=self._solution["domain_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DomainConfigList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the DomainConfigList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, domain_sid: str) -> DomainConfigContext: + """ + Constructs a DomainConfigContext + + :param domain_sid: Unique string used to identify the domain that this config should be associated with. + """ + return DomainConfigContext(self._version, domain_sid=domain_sid) + + def __call__(self, domain_sid: str) -> DomainConfigContext: + """ + Constructs a DomainConfigContext + + :param domain_sid: Unique string used to identify the domain that this config should be associated with. + """ + return DomainConfigContext(self._version, domain_sid=domain_sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/domain_config_messaging_service.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/domain_config_messaging_service.py new file mode 100644 index 00000000..2bcd4aa8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/domain_config_messaging_service.py @@ -0,0 +1,222 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class DomainConfigMessagingServiceInstance(InstanceResource): + """ + :ivar domain_sid: The unique string that we created to identify the Domain resource. + :ivar config_sid: The unique string that we created to identify the Domain config (prefix ZK). + :ivar messaging_service_sid: The unique string that identifies the messaging service + :ivar fallback_url: Any requests we receive to this domain that do not match an existing shortened message will be redirected to the fallback url. These will likely be either expired messages, random misdirected traffic, or intentional scraping. + :ivar callback_url: URL to receive click events to your webhook whenever the recipients click on the shortened links. + :ivar continue_on_failure: Boolean field to set customer delivery preference when there is a failure in linkShortening service + :ivar date_created: Date this Domain Config was created. + :ivar date_updated: Date that this Domain Config was last updated. + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + messaging_service_sid: Optional[str] = None, + ): + super().__init__(version) + + self.domain_sid: Optional[str] = payload.get("domain_sid") + self.config_sid: Optional[str] = payload.get("config_sid") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.fallback_url: Optional[str] = payload.get("fallback_url") + self.callback_url: Optional[str] = payload.get("callback_url") + self.continue_on_failure: Optional[bool] = payload.get("continue_on_failure") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "messaging_service_sid": messaging_service_sid + or self.messaging_service_sid, + } + self._context: Optional[DomainConfigMessagingServiceContext] = None + + @property + def _proxy(self) -> "DomainConfigMessagingServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DomainConfigMessagingServiceContext for this DomainConfigMessagingServiceInstance + """ + if self._context is None: + self._context = DomainConfigMessagingServiceContext( + self._version, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + return self._context + + def fetch(self) -> "DomainConfigMessagingServiceInstance": + """ + Fetch the DomainConfigMessagingServiceInstance + + + :returns: The fetched DomainConfigMessagingServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DomainConfigMessagingServiceInstance": + """ + Asynchronous coroutine to fetch the DomainConfigMessagingServiceInstance + + + :returns: The fetched DomainConfigMessagingServiceInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class DomainConfigMessagingServiceContext(InstanceContext): + + def __init__(self, version: Version, messaging_service_sid: str): + """ + Initialize the DomainConfigMessagingServiceContext + + :param version: Version that contains the resource + :param messaging_service_sid: Unique string used to identify the Messaging service that this domain should be associated with. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "messaging_service_sid": messaging_service_sid, + } + self._uri = "/LinkShortening/MessagingService/{messaging_service_sid}/DomainConfig".format( + **self._solution + ) + + def fetch(self) -> DomainConfigMessagingServiceInstance: + """ + Fetch the DomainConfigMessagingServiceInstance + + + :returns: The fetched DomainConfigMessagingServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DomainConfigMessagingServiceInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + async def fetch_async(self) -> DomainConfigMessagingServiceInstance: + """ + Asynchronous coroutine to fetch the DomainConfigMessagingServiceInstance + + + :returns: The fetched DomainConfigMessagingServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DomainConfigMessagingServiceInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class DomainConfigMessagingServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the DomainConfigMessagingServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, messaging_service_sid: str) -> DomainConfigMessagingServiceContext: + """ + Constructs a DomainConfigMessagingServiceContext + + :param messaging_service_sid: Unique string used to identify the Messaging service that this domain should be associated with. + """ + return DomainConfigMessagingServiceContext( + self._version, messaging_service_sid=messaging_service_sid + ) + + def __call__( + self, messaging_service_sid: str + ) -> DomainConfigMessagingServiceContext: + """ + Constructs a DomainConfigMessagingServiceContext + + :param messaging_service_sid: Unique string used to identify the Messaging service that this domain should be associated with. + """ + return DomainConfigMessagingServiceContext( + self._version, messaging_service_sid=messaging_service_sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/external_campaign.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/external_campaign.py new file mode 100644 index 00000000..eed039a6 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/external_campaign.py @@ -0,0 +1,143 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ExternalCampaignInstance(InstanceResource): + """ + :ivar sid: The unique string that identifies a US A2P Compliance resource `QE2c6890da8086d771620e9b13fadeba0b`. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that the Campaign belongs to. + :ivar campaign_id: ID of the preregistered campaign. + :ivar messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) that the resource is associated with. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.campaign_id: Optional[str] = payload.get("campaign_id") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class ExternalCampaignList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ExternalCampaignList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services/PreregisteredUsa2p" + + def create( + self, + campaign_id: str, + messaging_service_sid: str, + cnp_migration: Union[bool, object] = values.unset, + ) -> ExternalCampaignInstance: + """ + Create the ExternalCampaignInstance + + :param campaign_id: ID of the preregistered campaign. + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) that the resource is associated with. + :param cnp_migration: Customers should use this flag during the ERC registration process to indicate to Twilio that the campaign being registered is undergoing CNP migration. It is important for the user to first trigger the CNP migration process for said campaign in their CSP portal and have Twilio accept the sharing request, before making this api call. + + :returns: The created ExternalCampaignInstance + """ + + data = values.of( + { + "CampaignId": campaign_id, + "MessagingServiceSid": messaging_service_sid, + "CnpMigration": serialize.boolean_to_string(cnp_migration), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ExternalCampaignInstance(self._version, payload) + + async def create_async( + self, + campaign_id: str, + messaging_service_sid: str, + cnp_migration: Union[bool, object] = values.unset, + ) -> ExternalCampaignInstance: + """ + Asynchronously create the ExternalCampaignInstance + + :param campaign_id: ID of the preregistered campaign. + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) that the resource is associated with. + :param cnp_migration: Customers should use this flag during the ERC registration process to indicate to Twilio that the campaign being registered is undergoing CNP migration. It is important for the user to first trigger the CNP migration process for said campaign in their CSP portal and have Twilio accept the sharing request, before making this api call. + + :returns: The created ExternalCampaignInstance + """ + + data = values.of( + { + "CampaignId": campaign_id, + "MessagingServiceSid": messaging_service_sid, + "CnpMigration": serialize.boolean_to_string(cnp_migration), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ExternalCampaignInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/linkshortening_messaging_service.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/linkshortening_messaging_service.py new file mode 100644 index 00000000..ac69842a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/linkshortening_messaging_service.py @@ -0,0 +1,258 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class LinkshorteningMessagingServiceInstance(InstanceResource): + """ + :ivar domain_sid: The unique string identifies the domain resource + :ivar messaging_service_sid: The unique string that identifies the messaging service + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + domain_sid: Optional[str] = None, + messaging_service_sid: Optional[str] = None, + ): + super().__init__(version) + + self.domain_sid: Optional[str] = payload.get("domain_sid") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "domain_sid": domain_sid or self.domain_sid, + "messaging_service_sid": messaging_service_sid + or self.messaging_service_sid, + } + self._context: Optional[LinkshorteningMessagingServiceContext] = None + + @property + def _proxy(self) -> "LinkshorteningMessagingServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: LinkshorteningMessagingServiceContext for this LinkshorteningMessagingServiceInstance + """ + if self._context is None: + self._context = LinkshorteningMessagingServiceContext( + self._version, + domain_sid=self._solution["domain_sid"], + messaging_service_sid=self._solution["messaging_service_sid"], + ) + return self._context + + def create(self) -> "LinkshorteningMessagingServiceInstance": + """ + Create the LinkshorteningMessagingServiceInstance + + + :returns: The created LinkshorteningMessagingServiceInstance + """ + return self._proxy.create() + + async def create_async(self) -> "LinkshorteningMessagingServiceInstance": + """ + Asynchronous coroutine to create the LinkshorteningMessagingServiceInstance + + + :returns: The created LinkshorteningMessagingServiceInstance + """ + return await self._proxy.create_async() + + def delete(self) -> bool: + """ + Deletes the LinkshorteningMessagingServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the LinkshorteningMessagingServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class LinkshorteningMessagingServiceContext(InstanceContext): + + def __init__(self, version: Version, domain_sid: str, messaging_service_sid: str): + """ + Initialize the LinkshorteningMessagingServiceContext + + :param version: Version that contains the resource + :param domain_sid: The domain SID to dissociate from a messaging service. With URL shortening enabled, links in messages sent with the associated messaging service will be shortened to the provided domain + :param messaging_service_sid: A messaging service SID to dissociate from a domain. With URL shortening enabled, links in messages sent with the provided messaging service will be shortened to the associated domain + """ + super().__init__(version) + + # Path Solution + self._solution = { + "domain_sid": domain_sid, + "messaging_service_sid": messaging_service_sid, + } + self._uri = "/LinkShortening/Domains/{domain_sid}/MessagingServices/{messaging_service_sid}".format( + **self._solution + ) + + def create(self) -> LinkshorteningMessagingServiceInstance: + """ + Create the LinkshorteningMessagingServiceInstance + + + :returns: The created LinkshorteningMessagingServiceInstance + """ + data = values.of({}) + + payload = self._version.create(method="POST", uri=self._uri, data=data) + + return LinkshorteningMessagingServiceInstance( + self._version, + payload, + domain_sid=self._solution["domain_sid"], + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + async def create_async(self) -> LinkshorteningMessagingServiceInstance: + """ + Asynchronous coroutine to create the LinkshorteningMessagingServiceInstance + + + :returns: The created LinkshorteningMessagingServiceInstance + """ + data = values.of({}) + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data + ) + + return LinkshorteningMessagingServiceInstance( + self._version, + payload, + domain_sid=self._solution["domain_sid"], + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + def delete(self) -> bool: + """ + Deletes the LinkshorteningMessagingServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the LinkshorteningMessagingServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class LinkshorteningMessagingServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the LinkshorteningMessagingServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get( + self, domain_sid: str, messaging_service_sid: str + ) -> LinkshorteningMessagingServiceContext: + """ + Constructs a LinkshorteningMessagingServiceContext + + :param domain_sid: The domain SID to dissociate from a messaging service. With URL shortening enabled, links in messages sent with the associated messaging service will be shortened to the provided domain + :param messaging_service_sid: A messaging service SID to dissociate from a domain. With URL shortening enabled, links in messages sent with the provided messaging service will be shortened to the associated domain + """ + return LinkshorteningMessagingServiceContext( + self._version, + domain_sid=domain_sid, + messaging_service_sid=messaging_service_sid, + ) + + def __call__( + self, domain_sid: str, messaging_service_sid: str + ) -> LinkshorteningMessagingServiceContext: + """ + Constructs a LinkshorteningMessagingServiceContext + + :param domain_sid: The domain SID to dissociate from a messaging service. With URL shortening enabled, links in messages sent with the associated messaging service will be shortened to the provided domain + :param messaging_service_sid: A messaging service SID to dissociate from a domain. With URL shortening enabled, links in messages sent with the provided messaging service will be shortened to the associated domain + """ + return LinkshorteningMessagingServiceContext( + self._version, + domain_sid=domain_sid, + messaging_service_sid=messaging_service_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/linkshortening_messaging_service_domain_association.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/linkshortening_messaging_service_domain_association.py new file mode 100644 index 00000000..4c0b52bd --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/linkshortening_messaging_service_domain_association.py @@ -0,0 +1,217 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class LinkshorteningMessagingServiceDomainAssociationInstance(InstanceResource): + """ + :ivar domain_sid: The unique string that we created to identify the Domain resource. + :ivar messaging_service_sid: The unique string that identifies the messaging service + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + messaging_service_sid: Optional[str] = None, + ): + super().__init__(version) + + self.domain_sid: Optional[str] = payload.get("domain_sid") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "messaging_service_sid": messaging_service_sid + or self.messaging_service_sid, + } + self._context: Optional[ + LinkshorteningMessagingServiceDomainAssociationContext + ] = None + + @property + def _proxy(self) -> "LinkshorteningMessagingServiceDomainAssociationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: LinkshorteningMessagingServiceDomainAssociationContext for this LinkshorteningMessagingServiceDomainAssociationInstance + """ + if self._context is None: + self._context = LinkshorteningMessagingServiceDomainAssociationContext( + self._version, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + return self._context + + def fetch(self) -> "LinkshorteningMessagingServiceDomainAssociationInstance": + """ + Fetch the LinkshorteningMessagingServiceDomainAssociationInstance + + + :returns: The fetched LinkshorteningMessagingServiceDomainAssociationInstance + """ + return self._proxy.fetch() + + async def fetch_async( + self, + ) -> "LinkshorteningMessagingServiceDomainAssociationInstance": + """ + Asynchronous coroutine to fetch the LinkshorteningMessagingServiceDomainAssociationInstance + + + :returns: The fetched LinkshorteningMessagingServiceDomainAssociationInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class LinkshorteningMessagingServiceDomainAssociationContext(InstanceContext): + + def __init__(self, version: Version, messaging_service_sid: str): + """ + Initialize the LinkshorteningMessagingServiceDomainAssociationContext + + :param version: Version that contains the resource + :param messaging_service_sid: Unique string used to identify the Messaging service that this domain should be associated with. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "messaging_service_sid": messaging_service_sid, + } + self._uri = ( + "/LinkShortening/MessagingServices/{messaging_service_sid}/Domain".format( + **self._solution + ) + ) + + def fetch(self) -> LinkshorteningMessagingServiceDomainAssociationInstance: + """ + Fetch the LinkshorteningMessagingServiceDomainAssociationInstance + + + :returns: The fetched LinkshorteningMessagingServiceDomainAssociationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return LinkshorteningMessagingServiceDomainAssociationInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + async def fetch_async( + self, + ) -> LinkshorteningMessagingServiceDomainAssociationInstance: + """ + Asynchronous coroutine to fetch the LinkshorteningMessagingServiceDomainAssociationInstance + + + :returns: The fetched LinkshorteningMessagingServiceDomainAssociationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return LinkshorteningMessagingServiceDomainAssociationInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class LinkshorteningMessagingServiceDomainAssociationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the LinkshorteningMessagingServiceDomainAssociationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get( + self, messaging_service_sid: str + ) -> LinkshorteningMessagingServiceDomainAssociationContext: + """ + Constructs a LinkshorteningMessagingServiceDomainAssociationContext + + :param messaging_service_sid: Unique string used to identify the Messaging service that this domain should be associated with. + """ + return LinkshorteningMessagingServiceDomainAssociationContext( + self._version, messaging_service_sid=messaging_service_sid + ) + + def __call__( + self, messaging_service_sid: str + ) -> LinkshorteningMessagingServiceDomainAssociationContext: + """ + Constructs a LinkshorteningMessagingServiceDomainAssociationContext + + :param messaging_service_sid: Unique string used to identify the Messaging service that this domain should be associated with. + """ + return LinkshorteningMessagingServiceDomainAssociationContext( + self._version, messaging_service_sid=messaging_service_sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return ( + "" + ) diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/request_managed_cert.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/request_managed_cert.py new file mode 100644 index 00000000..81ccf948 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/request_managed_cert.py @@ -0,0 +1,213 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class RequestManagedCertInstance(InstanceResource): + """ + :ivar domain_sid: The unique string that we created to identify the Domain resource. + :ivar date_updated: Date that this Domain was last updated. + :ivar date_created: Date that this Domain was registered to the Twilio platform to create a new Domain object. + :ivar date_expires: Date that the private certificate associated with this domain expires. This is the expiration date of your existing cert. + :ivar domain_name: Full url path for this domain. + :ivar certificate_sid: The unique string that we created to identify this Certificate resource. + :ivar url: + :ivar managed: A boolean flag indicating if the certificate is managed by Twilio. + :ivar requesting: A boolean flag indicating if a managed certificate needs to be fulfilled by Twilio. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + domain_sid: Optional[str] = None, + ): + super().__init__(version) + + self.domain_sid: Optional[str] = payload.get("domain_sid") + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_expires: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_expires") + ) + self.domain_name: Optional[str] = payload.get("domain_name") + self.certificate_sid: Optional[str] = payload.get("certificate_sid") + self.url: Optional[str] = payload.get("url") + self.managed: Optional[bool] = payload.get("managed") + self.requesting: Optional[bool] = payload.get("requesting") + + self._solution = { + "domain_sid": domain_sid or self.domain_sid, + } + self._context: Optional[RequestManagedCertContext] = None + + @property + def _proxy(self) -> "RequestManagedCertContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RequestManagedCertContext for this RequestManagedCertInstance + """ + if self._context is None: + self._context = RequestManagedCertContext( + self._version, + domain_sid=self._solution["domain_sid"], + ) + return self._context + + def update(self) -> "RequestManagedCertInstance": + """ + Update the RequestManagedCertInstance + + + :returns: The updated RequestManagedCertInstance + """ + return self._proxy.update() + + async def update_async(self) -> "RequestManagedCertInstance": + """ + Asynchronous coroutine to update the RequestManagedCertInstance + + + :returns: The updated RequestManagedCertInstance + """ + return await self._proxy.update_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RequestManagedCertContext(InstanceContext): + + def __init__(self, version: Version, domain_sid: str): + """ + Initialize the RequestManagedCertContext + + :param version: Version that contains the resource + :param domain_sid: Unique string used to identify the domain that this certificate should be associated with. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "domain_sid": domain_sid, + } + self._uri = "/LinkShortening/Domains/{domain_sid}/RequestManagedCert".format( + **self._solution + ) + + def update(self) -> RequestManagedCertInstance: + """ + Update the RequestManagedCertInstance + + + :returns: The updated RequestManagedCertInstance + """ + + data = values.of({}) + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RequestManagedCertInstance( + self._version, payload, domain_sid=self._solution["domain_sid"] + ) + + async def update_async(self) -> RequestManagedCertInstance: + """ + Asynchronous coroutine to update the RequestManagedCertInstance + + + :returns: The updated RequestManagedCertInstance + """ + + data = values.of({}) + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RequestManagedCertInstance( + self._version, payload, domain_sid=self._solution["domain_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RequestManagedCertList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the RequestManagedCertList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, domain_sid: str) -> RequestManagedCertContext: + """ + Constructs a RequestManagedCertContext + + :param domain_sid: Unique string used to identify the domain that this certificate should be associated with. + """ + return RequestManagedCertContext(self._version, domain_sid=domain_sid) + + def __call__(self, domain_sid: str) -> RequestManagedCertContext: + """ + Constructs a RequestManagedCertContext + + :param domain_sid: Unique string used to identify the domain that this certificate should be associated with. + """ + return RequestManagedCertContext(self._version, domain_sid=domain_sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__init__.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__init__.py new file mode 100644 index 00000000..06a53c9a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__init__.py @@ -0,0 +1,1115 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.messaging.v1.service.alpha_sender import AlphaSenderList +from twilio.rest.messaging.v1.service.channel_sender import ChannelSenderList +from twilio.rest.messaging.v1.service.destination_alpha_sender import ( + DestinationAlphaSenderList, +) +from twilio.rest.messaging.v1.service.phone_number import PhoneNumberList +from twilio.rest.messaging.v1.service.short_code import ShortCodeList +from twilio.rest.messaging.v1.service.us_app_to_person import UsAppToPersonList +from twilio.rest.messaging.v1.service.us_app_to_person_usecase import ( + UsAppToPersonUsecaseList, +) + + +class ServiceInstance(InstanceResource): + + class ScanMessageContent(object): + INHERIT = "inherit" + ENABLE = "enable" + DISABLE = "disable" + + """ + :ivar sid: The unique string that we created to identify the Service resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Service resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar inbound_request_url: The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + :ivar inbound_method: The HTTP method we use to call `inbound_request_url`. Can be `GET` or `POST`. + :ivar fallback_url: The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + :ivar fallback_method: The HTTP method we use to call `fallback_url`. Can be: `GET` or `POST`. + :ivar status_callback: The URL we call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + :ivar sticky_sender: Whether to enable [Sticky Sender](https://www.twilio.com/docs/messaging/services#sticky-sender) on the Service instance. + :ivar mms_converter: Whether to enable the [MMS Converter](https://www.twilio.com/docs/messaging/services#mms-converter) for messages sent through the Service instance. + :ivar smart_encoding: Whether to enable [Smart Encoding](https://www.twilio.com/docs/messaging/services#smart-encoding) for messages sent through the Service instance. + :ivar scan_message_content: + :ivar fallback_to_long_code: [OBSOLETE] Former feature used to fallback to long code sender after certain short code message failures. + :ivar area_code_geomatch: Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/messaging/services#area-code-geomatch) on the Service Instance. + :ivar synchronous_validation: Reserved. + :ivar validity_period: How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. Default value is `14,400`. + :ivar url: The absolute URL of the Service resource. + :ivar links: The absolute URLs of related resources. + :ivar usecase: A string that describes the scenario in which the Messaging Service will be used. Possible values are `notifications`, `marketing`, `verification`, `discussion`, `poll`, `undeclared`. + :ivar us_app_to_person_registered: Whether US A2P campaign is registered for this Service. + :ivar use_inbound_webhook_on_number: A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.inbound_request_url: Optional[str] = payload.get("inbound_request_url") + self.inbound_method: Optional[str] = payload.get("inbound_method") + self.fallback_url: Optional[str] = payload.get("fallback_url") + self.fallback_method: Optional[str] = payload.get("fallback_method") + self.status_callback: Optional[str] = payload.get("status_callback") + self.sticky_sender: Optional[bool] = payload.get("sticky_sender") + self.mms_converter: Optional[bool] = payload.get("mms_converter") + self.smart_encoding: Optional[bool] = payload.get("smart_encoding") + self.scan_message_content: Optional["ServiceInstance.ScanMessageContent"] = ( + payload.get("scan_message_content") + ) + self.fallback_to_long_code: Optional[bool] = payload.get( + "fallback_to_long_code" + ) + self.area_code_geomatch: Optional[bool] = payload.get("area_code_geomatch") + self.synchronous_validation: Optional[bool] = payload.get( + "synchronous_validation" + ) + self.validity_period: Optional[int] = deserialize.integer( + payload.get("validity_period") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + self.usecase: Optional[str] = payload.get("usecase") + self.us_app_to_person_registered: Optional[bool] = payload.get( + "us_app_to_person_registered" + ) + self.use_inbound_webhook_on_number: Optional[bool] = payload.get( + "use_inbound_webhook_on_number" + ) + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ServiceContext] = None + + @property + def _proxy(self) -> "ServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ServiceContext for this ServiceInstance + """ + if self._context is None: + self._context = ServiceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ServiceInstance": + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ServiceInstance": + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + inbound_request_url: Union[str, object] = values.unset, + inbound_method: Union[str, object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + sticky_sender: Union[bool, object] = values.unset, + mms_converter: Union[bool, object] = values.unset, + smart_encoding: Union[bool, object] = values.unset, + scan_message_content: Union[ + "ServiceInstance.ScanMessageContent", object + ] = values.unset, + fallback_to_long_code: Union[bool, object] = values.unset, + area_code_geomatch: Union[bool, object] = values.unset, + validity_period: Union[int, object] = values.unset, + synchronous_validation: Union[bool, object] = values.unset, + usecase: Union[str, object] = values.unset, + use_inbound_webhook_on_number: Union[bool, object] = values.unset, + ) -> "ServiceInstance": + """ + Update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param inbound_request_url: The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + :param inbound_method: The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + :param fallback_url: The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + :param fallback_method: The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + :param sticky_sender: Whether to enable [Sticky Sender](https://www.twilio.com/docs/messaging/services#sticky-sender) on the Service instance. + :param mms_converter: Whether to enable the [MMS Converter](https://www.twilio.com/docs/messaging/services#mms-converter) for messages sent through the Service instance. + :param smart_encoding: Whether to enable [Smart Encoding](https://www.twilio.com/docs/messaging/services#smart-encoding) for messages sent through the Service instance. + :param scan_message_content: + :param fallback_to_long_code: [OBSOLETE] Former feature used to fallback to long code sender after certain short code message failures. + :param area_code_geomatch: Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/messaging/services#area-code-geomatch) on the Service Instance. + :param validity_period: How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. Default value is `14,400`. + :param synchronous_validation: Reserved. + :param usecase: A string that describes the scenario in which the Messaging Service will be used. Possible values are `notifications`, `marketing`, `verification`, `discussion`, `poll`, `undeclared`. + :param use_inbound_webhook_on_number: A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + + :returns: The updated ServiceInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + inbound_request_url=inbound_request_url, + inbound_method=inbound_method, + fallback_url=fallback_url, + fallback_method=fallback_method, + status_callback=status_callback, + sticky_sender=sticky_sender, + mms_converter=mms_converter, + smart_encoding=smart_encoding, + scan_message_content=scan_message_content, + fallback_to_long_code=fallback_to_long_code, + area_code_geomatch=area_code_geomatch, + validity_period=validity_period, + synchronous_validation=synchronous_validation, + usecase=usecase, + use_inbound_webhook_on_number=use_inbound_webhook_on_number, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + inbound_request_url: Union[str, object] = values.unset, + inbound_method: Union[str, object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + sticky_sender: Union[bool, object] = values.unset, + mms_converter: Union[bool, object] = values.unset, + smart_encoding: Union[bool, object] = values.unset, + scan_message_content: Union[ + "ServiceInstance.ScanMessageContent", object + ] = values.unset, + fallback_to_long_code: Union[bool, object] = values.unset, + area_code_geomatch: Union[bool, object] = values.unset, + validity_period: Union[int, object] = values.unset, + synchronous_validation: Union[bool, object] = values.unset, + usecase: Union[str, object] = values.unset, + use_inbound_webhook_on_number: Union[bool, object] = values.unset, + ) -> "ServiceInstance": + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param inbound_request_url: The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + :param inbound_method: The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + :param fallback_url: The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + :param fallback_method: The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + :param sticky_sender: Whether to enable [Sticky Sender](https://www.twilio.com/docs/messaging/services#sticky-sender) on the Service instance. + :param mms_converter: Whether to enable the [MMS Converter](https://www.twilio.com/docs/messaging/services#mms-converter) for messages sent through the Service instance. + :param smart_encoding: Whether to enable [Smart Encoding](https://www.twilio.com/docs/messaging/services#smart-encoding) for messages sent through the Service instance. + :param scan_message_content: + :param fallback_to_long_code: [OBSOLETE] Former feature used to fallback to long code sender after certain short code message failures. + :param area_code_geomatch: Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/messaging/services#area-code-geomatch) on the Service Instance. + :param validity_period: How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. Default value is `14,400`. + :param synchronous_validation: Reserved. + :param usecase: A string that describes the scenario in which the Messaging Service will be used. Possible values are `notifications`, `marketing`, `verification`, `discussion`, `poll`, `undeclared`. + :param use_inbound_webhook_on_number: A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + + :returns: The updated ServiceInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + inbound_request_url=inbound_request_url, + inbound_method=inbound_method, + fallback_url=fallback_url, + fallback_method=fallback_method, + status_callback=status_callback, + sticky_sender=sticky_sender, + mms_converter=mms_converter, + smart_encoding=smart_encoding, + scan_message_content=scan_message_content, + fallback_to_long_code=fallback_to_long_code, + area_code_geomatch=area_code_geomatch, + validity_period=validity_period, + synchronous_validation=synchronous_validation, + usecase=usecase, + use_inbound_webhook_on_number=use_inbound_webhook_on_number, + ) + + @property + def alpha_senders(self) -> AlphaSenderList: + """ + Access the alpha_senders + """ + return self._proxy.alpha_senders + + @property + def channel_senders(self) -> ChannelSenderList: + """ + Access the channel_senders + """ + return self._proxy.channel_senders + + @property + def destination_alpha_senders(self) -> DestinationAlphaSenderList: + """ + Access the destination_alpha_senders + """ + return self._proxy.destination_alpha_senders + + @property + def phone_numbers(self) -> PhoneNumberList: + """ + Access the phone_numbers + """ + return self._proxy.phone_numbers + + @property + def short_codes(self) -> ShortCodeList: + """ + Access the short_codes + """ + return self._proxy.short_codes + + @property + def us_app_to_person(self) -> UsAppToPersonList: + """ + Access the us_app_to_person + """ + return self._proxy.us_app_to_person + + @property + def us_app_to_person_usecases(self) -> UsAppToPersonUsecaseList: + """ + Access the us_app_to_person_usecases + """ + return self._proxy.us_app_to_person_usecases + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServiceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ServiceContext + + :param version: Version that contains the resource + :param sid: The SID of the Service resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Services/{sid}".format(**self._solution) + + self._alpha_senders: Optional[AlphaSenderList] = None + self._channel_senders: Optional[ChannelSenderList] = None + self._destination_alpha_senders: Optional[DestinationAlphaSenderList] = None + self._phone_numbers: Optional[PhoneNumberList] = None + self._short_codes: Optional[ShortCodeList] = None + self._us_app_to_person: Optional[UsAppToPersonList] = None + self._us_app_to_person_usecases: Optional[UsAppToPersonUsecaseList] = None + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ServiceInstance: + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ServiceInstance: + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + inbound_request_url: Union[str, object] = values.unset, + inbound_method: Union[str, object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + sticky_sender: Union[bool, object] = values.unset, + mms_converter: Union[bool, object] = values.unset, + smart_encoding: Union[bool, object] = values.unset, + scan_message_content: Union[ + "ServiceInstance.ScanMessageContent", object + ] = values.unset, + fallback_to_long_code: Union[bool, object] = values.unset, + area_code_geomatch: Union[bool, object] = values.unset, + validity_period: Union[int, object] = values.unset, + synchronous_validation: Union[bool, object] = values.unset, + usecase: Union[str, object] = values.unset, + use_inbound_webhook_on_number: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param inbound_request_url: The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + :param inbound_method: The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + :param fallback_url: The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + :param fallback_method: The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + :param sticky_sender: Whether to enable [Sticky Sender](https://www.twilio.com/docs/messaging/services#sticky-sender) on the Service instance. + :param mms_converter: Whether to enable the [MMS Converter](https://www.twilio.com/docs/messaging/services#mms-converter) for messages sent through the Service instance. + :param smart_encoding: Whether to enable [Smart Encoding](https://www.twilio.com/docs/messaging/services#smart-encoding) for messages sent through the Service instance. + :param scan_message_content: + :param fallback_to_long_code: [OBSOLETE] Former feature used to fallback to long code sender after certain short code message failures. + :param area_code_geomatch: Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/messaging/services#area-code-geomatch) on the Service Instance. + :param validity_period: How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. Default value is `14,400`. + :param synchronous_validation: Reserved. + :param usecase: A string that describes the scenario in which the Messaging Service will be used. Possible values are `notifications`, `marketing`, `verification`, `discussion`, `poll`, `undeclared`. + :param use_inbound_webhook_on_number: A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "InboundRequestUrl": inbound_request_url, + "InboundMethod": inbound_method, + "FallbackUrl": fallback_url, + "FallbackMethod": fallback_method, + "StatusCallback": status_callback, + "StickySender": serialize.boolean_to_string(sticky_sender), + "MmsConverter": serialize.boolean_to_string(mms_converter), + "SmartEncoding": serialize.boolean_to_string(smart_encoding), + "ScanMessageContent": scan_message_content, + "FallbackToLongCode": serialize.boolean_to_string( + fallback_to_long_code + ), + "AreaCodeGeomatch": serialize.boolean_to_string(area_code_geomatch), + "ValidityPeriod": validity_period, + "SynchronousValidation": serialize.boolean_to_string( + synchronous_validation + ), + "Usecase": usecase, + "UseInboundWebhookOnNumber": serialize.boolean_to_string( + use_inbound_webhook_on_number + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + inbound_request_url: Union[str, object] = values.unset, + inbound_method: Union[str, object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + sticky_sender: Union[bool, object] = values.unset, + mms_converter: Union[bool, object] = values.unset, + smart_encoding: Union[bool, object] = values.unset, + scan_message_content: Union[ + "ServiceInstance.ScanMessageContent", object + ] = values.unset, + fallback_to_long_code: Union[bool, object] = values.unset, + area_code_geomatch: Union[bool, object] = values.unset, + validity_period: Union[int, object] = values.unset, + synchronous_validation: Union[bool, object] = values.unset, + usecase: Union[str, object] = values.unset, + use_inbound_webhook_on_number: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param inbound_request_url: The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + :param inbound_method: The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + :param fallback_url: The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + :param fallback_method: The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + :param sticky_sender: Whether to enable [Sticky Sender](https://www.twilio.com/docs/messaging/services#sticky-sender) on the Service instance. + :param mms_converter: Whether to enable the [MMS Converter](https://www.twilio.com/docs/messaging/services#mms-converter) for messages sent through the Service instance. + :param smart_encoding: Whether to enable [Smart Encoding](https://www.twilio.com/docs/messaging/services#smart-encoding) for messages sent through the Service instance. + :param scan_message_content: + :param fallback_to_long_code: [OBSOLETE] Former feature used to fallback to long code sender after certain short code message failures. + :param area_code_geomatch: Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/messaging/services#area-code-geomatch) on the Service Instance. + :param validity_period: How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. Default value is `14,400`. + :param synchronous_validation: Reserved. + :param usecase: A string that describes the scenario in which the Messaging Service will be used. Possible values are `notifications`, `marketing`, `verification`, `discussion`, `poll`, `undeclared`. + :param use_inbound_webhook_on_number: A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "InboundRequestUrl": inbound_request_url, + "InboundMethod": inbound_method, + "FallbackUrl": fallback_url, + "FallbackMethod": fallback_method, + "StatusCallback": status_callback, + "StickySender": serialize.boolean_to_string(sticky_sender), + "MmsConverter": serialize.boolean_to_string(mms_converter), + "SmartEncoding": serialize.boolean_to_string(smart_encoding), + "ScanMessageContent": scan_message_content, + "FallbackToLongCode": serialize.boolean_to_string( + fallback_to_long_code + ), + "AreaCodeGeomatch": serialize.boolean_to_string(area_code_geomatch), + "ValidityPeriod": validity_period, + "SynchronousValidation": serialize.boolean_to_string( + synchronous_validation + ), + "Usecase": usecase, + "UseInboundWebhookOnNumber": serialize.boolean_to_string( + use_inbound_webhook_on_number + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def alpha_senders(self) -> AlphaSenderList: + """ + Access the alpha_senders + """ + if self._alpha_senders is None: + self._alpha_senders = AlphaSenderList( + self._version, + self._solution["sid"], + ) + return self._alpha_senders + + @property + def channel_senders(self) -> ChannelSenderList: + """ + Access the channel_senders + """ + if self._channel_senders is None: + self._channel_senders = ChannelSenderList( + self._version, + self._solution["sid"], + ) + return self._channel_senders + + @property + def destination_alpha_senders(self) -> DestinationAlphaSenderList: + """ + Access the destination_alpha_senders + """ + if self._destination_alpha_senders is None: + self._destination_alpha_senders = DestinationAlphaSenderList( + self._version, + self._solution["sid"], + ) + return self._destination_alpha_senders + + @property + def phone_numbers(self) -> PhoneNumberList: + """ + Access the phone_numbers + """ + if self._phone_numbers is None: + self._phone_numbers = PhoneNumberList( + self._version, + self._solution["sid"], + ) + return self._phone_numbers + + @property + def short_codes(self) -> ShortCodeList: + """ + Access the short_codes + """ + if self._short_codes is None: + self._short_codes = ShortCodeList( + self._version, + self._solution["sid"], + ) + return self._short_codes + + @property + def us_app_to_person(self) -> UsAppToPersonList: + """ + Access the us_app_to_person + """ + if self._us_app_to_person is None: + self._us_app_to_person = UsAppToPersonList( + self._version, + self._solution["sid"], + ) + return self._us_app_to_person + + @property + def us_app_to_person_usecases(self) -> UsAppToPersonUsecaseList: + """ + Access the us_app_to_person_usecases + """ + if self._us_app_to_person_usecases is None: + self._us_app_to_person_usecases = UsAppToPersonUsecaseList( + self._version, + self._solution["sid"], + ) + return self._us_app_to_person_usecases + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ServiceInstance: + """ + Build an instance of ServiceInstance + + :param payload: Payload response from the API + """ + return ServiceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services" + + def create( + self, + friendly_name: str, + inbound_request_url: Union[str, object] = values.unset, + inbound_method: Union[str, object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + sticky_sender: Union[bool, object] = values.unset, + mms_converter: Union[bool, object] = values.unset, + smart_encoding: Union[bool, object] = values.unset, + scan_message_content: Union[ + "ServiceInstance.ScanMessageContent", object + ] = values.unset, + fallback_to_long_code: Union[bool, object] = values.unset, + area_code_geomatch: Union[bool, object] = values.unset, + validity_period: Union[int, object] = values.unset, + synchronous_validation: Union[bool, object] = values.unset, + usecase: Union[str, object] = values.unset, + use_inbound_webhook_on_number: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Create the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param inbound_request_url: The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + :param inbound_method: The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + :param fallback_url: The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + :param fallback_method: The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + :param sticky_sender: Whether to enable [Sticky Sender](https://www.twilio.com/docs/messaging/services#sticky-sender) on the Service instance. + :param mms_converter: Whether to enable the [MMS Converter](https://www.twilio.com/docs/messaging/services#mms-converter) for messages sent through the Service instance. + :param smart_encoding: Whether to enable [Smart Encoding](https://www.twilio.com/docs/messaging/services#smart-encoding) for messages sent through the Service instance. + :param scan_message_content: + :param fallback_to_long_code: [OBSOLETE] Former feature used to fallback to long code sender after certain short code message failures. + :param area_code_geomatch: Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/messaging/services#area-code-geomatch) on the Service Instance. + :param validity_period: How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. Default value is `14,400`. + :param synchronous_validation: Reserved. + :param usecase: A string that describes the scenario in which the Messaging Service will be used. Possible values are `notifications`, `marketing`, `verification`, `discussion`, `poll`, `undeclared`. + :param use_inbound_webhook_on_number: A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "InboundRequestUrl": inbound_request_url, + "InboundMethod": inbound_method, + "FallbackUrl": fallback_url, + "FallbackMethod": fallback_method, + "StatusCallback": status_callback, + "StickySender": serialize.boolean_to_string(sticky_sender), + "MmsConverter": serialize.boolean_to_string(mms_converter), + "SmartEncoding": serialize.boolean_to_string(smart_encoding), + "ScanMessageContent": scan_message_content, + "FallbackToLongCode": serialize.boolean_to_string( + fallback_to_long_code + ), + "AreaCodeGeomatch": serialize.boolean_to_string(area_code_geomatch), + "ValidityPeriod": validity_period, + "SynchronousValidation": serialize.boolean_to_string( + synchronous_validation + ), + "Usecase": usecase, + "UseInboundWebhookOnNumber": serialize.boolean_to_string( + use_inbound_webhook_on_number + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + async def create_async( + self, + friendly_name: str, + inbound_request_url: Union[str, object] = values.unset, + inbound_method: Union[str, object] = values.unset, + fallback_url: Union[str, object] = values.unset, + fallback_method: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + sticky_sender: Union[bool, object] = values.unset, + mms_converter: Union[bool, object] = values.unset, + smart_encoding: Union[bool, object] = values.unset, + scan_message_content: Union[ + "ServiceInstance.ScanMessageContent", object + ] = values.unset, + fallback_to_long_code: Union[bool, object] = values.unset, + area_code_geomatch: Union[bool, object] = values.unset, + validity_period: Union[int, object] = values.unset, + synchronous_validation: Union[bool, object] = values.unset, + usecase: Union[str, object] = values.unset, + use_inbound_webhook_on_number: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronously create the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param inbound_request_url: The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + :param inbound_method: The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + :param fallback_url: The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + :param fallback_method: The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + :param status_callback: The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + :param sticky_sender: Whether to enable [Sticky Sender](https://www.twilio.com/docs/messaging/services#sticky-sender) on the Service instance. + :param mms_converter: Whether to enable the [MMS Converter](https://www.twilio.com/docs/messaging/services#mms-converter) for messages sent through the Service instance. + :param smart_encoding: Whether to enable [Smart Encoding](https://www.twilio.com/docs/messaging/services#smart-encoding) for messages sent through the Service instance. + :param scan_message_content: + :param fallback_to_long_code: [OBSOLETE] Former feature used to fallback to long code sender after certain short code message failures. + :param area_code_geomatch: Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/messaging/services#area-code-geomatch) on the Service Instance. + :param validity_period: How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. Default value is `14,400`. + :param synchronous_validation: Reserved. + :param usecase: A string that describes the scenario in which the Messaging Service will be used. Possible values are `notifications`, `marketing`, `verification`, `discussion`, `poll`, `undeclared`. + :param use_inbound_webhook_on_number: A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "InboundRequestUrl": inbound_request_url, + "InboundMethod": inbound_method, + "FallbackUrl": fallback_url, + "FallbackMethod": fallback_method, + "StatusCallback": status_callback, + "StickySender": serialize.boolean_to_string(sticky_sender), + "MmsConverter": serialize.boolean_to_string(mms_converter), + "SmartEncoding": serialize.boolean_to_string(smart_encoding), + "ScanMessageContent": scan_message_content, + "FallbackToLongCode": serialize.boolean_to_string( + fallback_to_long_code + ), + "AreaCodeGeomatch": serialize.boolean_to_string(area_code_geomatch), + "ValidityPeriod": validity_period, + "SynchronousValidation": serialize.boolean_to_string( + synchronous_validation + ), + "Usecase": usecase, + "UseInboundWebhookOnNumber": serialize.boolean_to_string( + use_inbound_webhook_on_number + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ServiceInstance]: + """ + Streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ServiceInstance]: + """ + Asynchronously streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Asynchronously lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Asynchronously retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + def get_page(self, target_url: str) -> ServicePage: + """ + Retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ServicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ServicePage: + """ + Asynchronously retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ServicePage(self._version, response) + + def get(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The SID of the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The SID of the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03d21831302b6885a491f8987242d590677136f0 GIT binary patch literal 52556 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/phone_number.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/phone_number.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64859af1673622b1e17a542df8f1f358c2789a52 GIT binary patch literal 23873 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 BpU(gQ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/short_code.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/short_code.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddb18522b74d8ebad39bc75d3ad8c3b0acf9364b GIT binary patch literal 23637 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 F{{qujLCF9B literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/us_app_to_person.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/__pycache__/us_app_to_person.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abccb6e2352bbe45b2452835dc46fcf22641ee90 GIT binary patch literal 47506 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/alpha_sender.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/alpha_sender.py new file mode 100644 index 00000000..2ba4c2a4 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/alpha_sender.py @@ -0,0 +1,542 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AlphaSenderInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the AlphaSender resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the AlphaSender resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the resource is associated with. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar alpha_sender: The Alphanumeric Sender ID string. + :ivar capabilities: An array of values that describe whether the number can receive calls or messages. Can be: `SMS`. + :ivar url: The absolute URL of the AlphaSender resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.alpha_sender: Optional[str] = payload.get("alpha_sender") + self.capabilities: Optional[List[str]] = payload.get("capabilities") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[AlphaSenderContext] = None + + @property + def _proxy(self) -> "AlphaSenderContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AlphaSenderContext for this AlphaSenderInstance + """ + if self._context is None: + self._context = AlphaSenderContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AlphaSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AlphaSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AlphaSenderInstance": + """ + Fetch the AlphaSenderInstance + + + :returns: The fetched AlphaSenderInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AlphaSenderInstance": + """ + Asynchronous coroutine to fetch the AlphaSenderInstance + + + :returns: The fetched AlphaSenderInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AlphaSenderContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the AlphaSenderContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to fetch the resource from. + :param sid: The SID of the AlphaSender resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/AlphaSenders/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the AlphaSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AlphaSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AlphaSenderInstance: + """ + Fetch the AlphaSenderInstance + + + :returns: The fetched AlphaSenderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AlphaSenderInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AlphaSenderInstance: + """ + Asynchronous coroutine to fetch the AlphaSenderInstance + + + :returns: The fetched AlphaSenderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AlphaSenderInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AlphaSenderPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AlphaSenderInstance: + """ + Build an instance of AlphaSenderInstance + + :param payload: Payload response from the API + """ + return AlphaSenderInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AlphaSenderList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the AlphaSenderList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/AlphaSenders".format(**self._solution) + + def create(self, alpha_sender: str) -> AlphaSenderInstance: + """ + Create the AlphaSenderInstance + + :param alpha_sender: The Alphanumeric Sender ID string. Can be up to 11 characters long. Valid characters are A-Z, a-z, 0-9, space, hyphen `-`, plus `+`, underscore `_` and ampersand `&`. This value cannot contain only numbers. + + :returns: The created AlphaSenderInstance + """ + + data = values.of( + { + "AlphaSender": alpha_sender, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AlphaSenderInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async(self, alpha_sender: str) -> AlphaSenderInstance: + """ + Asynchronously create the AlphaSenderInstance + + :param alpha_sender: The Alphanumeric Sender ID string. Can be up to 11 characters long. Valid characters are A-Z, a-z, 0-9, space, hyphen `-`, plus `+`, underscore `_` and ampersand `&`. This value cannot contain only numbers. + + :returns: The created AlphaSenderInstance + """ + + data = values.of( + { + "AlphaSender": alpha_sender, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AlphaSenderInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AlphaSenderInstance]: + """ + Streams AlphaSenderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AlphaSenderInstance]: + """ + Asynchronously streams AlphaSenderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AlphaSenderInstance]: + """ + Lists AlphaSenderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AlphaSenderInstance]: + """ + Asynchronously lists AlphaSenderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AlphaSenderPage: + """ + Retrieve a single page of AlphaSenderInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AlphaSenderInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AlphaSenderPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AlphaSenderPage: + """ + Asynchronously retrieve a single page of AlphaSenderInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AlphaSenderInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AlphaSenderPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AlphaSenderPage: + """ + Retrieve a specific page of AlphaSenderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AlphaSenderInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AlphaSenderPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AlphaSenderPage: + """ + Asynchronously retrieve a specific page of AlphaSenderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AlphaSenderInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AlphaSenderPage(self._version, response, self._solution) + + def get(self, sid: str) -> AlphaSenderContext: + """ + Constructs a AlphaSenderContext + + :param sid: The SID of the AlphaSender resource to fetch. + """ + return AlphaSenderContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> AlphaSenderContext: + """ + Constructs a AlphaSenderContext + + :param sid: The SID of the AlphaSender resource to fetch. + """ + return AlphaSenderContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/channel_sender.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/channel_sender.py new file mode 100644 index 00000000..9d708a2f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/channel_sender.py @@ -0,0 +1,556 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ChannelSenderInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the ChannelSender resource. + :ivar messaging_service_sid: The SID of the [Service](https://www.twilio.com/docs/messaging/services) the resource is associated with. + :ivar sid: The unique string that we created to identify the ChannelSender resource. + :ivar sender: The unique string that identifies the sender e.g whatsapp:+123456XXXX. + :ivar sender_type: A string value that identifies the sender type e.g WhatsApp, Messenger. + :ivar country_code: The 2-character [ISO Country Code](https://www.iso.org/iso-3166-country-codes.html) of the number. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the ChannelSender resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + messaging_service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.sid: Optional[str] = payload.get("sid") + self.sender: Optional[str] = payload.get("sender") + self.sender_type: Optional[str] = payload.get("sender_type") + self.country_code: Optional[str] = payload.get("country_code") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "messaging_service_sid": messaging_service_sid, + "sid": sid or self.sid, + } + self._context: Optional[ChannelSenderContext] = None + + @property + def _proxy(self) -> "ChannelSenderContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ChannelSenderContext for this ChannelSenderInstance + """ + if self._context is None: + self._context = ChannelSenderContext( + self._version, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ChannelSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ChannelSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ChannelSenderInstance": + """ + Fetch the ChannelSenderInstance + + + :returns: The fetched ChannelSenderInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ChannelSenderInstance": + """ + Asynchronous coroutine to fetch the ChannelSenderInstance + + + :returns: The fetched ChannelSenderInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelSenderContext(InstanceContext): + + def __init__(self, version: Version, messaging_service_sid: str, sid: str): + """ + Initialize the ChannelSenderContext + + :param version: Version that contains the resource + :param messaging_service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to fetch the resource from. + :param sid: The SID of the ChannelSender resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "messaging_service_sid": messaging_service_sid, + "sid": sid, + } + self._uri = "/Services/{messaging_service_sid}/ChannelSenders/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the ChannelSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ChannelSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ChannelSenderInstance: + """ + Fetch the ChannelSenderInstance + + + :returns: The fetched ChannelSenderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ChannelSenderInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ChannelSenderInstance: + """ + Asynchronous coroutine to fetch the ChannelSenderInstance + + + :returns: The fetched ChannelSenderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ChannelSenderInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelSenderPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ChannelSenderInstance: + """ + Build an instance of ChannelSenderInstance + + :param payload: Payload response from the API + """ + return ChannelSenderInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ChannelSenderList(ListResource): + + def __init__(self, version: Version, messaging_service_sid: str): + """ + Initialize the ChannelSenderList + + :param version: Version that contains the resource + :param messaging_service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "messaging_service_sid": messaging_service_sid, + } + self._uri = "/Services/{messaging_service_sid}/ChannelSenders".format( + **self._solution + ) + + def create(self, sid: str) -> ChannelSenderInstance: + """ + Create the ChannelSenderInstance + + :param sid: The SID of the Channel Sender being added to the Service. + + :returns: The created ChannelSenderInstance + """ + + data = values.of( + { + "Sid": sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelSenderInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + async def create_async(self, sid: str) -> ChannelSenderInstance: + """ + Asynchronously create the ChannelSenderInstance + + :param sid: The SID of the Channel Sender being added to the Service. + + :returns: The created ChannelSenderInstance + """ + + data = values.of( + { + "Sid": sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelSenderInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ChannelSenderInstance]: + """ + Streams ChannelSenderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ChannelSenderInstance]: + """ + Asynchronously streams ChannelSenderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelSenderInstance]: + """ + Lists ChannelSenderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelSenderInstance]: + """ + Asynchronously lists ChannelSenderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelSenderPage: + """ + Retrieve a single page of ChannelSenderInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelSenderInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelSenderPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelSenderPage: + """ + Asynchronously retrieve a single page of ChannelSenderInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelSenderInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelSenderPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ChannelSenderPage: + """ + Retrieve a specific page of ChannelSenderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelSenderInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ChannelSenderPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ChannelSenderPage: + """ + Asynchronously retrieve a specific page of ChannelSenderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelSenderInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ChannelSenderPage(self._version, response, self._solution) + + def get(self, sid: str) -> ChannelSenderContext: + """ + Constructs a ChannelSenderContext + + :param sid: The SID of the ChannelSender resource to fetch. + """ + return ChannelSenderContext( + self._version, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> ChannelSenderContext: + """ + Constructs a ChannelSenderContext + + :param sid: The SID of the ChannelSender resource to fetch. + """ + return ChannelSenderContext( + self._version, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/destination_alpha_sender.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/destination_alpha_sender.py new file mode 100644 index 00000000..244d906c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/destination_alpha_sender.py @@ -0,0 +1,574 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class DestinationAlphaSenderInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the AlphaSender resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the AlphaSender resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the resource is associated with. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar alpha_sender: The Alphanumeric Sender ID string. + :ivar capabilities: An array of values that describe whether the number can receive calls or messages. Can be: `SMS`. + :ivar url: The absolute URL of the AlphaSender resource. + :ivar iso_country_code: The Two Character ISO Country Code the Alphanumeric Sender ID will be used for. For Default Alpha Senders that work across countries, this value will be an empty string + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.alpha_sender: Optional[str] = payload.get("alpha_sender") + self.capabilities: Optional[List[str]] = payload.get("capabilities") + self.url: Optional[str] = payload.get("url") + self.iso_country_code: Optional[str] = payload.get("iso_country_code") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[DestinationAlphaSenderContext] = None + + @property + def _proxy(self) -> "DestinationAlphaSenderContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DestinationAlphaSenderContext for this DestinationAlphaSenderInstance + """ + if self._context is None: + self._context = DestinationAlphaSenderContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the DestinationAlphaSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the DestinationAlphaSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "DestinationAlphaSenderInstance": + """ + Fetch the DestinationAlphaSenderInstance + + + :returns: The fetched DestinationAlphaSenderInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DestinationAlphaSenderInstance": + """ + Asynchronous coroutine to fetch the DestinationAlphaSenderInstance + + + :returns: The fetched DestinationAlphaSenderInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DestinationAlphaSenderContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the DestinationAlphaSenderContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to fetch the resource from. + :param sid: The SID of the AlphaSender resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/DestinationAlphaSenders/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the DestinationAlphaSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the DestinationAlphaSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> DestinationAlphaSenderInstance: + """ + Fetch the DestinationAlphaSenderInstance + + + :returns: The fetched DestinationAlphaSenderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DestinationAlphaSenderInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> DestinationAlphaSenderInstance: + """ + Asynchronous coroutine to fetch the DestinationAlphaSenderInstance + + + :returns: The fetched DestinationAlphaSenderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DestinationAlphaSenderInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DestinationAlphaSenderPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> DestinationAlphaSenderInstance: + """ + Build an instance of DestinationAlphaSenderInstance + + :param payload: Payload response from the API + """ + return DestinationAlphaSenderInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DestinationAlphaSenderList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the DestinationAlphaSenderList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/DestinationAlphaSenders".format( + **self._solution + ) + + def create( + self, alpha_sender: str, iso_country_code: Union[str, object] = values.unset + ) -> DestinationAlphaSenderInstance: + """ + Create the DestinationAlphaSenderInstance + + :param alpha_sender: The Alphanumeric Sender ID string. Can be up to 11 characters long. Valid characters are A-Z, a-z, 0-9, space, hyphen `-`, plus `+`, underscore `_` and ampersand `&`. This value cannot contain only numbers. + :param iso_country_code: The Optional Two Character ISO Country Code the Alphanumeric Sender ID will be used for. If the IsoCountryCode is not provided, a default Alpha Sender will be created that can be used across all countries. + + :returns: The created DestinationAlphaSenderInstance + """ + + data = values.of( + { + "AlphaSender": alpha_sender, + "IsoCountryCode": iso_country_code, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DestinationAlphaSenderInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, alpha_sender: str, iso_country_code: Union[str, object] = values.unset + ) -> DestinationAlphaSenderInstance: + """ + Asynchronously create the DestinationAlphaSenderInstance + + :param alpha_sender: The Alphanumeric Sender ID string. Can be up to 11 characters long. Valid characters are A-Z, a-z, 0-9, space, hyphen `-`, plus `+`, underscore `_` and ampersand `&`. This value cannot contain only numbers. + :param iso_country_code: The Optional Two Character ISO Country Code the Alphanumeric Sender ID will be used for. If the IsoCountryCode is not provided, a default Alpha Sender will be created that can be used across all countries. + + :returns: The created DestinationAlphaSenderInstance + """ + + data = values.of( + { + "AlphaSender": alpha_sender, + "IsoCountryCode": iso_country_code, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DestinationAlphaSenderInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + iso_country_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DestinationAlphaSenderInstance]: + """ + Streams DestinationAlphaSenderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str iso_country_code: Optional filter to return only alphanumeric sender IDs associated with the specified two-character ISO country code. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + iso_country_code=iso_country_code, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + iso_country_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DestinationAlphaSenderInstance]: + """ + Asynchronously streams DestinationAlphaSenderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str iso_country_code: Optional filter to return only alphanumeric sender IDs associated with the specified two-character ISO country code. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + iso_country_code=iso_country_code, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + iso_country_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DestinationAlphaSenderInstance]: + """ + Lists DestinationAlphaSenderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str iso_country_code: Optional filter to return only alphanumeric sender IDs associated with the specified two-character ISO country code. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + iso_country_code=iso_country_code, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + iso_country_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DestinationAlphaSenderInstance]: + """ + Asynchronously lists DestinationAlphaSenderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str iso_country_code: Optional filter to return only alphanumeric sender IDs associated with the specified two-character ISO country code. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + iso_country_code=iso_country_code, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + iso_country_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DestinationAlphaSenderPage: + """ + Retrieve a single page of DestinationAlphaSenderInstance records from the API. + Request is executed immediately + + :param iso_country_code: Optional filter to return only alphanumeric sender IDs associated with the specified two-character ISO country code. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DestinationAlphaSenderInstance + """ + data = values.of( + { + "IsoCountryCode": iso_country_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DestinationAlphaSenderPage(self._version, response, self._solution) + + async def page_async( + self, + iso_country_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DestinationAlphaSenderPage: + """ + Asynchronously retrieve a single page of DestinationAlphaSenderInstance records from the API. + Request is executed immediately + + :param iso_country_code: Optional filter to return only alphanumeric sender IDs associated with the specified two-character ISO country code. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DestinationAlphaSenderInstance + """ + data = values.of( + { + "IsoCountryCode": iso_country_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DestinationAlphaSenderPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DestinationAlphaSenderPage: + """ + Retrieve a specific page of DestinationAlphaSenderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DestinationAlphaSenderInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DestinationAlphaSenderPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DestinationAlphaSenderPage: + """ + Asynchronously retrieve a specific page of DestinationAlphaSenderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DestinationAlphaSenderInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DestinationAlphaSenderPage(self._version, response, self._solution) + + def get(self, sid: str) -> DestinationAlphaSenderContext: + """ + Constructs a DestinationAlphaSenderContext + + :param sid: The SID of the AlphaSender resource to fetch. + """ + return DestinationAlphaSenderContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> DestinationAlphaSenderContext: + """ + Constructs a DestinationAlphaSenderContext + + :param sid: The SID of the AlphaSender resource to fetch. + """ + return DestinationAlphaSenderContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/phone_number.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/phone_number.py new file mode 100644 index 00000000..11b80658 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/phone_number.py @@ -0,0 +1,544 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class PhoneNumberInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the PhoneNumber resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the PhoneNumber resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the resource is associated with. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar country_code: The 2-character [ISO Country Code](https://www.iso.org/iso-3166-country-codes.html) of the number. + :ivar capabilities: An array of values that describe whether the number can receive calls or messages. Can be: `Voice`, `SMS`, and `MMS`. + :ivar url: The absolute URL of the PhoneNumber resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.phone_number: Optional[str] = payload.get("phone_number") + self.country_code: Optional[str] = payload.get("country_code") + self.capabilities: Optional[List[str]] = payload.get("capabilities") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[PhoneNumberContext] = None + + @property + def _proxy(self) -> "PhoneNumberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PhoneNumberContext for this PhoneNumberInstance + """ + if self._context is None: + self._context = PhoneNumberContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the PhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "PhoneNumberInstance": + """ + Fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "PhoneNumberInstance": + """ + Asynchronous coroutine to fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PhoneNumberContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the PhoneNumberContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to fetch the resource from. + :param sid: The SID of the PhoneNumber resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/PhoneNumbers/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the PhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> PhoneNumberInstance: + """ + Fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return PhoneNumberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> PhoneNumberInstance: + """ + Asynchronous coroutine to fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return PhoneNumberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PhoneNumberPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> PhoneNumberInstance: + """ + Build an instance of PhoneNumberInstance + + :param payload: Payload response from the API + """ + return PhoneNumberInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class PhoneNumberList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the PhoneNumberList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/PhoneNumbers".format(**self._solution) + + def create(self, phone_number_sid: str) -> PhoneNumberInstance: + """ + Create the PhoneNumberInstance + + :param phone_number_sid: The SID of the Phone Number being added to the Service. + + :returns: The created PhoneNumberInstance + """ + + data = values.of( + { + "PhoneNumberSid": phone_number_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async(self, phone_number_sid: str) -> PhoneNumberInstance: + """ + Asynchronously create the PhoneNumberInstance + + :param phone_number_sid: The SID of the Phone Number being added to the Service. + + :returns: The created PhoneNumberInstance + """ + + data = values.of( + { + "PhoneNumberSid": phone_number_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[PhoneNumberInstance]: + """ + Streams PhoneNumberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[PhoneNumberInstance]: + """ + Asynchronously streams PhoneNumberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PhoneNumberInstance]: + """ + Lists PhoneNumberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PhoneNumberInstance]: + """ + Asynchronously lists PhoneNumberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PhoneNumberPage: + """ + Retrieve a single page of PhoneNumberInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PhoneNumberInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PhoneNumberPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PhoneNumberPage: + """ + Asynchronously retrieve a single page of PhoneNumberInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PhoneNumberInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PhoneNumberPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> PhoneNumberPage: + """ + Retrieve a specific page of PhoneNumberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PhoneNumberInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return PhoneNumberPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> PhoneNumberPage: + """ + Asynchronously retrieve a specific page of PhoneNumberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PhoneNumberInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return PhoneNumberPage(self._version, response, self._solution) + + def get(self, sid: str) -> PhoneNumberContext: + """ + Constructs a PhoneNumberContext + + :param sid: The SID of the PhoneNumber resource to fetch. + """ + return PhoneNumberContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> PhoneNumberContext: + """ + Constructs a PhoneNumberContext + + :param sid: The SID of the PhoneNumber resource to fetch. + """ + return PhoneNumberContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/short_code.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/short_code.py new file mode 100644 index 00000000..172c78db --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/short_code.py @@ -0,0 +1,542 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ShortCodeInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the ShortCode resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the ShortCode resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) the resource is associated with. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar short_code: The [E.164](https://www.twilio.com/docs/glossary/what-e164) format of the short code. + :ivar country_code: The 2-character [ISO Country Code](https://www.iso.org/iso-3166-country-codes.html) of the number. + :ivar capabilities: An array of values that describe whether the number can receive calls or messages. Can be: `SMS` and `MMS`. + :ivar url: The absolute URL of the ShortCode resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.short_code: Optional[str] = payload.get("short_code") + self.country_code: Optional[str] = payload.get("country_code") + self.capabilities: Optional[List[str]] = payload.get("capabilities") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[ShortCodeContext] = None + + @property + def _proxy(self) -> "ShortCodeContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ShortCodeContext for this ShortCodeInstance + """ + if self._context is None: + self._context = ShortCodeContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ShortCodeInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ShortCodeInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ShortCodeInstance": + """ + Fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ShortCodeInstance": + """ + Asynchronous coroutine to fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ShortCodeContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the ShortCodeContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to fetch the resource from. + :param sid: The SID of the ShortCode resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/ShortCodes/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the ShortCodeInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ShortCodeInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ShortCodeInstance: + """ + Fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ShortCodeInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ShortCodeInstance: + """ + Asynchronous coroutine to fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ShortCodeInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ShortCodePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ShortCodeInstance: + """ + Build an instance of ShortCodeInstance + + :param payload: Payload response from the API + """ + return ShortCodeInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ShortCodeList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the ShortCodeList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/chat/rest/service-resource) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/ShortCodes".format(**self._solution) + + def create(self, short_code_sid: str) -> ShortCodeInstance: + """ + Create the ShortCodeInstance + + :param short_code_sid: The SID of the ShortCode resource being added to the Service. + + :returns: The created ShortCodeInstance + """ + + data = values.of( + { + "ShortCodeSid": short_code_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ShortCodeInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async(self, short_code_sid: str) -> ShortCodeInstance: + """ + Asynchronously create the ShortCodeInstance + + :param short_code_sid: The SID of the ShortCode resource being added to the Service. + + :returns: The created ShortCodeInstance + """ + + data = values.of( + { + "ShortCodeSid": short_code_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ShortCodeInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ShortCodeInstance]: + """ + Streams ShortCodeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ShortCodeInstance]: + """ + Asynchronously streams ShortCodeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ShortCodeInstance]: + """ + Lists ShortCodeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ShortCodeInstance]: + """ + Asynchronously lists ShortCodeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ShortCodePage: + """ + Retrieve a single page of ShortCodeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ShortCodeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ShortCodePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ShortCodePage: + """ + Asynchronously retrieve a single page of ShortCodeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ShortCodeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ShortCodePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ShortCodePage: + """ + Retrieve a specific page of ShortCodeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ShortCodeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ShortCodePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ShortCodePage: + """ + Asynchronously retrieve a specific page of ShortCodeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ShortCodeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ShortCodePage(self._version, response, self._solution) + + def get(self, sid: str) -> ShortCodeContext: + """ + Constructs a ShortCodeContext + + :param sid: The SID of the ShortCode resource to fetch. + """ + return ShortCodeContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ShortCodeContext: + """ + Constructs a ShortCodeContext + + :param sid: The SID of the ShortCode resource to fetch. + """ + return ShortCodeContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/us_app_to_person.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/us_app_to_person.py new file mode 100644 index 00000000..dd451f5c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/us_app_to_person.py @@ -0,0 +1,866 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class UsAppToPersonInstance(InstanceResource): + """ + :ivar sid: The unique string that identifies a US A2P Compliance resource `QE2c6890da8086d771620e9b13fadeba0b`. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that the Campaign belongs to. + :ivar brand_registration_sid: The unique string to identify the A2P brand. + :ivar messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) that the resource is associated with. + :ivar description: A short description of what this SMS campaign does. Min length: 40 characters. Max length: 4096 characters. + :ivar message_samples: An array of sample message strings, min two and max five. Min length for each sample: 20 chars. Max length for each sample: 1024 chars. + :ivar us_app_to_person_usecase: A2P Campaign Use Case. Examples: [ 2FA, EMERGENCY, MARKETING, SOLE_PROPRIETOR...]. SOLE_PROPRIETOR campaign use cases can only be created by SOLE_PROPRIETOR Brands, and there can only be one SOLE_PROPRIETOR campaign created per SOLE_PROPRIETOR Brand. + :ivar has_embedded_links: Indicate that this SMS campaign will send messages that contain links. + :ivar has_embedded_phone: Indicates that this SMS campaign will send messages that contain phone numbers. + :ivar subscriber_opt_in: A boolean that specifies whether campaign has Subscriber Optin or not. + :ivar age_gated: A boolean that specifies whether campaign is age gated or not. + :ivar direct_lending: A boolean that specifies whether campaign allows direct lending or not. + :ivar campaign_status: Campaign status. Examples: IN_PROGRESS, VERIFIED, FAILED. + :ivar campaign_id: The Campaign Registry (TCR) Campaign ID. + :ivar is_externally_registered: Indicates whether the campaign was registered externally or not. + :ivar rate_limits: Rate limit and/or classification set by each carrier, Ex. AT&T or T-Mobile. + :ivar message_flow: Details around how a consumer opts-in to their campaign, therefore giving consent to receive their messages. If multiple opt-in methods can be used for the same campaign, they must all be listed. 40 character minimum. 2048 character maximum. + :ivar opt_in_message: If end users can text in a keyword to start receiving messages from this campaign, the auto-reply messages sent to the end users must be provided. The opt-in response should include the Brand name, confirmation of opt-in enrollment to a recurring message campaign, how to get help, and clear description of how to opt-out. This field is required if end users can text in a keyword to start receiving messages from this campaign. 20 character minimum. 320 character maximum. + :ivar opt_out_message: Upon receiving the opt-out keywords from the end users, Twilio customers are expected to send back an auto-generated response, which must provide acknowledgment of the opt-out request and confirmation that no further messages will be sent. It is also recommended that these opt-out messages include the brand name. This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum. + :ivar help_message: When customers receive the help keywords from their end users, Twilio customers are expected to send back an auto-generated response; this may include the brand name and additional support contact information. This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum. + :ivar opt_in_keywords: If end users can text in a keyword to start receiving messages from this campaign, those keywords must be provided. This field is required if end users can text in a keyword to start receiving messages from this campaign. Values must be alphanumeric. 255 character maximum. + :ivar opt_out_keywords: End users should be able to text in a keyword to stop receiving messages from this campaign. Those keywords must be provided. This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. 255 character maximum. + :ivar help_keywords: End users should be able to text in a keyword to receive help. Those keywords must be provided as part of the campaign registration request. This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. 255 character maximum. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the US App to Person resource. + :ivar mock: A boolean that specifies whether campaign is a mock or not. Mock campaigns will be automatically created if using a mock brand. Mock campaigns should only be used for testing purposes. + :ivar errors: Details indicating why a campaign registration failed. These errors can indicate one or more fields that were incorrect or did not meet review requirements. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + messaging_service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.brand_registration_sid: Optional[str] = payload.get( + "brand_registration_sid" + ) + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.description: Optional[str] = payload.get("description") + self.message_samples: Optional[List[str]] = payload.get("message_samples") + self.us_app_to_person_usecase: Optional[str] = payload.get( + "us_app_to_person_usecase" + ) + self.has_embedded_links: Optional[bool] = payload.get("has_embedded_links") + self.has_embedded_phone: Optional[bool] = payload.get("has_embedded_phone") + self.subscriber_opt_in: Optional[bool] = payload.get("subscriber_opt_in") + self.age_gated: Optional[bool] = payload.get("age_gated") + self.direct_lending: Optional[bool] = payload.get("direct_lending") + self.campaign_status: Optional[str] = payload.get("campaign_status") + self.campaign_id: Optional[str] = payload.get("campaign_id") + self.is_externally_registered: Optional[bool] = payload.get( + "is_externally_registered" + ) + self.rate_limits: Optional[Dict[str, object]] = payload.get("rate_limits") + self.message_flow: Optional[str] = payload.get("message_flow") + self.opt_in_message: Optional[str] = payload.get("opt_in_message") + self.opt_out_message: Optional[str] = payload.get("opt_out_message") + self.help_message: Optional[str] = payload.get("help_message") + self.opt_in_keywords: Optional[List[str]] = payload.get("opt_in_keywords") + self.opt_out_keywords: Optional[List[str]] = payload.get("opt_out_keywords") + self.help_keywords: Optional[List[str]] = payload.get("help_keywords") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.mock: Optional[bool] = payload.get("mock") + self.errors: Optional[List[Dict[str, object]]] = payload.get("errors") + + self._solution = { + "messaging_service_sid": messaging_service_sid, + "sid": sid or self.sid, + } + self._context: Optional[UsAppToPersonContext] = None + + @property + def _proxy(self) -> "UsAppToPersonContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UsAppToPersonContext for this UsAppToPersonInstance + """ + if self._context is None: + self._context = UsAppToPersonContext( + self._version, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UsAppToPersonInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UsAppToPersonInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UsAppToPersonInstance": + """ + Fetch the UsAppToPersonInstance + + + :returns: The fetched UsAppToPersonInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UsAppToPersonInstance": + """ + Asynchronous coroutine to fetch the UsAppToPersonInstance + + + :returns: The fetched UsAppToPersonInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + has_embedded_links: bool, + has_embedded_phone: bool, + message_samples: List[str], + message_flow: str, + description: str, + age_gated: bool, + direct_lending: bool, + ) -> "UsAppToPersonInstance": + """ + Update the UsAppToPersonInstance + + :param has_embedded_links: Indicates that this SMS campaign will send messages that contain links. + :param has_embedded_phone: Indicates that this SMS campaign will send messages that contain phone numbers. + :param message_samples: An array of sample message strings, min two and max five. Min length for each sample: 20 chars. Max length for each sample: 1024 chars. + :param message_flow: Required for all Campaigns. Details around how a consumer opts-in to their campaign, therefore giving consent to receive their messages. If multiple opt-in methods can be used for the same campaign, they must all be listed. 40 character minimum. 2048 character maximum. + :param description: A short description of what this SMS campaign does. Min length: 40 characters. Max length: 4096 characters. + :param age_gated: A boolean that specifies whether campaign requires age gate for federally legal content. + :param direct_lending: A boolean that specifies whether campaign allows direct lending or not. + + :returns: The updated UsAppToPersonInstance + """ + return self._proxy.update( + has_embedded_links=has_embedded_links, + has_embedded_phone=has_embedded_phone, + message_samples=message_samples, + message_flow=message_flow, + description=description, + age_gated=age_gated, + direct_lending=direct_lending, + ) + + async def update_async( + self, + has_embedded_links: bool, + has_embedded_phone: bool, + message_samples: List[str], + message_flow: str, + description: str, + age_gated: bool, + direct_lending: bool, + ) -> "UsAppToPersonInstance": + """ + Asynchronous coroutine to update the UsAppToPersonInstance + + :param has_embedded_links: Indicates that this SMS campaign will send messages that contain links. + :param has_embedded_phone: Indicates that this SMS campaign will send messages that contain phone numbers. + :param message_samples: An array of sample message strings, min two and max five. Min length for each sample: 20 chars. Max length for each sample: 1024 chars. + :param message_flow: Required for all Campaigns. Details around how a consumer opts-in to their campaign, therefore giving consent to receive their messages. If multiple opt-in methods can be used for the same campaign, they must all be listed. 40 character minimum. 2048 character maximum. + :param description: A short description of what this SMS campaign does. Min length: 40 characters. Max length: 4096 characters. + :param age_gated: A boolean that specifies whether campaign requires age gate for federally legal content. + :param direct_lending: A boolean that specifies whether campaign allows direct lending or not. + + :returns: The updated UsAppToPersonInstance + """ + return await self._proxy.update_async( + has_embedded_links=has_embedded_links, + has_embedded_phone=has_embedded_phone, + message_samples=message_samples, + message_flow=message_flow, + description=description, + age_gated=age_gated, + direct_lending=direct_lending, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UsAppToPersonContext(InstanceContext): + + def __init__(self, version: Version, messaging_service_sid: str, sid: str): + """ + Initialize the UsAppToPersonContext + + :param version: Version that contains the resource + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/services/api) to update the resource from. + :param sid: The SID of the US A2P Compliance resource to update `QE2c6890da8086d771620e9b13fadeba0b`. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "messaging_service_sid": messaging_service_sid, + "sid": sid, + } + self._uri = "/Services/{messaging_service_sid}/Compliance/Usa2p/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the UsAppToPersonInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UsAppToPersonInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UsAppToPersonInstance: + """ + Fetch the UsAppToPersonInstance + + + :returns: The fetched UsAppToPersonInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UsAppToPersonInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> UsAppToPersonInstance: + """ + Asynchronous coroutine to fetch the UsAppToPersonInstance + + + :returns: The fetched UsAppToPersonInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UsAppToPersonInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + has_embedded_links: bool, + has_embedded_phone: bool, + message_samples: List[str], + message_flow: str, + description: str, + age_gated: bool, + direct_lending: bool, + ) -> UsAppToPersonInstance: + """ + Update the UsAppToPersonInstance + + :param has_embedded_links: Indicates that this SMS campaign will send messages that contain links. + :param has_embedded_phone: Indicates that this SMS campaign will send messages that contain phone numbers. + :param message_samples: An array of sample message strings, min two and max five. Min length for each sample: 20 chars. Max length for each sample: 1024 chars. + :param message_flow: Required for all Campaigns. Details around how a consumer opts-in to their campaign, therefore giving consent to receive their messages. If multiple opt-in methods can be used for the same campaign, they must all be listed. 40 character minimum. 2048 character maximum. + :param description: A short description of what this SMS campaign does. Min length: 40 characters. Max length: 4096 characters. + :param age_gated: A boolean that specifies whether campaign requires age gate for federally legal content. + :param direct_lending: A boolean that specifies whether campaign allows direct lending or not. + + :returns: The updated UsAppToPersonInstance + """ + + data = values.of( + { + "HasEmbeddedLinks": serialize.boolean_to_string(has_embedded_links), + "HasEmbeddedPhone": serialize.boolean_to_string(has_embedded_phone), + "MessageSamples": serialize.map(message_samples, lambda e: e), + "MessageFlow": message_flow, + "Description": description, + "AgeGated": serialize.boolean_to_string(age_gated), + "DirectLending": serialize.boolean_to_string(direct_lending), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UsAppToPersonInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + has_embedded_links: bool, + has_embedded_phone: bool, + message_samples: List[str], + message_flow: str, + description: str, + age_gated: bool, + direct_lending: bool, + ) -> UsAppToPersonInstance: + """ + Asynchronous coroutine to update the UsAppToPersonInstance + + :param has_embedded_links: Indicates that this SMS campaign will send messages that contain links. + :param has_embedded_phone: Indicates that this SMS campaign will send messages that contain phone numbers. + :param message_samples: An array of sample message strings, min two and max five. Min length for each sample: 20 chars. Max length for each sample: 1024 chars. + :param message_flow: Required for all Campaigns. Details around how a consumer opts-in to their campaign, therefore giving consent to receive their messages. If multiple opt-in methods can be used for the same campaign, they must all be listed. 40 character minimum. 2048 character maximum. + :param description: A short description of what this SMS campaign does. Min length: 40 characters. Max length: 4096 characters. + :param age_gated: A boolean that specifies whether campaign requires age gate for federally legal content. + :param direct_lending: A boolean that specifies whether campaign allows direct lending or not. + + :returns: The updated UsAppToPersonInstance + """ + + data = values.of( + { + "HasEmbeddedLinks": serialize.boolean_to_string(has_embedded_links), + "HasEmbeddedPhone": serialize.boolean_to_string(has_embedded_phone), + "MessageSamples": serialize.map(message_samples, lambda e: e), + "MessageFlow": message_flow, + "Description": description, + "AgeGated": serialize.boolean_to_string(age_gated), + "DirectLending": serialize.boolean_to_string(direct_lending), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UsAppToPersonInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UsAppToPersonPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UsAppToPersonInstance: + """ + Build an instance of UsAppToPersonInstance + + :param payload: Payload response from the API + """ + return UsAppToPersonInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UsAppToPersonList(ListResource): + + def __init__(self, version: Version, messaging_service_sid: str): + """ + Initialize the UsAppToPersonList + + :param version: Version that contains the resource + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) to fetch the resource from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "messaging_service_sid": messaging_service_sid, + } + self._uri = "/Services/{messaging_service_sid}/Compliance/Usa2p".format( + **self._solution + ) + + def create( + self, + brand_registration_sid: str, + description: str, + message_flow: str, + message_samples: List[str], + us_app_to_person_usecase: str, + has_embedded_links: bool, + has_embedded_phone: bool, + opt_in_message: Union[str, object] = values.unset, + opt_out_message: Union[str, object] = values.unset, + help_message: Union[str, object] = values.unset, + opt_in_keywords: Union[List[str], object] = values.unset, + opt_out_keywords: Union[List[str], object] = values.unset, + help_keywords: Union[List[str], object] = values.unset, + subscriber_opt_in: Union[bool, object] = values.unset, + age_gated: Union[bool, object] = values.unset, + direct_lending: Union[bool, object] = values.unset, + ) -> UsAppToPersonInstance: + """ + Create the UsAppToPersonInstance + + :param brand_registration_sid: A2P Brand Registration SID + :param description: A short description of what this SMS campaign does. Min length: 40 characters. Max length: 4096 characters. + :param message_flow: Required for all Campaigns. Details around how a consumer opts-in to their campaign, therefore giving consent to receive their messages. If multiple opt-in methods can be used for the same campaign, they must all be listed. 40 character minimum. 2048 character maximum. + :param message_samples: An array of sample message strings, min two and max five. Min length for each sample: 20 chars. Max length for each sample: 1024 chars. + :param us_app_to_person_usecase: A2P Campaign Use Case. Examples: [ 2FA, EMERGENCY, MARKETING..] + :param has_embedded_links: Indicates that this SMS campaign will send messages that contain links. + :param has_embedded_phone: Indicates that this SMS campaign will send messages that contain phone numbers. + :param opt_in_message: If end users can text in a keyword to start receiving messages from this campaign, the auto-reply messages sent to the end users must be provided. The opt-in response should include the Brand name, confirmation of opt-in enrollment to a recurring message campaign, how to get help, and clear description of how to opt-out. This field is required if end users can text in a keyword to start receiving messages from this campaign. 20 character minimum. 320 character maximum. + :param opt_out_message: Upon receiving the opt-out keywords from the end users, Twilio customers are expected to send back an auto-generated response, which must provide acknowledgment of the opt-out request and confirmation that no further messages will be sent. It is also recommended that these opt-out messages include the brand name. This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum. + :param help_message: When customers receive the help keywords from their end users, Twilio customers are expected to send back an auto-generated response; this may include the brand name and additional support contact information. This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum. + :param opt_in_keywords: If end users can text in a keyword to start receiving messages from this campaign, those keywords must be provided. This field is required if end users can text in a keyword to start receiving messages from this campaign. Values must be alphanumeric. 255 character maximum. + :param opt_out_keywords: End users should be able to text in a keyword to stop receiving messages from this campaign. Those keywords must be provided. This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. 255 character maximum. + :param help_keywords: End users should be able to text in a keyword to receive help. Those keywords must be provided as part of the campaign registration request. This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. 255 character maximum. + :param subscriber_opt_in: A boolean that specifies whether campaign has Subscriber Optin or not. + :param age_gated: A boolean that specifies whether campaign is age gated or not. + :param direct_lending: A boolean that specifies whether campaign allows direct lending or not. + + :returns: The created UsAppToPersonInstance + """ + + data = values.of( + { + "BrandRegistrationSid": brand_registration_sid, + "Description": description, + "MessageFlow": message_flow, + "MessageSamples": serialize.map(message_samples, lambda e: e), + "UsAppToPersonUsecase": us_app_to_person_usecase, + "HasEmbeddedLinks": serialize.boolean_to_string(has_embedded_links), + "HasEmbeddedPhone": serialize.boolean_to_string(has_embedded_phone), + "OptInMessage": opt_in_message, + "OptOutMessage": opt_out_message, + "HelpMessage": help_message, + "OptInKeywords": serialize.map(opt_in_keywords, lambda e: e), + "OptOutKeywords": serialize.map(opt_out_keywords, lambda e: e), + "HelpKeywords": serialize.map(help_keywords, lambda e: e), + "SubscriberOptIn": serialize.boolean_to_string(subscriber_opt_in), + "AgeGated": serialize.boolean_to_string(age_gated), + "DirectLending": serialize.boolean_to_string(direct_lending), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UsAppToPersonInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + async def create_async( + self, + brand_registration_sid: str, + description: str, + message_flow: str, + message_samples: List[str], + us_app_to_person_usecase: str, + has_embedded_links: bool, + has_embedded_phone: bool, + opt_in_message: Union[str, object] = values.unset, + opt_out_message: Union[str, object] = values.unset, + help_message: Union[str, object] = values.unset, + opt_in_keywords: Union[List[str], object] = values.unset, + opt_out_keywords: Union[List[str], object] = values.unset, + help_keywords: Union[List[str], object] = values.unset, + subscriber_opt_in: Union[bool, object] = values.unset, + age_gated: Union[bool, object] = values.unset, + direct_lending: Union[bool, object] = values.unset, + ) -> UsAppToPersonInstance: + """ + Asynchronously create the UsAppToPersonInstance + + :param brand_registration_sid: A2P Brand Registration SID + :param description: A short description of what this SMS campaign does. Min length: 40 characters. Max length: 4096 characters. + :param message_flow: Required for all Campaigns. Details around how a consumer opts-in to their campaign, therefore giving consent to receive their messages. If multiple opt-in methods can be used for the same campaign, they must all be listed. 40 character minimum. 2048 character maximum. + :param message_samples: An array of sample message strings, min two and max five. Min length for each sample: 20 chars. Max length for each sample: 1024 chars. + :param us_app_to_person_usecase: A2P Campaign Use Case. Examples: [ 2FA, EMERGENCY, MARKETING..] + :param has_embedded_links: Indicates that this SMS campaign will send messages that contain links. + :param has_embedded_phone: Indicates that this SMS campaign will send messages that contain phone numbers. + :param opt_in_message: If end users can text in a keyword to start receiving messages from this campaign, the auto-reply messages sent to the end users must be provided. The opt-in response should include the Brand name, confirmation of opt-in enrollment to a recurring message campaign, how to get help, and clear description of how to opt-out. This field is required if end users can text in a keyword to start receiving messages from this campaign. 20 character minimum. 320 character maximum. + :param opt_out_message: Upon receiving the opt-out keywords from the end users, Twilio customers are expected to send back an auto-generated response, which must provide acknowledgment of the opt-out request and confirmation that no further messages will be sent. It is also recommended that these opt-out messages include the brand name. This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum. + :param help_message: When customers receive the help keywords from their end users, Twilio customers are expected to send back an auto-generated response; this may include the brand name and additional support contact information. This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum. + :param opt_in_keywords: If end users can text in a keyword to start receiving messages from this campaign, those keywords must be provided. This field is required if end users can text in a keyword to start receiving messages from this campaign. Values must be alphanumeric. 255 character maximum. + :param opt_out_keywords: End users should be able to text in a keyword to stop receiving messages from this campaign. Those keywords must be provided. This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. 255 character maximum. + :param help_keywords: End users should be able to text in a keyword to receive help. Those keywords must be provided as part of the campaign registration request. This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. 255 character maximum. + :param subscriber_opt_in: A boolean that specifies whether campaign has Subscriber Optin or not. + :param age_gated: A boolean that specifies whether campaign is age gated or not. + :param direct_lending: A boolean that specifies whether campaign allows direct lending or not. + + :returns: The created UsAppToPersonInstance + """ + + data = values.of( + { + "BrandRegistrationSid": brand_registration_sid, + "Description": description, + "MessageFlow": message_flow, + "MessageSamples": serialize.map(message_samples, lambda e: e), + "UsAppToPersonUsecase": us_app_to_person_usecase, + "HasEmbeddedLinks": serialize.boolean_to_string(has_embedded_links), + "HasEmbeddedPhone": serialize.boolean_to_string(has_embedded_phone), + "OptInMessage": opt_in_message, + "OptOutMessage": opt_out_message, + "HelpMessage": help_message, + "OptInKeywords": serialize.map(opt_in_keywords, lambda e: e), + "OptOutKeywords": serialize.map(opt_out_keywords, lambda e: e), + "HelpKeywords": serialize.map(help_keywords, lambda e: e), + "SubscriberOptIn": serialize.boolean_to_string(subscriber_opt_in), + "AgeGated": serialize.boolean_to_string(age_gated), + "DirectLending": serialize.boolean_to_string(direct_lending), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UsAppToPersonInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UsAppToPersonInstance]: + """ + Streams UsAppToPersonInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UsAppToPersonInstance]: + """ + Asynchronously streams UsAppToPersonInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UsAppToPersonInstance]: + """ + Lists UsAppToPersonInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UsAppToPersonInstance]: + """ + Asynchronously lists UsAppToPersonInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UsAppToPersonPage: + """ + Retrieve a single page of UsAppToPersonInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UsAppToPersonInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UsAppToPersonPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UsAppToPersonPage: + """ + Asynchronously retrieve a single page of UsAppToPersonInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UsAppToPersonInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UsAppToPersonPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UsAppToPersonPage: + """ + Retrieve a specific page of UsAppToPersonInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UsAppToPersonInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UsAppToPersonPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UsAppToPersonPage: + """ + Asynchronously retrieve a specific page of UsAppToPersonInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UsAppToPersonInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UsAppToPersonPage(self._version, response, self._solution) + + def get(self, sid: str) -> UsAppToPersonContext: + """ + Constructs a UsAppToPersonContext + + :param sid: The SID of the US A2P Compliance resource to update `QE2c6890da8086d771620e9b13fadeba0b`. + """ + return UsAppToPersonContext( + self._version, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> UsAppToPersonContext: + """ + Constructs a UsAppToPersonContext + + :param sid: The SID of the US A2P Compliance resource to update `QE2c6890da8086d771620e9b13fadeba0b`. + """ + return UsAppToPersonContext( + self._version, + messaging_service_sid=self._solution["messaging_service_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/service/us_app_to_person_usecase.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/us_app_to_person_usecase.py new file mode 100644 index 00000000..bf9e48e6 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/service/us_app_to_person_usecase.py @@ -0,0 +1,137 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class UsAppToPersonUsecaseInstance(InstanceResource): + """ + :ivar us_app_to_person_usecases: Human readable name, code, description and post_approval_required (indicates whether or not post approval is required for this Use Case) of A2P Campaign Use Cases. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], messaging_service_sid: str + ): + super().__init__(version) + + self.us_app_to_person_usecases: Optional[List[Dict[str, object]]] = payload.get( + "us_app_to_person_usecases" + ) + + self._solution = { + "messaging_service_sid": messaging_service_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UsAppToPersonUsecaseList(ListResource): + + def __init__(self, version: Version, messaging_service_sid: str): + """ + Initialize the UsAppToPersonUsecaseList + + :param version: Version that contains the resource + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) to fetch the resource from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "messaging_service_sid": messaging_service_sid, + } + self._uri = ( + "/Services/{messaging_service_sid}/Compliance/Usa2p/Usecases".format( + **self._solution + ) + ) + + def fetch( + self, brand_registration_sid: Union[str, object] = values.unset + ) -> UsAppToPersonUsecaseInstance: + """ + Asynchronously fetch the UsAppToPersonUsecaseInstance + + :param brand_registration_sid: The unique string to identify the A2P brand. + :returns: The fetched UsAppToPersonUsecaseInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + params = values.of( + { + "BrandRegistrationSid": brand_registration_sid, + } + ) + + payload = self._version.fetch( + method="GET", uri=self._uri, headers=headers, params=params + ) + + return UsAppToPersonUsecaseInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + async def fetch_async( + self, brand_registration_sid: Union[str, object] = values.unset + ) -> UsAppToPersonUsecaseInstance: + """ + Asynchronously fetch the UsAppToPersonUsecaseInstance + + :param brand_registration_sid: The unique string to identify the A2P brand. + :returns: The fetched UsAppToPersonUsecaseInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + params = values.of( + { + "BrandRegistrationSid": brand_registration_sid, + } + ) + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers, params=params + ) + + return UsAppToPersonUsecaseInstance( + self._version, + payload, + messaging_service_sid=self._solution["messaging_service_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/tollfree_verification.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/tollfree_verification.py new file mode 100644 index 00000000..00cf9c96 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/tollfree_verification.py @@ -0,0 +1,1173 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class TollfreeVerificationInstance(InstanceResource): + + class OptInType(object): + VERBAL = "VERBAL" + WEB_FORM = "WEB_FORM" + PAPER_FORM = "PAPER_FORM" + VIA_TEXT = "VIA_TEXT" + MOBILE_QR_CODE = "MOBILE_QR_CODE" + IMPORT = "IMPORT" + IMPORT_PLEASE_REPLACE = "IMPORT_PLEASE_REPLACE" + + class Status(object): + PENDING_REVIEW = "PENDING_REVIEW" + IN_REVIEW = "IN_REVIEW" + TWILIO_APPROVED = "TWILIO_APPROVED" + TWILIO_REJECTED = "TWILIO_REJECTED" + + """ + :ivar sid: The unique string to identify Tollfree Verification. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Tollfree Verification resource. + :ivar customer_profile_sid: Customer's Profile Bundle BundleSid. + :ivar trust_product_sid: Tollfree TrustProduct Bundle BundleSid. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar regulated_item_sid: The SID of the Regulated Item. + :ivar business_name: The name of the business or organization using the Tollfree number. + :ivar business_street_address: The address of the business or organization using the Tollfree number. + :ivar business_street_address2: The address of the business or organization using the Tollfree number. + :ivar business_city: The city of the business or organization using the Tollfree number. + :ivar business_state_province_region: The state/province/region of the business or organization using the Tollfree number. + :ivar business_postal_code: The postal code of the business or organization using the Tollfree number. + :ivar business_country: The country of the business or organization using the Tollfree number. + :ivar business_website: The website of the business or organization using the Tollfree number. + :ivar business_contact_first_name: The first name of the contact for the business or organization using the Tollfree number. + :ivar business_contact_last_name: The last name of the contact for the business or organization using the Tollfree number. + :ivar business_contact_email: The email address of the contact for the business or organization using the Tollfree number. + :ivar business_contact_phone: The E.164 formatted phone number of the contact for the business or organization using the Tollfree number. + :ivar notification_email: The email address to receive the notification about the verification result. . + :ivar use_case_categories: The category of the use case for the Tollfree Number. List as many are applicable.. + :ivar use_case_summary: Use this to further explain how messaging is used by the business or organization. + :ivar production_message_sample: An example of message content, i.e. a sample message. + :ivar opt_in_image_urls: Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + :ivar opt_in_type: + :ivar message_volume: Estimate monthly volume of messages from the Tollfree Number. + :ivar additional_information: Additional information to be provided for verification. + :ivar tollfree_phone_number_sid: The SID of the Phone Number associated with the Tollfree Verification. + :ivar status: + :ivar url: The absolute URL of the Tollfree Verification resource. + :ivar rejection_reason: The rejection reason given when a Tollfree Verification has been rejected. + :ivar error_code: The error code given when a Tollfree Verification has been rejected. + :ivar edit_expiration: The date and time when the ability to edit a rejected verification expires. + :ivar edit_allowed: If a rejected verification is allowed to be edited/resubmitted. Some rejection reasons allow editing and some do not. + :ivar rejection_reasons: A list of rejection reasons and codes describing why a Tollfree Verification has been rejected. + :ivar resource_links: The URLs of the documents associated with the Tollfree Verification resource. + :ivar external_reference_id: An optional external reference ID supplied by customer and echoed back on status retrieval. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.customer_profile_sid: Optional[str] = payload.get("customer_profile_sid") + self.trust_product_sid: Optional[str] = payload.get("trust_product_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.regulated_item_sid: Optional[str] = payload.get("regulated_item_sid") + self.business_name: Optional[str] = payload.get("business_name") + self.business_street_address: Optional[str] = payload.get( + "business_street_address" + ) + self.business_street_address2: Optional[str] = payload.get( + "business_street_address2" + ) + self.business_city: Optional[str] = payload.get("business_city") + self.business_state_province_region: Optional[str] = payload.get( + "business_state_province_region" + ) + self.business_postal_code: Optional[str] = payload.get("business_postal_code") + self.business_country: Optional[str] = payload.get("business_country") + self.business_website: Optional[str] = payload.get("business_website") + self.business_contact_first_name: Optional[str] = payload.get( + "business_contact_first_name" + ) + self.business_contact_last_name: Optional[str] = payload.get( + "business_contact_last_name" + ) + self.business_contact_email: Optional[str] = payload.get( + "business_contact_email" + ) + self.business_contact_phone: Optional[str] = payload.get( + "business_contact_phone" + ) + self.notification_email: Optional[str] = payload.get("notification_email") + self.use_case_categories: Optional[List[str]] = payload.get( + "use_case_categories" + ) + self.use_case_summary: Optional[str] = payload.get("use_case_summary") + self.production_message_sample: Optional[str] = payload.get( + "production_message_sample" + ) + self.opt_in_image_urls: Optional[List[str]] = payload.get("opt_in_image_urls") + self.opt_in_type: Optional["TollfreeVerificationInstance.OptInType"] = ( + payload.get("opt_in_type") + ) + self.message_volume: Optional[str] = payload.get("message_volume") + self.additional_information: Optional[str] = payload.get( + "additional_information" + ) + self.tollfree_phone_number_sid: Optional[str] = payload.get( + "tollfree_phone_number_sid" + ) + self.status: Optional["TollfreeVerificationInstance.Status"] = payload.get( + "status" + ) + self.url: Optional[str] = payload.get("url") + self.rejection_reason: Optional[str] = payload.get("rejection_reason") + self.error_code: Optional[int] = deserialize.integer(payload.get("error_code")) + self.edit_expiration: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("edit_expiration") + ) + self.edit_allowed: Optional[bool] = payload.get("edit_allowed") + self.rejection_reasons: Optional[List[Dict[str, object]]] = payload.get( + "rejection_reasons" + ) + self.resource_links: Optional[Dict[str, object]] = payload.get("resource_links") + self.external_reference_id: Optional[str] = payload.get("external_reference_id") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[TollfreeVerificationContext] = None + + @property + def _proxy(self) -> "TollfreeVerificationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: TollfreeVerificationContext for this TollfreeVerificationInstance + """ + if self._context is None: + self._context = TollfreeVerificationContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the TollfreeVerificationInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the TollfreeVerificationInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "TollfreeVerificationInstance": + """ + Fetch the TollfreeVerificationInstance + + + :returns: The fetched TollfreeVerificationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "TollfreeVerificationInstance": + """ + Asynchronous coroutine to fetch the TollfreeVerificationInstance + + + :returns: The fetched TollfreeVerificationInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + business_name: Union[str, object] = values.unset, + business_website: Union[str, object] = values.unset, + notification_email: Union[str, object] = values.unset, + use_case_categories: Union[List[str], object] = values.unset, + use_case_summary: Union[str, object] = values.unset, + production_message_sample: Union[str, object] = values.unset, + opt_in_image_urls: Union[List[str], object] = values.unset, + opt_in_type: Union[ + "TollfreeVerificationInstance.OptInType", object + ] = values.unset, + message_volume: Union[str, object] = values.unset, + business_street_address: Union[str, object] = values.unset, + business_street_address2: Union[str, object] = values.unset, + business_city: Union[str, object] = values.unset, + business_state_province_region: Union[str, object] = values.unset, + business_postal_code: Union[str, object] = values.unset, + business_country: Union[str, object] = values.unset, + additional_information: Union[str, object] = values.unset, + business_contact_first_name: Union[str, object] = values.unset, + business_contact_last_name: Union[str, object] = values.unset, + business_contact_email: Union[str, object] = values.unset, + business_contact_phone: Union[str, object] = values.unset, + edit_reason: Union[str, object] = values.unset, + ) -> "TollfreeVerificationInstance": + """ + Update the TollfreeVerificationInstance + + :param business_name: The name of the business or organization using the Tollfree number. + :param business_website: The website of the business or organization using the Tollfree number. + :param notification_email: The email address to receive the notification about the verification result. . + :param use_case_categories: The category of the use case for the Tollfree Number. List as many are applicable.. + :param use_case_summary: Use this to further explain how messaging is used by the business or organization. + :param production_message_sample: An example of message content, i.e. a sample message. + :param opt_in_image_urls: Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + :param opt_in_type: + :param message_volume: Estimate monthly volume of messages from the Tollfree Number. + :param business_street_address: The address of the business or organization using the Tollfree number. + :param business_street_address2: The address of the business or organization using the Tollfree number. + :param business_city: The city of the business or organization using the Tollfree number. + :param business_state_province_region: The state/province/region of the business or organization using the Tollfree number. + :param business_postal_code: The postal code of the business or organization using the Tollfree number. + :param business_country: The country of the business or organization using the Tollfree number. + :param additional_information: Additional information to be provided for verification. + :param business_contact_first_name: The first name of the contact for the business or organization using the Tollfree number. + :param business_contact_last_name: The last name of the contact for the business or organization using the Tollfree number. + :param business_contact_email: The email address of the contact for the business or organization using the Tollfree number. + :param business_contact_phone: The E.164 formatted phone number of the contact for the business or organization using the Tollfree number. + :param edit_reason: Describe why the verification is being edited. If the verification was rejected because of a technical issue, such as the website being down, and the issue has been resolved this parameter should be set to something similar to 'Website fixed'. + + :returns: The updated TollfreeVerificationInstance + """ + return self._proxy.update( + business_name=business_name, + business_website=business_website, + notification_email=notification_email, + use_case_categories=use_case_categories, + use_case_summary=use_case_summary, + production_message_sample=production_message_sample, + opt_in_image_urls=opt_in_image_urls, + opt_in_type=opt_in_type, + message_volume=message_volume, + business_street_address=business_street_address, + business_street_address2=business_street_address2, + business_city=business_city, + business_state_province_region=business_state_province_region, + business_postal_code=business_postal_code, + business_country=business_country, + additional_information=additional_information, + business_contact_first_name=business_contact_first_name, + business_contact_last_name=business_contact_last_name, + business_contact_email=business_contact_email, + business_contact_phone=business_contact_phone, + edit_reason=edit_reason, + ) + + async def update_async( + self, + business_name: Union[str, object] = values.unset, + business_website: Union[str, object] = values.unset, + notification_email: Union[str, object] = values.unset, + use_case_categories: Union[List[str], object] = values.unset, + use_case_summary: Union[str, object] = values.unset, + production_message_sample: Union[str, object] = values.unset, + opt_in_image_urls: Union[List[str], object] = values.unset, + opt_in_type: Union[ + "TollfreeVerificationInstance.OptInType", object + ] = values.unset, + message_volume: Union[str, object] = values.unset, + business_street_address: Union[str, object] = values.unset, + business_street_address2: Union[str, object] = values.unset, + business_city: Union[str, object] = values.unset, + business_state_province_region: Union[str, object] = values.unset, + business_postal_code: Union[str, object] = values.unset, + business_country: Union[str, object] = values.unset, + additional_information: Union[str, object] = values.unset, + business_contact_first_name: Union[str, object] = values.unset, + business_contact_last_name: Union[str, object] = values.unset, + business_contact_email: Union[str, object] = values.unset, + business_contact_phone: Union[str, object] = values.unset, + edit_reason: Union[str, object] = values.unset, + ) -> "TollfreeVerificationInstance": + """ + Asynchronous coroutine to update the TollfreeVerificationInstance + + :param business_name: The name of the business or organization using the Tollfree number. + :param business_website: The website of the business or organization using the Tollfree number. + :param notification_email: The email address to receive the notification about the verification result. . + :param use_case_categories: The category of the use case for the Tollfree Number. List as many are applicable.. + :param use_case_summary: Use this to further explain how messaging is used by the business or organization. + :param production_message_sample: An example of message content, i.e. a sample message. + :param opt_in_image_urls: Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + :param opt_in_type: + :param message_volume: Estimate monthly volume of messages from the Tollfree Number. + :param business_street_address: The address of the business or organization using the Tollfree number. + :param business_street_address2: The address of the business or organization using the Tollfree number. + :param business_city: The city of the business or organization using the Tollfree number. + :param business_state_province_region: The state/province/region of the business or organization using the Tollfree number. + :param business_postal_code: The postal code of the business or organization using the Tollfree number. + :param business_country: The country of the business or organization using the Tollfree number. + :param additional_information: Additional information to be provided for verification. + :param business_contact_first_name: The first name of the contact for the business or organization using the Tollfree number. + :param business_contact_last_name: The last name of the contact for the business or organization using the Tollfree number. + :param business_contact_email: The email address of the contact for the business or organization using the Tollfree number. + :param business_contact_phone: The E.164 formatted phone number of the contact for the business or organization using the Tollfree number. + :param edit_reason: Describe why the verification is being edited. If the verification was rejected because of a technical issue, such as the website being down, and the issue has been resolved this parameter should be set to something similar to 'Website fixed'. + + :returns: The updated TollfreeVerificationInstance + """ + return await self._proxy.update_async( + business_name=business_name, + business_website=business_website, + notification_email=notification_email, + use_case_categories=use_case_categories, + use_case_summary=use_case_summary, + production_message_sample=production_message_sample, + opt_in_image_urls=opt_in_image_urls, + opt_in_type=opt_in_type, + message_volume=message_volume, + business_street_address=business_street_address, + business_street_address2=business_street_address2, + business_city=business_city, + business_state_province_region=business_state_province_region, + business_postal_code=business_postal_code, + business_country=business_country, + additional_information=additional_information, + business_contact_first_name=business_contact_first_name, + business_contact_last_name=business_contact_last_name, + business_contact_email=business_contact_email, + business_contact_phone=business_contact_phone, + edit_reason=edit_reason, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TollfreeVerificationContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the TollfreeVerificationContext + + :param version: Version that contains the resource + :param sid: The unique string to identify Tollfree Verification. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Tollfree/Verifications/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the TollfreeVerificationInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the TollfreeVerificationInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> TollfreeVerificationInstance: + """ + Fetch the TollfreeVerificationInstance + + + :returns: The fetched TollfreeVerificationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return TollfreeVerificationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> TollfreeVerificationInstance: + """ + Asynchronous coroutine to fetch the TollfreeVerificationInstance + + + :returns: The fetched TollfreeVerificationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return TollfreeVerificationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + business_name: Union[str, object] = values.unset, + business_website: Union[str, object] = values.unset, + notification_email: Union[str, object] = values.unset, + use_case_categories: Union[List[str], object] = values.unset, + use_case_summary: Union[str, object] = values.unset, + production_message_sample: Union[str, object] = values.unset, + opt_in_image_urls: Union[List[str], object] = values.unset, + opt_in_type: Union[ + "TollfreeVerificationInstance.OptInType", object + ] = values.unset, + message_volume: Union[str, object] = values.unset, + business_street_address: Union[str, object] = values.unset, + business_street_address2: Union[str, object] = values.unset, + business_city: Union[str, object] = values.unset, + business_state_province_region: Union[str, object] = values.unset, + business_postal_code: Union[str, object] = values.unset, + business_country: Union[str, object] = values.unset, + additional_information: Union[str, object] = values.unset, + business_contact_first_name: Union[str, object] = values.unset, + business_contact_last_name: Union[str, object] = values.unset, + business_contact_email: Union[str, object] = values.unset, + business_contact_phone: Union[str, object] = values.unset, + edit_reason: Union[str, object] = values.unset, + ) -> TollfreeVerificationInstance: + """ + Update the TollfreeVerificationInstance + + :param business_name: The name of the business or organization using the Tollfree number. + :param business_website: The website of the business or organization using the Tollfree number. + :param notification_email: The email address to receive the notification about the verification result. . + :param use_case_categories: The category of the use case for the Tollfree Number. List as many are applicable.. + :param use_case_summary: Use this to further explain how messaging is used by the business or organization. + :param production_message_sample: An example of message content, i.e. a sample message. + :param opt_in_image_urls: Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + :param opt_in_type: + :param message_volume: Estimate monthly volume of messages from the Tollfree Number. + :param business_street_address: The address of the business or organization using the Tollfree number. + :param business_street_address2: The address of the business or organization using the Tollfree number. + :param business_city: The city of the business or organization using the Tollfree number. + :param business_state_province_region: The state/province/region of the business or organization using the Tollfree number. + :param business_postal_code: The postal code of the business or organization using the Tollfree number. + :param business_country: The country of the business or organization using the Tollfree number. + :param additional_information: Additional information to be provided for verification. + :param business_contact_first_name: The first name of the contact for the business or organization using the Tollfree number. + :param business_contact_last_name: The last name of the contact for the business or organization using the Tollfree number. + :param business_contact_email: The email address of the contact for the business or organization using the Tollfree number. + :param business_contact_phone: The E.164 formatted phone number of the contact for the business or organization using the Tollfree number. + :param edit_reason: Describe why the verification is being edited. If the verification was rejected because of a technical issue, such as the website being down, and the issue has been resolved this parameter should be set to something similar to 'Website fixed'. + + :returns: The updated TollfreeVerificationInstance + """ + + data = values.of( + { + "BusinessName": business_name, + "BusinessWebsite": business_website, + "NotificationEmail": notification_email, + "UseCaseCategories": serialize.map(use_case_categories, lambda e: e), + "UseCaseSummary": use_case_summary, + "ProductionMessageSample": production_message_sample, + "OptInImageUrls": serialize.map(opt_in_image_urls, lambda e: e), + "OptInType": opt_in_type, + "MessageVolume": message_volume, + "BusinessStreetAddress": business_street_address, + "BusinessStreetAddress2": business_street_address2, + "BusinessCity": business_city, + "BusinessStateProvinceRegion": business_state_province_region, + "BusinessPostalCode": business_postal_code, + "BusinessCountry": business_country, + "AdditionalInformation": additional_information, + "BusinessContactFirstName": business_contact_first_name, + "BusinessContactLastName": business_contact_last_name, + "BusinessContactEmail": business_contact_email, + "BusinessContactPhone": business_contact_phone, + "EditReason": edit_reason, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TollfreeVerificationInstance( + self._version, payload, sid=self._solution["sid"] + ) + + async def update_async( + self, + business_name: Union[str, object] = values.unset, + business_website: Union[str, object] = values.unset, + notification_email: Union[str, object] = values.unset, + use_case_categories: Union[List[str], object] = values.unset, + use_case_summary: Union[str, object] = values.unset, + production_message_sample: Union[str, object] = values.unset, + opt_in_image_urls: Union[List[str], object] = values.unset, + opt_in_type: Union[ + "TollfreeVerificationInstance.OptInType", object + ] = values.unset, + message_volume: Union[str, object] = values.unset, + business_street_address: Union[str, object] = values.unset, + business_street_address2: Union[str, object] = values.unset, + business_city: Union[str, object] = values.unset, + business_state_province_region: Union[str, object] = values.unset, + business_postal_code: Union[str, object] = values.unset, + business_country: Union[str, object] = values.unset, + additional_information: Union[str, object] = values.unset, + business_contact_first_name: Union[str, object] = values.unset, + business_contact_last_name: Union[str, object] = values.unset, + business_contact_email: Union[str, object] = values.unset, + business_contact_phone: Union[str, object] = values.unset, + edit_reason: Union[str, object] = values.unset, + ) -> TollfreeVerificationInstance: + """ + Asynchronous coroutine to update the TollfreeVerificationInstance + + :param business_name: The name of the business or organization using the Tollfree number. + :param business_website: The website of the business or organization using the Tollfree number. + :param notification_email: The email address to receive the notification about the verification result. . + :param use_case_categories: The category of the use case for the Tollfree Number. List as many are applicable.. + :param use_case_summary: Use this to further explain how messaging is used by the business or organization. + :param production_message_sample: An example of message content, i.e. a sample message. + :param opt_in_image_urls: Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + :param opt_in_type: + :param message_volume: Estimate monthly volume of messages from the Tollfree Number. + :param business_street_address: The address of the business or organization using the Tollfree number. + :param business_street_address2: The address of the business or organization using the Tollfree number. + :param business_city: The city of the business or organization using the Tollfree number. + :param business_state_province_region: The state/province/region of the business or organization using the Tollfree number. + :param business_postal_code: The postal code of the business or organization using the Tollfree number. + :param business_country: The country of the business or organization using the Tollfree number. + :param additional_information: Additional information to be provided for verification. + :param business_contact_first_name: The first name of the contact for the business or organization using the Tollfree number. + :param business_contact_last_name: The last name of the contact for the business or organization using the Tollfree number. + :param business_contact_email: The email address of the contact for the business or organization using the Tollfree number. + :param business_contact_phone: The E.164 formatted phone number of the contact for the business or organization using the Tollfree number. + :param edit_reason: Describe why the verification is being edited. If the verification was rejected because of a technical issue, such as the website being down, and the issue has been resolved this parameter should be set to something similar to 'Website fixed'. + + :returns: The updated TollfreeVerificationInstance + """ + + data = values.of( + { + "BusinessName": business_name, + "BusinessWebsite": business_website, + "NotificationEmail": notification_email, + "UseCaseCategories": serialize.map(use_case_categories, lambda e: e), + "UseCaseSummary": use_case_summary, + "ProductionMessageSample": production_message_sample, + "OptInImageUrls": serialize.map(opt_in_image_urls, lambda e: e), + "OptInType": opt_in_type, + "MessageVolume": message_volume, + "BusinessStreetAddress": business_street_address, + "BusinessStreetAddress2": business_street_address2, + "BusinessCity": business_city, + "BusinessStateProvinceRegion": business_state_province_region, + "BusinessPostalCode": business_postal_code, + "BusinessCountry": business_country, + "AdditionalInformation": additional_information, + "BusinessContactFirstName": business_contact_first_name, + "BusinessContactLastName": business_contact_last_name, + "BusinessContactEmail": business_contact_email, + "BusinessContactPhone": business_contact_phone, + "EditReason": edit_reason, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TollfreeVerificationInstance( + self._version, payload, sid=self._solution["sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TollfreeVerificationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> TollfreeVerificationInstance: + """ + Build an instance of TollfreeVerificationInstance + + :param payload: Payload response from the API + """ + return TollfreeVerificationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class TollfreeVerificationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the TollfreeVerificationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Tollfree/Verifications" + + def create( + self, + business_name: str, + business_website: str, + notification_email: str, + use_case_categories: List[str], + use_case_summary: str, + production_message_sample: str, + opt_in_image_urls: List[str], + opt_in_type: "TollfreeVerificationInstance.OptInType", + message_volume: str, + tollfree_phone_number_sid: str, + customer_profile_sid: Union[str, object] = values.unset, + business_street_address: Union[str, object] = values.unset, + business_street_address2: Union[str, object] = values.unset, + business_city: Union[str, object] = values.unset, + business_state_province_region: Union[str, object] = values.unset, + business_postal_code: Union[str, object] = values.unset, + business_country: Union[str, object] = values.unset, + additional_information: Union[str, object] = values.unset, + business_contact_first_name: Union[str, object] = values.unset, + business_contact_last_name: Union[str, object] = values.unset, + business_contact_email: Union[str, object] = values.unset, + business_contact_phone: Union[str, object] = values.unset, + external_reference_id: Union[str, object] = values.unset, + ) -> TollfreeVerificationInstance: + """ + Create the TollfreeVerificationInstance + + :param business_name: The name of the business or organization using the Tollfree number. + :param business_website: The website of the business or organization using the Tollfree number. + :param notification_email: The email address to receive the notification about the verification result. . + :param use_case_categories: The category of the use case for the Tollfree Number. List as many are applicable.. + :param use_case_summary: Use this to further explain how messaging is used by the business or organization. + :param production_message_sample: An example of message content, i.e. a sample message. + :param opt_in_image_urls: Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + :param opt_in_type: + :param message_volume: Estimate monthly volume of messages from the Tollfree Number. + :param tollfree_phone_number_sid: The SID of the Phone Number associated with the Tollfree Verification. + :param customer_profile_sid: Customer's Profile Bundle BundleSid. + :param business_street_address: The address of the business or organization using the Tollfree number. + :param business_street_address2: The address of the business or organization using the Tollfree number. + :param business_city: The city of the business or organization using the Tollfree number. + :param business_state_province_region: The state/province/region of the business or organization using the Tollfree number. + :param business_postal_code: The postal code of the business or organization using the Tollfree number. + :param business_country: The country of the business or organization using the Tollfree number. + :param additional_information: Additional information to be provided for verification. + :param business_contact_first_name: The first name of the contact for the business or organization using the Tollfree number. + :param business_contact_last_name: The last name of the contact for the business or organization using the Tollfree number. + :param business_contact_email: The email address of the contact for the business or organization using the Tollfree number. + :param business_contact_phone: The E.164 formatted phone number of the contact for the business or organization using the Tollfree number. + :param external_reference_id: An optional external reference ID supplied by customer and echoed back on status retrieval. + + :returns: The created TollfreeVerificationInstance + """ + + data = values.of( + { + "BusinessName": business_name, + "BusinessWebsite": business_website, + "NotificationEmail": notification_email, + "UseCaseCategories": serialize.map(use_case_categories, lambda e: e), + "UseCaseSummary": use_case_summary, + "ProductionMessageSample": production_message_sample, + "OptInImageUrls": serialize.map(opt_in_image_urls, lambda e: e), + "OptInType": opt_in_type, + "MessageVolume": message_volume, + "TollfreePhoneNumberSid": tollfree_phone_number_sid, + "CustomerProfileSid": customer_profile_sid, + "BusinessStreetAddress": business_street_address, + "BusinessStreetAddress2": business_street_address2, + "BusinessCity": business_city, + "BusinessStateProvinceRegion": business_state_province_region, + "BusinessPostalCode": business_postal_code, + "BusinessCountry": business_country, + "AdditionalInformation": additional_information, + "BusinessContactFirstName": business_contact_first_name, + "BusinessContactLastName": business_contact_last_name, + "BusinessContactEmail": business_contact_email, + "BusinessContactPhone": business_contact_phone, + "ExternalReferenceId": external_reference_id, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TollfreeVerificationInstance(self._version, payload) + + async def create_async( + self, + business_name: str, + business_website: str, + notification_email: str, + use_case_categories: List[str], + use_case_summary: str, + production_message_sample: str, + opt_in_image_urls: List[str], + opt_in_type: "TollfreeVerificationInstance.OptInType", + message_volume: str, + tollfree_phone_number_sid: str, + customer_profile_sid: Union[str, object] = values.unset, + business_street_address: Union[str, object] = values.unset, + business_street_address2: Union[str, object] = values.unset, + business_city: Union[str, object] = values.unset, + business_state_province_region: Union[str, object] = values.unset, + business_postal_code: Union[str, object] = values.unset, + business_country: Union[str, object] = values.unset, + additional_information: Union[str, object] = values.unset, + business_contact_first_name: Union[str, object] = values.unset, + business_contact_last_name: Union[str, object] = values.unset, + business_contact_email: Union[str, object] = values.unset, + business_contact_phone: Union[str, object] = values.unset, + external_reference_id: Union[str, object] = values.unset, + ) -> TollfreeVerificationInstance: + """ + Asynchronously create the TollfreeVerificationInstance + + :param business_name: The name of the business or organization using the Tollfree number. + :param business_website: The website of the business or organization using the Tollfree number. + :param notification_email: The email address to receive the notification about the verification result. . + :param use_case_categories: The category of the use case for the Tollfree Number. List as many are applicable.. + :param use_case_summary: Use this to further explain how messaging is used by the business or organization. + :param production_message_sample: An example of message content, i.e. a sample message. + :param opt_in_image_urls: Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + :param opt_in_type: + :param message_volume: Estimate monthly volume of messages from the Tollfree Number. + :param tollfree_phone_number_sid: The SID of the Phone Number associated with the Tollfree Verification. + :param customer_profile_sid: Customer's Profile Bundle BundleSid. + :param business_street_address: The address of the business or organization using the Tollfree number. + :param business_street_address2: The address of the business or organization using the Tollfree number. + :param business_city: The city of the business or organization using the Tollfree number. + :param business_state_province_region: The state/province/region of the business or organization using the Tollfree number. + :param business_postal_code: The postal code of the business or organization using the Tollfree number. + :param business_country: The country of the business or organization using the Tollfree number. + :param additional_information: Additional information to be provided for verification. + :param business_contact_first_name: The first name of the contact for the business or organization using the Tollfree number. + :param business_contact_last_name: The last name of the contact for the business or organization using the Tollfree number. + :param business_contact_email: The email address of the contact for the business or organization using the Tollfree number. + :param business_contact_phone: The E.164 formatted phone number of the contact for the business or organization using the Tollfree number. + :param external_reference_id: An optional external reference ID supplied by customer and echoed back on status retrieval. + + :returns: The created TollfreeVerificationInstance + """ + + data = values.of( + { + "BusinessName": business_name, + "BusinessWebsite": business_website, + "NotificationEmail": notification_email, + "UseCaseCategories": serialize.map(use_case_categories, lambda e: e), + "UseCaseSummary": use_case_summary, + "ProductionMessageSample": production_message_sample, + "OptInImageUrls": serialize.map(opt_in_image_urls, lambda e: e), + "OptInType": opt_in_type, + "MessageVolume": message_volume, + "TollfreePhoneNumberSid": tollfree_phone_number_sid, + "CustomerProfileSid": customer_profile_sid, + "BusinessStreetAddress": business_street_address, + "BusinessStreetAddress2": business_street_address2, + "BusinessCity": business_city, + "BusinessStateProvinceRegion": business_state_province_region, + "BusinessPostalCode": business_postal_code, + "BusinessCountry": business_country, + "AdditionalInformation": additional_information, + "BusinessContactFirstName": business_contact_first_name, + "BusinessContactLastName": business_contact_last_name, + "BusinessContactEmail": business_contact_email, + "BusinessContactPhone": business_contact_phone, + "ExternalReferenceId": external_reference_id, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TollfreeVerificationInstance(self._version, payload) + + def stream( + self, + tollfree_phone_number_sid: Union[str, object] = values.unset, + status: Union["TollfreeVerificationInstance.Status", object] = values.unset, + external_reference_id: Union[str, object] = values.unset, + include_sub_accounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[TollfreeVerificationInstance]: + """ + Streams TollfreeVerificationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str tollfree_phone_number_sid: The SID of the Phone Number associated with the Tollfree Verification. + :param "TollfreeVerificationInstance.Status" status: The compliance status of the Tollfree Verification record. + :param str external_reference_id: Customer supplied reference id for the Tollfree Verification record. + :param bool include_sub_accounts: Whether to include Tollfree Verifications from sub accounts in list response. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + tollfree_phone_number_sid=tollfree_phone_number_sid, + status=status, + external_reference_id=external_reference_id, + include_sub_accounts=include_sub_accounts, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + tollfree_phone_number_sid: Union[str, object] = values.unset, + status: Union["TollfreeVerificationInstance.Status", object] = values.unset, + external_reference_id: Union[str, object] = values.unset, + include_sub_accounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[TollfreeVerificationInstance]: + """ + Asynchronously streams TollfreeVerificationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str tollfree_phone_number_sid: The SID of the Phone Number associated with the Tollfree Verification. + :param "TollfreeVerificationInstance.Status" status: The compliance status of the Tollfree Verification record. + :param str external_reference_id: Customer supplied reference id for the Tollfree Verification record. + :param bool include_sub_accounts: Whether to include Tollfree Verifications from sub accounts in list response. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + tollfree_phone_number_sid=tollfree_phone_number_sid, + status=status, + external_reference_id=external_reference_id, + include_sub_accounts=include_sub_accounts, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + tollfree_phone_number_sid: Union[str, object] = values.unset, + status: Union["TollfreeVerificationInstance.Status", object] = values.unset, + external_reference_id: Union[str, object] = values.unset, + include_sub_accounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TollfreeVerificationInstance]: + """ + Lists TollfreeVerificationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str tollfree_phone_number_sid: The SID of the Phone Number associated with the Tollfree Verification. + :param "TollfreeVerificationInstance.Status" status: The compliance status of the Tollfree Verification record. + :param str external_reference_id: Customer supplied reference id for the Tollfree Verification record. + :param bool include_sub_accounts: Whether to include Tollfree Verifications from sub accounts in list response. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + tollfree_phone_number_sid=tollfree_phone_number_sid, + status=status, + external_reference_id=external_reference_id, + include_sub_accounts=include_sub_accounts, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + tollfree_phone_number_sid: Union[str, object] = values.unset, + status: Union["TollfreeVerificationInstance.Status", object] = values.unset, + external_reference_id: Union[str, object] = values.unset, + include_sub_accounts: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TollfreeVerificationInstance]: + """ + Asynchronously lists TollfreeVerificationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str tollfree_phone_number_sid: The SID of the Phone Number associated with the Tollfree Verification. + :param "TollfreeVerificationInstance.Status" status: The compliance status of the Tollfree Verification record. + :param str external_reference_id: Customer supplied reference id for the Tollfree Verification record. + :param bool include_sub_accounts: Whether to include Tollfree Verifications from sub accounts in list response. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + tollfree_phone_number_sid=tollfree_phone_number_sid, + status=status, + external_reference_id=external_reference_id, + include_sub_accounts=include_sub_accounts, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + tollfree_phone_number_sid: Union[str, object] = values.unset, + status: Union["TollfreeVerificationInstance.Status", object] = values.unset, + external_reference_id: Union[str, object] = values.unset, + include_sub_accounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TollfreeVerificationPage: + """ + Retrieve a single page of TollfreeVerificationInstance records from the API. + Request is executed immediately + + :param tollfree_phone_number_sid: The SID of the Phone Number associated with the Tollfree Verification. + :param status: The compliance status of the Tollfree Verification record. + :param external_reference_id: Customer supplied reference id for the Tollfree Verification record. + :param include_sub_accounts: Whether to include Tollfree Verifications from sub accounts in list response. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TollfreeVerificationInstance + """ + data = values.of( + { + "TollfreePhoneNumberSid": tollfree_phone_number_sid, + "Status": status, + "ExternalReferenceId": external_reference_id, + "IncludeSubAccounts": serialize.boolean_to_string(include_sub_accounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TollfreeVerificationPage(self._version, response) + + async def page_async( + self, + tollfree_phone_number_sid: Union[str, object] = values.unset, + status: Union["TollfreeVerificationInstance.Status", object] = values.unset, + external_reference_id: Union[str, object] = values.unset, + include_sub_accounts: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TollfreeVerificationPage: + """ + Asynchronously retrieve a single page of TollfreeVerificationInstance records from the API. + Request is executed immediately + + :param tollfree_phone_number_sid: The SID of the Phone Number associated with the Tollfree Verification. + :param status: The compliance status of the Tollfree Verification record. + :param external_reference_id: Customer supplied reference id for the Tollfree Verification record. + :param include_sub_accounts: Whether to include Tollfree Verifications from sub accounts in list response. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TollfreeVerificationInstance + """ + data = values.of( + { + "TollfreePhoneNumberSid": tollfree_phone_number_sid, + "Status": status, + "ExternalReferenceId": external_reference_id, + "IncludeSubAccounts": serialize.boolean_to_string(include_sub_accounts), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TollfreeVerificationPage(self._version, response) + + def get_page(self, target_url: str) -> TollfreeVerificationPage: + """ + Retrieve a specific page of TollfreeVerificationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TollfreeVerificationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return TollfreeVerificationPage(self._version, response) + + async def get_page_async(self, target_url: str) -> TollfreeVerificationPage: + """ + Asynchronously retrieve a specific page of TollfreeVerificationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TollfreeVerificationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return TollfreeVerificationPage(self._version, response) + + def get(self, sid: str) -> TollfreeVerificationContext: + """ + Constructs a TollfreeVerificationContext + + :param sid: The unique string to identify Tollfree Verification. + """ + return TollfreeVerificationContext(self._version, sid=sid) + + def __call__(self, sid: str) -> TollfreeVerificationContext: + """ + Constructs a TollfreeVerificationContext + + :param sid: The unique string to identify Tollfree Verification. + """ + return TollfreeVerificationContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v1/usecase.py b/venv/Lib/site-packages/twilio/rest/messaging/v1/usecase.py new file mode 100644 index 00000000..fe811e0c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v1/usecase.py @@ -0,0 +1,94 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class UsecaseInstance(InstanceResource): + """ + :ivar usecases: Human readable use case details (usecase, description and purpose) of Messaging Service Use Cases. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.usecases: Optional[List[Dict[str, object]]] = payload.get("usecases") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class UsecaseList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the UsecaseList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services/Usecases" + + def fetch(self) -> UsecaseInstance: + """ + Asynchronously fetch the UsecaseInstance + + + :returns: The fetched UsecaseInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UsecaseInstance(self._version, payload) + + async def fetch_async(self) -> UsecaseInstance: + """ + Asynchronously fetch the UsecaseInstance + + + :returns: The fetched UsecaseInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UsecaseInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v2/__init__.py b/venv/Lib/site-packages/twilio/rest/messaging/v2/__init__.py new file mode 100644 index 00000000..7ef89fdc --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/messaging/v2/__init__.py @@ -0,0 +1,43 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Messaging + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.messaging.v2.channels_sender import ChannelsSenderList + + +class V2(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V2 version of Messaging + + :param domain: The Twilio.messaging domain + """ + super().__init__(domain, "v2") + self._channels_senders: Optional[ChannelsSenderList] = None + + @property + def channels_senders(self) -> ChannelsSenderList: + if self._channels_senders is None: + self._channels_senders = ChannelsSenderList(self) + return self._channels_senders + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v2/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..147f98417b2b7e0973e0064d7a17ddbe2350b9e2 GIT binary patch literal 2074 zcmahKO>Y}TbauVAH+H_7(6mSqniibkLu@IkgosL^N=g*bCRG!1u#ASy?l@k$-d$$a zF1CEgArk4KN0c17R`~<`2QCQ|wOSDgi4zisKpIi?#G9G5leR*PS8v|;d-L9#@sC48 zIRxv`PhZw6X@q_kL~j8t*U2($yU0Nm_@=*bW?uA6Oi3QlBy_q7L3@3o#)C zpZx?wu!t~}y8>^JiPkw4;YXMeBBORO?)HDc76g2tq9lX}jwA&TA-h%JD2$M@z!E2l zUGDoOU1_XT6FqRQTnc58E|6acAOcoQh zN0+;zo^CLN*K9; zZ+U=c*D2#b0Ge3{8kQ@tvH7~?`_$vB)ORSm?efT0lcQiVM(E^IpudH|q^P37aO#dm zQ#E}D)nG`s2P+0mJ1Lr}>5j2&>?a;7S>Tz#OK%&MfgSXXR>`fRVkXwtXXA_`bFlSu z;S9h<#FJ|PzSDM5)E7R~yXX;IlCI`x`-u&VKX6IkLt8JVI-V?$X!?@xMy}<#9V%N zUG!C7bcSq=MnXrfF4|A*p=CYhf7rp0Xv;;N4TB!b0C=pi5!kr!fY}9r@#yOX?u^6f zUT0!qH4R`3{gxkjn!j?GzjBZ-{#y9p2jl0$M>`8o2CqIF8GkxbI2!pMnh-?^ve=gudg|$ipb~i9m}q}KK);d z&c*BMbt&~3>iE`ENaU}un7>vDIPKQw!nsxIku_i5mMCHC~#$J zpU5^bQ#cYp=KLWbFSgOKkxegXd#zI>_Tw>>89vri>8XRO*ZxMZpQL)6<6JsDz4z`v z2sW9&^tD{f#aTj}z=p&#Q9FbOnu$q^$JJ#hZCIR^lIzYy=i;&R5_QMrDdYDOfw(_s zH@(z)W0+I{4TbaI*GK&BQ$-43P))1 Qd1gYJ-nn#&V3S_{1;0`p%>V!Z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/messaging/v2/__pycache__/channels_sender.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/messaging/v2/__pycache__/channels_sender.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..daded122dec1b207dc7043e48e54be340912ea2c GIT binary patch literal 42672 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 x@p&yb1?Ici<5BD)uF=_h6JJb&=jKsQnb "ChannelsSenderContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ChannelsSenderContext for this ChannelsSenderInstance + """ + if self._context is None: + self._context = ChannelsSenderContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ChannelsSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ChannelsSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ChannelsSenderInstance": + """ + Fetch the ChannelsSenderInstance + + + :returns: The fetched ChannelsSenderInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ChannelsSenderInstance": + """ + Asynchronous coroutine to fetch the ChannelsSenderInstance + + + :returns: The fetched ChannelsSenderInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + messaging_v2_channels_sender_requests_update: Union[ + MessagingV2ChannelsSenderRequestsUpdate, object + ] = values.unset, + ) -> "ChannelsSenderInstance": + """ + Update the ChannelsSenderInstance + + :param messaging_v2_channels_sender_requests_update: + + :returns: The updated ChannelsSenderInstance + """ + return self._proxy.update( + messaging_v2_channels_sender_requests_update=messaging_v2_channels_sender_requests_update, + ) + + async def update_async( + self, + messaging_v2_channels_sender_requests_update: Union[ + MessagingV2ChannelsSenderRequestsUpdate, object + ] = values.unset, + ) -> "ChannelsSenderInstance": + """ + Asynchronous coroutine to update the ChannelsSenderInstance + + :param messaging_v2_channels_sender_requests_update: + + :returns: The updated ChannelsSenderInstance + """ + return await self._proxy.update_async( + messaging_v2_channels_sender_requests_update=messaging_v2_channels_sender_requests_update, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelsSenderContext(InstanceContext): + + class MessagingV2ChannelsSenderConfiguration(object): + """ + :ivar waba_id: The ID of the WhatsApp Business Account to use for this sender. + :ivar verification_method: The method to use for verification. Either \"sms\" or \"voice\". + :ivar verification_code: The verification code to use for this sender. + :ivar voice_application_sid: The SID of the Twilio Voice application to use for this sender. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.waba_id: Optional[str] = payload.get("waba_id") + self.verification_method: Optional["ChannelsSenderInstance.str"] = ( + payload.get("verification_method") + ) + self.verification_code: Optional[str] = payload.get("verification_code") + self.voice_application_sid: Optional[str] = payload.get( + "voice_application_sid" + ) + + def to_dict(self): + return { + "waba_id": self.waba_id, + "verification_method": self.verification_method, + "verification_code": self.verification_code, + "voice_application_sid": self.voice_application_sid, + } + + class MessagingV2ChannelsSenderProfile(object): + """ + :ivar name: The name of the sender. + :ivar about: The about text of the sender. + :ivar address: The address of the sender. + :ivar description: The description of the sender. + :ivar emails: The emails of the sender. + :ivar logo_url: The logo URL of the sender. + :ivar vertical: The vertical of the sender. Allowed values are: - \"Automotive\" - \"Beauty, Spa and Salon\" - \"Clothing and Apparel\" - \"Education\" - \"Entertainment\" - \"Event Planning and Service\" - \"Finance and Banking\" - \"Food and Grocery\" - \"Public Service\" - \"Hotel and Lodging\" - \"Medical and Health\" - \"Non-profit\" - \"Professional Services\" - \"Shopping and Retail\" - \"Travel and Transportation\" - \"Restaurant\" - \"Other\" + :ivar websites: The websites of the sender. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.name: Optional[str] = payload.get("name") + self.about: Optional[str] = payload.get("about") + self.address: Optional[str] = payload.get("address") + self.description: Optional[str] = payload.get("description") + self.emails: Optional[Dict[str, object]] = payload.get("emails") + self.logo_url: Optional[str] = payload.get("logo_url") + self.vertical: Optional[str] = payload.get("vertical") + self.websites: Optional[Dict[str, object]] = payload.get("websites") + + def to_dict(self): + return { + "name": self.name, + "about": self.about, + "address": self.address, + "description": self.description, + "emails": self.emails, + "logo_url": self.logo_url, + "vertical": self.vertical, + "websites": self.websites, + } + + class MessagingV2ChannelsSenderRequestsCreate(object): + """ + :ivar sender_id: The ID of this Sender prefixed with the channel, e.g., `whatsapp:E.164` + :ivar configuration: + :ivar webhook: + :ivar profile: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.sender_id: Optional[str] = payload.get("sender_id") + self.configuration: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderConfiguration + ] = payload.get("configuration") + self.webhook: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderWebhook + ] = payload.get("webhook") + self.profile: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderProfile + ] = payload.get("profile") + + def to_dict(self): + return { + "sender_id": self.sender_id, + "configuration": ( + self.configuration.to_dict() + if self.configuration is not None + else None + ), + "webhook": self.webhook.to_dict() if self.webhook is not None else None, + "profile": self.profile.to_dict() if self.profile is not None else None, + } + + class MessagingV2ChannelsSenderRequestsUpdate(object): + """ + :ivar configuration: + :ivar webhook: + :ivar profile: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.configuration: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderConfiguration + ] = payload.get("configuration") + self.webhook: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderWebhook + ] = payload.get("webhook") + self.profile: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderProfile + ] = payload.get("profile") + + def to_dict(self): + return { + "configuration": ( + self.configuration.to_dict() + if self.configuration is not None + else None + ), + "webhook": self.webhook.to_dict() if self.webhook is not None else None, + "profile": self.profile.to_dict() if self.profile is not None else None, + } + + class MessagingV2ChannelsSenderWebhook(object): + """ + :ivar callback_url: The URL to send the webhook to. + :ivar callback_method: The HTTP method to use for the webhook. Either \"POST\" or \"PUT\". + :ivar fallback_url: The URL to send the fallback webhook to. + :ivar fallback_method: The HTTP method to use for the fallback webhook. Either \"POST\" or \"PUT\". + :ivar status_callback_url: The URL to send the status callback to. + :ivar status_callback_method: The HTTP method to use for the status callback. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.callback_url: Optional[str] = payload.get("callback_url") + self.callback_method: Optional["ChannelsSenderInstance.str"] = payload.get( + "callback_method" + ) + self.fallback_url: Optional[str] = payload.get("fallback_url") + self.fallback_method: Optional["ChannelsSenderInstance.str"] = payload.get( + "fallback_method" + ) + self.status_callback_url: Optional[str] = payload.get("status_callback_url") + self.status_callback_method: Optional[str] = payload.get( + "status_callback_method" + ) + + def to_dict(self): + return { + "callback_url": self.callback_url, + "callback_method": self.callback_method, + "fallback_url": self.fallback_url, + "fallback_method": self.fallback_method, + "status_callback_url": self.status_callback_url, + "status_callback_method": self.status_callback_method, + } + + def __init__(self, version: Version, sid: str): + """ + Initialize the ChannelsSenderContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this Sender. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Channels/Senders/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the ChannelsSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ChannelsSenderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ChannelsSenderInstance: + """ + Fetch the ChannelsSenderInstance + + + :returns: The fetched ChannelsSenderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ChannelsSenderInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ChannelsSenderInstance: + """ + Asynchronous coroutine to fetch the ChannelsSenderInstance + + + :returns: The fetched ChannelsSenderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ChannelsSenderInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + messaging_v2_channels_sender_requests_update: Union[ + MessagingV2ChannelsSenderRequestsUpdate, object + ] = values.unset, + ) -> ChannelsSenderInstance: + """ + Update the ChannelsSenderInstance + + :param messaging_v2_channels_sender_requests_update: + + :returns: The updated ChannelsSenderInstance + """ + data = messaging_v2_channels_sender_requests_update.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelsSenderInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + messaging_v2_channels_sender_requests_update: Union[ + MessagingV2ChannelsSenderRequestsUpdate, object + ] = values.unset, + ) -> ChannelsSenderInstance: + """ + Asynchronous coroutine to update the ChannelsSenderInstance + + :param messaging_v2_channels_sender_requests_update: + + :returns: The updated ChannelsSenderInstance + """ + data = messaging_v2_channels_sender_requests_update.to_dict() + + headers = values.of({}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelsSenderInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ChannelsSenderPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ChannelsSenderInstance: + """ + Build an instance of ChannelsSenderInstance + + :param payload: Payload response from the API + """ + return ChannelsSenderInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ChannelsSenderList(ListResource): + + class MessagingV2ChannelsSenderConfiguration(object): + """ + :ivar waba_id: The ID of the WhatsApp Business Account to use for this sender. + :ivar verification_method: The method to use for verification. Either \"sms\" or \"voice\". + :ivar verification_code: The verification code to use for this sender. + :ivar voice_application_sid: The SID of the Twilio Voice application to use for this sender. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.waba_id: Optional[str] = payload.get("waba_id") + self.verification_method: Optional["ChannelsSenderInstance.str"] = ( + payload.get("verification_method") + ) + self.verification_code: Optional[str] = payload.get("verification_code") + self.voice_application_sid: Optional[str] = payload.get( + "voice_application_sid" + ) + + def to_dict(self): + return { + "waba_id": self.waba_id, + "verification_method": self.verification_method, + "verification_code": self.verification_code, + "voice_application_sid": self.voice_application_sid, + } + + class MessagingV2ChannelsSenderProfile(object): + """ + :ivar name: The name of the sender. + :ivar about: The about text of the sender. + :ivar address: The address of the sender. + :ivar description: The description of the sender. + :ivar emails: The emails of the sender. + :ivar logo_url: The logo URL of the sender. + :ivar vertical: The vertical of the sender. Allowed values are: - \"Automotive\" - \"Beauty, Spa and Salon\" - \"Clothing and Apparel\" - \"Education\" - \"Entertainment\" - \"Event Planning and Service\" - \"Finance and Banking\" - \"Food and Grocery\" - \"Public Service\" - \"Hotel and Lodging\" - \"Medical and Health\" - \"Non-profit\" - \"Professional Services\" - \"Shopping and Retail\" - \"Travel and Transportation\" - \"Restaurant\" - \"Other\" + :ivar websites: The websites of the sender. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.name: Optional[str] = payload.get("name") + self.about: Optional[str] = payload.get("about") + self.address: Optional[str] = payload.get("address") + self.description: Optional[str] = payload.get("description") + self.emails: Optional[Dict[str, object]] = payload.get("emails") + self.logo_url: Optional[str] = payload.get("logo_url") + self.vertical: Optional[str] = payload.get("vertical") + self.websites: Optional[Dict[str, object]] = payload.get("websites") + + def to_dict(self): + return { + "name": self.name, + "about": self.about, + "address": self.address, + "description": self.description, + "emails": self.emails, + "logo_url": self.logo_url, + "vertical": self.vertical, + "websites": self.websites, + } + + class MessagingV2ChannelsSenderRequestsCreate(object): + """ + :ivar sender_id: The ID of this Sender prefixed with the channel, e.g., `whatsapp:E.164` + :ivar configuration: + :ivar webhook: + :ivar profile: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.sender_id: Optional[str] = payload.get("sender_id") + self.configuration: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderConfiguration + ] = payload.get("configuration") + self.webhook: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderWebhook + ] = payload.get("webhook") + self.profile: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderProfile + ] = payload.get("profile") + + def to_dict(self): + return { + "sender_id": self.sender_id, + "configuration": ( + self.configuration.to_dict() + if self.configuration is not None + else None + ), + "webhook": self.webhook.to_dict() if self.webhook is not None else None, + "profile": self.profile.to_dict() if self.profile is not None else None, + } + + class MessagingV2ChannelsSenderRequestsUpdate(object): + """ + :ivar configuration: + :ivar webhook: + :ivar profile: + """ + + def __init__(self, payload: Dict[str, Any]): + + self.configuration: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderConfiguration + ] = payload.get("configuration") + self.webhook: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderWebhook + ] = payload.get("webhook") + self.profile: Optional[ + ChannelsSenderList.MessagingV2ChannelsSenderProfile + ] = payload.get("profile") + + def to_dict(self): + return { + "configuration": ( + self.configuration.to_dict() + if self.configuration is not None + else None + ), + "webhook": self.webhook.to_dict() if self.webhook is not None else None, + "profile": self.profile.to_dict() if self.profile is not None else None, + } + + class MessagingV2ChannelsSenderWebhook(object): + """ + :ivar callback_url: The URL to send the webhook to. + :ivar callback_method: The HTTP method to use for the webhook. Either \"POST\" or \"PUT\". + :ivar fallback_url: The URL to send the fallback webhook to. + :ivar fallback_method: The HTTP method to use for the fallback webhook. Either \"POST\" or \"PUT\". + :ivar status_callback_url: The URL to send the status callback to. + :ivar status_callback_method: The HTTP method to use for the status callback. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.callback_url: Optional[str] = payload.get("callback_url") + self.callback_method: Optional["ChannelsSenderInstance.str"] = payload.get( + "callback_method" + ) + self.fallback_url: Optional[str] = payload.get("fallback_url") + self.fallback_method: Optional["ChannelsSenderInstance.str"] = payload.get( + "fallback_method" + ) + self.status_callback_url: Optional[str] = payload.get("status_callback_url") + self.status_callback_method: Optional[str] = payload.get( + "status_callback_method" + ) + + def to_dict(self): + return { + "callback_url": self.callback_url, + "callback_method": self.callback_method, + "fallback_url": self.fallback_url, + "fallback_method": self.fallback_method, + "status_callback_url": self.status_callback_url, + "status_callback_method": self.status_callback_method, + } + + def __init__(self, version: Version): + """ + Initialize the ChannelsSenderList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Channels/Senders" + + def create( + self, + messaging_v2_channels_sender_requests_create: MessagingV2ChannelsSenderRequestsCreate, + ) -> ChannelsSenderInstance: + """ + Create the ChannelsSenderInstance + + :param messaging_v2_channels_sender_requests_create: + + :returns: The created ChannelsSenderInstance + """ + data = messaging_v2_channels_sender_requests_create.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelsSenderInstance(self._version, payload) + + async def create_async( + self, + messaging_v2_channels_sender_requests_create: MessagingV2ChannelsSenderRequestsCreate, + ) -> ChannelsSenderInstance: + """ + Asynchronously create the ChannelsSenderInstance + + :param messaging_v2_channels_sender_requests_create: + + :returns: The created ChannelsSenderInstance + """ + data = messaging_v2_channels_sender_requests_create.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ChannelsSenderInstance(self._version, payload) + + def stream( + self, + channel: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ChannelsSenderInstance]: + """ + Streams ChannelsSenderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str channel: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(channel=channel, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + channel: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ChannelsSenderInstance]: + """ + Asynchronously streams ChannelsSenderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str channel: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(channel=channel, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + channel: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelsSenderInstance]: + """ + Lists ChannelsSenderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str channel: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + channel=channel, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + channel: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ChannelsSenderInstance]: + """ + Asynchronously lists ChannelsSenderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str channel: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + channel=channel, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + channel: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelsSenderPage: + """ + Retrieve a single page of ChannelsSenderInstance records from the API. + Request is executed immediately + + :param channel: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelsSenderInstance + """ + data = values.of( + { + "Channel": channel, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelsSenderPage(self._version, response) + + async def page_async( + self, + channel: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ChannelsSenderPage: + """ + Asynchronously retrieve a single page of ChannelsSenderInstance records from the API. + Request is executed immediately + + :param channel: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ChannelsSenderInstance + """ + data = values.of( + { + "Channel": channel, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ChannelsSenderPage(self._version, response) + + def get_page(self, target_url: str) -> ChannelsSenderPage: + """ + Retrieve a specific page of ChannelsSenderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelsSenderInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ChannelsSenderPage(self._version, response) + + async def get_page_async(self, target_url: str) -> ChannelsSenderPage: + """ + Asynchronously retrieve a specific page of ChannelsSenderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ChannelsSenderInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ChannelsSenderPage(self._version, response) + + def get(self, sid: str) -> ChannelsSenderContext: + """ + Constructs a ChannelsSenderContext + + :param sid: A 34 character string that uniquely identifies this Sender. + """ + return ChannelsSenderContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ChannelsSenderContext: + """ + Constructs a ChannelsSenderContext + + :param sid: A 34 character string that uniquely identifies this Sender. + """ + return ChannelsSenderContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/MicrovisorBase.py b/venv/Lib/site-packages/twilio/rest/microvisor/MicrovisorBase.py new file mode 100644 index 00000000..e8c874b9 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/microvisor/MicrovisorBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.microvisor.v1 import V1 + + +class MicrovisorBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Microvisor Domain + + :returns: Domain for Microvisor + """ + super().__init__(twilio, "https://microvisor.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Microvisor + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/__init__.py b/venv/Lib/site-packages/twilio/rest/microvisor/__init__.py new file mode 100644 index 00000000..6bf448b2 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/microvisor/__init__.py @@ -0,0 +1,43 @@ +from warnings import warn + +from twilio.rest.microvisor.MicrovisorBase import MicrovisorBase +from twilio.rest.microvisor.v1.account_config import AccountConfigList +from twilio.rest.microvisor.v1.account_secret import AccountSecretList +from twilio.rest.microvisor.v1.app import AppList +from twilio.rest.microvisor.v1.device import DeviceList + + +class Microvisor(MicrovisorBase): + @property + def account_configs(self) -> AccountConfigList: + warn( + "account_configs is deprecated. Use v1.account_configs instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.account_configs + + @property + def account_secrets(self) -> AccountSecretList: + warn( + "account_secrets is deprecated. Use v1.account_secrets instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.account_secrets + + @property + def apps(self) -> AppList: + warn( + "apps is deprecated. Use v1.apps instead.", DeprecationWarning, stacklevel=2 + ) + return self.v1.apps + + @property + def devices(self) -> DeviceList: + warn( + "devices is deprecated. Use v1.devices instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.devices diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/__pycache__/MicrovisorBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/microvisor/__pycache__/MicrovisorBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e678be0c17fc48df622e7044e6d38ee36719701e GIT binary patch literal 2023 zcmahKO>Y}TbauU7ubs~}&?KT%Q)mDmYReL!Dypic4U`C)RBgz?7)>|3<9O+M*UWC* z*zzHVNF)+bDAGIlC7yOOb)#%3 zL?zdVt#1)K!?lA{?5~_{8TqXFgF;A-(&d^HP|LSDy=w+^jeA^}A-Cyj3xtd@I`~jv zAd3MK?~?d8nP|mQ)Q^AC3cS(|etREDOAaW;62?#{Nd#!!si1+x7%L){IEmTCo?F(D zwy|cS2GL@Vs0-nc{1O4itMuGbiXq}}Prs4_zl%%DAI&Cpa?K#1P%v{n^j|0zU21S| z?#2SW7FW<01u(6JVI!C=7JU$!4d;APUJ!=ds)541Pdz`R+;&15);P6ffV%0eo37g` z{x<(0@-YJ`sOnJ(b^yk9pR53#GR!@UqNb){s*-Hl<=YI687(BHuDa8g!afK*%I zsj9k7sxU}f!)1-9?G)Fms;zBl2Z@Jr26zVW(py?NyG=Hfa_$z%>(S_S#}akLR>`%OA1rOJS7tAISTJ;4T==b&7Z}yr}?E_7r_`M4|7ak71@py82|J-*Q z+w zJw|stou1i$`)>l9JiK(Yn9oHS#%$k$Q|n=?;dpBTCo(#j+~8HbDzWB+dbe^A{k}O(}}*J0m6`i1M+7$Mgb>2PN<`xLz(Yi%m4;!ay$sAN-Q%@v zSt18te2C1=`~^h*NiLfxQmj#YN^;<~Vey3%)jhKh*=*tyjCQN5zpC!8{;H0@KAn3?)nAx)jKvVkumg12xnvjq6IF zhb61Tbu}=;5o<(1BKjJ6+6MA;EIpU!cbO5}CU4qjB)aH_;P>p%q^j*wmZhl-Yi?dP3gZVbX$Pzqc ziCFRkEH8}+(!X!;=q&%i#eN^FShaH=q{wtj~bcS zoXy7e?FFl4ii0J}ZdZM6UB6t1LkX>ad*jCK`aGtO(m1I%V@TRu14n7SiKAwH!M|Up zeu_Uy;9RGHX+2%>13#W2n5HvfuT*Ai+mHOzwrj~MnSc}4PW4IOf2|R)cP@bV5&f-~ zcghQYmM3?PpV-snlF>HM__3{(&6PjKrhgrqZt2qrLS0Uj5&SC#BmVsnwd*Zk_@GTn-0N&%r-f2 z@zd<$V}o@AUS|NLAA=~0<+ISFvCb#n;2lGa6G?{oGWj8leQjjK5prgoSa3ooawe5IU%;~%&_e+_Lc*tmu>rp zWhW>sdP3p^lXR7^=E&b@!kQZ|PNFf5WsB%cu;`xU)tFZ>`@9h**q=rqHqeezX^X0I zv32&-mk7p=gw#=vw8y*JP@AlL^rZ0;!B8v%tz9mbO+7uucAVm-f8mTNepMd8qFKpw z_GN>%Nb`nyA@5){*1>B14p!^4%f5SrwfF4O5Z?o>n$vU`_xv5^TxMtfWA`NCEN9i> zK6wq~Dd3EsgOKy9vp(`#zmg~SDluWo+CG1e+L9m$yXfRU=-Mv&ivMPJ(dVz!v%=Jq K$vp%E-{cLS{|YDo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/microvisor/v1/__init__.py new file mode 100644 index 00000000..22010d62 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/microvisor/v1/__init__.py @@ -0,0 +1,67 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Microvisor + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.microvisor.v1.account_config import AccountConfigList +from twilio.rest.microvisor.v1.account_secret import AccountSecretList +from twilio.rest.microvisor.v1.app import AppList +from twilio.rest.microvisor.v1.device import DeviceList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Microvisor + + :param domain: The Twilio.microvisor domain + """ + super().__init__(domain, "v1") + self._account_configs: Optional[AccountConfigList] = None + self._account_secrets: Optional[AccountSecretList] = None + self._apps: Optional[AppList] = None + self._devices: Optional[DeviceList] = None + + @property + def account_configs(self) -> AccountConfigList: + if self._account_configs is None: + self._account_configs = AccountConfigList(self) + return self._account_configs + + @property + def account_secrets(self) -> AccountSecretList: + if self._account_secrets is None: + self._account_secrets = AccountSecretList(self) + return self._account_secrets + + @property + def apps(self) -> AppList: + if self._apps is None: + self._apps = AppList(self) + return self._apps + + @property + def devices(self) -> DeviceList: + if self._devices is None: + self._devices = DeviceList(self) + return self._devices + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/microvisor/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d18a434a87a12958069351b3918f90398ad69dae GIT binary patch literal 3168 zcmc&$&2JM&6rWwM?Tzhx@KHX}xEk63u}W-(svmLzH6j$Hg@8z!gJnA1>`sy`Ywvb; zV`|GtIYg=>f#{`5q+U4mf^zBq(Mu>upcRoS_0&V9v;h@y>YLg1#t>S1DjVy~o8NnH zX5PGy$xq$gDFok*pTC&@K}G0SK52jPklA9utRMrGkRcheB~|2-EO9<&#VSfk5xio> zD~VD<@Np|yQA?`e6INFxRZ0myX{9TfQbzEq)m`Z+^+-rYXOYphgp3qb)?&e)rQUiv zm(hNg5K3YArsho->$XAhRn5h7v`U%gQ3KD^xtI`wxBoc6A;JyC7?2&)P^&|Qufxp< z5xX`qZbp9q^9lSwC6Exp5i#Y2Z`mvZ5^#hRI2SGwz=ddC(iFylYN!W`2TO8geq5Md z=7eupZm)|m-y`_7^~iN`fJp4JyS1&l8X;(E1_~bNYE=+(;jM){< z}zNn7X8tdRypgsnj=#a$UYWJ>n+};j%7w99RLKpLy$ZAm2$V$cu!_aueNv!fi^1 zv=-VxxdBR|6~wIVb0Fg@iciSeg^%iTF4m}u$nkU>ubQ5zS!RQZ;7yOw|3? z>FJSt8|(+bJr3l_B6^fTT|LXmJL-YeeYf`BQ;$42IoeY0so7{8I@VIIryk^wx0D;* zTVRF!1Z4ICtLo4hqmMfy^5GINE2xRSj6~baVxJeqyouIAd&rAO<;8ZB=(aSGli4oN zV+kO)CH5K&E?)t&{XqTR=OWYC4K6>29RbCyqd*qXFX`Us%fhG(IB2#5&C&Ej%#J)M1c5Z~JSeYQ1r{Syer&Bk(LT|M~9 zT-nRL=z5VW$*{m1DexxbKj03%898)v`Q&;UKO8u6%ey;p3_Lo|J-W7hZCxGM=@FO( zHN;!t3aU#vxk00*bdkTN@ZX1qXPHT>hE>OmI#B%3AvFF{MViH+KHVZduj%tQ30FA8@V$de_ssiflXtkxbQ7&Z@}M9-!iiyvM;bo@^Q z<5sMVfKxA*^?y6Z&H5v={>Uu5+RsJVNR-`7#p6S(Z~cW}5Vs}HHj(S|lY|(y4%d|M z>W*2RW4vejdxCDCpV3^J58ph-6UE=%DGA;=ai{)JDBur7$7`3bJ>M9`b^jOjpuvck z_}PD1-El;;eEiQkLBRx}6rthGIk*Vk&!4I%f^<2>-h(M`^zJZ_&6p%ff5;h0c|3rm ffemzY10CK#AB*3}273Qd;%#ZDwf`}KK`i$-BoF+5 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/__pycache__/account_config.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/microvisor/v1/__pycache__/account_config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..038cdd6ab591795b4efd799bec662306d275cf8c GIT binary patch literal 23821 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/account_config.py b/venv/Lib/site-packages/twilio/rest/microvisor/v1/account_config.py new file mode 100644 index 00000000..7faba8ac --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/microvisor/v1/account_config.py @@ -0,0 +1,585 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Microvisor + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AccountConfigInstance(InstanceResource): + """ + :ivar key: The config key; up to 100 characters. + :ivar date_updated: + :ivar value: The config value; up to 4096 characters. + :ivar url: The absolute URL of the Config. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], key: Optional[str] = None + ): + super().__init__(version) + + self.key: Optional[str] = payload.get("key") + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.value: Optional[str] = payload.get("value") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "key": key or self.key, + } + self._context: Optional[AccountConfigContext] = None + + @property + def _proxy(self) -> "AccountConfigContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AccountConfigContext for this AccountConfigInstance + """ + if self._context is None: + self._context = AccountConfigContext( + self._version, + key=self._solution["key"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AccountConfigInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AccountConfigInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AccountConfigInstance": + """ + Fetch the AccountConfigInstance + + + :returns: The fetched AccountConfigInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AccountConfigInstance": + """ + Asynchronous coroutine to fetch the AccountConfigInstance + + + :returns: The fetched AccountConfigInstance + """ + return await self._proxy.fetch_async() + + def update(self, value: str) -> "AccountConfigInstance": + """ + Update the AccountConfigInstance + + :param value: The config value; up to 4096 characters. + + :returns: The updated AccountConfigInstance + """ + return self._proxy.update( + value=value, + ) + + async def update_async(self, value: str) -> "AccountConfigInstance": + """ + Asynchronous coroutine to update the AccountConfigInstance + + :param value: The config value; up to 4096 characters. + + :returns: The updated AccountConfigInstance + """ + return await self._proxy.update_async( + value=value, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AccountConfigContext(InstanceContext): + + def __init__(self, version: Version, key: str): + """ + Initialize the AccountConfigContext + + :param version: Version that contains the resource + :param key: The config key; up to 100 characters. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "key": key, + } + self._uri = "/Configs/{key}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the AccountConfigInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AccountConfigInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AccountConfigInstance: + """ + Fetch the AccountConfigInstance + + + :returns: The fetched AccountConfigInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AccountConfigInstance( + self._version, + payload, + key=self._solution["key"], + ) + + async def fetch_async(self) -> AccountConfigInstance: + """ + Asynchronous coroutine to fetch the AccountConfigInstance + + + :returns: The fetched AccountConfigInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AccountConfigInstance( + self._version, + payload, + key=self._solution["key"], + ) + + def update(self, value: str) -> AccountConfigInstance: + """ + Update the AccountConfigInstance + + :param value: The config value; up to 4096 characters. + + :returns: The updated AccountConfigInstance + """ + + data = values.of( + { + "Value": value, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountConfigInstance(self._version, payload, key=self._solution["key"]) + + async def update_async(self, value: str) -> AccountConfigInstance: + """ + Asynchronous coroutine to update the AccountConfigInstance + + :param value: The config value; up to 4096 characters. + + :returns: The updated AccountConfigInstance + """ + + data = values.of( + { + "Value": value, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountConfigInstance(self._version, payload, key=self._solution["key"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AccountConfigPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AccountConfigInstance: + """ + Build an instance of AccountConfigInstance + + :param payload: Payload response from the API + """ + return AccountConfigInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AccountConfigList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AccountConfigList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Configs" + + def create(self, key: str, value: str) -> AccountConfigInstance: + """ + Create the AccountConfigInstance + + :param key: The config key; up to 100 characters. + :param value: The config value; up to 4096 characters. + + :returns: The created AccountConfigInstance + """ + + data = values.of( + { + "Key": key, + "Value": value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountConfigInstance(self._version, payload) + + async def create_async(self, key: str, value: str) -> AccountConfigInstance: + """ + Asynchronously create the AccountConfigInstance + + :param key: The config key; up to 100 characters. + :param value: The config value; up to 4096 characters. + + :returns: The created AccountConfigInstance + """ + + data = values.of( + { + "Key": key, + "Value": value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountConfigInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AccountConfigInstance]: + """ + Streams AccountConfigInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AccountConfigInstance]: + """ + Asynchronously streams AccountConfigInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AccountConfigInstance]: + """ + Lists AccountConfigInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AccountConfigInstance]: + """ + Asynchronously lists AccountConfigInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AccountConfigPage: + """ + Retrieve a single page of AccountConfigInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AccountConfigInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AccountConfigPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AccountConfigPage: + """ + Asynchronously retrieve a single page of AccountConfigInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AccountConfigInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AccountConfigPage(self._version, response) + + def get_page(self, target_url: str) -> AccountConfigPage: + """ + Retrieve a specific page of AccountConfigInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AccountConfigInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AccountConfigPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AccountConfigPage: + """ + Asynchronously retrieve a specific page of AccountConfigInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AccountConfigInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AccountConfigPage(self._version, response) + + def get(self, key: str) -> AccountConfigContext: + """ + Constructs a AccountConfigContext + + :param key: The config key; up to 100 characters. + """ + return AccountConfigContext(self._version, key=key) + + def __call__(self, key: str) -> AccountConfigContext: + """ + Constructs a AccountConfigContext + + :param key: The config key; up to 100 characters. + """ + return AccountConfigContext(self._version, key=key) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/account_secret.py b/venv/Lib/site-packages/twilio/rest/microvisor/v1/account_secret.py new file mode 100644 index 00000000..13ca961e --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/microvisor/v1/account_secret.py @@ -0,0 +1,583 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Microvisor + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AccountSecretInstance(InstanceResource): + """ + :ivar key: The secret key; up to 100 characters. + :ivar date_rotated: + :ivar url: The absolute URL of the Secret. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], key: Optional[str] = None + ): + super().__init__(version) + + self.key: Optional[str] = payload.get("key") + self.date_rotated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_rotated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "key": key or self.key, + } + self._context: Optional[AccountSecretContext] = None + + @property + def _proxy(self) -> "AccountSecretContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AccountSecretContext for this AccountSecretInstance + """ + if self._context is None: + self._context = AccountSecretContext( + self._version, + key=self._solution["key"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AccountSecretInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AccountSecretInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AccountSecretInstance": + """ + Fetch the AccountSecretInstance + + + :returns: The fetched AccountSecretInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AccountSecretInstance": + """ + Asynchronous coroutine to fetch the AccountSecretInstance + + + :returns: The fetched AccountSecretInstance + """ + return await self._proxy.fetch_async() + + def update(self, value: str) -> "AccountSecretInstance": + """ + Update the AccountSecretInstance + + :param value: The secret value; up to 4096 characters. + + :returns: The updated AccountSecretInstance + """ + return self._proxy.update( + value=value, + ) + + async def update_async(self, value: str) -> "AccountSecretInstance": + """ + Asynchronous coroutine to update the AccountSecretInstance + + :param value: The secret value; up to 4096 characters. + + :returns: The updated AccountSecretInstance + """ + return await self._proxy.update_async( + value=value, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AccountSecretContext(InstanceContext): + + def __init__(self, version: Version, key: str): + """ + Initialize the AccountSecretContext + + :param version: Version that contains the resource + :param key: The secret key; up to 100 characters. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "key": key, + } + self._uri = "/Secrets/{key}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the AccountSecretInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AccountSecretInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AccountSecretInstance: + """ + Fetch the AccountSecretInstance + + + :returns: The fetched AccountSecretInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AccountSecretInstance( + self._version, + payload, + key=self._solution["key"], + ) + + async def fetch_async(self) -> AccountSecretInstance: + """ + Asynchronous coroutine to fetch the AccountSecretInstance + + + :returns: The fetched AccountSecretInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AccountSecretInstance( + self._version, + payload, + key=self._solution["key"], + ) + + def update(self, value: str) -> AccountSecretInstance: + """ + Update the AccountSecretInstance + + :param value: The secret value; up to 4096 characters. + + :returns: The updated AccountSecretInstance + """ + + data = values.of( + { + "Value": value, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountSecretInstance(self._version, payload, key=self._solution["key"]) + + async def update_async(self, value: str) -> AccountSecretInstance: + """ + Asynchronous coroutine to update the AccountSecretInstance + + :param value: The secret value; up to 4096 characters. + + :returns: The updated AccountSecretInstance + """ + + data = values.of( + { + "Value": value, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountSecretInstance(self._version, payload, key=self._solution["key"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AccountSecretPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AccountSecretInstance: + """ + Build an instance of AccountSecretInstance + + :param payload: Payload response from the API + """ + return AccountSecretInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AccountSecretList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AccountSecretList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Secrets" + + def create(self, key: str, value: str) -> AccountSecretInstance: + """ + Create the AccountSecretInstance + + :param key: The secret key; up to 100 characters. + :param value: The secret value; up to 4096 characters. + + :returns: The created AccountSecretInstance + """ + + data = values.of( + { + "Key": key, + "Value": value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountSecretInstance(self._version, payload) + + async def create_async(self, key: str, value: str) -> AccountSecretInstance: + """ + Asynchronously create the AccountSecretInstance + + :param key: The secret key; up to 100 characters. + :param value: The secret value; up to 4096 characters. + + :returns: The created AccountSecretInstance + """ + + data = values.of( + { + "Key": key, + "Value": value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AccountSecretInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AccountSecretInstance]: + """ + Streams AccountSecretInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AccountSecretInstance]: + """ + Asynchronously streams AccountSecretInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AccountSecretInstance]: + """ + Lists AccountSecretInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AccountSecretInstance]: + """ + Asynchronously lists AccountSecretInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AccountSecretPage: + """ + Retrieve a single page of AccountSecretInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AccountSecretInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AccountSecretPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AccountSecretPage: + """ + Asynchronously retrieve a single page of AccountSecretInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AccountSecretInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AccountSecretPage(self._version, response) + + def get_page(self, target_url: str) -> AccountSecretPage: + """ + Retrieve a specific page of AccountSecretInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AccountSecretInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AccountSecretPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AccountSecretPage: + """ + Asynchronously retrieve a specific page of AccountSecretInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AccountSecretInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AccountSecretPage(self._version, response) + + def get(self, key: str) -> AccountSecretContext: + """ + Constructs a AccountSecretContext + + :param key: The secret key; up to 100 characters. + """ + return AccountSecretContext(self._version, key=key) + + def __call__(self, key: str) -> AccountSecretContext: + """ + Constructs a AccountSecretContext + + :param key: The secret key; up to 100 characters. + """ + return AccountSecretContext(self._version, key=key) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/app/__init__.py b/venv/Lib/site-packages/twilio/rest/microvisor/v1/app/__init__.py new file mode 100644 index 00000000..8cfbbe68 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/microvisor/v1/app/__init__.py @@ -0,0 +1,485 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Microvisor + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.microvisor.v1.app.app_manifest import AppManifestList + + +class AppInstance(InstanceResource): + """ + :ivar sid: A 34-character string that uniquely identifies this App. + :ivar account_sid: The unique SID identifier of the Account. + :ivar hash: App manifest hash represented as `hash_algorithm:hash_value`. + :ivar unique_name: A developer-defined string that uniquely identifies the App. This value must be unique for all Apps on this Account. The `unique_name` value may be used as an alternative to the `sid` in the URL path to address the resource. + :ivar date_created: The date that this App was created, given in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date that this App was last updated, given in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The URL of this resource. + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.hash: Optional[str] = payload.get("hash") + self.unique_name: Optional[str] = payload.get("unique_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[AppContext] = None + + @property + def _proxy(self) -> "AppContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AppContext for this AppInstance + """ + if self._context is None: + self._context = AppContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AppInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AppInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AppInstance": + """ + Fetch the AppInstance + + + :returns: The fetched AppInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AppInstance": + """ + Asynchronous coroutine to fetch the AppInstance + + + :returns: The fetched AppInstance + """ + return await self._proxy.fetch_async() + + @property + def app_manifests(self) -> AppManifestList: + """ + Access the app_manifests + """ + return self._proxy.app_manifests + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AppContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the AppContext + + :param version: Version that contains the resource + :param sid: A 34-character string that uniquely identifies this App. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Apps/{sid}".format(**self._solution) + + self._app_manifests: Optional[AppManifestList] = None + + def delete(self) -> bool: + """ + Deletes the AppInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AppInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AppInstance: + """ + Fetch the AppInstance + + + :returns: The fetched AppInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AppInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AppInstance: + """ + Asynchronous coroutine to fetch the AppInstance + + + :returns: The fetched AppInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AppInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + @property + def app_manifests(self) -> AppManifestList: + """ + Access the app_manifests + """ + if self._app_manifests is None: + self._app_manifests = AppManifestList( + self._version, + self._solution["sid"], + ) + return self._app_manifests + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AppPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AppInstance: + """ + Build an instance of AppInstance + + :param payload: Payload response from the API + """ + return AppInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AppList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AppList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Apps" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AppInstance]: + """ + Streams AppInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AppInstance]: + """ + Asynchronously streams AppInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AppInstance]: + """ + Lists AppInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AppInstance]: + """ + Asynchronously lists AppInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AppPage: + """ + Retrieve a single page of AppInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AppInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AppPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AppPage: + """ + Asynchronously retrieve a single page of AppInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AppInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AppPage(self._version, response) + + def get_page(self, target_url: str) -> AppPage: + """ + Retrieve a specific page of AppInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AppInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AppPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AppPage: + """ + Asynchronously retrieve a specific page of AppInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AppInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AppPage(self._version, response) + + def get(self, sid: str) -> AppContext: + """ + Constructs a AppContext + + :param sid: A 34-character string that uniquely identifies this App. + """ + return AppContext(self._version, sid=sid) + + def __call__(self, sid: str) -> AppContext: + """ + Constructs a AppContext + + :param sid: A 34-character string that uniquely identifies this App. + """ + return AppContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/app/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/microvisor/v1/app/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..682eabbec54d622ad0cfcecc0b7dc93afb73d591 GIT binary patch literal 20913 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/app/__pycache__/app_manifest.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/microvisor/v1/app/__pycache__/app_manifest.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14a3665a514eaab3a21f0a88fb0911ed36ec718b GIT binary patch literal 8188 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 P;&;E1`kaFomEXSrmr_@( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/app/app_manifest.py b/venv/Lib/site-packages/twilio/rest/microvisor/v1/app/app_manifest.py new file mode 100644 index 00000000..0412cadc --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/microvisor/v1/app/app_manifest.py @@ -0,0 +1,193 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Microvisor + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class AppManifestInstance(InstanceResource): + """ + :ivar app_sid: A 34-character string that uniquely identifies this App. + :ivar hash: App manifest hash represented as `hash_algorithm:hash_value`. + :ivar encoded_bytes: The base-64 encoded manifest + :ivar url: The absolute URL of this Manifest. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], app_sid: str): + super().__init__(version) + + self.app_sid: Optional[str] = payload.get("app_sid") + self.hash: Optional[str] = payload.get("hash") + self.encoded_bytes: Optional[str] = payload.get("encoded_bytes") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "app_sid": app_sid, + } + self._context: Optional[AppManifestContext] = None + + @property + def _proxy(self) -> "AppManifestContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AppManifestContext for this AppManifestInstance + """ + if self._context is None: + self._context = AppManifestContext( + self._version, + app_sid=self._solution["app_sid"], + ) + return self._context + + def fetch(self) -> "AppManifestInstance": + """ + Fetch the AppManifestInstance + + + :returns: The fetched AppManifestInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AppManifestInstance": + """ + Asynchronous coroutine to fetch the AppManifestInstance + + + :returns: The fetched AppManifestInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AppManifestContext(InstanceContext): + + def __init__(self, version: Version, app_sid: str): + """ + Initialize the AppManifestContext + + :param version: Version that contains the resource + :param app_sid: A 34-character string that uniquely identifies this App. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "app_sid": app_sid, + } + self._uri = "/Apps/{app_sid}/Manifest".format(**self._solution) + + def fetch(self) -> AppManifestInstance: + """ + Fetch the AppManifestInstance + + + :returns: The fetched AppManifestInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AppManifestInstance( + self._version, + payload, + app_sid=self._solution["app_sid"], + ) + + async def fetch_async(self) -> AppManifestInstance: + """ + Asynchronous coroutine to fetch the AppManifestInstance + + + :returns: The fetched AppManifestInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AppManifestInstance( + self._version, + payload, + app_sid=self._solution["app_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AppManifestList(ListResource): + + def __init__(self, version: Version, app_sid: str): + """ + Initialize the AppManifestList + + :param version: Version that contains the resource + :param app_sid: A 34-character string that uniquely identifies this App. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "app_sid": app_sid, + } + + def get(self) -> AppManifestContext: + """ + Constructs a AppManifestContext + + """ + return AppManifestContext(self._version, app_sid=self._solution["app_sid"]) + + def __call__(self) -> AppManifestContext: + """ + Constructs a AppManifestContext + + """ + return AppManifestContext(self._version, app_sid=self._solution["app_sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__init__.py b/venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__init__.py new file mode 100644 index 00000000..a3b30891 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__init__.py @@ -0,0 +1,588 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Microvisor + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.microvisor.v1.device.device_config import DeviceConfigList +from twilio.rest.microvisor.v1.device.device_secret import DeviceSecretList + + +class DeviceInstance(InstanceResource): + """ + :ivar sid: A 34-character string that uniquely identifies this Device. + :ivar unique_name: A developer-defined string that uniquely identifies the Device. This value must be unique for all Devices on this Account. The `unique_name` value may be used as an alternative to the `sid` in the URL path to address the resource. + :ivar account_sid: The unique SID identifier of the Account. + :ivar app: Information about the target App and the App reported by this Device. Contains the properties `target_sid`, `date_targeted`, `update_status` (one of `up-to-date`, `pending` and `error`), `update_error_code`, `reported_sid` and `date_reported`. + :ivar logging: Object specifying whether application logging is enabled for this Device. Contains the properties `enabled` and `date_expires`. + :ivar date_created: The date that this Device was created, given in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date that this Device was last updated, given in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The URL of this resource. + :ivar links: The absolute URLs of related resources. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.unique_name: Optional[str] = payload.get("unique_name") + self.account_sid: Optional[str] = payload.get("account_sid") + self.app: Optional[Dict[str, object]] = payload.get("app") + self.logging: Optional[Dict[str, object]] = payload.get("logging") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[DeviceContext] = None + + @property + def _proxy(self) -> "DeviceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DeviceContext for this DeviceInstance + """ + if self._context is None: + self._context = DeviceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "DeviceInstance": + """ + Fetch the DeviceInstance + + + :returns: The fetched DeviceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DeviceInstance": + """ + Asynchronous coroutine to fetch the DeviceInstance + + + :returns: The fetched DeviceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + unique_name: Union[str, object] = values.unset, + target_app: Union[str, object] = values.unset, + logging_enabled: Union[bool, object] = values.unset, + restart_app: Union[bool, object] = values.unset, + ) -> "DeviceInstance": + """ + Update the DeviceInstance + + :param unique_name: A unique and addressable name to be assigned to this Device by the developer. It may be used in place of the Device SID. + :param target_app: The SID or unique name of the App to be targeted to the Device. + :param logging_enabled: A Boolean flag specifying whether to enable application logging. Logs will be enabled or extended for 24 hours. + :param restart_app: Set to true to restart the App running on the Device. + + :returns: The updated DeviceInstance + """ + return self._proxy.update( + unique_name=unique_name, + target_app=target_app, + logging_enabled=logging_enabled, + restart_app=restart_app, + ) + + async def update_async( + self, + unique_name: Union[str, object] = values.unset, + target_app: Union[str, object] = values.unset, + logging_enabled: Union[bool, object] = values.unset, + restart_app: Union[bool, object] = values.unset, + ) -> "DeviceInstance": + """ + Asynchronous coroutine to update the DeviceInstance + + :param unique_name: A unique and addressable name to be assigned to this Device by the developer. It may be used in place of the Device SID. + :param target_app: The SID or unique name of the App to be targeted to the Device. + :param logging_enabled: A Boolean flag specifying whether to enable application logging. Logs will be enabled or extended for 24 hours. + :param restart_app: Set to true to restart the App running on the Device. + + :returns: The updated DeviceInstance + """ + return await self._proxy.update_async( + unique_name=unique_name, + target_app=target_app, + logging_enabled=logging_enabled, + restart_app=restart_app, + ) + + @property + def device_configs(self) -> DeviceConfigList: + """ + Access the device_configs + """ + return self._proxy.device_configs + + @property + def device_secrets(self) -> DeviceSecretList: + """ + Access the device_secrets + """ + return self._proxy.device_secrets + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DeviceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the DeviceContext + + :param version: Version that contains the resource + :param sid: A 34-character string that uniquely identifies this Device. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Devices/{sid}".format(**self._solution) + + self._device_configs: Optional[DeviceConfigList] = None + self._device_secrets: Optional[DeviceSecretList] = None + + def fetch(self) -> DeviceInstance: + """ + Fetch the DeviceInstance + + + :returns: The fetched DeviceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DeviceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> DeviceInstance: + """ + Asynchronous coroutine to fetch the DeviceInstance + + + :returns: The fetched DeviceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DeviceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + unique_name: Union[str, object] = values.unset, + target_app: Union[str, object] = values.unset, + logging_enabled: Union[bool, object] = values.unset, + restart_app: Union[bool, object] = values.unset, + ) -> DeviceInstance: + """ + Update the DeviceInstance + + :param unique_name: A unique and addressable name to be assigned to this Device by the developer. It may be used in place of the Device SID. + :param target_app: The SID or unique name of the App to be targeted to the Device. + :param logging_enabled: A Boolean flag specifying whether to enable application logging. Logs will be enabled or extended for 24 hours. + :param restart_app: Set to true to restart the App running on the Device. + + :returns: The updated DeviceInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "TargetApp": target_app, + "LoggingEnabled": serialize.boolean_to_string(logging_enabled), + "RestartApp": serialize.boolean_to_string(restart_app), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DeviceInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + unique_name: Union[str, object] = values.unset, + target_app: Union[str, object] = values.unset, + logging_enabled: Union[bool, object] = values.unset, + restart_app: Union[bool, object] = values.unset, + ) -> DeviceInstance: + """ + Asynchronous coroutine to update the DeviceInstance + + :param unique_name: A unique and addressable name to be assigned to this Device by the developer. It may be used in place of the Device SID. + :param target_app: The SID or unique name of the App to be targeted to the Device. + :param logging_enabled: A Boolean flag specifying whether to enable application logging. Logs will be enabled or extended for 24 hours. + :param restart_app: Set to true to restart the App running on the Device. + + :returns: The updated DeviceInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "TargetApp": target_app, + "LoggingEnabled": serialize.boolean_to_string(logging_enabled), + "RestartApp": serialize.boolean_to_string(restart_app), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DeviceInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def device_configs(self) -> DeviceConfigList: + """ + Access the device_configs + """ + if self._device_configs is None: + self._device_configs = DeviceConfigList( + self._version, + self._solution["sid"], + ) + return self._device_configs + + @property + def device_secrets(self) -> DeviceSecretList: + """ + Access the device_secrets + """ + if self._device_secrets is None: + self._device_secrets = DeviceSecretList( + self._version, + self._solution["sid"], + ) + return self._device_secrets + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DevicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> DeviceInstance: + """ + Build an instance of DeviceInstance + + :param payload: Payload response from the API + """ + return DeviceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DeviceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the DeviceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Devices" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DeviceInstance]: + """ + Streams DeviceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DeviceInstance]: + """ + Asynchronously streams DeviceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DeviceInstance]: + """ + Lists DeviceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DeviceInstance]: + """ + Asynchronously lists DeviceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DevicePage: + """ + Retrieve a single page of DeviceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DeviceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DevicePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DevicePage: + """ + Asynchronously retrieve a single page of DeviceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DeviceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DevicePage(self._version, response) + + def get_page(self, target_url: str) -> DevicePage: + """ + Retrieve a specific page of DeviceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DeviceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DevicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> DevicePage: + """ + Asynchronously retrieve a specific page of DeviceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DeviceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DevicePage(self._version, response) + + def get(self, sid: str) -> DeviceContext: + """ + Constructs a DeviceContext + + :param sid: A 34-character string that uniquely identifies this Device. + """ + return DeviceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> DeviceContext: + """ + Constructs a DeviceContext + + :param sid: A 34-character string that uniquely identifies this Device. + """ + return DeviceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c11032926d02f9ab15ecf0b6538150790290efe GIT binary patch literal 25389 zcmeHvd2k%pnP2zZGdKps4Gjvvs+#9QpHw-qgxG&Zi zZyIc3@v>NReC6OuQLqWm3v&5IL9S3%yk+O(9&BN$l}Pm~elxX|rB)$zh0+_hOfot|U<({J&BDgpV)N`DiSflscprq7gNDE}BlN zJe`&g|1+l*DK&B`7L7>9c+sQJ4jhwukMsq31O11OJ=>$Nb}XD`mBJ&LWWkb4hf_)d zb)@I{J|xv3>*aJNlS=n=b|#S>PDMNPZ9;ZNiJWFd4kV>SG9xK+G{XiHVV%UoiIH$D zHX8K(Hv*u5sCi^;ZzdX70&dOTn;6v`2cnUT<~S5hXEe{@R3@5CgkzfXcmfg4)0ZK5 zNUB;zZ+bKlF+Kx!txQ(ZiW&{aqGO8Y%|~75!m$x0jjsHCiF78Mh$zn_6B*?~21!*$ z(orRy98n_*(#ol8%eVV0ike2}$Z{MB4^xq<1IoE5YiB4rOvUqQ14=|yGL#nKD8j=s z{UfIV(7y#tSA;LAw_iA=?y(Y*(C$OK}g`nowMJC?3T{u_4!_FeJ*(ixq=j z#V6Ow?u(AM^acmZ{F^Rz7_iT$_l>9@l|c+ zRTO-=WMRlBS6*}u);#(+O1JRHqw`~QwOC!3Qa5Cit1K&A&r%zZy26s$h>|X(Rb$PY zCWQ;)VDo?wsMjhvY#4wQ{;or(Y(3F)VO2^;5}D{wR3T&rM)PJl{_&=G(NH2BSExx@Ij6*ck!pvm3`G;5nV;XT zVl>Ms0YeojK9bHzrxblC(oj;BfU|nZw3JNn0rf^A$&o}Rh^mTo(lVHnlHN{ulr@va zP(aJW2{eQ0Cc>HMIYk1gAtH4W3vyD5Qk#l&{OBPm70#Td%&;u03g{B0Bf_xLI{Ps1 zKExK3hQLQ44fGwzubnC-hgb{7U>R-V%NI_idZfMtrWePEFstyX~imE2nlL4gbwOK-lSSA%V#>o2QHCP`; z`bp~=#*)LsXt_r^eCmu6$w=vx5{V9t5-^@WtzhM`^Qjb=2wxz*IPn+I{ZldQD*?y- zErnh~p9LF}av>GP))owjWq^bd(@gpc!EQt*gR@z!&#(hXAeyoMqc6f6?O@ zQDb}s2rU>KW8q7oLM)m%o90Esr_#yT2o?-=fT}|%AETu->!tZjHTOBr)iif1JQ_=e zWz7yKjeuC056Pw^=jEQX3Bn(VSA~q3b;&Ui@W;#=Tn^oYW^?TjJK@+20@W{Ghj zq)UycSGugtXbok}kt|czZYgW_yG&V!rL4;s+%jdIma=Z6Y-WWKJ5z1M^6zC@av3cd zZ_J8m0#x&%T67yN8E>>`NEXYjsmD^b+!*sRBlcR#Rv2Yvaom1EOqXMag)`>r8M%TG z6)}oR<6B0lkl*+k6#~9~m1G#L%)%kGG7I(A?4U84TPH4Bxs?LwUpj(mcA$jjWZ)jC z(wylL5L(R>3PlsqOemz;L9|(C>PqyewouSY0m(xuEtFOTNty6IM7@yMsjj9xiGnp0 ztVN)CLkx?U#0kpErA4RaNGq`+wSkH?Qo!cr4TYF&8w#Zf3`v-O<*xip&xzxZLDMG= z_Vpb*aX?9*%_LJN&Ltr=_Ci|DoB+W(cj8d=)QNO7qjaRgk+Tpj(rb_2_S`p-|ok8U;2XGyO{hpS>d7aS7haOYW?vajM}%&zf6n z13%gF{VmhV+}a(Jj@La4o43BRWoFBb_}u0Lla3EPjY|`{o_Me9-Ljj{&UNi)HFoTJ z@8G)!-}lb#_%goBKkC{w-*qV4b!efy=8c1w4o+3hmAB>Wwyi#DuL=Ec-F>eDi!Nc^ z=E5;;d+NO{?{2v{Jh$yR^x#8@it5YTzx(vm`ZqUS+q7u6HKXmQ^yNJkDf?`T7dR_@+^3+K_ktM!YXt{HF+TlHla&pdjDKiq*3J}>R3eo6B$Lb3E2=e58 zRQf3duLz4(LV492doJynEt5WK2`p6AUah!Nu~6H1wf{>0^_|(;z#XT(wQ};n>n|*N zgsR#%CN53PdRo+W)GmM++Dis8-H0p)F=tG8K_UGyv@-0mc=z|rRd`OxL?F~+>k6mf zE49ER^9)f1Y)4UX+6j6BHg!9C)SRrGx(#v5f~hp>vD(7AL00rIl_Ua&#j2zgc=^)H z^L{Dom*)IyXFY3|E(J~UHT>m{A~*;(|1it(8Vp%4qowcJuG+upbP5B)6T<6`KeL|~ z1Gc+qbD5Y*e_Bl@2xcQm72-Jb7=lSQ_%Cn)`;8SWV=afmWK3AHjs#U>&860nSNIz8 z)5JCYD-l^NXnph5uV4B4d|i9Cu6?d9IPVY6dV;h5;N3KF-d9((iPyyqj_*6$M8=^s zpROMe1N7?*Fr*90S{X5cu$l=WH)2XSXoq+(ZA)$+f(O}-adF%>ZXb8NExx7GH^8aw zAKC%#<{lhpvTVtv=CB7^kb>eG*Yzz^{nXVj(wB7AjS(i&PH6|BPr}L+9VWe$5gC(a zz_iD@lMVefDD`EexJ7w{V4sSGBTP5SBN1tOT$rVS>4VBID3^yx8-$9Y4~`AS& z@o^a%86TH{qf44D+8IhqHJ&&zxFKMnLi3BkOrn~27XzqHR zyc6}&#jWM2&y0i1S3Lkfbr%J@5f~Wd;ADHKt^M8OhSw@5pZ#WOU+qDQt} zB)zG`&XuzH7*g;7!HB)3w>g3H%rmA{CErQjjs!?>+|4U9N9b@1hk;>fNR5Ii!Y~d? zCfFNvXl9fwB|*Osj+`dJak(mnAahrg3c#0^g5>Jla|jGJ@e=gA6PWmfIAN28Qj0?j z!chOdCtejr;q{dcVN@jfcE&d5e0gHe%M<-GqUPeZ#u>Y23wCMZSxr2bCUn7g)Gc`5 z_3oyVvRguYi-uMx*K?dFGq!TjlA@GDz`gXpS?Y*V8+JSyXMw4#WaD2J`J+S@WGZaPVkI3Q94a(3UIDmsHwlY>B=Sy@#cY_ z_5ZYge)o~=?jv)%kAB!ZFjqY=>0a*-@q91w{%cAycp3xN@@ zr}#=514(&B9@EK)h|QcXlr{ ztXgF6K*x0C#`fvcGy3=5=iX2MH2w+YEp`d6%3s;aovk@LVv8)+;&!gfRlA*?i}k{m zt?#tYv@ZlY-)Wg?S?JvP&iKsu0up!6?7m%A@ATcOYo6ME-8HoZ#22uS|_+o7xw>l;jiYS5ED?UO%-vTeoSETEdq5nsXHt+wt4! zmeyj?=5TJFmAZZ<;H|F-Vi?>#^4!iZi&N`973j^NkZn!`n`1s@dMx)>*sa2&Ud2ww zyh9FloNK>WKIp_DFC8K}afs;F<1WNKiuVkGO40M^sW>KeD`kp9Dc28iJq2H0d{vlv zzJf0rsZTD$F=^$akE3)8k370^jLxrAVI^@$Emv5MYpYpm4N@yDskJESK$;(GUdIk` z>%oAk7(wBNUQmA_LPXklOn&)?NGUoMu`fLpf%V+REaWEdv_X3)Wk;7CQR1;ge2Shw z5x+w=b~8stKOq_id)Sw0mmjqUoMV4$N>Y8WjB}p|i>jd;?<}m7YxKGuu1C^69#93R zZbaeD!%c8rb`ooLpzGc26!uY%wZR7^W+@!2?Bu*C-T5+F2J;jGZgm}|%P2DAMvM(< zj?jo2)%>ACkuIO0%RewZl2tLkrJT^xilWa~IIUfeud#aGvA#s6HJt>R^brIw^xUZ| zu%?6Nk!9Lyk*;f>tzAD~3$lp+d#2@g5;F-zV6XPx+VwP<#9J2V{hxH>BjaKPqKIkZ znMI#Cc{63QQZiUnu*g^9IQ+**AukO}rKB%{pfkk4ik@-tZHM8fHDSvbgl(CYVOtW; zke#dOk)4D?Z@Y|^fM9NQCz9?~!Lnr>E_a?u!@tKxl7A|r*`I&*7{nx39EZ?J98Jo+ zzonutA;5lD2{lbu16Kl5`~RS0(tWEXIO)FZ$$FY@Ro7qbxY99Sy&+q@Vfy$@$IrY! z_5R|C+3F2UZ22$#)&Lv9i=?B z=S&hS+;epdxrO^orN){{>@(M=vs8h4W+L?R8{XLRX2rFN`Npl;#;prAjZ^ZQ(QDBg z4U2Z6Xhm^#(TlQo)79wq)m~Tc4)Ftz*t^Z~fp;_Fr3_~U zR$#(c;!C*`0H4pJ5Tv4HOpZ~C`;43C>7P^1JWH3wKQ`kN&ie*Zmuwq%$#$YpvI8-v zPOD1LpED-KL1F!oU8SkaxO3bEu+n+tggaxNK`%qw+(@r7TFt*@52IGzJb(s#>R#kS z74jWt&RPA?D>Uyh<|72-s#Xa*F1gV>%Y9-r-%)P3N8a5vRuXriK` zkk5{Mx18~sM5g1|D6|X{{NZePc;Fapt>@6WdLDu1z@c?mWt5Bt$q~ZKXdp)jqQ2S+ zQa)gn4rP)d?g7RTWgk^3M3foNvPN36C6YZe`Z9x&-mvn62KpP}4M(d2{sI=yc}hSAmT+ZNNqo5rL-hYw_u? z-dz8);7^0UsLS>o{?LD9)^mhgLrlEDh-sRP{9XW7-4FTw{|&Ri3Oog@;NdaN%P`HC z$25}_l&Q~PAJhp7UZsGxB##>EMf&`w2&|l;7!lNOQ7OhF4p6KR^wmkErI$iA6*bQM z3Za^F3OLsb=|4vy&MAI#;BBy)ZP~_c#o*nveF?K!7RIeyW`Ftq9`Wau;{GQcKlg7& zyg=q8JYXD!mV7zu?JJue#ZSU8liin>giU=812J3&k`!l#6t<-#+byw#K99t)mO?Hs z7Z{MYWBYPM&Y7{dylTE|b+&BvY+2h!>$V&I0v1Uv=d`bfzrcs(5_1@s_pi(P*Ufs? z-NTIfJF|FSrWGO-gYuK2II}%1zjy~xW|_s)wWz1Dc&@b`hEAD|4Xx;FEJPhG^i)3<1huMC|E&(Ou>2z zm>x!*@Ow&q?mhPvIW#!+qw zx1|$|G2M2;MrV+<5Jr}BBbQN@s_kqn{Q++=tssGe(+V0AUzqPwj9TV>5~Jbj#$}38 zaGd5%3r9Haa&})oFkLepnQr`k|Du4;8$fQn7OPy&?NjUSAkO<|bqhe#i#F)V)dC!f z4fR7dW~8^lNbm3pxS>_YZ)Xuhh0z%Iv{=lkxD}=`4!L9(jL+VCmi3us-6&gj&$8ua zSr5uq+-F%Y%2q1=GZIa#@OhBbAv^ARt-yUQ7|hu`%kbqgzhGXsd^wfcArEebItS|> zq>s{NAEM_9^jt4jD%CQL#KDaD4VG`*@FLDMd(Nbci{&vja$)RH0d1M{^pGX%nZj@H9ckQk(d# z+Ewt$_A!abfY zM&gn&yhc^Ms)P}-t6~Y>T~Gq|9tvZEbY(4(*^3NSON79PfZhojnjGR_+DU*$a-;Kn~cXpvcHhGM*Z-~Zc4u!_6-{QPS zv!`%fF|4m_z5@1(!PKSzA6hsAuZUlkd~{C|$zDsN+f8Z!>|74G>pY z$CP#{8dQQ3ZW(N1HQJ@EU0q!P3$ZdU4Coge0PE~Hk@>rhMiod}Bg_Mr_Xx3x0MQ(o zdJPx{hX{J9QwX5NlF&qM(P25nDy20Ct(fNG6E<8N~Tkc;YZEOXX z?ig9)jf@acBh?wQ%O(K_Jgrw+=T~gbuGl=i^G0B9#qLShg1?3=n%BFhw`A9KPma#{ zpO|#qLL#mca0>xMl8rYSW;*BmJ+q!3E{YLNH69{Tui-EE?+_S{MkNW7wU%D{;Yc3r zcJ>0h-Gh=qMt!^DVwsD5fVvy#(Sv_7soA{zWri?lzcuW}$lBmBQQ%3qViwCES z>c0dv=(iF^^^cLF`4|gf*IBf3j(obuFmt&h!oyac>r_9)r=ee3Xdtig9ioI}z2e@& z%Mru6rmLYVq3Lrs&SpFJUk=UHJu~lr#zGItk#>6h4cCqH@A~Kb`({1+7M()X0r75{ zPUv3U+1o01LbohCN~%h9z*jaUI9OZx=!jv|q8kUJenZ7JuGul$o#(AQV~byubt(d)R|v znW#`CxX@%DQ;DU(Ea@88V=93kwz4W+1TgndxqjEFg!&`kU4KASe~7o?E@@H*x>wIs zRWj5PP%!yH^U#U7k7y_#BHv>5W5|J>DeXfB2p%KR!L}OOkCpD zh=SifF=dbcjxMaSN9h9vx>pN-DAR{(!jV6OC{;tY$@ZxE%P13Y10Q#qo=~*LMNcWi z6!V0lW3-|N1}mq<6Uz0uew!{sW`eBb34a4SW)j7txY-beg+&TO>rV{Bz(fm1cALUu z5mT_S9(v@ZrlZ_&!hSgDf)c^+)5uaZ9;ct=$>6uHELH>Vh|G3{?GT--3@gWIv*LwjsPUE&0U~M`YPeD7S`?Zl6nb9E8VJIb=BXh?x zrXgwR6!pLaC3?SSAhE7ms+}z;%r-s0N9Ynhn{S4S5Gk$IW3lb=7W!*GsK$(u1E9scOdWfOK5zm~Nc&Z=3aO<2Dv6 z=9prJ3xm5~Pp;opEMDSu^*~q+A*h*&Jl^mtR_rbkc>t`Bk^LV5+0{P-rYwuq>J8-f zFGXQG8Ofut`WN_Iik(!bfD;pTat8gs2uHt#eD1jRXlUBh`ey63*7>Hb*(Qr0G)L2B z@`P?CPv~WEbho`+rexrAIV?&Bn!jXZIhH+Stk2Ay=deghiU3ReZhV; z4y@7mQC9Fv`u#X!b;LCFGYq8a7I!wdhhSNZ1qGbkDDRS!aoiEoT>ST|G`HRjJ9MAX z&lmq1tEc`Yf&x8L^N>>m!KvX(z(hzR5kDF%q@O?~*yF1O{FD!44{h0+w)vW1wk9}V z)19s9zAQ^$PMj%?G8`KJBZrv2~l{Ke+ErsMN9$4fvTNiAP7Or1M=Ys9}1dsjH# zTZtHR%`8pfNUgEz9H2l}07fo7xSeIvs{vfd9-A;}5F7(x;~9z2!LBZ;>%M{(MCYRR z7k6=wZe+pMM1yBU0deM5K<7qQ_a=1%62>Ymh9zuDHzt_NJ2SOT9eeYoYcJiff9T&a z>)FAjJL?*l+~8r>N`0Tk_yGk!M_?Ts-5baCdR)dXphiaGUW`Hg_f&C-2P_gF!o7+h z?>^kC7=Rk?RrCup>K__|2-y1j1FMQ%t5#6F?7PTQ*f2MU<`R+M7IIjx?W-=jnd zPLnk9zY#D`O|NtHb@wL%UbxjRtzTHzcH7wXTT2#! zaK!F8t8_@EHCfBV$mV6{S5bbAHDCA7VxG`il{JTi9Io64^<*@Y3Fd$2Gk9)mP-gcP z^q2m-H_RVeyYEWeU7x#7GjCHylNt6h1Z3Wvrf20{&u;$v7<<($CIg%l(kTRsc2N{> z+sZ}9CoO`w>hFa^^TMI5aOm%a?yS)LvGC-_LeIy-wvUCjkA*cK3kUK4j_aUJ{IWP( wx8aV!Vs}nBqBgNlynOhMz#@0P=ByI8U#`6);B{xCY{y5-C-6-WxtHeu0heLgzW@LL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__pycache__/device_config.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/microvisor/v1/device/__pycache__/device_config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..133a2314827c982bb4d3bf26a663fb8cf2599f94 GIT binary patch literal 24986 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 "DeviceConfigContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DeviceConfigContext for this DeviceConfigInstance + """ + if self._context is None: + self._context = DeviceConfigContext( + self._version, + device_sid=self._solution["device_sid"], + key=self._solution["key"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the DeviceConfigInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the DeviceConfigInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "DeviceConfigInstance": + """ + Fetch the DeviceConfigInstance + + + :returns: The fetched DeviceConfigInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DeviceConfigInstance": + """ + Asynchronous coroutine to fetch the DeviceConfigInstance + + + :returns: The fetched DeviceConfigInstance + """ + return await self._proxy.fetch_async() + + def update(self, value: str) -> "DeviceConfigInstance": + """ + Update the DeviceConfigInstance + + :param value: The config value; up to 4096 characters. + + :returns: The updated DeviceConfigInstance + """ + return self._proxy.update( + value=value, + ) + + async def update_async(self, value: str) -> "DeviceConfigInstance": + """ + Asynchronous coroutine to update the DeviceConfigInstance + + :param value: The config value; up to 4096 characters. + + :returns: The updated DeviceConfigInstance + """ + return await self._proxy.update_async( + value=value, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DeviceConfigContext(InstanceContext): + + def __init__(self, version: Version, device_sid: str, key: str): + """ + Initialize the DeviceConfigContext + + :param version: Version that contains the resource + :param device_sid: A 34-character string that uniquely identifies the Device. + :param key: The config key; up to 100 characters. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "device_sid": device_sid, + "key": key, + } + self._uri = "/Devices/{device_sid}/Configs/{key}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the DeviceConfigInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the DeviceConfigInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> DeviceConfigInstance: + """ + Fetch the DeviceConfigInstance + + + :returns: The fetched DeviceConfigInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DeviceConfigInstance( + self._version, + payload, + device_sid=self._solution["device_sid"], + key=self._solution["key"], + ) + + async def fetch_async(self) -> DeviceConfigInstance: + """ + Asynchronous coroutine to fetch the DeviceConfigInstance + + + :returns: The fetched DeviceConfigInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DeviceConfigInstance( + self._version, + payload, + device_sid=self._solution["device_sid"], + key=self._solution["key"], + ) + + def update(self, value: str) -> DeviceConfigInstance: + """ + Update the DeviceConfigInstance + + :param value: The config value; up to 4096 characters. + + :returns: The updated DeviceConfigInstance + """ + + data = values.of( + { + "Value": value, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DeviceConfigInstance( + self._version, + payload, + device_sid=self._solution["device_sid"], + key=self._solution["key"], + ) + + async def update_async(self, value: str) -> DeviceConfigInstance: + """ + Asynchronous coroutine to update the DeviceConfigInstance + + :param value: The config value; up to 4096 characters. + + :returns: The updated DeviceConfigInstance + """ + + data = values.of( + { + "Value": value, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DeviceConfigInstance( + self._version, + payload, + device_sid=self._solution["device_sid"], + key=self._solution["key"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DeviceConfigPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> DeviceConfigInstance: + """ + Build an instance of DeviceConfigInstance + + :param payload: Payload response from the API + """ + return DeviceConfigInstance( + self._version, payload, device_sid=self._solution["device_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DeviceConfigList(ListResource): + + def __init__(self, version: Version, device_sid: str): + """ + Initialize the DeviceConfigList + + :param version: Version that contains the resource + :param device_sid: A 34-character string that uniquely identifies the Device. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "device_sid": device_sid, + } + self._uri = "/Devices/{device_sid}/Configs".format(**self._solution) + + def create(self, key: str, value: str) -> DeviceConfigInstance: + """ + Create the DeviceConfigInstance + + :param key: The config key; up to 100 characters. + :param value: The config value; up to 4096 characters. + + :returns: The created DeviceConfigInstance + """ + + data = values.of( + { + "Key": key, + "Value": value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DeviceConfigInstance( + self._version, payload, device_sid=self._solution["device_sid"] + ) + + async def create_async(self, key: str, value: str) -> DeviceConfigInstance: + """ + Asynchronously create the DeviceConfigInstance + + :param key: The config key; up to 100 characters. + :param value: The config value; up to 4096 characters. + + :returns: The created DeviceConfigInstance + """ + + data = values.of( + { + "Key": key, + "Value": value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DeviceConfigInstance( + self._version, payload, device_sid=self._solution["device_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DeviceConfigInstance]: + """ + Streams DeviceConfigInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DeviceConfigInstance]: + """ + Asynchronously streams DeviceConfigInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DeviceConfigInstance]: + """ + Lists DeviceConfigInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DeviceConfigInstance]: + """ + Asynchronously lists DeviceConfigInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DeviceConfigPage: + """ + Retrieve a single page of DeviceConfigInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DeviceConfigInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DeviceConfigPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DeviceConfigPage: + """ + Asynchronously retrieve a single page of DeviceConfigInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DeviceConfigInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DeviceConfigPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DeviceConfigPage: + """ + Retrieve a specific page of DeviceConfigInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DeviceConfigInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DeviceConfigPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DeviceConfigPage: + """ + Asynchronously retrieve a specific page of DeviceConfigInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DeviceConfigInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DeviceConfigPage(self._version, response, self._solution) + + def get(self, key: str) -> DeviceConfigContext: + """ + Constructs a DeviceConfigContext + + :param key: The config key; up to 100 characters. + """ + return DeviceConfigContext( + self._version, device_sid=self._solution["device_sid"], key=key + ) + + def __call__(self, key: str) -> DeviceConfigContext: + """ + Constructs a DeviceConfigContext + + :param key: The config key; up to 100 characters. + """ + return DeviceConfigContext( + self._version, device_sid=self._solution["device_sid"], key=key + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/microvisor/v1/device/device_secret.py b/venv/Lib/site-packages/twilio/rest/microvisor/v1/device/device_secret.py new file mode 100644 index 00000000..30b805ea --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/microvisor/v1/device/device_secret.py @@ -0,0 +1,620 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Microvisor + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class DeviceSecretInstance(InstanceResource): + """ + :ivar device_sid: A 34-character string that uniquely identifies the parent Device. + :ivar key: The secret key; up to 100 characters. + :ivar date_rotated: + :ivar url: The absolute URL of the Secret. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + device_sid: str, + key: Optional[str] = None, + ): + super().__init__(version) + + self.device_sid: Optional[str] = payload.get("device_sid") + self.key: Optional[str] = payload.get("key") + self.date_rotated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_rotated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "device_sid": device_sid, + "key": key or self.key, + } + self._context: Optional[DeviceSecretContext] = None + + @property + def _proxy(self) -> "DeviceSecretContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DeviceSecretContext for this DeviceSecretInstance + """ + if self._context is None: + self._context = DeviceSecretContext( + self._version, + device_sid=self._solution["device_sid"], + key=self._solution["key"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the DeviceSecretInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the DeviceSecretInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "DeviceSecretInstance": + """ + Fetch the DeviceSecretInstance + + + :returns: The fetched DeviceSecretInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DeviceSecretInstance": + """ + Asynchronous coroutine to fetch the DeviceSecretInstance + + + :returns: The fetched DeviceSecretInstance + """ + return await self._proxy.fetch_async() + + def update(self, value: str) -> "DeviceSecretInstance": + """ + Update the DeviceSecretInstance + + :param value: The secret value; up to 4096 characters. + + :returns: The updated DeviceSecretInstance + """ + return self._proxy.update( + value=value, + ) + + async def update_async(self, value: str) -> "DeviceSecretInstance": + """ + Asynchronous coroutine to update the DeviceSecretInstance + + :param value: The secret value; up to 4096 characters. + + :returns: The updated DeviceSecretInstance + """ + return await self._proxy.update_async( + value=value, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DeviceSecretContext(InstanceContext): + + def __init__(self, version: Version, device_sid: str, key: str): + """ + Initialize the DeviceSecretContext + + :param version: Version that contains the resource + :param device_sid: A 34-character string that uniquely identifies the Device. + :param key: The secret key; up to 100 characters. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "device_sid": device_sid, + "key": key, + } + self._uri = "/Devices/{device_sid}/Secrets/{key}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the DeviceSecretInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the DeviceSecretInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> DeviceSecretInstance: + """ + Fetch the DeviceSecretInstance + + + :returns: The fetched DeviceSecretInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DeviceSecretInstance( + self._version, + payload, + device_sid=self._solution["device_sid"], + key=self._solution["key"], + ) + + async def fetch_async(self) -> DeviceSecretInstance: + """ + Asynchronous coroutine to fetch the DeviceSecretInstance + + + :returns: The fetched DeviceSecretInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DeviceSecretInstance( + self._version, + payload, + device_sid=self._solution["device_sid"], + key=self._solution["key"], + ) + + def update(self, value: str) -> DeviceSecretInstance: + """ + Update the DeviceSecretInstance + + :param value: The secret value; up to 4096 characters. + + :returns: The updated DeviceSecretInstance + """ + + data = values.of( + { + "Value": value, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DeviceSecretInstance( + self._version, + payload, + device_sid=self._solution["device_sid"], + key=self._solution["key"], + ) + + async def update_async(self, value: str) -> DeviceSecretInstance: + """ + Asynchronous coroutine to update the DeviceSecretInstance + + :param value: The secret value; up to 4096 characters. + + :returns: The updated DeviceSecretInstance + """ + + data = values.of( + { + "Value": value, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DeviceSecretInstance( + self._version, + payload, + device_sid=self._solution["device_sid"], + key=self._solution["key"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DeviceSecretPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> DeviceSecretInstance: + """ + Build an instance of DeviceSecretInstance + + :param payload: Payload response from the API + """ + return DeviceSecretInstance( + self._version, payload, device_sid=self._solution["device_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DeviceSecretList(ListResource): + + def __init__(self, version: Version, device_sid: str): + """ + Initialize the DeviceSecretList + + :param version: Version that contains the resource + :param device_sid: A 34-character string that uniquely identifies the Device. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "device_sid": device_sid, + } + self._uri = "/Devices/{device_sid}/Secrets".format(**self._solution) + + def create(self, key: str, value: str) -> DeviceSecretInstance: + """ + Create the DeviceSecretInstance + + :param key: The secret key; up to 100 characters. + :param value: The secret value; up to 4096 characters. + + :returns: The created DeviceSecretInstance + """ + + data = values.of( + { + "Key": key, + "Value": value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DeviceSecretInstance( + self._version, payload, device_sid=self._solution["device_sid"] + ) + + async def create_async(self, key: str, value: str) -> DeviceSecretInstance: + """ + Asynchronously create the DeviceSecretInstance + + :param key: The secret key; up to 100 characters. + :param value: The secret value; up to 4096 characters. + + :returns: The created DeviceSecretInstance + """ + + data = values.of( + { + "Key": key, + "Value": value, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DeviceSecretInstance( + self._version, payload, device_sid=self._solution["device_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DeviceSecretInstance]: + """ + Streams DeviceSecretInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DeviceSecretInstance]: + """ + Asynchronously streams DeviceSecretInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DeviceSecretInstance]: + """ + Lists DeviceSecretInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DeviceSecretInstance]: + """ + Asynchronously lists DeviceSecretInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DeviceSecretPage: + """ + Retrieve a single page of DeviceSecretInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DeviceSecretInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DeviceSecretPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DeviceSecretPage: + """ + Asynchronously retrieve a single page of DeviceSecretInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DeviceSecretInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DeviceSecretPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DeviceSecretPage: + """ + Retrieve a specific page of DeviceSecretInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DeviceSecretInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DeviceSecretPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DeviceSecretPage: + """ + Asynchronously retrieve a specific page of DeviceSecretInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DeviceSecretInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DeviceSecretPage(self._version, response, self._solution) + + def get(self, key: str) -> DeviceSecretContext: + """ + Constructs a DeviceSecretContext + + :param key: The secret key; up to 100 characters. + """ + return DeviceSecretContext( + self._version, device_sid=self._solution["device_sid"], key=key + ) + + def __call__(self, key: str) -> DeviceSecretContext: + """ + Constructs a DeviceSecretContext + + :param key: The secret key; up to 100 characters. + """ + return DeviceSecretContext( + self._version, device_sid=self._solution["device_sid"], key=key + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/monitor/MonitorBase.py b/venv/Lib/site-packages/twilio/rest/monitor/MonitorBase.py new file mode 100644 index 00000000..4c5c6ebc --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/monitor/MonitorBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.monitor.v1 import V1 + + +class MonitorBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Monitor Domain + + :returns: Domain for Monitor + """ + super().__init__(twilio, "https://monitor.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Monitor + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/monitor/__init__.py b/venv/Lib/site-packages/twilio/rest/monitor/__init__.py new file mode 100644 index 00000000..a39a5b24 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/monitor/__init__.py @@ -0,0 +1,25 @@ +from warnings import warn + +from twilio.rest.monitor.MonitorBase import MonitorBase +from twilio.rest.monitor.v1.alert import AlertList +from twilio.rest.monitor.v1.event import EventList + + +class Monitor(MonitorBase): + @property + def alerts(self) -> AlertList: + warn( + "alerts is deprecated. Use v1.alerts instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.alerts + + @property + def events(self) -> EventList: + warn( + "events is deprecated. Use v1.events instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.events diff --git a/venv/Lib/site-packages/twilio/rest/monitor/__pycache__/MonitorBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/monitor/__pycache__/MonitorBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fed79f9c59d67f9d3947bb3f552c2076de31159 GIT binary patch literal 1987 zcmahK&u`mQ_}OtBC;b(+(RDCQZ)F|IVTpnenyOK;tuQKBJ3+UD74&fJm&VMo!?T+; zQ4T#+qLrvN38D7Naq5--g3CZ0CTlw(4%`A=#k3RO_w1w{6XMzV-uJ%Wzn=5c*jRzU z+WF+G{Q2kvjsU0|+-m^lw%6%@Zh&yzp15CykJ$fh* zki-Ba7KOBdK5@%AneaqE-f0`JidJK4RBBm-`W5>Yb{cbT@%%tI5GfaQ+5{hZ9qQ0a6`> zXX@$}sly;`j+z?JIvK9lRY%*@_EQUH4rm6@vYVQj-y-XZS@@ik^mycE;JZ;Eu2~_E z_2{1Kxq+=7^9vJ9(DlK)0KQjtNi<|`t39#<6WvoBWk1z{Sp_N^TIi^yO!qdnQmzGX z=31WH<+3)ZbEp}nkDW=@tl-g_@Wa`ZL+gQ{sqj#!`^KOb%_N6%5`NhZnv11OoDJ7n zT*L-rE_h`u&aieB=vv6Vy2wKsah@^R9>zkE!5R7pd|;+9(-F$zAqr;ZZ` zvAqtQ@GOAm8|2w2$&YX6em17|CLf)D|5sz~@%fo8ZO1qOK8f|DHa6V#;lki$lRg7v zm-NV2L)H^`Th<;(zGDoG9IQhGjqM%^j!`OmIlsRT|V^=}$=&V_;h7 z03Ir09JUahQc(mLtLRTdcyYNM{XkEYsbG!}}yammIj#_vR zhmuG6-L&k6>+}EB=oYUm%ZpP^)0uln#3_j4c)Bo#=#a604?seF8^v<~Wa`CfnO|uH zr`NZd9HzIxSTk_eJj6#C`x-tc2}j_cikz+3XbJc(iKrusE^w;iOc)6vaaCWaOC|L*tvKlW#C1Usl}7W zDCK5)*W1-3M;Y^JP)wZSXuUA5B$b*I7vP997b4QnD2no@npd>LNur$noy-o6rbtWc9#VKF=zs~hEo$Q!GjuNOi+wLk%J#0X`0l!9k9@kb*AiQi6I_1 z$ia|!!GD3^f8xb>B8{BX1Gm+c3n$-nTHqj8C+(Z}HSf*)y*HnGdn*Xm`>!uveUK3P z&V^#BIn#Xz%r^3nhXWL13uDepffUM?obhs?gsP=xyb@?($tqzap$EuQH;|_hc~=&( zEWKSa^aCy!I8|CMjbQJ297lc<)4MJsAeN^CLX$b4C0w}QBvB^RMF>Ijc&K{|x(u{`P1ad{ZMLCZ>EIoX%B6TaY{B14&9yXx{#7zq{`FQIm{ zaBs?n6qMPIW@n$-GlZ=qal>xLew|D&0p2!%-n8fZmp1bga;*XB+$F;7q~!;GJV6Od zCPLA)3CHoFdyZo^+O!|Sul41a=GQNSt~(CoE&8EX_o`Fhs$+Y@7Y|EHxzeei{-Leb zW@~GGbN!1x+66cC-+KT+MrZb*Fy=j=J#a%>1(HKg`?%s9kW>@CbN~c_G(FFa!$3|@ z5l(~LFvQ6PAoGTv>W&k+A#t3v;y7XKtp=R0I?n4=H^?n|gT@UQm^S6JnZZr@Y-K5S zL@be0=UPtq&u#$OKznL$N7B@>kLBM8wyun{zD&{SFSygDU)(plUKVKHD5pAqu`pXq zOx>Lbl)r^^LJbZ3Q}>5^e3D$EKRfq3FZ9M~iMw!rBQy#gYi hZ8i#|BV&yB(WRg0=03U(-ydxNkG)$tM6hMY{{m4FDJB2_ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/monitor/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/monitor/v1/__init__.py new file mode 100644 index 00000000..e892612b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/monitor/v1/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Monitor + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.monitor.v1.alert import AlertList +from twilio.rest.monitor.v1.event import EventList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Monitor + + :param domain: The Twilio.monitor domain + """ + super().__init__(domain, "v1") + self._alerts: Optional[AlertList] = None + self._events: Optional[EventList] = None + + @property + def alerts(self) -> AlertList: + if self._alerts is None: + self._alerts = AlertList(self) + return self._alerts + + @property + def events(self) -> EventList: + if self._events is None: + self._events = EventList(self) + return self._events + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/monitor/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/monitor/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96d896dab8134138b7295542d47b285b8e16f6b8 GIT binary patch literal 2329 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 vYd78(nC "AlertContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AlertContext for this AlertInstance + """ + if self._context is None: + self._context = AlertContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "AlertInstance": + """ + Fetch the AlertInstance + + + :returns: The fetched AlertInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AlertInstance": + """ + Asynchronous coroutine to fetch the AlertInstance + + + :returns: The fetched AlertInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AlertContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the AlertContext + + :param version: Version that contains the resource + :param sid: The SID of the Alert resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Alerts/{sid}".format(**self._solution) + + def fetch(self) -> AlertInstance: + """ + Fetch the AlertInstance + + + :returns: The fetched AlertInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AlertInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AlertInstance: + """ + Asynchronous coroutine to fetch the AlertInstance + + + :returns: The fetched AlertInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AlertInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AlertPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AlertInstance: + """ + Build an instance of AlertInstance + + :param payload: Payload response from the API + """ + return AlertInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AlertList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AlertList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Alerts" + + def stream( + self, + log_level: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AlertInstance]: + """ + Streams AlertInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str log_level: Only show alerts for this log-level. Can be: `error`, `warning`, `notice`, or `debug`. + :param datetime start_date: Only include alerts that occurred on or after this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param datetime end_date: Only include alerts that occurred on or before this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + log_level=log_level, + start_date=start_date, + end_date=end_date, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + log_level: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AlertInstance]: + """ + Asynchronously streams AlertInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str log_level: Only show alerts for this log-level. Can be: `error`, `warning`, `notice`, or `debug`. + :param datetime start_date: Only include alerts that occurred on or after this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param datetime end_date: Only include alerts that occurred on or before this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + log_level=log_level, + start_date=start_date, + end_date=end_date, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + log_level: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AlertInstance]: + """ + Lists AlertInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str log_level: Only show alerts for this log-level. Can be: `error`, `warning`, `notice`, or `debug`. + :param datetime start_date: Only include alerts that occurred on or after this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param datetime end_date: Only include alerts that occurred on or before this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + log_level=log_level, + start_date=start_date, + end_date=end_date, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + log_level: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AlertInstance]: + """ + Asynchronously lists AlertInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str log_level: Only show alerts for this log-level. Can be: `error`, `warning`, `notice`, or `debug`. + :param datetime start_date: Only include alerts that occurred on or after this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param datetime end_date: Only include alerts that occurred on or before this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + log_level=log_level, + start_date=start_date, + end_date=end_date, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + log_level: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AlertPage: + """ + Retrieve a single page of AlertInstance records from the API. + Request is executed immediately + + :param log_level: Only show alerts for this log-level. Can be: `error`, `warning`, `notice`, or `debug`. + :param start_date: Only include alerts that occurred on or after this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param end_date: Only include alerts that occurred on or before this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AlertInstance + """ + data = values.of( + { + "LogLevel": log_level, + "StartDate": serialize.iso8601_datetime(start_date), + "EndDate": serialize.iso8601_datetime(end_date), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AlertPage(self._version, response) + + async def page_async( + self, + log_level: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AlertPage: + """ + Asynchronously retrieve a single page of AlertInstance records from the API. + Request is executed immediately + + :param log_level: Only show alerts for this log-level. Can be: `error`, `warning`, `notice`, or `debug`. + :param start_date: Only include alerts that occurred on or after this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param end_date: Only include alerts that occurred on or before this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AlertInstance + """ + data = values.of( + { + "LogLevel": log_level, + "StartDate": serialize.iso8601_datetime(start_date), + "EndDate": serialize.iso8601_datetime(end_date), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AlertPage(self._version, response) + + def get_page(self, target_url: str) -> AlertPage: + """ + Retrieve a specific page of AlertInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AlertInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AlertPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AlertPage: + """ + Asynchronously retrieve a specific page of AlertInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AlertInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AlertPage(self._version, response) + + def get(self, sid: str) -> AlertContext: + """ + Constructs a AlertContext + + :param sid: The SID of the Alert resource to fetch. + """ + return AlertContext(self._version, sid=sid) + + def __call__(self, sid: str) -> AlertContext: + """ + Constructs a AlertContext + + :param sid: The SID of the Alert resource to fetch. + """ + return AlertContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/monitor/v1/event.py b/venv/Lib/site-packages/twilio/rest/monitor/v1/event.py new file mode 100644 index 00000000..61450c87 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/monitor/v1/event.py @@ -0,0 +1,541 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Monitor + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class EventInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Event resource. + :ivar actor_sid: The SID of the actor that caused the event, if available. This can be either a User ID (matching the pattern `^US[0-9a-fA-F]{32}$`) or an Account SID (matching the pattern `^AC[0-9a-fA-F]{32}$`). If the actor's SID isn't available, this field will be `null`. + :ivar actor_type: The type of actor that caused the event. Can be: `user` for a change made by a logged-in user in the Twilio Console, `account` for an event caused by an API request by an authenticating Account, `twilio-admin` for an event caused by a Twilio employee, and so on. + :ivar description: A description of the event. Can be `null`. + :ivar event_data: An object with additional data about the event. The contents depend on `event_type`. For example, event-types of the form `RESOURCE.updated`, this value contains a `resource_properties` dictionary that describes the previous and updated properties of the resource. + :ivar event_date: The date and time in GMT when the event was recorded specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar event_type: The event's type. Event-types are typically in the form: `RESOURCE_TYPE.ACTION`, where `RESOURCE_TYPE` is the type of resource that was affected and `ACTION` is what happened to it. For example, `phone-number.created`. For a full list of all event-types, see the [Monitor Event Types](https://www.twilio.com/docs/usage/monitor-events#event-types). + :ivar resource_sid: The SID of the resource that was affected. + :ivar resource_type: The type of resource that was affected. For a full list of all resource-types, see the [Monitor Event Types](https://www.twilio.com/docs/usage/monitor-events#event-types). + :ivar sid: The unique string that we created to identify the Event resource. + :ivar source: The originating system or interface that caused the event. Can be: `web` for events caused by user action in the Twilio Console, `api` for events caused by a request to our API, or `twilio` for events caused by an automated or internal Twilio system. + :ivar source_ip_address: The IP address of the source, if the source is outside the Twilio cloud. This value is `null` for events with `source` of `twilio` + :ivar url: The absolute URL of the resource that was affected. Can be `null`. + :ivar links: The absolute URLs of related resources. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.actor_sid: Optional[str] = payload.get("actor_sid") + self.actor_type: Optional[str] = payload.get("actor_type") + self.description: Optional[str] = payload.get("description") + self.event_data: Optional[Dict[str, object]] = payload.get("event_data") + self.event_date: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("event_date") + ) + self.event_type: Optional[str] = payload.get("event_type") + self.resource_sid: Optional[str] = payload.get("resource_sid") + self.resource_type: Optional[str] = payload.get("resource_type") + self.sid: Optional[str] = payload.get("sid") + self.source: Optional[str] = payload.get("source") + self.source_ip_address: Optional[str] = payload.get("source_ip_address") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[EventContext] = None + + @property + def _proxy(self) -> "EventContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: EventContext for this EventInstance + """ + if self._context is None: + self._context = EventContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "EventInstance": + """ + Fetch the EventInstance + + + :returns: The fetched EventInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "EventInstance": + """ + Asynchronous coroutine to fetch the EventInstance + + + :returns: The fetched EventInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EventContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the EventContext + + :param version: Version that contains the resource + :param sid: The SID of the Event resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Events/{sid}".format(**self._solution) + + def fetch(self) -> EventInstance: + """ + Fetch the EventInstance + + + :returns: The fetched EventInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return EventInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> EventInstance: + """ + Asynchronous coroutine to fetch the EventInstance + + + :returns: The fetched EventInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return EventInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EventPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> EventInstance: + """ + Build an instance of EventInstance + + :param payload: Payload response from the API + """ + return EventInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class EventList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the EventList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Events" + + def stream( + self, + actor_sid: Union[str, object] = values.unset, + event_type: Union[str, object] = values.unset, + resource_sid: Union[str, object] = values.unset, + source_ip_address: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[EventInstance]: + """ + Streams EventInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str actor_sid: Only include events initiated by this Actor. Useful for auditing actions taken by specific users or API credentials. + :param str event_type: Only include events of this [Event Type](https://www.twilio.com/docs/usage/monitor-events#event-types). + :param str resource_sid: Only include events that refer to this resource. Useful for discovering the history of a specific resource. + :param str source_ip_address: Only include events that originated from this IP address. Useful for tracking suspicious activity originating from the API or the Twilio Console. + :param datetime start_date: Only include events that occurred on or after this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param datetime end_date: Only include events that occurred on or before this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + actor_sid=actor_sid, + event_type=event_type, + resource_sid=resource_sid, + source_ip_address=source_ip_address, + start_date=start_date, + end_date=end_date, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + actor_sid: Union[str, object] = values.unset, + event_type: Union[str, object] = values.unset, + resource_sid: Union[str, object] = values.unset, + source_ip_address: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[EventInstance]: + """ + Asynchronously streams EventInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str actor_sid: Only include events initiated by this Actor. Useful for auditing actions taken by specific users or API credentials. + :param str event_type: Only include events of this [Event Type](https://www.twilio.com/docs/usage/monitor-events#event-types). + :param str resource_sid: Only include events that refer to this resource. Useful for discovering the history of a specific resource. + :param str source_ip_address: Only include events that originated from this IP address. Useful for tracking suspicious activity originating from the API or the Twilio Console. + :param datetime start_date: Only include events that occurred on or after this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param datetime end_date: Only include events that occurred on or before this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + actor_sid=actor_sid, + event_type=event_type, + resource_sid=resource_sid, + source_ip_address=source_ip_address, + start_date=start_date, + end_date=end_date, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + actor_sid: Union[str, object] = values.unset, + event_type: Union[str, object] = values.unset, + resource_sid: Union[str, object] = values.unset, + source_ip_address: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EventInstance]: + """ + Lists EventInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str actor_sid: Only include events initiated by this Actor. Useful for auditing actions taken by specific users or API credentials. + :param str event_type: Only include events of this [Event Type](https://www.twilio.com/docs/usage/monitor-events#event-types). + :param str resource_sid: Only include events that refer to this resource. Useful for discovering the history of a specific resource. + :param str source_ip_address: Only include events that originated from this IP address. Useful for tracking suspicious activity originating from the API or the Twilio Console. + :param datetime start_date: Only include events that occurred on or after this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param datetime end_date: Only include events that occurred on or before this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + actor_sid=actor_sid, + event_type=event_type, + resource_sid=resource_sid, + source_ip_address=source_ip_address, + start_date=start_date, + end_date=end_date, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + actor_sid: Union[str, object] = values.unset, + event_type: Union[str, object] = values.unset, + resource_sid: Union[str, object] = values.unset, + source_ip_address: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EventInstance]: + """ + Asynchronously lists EventInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str actor_sid: Only include events initiated by this Actor. Useful for auditing actions taken by specific users or API credentials. + :param str event_type: Only include events of this [Event Type](https://www.twilio.com/docs/usage/monitor-events#event-types). + :param str resource_sid: Only include events that refer to this resource. Useful for discovering the history of a specific resource. + :param str source_ip_address: Only include events that originated from this IP address. Useful for tracking suspicious activity originating from the API or the Twilio Console. + :param datetime start_date: Only include events that occurred on or after this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param datetime end_date: Only include events that occurred on or before this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + actor_sid=actor_sid, + event_type=event_type, + resource_sid=resource_sid, + source_ip_address=source_ip_address, + start_date=start_date, + end_date=end_date, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + actor_sid: Union[str, object] = values.unset, + event_type: Union[str, object] = values.unset, + resource_sid: Union[str, object] = values.unset, + source_ip_address: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EventPage: + """ + Retrieve a single page of EventInstance records from the API. + Request is executed immediately + + :param actor_sid: Only include events initiated by this Actor. Useful for auditing actions taken by specific users or API credentials. + :param event_type: Only include events of this [Event Type](https://www.twilio.com/docs/usage/monitor-events#event-types). + :param resource_sid: Only include events that refer to this resource. Useful for discovering the history of a specific resource. + :param source_ip_address: Only include events that originated from this IP address. Useful for tracking suspicious activity originating from the API or the Twilio Console. + :param start_date: Only include events that occurred on or after this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param end_date: Only include events that occurred on or before this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EventInstance + """ + data = values.of( + { + "ActorSid": actor_sid, + "EventType": event_type, + "ResourceSid": resource_sid, + "SourceIpAddress": source_ip_address, + "StartDate": serialize.iso8601_datetime(start_date), + "EndDate": serialize.iso8601_datetime(end_date), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EventPage(self._version, response) + + async def page_async( + self, + actor_sid: Union[str, object] = values.unset, + event_type: Union[str, object] = values.unset, + resource_sid: Union[str, object] = values.unset, + source_ip_address: Union[str, object] = values.unset, + start_date: Union[datetime, object] = values.unset, + end_date: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EventPage: + """ + Asynchronously retrieve a single page of EventInstance records from the API. + Request is executed immediately + + :param actor_sid: Only include events initiated by this Actor. Useful for auditing actions taken by specific users or API credentials. + :param event_type: Only include events of this [Event Type](https://www.twilio.com/docs/usage/monitor-events#event-types). + :param resource_sid: Only include events that refer to this resource. Useful for discovering the history of a specific resource. + :param source_ip_address: Only include events that originated from this IP address. Useful for tracking suspicious activity originating from the API or the Twilio Console. + :param start_date: Only include events that occurred on or after this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param end_date: Only include events that occurred on or before this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EventInstance + """ + data = values.of( + { + "ActorSid": actor_sid, + "EventType": event_type, + "ResourceSid": resource_sid, + "SourceIpAddress": source_ip_address, + "StartDate": serialize.iso8601_datetime(start_date), + "EndDate": serialize.iso8601_datetime(end_date), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EventPage(self._version, response) + + def get_page(self, target_url: str) -> EventPage: + """ + Retrieve a specific page of EventInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EventInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return EventPage(self._version, response) + + async def get_page_async(self, target_url: str) -> EventPage: + """ + Asynchronously retrieve a specific page of EventInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EventInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return EventPage(self._version, response) + + def get(self, sid: str) -> EventContext: + """ + Constructs a EventContext + + :param sid: The SID of the Event resource to fetch. + """ + return EventContext(self._version, sid=sid) + + def __call__(self, sid: str) -> EventContext: + """ + Constructs a EventContext + + :param sid: The SID of the Event resource to fetch. + """ + return EventContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/notify/NotifyBase.py b/venv/Lib/site-packages/twilio/rest/notify/NotifyBase.py new file mode 100644 index 00000000..2772ed09 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/notify/NotifyBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.notify.v1 import V1 + + +class NotifyBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Notify Domain + + :returns: Domain for Notify + """ + super().__init__(twilio, "https://notify.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Notify + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/notify/__init__.py b/venv/Lib/site-packages/twilio/rest/notify/__init__.py new file mode 100644 index 00000000..61f8fafb --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/notify/__init__.py @@ -0,0 +1,25 @@ +from warnings import warn + +from twilio.rest.notify.NotifyBase import NotifyBase +from twilio.rest.notify.v1.credential import CredentialList +from twilio.rest.notify.v1.service import ServiceList + + +class Notify(NotifyBase): + @property + def credentials(self) -> CredentialList: + warn( + "credentials is deprecated. Use v1.credentials instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.credentials + + @property + def services(self) -> ServiceList: + warn( + "services is deprecated. Use v1.services instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.services diff --git a/venv/Lib/site-packages/twilio/rest/notify/__pycache__/NotifyBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/notify/__pycache__/NotifyBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6954605404512d9e1e9b5de61fdcfe5f88ffec75 GIT binary patch literal 1975 zcmahKO>Y}TbauU7ubodCnkJ&ECXj-Bs4YtfRZ*yD8z>QwR5Vn`G8#6!<9O+M*UWC* z*zzHVNF)+bDvi z%|&`cRWKAKP;JCvFpCagBURVcEwTMRWNNeIr;$3-@x#2Qq^F9bXVh< zy1q^7Fi2a&RfA{U3^(h#Yit<@sfB6|Xco}2TShg%O*XV@;T9>HNnt6By?W=G9r47B z?|Qx$I{GQMFu(*oAH5CWdu@-z1Llt2BfBurJmdyPjm<-9C-6qi*zWfd>hwbbf}VertMI7RCR zb`}`Xc>vEg$jc>xk5NXh9yv($p-p|_f9S!0Xx+-72>r~sT*1#nXLNJlH`T|S8UrU=^}d`2T8j$L3e$g(<0Qt~?;(RS4pAvM_+?kFl4UuZVAd6JW0hDf0Usj~cVxu{PE?YKVj-pw8%f99;l9sU zQ4?c8l_9<-`ynhegkS<0?*MqVMGlQz_RanFF@f#y3^7L!bu&A4|Jq*!wxdj+a5$dL z&g{SOH-SwCFAXgf3rUVKH*_FsGw!s!U`^lzCTG%Hx{BArmDgTi-;$w}fj3B|mYh9B zDFy0|w<{_|8S**MQ$BI5o?G*(P*=n(9C6+vL=H2Wrv0hsHRE`aXy<6`bpznS-YZ~D2fFN!jSXaIY*6moB&ao1r4to~_AToQ24@#j3o!P7fWXw54VVU`o1 zM5d^ybpz~mM39MHWJ*MKF;NyIS6WlH(tJ~my&8DsE^nrx6x2vdE)Z#y@D&=Aan~V& z1#wR6A&7Ovk76$7z*w?e>Elt27`;YIN;}fom$Z)F*5*+`DXmVHk1A${#|)QLDJeUg zxJBbJBSvkacq}7eoH%ZAUmU*)^fB&~mwi$renFw)uF=p;3gLypQy|$379*)P5%qTA zz?TXm{sI#f8HZ1%Z(48|W!8h)*+=4QU-F6^E; zdyr9jvdt_S82(UySO1zH+sTh@>tiiQME|=lSAh;OcmHZiC!BVK_QEY`4n*1r+Akb= z5Ru-_rh{N6q|;L(d>X`RK4qw#H6)U{=$Sg1p3$BB=(avehatUG&?DWp1E)f4JIdO2 zC3IJOq33M-)r#Y%5xq*oDxthV#can7qGC4Vi)^A8E4i62yh4Z{n*_0jcGbS7q^TD- zp8ZC!wPd9A$ByPesu>%XMaYOlzaZC0AO%RN&=cw6*~3J#WL8I#0V;|CDkcL|Ovn&_ z2voeJ$T%VA*sF+3iB5uow3O4N$hfBS0NSbZP`{l}HAM{wi1)xoKs05H@g6$&6J6Uw TxAxHWKiVKR-kJvpw)peEr1C;% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/notify/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/notify/v1/__init__.py new file mode 100644 index 00000000..90cab950 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/notify/v1/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Notify + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.notify.v1.credential import CredentialList +from twilio.rest.notify.v1.service import ServiceList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Notify + + :param domain: The Twilio.notify domain + """ + super().__init__(domain, "v1") + self._credentials: Optional[CredentialList] = None + self._services: Optional[ServiceList] = None + + @property + def credentials(self) -> CredentialList: + if self._credentials is None: + self._credentials = CredentialList(self) + return self._credentials + + @property + def services(self) -> ServiceList: + if self._services is None: + self._services = ServiceList(self) + return self._services + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/notify/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/notify/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb1c64b7fce6b73d9de0f2d3e0333a0b7f313e2c GIT binary patch literal 2398 zcmcf?O>YxNbauVAH@1^di1<+BXeepHLaZAJdT>!xN)U=l10`vsuG~&HyJNCty}O;= zm^!jh4w33eMVzYS*dr)ErI*kmfmTGS)DyR~0TprTo0+w71yyey+i%|2%)D>^JUm=L zusFzCnG;te84@ zsm;ZN5d7-H8JtD<}LO4f|9PlSQb>K*h zkSfR0OC-D6zn65xVX2zx!R7KwuFTB^@=Ff*gZ19M81pyex2In($S~b@h)i8Dg-|_&@FH#l(0cdU}Xj(4EMlLeyP(OAp?}{76z$wmC)^csiNn2KsglRdU z{W{R!L$Ok1Dp0VhqtHx4?V<)0?t018Xx7QlTtjuVb!|Jn!ORP;4&3YjcL+2Kz{{;` zX0eODQ_Rvls^k-OaVp6kFhT>I+p+&KfFG4j6!(Q2Y6snccIqgOvYnoR<^V3~ z-yo=-AE>QXGOG;{PhKFizRSblu2K=w#VOp90mDI~R|I|KT4*t=iKU4=(=@FF1M&jp zl1lpeiQ1Z)t7u6!S_vsjbV6Ksj*z58?0yEKWQasE`cWm5Xc6@qjL#0>6Om#|GI6~{{Z{>oyHtm`8yTodED+4LvKNp^=UJ1O4dM;h)AH>hC@N zpw`tM>c<|xf3~aL8QBLll;jwVSD0_Z(CII3Isffn2e64c=$pRi6|#09<~m|^&~|zr zlGtPZ%ei@UUzw|@Y!vhuOj#h=Td+m^2FwltOo{`cUL67d2IzOV?nwY^=(pnNqvH63 z;`mN+@(DKX#lPaS-I<4_^5fA%k4Eu>QM{vLHU_%?r+e%OJO~aRfQ{uj5Lp>;Pw&-^ z$X$;(1*#GEPB?aVdSiO0c>GEE)V;A^%SLzRhdJ=-?(L1+J9_zbpWv8G8E?Ez)K)6$ zD(x5bH5Rm7_#d%wgSpgqyf$Vugu;UAv-sTUYu02rL^b@WWiPuv{m&Dt2hYpVYRLI( zEKW_|e}m72@FxjL>s1m4SR3&et)aaFIxs05s|@qD^Q|U@wkr_Q44f5@<0V4Ag}Esu zjQ=Bx4oLKn!3bt?ThtRf#swnqZv&QOqL{G>jt!^HX;aT5q@u8cz!i1(k*GU1#7}Z? zmc`1lR&(z~}*32FnRx)O{k~o#EM7?sAlw0ErTS=vMQ>jXO8rOKJ zN>#q|-$&nm2qR|jOm=la|NZa(zUQ9*ob#XapTGZ8S(%5!^_{;te(JQuasQnj^vkYA zGWQU<#)Y|lF3g85Q9j1^^E}0^QA^C)Z;jddZ83YlJ?7|l#GL)kn5*9vbN9Ph8C%p7 zE9ozZmG+m$%KFP#nmt+`^Y(jL+!3vaRrXi1xHDQ6tM0F6aaXh^R@-08;_m2@SY3Y| z&sn(rT-bAw3zvwMx2@{<`s-P0DN@TsuaVloQp=I*73+-Dr7X1qsg+{2k=i&?<*N?< zJzE*n8UK(>5BQHFYEB?PDeRE~>T>KDQq))=&_Xe-5jDBRXg4s%Dyv1ca%fy_ zk_yvs@%RP>)ZsC`T|uBe)c<<L zh+6FM-o7J3$Dtm-TDkY7BYWF5NJoRRETB?wIGM-+xA4-C7)KppzxoXllArZ_Dw!OT z+gn-^$PNxgnzc`a?4%ev#fo$%gm@w;h~Y?*4JO1oi3Q`s!Dw{E@A-Q|9v`o`!uYhw zNKEuO6>CR)M6q>8LP^DTFd`=v*GogmNFpALD)yssL=;y~l5im*DPL65{yPhMa7+sI?e>6!=j9?yghL_8H|U-u0%X3o=YOBLQgs@%86kqBqFVpx;8yK zUlAo4og>S3D0or~sc5f;UhN?>XyLeTW0s0sKaZJeVR+61&n=?Wz;m0Mb93P(VXJ5l z+eC-x6kP+B1~d`2i*C_Lu>r>=Zh#LvE|&Fs#FB7b*mco%TkE91H0%`11}tIsMO%Nl z7WW|T4cCWDaIe6<6!%K8YH+Pq$#nZ>QwJQN2Q_#{tM-oNIZxi4rwTlk86_)o@~U#4 zoMCRDJY0Rz-e3F8zEAPqp6FZF;4PQnJ3H~sYw=y{E^+7h{`x-7*Pv8&Nn%)xCxP)g z66athh$*`=^|)p6GR*f|!Jz0ik&viZPljTOH8>Pk ztOKD~ug{^l0)coiCI$kEClH7w!oyLDmj(iFVs2|W*8N>CVm=@0Rjm8EUYz7IG?oXi zceNioim53dJJ8c}TpH3!*j-5%MqYe;}vN$ zjE1#HqMU32Spl_cIkUMXWI(__G@_K4MlCHtca8XyD-m4e=E|!tS@qzuRa${mX%zy+ zc}AVxigPG95={ididBw;LpJ2;7x7`@b(vDk@qf-=+F~$X`HFnKY)}ptDvc^c}DQh*AHTs>Wtj$!`@ik+xo60)%vPl9by9TTD zSoS_ouMWK>{f@U{QV-R9tQMVmOZpuxmgwV{XA~||*;2i1m>;vACa)53Y62y6Jd(uJvYr%^tRrbXdXszWw#<2Z7f1D^s&;2I9~ zI3dogeEO2@UDw=(%^z%>+&C4R+0cE-_L-}GZqwEe4on`n`JS8lh+q3^al-w=( zbl=RLKGbl}t!=(_`sV2=-^|*bcrN`>>$9`12UD#F=Sr*JJ8=2Hc==4}x{TGb*+bPE z(EsM04=a#%aH}@tj0q`aRadrt_qp-a@2|hUK5exuMO*KdBfYKtlI=TXjB+RrNlXq) z@sLhq@xB~EicyJ+h+HFlqSUtM}zsvpT894g_y;=?bp2;=Ns$cTJZFKWb{8tEjnFcC~D-rv6&*)!rM=q-uQk z?bc=Gm%875G40|iYTmnW`NFiTiD6O>2GO@=7}SQyd>Axn;13FE*KO^NZ_Yo68PMn! zqheB2*8+tv;wc99Bhs)aLs^uZu9)$zns%)!1QNaeJNU~SMsR@R z9}7_LfE}MlOTTNmX8ldOo$KSaaqrsx)OwcpSsq+AUXCp>PDzP4VRtAYB|typB2YJ& z)FAX^f!nJ?w^W5zAV_PT0vLAz5~EKQeqq14RzC{KB=-Crk!ApU$us5KwM=_k9%P6+zP)@Me}i9RyJ=s?KLI2S8Zh1`CPSwfH7I<6;wTEjF+i0- zM~YM-GD4RQIy);{0JHrBv--mNepWn0z$!pXA>|cjyep?&D}NbidENlod}x_a;qnB4 zX&_<=1J68o_yWPS*mA;DDN2wnhK8F`wVP&Y{j*;Gw97y3^*@lhQIyF#N=ZnRAoE8; zkdl;=At`c(WT?~P2or!5CsYvhq&Q?T1P&51#8tH5!XIWjm!aksLR822G0T{B%r<5p zbNqn6tqF%9v6jF6woOx15uzPs!rQz+ry_K<4+W)QOvsT9+l3C$5jiA9pyoIu3UX2+ ze#+>}NMcyP%iu+cTdJi_5bY5Ktb&-X!Y}kB!J6X&(uaqrSliP==oI=1K}#YF(M0^D zs;@B(zy!*6;dLy~ghV_#@&+_PqHy%^!DcZ|inlO28A3l;k_CyWgY&blO||_(ABH<5 zh~T9o$x}3N&_@WsBqp%Jr^H|w9&#Nap&h~V6ob2i87#!L0{Pw4JY}~v3Z1>Bry>KAW-*f6rsJG+gz56;} z?l^n0|Fv^nqa81Fp6q?aPglpTU97Raz1;;J95*J9_8m+}^cY~!Y70QRp9c(w`#OX} zhkITD7=#0RU(-Rccj#q+pyNOnUbSO*WS}M5D?Ps>bb5Pttal`_bzuL=GhIEKqdVk{ zp;+f@TVL%N-55IB{buZ3BqAO@b}a5Uz)-A%0#IlxlN>O-dP*c#PdEh}fWSu5nz7nu z$?AFr8pU2nd|fIQ9#2AkIG(MA+NNRx#LVLZBuL~Gfv6Q8W};&OvT73>LxVcOgs8_! zIf3B;{>KU1Fj*uLE(gU>5>qS@6ZSrU&^7cIPrBYK8OP$)H+ zMCnB`Pt<3T%rhFSf}t1{2FF_@^SV&9NajiX_b@Uq(L&jf!b??Rq>15u$SNe+uOPMP zqR?FTcc|(f1nQ!2L(ZbGDD7V22klU3S@(aq_x+gh6!U=|-VGZd|HD!mjfddMA0sK}xw`a?+|;{H+Rq zTH(*gwEWRo`2+V(GS;3Ol6H^!3mKU|5Fo)n5b*DeCPEO^cKeO;AJMR%LcoyaZ+y?avLJ)hLgczdQ@JxoCH z@ih0gp%JMafgZ1+c!RW*(#hB)H6c(Oi4!D;GV_vDNy+rlVOB~?5`jh{wvF=c|j{eVf%@b7kN@hg;g?w!6~x+)I2P|An>I-ac2i zJk9RD=84eM)`?S-+Vk#xpU5A_zNEagpL3M|#8PTsma!t1rdYbkX(Wk2a^)nsDapfC)m=%Bzj9?P zRk=D{LP@2RB#-aAaz0hLDqTiNrSWr z1%7-LXfy5%Z`l_Q;fouWv0tGTGs(PPAN*sagP?qE`|OQv2>8;Lf-YwrotZY7RyDO=+$-|cygXfa-K@@<>Zy; zJkcAMhrO`JSA4VYQ@pn)`j!=V%SwD#8@_QRzH1fRbx;kqS;feoYAz&8VTf3Zei>Z; z98&VkW?nToz6CNsF(Yi)79q)iXlLH_FZkak1FexWV)fZa|EsZ@?t%GK z-4K+wZqp1wCdRHV+cdLKyYPy-DFD@=>L=b4gl&v9qATBwPBeuQ6koKRO4PPnHG{H~ zR1wZm>J7&uZw`ym5dk^axiJtau+A9DJyN2mqFPon!R%V2RV`V*Ew`LU#}|4f0g&<8 zr54;6Yhj#}u~5Yp7?vWihLMpg`{`5;L6C!JV7Bfq&9<(A2||Hti2gSy&BR4m5bl@f z76mXHi~d-ATkWxkVa9+$^)G_Ary(K?kvFs`+awz8L}FTftQ~T=QM^jd%V| z^Cjm!Z#CHsXT7UZ-c=LZ@6`OT;p2u+_fLCQ&3KPYyN)o3769`dG?f`gph}v*EPz7) zVx33-Vv{;CJn0MtXA$&jFqO_z3Il2v#R#Ypp+ycfDa&ke$c3i5KANLSByBUXH6N_C z4cFed`o?T+ORBbIuDbC?&8>!;4O9EmR&GgahO^L0$3m(qi<<&k=~SVqw>$U_4}aIn zcereKZFa7=6K#EJ35}D&8_|9o!%- z;_|MroozgD=q+JxI3jD01J4p@tal8SZz-XrW|GI}MEl^m65 zrkK7elWo~oC8<<3#9LJwMU#f@M#)*ZFll(Su8=x0>(c*39hp`Pg)^tgf5~~pm2x%Q zt6Flc`D*iQ)tXe*nu()#Y(I2=?EZAybk!Or`u`8_ia8kaU%dPxwv&(*zx-zm#$yIwY1 zzd2REd9J#CJp6v-dSt2&GrVC7W_Sb5@M_N`=Y8zWSow7bkanZ2P6HerPxE(Oe8(2s zUH1mWAFfr;u}ZozZbl*6flOaVAylPylH@CP6_b(1vRnILuMG3wGdA5_a6U5GcZDru zuCSHpPuPZ-U86)r_~oEMPqaZ%9Y=8*GUgm}{lIx!lhQ7@llmfrs9ce@$J|J-$hND; z!Y+o4?kqC;JklZLPCAs*eVQVs7dumxk}i|M*mFoV7$1Oz*x9FT!*g^DMJU11$4tf# zR+y>Tx#qKH&o+}Lr5QW&G>hniQpR24$>t;2(3iz~Yzlv=@5rQ0BC%H*L7>>M2`|Wa zziB48O%#v_tx`#=eK8mhBohJE@~iSYwzSWkA(Ng*FxyC1XaHH_>A@ppJMB`{0Mxd5 z+k?(9RY|h~$SD6lihzi2;wqNBH*$I8p3pq^)P}j`z8^KNo^5PPHMUKiooRe-Zt04- zrNS3w&a(21)m?#2a`$U;1(ub2L3YbiuBYy0=b}!4*QTo0!WJ~1e1GKn$VBqatC)?| z>o6OQiFjl6t>&A}Q+0R3Ka77I|MX~Tci(3wLC37$qq)RL@GBVpqmbZ#Sn~AT34iyZH4Sg$R;PCXr?;MWl33J52VGTK}y zAm}RLBKqq%P(%t*b788y?qSMljV_XIS`w+sDFiu7k3njq=vrA-JD(ziY(t?(R6B2< z^*)#KKKF@p#{2xV>v^`G^VQ_(mQ{6flm^sFL7aj;6m(I*Bx$bck%GUVjK4w-bj4{~nZ1+0;Y@RMp9p=)?&;+o`%#{>y>w64 zm)bp~?!_(LRAu)}*ZDFW?&2DF>2|D}|C1u#p?(*U!yJQXlY z%hLg~v^*s+OM@1;DO1U!#}=dprYgVuF@KA9+Iuv8aF3=BrmspvzL%) zg$~uO=};}u{la4ix

    5nIAG#9bqHcmtJZCn0𝓆JwPPsu&@}a9#b1V;5zGQF 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/notify/v1/credential.py b/venv/Lib/site-packages/twilio/rest/notify/v1/credential.py new file mode 100644 index 00000000..9ca59927 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/notify/v1/credential.py @@ -0,0 +1,711 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Notify + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CredentialInstance(InstanceResource): + + class PushService(object): + GCM = "gcm" + APN = "apn" + FCM = "fcm" + + """ + :ivar sid: The unique string that we created to identify the Credential resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Credential resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar type: + :ivar sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :ivar date_created: The date and time in GMT when the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar url: The absolute URL of the Credential resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["CredentialInstance.PushService"] = payload.get("type") + self.sandbox: Optional[str] = payload.get("sandbox") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[CredentialContext] = None + + @property + def _proxy(self) -> "CredentialContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CredentialContext for this CredentialInstance + """ + if self._context is None: + self._context = CredentialContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CredentialInstance": + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CredentialInstance": + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + :param private_key: [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + :param secret: [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> "CredentialInstance": + """ + Asynchronous coroutine to update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + :param private_key: [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + :param secret: [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + certificate=certificate, + private_key=private_key, + sandbox=sandbox, + api_key=api_key, + secret=secret, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the CredentialContext + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the Credential resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Credentials/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CredentialInstance: + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CredentialInstance: + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + :param private_key: [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + :param secret: [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronous coroutine to update the CredentialInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + :param private_key: [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + :param secret: [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CredentialInstance: + """ + Build an instance of CredentialInstance + + :param payload: Payload response from the API + """ + return CredentialInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CredentialList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CredentialList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Credentials" + + def create( + self, + type: "CredentialInstance.PushService", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Create the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + :param private_key: [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + :param secret: [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + async def create_async( + self, + type: "CredentialInstance.PushService", + friendly_name: Union[str, object] = values.unset, + certificate: Union[str, object] = values.unset, + private_key: Union[str, object] = values.unset, + sandbox: Union[bool, object] = values.unset, + api_key: Union[str, object] = values.unset, + secret: Union[str, object] = values.unset, + ) -> CredentialInstance: + """ + Asynchronously create the CredentialInstance + + :param type: + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param certificate: [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + :param private_key: [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + :param sandbox: [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + :param api_key: [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + :param secret: [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Type": type, + "FriendlyName": friendly_name, + "Certificate": certificate, + "PrivateKey": private_key, + "Sandbox": serialize.boolean_to_string(sandbox), + "ApiKey": api_key, + "Secret": secret, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CredentialInstance]: + """ + Streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CredentialInstance]: + """ + Asynchronously streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Asynchronously lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Asynchronously retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response) + + def get_page(self, target_url: str) -> CredentialPage: + """ + Retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CredentialPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CredentialPage: + """ + Asynchronously retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CredentialPage(self._version, response) + + def get(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: The Twilio-provided string that uniquely identifies the Credential resource to update. + """ + return CredentialContext(self._version, sid=sid) + + def __call__(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: The Twilio-provided string that uniquely identifies the Credential resource to update. + """ + return CredentialContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/notify/v1/service/__init__.py b/venv/Lib/site-packages/twilio/rest/notify/v1/service/__init__.py new file mode 100644 index 00000000..e097e69a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/notify/v1/service/__init__.py @@ -0,0 +1,948 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Notify + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.notify.v1.service.binding import BindingList +from twilio.rest.notify.v1.service.notification import NotificationList + + +class ServiceInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Service resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Service resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT when the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar apn_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + :ivar gcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + :ivar fcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + :ivar messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/sms/quickstart#messaging-services) to use for SMS Bindings. In order to send SMS notifications this parameter has to be set. + :ivar facebook_messenger_page_id: Deprecated. + :ivar default_apn_notification_protocol_version: The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :ivar default_gcm_notification_protocol_version: The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :ivar default_fcm_notification_protocol_version: The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :ivar log_enabled: Whether to log notifications. Can be: `true` or `false` and the default is `true`. + :ivar url: The absolute URL of the Service resource. + :ivar links: The URLs of the Binding, Notification, Segment, and User resources related to the service. + :ivar alexa_skill_id: Deprecated. + :ivar default_alexa_notification_protocol_version: Deprecated. + :ivar delivery_callback_url: URL to send delivery status callback. + :ivar delivery_callback_enabled: Callback configuration that enables delivery callbacks, default false + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.apn_credential_sid: Optional[str] = payload.get("apn_credential_sid") + self.gcm_credential_sid: Optional[str] = payload.get("gcm_credential_sid") + self.fcm_credential_sid: Optional[str] = payload.get("fcm_credential_sid") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.facebook_messenger_page_id: Optional[str] = payload.get( + "facebook_messenger_page_id" + ) + self.default_apn_notification_protocol_version: Optional[str] = payload.get( + "default_apn_notification_protocol_version" + ) + self.default_gcm_notification_protocol_version: Optional[str] = payload.get( + "default_gcm_notification_protocol_version" + ) + self.default_fcm_notification_protocol_version: Optional[str] = payload.get( + "default_fcm_notification_protocol_version" + ) + self.log_enabled: Optional[bool] = payload.get("log_enabled") + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + self.alexa_skill_id: Optional[str] = payload.get("alexa_skill_id") + self.default_alexa_notification_protocol_version: Optional[str] = payload.get( + "default_alexa_notification_protocol_version" + ) + self.delivery_callback_url: Optional[str] = payload.get("delivery_callback_url") + self.delivery_callback_enabled: Optional[bool] = payload.get( + "delivery_callback_enabled" + ) + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ServiceContext] = None + + @property + def _proxy(self) -> "ServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ServiceContext for this ServiceInstance + """ + if self._context is None: + self._context = ServiceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ServiceInstance": + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ServiceInstance": + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + apn_credential_sid: Union[str, object] = values.unset, + gcm_credential_sid: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + facebook_messenger_page_id: Union[str, object] = values.unset, + default_apn_notification_protocol_version: Union[str, object] = values.unset, + default_gcm_notification_protocol_version: Union[str, object] = values.unset, + fcm_credential_sid: Union[str, object] = values.unset, + default_fcm_notification_protocol_version: Union[str, object] = values.unset, + log_enabled: Union[bool, object] = values.unset, + alexa_skill_id: Union[str, object] = values.unset, + default_alexa_notification_protocol_version: Union[str, object] = values.unset, + delivery_callback_url: Union[str, object] = values.unset, + delivery_callback_enabled: Union[bool, object] = values.unset, + ) -> "ServiceInstance": + """ + Update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param apn_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + :param gcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/sms/quickstart#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + :param facebook_messenger_page_id: Deprecated. + :param default_apn_notification_protocol_version: The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param default_gcm_notification_protocol_version: The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param fcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + :param default_fcm_notification_protocol_version: The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param log_enabled: Whether to log notifications. Can be: `true` or `false` and the default is `true`. + :param alexa_skill_id: Deprecated. + :param default_alexa_notification_protocol_version: Deprecated. + :param delivery_callback_url: URL to send delivery status callback. + :param delivery_callback_enabled: Callback configuration that enables delivery callbacks, default false + + :returns: The updated ServiceInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + apn_credential_sid=apn_credential_sid, + gcm_credential_sid=gcm_credential_sid, + messaging_service_sid=messaging_service_sid, + facebook_messenger_page_id=facebook_messenger_page_id, + default_apn_notification_protocol_version=default_apn_notification_protocol_version, + default_gcm_notification_protocol_version=default_gcm_notification_protocol_version, + fcm_credential_sid=fcm_credential_sid, + default_fcm_notification_protocol_version=default_fcm_notification_protocol_version, + log_enabled=log_enabled, + alexa_skill_id=alexa_skill_id, + default_alexa_notification_protocol_version=default_alexa_notification_protocol_version, + delivery_callback_url=delivery_callback_url, + delivery_callback_enabled=delivery_callback_enabled, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + apn_credential_sid: Union[str, object] = values.unset, + gcm_credential_sid: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + facebook_messenger_page_id: Union[str, object] = values.unset, + default_apn_notification_protocol_version: Union[str, object] = values.unset, + default_gcm_notification_protocol_version: Union[str, object] = values.unset, + fcm_credential_sid: Union[str, object] = values.unset, + default_fcm_notification_protocol_version: Union[str, object] = values.unset, + log_enabled: Union[bool, object] = values.unset, + alexa_skill_id: Union[str, object] = values.unset, + default_alexa_notification_protocol_version: Union[str, object] = values.unset, + delivery_callback_url: Union[str, object] = values.unset, + delivery_callback_enabled: Union[bool, object] = values.unset, + ) -> "ServiceInstance": + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param apn_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + :param gcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/sms/quickstart#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + :param facebook_messenger_page_id: Deprecated. + :param default_apn_notification_protocol_version: The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param default_gcm_notification_protocol_version: The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param fcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + :param default_fcm_notification_protocol_version: The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param log_enabled: Whether to log notifications. Can be: `true` or `false` and the default is `true`. + :param alexa_skill_id: Deprecated. + :param default_alexa_notification_protocol_version: Deprecated. + :param delivery_callback_url: URL to send delivery status callback. + :param delivery_callback_enabled: Callback configuration that enables delivery callbacks, default false + + :returns: The updated ServiceInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + apn_credential_sid=apn_credential_sid, + gcm_credential_sid=gcm_credential_sid, + messaging_service_sid=messaging_service_sid, + facebook_messenger_page_id=facebook_messenger_page_id, + default_apn_notification_protocol_version=default_apn_notification_protocol_version, + default_gcm_notification_protocol_version=default_gcm_notification_protocol_version, + fcm_credential_sid=fcm_credential_sid, + default_fcm_notification_protocol_version=default_fcm_notification_protocol_version, + log_enabled=log_enabled, + alexa_skill_id=alexa_skill_id, + default_alexa_notification_protocol_version=default_alexa_notification_protocol_version, + delivery_callback_url=delivery_callback_url, + delivery_callback_enabled=delivery_callback_enabled, + ) + + @property + def bindings(self) -> BindingList: + """ + Access the bindings + """ + return self._proxy.bindings + + @property + def notifications(self) -> NotificationList: + """ + Access the notifications + """ + return self._proxy.notifications + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServiceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ServiceContext + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the Service resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Services/{sid}".format(**self._solution) + + self._bindings: Optional[BindingList] = None + self._notifications: Optional[NotificationList] = None + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ServiceInstance: + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ServiceInstance: + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + apn_credential_sid: Union[str, object] = values.unset, + gcm_credential_sid: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + facebook_messenger_page_id: Union[str, object] = values.unset, + default_apn_notification_protocol_version: Union[str, object] = values.unset, + default_gcm_notification_protocol_version: Union[str, object] = values.unset, + fcm_credential_sid: Union[str, object] = values.unset, + default_fcm_notification_protocol_version: Union[str, object] = values.unset, + log_enabled: Union[bool, object] = values.unset, + alexa_skill_id: Union[str, object] = values.unset, + default_alexa_notification_protocol_version: Union[str, object] = values.unset, + delivery_callback_url: Union[str, object] = values.unset, + delivery_callback_enabled: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param apn_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + :param gcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/sms/quickstart#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + :param facebook_messenger_page_id: Deprecated. + :param default_apn_notification_protocol_version: The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param default_gcm_notification_protocol_version: The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param fcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + :param default_fcm_notification_protocol_version: The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param log_enabled: Whether to log notifications. Can be: `true` or `false` and the default is `true`. + :param alexa_skill_id: Deprecated. + :param default_alexa_notification_protocol_version: Deprecated. + :param delivery_callback_url: URL to send delivery status callback. + :param delivery_callback_enabled: Callback configuration that enables delivery callbacks, default false + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ApnCredentialSid": apn_credential_sid, + "GcmCredentialSid": gcm_credential_sid, + "MessagingServiceSid": messaging_service_sid, + "FacebookMessengerPageId": facebook_messenger_page_id, + "DefaultApnNotificationProtocolVersion": default_apn_notification_protocol_version, + "DefaultGcmNotificationProtocolVersion": default_gcm_notification_protocol_version, + "FcmCredentialSid": fcm_credential_sid, + "DefaultFcmNotificationProtocolVersion": default_fcm_notification_protocol_version, + "LogEnabled": serialize.boolean_to_string(log_enabled), + "AlexaSkillId": alexa_skill_id, + "DefaultAlexaNotificationProtocolVersion": default_alexa_notification_protocol_version, + "DeliveryCallbackUrl": delivery_callback_url, + "DeliveryCallbackEnabled": serialize.boolean_to_string( + delivery_callback_enabled + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + apn_credential_sid: Union[str, object] = values.unset, + gcm_credential_sid: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + facebook_messenger_page_id: Union[str, object] = values.unset, + default_apn_notification_protocol_version: Union[str, object] = values.unset, + default_gcm_notification_protocol_version: Union[str, object] = values.unset, + fcm_credential_sid: Union[str, object] = values.unset, + default_fcm_notification_protocol_version: Union[str, object] = values.unset, + log_enabled: Union[bool, object] = values.unset, + alexa_skill_id: Union[str, object] = values.unset, + default_alexa_notification_protocol_version: Union[str, object] = values.unset, + delivery_callback_url: Union[str, object] = values.unset, + delivery_callback_enabled: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronous coroutine to update the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param apn_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + :param gcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/sms/quickstart#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + :param facebook_messenger_page_id: Deprecated. + :param default_apn_notification_protocol_version: The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param default_gcm_notification_protocol_version: The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param fcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + :param default_fcm_notification_protocol_version: The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param log_enabled: Whether to log notifications. Can be: `true` or `false` and the default is `true`. + :param alexa_skill_id: Deprecated. + :param default_alexa_notification_protocol_version: Deprecated. + :param delivery_callback_url: URL to send delivery status callback. + :param delivery_callback_enabled: Callback configuration that enables delivery callbacks, default false + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ApnCredentialSid": apn_credential_sid, + "GcmCredentialSid": gcm_credential_sid, + "MessagingServiceSid": messaging_service_sid, + "FacebookMessengerPageId": facebook_messenger_page_id, + "DefaultApnNotificationProtocolVersion": default_apn_notification_protocol_version, + "DefaultGcmNotificationProtocolVersion": default_gcm_notification_protocol_version, + "FcmCredentialSid": fcm_credential_sid, + "DefaultFcmNotificationProtocolVersion": default_fcm_notification_protocol_version, + "LogEnabled": serialize.boolean_to_string(log_enabled), + "AlexaSkillId": alexa_skill_id, + "DefaultAlexaNotificationProtocolVersion": default_alexa_notification_protocol_version, + "DeliveryCallbackUrl": delivery_callback_url, + "DeliveryCallbackEnabled": serialize.boolean_to_string( + delivery_callback_enabled + ), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def bindings(self) -> BindingList: + """ + Access the bindings + """ + if self._bindings is None: + self._bindings = BindingList( + self._version, + self._solution["sid"], + ) + return self._bindings + + @property + def notifications(self) -> NotificationList: + """ + Access the notifications + """ + if self._notifications is None: + self._notifications = NotificationList( + self._version, + self._solution["sid"], + ) + return self._notifications + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ServiceInstance: + """ + Build an instance of ServiceInstance + + :param payload: Payload response from the API + """ + return ServiceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services" + + def create( + self, + friendly_name: Union[str, object] = values.unset, + apn_credential_sid: Union[str, object] = values.unset, + gcm_credential_sid: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + facebook_messenger_page_id: Union[str, object] = values.unset, + default_apn_notification_protocol_version: Union[str, object] = values.unset, + default_gcm_notification_protocol_version: Union[str, object] = values.unset, + fcm_credential_sid: Union[str, object] = values.unset, + default_fcm_notification_protocol_version: Union[str, object] = values.unset, + log_enabled: Union[bool, object] = values.unset, + alexa_skill_id: Union[str, object] = values.unset, + default_alexa_notification_protocol_version: Union[str, object] = values.unset, + delivery_callback_url: Union[str, object] = values.unset, + delivery_callback_enabled: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Create the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param apn_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + :param gcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/sms/quickstart#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + :param facebook_messenger_page_id: Deprecated. + :param default_apn_notification_protocol_version: The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param default_gcm_notification_protocol_version: The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param fcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + :param default_fcm_notification_protocol_version: The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param log_enabled: Whether to log notifications. Can be: `true` or `false` and the default is `true`. + :param alexa_skill_id: Deprecated. + :param default_alexa_notification_protocol_version: Deprecated. + :param delivery_callback_url: URL to send delivery status callback. + :param delivery_callback_enabled: Callback configuration that enables delivery callbacks, default false + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ApnCredentialSid": apn_credential_sid, + "GcmCredentialSid": gcm_credential_sid, + "MessagingServiceSid": messaging_service_sid, + "FacebookMessengerPageId": facebook_messenger_page_id, + "DefaultApnNotificationProtocolVersion": default_apn_notification_protocol_version, + "DefaultGcmNotificationProtocolVersion": default_gcm_notification_protocol_version, + "FcmCredentialSid": fcm_credential_sid, + "DefaultFcmNotificationProtocolVersion": default_fcm_notification_protocol_version, + "LogEnabled": serialize.boolean_to_string(log_enabled), + "AlexaSkillId": alexa_skill_id, + "DefaultAlexaNotificationProtocolVersion": default_alexa_notification_protocol_version, + "DeliveryCallbackUrl": delivery_callback_url, + "DeliveryCallbackEnabled": serialize.boolean_to_string( + delivery_callback_enabled + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + async def create_async( + self, + friendly_name: Union[str, object] = values.unset, + apn_credential_sid: Union[str, object] = values.unset, + gcm_credential_sid: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + facebook_messenger_page_id: Union[str, object] = values.unset, + default_apn_notification_protocol_version: Union[str, object] = values.unset, + default_gcm_notification_protocol_version: Union[str, object] = values.unset, + fcm_credential_sid: Union[str, object] = values.unset, + default_fcm_notification_protocol_version: Union[str, object] = values.unset, + log_enabled: Union[bool, object] = values.unset, + alexa_skill_id: Union[str, object] = values.unset, + default_alexa_notification_protocol_version: Union[str, object] = values.unset, + delivery_callback_url: Union[str, object] = values.unset, + delivery_callback_enabled: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronously create the ServiceInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + :param apn_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + :param gcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/sms/quickstart#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + :param facebook_messenger_page_id: Deprecated. + :param default_apn_notification_protocol_version: The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param default_gcm_notification_protocol_version: The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param fcm_credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + :param default_fcm_notification_protocol_version: The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + :param log_enabled: Whether to log notifications. Can be: `true` or `false` and the default is `true`. + :param alexa_skill_id: Deprecated. + :param default_alexa_notification_protocol_version: Deprecated. + :param delivery_callback_url: URL to send delivery status callback. + :param delivery_callback_enabled: Callback configuration that enables delivery callbacks, default false + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ApnCredentialSid": apn_credential_sid, + "GcmCredentialSid": gcm_credential_sid, + "MessagingServiceSid": messaging_service_sid, + "FacebookMessengerPageId": facebook_messenger_page_id, + "DefaultApnNotificationProtocolVersion": default_apn_notification_protocol_version, + "DefaultGcmNotificationProtocolVersion": default_gcm_notification_protocol_version, + "FcmCredentialSid": fcm_credential_sid, + "DefaultFcmNotificationProtocolVersion": default_fcm_notification_protocol_version, + "LogEnabled": serialize.boolean_to_string(log_enabled), + "AlexaSkillId": alexa_skill_id, + "DefaultAlexaNotificationProtocolVersion": default_alexa_notification_protocol_version, + "DeliveryCallbackUrl": delivery_callback_url, + "DeliveryCallbackEnabled": serialize.boolean_to_string( + delivery_callback_enabled + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + def stream( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ServiceInstance]: + """ + Streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str friendly_name: The string that identifies the Service resources to read. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(friendly_name=friendly_name, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ServiceInstance]: + """ + Asynchronously streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str friendly_name: The string that identifies the Service resources to read. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + friendly_name=friendly_name, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str friendly_name: The string that identifies the Service resources to read. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Asynchronously lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str friendly_name: The string that identifies the Service resources to read. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param friendly_name: The string that identifies the Service resources to read. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + async def page_async( + self, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Asynchronously retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param friendly_name: The string that identifies the Service resources to read. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + def get_page(self, target_url: str) -> ServicePage: + """ + Retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ServicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ServicePage: + """ + Asynchronously retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ServicePage(self._version, response) + + def get(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The Twilio-provided string that uniquely identifies the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The Twilio-provided string that uniquely identifies the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/notify/v1/service/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/notify/v1/service/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eedd43e0120630325500ce0e738b2f62a465b75e GIT binary patch literal 44672 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 QSL|>gu;w=c{jwJQe+RQlm;e9( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/notify/v1/service/__pycache__/binding.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/notify/v1/service/__pycache__/binding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db753210124f09b24b468f9a965c374933c0bba2 GIT binary patch literal 33930 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 p+oSdYQQRk93EdW0u< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/notify/v1/service/__pycache__/notification.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/notify/v1/service/__pycache__/notification.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..975d3b94b6c4845285ea51830823f4ddca3c899c GIT binary patch literal 24286 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 g;`8 "BindingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: BindingContext for this BindingInstance + """ + if self._context is None: + self._context = BindingContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "BindingInstance": + """ + Fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "BindingInstance": + """ + Asynchronous coroutine to fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BindingContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the BindingContext + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/notify/api/service-resource) to fetch the resource from. + :param sid: The Twilio-provided string that uniquely identifies the Binding resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Bindings/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the BindingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> BindingInstance: + """ + Fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return BindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> BindingInstance: + """ + Asynchronous coroutine to fetch the BindingInstance + + + :returns: The fetched BindingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return BindingInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BindingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> BindingInstance: + """ + Build an instance of BindingInstance + + :param payload: Payload response from the API + """ + return BindingInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class BindingList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the BindingList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/notify/api/service-resource) to read the resource from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Bindings".format(**self._solution) + + def create( + self, + identity: str, + binding_type: "BindingInstance.BindingType", + address: str, + tag: Union[List[str], object] = values.unset, + notification_protocol_version: Union[str, object] = values.unset, + credential_sid: Union[str, object] = values.unset, + endpoint: Union[str, object] = values.unset, + ) -> BindingInstance: + """ + Create the BindingInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/notify/api/service-resource). Up to 20 Bindings can be created for the same Identity in a given Service. + :param binding_type: + :param address: The channel-specific address. For APNS, the device token. For FCM and GCM, the registration token. For SMS, a phone number in E.164 format. For Facebook Messenger, the Messenger ID of the user or a phone number in E.164 format. + :param tag: A tag that can be used to select the Bindings to notify. Repeat this parameter to specify more than one tag, up to a total of 20 tags. + :param notification_protocol_version: The protocol version to use to send the notification. This defaults to the value of `default_xxxx_notification_protocol_version` for the protocol in the [Service](https://www.twilio.com/docs/notify/api/service-resource). The current version is `\\\"3\\\"` for `apn`, `fcm`, and `gcm` type Bindings. The parameter is not applicable to `sms` and `facebook-messenger` type Bindings as the data format is fixed. + :param credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) resource to be used to send notifications to this Binding. If present, this overrides the Credential specified in the Service resource. Applies to only `apn`, `fcm`, and `gcm` type Bindings. + :param endpoint: Deprecated. + + :returns: The created BindingInstance + """ + + data = values.of( + { + "Identity": identity, + "BindingType": binding_type, + "Address": address, + "Tag": serialize.map(tag, lambda e: e), + "NotificationProtocolVersion": notification_protocol_version, + "CredentialSid": credential_sid, + "Endpoint": endpoint, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BindingInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + identity: str, + binding_type: "BindingInstance.BindingType", + address: str, + tag: Union[List[str], object] = values.unset, + notification_protocol_version: Union[str, object] = values.unset, + credential_sid: Union[str, object] = values.unset, + endpoint: Union[str, object] = values.unset, + ) -> BindingInstance: + """ + Asynchronously create the BindingInstance + + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/notify/api/service-resource). Up to 20 Bindings can be created for the same Identity in a given Service. + :param binding_type: + :param address: The channel-specific address. For APNS, the device token. For FCM and GCM, the registration token. For SMS, a phone number in E.164 format. For Facebook Messenger, the Messenger ID of the user or a phone number in E.164 format. + :param tag: A tag that can be used to select the Bindings to notify. Repeat this parameter to specify more than one tag, up to a total of 20 tags. + :param notification_protocol_version: The protocol version to use to send the notification. This defaults to the value of `default_xxxx_notification_protocol_version` for the protocol in the [Service](https://www.twilio.com/docs/notify/api/service-resource). The current version is `\\\"3\\\"` for `apn`, `fcm`, and `gcm` type Bindings. The parameter is not applicable to `sms` and `facebook-messenger` type Bindings as the data format is fixed. + :param credential_sid: The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) resource to be used to send notifications to this Binding. If present, this overrides the Credential specified in the Service resource. Applies to only `apn`, `fcm`, and `gcm` type Bindings. + :param endpoint: Deprecated. + + :returns: The created BindingInstance + """ + + data = values.of( + { + "Identity": identity, + "BindingType": binding_type, + "Address": address, + "Tag": serialize.map(tag, lambda e: e), + "NotificationProtocolVersion": notification_protocol_version, + "CredentialSid": credential_sid, + "Endpoint": endpoint, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BindingInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + identity: Union[List[str], object] = values.unset, + tag: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[BindingInstance]: + """ + Streams BindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. + :param List[str] tag: Only list Bindings that have all of the specified Tags. The following implicit tags are available: `all`, `apn`, `fcm`, `gcm`, `sms`, `facebook-messenger`. Up to 5 tags are allowed. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + start_date=start_date, + end_date=end_date, + identity=identity, + tag=tag, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + identity: Union[List[str], object] = values.unset, + tag: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[BindingInstance]: + """ + Asynchronously streams BindingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. + :param List[str] tag: Only list Bindings that have all of the specified Tags. The following implicit tags are available: `all`, `apn`, `fcm`, `gcm`, `sms`, `facebook-messenger`. Up to 5 tags are allowed. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + start_date=start_date, + end_date=end_date, + identity=identity, + tag=tag, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + identity: Union[List[str], object] = values.unset, + tag: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BindingInstance]: + """ + Lists BindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. + :param List[str] tag: Only list Bindings that have all of the specified Tags. The following implicit tags are available: `all`, `apn`, `fcm`, `gcm`, `sms`, `facebook-messenger`. Up to 5 tags are allowed. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + start_date=start_date, + end_date=end_date, + identity=identity, + tag=tag, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + identity: Union[List[str], object] = values.unset, + tag: Union[List[str], object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BindingInstance]: + """ + Asynchronously lists BindingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param date start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param date end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param List[str] identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. + :param List[str] tag: Only list Bindings that have all of the specified Tags. The following implicit tags are available: `all`, `apn`, `fcm`, `gcm`, `sms`, `facebook-messenger`. Up to 5 tags are allowed. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + start_date=start_date, + end_date=end_date, + identity=identity, + tag=tag, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + identity: Union[List[str], object] = values.unset, + tag: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BindingPage: + """ + Retrieve a single page of BindingInstance records from the API. + Request is executed immediately + + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. + :param tag: Only list Bindings that have all of the specified Tags. The following implicit tags are available: `all`, `apn`, `fcm`, `gcm`, `sms`, `facebook-messenger`. Up to 5 tags are allowed. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BindingInstance + """ + data = values.of( + { + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "Identity": serialize.map(identity, lambda e: e), + "Tag": serialize.map(tag, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BindingPage(self._version, response, self._solution) + + async def page_async( + self, + start_date: Union[date, object] = values.unset, + end_date: Union[date, object] = values.unset, + identity: Union[List[str], object] = values.unset, + tag: Union[List[str], object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BindingPage: + """ + Asynchronously retrieve a single page of BindingInstance records from the API. + Request is executed immediately + + :param start_date: Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param end_date: Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. + :param identity: The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. + :param tag: Only list Bindings that have all of the specified Tags. The following implicit tags are available: `all`, `apn`, `fcm`, `gcm`, `sms`, `facebook-messenger`. Up to 5 tags are allowed. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BindingInstance + """ + data = values.of( + { + "StartDate": serialize.iso8601_date(start_date), + "EndDate": serialize.iso8601_date(end_date), + "Identity": serialize.map(identity, lambda e: e), + "Tag": serialize.map(tag, lambda e: e), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BindingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> BindingPage: + """ + Retrieve a specific page of BindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BindingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return BindingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> BindingPage: + """ + Asynchronously retrieve a specific page of BindingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BindingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return BindingPage(self._version, response, self._solution) + + def get(self, sid: str) -> BindingContext: + """ + Constructs a BindingContext + + :param sid: The Twilio-provided string that uniquely identifies the Binding resource to fetch. + """ + return BindingContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> BindingContext: + """ + Constructs a BindingContext + + :param sid: The Twilio-provided string that uniquely identifies the Binding resource to fetch. + """ + return BindingContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/notify/v1/service/notification.py b/venv/Lib/site-packages/twilio/rest/notify/v1/service/notification.py new file mode 100644 index 00000000..4d228e86 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/notify/v1/service/notification.py @@ -0,0 +1,285 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Notify + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class NotificationInstance(InstanceResource): + + class Priority(object): + HIGH = "high" + LOW = "low" + + """ + :ivar sid: The unique string that we created to identify the Notification resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Notification resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/notify/api/service-resource) the resource is associated with. + :ivar date_created: The date and time in GMT when the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar identities: The list of `identity` values of the Users to notify. We will attempt to deliver notifications only to Bindings with an identity in this list. + :ivar tags: The tags that select the Bindings to notify. Notifications will be attempted only to Bindings that have all of the tags listed in this property. + :ivar segments: The list of Segments to notify. The [Segment](https://www.twilio.com/docs/notify/api/segment-resource) resource is deprecated. Use the `tags` property, instead. + :ivar priority: + :ivar ttl: How long, in seconds, the notification is valid. Can be an integer between 0 and 2,419,200, which is 4 weeks, the default and the maximum supported time to live (TTL). Delivery should be attempted if the device is offline until the TTL elapses. Zero means that the notification delivery is attempted immediately, only once, and is not stored for future delivery. SMS does not support this property. + :ivar title: The notification title. For FCM and GCM, this translates to the `data.twi_title` value. For APNS, this translates to the `aps.alert.title` value. SMS does not support this property. This field is not visible on iOS phones and tablets but appears on Apple Watch and Android devices. + :ivar body: The notification text. For FCM and GCM, translates to `data.twi_body`. For APNS, translates to `aps.alert.body`. For SMS, translates to `body`. SMS requires either this `body` value, or `media_urls` attribute defined in the `sms` parameter of the notification. + :ivar sound: The name of the sound to be played for the notification. For FCM and GCM, this Translates to `data.twi_sound`. For APNS, this translates to `aps.sound`. SMS does not support this property. + :ivar action: The actions to display for the notification. For APNS, translates to the `aps.category` value. For GCM, translates to the `data.twi_action` value. For SMS, this parameter is not supported and is omitted from deliveries to those channels. + :ivar data: The custom key-value pairs of the notification's payload. For FCM and GCM, this value translates to `data` in the FCM and GCM payloads. FCM and GCM [reserve certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref) that cannot be used in those channels. For APNS, attributes of `data` are inserted into the APNS payload as custom properties outside of the `aps` dictionary. In all channels, we reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed and are rejected as 400 Bad request with no delivery attempted. For SMS, this parameter is not supported and is omitted from deliveries to those channels. + :ivar apn: The APNS-specific payload that overrides corresponding attributes in the generic payload for APNS Bindings. This property maps to the APNS `Payload` item, therefore the `aps` key must be used to change standard attributes. Adds custom key-value pairs to the root of the dictionary. See the [APNS documentation](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html) for more details. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. + :ivar gcm: The GCM-specific payload that overrides corresponding attributes in the generic payload for GCM Bindings. This property maps to the root JSON dictionary. Target parameters `to`, `registration_ids`, and `notification_key` are not allowed. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. + :ivar fcm: The FCM-specific payload that overrides corresponding attributes in the generic payload for FCM Bindings. This property maps to the root JSON dictionary. See the [FCM documentation](https://firebase.google.com/docs/cloud-messaging/http-server-ref#downstream) for more details. Target parameters `to`, `registration_ids`, `condition`, and `notification_key` are not allowed in this parameter. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. FCM also [reserves certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref), which cannot be used in that channel. + :ivar sms: The SMS-specific payload that overrides corresponding attributes in the generic payload for SMS Bindings. Each attribute in this value maps to the corresponding `form` parameter of the Twilio [Message](https://www.twilio.com/docs/sms/api/message-resource) resource. These parameters of the Message resource are supported in snake case format: `body`, `media_urls`, `status_callback`, and `max_price`. The `status_callback` parameter overrides the corresponding parameter in the messaging service, if configured. The `media_urls` property expects a JSON array. + :ivar facebook_messenger: Deprecated. + :ivar alexa: Deprecated. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], service_sid: str): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.identities: Optional[List[str]] = payload.get("identities") + self.tags: Optional[List[str]] = payload.get("tags") + self.segments: Optional[List[str]] = payload.get("segments") + self.priority: Optional["NotificationInstance.Priority"] = payload.get( + "priority" + ) + self.ttl: Optional[int] = deserialize.integer(payload.get("ttl")) + self.title: Optional[str] = payload.get("title") + self.body: Optional[str] = payload.get("body") + self.sound: Optional[str] = payload.get("sound") + self.action: Optional[str] = payload.get("action") + self.data: Optional[Dict[str, object]] = payload.get("data") + self.apn: Optional[Dict[str, object]] = payload.get("apn") + self.gcm: Optional[Dict[str, object]] = payload.get("gcm") + self.fcm: Optional[Dict[str, object]] = payload.get("fcm") + self.sms: Optional[Dict[str, object]] = payload.get("sms") + self.facebook_messenger: Optional[Dict[str, object]] = payload.get( + "facebook_messenger" + ) + self.alexa: Optional[Dict[str, object]] = payload.get("alexa") + + self._solution = { + "service_sid": service_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NotificationList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the NotificationList + + :param version: Version that contains the resource + :param service_sid: The SID of the [Service](https://www.twilio.com/docs/notify/api/service-resource) to create the resource under. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Notifications".format(**self._solution) + + def create( + self, + body: Union[str, object] = values.unset, + priority: Union["NotificationInstance.Priority", object] = values.unset, + ttl: Union[int, object] = values.unset, + title: Union[str, object] = values.unset, + sound: Union[str, object] = values.unset, + action: Union[str, object] = values.unset, + data: Union[object, object] = values.unset, + apn: Union[object, object] = values.unset, + gcm: Union[object, object] = values.unset, + sms: Union[object, object] = values.unset, + facebook_messenger: Union[object, object] = values.unset, + fcm: Union[object, object] = values.unset, + segment: Union[List[str], object] = values.unset, + alexa: Union[object, object] = values.unset, + to_binding: Union[List[str], object] = values.unset, + delivery_callback_url: Union[str, object] = values.unset, + identity: Union[List[str], object] = values.unset, + tag: Union[List[str], object] = values.unset, + ) -> NotificationInstance: + """ + Create the NotificationInstance + + :param body: The notification text. For FCM and GCM, translates to `data.twi_body`. For APNS, translates to `aps.alert.body`. For SMS, translates to `body`. SMS requires either this `body` value, or `media_urls` attribute defined in the `sms` parameter of the notification. + :param priority: + :param ttl: How long, in seconds, the notification is valid. Can be an integer between 0 and 2,419,200, which is 4 weeks, the default and the maximum supported time to live (TTL). Delivery should be attempted if the device is offline until the TTL elapses. Zero means that the notification delivery is attempted immediately, only once, and is not stored for future delivery. SMS does not support this property. + :param title: The notification title. For FCM and GCM, this translates to the `data.twi_title` value. For APNS, this translates to the `aps.alert.title` value. SMS does not support this property. This field is not visible on iOS phones and tablets but appears on Apple Watch and Android devices. + :param sound: The name of the sound to be played for the notification. For FCM and GCM, this Translates to `data.twi_sound`. For APNS, this translates to `aps.sound`. SMS does not support this property. + :param action: The actions to display for the notification. For APNS, translates to the `aps.category` value. For GCM, translates to the `data.twi_action` value. For SMS, this parameter is not supported and is omitted from deliveries to those channels. + :param data: The custom key-value pairs of the notification's payload. For FCM and GCM, this value translates to `data` in the FCM and GCM payloads. FCM and GCM [reserve certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref) that cannot be used in those channels. For APNS, attributes of `data` are inserted into the APNS payload as custom properties outside of the `aps` dictionary. In all channels, we reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed and are rejected as 400 Bad request with no delivery attempted. For SMS, this parameter is not supported and is omitted from deliveries to those channels. + :param apn: The APNS-specific payload that overrides corresponding attributes in the generic payload for APNS Bindings. This property maps to the APNS `Payload` item, therefore the `aps` key must be used to change standard attributes. Adds custom key-value pairs to the root of the dictionary. See the [APNS documentation](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html) for more details. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. + :param gcm: The GCM-specific payload that overrides corresponding attributes in the generic payload for GCM Bindings. This property maps to the root JSON dictionary. See the [GCM documentation](https://firebase.google.com/docs/cloud-messaging/http-server-ref) for more details. Target parameters `to`, `registration_ids`, and `notification_key` are not allowed. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. GCM also [reserves certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref). + :param sms: The SMS-specific payload that overrides corresponding attributes in the generic payload for SMS Bindings. Each attribute in this value maps to the corresponding `form` parameter of the Twilio [Message](https://www.twilio.com/docs/sms/quickstart) resource. These parameters of the Message resource are supported in snake case format: `body`, `media_urls`, `status_callback`, and `max_price`. The `status_callback` parameter overrides the corresponding parameter in the messaging service, if configured. The `media_urls` property expects a JSON array. + :param facebook_messenger: Deprecated. + :param fcm: The FCM-specific payload that overrides corresponding attributes in the generic payload for FCM Bindings. This property maps to the root JSON dictionary. See the [FCM documentation](https://firebase.google.com/docs/cloud-messaging/http-server-ref#downstream) for more details. Target parameters `to`, `registration_ids`, `condition`, and `notification_key` are not allowed in this parameter. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. FCM also [reserves certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref), which cannot be used in that channel. + :param segment: The Segment resource is deprecated. Use the `tag` parameter, instead. + :param alexa: Deprecated. + :param to_binding: The destination address specified as a JSON string. Multiple `to_binding` parameters can be included but the total size of the request entity should not exceed 1MB. This is typically sufficient for 10,000 phone numbers. + :param delivery_callback_url: URL to send webhooks. + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/notify/api/service-resource). Delivery will be attempted only to Bindings with an Identity in this list. No more than 20 items are allowed in this list. + :param tag: A tag that selects the Bindings to notify. Repeat this parameter to specify more than one tag, up to a total of 5 tags. The implicit tag `all` is available to notify all Bindings in a Service instance. Similarly, the implicit tags `apn`, `fcm`, `gcm`, `sms` and `facebook-messenger` are available to notify all Bindings in a specific channel. + + :returns: The created NotificationInstance + """ + + data = values.of( + { + "Body": body, + "Priority": priority, + "Ttl": ttl, + "Title": title, + "Sound": sound, + "Action": action, + "Data": serialize.object(data), + "Apn": serialize.object(apn), + "Gcm": serialize.object(gcm), + "Sms": serialize.object(sms), + "FacebookMessenger": serialize.object(facebook_messenger), + "Fcm": serialize.object(fcm), + "Segment": serialize.map(segment, lambda e: e), + "Alexa": serialize.object(alexa), + "ToBinding": serialize.map(to_binding, lambda e: e), + "DeliveryCallbackUrl": delivery_callback_url, + "Identity": serialize.map(identity, lambda e: e), + "Tag": serialize.map(tag, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return NotificationInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + body: Union[str, object] = values.unset, + priority: Union["NotificationInstance.Priority", object] = values.unset, + ttl: Union[int, object] = values.unset, + title: Union[str, object] = values.unset, + sound: Union[str, object] = values.unset, + action: Union[str, object] = values.unset, + data: Union[object, object] = values.unset, + apn: Union[object, object] = values.unset, + gcm: Union[object, object] = values.unset, + sms: Union[object, object] = values.unset, + facebook_messenger: Union[object, object] = values.unset, + fcm: Union[object, object] = values.unset, + segment: Union[List[str], object] = values.unset, + alexa: Union[object, object] = values.unset, + to_binding: Union[List[str], object] = values.unset, + delivery_callback_url: Union[str, object] = values.unset, + identity: Union[List[str], object] = values.unset, + tag: Union[List[str], object] = values.unset, + ) -> NotificationInstance: + """ + Asynchronously create the NotificationInstance + + :param body: The notification text. For FCM and GCM, translates to `data.twi_body`. For APNS, translates to `aps.alert.body`. For SMS, translates to `body`. SMS requires either this `body` value, or `media_urls` attribute defined in the `sms` parameter of the notification. + :param priority: + :param ttl: How long, in seconds, the notification is valid. Can be an integer between 0 and 2,419,200, which is 4 weeks, the default and the maximum supported time to live (TTL). Delivery should be attempted if the device is offline until the TTL elapses. Zero means that the notification delivery is attempted immediately, only once, and is not stored for future delivery. SMS does not support this property. + :param title: The notification title. For FCM and GCM, this translates to the `data.twi_title` value. For APNS, this translates to the `aps.alert.title` value. SMS does not support this property. This field is not visible on iOS phones and tablets but appears on Apple Watch and Android devices. + :param sound: The name of the sound to be played for the notification. For FCM and GCM, this Translates to `data.twi_sound`. For APNS, this translates to `aps.sound`. SMS does not support this property. + :param action: The actions to display for the notification. For APNS, translates to the `aps.category` value. For GCM, translates to the `data.twi_action` value. For SMS, this parameter is not supported and is omitted from deliveries to those channels. + :param data: The custom key-value pairs of the notification's payload. For FCM and GCM, this value translates to `data` in the FCM and GCM payloads. FCM and GCM [reserve certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref) that cannot be used in those channels. For APNS, attributes of `data` are inserted into the APNS payload as custom properties outside of the `aps` dictionary. In all channels, we reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed and are rejected as 400 Bad request with no delivery attempted. For SMS, this parameter is not supported and is omitted from deliveries to those channels. + :param apn: The APNS-specific payload that overrides corresponding attributes in the generic payload for APNS Bindings. This property maps to the APNS `Payload` item, therefore the `aps` key must be used to change standard attributes. Adds custom key-value pairs to the root of the dictionary. See the [APNS documentation](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html) for more details. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. + :param gcm: The GCM-specific payload that overrides corresponding attributes in the generic payload for GCM Bindings. This property maps to the root JSON dictionary. See the [GCM documentation](https://firebase.google.com/docs/cloud-messaging/http-server-ref) for more details. Target parameters `to`, `registration_ids`, and `notification_key` are not allowed. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. GCM also [reserves certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref). + :param sms: The SMS-specific payload that overrides corresponding attributes in the generic payload for SMS Bindings. Each attribute in this value maps to the corresponding `form` parameter of the Twilio [Message](https://www.twilio.com/docs/sms/quickstart) resource. These parameters of the Message resource are supported in snake case format: `body`, `media_urls`, `status_callback`, and `max_price`. The `status_callback` parameter overrides the corresponding parameter in the messaging service, if configured. The `media_urls` property expects a JSON array. + :param facebook_messenger: Deprecated. + :param fcm: The FCM-specific payload that overrides corresponding attributes in the generic payload for FCM Bindings. This property maps to the root JSON dictionary. See the [FCM documentation](https://firebase.google.com/docs/cloud-messaging/http-server-ref#downstream) for more details. Target parameters `to`, `registration_ids`, `condition`, and `notification_key` are not allowed in this parameter. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. FCM also [reserves certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref), which cannot be used in that channel. + :param segment: The Segment resource is deprecated. Use the `tag` parameter, instead. + :param alexa: Deprecated. + :param to_binding: The destination address specified as a JSON string. Multiple `to_binding` parameters can be included but the total size of the request entity should not exceed 1MB. This is typically sufficient for 10,000 phone numbers. + :param delivery_callback_url: URL to send webhooks. + :param identity: The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/notify/api/service-resource). Delivery will be attempted only to Bindings with an Identity in this list. No more than 20 items are allowed in this list. + :param tag: A tag that selects the Bindings to notify. Repeat this parameter to specify more than one tag, up to a total of 5 tags. The implicit tag `all` is available to notify all Bindings in a Service instance. Similarly, the implicit tags `apn`, `fcm`, `gcm`, `sms` and `facebook-messenger` are available to notify all Bindings in a specific channel. + + :returns: The created NotificationInstance + """ + + data = values.of( + { + "Body": body, + "Priority": priority, + "Ttl": ttl, + "Title": title, + "Sound": sound, + "Action": action, + "Data": serialize.object(data), + "Apn": serialize.object(apn), + "Gcm": serialize.object(gcm), + "Sms": serialize.object(sms), + "FacebookMessenger": serialize.object(facebook_messenger), + "Fcm": serialize.object(fcm), + "Segment": serialize.map(segment, lambda e: e), + "Alexa": serialize.object(alexa), + "ToBinding": serialize.map(to_binding, lambda e: e), + "DeliveryCallbackUrl": delivery_callback_url, + "Identity": serialize.map(identity, lambda e: e), + "Tag": serialize.map(tag, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return NotificationInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/NumbersBase.py b/venv/Lib/site-packages/twilio/rest/numbers/NumbersBase.py new file mode 100644 index 00000000..7b9e0863 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/NumbersBase.py @@ -0,0 +1,55 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.numbers.v1 import V1 +from twilio.rest.numbers.v2 import V2 + + +class NumbersBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Numbers Domain + + :returns: Domain for Numbers + """ + super().__init__(twilio, "https://numbers.twilio.com") + self._v1: Optional[V1] = None + self._v2: Optional[V2] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Numbers + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + @property + def v2(self) -> V2: + """ + :returns: Versions v2 of Numbers + """ + if self._v2 is None: + self._v2 = V2(self) + return self._v2 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/__init__.py b/venv/Lib/site-packages/twilio/rest/numbers/__init__.py new file mode 100644 index 00000000..abe9985d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/__init__.py @@ -0,0 +1,15 @@ +from warnings import warn + +from twilio.rest.numbers.NumbersBase import NumbersBase +from twilio.rest.numbers.v2.regulatory_compliance import RegulatoryComplianceList + + +class Numbers(NumbersBase): + @property + def regulatory_compliance(self) -> RegulatoryComplianceList: + warn( + "regulatory_compliance is deprecated. Use v2.regulatory_compliance instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.regulatory_compliance diff --git a/venv/Lib/site-packages/twilio/rest/numbers/__pycache__/NumbersBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/__pycache__/NumbersBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04bc53b5679db4b7606d05b6511acb249cf382af GIT binary patch literal 2346 zcmd5-Pj4GV6rWwM*K6mWX`?ihf~E;6GE!~Drz$EDO@m4VBn8qQRz}0dJ5H9acg^g^ zjV&K?h(sc_Y9)k{E5|CIflt7tAP&`vo)8Ca0XL%RiT7sLPTCN0Wo*BB^WK{`^M3Em z^N&MAIRfMU&tI;C)?Gl@q#8zz8RqCp#D#)kYR9!PQ$!l)9uA92# z({842n1iCQ1$32r zTv#Eu=}HTfj4^ujp&&pJ116s3;^Z>1inVAT|Ku+4N;~-NedJn7z%bS@hDy0ag1b8v z+#or|O2{QnVsWYGmUZOb*fKGL(_)Wk3&-K|3nX}6rRSDXJR<(~>?=9&ySTLc!Ayda zYXt!Xz^wJqe+ewQ)ZpH=n+x`IF}Q6K^gMu8W_y`)bm5i zZ6~DR8mCoxK;81zE!S-obAMpU3QA-wHA2VtEEjlv-mhDZhun47;a&)wdV5;Zay8Cz zOp}C@ZUxrgKsj+@Do|3Yt?*P$-6l0Ct*t>*<7qp^^_psHTiSl&!OTdh0n+p_X%;MV zAk()rb6}fnDCXejq>zaQ7T4=5Tm*Agz#~1p>$r|zRgc|910FBbodfcnvP;6ga!2iu z`%w8E#a8x{Jy6FWWql8F)eDHU)IzF#3zII#g6D*e7 zm`OCW<_nq__l?@;ds*}1h>CGA#j0OlEND?WSZ{C<8H_n_Dq~TKHK&o33#mv8xLXtW zyrV2*GMkJAcx_5IUzpctDz^dvsq)dn!g6Jv2X{ihQEB>4m0yF}2rEtQH7g%GE0w?r z`Q?UHy<@HNpc3DpBzO>(l3SIMdn4Y(MoSFA8ST;I!rlePKod*?dA>=W4U+8ePUa_L zd~fXW#rJ+OW}jS~+ScwFa=LGH!Hh(Dj8hdlM1Nom`0IWKWS4ZvSAEqHvzZUkMve~I zPxeC^d%{!pK?N!8az6z}dAbc?LEQ(mIZgfAiCh&_F$}JS4&;#{@-PK>C>3XbMrw1q zJ$xJz@B;Gg1dvT~kRyZn2Um8kJRW%C*K@D$z5VUR_WZpMpNyP+u(7kTJtEG6+5ZZI z@+laMz(qv{iOls&2$Wwzpj<$^aU>_=17VzFe5<>pr4-aQ?`P$v@S6_&Pgt}jpzYXh ziwfR=nuNl&usiiFkMj44Rb6vD{+~PA`K!yaWfYTi%|1FA3_LkJkg-?mJeHQ>(gC6% zQ=6ZV@fC*frFvGK!%NLER`>077x_WPzJ?|nYXtu7$|n>V4FTO+ge_TA;v6a@wC90~ zQb8!ho5&3%&%4T9m$8B(UIVEtzV~JEi7f6!GKz{%fjr+L2bz(-wAVZ&Fdd8%efU7t z)8h~4{vt4SQ$4{!zQ_HGDxIF#oBW%=BqNk(EEWc%3}d!mh0ye{)o{F3flo0ylXR~Y z>=U+Zhyv3a4I~O|Dl-0P?3kqJCC#rnErB>iS&p%hv0ebL@s05Dy)drESkH=gVTm;v pyaVJQr6|guYF5z>$B1&_cQW;qy!906)H8ijnRs~VkiaAz{R5ICKq&wK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50693526339c049c04bf4fd684136d89f8b07d49 GIT binary patch literal 1001 zcmZ`%OKTKC5U!rrj_bxm@e#$xB8UuZHjs-T643-C8WxO7WEdDH)17sadD-2&%LWe~ za?pc#%x{qRPrO7ghQXZFL+}z^bIHl>o!QML=|k05U5~D>sy~m6ltG;LUthfZjR1Z~ zV{r5W^ri*a01Oy~5Fr~OiIq@^R9o$1HPj;A))6T10I;?WSSRYHn&;a_*RV>v(y&mb zbvzmieX`MtmI!6{Jw}8%zCfC-(Bld1&LmM9243uw`G9dhFOtimBJ{2cdjkmA2!pK< z6(gc8D_B|AHj8*$@2ZxTm5OIFgA(4Nu`fstk0dBd_7;TL06z3##Far5Rz3}>Ab1Tc z+Q4(DSByhEKu^HZ8fy>fkeBNZiB$tu#U!P~_c+1z>N7^F?Wy`Pu`%Ps!}VR+k{DH) zanD~3Nt=Y0MrHrmnc1RPki?5(zCql~l=f71?#POA3yg%zO!BQBEY93^L<5vLkLKo{ zI+(*Nwf1xNcT<-6+AWP~wW~zG``4;W1O1q=fP=m22)d^AYH2iN~ZU4TJ>j zvJmUAt&i*}hCZ=%^X^{|x~GD1>W{q16J=<_DrKhp#A3)SAOE#{5`rS*^VfUEK$v H`nmrBQ>F+L literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/numbers/v1/__init__.py new file mode 100644 index 00000000..043364c3 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v1/__init__.py @@ -0,0 +1,135 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.numbers.v1.bulk_eligibility import BulkEligibilityList +from twilio.rest.numbers.v1.eligibility import EligibilityList +from twilio.rest.numbers.v1.porting_port_in import PortingPortInList +from twilio.rest.numbers.v1.porting_port_in_phone_number import ( + PortingPortInPhoneNumberList, +) +from twilio.rest.numbers.v1.porting_portability import PortingPortabilityList +from twilio.rest.numbers.v1.porting_webhook_configuration import ( + PortingWebhookConfigurationList, +) +from twilio.rest.numbers.v1.porting_webhook_configuration_delete import ( + PortingWebhookConfigurationDeleteList, +) +from twilio.rest.numbers.v1.porting_webhook_configuration_fetch import ( + PortingWebhookConfigurationFetchList, +) +from twilio.rest.numbers.v1.signing_request_configuration import ( + SigningRequestConfigurationList, +) + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Numbers + + :param domain: The Twilio.numbers domain + """ + super().__init__(domain, "v1") + self._bulk_eligibilities: Optional[BulkEligibilityList] = None + self._eligibilities: Optional[EligibilityList] = None + self._porting_port_ins: Optional[PortingPortInList] = None + self._porting_port_in_phone_number: Optional[PortingPortInPhoneNumberList] = ( + None + ) + self._porting_portabilities: Optional[PortingPortabilityList] = None + self._porting_webhook_configurations: Optional[ + PortingWebhookConfigurationList + ] = None + self._porting_webhook_configurations_delete: Optional[ + PortingWebhookConfigurationDeleteList + ] = None + self._porting_webhook_configuration_fetch: Optional[ + PortingWebhookConfigurationFetchList + ] = None + self._signing_request_configurations: Optional[ + SigningRequestConfigurationList + ] = None + + @property + def bulk_eligibilities(self) -> BulkEligibilityList: + if self._bulk_eligibilities is None: + self._bulk_eligibilities = BulkEligibilityList(self) + return self._bulk_eligibilities + + @property + def eligibilities(self) -> EligibilityList: + if self._eligibilities is None: + self._eligibilities = EligibilityList(self) + return self._eligibilities + + @property + def porting_port_ins(self) -> PortingPortInList: + if self._porting_port_ins is None: + self._porting_port_ins = PortingPortInList(self) + return self._porting_port_ins + + @property + def porting_port_in_phone_number(self) -> PortingPortInPhoneNumberList: + if self._porting_port_in_phone_number is None: + self._porting_port_in_phone_number = PortingPortInPhoneNumberList(self) + return self._porting_port_in_phone_number + + @property + def porting_portabilities(self) -> PortingPortabilityList: + if self._porting_portabilities is None: + self._porting_portabilities = PortingPortabilityList(self) + return self._porting_portabilities + + @property + def porting_webhook_configurations(self) -> PortingWebhookConfigurationList: + if self._porting_webhook_configurations is None: + self._porting_webhook_configurations = PortingWebhookConfigurationList(self) + return self._porting_webhook_configurations + + @property + def porting_webhook_configurations_delete( + self, + ) -> PortingWebhookConfigurationDeleteList: + if self._porting_webhook_configurations_delete is None: + self._porting_webhook_configurations_delete = ( + PortingWebhookConfigurationDeleteList(self) + ) + return self._porting_webhook_configurations_delete + + @property + def porting_webhook_configuration_fetch( + self, + ) -> PortingWebhookConfigurationFetchList: + if self._porting_webhook_configuration_fetch is None: + self._porting_webhook_configuration_fetch = ( + PortingWebhookConfigurationFetchList(self) + ) + return self._porting_webhook_configuration_fetch + + @property + def signing_request_configurations(self) -> SigningRequestConfigurationList: + if self._signing_request_configurations is None: + self._signing_request_configurations = SigningRequestConfigurationList(self) + return self._signing_request_configurations + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ef16dacae713f49478317429f6ec2098585f261 GIT binary patch literal 5814 zcmc&&O>7&-6`tjvR$Nk~ek{vBk=Bw)nQ}yimi$LMhU3UKl*F=OsY*vB4vF$@$w_Sj>AUY3;$8w(jQ&|KP+8pUmpQ{S6eu1QgrgB&W7 zn0fQPH}m$ro%iMq{~8Vl34Ff(+ZW4HA0hw1LF40hh@C$I@sJdVL<(HNqj5!#_!c75k-rN{6+>#Q|x6BOY>-6uLG@A)@%6c-iwxN2<|8ckW*t zAwdy7bIYnB=F0^|yq`0~C8eb3Ia4W!3sq#xvMj#&B7l&L6KT(ywxJ`{B!cVUG+Cxv z*FiSVnhgFE-+h9!`P&s!Ethf{&>iz&1`L1TDU&WR6JHlknD9 z=wLFKE~%!P)6|+mqh~%XuCmw=%ZqNn(?CP%OeLr1iX!s@Mz!KZeX_)IgTrzs*q+t& zOhT~z#!5xeZC;jDP$6&7i)V5rGVzun)$ zW^slq54re#7G-k2Im`?@{tf}TK*P*Fxxbveh(QMG3>IIq&H`+gx`fyE8H%>3cf%X8 zJ7t+>Em<~jBZ%Vq57Nh(?9U8%6WLFvr{}U$igC{@SF)>RHLrXGS}A8Sifg-wY<22kAG1zw__!fNEj~bj4iJOL;h*-4D8h#@1aR9+EZkOPBSASdW@+ z{H&2D&U}b5S7h&bv*a;1lkn*MAg5zoJ?8Ww=nPyz)K5Tb_q6ZQ+97aVJ3NImN1<6K zuY|~RVWcjMSi%yQV#J7giPfu)XdPz5 zHWQ<}6H2WYtlSOW*=6X7x^Ti05?irzPtDEPWi)h{8XBudViq4eFhh@^jhN`$3_ZTf zrj|5W8)`SYMPPoH1IFvZxFww3O5gfRVKY684oFf5r0bEi#itL<0Y}kxJlonFaH!b< z?m&*t7+NdrW%6LdXU7rgrd)db9LdIC0zL?diH5yGkOV*!EpDp(0MreqJ7UJ znR+B+@tFhj%zNmR@Lrx7+1E3ybg9MPsPviCXcURB}m zhn%>mt4gV$RYhH?KSSL`bMcE0LIEDp$DOXgWfDg)Yv0PZukPgZ6mvG%?933w# zw8*siiVin--K^5`O2^WHRUTMzvIF`wQuG8HM~bHM6jC(9rIDghK8Y0F)#s3+Z}I|A zw%0Iq{Ss1Pr;N@knkLH$P8R{C_03gU%;`}W(*_^JfIp1L_Zwu}cf{ZQX!SLLZu=Yw zbZvXQ{!`Y;^WPHacf1V*+`xDvkA97;5tlXMvf|e81oGl8FYfZrSjkV2cgE$Nae1e$ z(GQV#+U1>gd6U)$w~;sL@+KW#hyT*6&g8d#=p7zV+dcF#JNy@4b&ezNqRYGJ@L;XI z*7W;hk4FAWprhNEI%+0y)b5bwLOBm_Ibc>R@Rxy(#kSqcE*i;&oS`J0E2EB^-0o@S zu$v;?685OWz`IG~zL;EXtEJgyv4`Ix{iY(V(!FHI-y+yZcG$z!k#0A8;>QWM6hm}- z+G9Urrt`lJ-Np9gJ0|RT0@H18U-~Iio#Tpzi=FvNE6~d;jk32s{l1xyg(VHM48|I! zLmGNN@RwP#xT4<%3@=#5r_gMBIgb0cC&c+)A1B=Lmt^!MiM=E@Uy>^?$<%9)hx5D+ a5N?KZNIGsb-vz(mxY&ckuL<^4+5Z6fU9i0X literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/bulk_eligibility.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/bulk_eligibility.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14f494479c7a9cbcca4e2137251d31a6ca5afa5f GIT binary patch literal 11360 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/eligibility.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/eligibility.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78e8050bf6a9c8c4723d71a52d3a2c6330c81018 GIT binary patch literal 5064 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f271adc27b338ff9a3a8ac147ceeec62069639e0 GIT binary patch literal 5508 zcmdTIZEO_Bb@q1e!^hb;h7vmv7$AjQz<0qAkz9b*B`9^EK)?{`;&!{ebU8ypKC}>qA)DNlcFGnUK@{g+T&Fr1e5CT-H z)Xv?#oqhA(o0&K7Ywq`*ooNE?{Xc%c{D-B4`~_c{Egp5|PC;jySfofS#fmvfC02}8 z)S_C^idrRJj8_uHgo0zLldPnQDbd%Qj!L?i7X7%hq>?FSL_gtlR=SE^3W8U=|&%LMlc*Ovn)tn@u=$slv#El7GsJ@Du!D#9H*X3{{t-|8xPe% zw;pP**k%xF`)of5QwOSn?YV{%#*etr$tq!D+;D2lhhF!P>j#EwvO~=GYTRUi%OG3Z zd-5nK0~k$da}p+^m$`32=SN`fj1(0x`Iw~?RV&6cOJ#AEV98Rf4=7676e%f|b~;l` zS%5Fati)-p*fB*;D8=+)l1+x|4|+VX-D7XC(X!_q-|e|2`&bPu6{c>k(x}EFn=aVn z2B$Udpw1aRa%dm*N z)B$*m2YWY}J>p-h~)QvLx)#brJ4#-N*ex zY(F*c?JkTQ@!?=b_6`jVkG#VC`Hl@9ny1C`Wt1GXpoZ0#M^(}{{v>T~4HwRw2 zy6MWMnO%pk4-6xQ-h5%l)iBPeaxMRHN$y|7*%cS8A70MS}-X}bQXikH+IQA`TJDKgtdx`!0L z5?-=PP@Zd47+7Cg*DIb?bFiP$^|v64Mk7gGw>%RjUIIKEH5jUXz&R>Z7y)04xX#EX zP3Abd4r|9WC)WN=v3A~x^a!5Bfo%Z3I88o_#p9{ju0;HZay~gr@Ok-}%l=2ZFQ2%Q z`&_)wb|>RQ%GvdI2|mTjg%}egv|7`Z=Y9sL#p#!+rI<*zF-W!=i;rbmT&)hIVwELX ziltSF z<^}-V6G~(Ehf+&{0NCQM$Fl0=$(EH5L6or#$DU-EEa*el(q{5igBukZh5Q1IiXWMF zASeWeEs_uer;#Po0`KJNd^AsfQTdXOYMT97m46MkCd??*pysdvgGMidoiHI(00cN` zL?Y-s`;f)A0?t-o^-%}}oI72lqpL0CEQd(*euprpP#g8EI$s5Zi`0)XU#S1j(3ys; zHFj@M0sJNSVLKTMkXE!Y^pblTUVZFVRy(O$YD2Y@9Y7^|8ul7wtd(aL*vC2+`pupd z2U>CUYGUNG5o@TwPF#xSKdA-iaH4&=?1pwJG8n8mC(pIaWjAMVCwiEvH0#iXBQHpE zL4_9Du&ua>#i=P|TVG{^Ex{s)0+`Q$1qBe1`-kgQHoq3CM7Vp1@SH!bvncc{~T% zPTqU!H|m6vO-){CIm)14cg-^QT(9Osre-~I2OR10%)u0MD;ZJ2q{gLaxQX5rCf$|?}j7yN~BOuFH+_VFkwNRx5(`~4;pA*p$ G3i&q+7_CbH literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration_delete.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration_delete.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3751784159774f86a63b61e2285054292a4363b GIT binary patch literal 5410 zcmc&&U2GKB6~1?7_7{U4Yy$>bhSI2P74JgYG{kkBx|mSM#<^_xBm1;yQ(YNF&%3Gzr;E>AJNRg1LN^PY|ix!mBPd(?}ne`gG zHB_xKw$Huy%>6y*JKsIyKW^O`C-B_(Qw7}SumG$)Nn z6zg(U&M6}buPfP5E<6(E^-wmFi;hGok;rjkglC8mF_pWrm~SM;wNcQ<%y3N`pNc28 z=zph##8r5P$1O+A*oLWI)E)J_nKzm4nua<$g|9VDQ&)dbfhr9L@=}O(O}|%N7n}!& zX&PU(tg7YO52&#LztBaz(KOWXCJJ1#oCb}kX<79lOXfCbT1O!#OQGpAm2pQt=zreyF?$Xf??Q1;k1QHDyCGfaHr<8D&%3&n z7Z_%~^J{DSL+g!?Yd>X^+0>gpY)0=h>{)!=?hs^vLF0p|uB=QR?MR*>F~2UHyIpv7YuXW1o6cc@^}Y{ZMzm(jP9D>`Dt{2B}%sLneVU2((d@I za(!DROj`Ts{g$IkEpIKhy!D7kt?}h;+i&Ktt8A>Wtg zWQe>o?kO&7|p}gzYdup{+YBA)EXk_(z2C`6A#%dTD zWcH*5d9JRGG0V&w*(sHo1t4r-b)I8v#0w|%%s3+H-wlCFgFh=&U1y4K!QQLr0TDuF zau(o_hJ#PjX~`fP8K(^S#9iMs@6$O-$@M)7nW7xe-YR1Mp}XnnTl)omo2rtk;#S&2j=JcM!B3OP}l> z`hCy6?tAadzxvCrUvw?(U-;qDp48&*p?~sw^xb{?Y3YqlkqIaLd^!2{;pDUKM7=!S zh1d0jZRJ@Ltm=i}s?9m#(1JC+NJh|KeYjv6AkOeySE(3s9MAY&5LZa0fi&-!J9z6L zoauv}j|M&*Sn3>H>>Pa1dFs>MLl3qO%|@0R2bUVpEH<85ZfLH`L8x#lO>Dt^IDB;@QIY6I8u=>q-=ro;Isszi*u7*(j zc2AW+QP~>{#pe%vPN3jt;B#hRy4r&o5$f%hYoR;vWC1UkCA2!Y-{(*r#YhDqXE{!t*BAxQ9BLc>c_~w(>wiV%uQL z90CbhqyjuQo0w0NF1>we;G5a|fW^ zy4Y424^F}SnA4q~86zn^`_2WgPvRWtR?h29ebgsuhTvwHF|(IZ)c9CnpbK?KsO;M) zaAo!iitm7^r{E)~L@|Uf@D|||90`5xcH{|xqOv_6iZAaSs>o12j2*6qpseiLP#F&O zQRHDPMVR8u18}88G|jLxaEojaUz*8L9X?YrO1-^xnk0P7^Z)B;{{6_%D_&cDmn@hV z?n&{F9)?Mm*IfVJ|5yPhK=HUl6SR*m^gjV7`v?6OVxn^M literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration_fetch.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v1/__pycache__/porting_webhook_configuration_fetch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93458a390764d4859769bbf5b134ff476538de3c GIT binary patch literal 5606 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 "BulkEligibilityContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: BulkEligibilityContext for this BulkEligibilityInstance + """ + if self._context is None: + self._context = BulkEligibilityContext( + self._version, + request_id=self._solution["request_id"], + ) + return self._context + + def fetch(self) -> "BulkEligibilityInstance": + """ + Fetch the BulkEligibilityInstance + + + :returns: The fetched BulkEligibilityInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "BulkEligibilityInstance": + """ + Asynchronous coroutine to fetch the BulkEligibilityInstance + + + :returns: The fetched BulkEligibilityInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BulkEligibilityContext(InstanceContext): + + def __init__(self, version: Version, request_id: str): + """ + Initialize the BulkEligibilityContext + + :param version: Version that contains the resource + :param request_id: The SID of the bulk eligibility check that you want to know about. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "request_id": request_id, + } + self._uri = "/HostedNumber/Eligibility/Bulk/{request_id}".format( + **self._solution + ) + + def fetch(self) -> BulkEligibilityInstance: + """ + Fetch the BulkEligibilityInstance + + + :returns: The fetched BulkEligibilityInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return BulkEligibilityInstance( + self._version, + payload, + request_id=self._solution["request_id"], + ) + + async def fetch_async(self) -> BulkEligibilityInstance: + """ + Asynchronous coroutine to fetch the BulkEligibilityInstance + + + :returns: The fetched BulkEligibilityInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return BulkEligibilityInstance( + self._version, + payload, + request_id=self._solution["request_id"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BulkEligibilityList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the BulkEligibilityList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/HostedNumber/Eligibility/Bulk" + + def create( + self, body: Union[object, object] = values.unset + ) -> BulkEligibilityInstance: + """ + Create the BulkEligibilityInstance + + :param body: + + :returns: The created BulkEligibilityInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BulkEligibilityInstance(self._version, payload) + + async def create_async( + self, body: Union[object, object] = values.unset + ) -> BulkEligibilityInstance: + """ + Asynchronously create the BulkEligibilityInstance + + :param body: + + :returns: The created BulkEligibilityInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BulkEligibilityInstance(self._version, payload) + + def get(self, request_id: str) -> BulkEligibilityContext: + """ + Constructs a BulkEligibilityContext + + :param request_id: The SID of the bulk eligibility check that you want to know about. + """ + return BulkEligibilityContext(self._version, request_id=request_id) + + def __call__(self, request_id: str) -> BulkEligibilityContext: + """ + Constructs a BulkEligibilityContext + + :param request_id: The SID of the bulk eligibility check that you want to know about. + """ + return BulkEligibilityContext(self._version, request_id=request_id) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/eligibility.py b/venv/Lib/site-packages/twilio/rest/numbers/v1/eligibility.py new file mode 100644 index 00000000..8c5af0ac --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v1/eligibility.py @@ -0,0 +1,108 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class EligibilityInstance(InstanceResource): + """ + :ivar results: The result set that contains the eligibility check response for the requested number, each result has at least the following attributes: phone_number: The requested phone number ,hosting_account_sid: The account sid where the phone number will be hosted, date_last_checked: Datetime (ISO 8601) when the PN was last checked for eligibility, country: Phone number’s country, eligibility_status: Indicates the eligibility status of the PN (Eligible/Ineligible), eligibility_sub_status: Indicates the sub status of the eligibility , ineligibility_reason: Reason for number's ineligibility (if applicable), next_step: Suggested next step in the hosting process based on the eligibility status. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.results: Optional[List[Dict[str, object]]] = payload.get("results") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class EligibilityList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the EligibilityList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/HostedNumber/Eligibility" + + def create(self, body: Union[object, object] = values.unset) -> EligibilityInstance: + """ + Create the EligibilityInstance + + :param body: + + :returns: The created EligibilityInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return EligibilityInstance(self._version, payload) + + async def create_async( + self, body: Union[object, object] = values.unset + ) -> EligibilityInstance: + """ + Asynchronously create the EligibilityInstance + + :param body: + + :returns: The created EligibilityInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return EligibilityInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_port_in.py b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_port_in.py new file mode 100644 index 00000000..3df2c154 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_port_in.py @@ -0,0 +1,325 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date, datetime +from typing import Any, Dict, List, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PortingPortInInstance(InstanceResource): + """ + :ivar port_in_request_sid: The SID of the Port In request. This is a unique identifier of the port in request. + :ivar url: The URL of this Port In request + :ivar account_sid: Account Sid or subaccount where the phone number(s) will be Ported + :ivar notification_emails: Additional emails to send a copy of the signed LOA to. + :ivar target_port_in_date: Target date to port the number. We cannot guarantee that this date will be honored by the other carriers, please work with Ops to get a confirmation of the firm order commitment (FOC) date. Expected format is ISO Local Date, example: ‘2011-12-03`. This date must be at least 7 days in the future for US ports and 10 days in the future for Japanese ports. We can't guarantee the exact date and time, as this depends on the losing carrier + :ivar target_port_in_time_range_start: The earliest time that the port should occur on the target port in date. Expected format is ISO Offset Time, example: ‘10:15:00-08:00'. We can't guarantee the exact date and time, as this depends on the losing carrier + :ivar target_port_in_time_range_end: The latest time that the port should occur on the target port in date. Expected format is ISO Offset Time, example: ‘10:15:00-08:00'. We can't guarantee the exact date and time, as this depends on the losing carrier + :ivar port_in_request_status: The status of the port in request. The possible values are: In progress, Completed, Expired, In review, Waiting for Signature, Action Required, and Canceled. + :ivar losing_carrier_information: Details regarding the customer’s information with the losing carrier. These values will be used to generate the letter of authorization and should match the losing carrier’s data as closely as possible to ensure the port is accepted. + :ivar phone_numbers: + :ivar documents: List of document SIDs for all phone numbers included in the port in request. At least one document SID referring to a document of the type Utility Bill is required. + :ivar date_created: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + port_in_request_sid: Optional[str] = None, + ): + super().__init__(version) + + self.port_in_request_sid: Optional[str] = payload.get("port_in_request_sid") + self.url: Optional[str] = payload.get("url") + self.account_sid: Optional[str] = payload.get("account_sid") + self.notification_emails: Optional[List[str]] = payload.get( + "notification_emails" + ) + self.target_port_in_date: Optional[date] = deserialize.iso8601_date( + payload.get("target_port_in_date") + ) + self.target_port_in_time_range_start: Optional[str] = payload.get( + "target_port_in_time_range_start" + ) + self.target_port_in_time_range_end: Optional[str] = payload.get( + "target_port_in_time_range_end" + ) + self.port_in_request_status: Optional[str] = payload.get( + "port_in_request_status" + ) + self.losing_carrier_information: Optional[Dict[str, object]] = payload.get( + "losing_carrier_information" + ) + self.phone_numbers: Optional[List[Dict[str, object]]] = payload.get( + "phone_numbers" + ) + self.documents: Optional[List[str]] = payload.get("documents") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + + self._solution = { + "port_in_request_sid": port_in_request_sid or self.port_in_request_sid, + } + self._context: Optional[PortingPortInContext] = None + + @property + def _proxy(self) -> "PortingPortInContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PortingPortInContext for this PortingPortInInstance + """ + if self._context is None: + self._context = PortingPortInContext( + self._version, + port_in_request_sid=self._solution["port_in_request_sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the PortingPortInInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PortingPortInInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "PortingPortInInstance": + """ + Fetch the PortingPortInInstance + + + :returns: The fetched PortingPortInInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "PortingPortInInstance": + """ + Asynchronous coroutine to fetch the PortingPortInInstance + + + :returns: The fetched PortingPortInInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PortingPortInContext(InstanceContext): + + def __init__(self, version: Version, port_in_request_sid: str): + """ + Initialize the PortingPortInContext + + :param version: Version that contains the resource + :param port_in_request_sid: The SID of the Port In request. This is a unique identifier of the port in request. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "port_in_request_sid": port_in_request_sid, + } + self._uri = "/Porting/PortIn/{port_in_request_sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the PortingPortInInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PortingPortInInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> PortingPortInInstance: + """ + Fetch the PortingPortInInstance + + + :returns: The fetched PortingPortInInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return PortingPortInInstance( + self._version, + payload, + port_in_request_sid=self._solution["port_in_request_sid"], + ) + + async def fetch_async(self) -> PortingPortInInstance: + """ + Asynchronous coroutine to fetch the PortingPortInInstance + + + :returns: The fetched PortingPortInInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return PortingPortInInstance( + self._version, + payload, + port_in_request_sid=self._solution["port_in_request_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PortingPortInList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PortingPortInList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Porting/PortIn" + + def create( + self, body: Union[object, object] = values.unset + ) -> PortingPortInInstance: + """ + Create the PortingPortInInstance + + :param body: + + :returns: The created PortingPortInInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PortingPortInInstance(self._version, payload) + + async def create_async( + self, body: Union[object, object] = values.unset + ) -> PortingPortInInstance: + """ + Asynchronously create the PortingPortInInstance + + :param body: + + :returns: The created PortingPortInInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PortingPortInInstance(self._version, payload) + + def get(self, port_in_request_sid: str) -> PortingPortInContext: + """ + Constructs a PortingPortInContext + + :param port_in_request_sid: The SID of the Port In request. This is a unique identifier of the port in request. + """ + return PortingPortInContext( + self._version, port_in_request_sid=port_in_request_sid + ) + + def __call__(self, port_in_request_sid: str) -> PortingPortInContext: + """ + Constructs a PortingPortInContext + + :param port_in_request_sid: The SID of the Port In request. This is a unique identifier of the port in request. + """ + return PortingPortInContext( + self._version, port_in_request_sid=port_in_request_sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_port_in_phone_number.py b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_port_in_phone_number.py new file mode 100644 index 00000000..cc8120f7 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_port_in_phone_number.py @@ -0,0 +1,310 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PortingPortInPhoneNumberInstance(InstanceResource): + """ + :ivar port_in_request_sid: The unique identifier for the port in request that this phone number is associated with. + :ivar phone_number_sid: The unique identifier for this phone number associated with this port in request. + :ivar url: URL reference for this resource. + :ivar account_sid: Account Sid or subaccount where the phone number(s) will be Ported. + :ivar phone_number_type: The number type of the phone number. This can be: toll-free, local, mobile or unknown. This field may be null if the number is not portable or if the portability for a number has not yet been evaluated. + :ivar date_created: The timestamp for when this port in phone number was created. + :ivar country: The ISO country code that this number is associated with. This field may be null if the number is not portable or if the portability for a number has not yet been evaluated. + :ivar missing_required_fields: Indicates if the phone number is missing required fields such as a PIN or account number. This field may be null if the number is not portable or if the portability for a number has not yet been evaluated. + :ivar last_updated: Timestamp indicating when the Port In Phone Number resource was last modified. + :ivar phone_number: Phone number to be ported. This will be in the E164 Format. + :ivar portable: If the number is portable by Twilio or not. This field may be null if the number portability has not yet been evaluated. If a number is not portable reference the `not_portability_reason_code` and `not_portability_reason` fields for more details + :ivar not_portability_reason: The not portability reason code description. This field may be null if the number is portable or if the portability for a number has not yet been evaluated. + :ivar not_portability_reason_code: The not portability reason code. This field may be null if the number is portable or if the portability for a number has not yet been evaluated. + :ivar port_in_phone_number_status: The status of the port in phone number. + :ivar port_out_pin: The pin required by the losing carrier to do the port out. + :ivar rejection_reason: The description of the rejection reason provided by the losing carrier. This field may be null if the number has not been rejected by the losing carrier. + :ivar rejection_reason_code: The code for the rejection reason provided by the losing carrier. This field may be null if the number has not been rejected by the losing carrier. + :ivar port_date: The timestamp the phone number will be ported. This will only be set once a port date has been confirmed. Not all carriers can guarantee a specific time on the port date. Twilio will try its best to get the port completed by this time on the port date. Please subscribe to webhooks for confirmation on when a port has actually been completed. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + port_in_request_sid: Optional[str] = None, + phone_number_sid: Optional[str] = None, + ): + super().__init__(version) + + self.port_in_request_sid: Optional[str] = payload.get("port_in_request_sid") + self.phone_number_sid: Optional[str] = payload.get("phone_number_sid") + self.url: Optional[str] = payload.get("url") + self.account_sid: Optional[str] = payload.get("account_sid") + self.phone_number_type: Optional[str] = payload.get("phone_number_type") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.country: Optional[str] = payload.get("country") + self.missing_required_fields: Optional[bool] = payload.get( + "missing_required_fields" + ) + self.last_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("last_updated") + ) + self.phone_number: Optional[str] = payload.get("phone_number") + self.portable: Optional[bool] = payload.get("portable") + self.not_portability_reason: Optional[str] = payload.get( + "not_portability_reason" + ) + self.not_portability_reason_code: Optional[int] = deserialize.integer( + payload.get("not_portability_reason_code") + ) + self.port_in_phone_number_status: Optional[str] = payload.get( + "port_in_phone_number_status" + ) + self.port_out_pin: Optional[int] = deserialize.integer( + payload.get("port_out_pin") + ) + self.rejection_reason: Optional[str] = payload.get("rejection_reason") + self.rejection_reason_code: Optional[int] = deserialize.integer( + payload.get("rejection_reason_code") + ) + self.port_date: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("port_date") + ) + + self._solution = { + "port_in_request_sid": port_in_request_sid or self.port_in_request_sid, + "phone_number_sid": phone_number_sid or self.phone_number_sid, + } + self._context: Optional[PortingPortInPhoneNumberContext] = None + + @property + def _proxy(self) -> "PortingPortInPhoneNumberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PortingPortInPhoneNumberContext for this PortingPortInPhoneNumberInstance + """ + if self._context is None: + self._context = PortingPortInPhoneNumberContext( + self._version, + port_in_request_sid=self._solution["port_in_request_sid"], + phone_number_sid=self._solution["phone_number_sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the PortingPortInPhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PortingPortInPhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "PortingPortInPhoneNumberInstance": + """ + Fetch the PortingPortInPhoneNumberInstance + + + :returns: The fetched PortingPortInPhoneNumberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "PortingPortInPhoneNumberInstance": + """ + Asynchronous coroutine to fetch the PortingPortInPhoneNumberInstance + + + :returns: The fetched PortingPortInPhoneNumberInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PortingPortInPhoneNumberContext(InstanceContext): + + def __init__( + self, version: Version, port_in_request_sid: str, phone_number_sid: str + ): + """ + Initialize the PortingPortInPhoneNumberContext + + :param version: Version that contains the resource + :param port_in_request_sid: The SID of the Port In request. This is a unique identifier of the port in request. + :param phone_number_sid: The SID of the Phone number. This is a unique identifier of the phone number. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "port_in_request_sid": port_in_request_sid, + "phone_number_sid": phone_number_sid, + } + self._uri = "/Porting/PortIn/{port_in_request_sid}/PhoneNumber/{phone_number_sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the PortingPortInPhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PortingPortInPhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> PortingPortInPhoneNumberInstance: + """ + Fetch the PortingPortInPhoneNumberInstance + + + :returns: The fetched PortingPortInPhoneNumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return PortingPortInPhoneNumberInstance( + self._version, + payload, + port_in_request_sid=self._solution["port_in_request_sid"], + phone_number_sid=self._solution["phone_number_sid"], + ) + + async def fetch_async(self) -> PortingPortInPhoneNumberInstance: + """ + Asynchronous coroutine to fetch the PortingPortInPhoneNumberInstance + + + :returns: The fetched PortingPortInPhoneNumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return PortingPortInPhoneNumberInstance( + self._version, + payload, + port_in_request_sid=self._solution["port_in_request_sid"], + phone_number_sid=self._solution["phone_number_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PortingPortInPhoneNumberList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PortingPortInPhoneNumberList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get( + self, port_in_request_sid: str, phone_number_sid: str + ) -> PortingPortInPhoneNumberContext: + """ + Constructs a PortingPortInPhoneNumberContext + + :param port_in_request_sid: The SID of the Port In request. This is a unique identifier of the port in request. + :param phone_number_sid: The SID of the Phone number. This is a unique identifier of the phone number. + """ + return PortingPortInPhoneNumberContext( + self._version, + port_in_request_sid=port_in_request_sid, + phone_number_sid=phone_number_sid, + ) + + def __call__( + self, port_in_request_sid: str, phone_number_sid: str + ) -> PortingPortInPhoneNumberContext: + """ + Constructs a PortingPortInPhoneNumberContext + + :param port_in_request_sid: The SID of the Port In request. This is a unique identifier of the port in request. + :param phone_number_sid: The SID of the Phone number. This is a unique identifier of the phone number. + """ + return PortingPortInPhoneNumberContext( + self._version, + port_in_request_sid=port_in_request_sid, + phone_number_sid=phone_number_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_portability.py b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_portability.py new file mode 100644 index 00000000..351cd541 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_portability.py @@ -0,0 +1,265 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PortingPortabilityInstance(InstanceResource): + + class NumberType(object): + LOCAL = "LOCAL" + UNKNOWN = "UNKNOWN" + MOBILE = "MOBILE" + TOLL_FREE = "TOLL-FREE" + + """ + :ivar phone_number: The phone number which portability is to be checked. Phone numbers are in E.164 format (e.g. +16175551212). + :ivar account_sid: Account Sid that the phone number belongs to in Twilio. This is only returned for phone numbers that already exist in Twilio’s inventory and belong to your account or sub account. + :ivar portable: Boolean flag indicates if the phone number can be ported into Twilio through the Porting API or not. + :ivar pin_and_account_number_required: Indicates if the port in process will require a personal identification number (PIN) and an account number for this phone number. If this is true you will be required to submit both a PIN and account number from the losing carrier for this number when opening a port in request. These fields will be required in order to complete the port in process to Twilio. + :ivar not_portable_reason: Reason why the phone number cannot be ported into Twilio, `null` otherwise. + :ivar not_portable_reason_code: The Portability Reason Code for the phone number if it cannot be ported into Twilio, `null` otherwise. + :ivar number_type: + :ivar country: Country the phone number belongs to. + :ivar url: This is the url of the request that you're trying to reach out to locate the resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + phone_number: Optional[str] = None, + ): + super().__init__(version) + + self.phone_number: Optional[str] = payload.get("phone_number") + self.account_sid: Optional[str] = payload.get("account_sid") + self.portable: Optional[bool] = payload.get("portable") + self.pin_and_account_number_required: Optional[bool] = payload.get( + "pin_and_account_number_required" + ) + self.not_portable_reason: Optional[str] = payload.get("not_portable_reason") + self.not_portable_reason_code: Optional[int] = deserialize.integer( + payload.get("not_portable_reason_code") + ) + self.number_type: Optional["PortingPortabilityInstance.NumberType"] = ( + payload.get("number_type") + ) + self.country: Optional[str] = payload.get("country") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "phone_number": phone_number or self.phone_number, + } + self._context: Optional[PortingPortabilityContext] = None + + @property + def _proxy(self) -> "PortingPortabilityContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PortingPortabilityContext for this PortingPortabilityInstance + """ + if self._context is None: + self._context = PortingPortabilityContext( + self._version, + phone_number=self._solution["phone_number"], + ) + return self._context + + def fetch( + self, + target_account_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + ) -> "PortingPortabilityInstance": + """ + Fetch the PortingPortabilityInstance + + :param target_account_sid: Account Sid to which the number will be ported. This can be used to determine if a sub account already has the number in its inventory or a different sub account. If this is not provided, the authenticated account will be assumed to be the target account. + :param address_sid: Address Sid of customer to which the number will be ported. + + :returns: The fetched PortingPortabilityInstance + """ + return self._proxy.fetch( + target_account_sid=target_account_sid, + address_sid=address_sid, + ) + + async def fetch_async( + self, + target_account_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + ) -> "PortingPortabilityInstance": + """ + Asynchronous coroutine to fetch the PortingPortabilityInstance + + :param target_account_sid: Account Sid to which the number will be ported. This can be used to determine if a sub account already has the number in its inventory or a different sub account. If this is not provided, the authenticated account will be assumed to be the target account. + :param address_sid: Address Sid of customer to which the number will be ported. + + :returns: The fetched PortingPortabilityInstance + """ + return await self._proxy.fetch_async( + target_account_sid=target_account_sid, + address_sid=address_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PortingPortabilityContext(InstanceContext): + + def __init__(self, version: Version, phone_number: str): + """ + Initialize the PortingPortabilityContext + + :param version: Version that contains the resource + :param phone_number: Phone number to check portability in e164 format. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "phone_number": phone_number, + } + self._uri = "/Porting/Portability/PhoneNumber/{phone_number}".format( + **self._solution + ) + + def fetch( + self, + target_account_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + ) -> PortingPortabilityInstance: + """ + Fetch the PortingPortabilityInstance + + :param target_account_sid: Account Sid to which the number will be ported. This can be used to determine if a sub account already has the number in its inventory or a different sub account. If this is not provided, the authenticated account will be assumed to be the target account. + :param address_sid: Address Sid of customer to which the number will be ported. + + :returns: The fetched PortingPortabilityInstance + """ + + data = values.of( + { + "TargetAccountSid": target_account_sid, + "AddressSid": address_sid, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PortingPortabilityInstance( + self._version, + payload, + phone_number=self._solution["phone_number"], + ) + + async def fetch_async( + self, + target_account_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + ) -> PortingPortabilityInstance: + """ + Asynchronous coroutine to fetch the PortingPortabilityInstance + + :param target_account_sid: Account Sid to which the number will be ported. This can be used to determine if a sub account already has the number in its inventory or a different sub account. If this is not provided, the authenticated account will be assumed to be the target account. + :param address_sid: Address Sid of customer to which the number will be ported. + + :returns: The fetched PortingPortabilityInstance + """ + + data = values.of( + { + "TargetAccountSid": target_account_sid, + "AddressSid": address_sid, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return PortingPortabilityInstance( + self._version, + payload, + phone_number=self._solution["phone_number"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PortingPortabilityList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PortingPortabilityList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, phone_number: str) -> PortingPortabilityContext: + """ + Constructs a PortingPortabilityContext + + :param phone_number: Phone number to check portability in e164 format. + """ + return PortingPortabilityContext(self._version, phone_number=phone_number) + + def __call__(self, phone_number: str) -> PortingPortabilityContext: + """ + Constructs a PortingPortabilityContext + + :param phone_number: Phone number to check portability in e164 format. + """ + return PortingPortabilityContext(self._version, phone_number=phone_number) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration.py b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration.py new file mode 100644 index 00000000..cfd9e1d0 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration.py @@ -0,0 +1,116 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PortingWebhookConfigurationInstance(InstanceResource): + """ + :ivar url: The URL of the webhook configuration request + :ivar port_in_target_url: The complete webhook url that will be called when a notification event for port in request or port in phone number happens + :ivar port_out_target_url: The complete webhook url that will be called when a notification event for a port out phone number happens. + :ivar notifications_of: A list to filter what notification events to receive for this account and its sub accounts. If it is an empty list, then it means that there are no filters for the notifications events to send in each webhook and all events will get sent. + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.url: Optional[str] = payload.get("url") + self.port_in_target_url: Optional[str] = payload.get("port_in_target_url") + self.port_out_target_url: Optional[str] = payload.get("port_out_target_url") + self.notifications_of: Optional[List[str]] = payload.get("notifications_of") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class PortingWebhookConfigurationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PortingWebhookConfigurationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Porting/Configuration/Webhook" + + def create( + self, body: Union[object, object] = values.unset + ) -> PortingWebhookConfigurationInstance: + """ + Create the PortingWebhookConfigurationInstance + + :param body: + + :returns: The created PortingWebhookConfigurationInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PortingWebhookConfigurationInstance(self._version, payload) + + async def create_async( + self, body: Union[object, object] = values.unset + ) -> PortingWebhookConfigurationInstance: + """ + Asynchronously create the PortingWebhookConfigurationInstance + + :param body: + + :returns: The created PortingWebhookConfigurationInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PortingWebhookConfigurationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration_delete.py b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration_delete.py new file mode 100644 index 00000000..11572f18 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration_delete.py @@ -0,0 +1,124 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from twilio.base import values +from twilio.base.instance_context import InstanceContext + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PortingWebhookConfigurationDeleteContext(InstanceContext): + + def __init__( + self, + version: Version, + webhook_type: "PortingWebhookConfigurationDeleteInstance.WebhookType", + ): + """ + Initialize the PortingWebhookConfigurationDeleteContext + + :param version: Version that contains the resource + :param webhook_type: The webhook type for the configuration to be delete. `PORT_IN`, `PORT_OUT` + """ + super().__init__(version) + + # Path Solution + self._solution = { + "webhook_type": webhook_type, + } + self._uri = "/Porting/Configuration/Webhook/{webhook_type}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the PortingWebhookConfigurationDeleteInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PortingWebhookConfigurationDeleteInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class PortingWebhookConfigurationDeleteList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PortingWebhookConfigurationDeleteList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get( + self, webhook_type: "PortingWebhookConfigurationDeleteInstance.WebhookType" + ) -> PortingWebhookConfigurationDeleteContext: + """ + Constructs a PortingWebhookConfigurationDeleteContext + + :param webhook_type: The webhook type for the configuration to be delete. `PORT_IN`, `PORT_OUT` + """ + return PortingWebhookConfigurationDeleteContext( + self._version, webhook_type=webhook_type + ) + + def __call__( + self, webhook_type: "PortingWebhookConfigurationDeleteInstance.WebhookType" + ) -> PortingWebhookConfigurationDeleteContext: + """ + Constructs a PortingWebhookConfigurationDeleteContext + + :param webhook_type: The webhook type for the configuration to be delete. `PORT_IN`, `PORT_OUT` + """ + return PortingWebhookConfigurationDeleteContext( + self._version, webhook_type=webhook_type + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration_fetch.py b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration_fetch.py new file mode 100644 index 00000000..5d381768 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v1/porting_webhook_configuration_fetch.py @@ -0,0 +1,109 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PortingWebhookConfigurationFetchInstance(InstanceResource): + """ + :ivar url: The URL of the webhook configuration request + :ivar port_in_target_url: The complete webhook url that will be called when a notification event for port in request or port in phone number happens + :ivar port_out_target_url: The complete webhook url that will be called when a notification event for a port out phone number happens. + :ivar notifications_of: A list to filter what notification events to receive for this account and its sub accounts. If it is an empty list, then it means that there are no filters for the notifications events to send in each webhook and all events will get sent. + :ivar port_in_target_date_created: Creation date for the port in webhook configuration + :ivar port_out_target_date_created: Creation date for the port out webhook configuration + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.url: Optional[str] = payload.get("url") + self.port_in_target_url: Optional[str] = payload.get("port_in_target_url") + self.port_out_target_url: Optional[str] = payload.get("port_out_target_url") + self.notifications_of: Optional[List[str]] = payload.get("notifications_of") + self.port_in_target_date_created: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("port_in_target_date_created")) + ) + self.port_out_target_date_created: Optional[datetime] = ( + deserialize.iso8601_datetime(payload.get("port_out_target_date_created")) + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class PortingWebhookConfigurationFetchList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PortingWebhookConfigurationFetchList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Porting/Configuration/Webhook" + + def fetch(self) -> PortingWebhookConfigurationFetchInstance: + """ + Asynchronously fetch the PortingWebhookConfigurationFetchInstance + + + :returns: The fetched PortingWebhookConfigurationFetchInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return PortingWebhookConfigurationFetchInstance(self._version, payload) + + async def fetch_async(self) -> PortingWebhookConfigurationFetchInstance: + """ + Asynchronously fetch the PortingWebhookConfigurationFetchInstance + + + :returns: The fetched PortingWebhookConfigurationFetchInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return PortingWebhookConfigurationFetchInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v1/signing_request_configuration.py b/venv/Lib/site-packages/twilio/rest/numbers/v1/signing_request_configuration.py new file mode 100644 index 00000000..fcfcd777 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v1/signing_request_configuration.py @@ -0,0 +1,375 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class SigningRequestConfigurationInstance(InstanceResource): + """ + :ivar logo_sid: The SID of the document that includes the logo that will appear in the LOA. To upload documents follow the following guide: https://www.twilio.com/docs/phone-numbers/regulatory/getting-started/create-new-bundle-public-rest-apis#supporting-document-create + :ivar friendly_name: This is the string that you assigned as a friendly name for describing the creation of the configuration. + :ivar product: The product or service for which is requesting the signature. + :ivar country: The country ISO code to apply the configuration. + :ivar email_subject: Subject of the email that the end client will receive ex: “Twilio Hosting Request”, maximum length of 255 characters. + :ivar email_message: Content of the email that the end client will receive ex: “This is a Hosting request from Twilio, please check the document and sign it”, maximum length of 5,000 characters. + :ivar url_redirection: Url the end client will be redirected after signing a document. + :ivar url: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.logo_sid: Optional[str] = payload.get("logo_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.product: Optional[str] = payload.get("product") + self.country: Optional[str] = payload.get("country") + self.email_subject: Optional[str] = payload.get("email_subject") + self.email_message: Optional[str] = payload.get("email_message") + self.url_redirection: Optional[str] = payload.get("url_redirection") + self.url: Optional[str] = payload.get("url") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class SigningRequestConfigurationPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> SigningRequestConfigurationInstance: + """ + Build an instance of SigningRequestConfigurationInstance + + :param payload: Payload response from the API + """ + return SigningRequestConfigurationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SigningRequestConfigurationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SigningRequestConfigurationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/SigningRequest/Configuration" + + def create( + self, body: Union[object, object] = values.unset + ) -> SigningRequestConfigurationInstance: + """ + Create the SigningRequestConfigurationInstance + + :param body: + + :returns: The created SigningRequestConfigurationInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SigningRequestConfigurationInstance(self._version, payload) + + async def create_async( + self, body: Union[object, object] = values.unset + ) -> SigningRequestConfigurationInstance: + """ + Asynchronously create the SigningRequestConfigurationInstance + + :param body: + + :returns: The created SigningRequestConfigurationInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SigningRequestConfigurationInstance(self._version, payload) + + def stream( + self, + country: Union[str, object] = values.unset, + product: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SigningRequestConfigurationInstance]: + """ + Streams SigningRequestConfigurationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str country: The country ISO code to apply this configuration, this is an optional field, Example: US, MX + :param str product: The product or service for which is requesting the signature, this is an optional field, Example: Porting, Hosting + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + country=country, product=product, page_size=limits["page_size"] + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + country: Union[str, object] = values.unset, + product: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SigningRequestConfigurationInstance]: + """ + Asynchronously streams SigningRequestConfigurationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str country: The country ISO code to apply this configuration, this is an optional field, Example: US, MX + :param str product: The product or service for which is requesting the signature, this is an optional field, Example: Porting, Hosting + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + country=country, product=product, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + country: Union[str, object] = values.unset, + product: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SigningRequestConfigurationInstance]: + """ + Lists SigningRequestConfigurationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str country: The country ISO code to apply this configuration, this is an optional field, Example: US, MX + :param str product: The product or service for which is requesting the signature, this is an optional field, Example: Porting, Hosting + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + country=country, + product=product, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + country: Union[str, object] = values.unset, + product: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SigningRequestConfigurationInstance]: + """ + Asynchronously lists SigningRequestConfigurationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str country: The country ISO code to apply this configuration, this is an optional field, Example: US, MX + :param str product: The product or service for which is requesting the signature, this is an optional field, Example: Porting, Hosting + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + country=country, + product=product, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + country: Union[str, object] = values.unset, + product: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SigningRequestConfigurationPage: + """ + Retrieve a single page of SigningRequestConfigurationInstance records from the API. + Request is executed immediately + + :param country: The country ISO code to apply this configuration, this is an optional field, Example: US, MX + :param product: The product or service for which is requesting the signature, this is an optional field, Example: Porting, Hosting + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SigningRequestConfigurationInstance + """ + data = values.of( + { + "Country": country, + "Product": product, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SigningRequestConfigurationPage(self._version, response) + + async def page_async( + self, + country: Union[str, object] = values.unset, + product: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SigningRequestConfigurationPage: + """ + Asynchronously retrieve a single page of SigningRequestConfigurationInstance records from the API. + Request is executed immediately + + :param country: The country ISO code to apply this configuration, this is an optional field, Example: US, MX + :param product: The product or service for which is requesting the signature, this is an optional field, Example: Porting, Hosting + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SigningRequestConfigurationInstance + """ + data = values.of( + { + "Country": country, + "Product": product, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SigningRequestConfigurationPage(self._version, response) + + def get_page(self, target_url: str) -> SigningRequestConfigurationPage: + """ + Retrieve a specific page of SigningRequestConfigurationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SigningRequestConfigurationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SigningRequestConfigurationPage(self._version, response) + + async def get_page_async(self, target_url: str) -> SigningRequestConfigurationPage: + """ + Asynchronously retrieve a specific page of SigningRequestConfigurationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SigningRequestConfigurationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SigningRequestConfigurationPage(self._version, response) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/__init__.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/__init__.py new file mode 100644 index 00000000..04b30348 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/__init__.py @@ -0,0 +1,75 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.numbers.v2.authorization_document import AuthorizationDocumentList +from twilio.rest.numbers.v2.bulk_hosted_number_order import BulkHostedNumberOrderList +from twilio.rest.numbers.v2.bundle_clone import BundleCloneList +from twilio.rest.numbers.v2.hosted_number_order import HostedNumberOrderList +from twilio.rest.numbers.v2.regulatory_compliance import RegulatoryComplianceList + + +class V2(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V2 version of Numbers + + :param domain: The Twilio.numbers domain + """ + super().__init__(domain, "v2") + self._authorization_documents: Optional[AuthorizationDocumentList] = None + self._bulk_hosted_number_orders: Optional[BulkHostedNumberOrderList] = None + self._bundle_clone: Optional[BundleCloneList] = None + self._hosted_number_orders: Optional[HostedNumberOrderList] = None + self._regulatory_compliance: Optional[RegulatoryComplianceList] = None + + @property + def authorization_documents(self) -> AuthorizationDocumentList: + if self._authorization_documents is None: + self._authorization_documents = AuthorizationDocumentList(self) + return self._authorization_documents + + @property + def bulk_hosted_number_orders(self) -> BulkHostedNumberOrderList: + if self._bulk_hosted_number_orders is None: + self._bulk_hosted_number_orders = BulkHostedNumberOrderList(self) + return self._bulk_hosted_number_orders + + @property + def bundle_clone(self) -> BundleCloneList: + if self._bundle_clone is None: + self._bundle_clone = BundleCloneList(self) + return self._bundle_clone + + @property + def hosted_number_orders(self) -> HostedNumberOrderList: + if self._hosted_number_orders is None: + self._hosted_number_orders = HostedNumberOrderList(self) + return self._hosted_number_orders + + @property + def regulatory_compliance(self) -> RegulatoryComplianceList: + if self._regulatory_compliance is None: + self._regulatory_compliance = RegulatoryComplianceList(self) + return self._regulatory_compliance + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acc47fa185889e5aa80922ce3f1594175c65e4f2 GIT binary patch literal 3831 zcmc&$O>7&-6`tkqic5*IYjAt(yfaAI4Ih$Vp47q>E`G%hqsZq&OnvAuCfEEsjbgLhchI zwL=Vr#a=}H^^0ekX>C~lheSw9h0p4y>8NGfVCv_(qds9(#&wq&>UtB+lv4Hdiwaax z3>3ZJyfF;CdR%ZG45L)6x}~aH;TP06fFHQ{7D`bghS=beTP4u=5~T%{f=PUJA)J?P ziD2I~@PoP$<}7)@$Zmut#8aS$R{qEZS<-c2#DWuJ|)$u}DR))^*Ej=2L&iz1Jj9Uaq;O zUDYj+lWPD21|TLD?TT)qbm?~8-L$#c($R0xF4rrp>OM3b7mau7*3%Dd2k7BvVVN6@ z2gb~udeyMlUCXYrKy`kQ@AzZ(q;Bc1&6{`aO3gC$YFPx8eUAEVKv;6}TNwWujtnD3 z364#~kXUphvP(AL`0S*MF%~zXEU^(WVmq-H!3@Qu(8{2V_h^TNHU-*5k5&=dG-#7O z+F_v`0j=Dl&A?itpc~qW70>LFUrNQZD@03qk+pd*VTe4IBRw!;AS03!3!2|Z&xjiu zzldy+FQF`KNrvgsodvd|RSxYeuwa%O?lY{Xx}qP2DnE zOz>lEUTyfhui6_Sr3IDHd!eRty`uVPkhd)0b-wDeKQM&>UZgRMWTItclXt$q*9FQ$8qspdBQ5I1 z9A<6sVaSCyL}3y*ag;ikMOEGYzIb<`^qB+elsZDh%x=Tsa!Um|o@*<4L8Kh>Wwr{s#WUEs`d3qc|Zjrl?sY`)gyXJCz%vNoUZDt`b9=O#4Y zZIf@)WN74zWJey~yYRbnFXgF&N1yJ-Udq{n5habcw*!38MXJm`~JT#pO+oNvCpe^zuhzFL1F8$+H$a85)i}17H z$B|jjC4Lb)2WL?EC1|~i1NOHy0ZABOyN+{AL$gi(s${-Vu6LB{ZRN({?7gpz{n?Lq z7hk5egUr}Bnb}Tewk^-{3Gn@Y!sb_CK>$7m9ZzEO4m7>6FAXGb>oNczXwBn1JgMJQC%l)9Id(UPoBha26)^}e6c%`FUX)D>o z$s1pt+n@Xq0(?gRoa|&K+w$aF19%>>4fO+fu3t@RT?C;03=6LT&UTb+TbVo5ZvDaC z*A@}*lmM)CGFn^K-WuQwh!vlwZ;<(X-#XeF2gH3X@4p6ls-sM`mHc7u&e!km=RQQp z(*km?lgYK^+?$YL0>5nGUG|JLB`wlo;cfB>w;LurNOg6Cn+&+sR5`0b*@fCH-X)>u zf?pDy1@)0$-ZZQ1e@3*%Zu(EOy#Iu8@@wH+`Dk;#k1&LU(RJa~zc<>7S9b6nk}< mNSBYu^byG(k(DFz*%5i~h&((ZpMIN|m$JJTUlHiUjQ;^PA-^X8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/__pycache__/bulk_hosted_number_order.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/__pycache__/bulk_hosted_number_order.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f317392ea2eb7a4c24f3f2196c1986a910e9e232 GIT binary patch literal 12192 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 OvM=2Ae#YRPcKhFP$~}Pq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/__pycache__/bundle_clone.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/__pycache__/bundle_clone.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af6d260928e75b747024ba3c1f62dd469a156436 GIT binary patch literal 10865 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 H_2vHqXWez% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/__init__.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/__init__.py new file mode 100644 index 00000000..033a32cf --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/__init__.py @@ -0,0 +1,629 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.numbers.v2.authorization_document.dependent_hosted_number_order import ( + DependentHostedNumberOrderList, +) + + +class AuthorizationDocumentInstance(InstanceResource): + + class Status(object): + OPENED = "opened" + SIGNING = "signing" + SIGNED = "signed" + CANCELED = "canceled" + FAILED = "failed" + + """ + :ivar sid: A 34 character string that uniquely identifies this AuthorizationDocument. + :ivar address_sid: A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + :ivar status: + :ivar email: Email that this AuthorizationDocument will be sent to for signing. + :ivar cc_emails: Email recipients who will be informed when an Authorization Document has been sent and signed. + :ivar date_created: The date this resource was created, given as [GMT RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date that this resource was updated, given as [GMT RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar url: + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.address_sid: Optional[str] = payload.get("address_sid") + self.status: Optional["AuthorizationDocumentInstance.Status"] = payload.get( + "status" + ) + self.email: Optional[str] = payload.get("email") + self.cc_emails: Optional[List[str]] = payload.get("cc_emails") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[AuthorizationDocumentContext] = None + + @property + def _proxy(self) -> "AuthorizationDocumentContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AuthorizationDocumentContext for this AuthorizationDocumentInstance + """ + if self._context is None: + self._context = AuthorizationDocumentContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AuthorizationDocumentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AuthorizationDocumentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AuthorizationDocumentInstance": + """ + Fetch the AuthorizationDocumentInstance + + + :returns: The fetched AuthorizationDocumentInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AuthorizationDocumentInstance": + """ + Asynchronous coroutine to fetch the AuthorizationDocumentInstance + + + :returns: The fetched AuthorizationDocumentInstance + """ + return await self._proxy.fetch_async() + + @property + def dependent_hosted_number_orders(self) -> DependentHostedNumberOrderList: + """ + Access the dependent_hosted_number_orders + """ + return self._proxy.dependent_hosted_number_orders + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AuthorizationDocumentContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the AuthorizationDocumentContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this AuthorizationDocument. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/HostedNumber/AuthorizationDocuments/{sid}".format( + **self._solution + ) + + self._dependent_hosted_number_orders: Optional[ + DependentHostedNumberOrderList + ] = None + + def delete(self) -> bool: + """ + Deletes the AuthorizationDocumentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AuthorizationDocumentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AuthorizationDocumentInstance: + """ + Fetch the AuthorizationDocumentInstance + + + :returns: The fetched AuthorizationDocumentInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AuthorizationDocumentInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AuthorizationDocumentInstance: + """ + Asynchronous coroutine to fetch the AuthorizationDocumentInstance + + + :returns: The fetched AuthorizationDocumentInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AuthorizationDocumentInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + @property + def dependent_hosted_number_orders(self) -> DependentHostedNumberOrderList: + """ + Access the dependent_hosted_number_orders + """ + if self._dependent_hosted_number_orders is None: + self._dependent_hosted_number_orders = DependentHostedNumberOrderList( + self._version, + self._solution["sid"], + ) + return self._dependent_hosted_number_orders + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AuthorizationDocumentPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AuthorizationDocumentInstance: + """ + Build an instance of AuthorizationDocumentInstance + + :param payload: Payload response from the API + """ + return AuthorizationDocumentInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AuthorizationDocumentList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AuthorizationDocumentList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/HostedNumber/AuthorizationDocuments" + + def create( + self, + address_sid: str, + email: str, + contact_phone_number: str, + hosted_number_order_sids: List[str], + contact_title: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + ) -> AuthorizationDocumentInstance: + """ + Create the AuthorizationDocumentInstance + + :param address_sid: A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + :param hosted_number_order_sids: A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + :param contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + :param cc_emails: Email recipients who will be informed when an Authorization Document has been sent and signed. + + :returns: The created AuthorizationDocumentInstance + """ + + data = values.of( + { + "AddressSid": address_sid, + "Email": email, + "ContactPhoneNumber": contact_phone_number, + "HostedNumberOrderSids": serialize.map( + hosted_number_order_sids, lambda e: e + ), + "ContactTitle": contact_title, + "CcEmails": serialize.map(cc_emails, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthorizationDocumentInstance(self._version, payload) + + async def create_async( + self, + address_sid: str, + email: str, + contact_phone_number: str, + hosted_number_order_sids: List[str], + contact_title: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + ) -> AuthorizationDocumentInstance: + """ + Asynchronously create the AuthorizationDocumentInstance + + :param address_sid: A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + :param hosted_number_order_sids: A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + :param contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + :param cc_emails: Email recipients who will be informed when an Authorization Document has been sent and signed. + + :returns: The created AuthorizationDocumentInstance + """ + + data = values.of( + { + "AddressSid": address_sid, + "Email": email, + "ContactPhoneNumber": contact_phone_number, + "HostedNumberOrderSids": serialize.map( + hosted_number_order_sids, lambda e: e + ), + "ContactTitle": contact_title, + "CcEmails": serialize.map(cc_emails, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthorizationDocumentInstance(self._version, payload) + + def stream( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AuthorizationDocumentInstance]: + """ + Streams AuthorizationDocumentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str email: Email that this AuthorizationDocument will be sent to for signing. + :param "AuthorizationDocumentInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(email=email, status=status, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AuthorizationDocumentInstance]: + """ + Asynchronously streams AuthorizationDocumentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str email: Email that this AuthorizationDocument will be sent to for signing. + :param "AuthorizationDocumentInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + email=email, status=status, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthorizationDocumentInstance]: + """ + Lists AuthorizationDocumentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str email: Email that this AuthorizationDocument will be sent to for signing. + :param "AuthorizationDocumentInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + email=email, + status=status, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthorizationDocumentInstance]: + """ + Asynchronously lists AuthorizationDocumentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str email: Email that this AuthorizationDocument will be sent to for signing. + :param "AuthorizationDocumentInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + email=email, + status=status, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthorizationDocumentPage: + """ + Retrieve a single page of AuthorizationDocumentInstance records from the API. + Request is executed immediately + + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthorizationDocumentInstance + """ + data = values.of( + { + "Email": email, + "Status": status, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthorizationDocumentPage(self._version, response) + + async def page_async( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthorizationDocumentPage: + """ + Asynchronously retrieve a single page of AuthorizationDocumentInstance records from the API. + Request is executed immediately + + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthorizationDocumentInstance + """ + data = values.of( + { + "Email": email, + "Status": status, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthorizationDocumentPage(self._version, response) + + def get_page(self, target_url: str) -> AuthorizationDocumentPage: + """ + Retrieve a specific page of AuthorizationDocumentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthorizationDocumentInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AuthorizationDocumentPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AuthorizationDocumentPage: + """ + Asynchronously retrieve a specific page of AuthorizationDocumentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthorizationDocumentInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AuthorizationDocumentPage(self._version, response) + + def get(self, sid: str) -> AuthorizationDocumentContext: + """ + Constructs a AuthorizationDocumentContext + + :param sid: A 34 character string that uniquely identifies this AuthorizationDocument. + """ + return AuthorizationDocumentContext(self._version, sid=sid) + + def __call__(self, sid: str) -> AuthorizationDocumentContext: + """ + Constructs a AuthorizationDocumentContext + + :param sid: A 34 character string that uniquely identifies this AuthorizationDocument. + """ + return AuthorizationDocumentContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1172387d274149865145103f5cffded8bbd3c37 GIT binary patch literal 30327 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 S{M>Fi<;0Eu6M=r&g#It!^tI0b literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/__pycache__/dependent_hosted_number_order.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/authorization_document/__pycache__/dependent_hosted_number_order.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e1fe63d6bae61a92bf37d7b6594bc7983914133 GIT binary patch literal 22732 zcmeHPYiu0Hec!$J9gh!@6eUs*uR=-GiR6)b%akmM7HOLiP06IBxU}N)>2@g|b+7E+ zNhU?QuA@2au3N1yup z&+IOj?D@_ot#MznI|IGY%cK+{~`_IzSfPm}GpS(1<{dqz7FDjUq+sMrRGcwl& zS?CvJQFbK6q}VTtly@c^NoT(^>FReS-Tm&Qr{9zG_Is1QeqYkx?`JTsL?BtxUy=;= z2U*#jC{332m$AGjQJ$>muV8s^VpX!TzmnyBiK=9Ef3+w$gr^1Be_4QU(MV8JE z)8j}aBF+7y3aW}wLw4uMqM`w11EGGXStPmRDAfd2sDPa+YjVMR)4$k8*X z;kihpg>ptGyt>8eH!{i^b5H{go%1dUn9xP>tCY}yXUu*jiN@gnP53hbK1~ z=)SHjErztJm$qxeshC*|IrI`)(G)cvO~gkO-E$$D$SE57ujoo?*=Q=J^eS39r^Xc2 z1*vme*?St(hwkynbs~CBiSaeeQ;$)Y?MLPtATdSg7eQtYwv~`aQC{-z$6ieX_UTKkN(n z?}wHjC)}5fW^5JZ=ibyqVWXUlt*LqA)8g@Yq_|JR|^GnUnG)>CY4A;4@4r#w46&&J{XC7 z4NJs$;_K}^+SzrwvqSft?(FS)stdW26P-OBT|G}nx{tT(l}Foqd%HS&BPV)~AMNbx zL%r@ldi>cF-JK@^>v^iZs~h+7_M<1ej`u`*JD)q%)!W%IASY&vu1LOLE(+Oev$XD%qI3un6HXU}NytkRr`#?E7bXlJsFs9ID-%eJIA z{k2@!*#Zh0OsnycD7|e&PRDXdbkZW5A2u?`zHEdyiKOY2KZ{qo=c+*&FqA=D@b%bWeapalZLt1j zV0|`NCf^BuiFfncU`v+iH(-MeE(2R)gDqVKHfVz_GhwrjnYkg!%+1}Gc$-qQC-aV# zu*z)pnR+ZUdou6nvC`~u2`tKOuvN>zR@h*PM%lGQzpHGptCxYTw87Sxu(Eg585i*e zYs{KqAyn0)J3+hp+OxUDdB#SFtcjn31rb&2{*>}Ea#y;Bg%-! z=TrsAL^UvU$2Zr!CRi2=2N9+Cv+6X=gbn5q+r zXvDBcv3phBLXV$7GSc`Eve$e^8e4k}toPGbg?k>sUv||yf2KA2%*+nB@-pLk4loU;ZxJQPE*58d4L?4 zIB@%w>Bgt1qIPjb)2>^`CXU@HpKf}FAnNW0tKK?x_1L&?I=HFe6#S)clwhdvo?9X@=bnhFvY@VaLG-0ie$ ztpjAEjUi>88z zZ1yQ6#{?16F)Dl&3h)`c_?S56kcDECGb)ZcZW>ebE%CZ23U91)3B%&wJ1>eM$B6sV z*b|q=dZ3$o2GVLWnhiO1N4QlN&+Fm^jiw%`FbccxKS+ki%Nh01$f1X#Gn$J?Bz!QD zjztsNp|I6nLAM%-w*MjG`$=8j`yIF2Z+~rk-@Aw2Ido&wjpt_8wM^CZ{aPah=C#K* zi6f66nvR8#dP^hZ8zU|sJyvLo6ANBmOXXfCEse>n`5BC1Fu5Y@s z?}|5H{^gnS=cdY^11*9N~=Zd_NUj$`<U8x5YV%^9m4(Fl6G27Um_3G)>=km_{ggfOF(kiw8WJizj3$nv&v%B`l=} zq^0pSO-&nT$VAm>QZj6cHt7U6F2G5&Ogg0zqev&2kq=jaH7pZ{A(7vl>}z7t8Wsv$ z>&E(KlQVB^2O--b=egbfp!H328@2-{F%cRGV@S*jp<-t~Sn<}gSD(fD&2QTB-HqSg zINAEt)TXEJd0n)aUB+Ub$Hiz?*+-$7z79SFG&_+U+4&n$IH7h(tw%$wZz5y1zB!{} zR4~%8^fzGdWfJ%$G@d2HgVAh7hsaiOPsqQ30vWxjy#VC&M$26NBT9(q7%F`IZ=vF8 zGdYipM(WdLq2LMy{h=gzYDbk-p@=etLD*8B}ye0m6gmZAr3H5Ay;80R{t)% zb8#Ggi!)J;nW&LhD=vzVK(nZUHnGN5UW4*lJR?nGE%LR@Ra^(@Ui%<@gM8cEC?)$h zMxxBTNFigQ?PX*Z`1+iSeSI<%bLNMzbQT9JnIX%!W_Als>57wmQ$#oUj`&UTWLQsz zogsG=F()4Bf#xoC!Jg+{d!|AxEfnd+7AYl$KG7zf=B`il5zQia1oH+81nUuM3UmBh znn@eiXNtK-+oX1B*KR2`2#qI(P=kcIgy)3!noGsuZAlDEu&7d5a)$E(;D?q>SFeOn zN;(!NXNPn#o*hI>L}M2D^Nk=3y+2csM!wQwhiPfI`;j{gH?r1psTj^xP_f+^56* zJY;U_?nFEp&+7gRR4#b3MiliZs$+ILnbaq?^1p`+nWaOxFT95Av|>CQb&q;X<8;i6 zc0@x9E;3+8oujT%uce6_P-DI&MzZ5(^fu~4dnf4_=6GbwM=yfhtd-lBg;y=9J%siS zP<5x|`vw`w+-8Nzj(b=LEVX*Qy&5*#rSzJLOglKW%`QNk5p*_aHNg}jlX&3$!~ z^JZ1a?%xI1O-Y?Q_U@*R;o%|X$(~F64KUFZ55)!mz837Pl7&Z$jw>Jgi+;kW|s#a9s@(cs4xX6ji8qX{<` zyey7l$z1kGjp8}f2W&|a^b&fp2MeVHMsetZLfDftqt+A_PGv)PD<@N7% z+}L`1%|y#|dE2C~jj1Jzw2ZG~+}VFaVmiQoJDSGVvF+p%^p|frt~+0MyM^Ca^Ki}A zJoX81)H4UXJNmj^17W*v2Gw*bozo!x`Gl`1Br6JuwxW=5tzbnVSy4z<6cWjkUFAPEGoRDZn3)d zdgNMU3EiS*3v`Q`z$c3ojL=kh=*H&Tp4%7SFP|s!o z{+R1uHzPMs>!7`3ko>~zlSmds5vhK`WqB*$+4#PA6T+RYn{dg|1)qZ>T5Xs3Gz*_o zz$eH%WT};>Qi=F^vJOc(+!ku$Hr+h?UV-|k!uBQ~8Z>+IKu9k!1@R?QVTb9NO@Uo(*^u85%5OiK-`JS1 zS(mS?FO&+UYi9*-Y1ypPPuo8H=C%*J7oH*n%yxeb8OwGzq#~-UtGN7x{q3;Z-#dl3 zyfMc)?DyGaK5-eAxp&li&GAMM7IroM{Cfd2=Iui&vfM?1+1<`)yO$Il1M;>rYup3a}IZ&Jj7PObp8MliM2@Q=iTlYd*bfEP3K@^m!$vmoP5@kA21H z{msj=qJ4N7yA@q**S=i`ps4>}S?9jSd~>^ai?x&;GS2qgH1vuwzw8?I%Wm47QGEYQ zvEBZ%2e5YBjd#Ef0{{2DH)-bvuCYLtj<~R^c;BM|)CWzNxw~y2u`l`}y0bLWUYxm! zBibiL5rImbLyVH9lOkzLD{N+@-7?(myM^bx0=@hs6Gh#Wmz7wK;=S=?66c4pmnJc6 zi)tCWcUD662)aLV>HlcM^uN=l_-`RR&zKQoOth>1oN|(Ql!T+ybZE!e@1W43eTxF^ z0dvm9cuOO0ZaC9;fE%Qw#c>jQn8o~K3EHv)w;SlGXm=D-ULyX^1IbNh0G&ns_q5t* z(uy?GTRa>;uyC00^3%&DwyhOAv1k_ygt%eoVL=5!BZLYnR!MAREQ4`J*QBh?-00TvEtVQlp!RPl}WN06H+ zSz0!01ev9TV(z*N#}T9IpHdbl@cAhVjkvift#RikWd=~Wtht=QtQ;U2{bzuNxx8Db zsG;!p-8w1%SR>iWQgePoLw;?2e*Kn@%6()hL-Jm6-CHYE)m{%>3yr@x*?eMh{d3cm zy;r<<*N3lo-}X)UYVTI9x&FkpCuXX)OjT{kSFIhF-;KW$zwNqn4k!Gox6TTV>cABr z&g@l$Z^*Zj6UjTz|2X^auYCB*bouE?-)SB}w@WgT!psWa40O2_{$P3f`yh$o8}QkE z17Cz>hUZ`l^Aq@^NxOtz;3oiGt_bWusJ(S70-GOCe>D5)h?7SC&;_=70bE)grDTkf zS19>oN?xVpPmuH&0#SXPYG{L)O6SZLNJRA;s4Fhl2zprylzj~rj#)$Uj*;Ocflz||p?`(PjgI5J*1q-03h~2j;*({r4?~pK z0}%9df)T37ytARSgPfwbv)@6oQVS=${u z+=U^M&I>M^t>}o>;wxBco!wTd*r$5Ctu3*}=2Fxe zTOk?3Uyz#1h$H0TyCpqx8b5>q9g}a|*1g8iHf_<#wMA0d)T>D59d*}zv}S1iKj;`K zbJLiB?+}U5Z%|-YWTjBOmMd-zQ&kN!RpF_s@J!X-sj9uVb9aWOtGcfEepcSRw8~~* zcC=8L%JySqtiTEK3$J4Ckk7JM7lvBCh{bEEQ_ko%`yzgTI<>NJe{XIVuwQee?pRizyJreu9`!G4W$e@+P@ul7-L z5{dm+9cW9oO37t<@HWgA{HjC2RpAc2=Pd}h-O)a#TcHVl;J3Q3cIO*++&VaMFu(uM zkAgo8=9_lj>YnJ%KUSZwZ}_OH!F}Lv#p--;-<_Jt;9(pVTNNm{QCSEGYu4igd(HT< zshVwt5~>Ocn?pCMZVcR5H&wrp6@lGLOE4ov-jF@=hd;oDk_0T zqMK_^6lkPEwGgPBtlT~2-!r?K%KhTQ;n*$~L$Y05j3w$8p^3Uhc%sgZD2jGWQ3R@M zCf7VZWYQSorNZpBgmMe~Wug_u&+0z|250iIMfhbEQgu%r@@ESoHAo$~LPT}|cZ zA96m6;MjoXi@y0H90_Uxj#M>=BbDZGq>>#+DlapSp_W_gC)Ve;x87=+Xv%L3-wI9y zKU&@F{z{Q0K(z~zW_1f@menmlo7GhatLw(=$1jXGPE~I$tYUSQLe0AIUGI6u4@|9Y zC{(e!YN5JzylQ-4d>uSA1%^$bMhI-1UBey^Jb2oFA7AN3F@VW^Zx`Z5xKB2A&9Y2k zEfsHQM)kf^W;Op+3+%_Ve$|3lR1bc0%p0MfO$47MJshgqa0W3C{@WU)^l*+yoRc$B z#yN>!>Ltc;yt7gKv}6eZFz4U~TXop{c@zAK4?oeRmQvGNI}D4kS str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class DependentHostedNumberOrderPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> DependentHostedNumberOrderInstance: + """ + Build an instance of DependentHostedNumberOrderInstance + + :param payload: Payload response from the API + """ + return DependentHostedNumberOrderInstance( + self._version, + payload, + signing_document_sid=self._solution["signing_document_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DependentHostedNumberOrderList(ListResource): + + def __init__(self, version: Version, signing_document_sid: str): + """ + Initialize the DependentHostedNumberOrderList + + :param version: Version that contains the resource + :param signing_document_sid: A 34 character string that uniquely identifies the LOA document associated with this HostedNumberOrder. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "signing_document_sid": signing_document_sid, + } + self._uri = "/HostedNumber/AuthorizationDocuments/{signing_document_sid}/DependentHostedNumberOrders".format( + **self._solution + ) + + def stream( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DependentHostedNumberOrderInstance]: + """ + Streams DependentHostedNumberOrderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "DependentHostedNumberOrderInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 128 characters. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DependentHostedNumberOrderInstance]: + """ + Asynchronously streams DependentHostedNumberOrderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "DependentHostedNumberOrderInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 128 characters. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DependentHostedNumberOrderInstance]: + """ + Lists DependentHostedNumberOrderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "DependentHostedNumberOrderInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 128 characters. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DependentHostedNumberOrderInstance]: + """ + Asynchronously lists DependentHostedNumberOrderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "DependentHostedNumberOrderInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 128 characters. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DependentHostedNumberOrderPage: + """ + Retrieve a single page of DependentHostedNumberOrderInstance records from the API. + Request is executed immediately + + :param status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param friendly_name: A human readable description of this resource, up to 128 characters. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DependentHostedNumberOrderInstance + """ + data = values.of( + { + "Status": status, + "PhoneNumber": phone_number, + "IncomingPhoneNumberSid": incoming_phone_number_sid, + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DependentHostedNumberOrderPage(self._version, response, self._solution) + + async def page_async( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DependentHostedNumberOrderPage: + """ + Asynchronously retrieve a single page of DependentHostedNumberOrderInstance records from the API. + Request is executed immediately + + :param status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param friendly_name: A human readable description of this resource, up to 128 characters. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DependentHostedNumberOrderInstance + """ + data = values.of( + { + "Status": status, + "PhoneNumber": phone_number, + "IncomingPhoneNumberSid": incoming_phone_number_sid, + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DependentHostedNumberOrderPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DependentHostedNumberOrderPage: + """ + Retrieve a specific page of DependentHostedNumberOrderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DependentHostedNumberOrderInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DependentHostedNumberOrderPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DependentHostedNumberOrderPage: + """ + Asynchronously retrieve a specific page of DependentHostedNumberOrderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DependentHostedNumberOrderInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DependentHostedNumberOrderPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/bulk_hosted_number_order.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/bulk_hosted_number_order.py new file mode 100644 index 00000000..7259c801 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/bulk_hosted_number_order.py @@ -0,0 +1,305 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class BulkHostedNumberOrderInstance(InstanceResource): + + class RequestStatus(object): + QUEUED = "QUEUED" + IN_PROGRESS = "IN_PROGRESS" + PROCESSED = "PROCESSED" + + """ + :ivar bulk_hosting_sid: A 34 character string that uniquely identifies this BulkHostedNumberOrder. + :ivar request_status: + :ivar friendly_name: A 128 character string that is a human-readable text that describes this resource. + :ivar notification_email: Email address used for send notifications about this Bulk hosted number request. + :ivar date_created: The date this resource was created, given as [GMT RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_completed: The date that this resource was completed, given as [GMT RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar url: The URL of this BulkHostedNumberOrder resource. + :ivar total_count: The total count of phone numbers in this Bulk hosting request. + :ivar results: Contains a list of all the individual hosting orders and their information, for this Bulk request. Each result object is grouped by its order status. To see a complete list of order status, please check 'https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/hosted-number-order-resource#status-values'. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + bulk_hosting_sid: Optional[str] = None, + ): + super().__init__(version) + + self.bulk_hosting_sid: Optional[str] = payload.get("bulk_hosting_sid") + self.request_status: Optional["BulkHostedNumberOrderInstance.RequestStatus"] = ( + payload.get("request_status") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.notification_email: Optional[str] = payload.get("notification_email") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_completed: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_completed") + ) + self.url: Optional[str] = payload.get("url") + self.total_count: Optional[int] = deserialize.integer( + payload.get("total_count") + ) + self.results: Optional[List[Dict[str, object]]] = payload.get("results") + + self._solution = { + "bulk_hosting_sid": bulk_hosting_sid or self.bulk_hosting_sid, + } + self._context: Optional[BulkHostedNumberOrderContext] = None + + @property + def _proxy(self) -> "BulkHostedNumberOrderContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: BulkHostedNumberOrderContext for this BulkHostedNumberOrderInstance + """ + if self._context is None: + self._context = BulkHostedNumberOrderContext( + self._version, + bulk_hosting_sid=self._solution["bulk_hosting_sid"], + ) + return self._context + + def fetch( + self, order_status: Union[str, object] = values.unset + ) -> "BulkHostedNumberOrderInstance": + """ + Fetch the BulkHostedNumberOrderInstance + + :param order_status: Order status can be used for filtering on Hosted Number Order status values. To see a complete list of order statuses, please check 'https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/hosted-number-order-resource#status-values'. + + :returns: The fetched BulkHostedNumberOrderInstance + """ + return self._proxy.fetch( + order_status=order_status, + ) + + async def fetch_async( + self, order_status: Union[str, object] = values.unset + ) -> "BulkHostedNumberOrderInstance": + """ + Asynchronous coroutine to fetch the BulkHostedNumberOrderInstance + + :param order_status: Order status can be used for filtering on Hosted Number Order status values. To see a complete list of order statuses, please check 'https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/hosted-number-order-resource#status-values'. + + :returns: The fetched BulkHostedNumberOrderInstance + """ + return await self._proxy.fetch_async( + order_status=order_status, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BulkHostedNumberOrderContext(InstanceContext): + + def __init__(self, version: Version, bulk_hosting_sid: str): + """ + Initialize the BulkHostedNumberOrderContext + + :param version: Version that contains the resource + :param bulk_hosting_sid: A 34 character string that uniquely identifies this BulkHostedNumberOrder. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "bulk_hosting_sid": bulk_hosting_sid, + } + self._uri = "/HostedNumber/Orders/Bulk/{bulk_hosting_sid}".format( + **self._solution + ) + + def fetch( + self, order_status: Union[str, object] = values.unset + ) -> BulkHostedNumberOrderInstance: + """ + Fetch the BulkHostedNumberOrderInstance + + :param order_status: Order status can be used for filtering on Hosted Number Order status values. To see a complete list of order statuses, please check 'https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/hosted-number-order-resource#status-values'. + + :returns: The fetched BulkHostedNumberOrderInstance + """ + + data = values.of( + { + "OrderStatus": order_status, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return BulkHostedNumberOrderInstance( + self._version, + payload, + bulk_hosting_sid=self._solution["bulk_hosting_sid"], + ) + + async def fetch_async( + self, order_status: Union[str, object] = values.unset + ) -> BulkHostedNumberOrderInstance: + """ + Asynchronous coroutine to fetch the BulkHostedNumberOrderInstance + + :param order_status: Order status can be used for filtering on Hosted Number Order status values. To see a complete list of order statuses, please check 'https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/hosted-number-order-resource#status-values'. + + :returns: The fetched BulkHostedNumberOrderInstance + """ + + data = values.of( + { + "OrderStatus": order_status, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return BulkHostedNumberOrderInstance( + self._version, + payload, + bulk_hosting_sid=self._solution["bulk_hosting_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BulkHostedNumberOrderList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the BulkHostedNumberOrderList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/HostedNumber/Orders/Bulk" + + def create( + self, body: Union[object, object] = values.unset + ) -> BulkHostedNumberOrderInstance: + """ + Create the BulkHostedNumberOrderInstance + + :param body: + + :returns: The created BulkHostedNumberOrderInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BulkHostedNumberOrderInstance(self._version, payload) + + async def create_async( + self, body: Union[object, object] = values.unset + ) -> BulkHostedNumberOrderInstance: + """ + Asynchronously create the BulkHostedNumberOrderInstance + + :param body: + + :returns: The created BulkHostedNumberOrderInstance + """ + data = body.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BulkHostedNumberOrderInstance(self._version, payload) + + def get(self, bulk_hosting_sid: str) -> BulkHostedNumberOrderContext: + """ + Constructs a BulkHostedNumberOrderContext + + :param bulk_hosting_sid: A 34 character string that uniquely identifies this BulkHostedNumberOrder. + """ + return BulkHostedNumberOrderContext( + self._version, bulk_hosting_sid=bulk_hosting_sid + ) + + def __call__(self, bulk_hosting_sid: str) -> BulkHostedNumberOrderContext: + """ + Constructs a BulkHostedNumberOrderContext + + :param bulk_hosting_sid: A 34 character string that uniquely identifies this BulkHostedNumberOrder. + """ + return BulkHostedNumberOrderContext( + self._version, bulk_hosting_sid=bulk_hosting_sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/bundle_clone.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/bundle_clone.py new file mode 100644 index 00000000..820fbc9d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/bundle_clone.py @@ -0,0 +1,268 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class BundleCloneInstance(InstanceResource): + + class Status(object): + DRAFT = "draft" + PENDING_REVIEW = "pending-review" + IN_REVIEW = "in-review" + TWILIO_REJECTED = "twilio-rejected" + TWILIO_APPROVED = "twilio-approved" + PROVISIONALLY_APPROVED = "provisionally-approved" + + """ + :ivar bundle_sid: The unique string that we created to identify the Bundle resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Bundle resource. + :ivar regulation_sid: The unique string of a regulation that is associated to the Bundle resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar status: + :ivar valid_until: The date and time in GMT in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format when the resource will be valid until. + :ivar email: The email address that will receive updates when the Bundle resource changes status. + :ivar status_callback: The URL we call to inform your application of status changes. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The URL of this resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + bundle_sid: Optional[str] = None, + ): + super().__init__(version) + + self.bundle_sid: Optional[str] = payload.get("bundle_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.regulation_sid: Optional[str] = payload.get("regulation_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.status: Optional["BundleCloneInstance.Status"] = payload.get("status") + self.valid_until: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("valid_until") + ) + self.email: Optional[str] = payload.get("email") + self.status_callback: Optional[str] = payload.get("status_callback") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "bundle_sid": bundle_sid or self.bundle_sid, + } + self._context: Optional[BundleCloneContext] = None + + @property + def _proxy(self) -> "BundleCloneContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: BundleCloneContext for this BundleCloneInstance + """ + if self._context is None: + self._context = BundleCloneContext( + self._version, + bundle_sid=self._solution["bundle_sid"], + ) + return self._context + + def create( + self, + target_account_sid: str, + move_to_draft: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "BundleCloneInstance": + """ + Create the BundleCloneInstance + + :param target_account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) where the bundle needs to be cloned. + :param move_to_draft: If set to true, the cloned bundle will be in the DRAFT state, else it will be twilio-approved + :param friendly_name: The string that you assigned to describe the cloned bundle. + + :returns: The created BundleCloneInstance + """ + return self._proxy.create( + target_account_sid, + move_to_draft=move_to_draft, + friendly_name=friendly_name, + ) + + async def create_async( + self, + target_account_sid: str, + move_to_draft: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "BundleCloneInstance": + """ + Asynchronous coroutine to create the BundleCloneInstance + + :param target_account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) where the bundle needs to be cloned. + :param move_to_draft: If set to true, the cloned bundle will be in the DRAFT state, else it will be twilio-approved + :param friendly_name: The string that you assigned to describe the cloned bundle. + + :returns: The created BundleCloneInstance + """ + return await self._proxy.create_async( + target_account_sid, + move_to_draft=move_to_draft, + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BundleCloneContext(InstanceContext): + + def __init__(self, version: Version, bundle_sid: str): + """ + Initialize the BundleCloneContext + + :param version: Version that contains the resource + :param bundle_sid: The unique string that identifies the Bundle to be cloned. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "bundle_sid": bundle_sid, + } + self._uri = "/RegulatoryCompliance/Bundles/{bundle_sid}/Clones".format( + **self._solution + ) + + def create( + self, + target_account_sid: str, + move_to_draft: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> BundleCloneInstance: + """ + Create the BundleCloneInstance + + :param target_account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) where the bundle needs to be cloned. + :param move_to_draft: If set to true, the cloned bundle will be in the DRAFT state, else it will be twilio-approved + :param friendly_name: The string that you assigned to describe the cloned bundle. + + :returns: The created BundleCloneInstance + """ + data = values.of( + { + "TargetAccountSid": target_account_sid, + "MoveToDraft": serialize.boolean_to_string(move_to_draft), + "FriendlyName": friendly_name, + } + ) + + payload = self._version.create(method="POST", uri=self._uri, data=data) + + return BundleCloneInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + async def create_async( + self, + target_account_sid: str, + move_to_draft: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> BundleCloneInstance: + """ + Asynchronous coroutine to create the BundleCloneInstance + + :param target_account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) where the bundle needs to be cloned. + :param move_to_draft: If set to true, the cloned bundle will be in the DRAFT state, else it will be twilio-approved + :param friendly_name: The string that you assigned to describe the cloned bundle. + + :returns: The created BundleCloneInstance + """ + data = values.of( + { + "TargetAccountSid": target_account_sid, + "MoveToDraft": serialize.boolean_to_string(move_to_draft), + "FriendlyName": friendly_name, + } + ) + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data + ) + + return BundleCloneInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BundleCloneList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the BundleCloneList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, bundle_sid: str) -> BundleCloneContext: + """ + Constructs a BundleCloneContext + + :param bundle_sid: The unique string that identifies the Bundle to be cloned. + """ + return BundleCloneContext(self._version, bundle_sid=bundle_sid) + + def __call__(self, bundle_sid: str) -> BundleCloneContext: + """ + Constructs a BundleCloneContext + + :param bundle_sid: The unique string that identifies the Bundle to be cloned. + """ + return BundleCloneContext(self._version, bundle_sid=bundle_sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/hosted_number_order.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/hosted_number_order.py new file mode 100644 index 00000000..6afa755b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/hosted_number_order.py @@ -0,0 +1,887 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class HostedNumberOrderInstance(InstanceResource): + + class Status(object): + TWILIO_PROCESSING = "twilio-processing" + RECEIVED = "received" + PENDING_VERIFICATION = "pending-verification" + VERIFIED = "verified" + PENDING_LOA = "pending-loa" + CARRIER_PROCESSING = "carrier-processing" + TESTING = "testing" + COMPLETED = "completed" + FAILED = "failed" + ACTION_REQUIRED = "action-required" + + class VerificationType(object): + PHONE_CALL = "phone-call" + + """ + :ivar sid: A 34 character string that uniquely identifies this HostedNumberOrder. + :ivar account_sid: A 34 character string that uniquely identifies the account. + :ivar incoming_phone_number_sid: A 34 character string that uniquely identifies the [IncomingPhoneNumber](https://www.twilio.com/docs/phone-numbers/api/incomingphonenumber-resource) resource that represents the phone number being hosted. + :ivar address_sid: A 34 character string that uniquely identifies the Address resource that represents the address of the owner of this phone number. + :ivar signing_document_sid: A 34 character string that uniquely identifies the [Authorization Document](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource) the user needs to sign. + :ivar phone_number: Phone number to be hosted. This must be in [E.164](https://en.wikipedia.org/wiki/E.164) format, e.g., +16175551212 + :ivar capabilities: + :ivar friendly_name: A 128 character string that is a human-readable text that describes this resource. + :ivar status: + :ivar failure_reason: A message that explains why a hosted_number_order went to status \"action-required\" + :ivar date_created: The date this resource was created, given as [GMT RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date that this resource was updated, given as [GMT RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar email: Email of the owner of this phone number that is being hosted. + :ivar cc_emails: A list of emails that LOA document for this HostedNumberOrder will be carbon copied to. + :ivar url: The URL of this HostedNumberOrder. + :ivar contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + :ivar contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + :ivar bulk_hosting_request_sid: A 34 character string that uniquely identifies the bulk hosting request associated with this HostedNumberOrder. + :ivar next_step: The next step you need to take to complete the hosted number order and request it successfully. + :ivar verification_attempts: The number of attempts made to verify ownership via a call for the hosted phone number. + :ivar verification_call_sids: The Call SIDs that identify the calls placed to verify ownership. + :ivar verification_call_delay: The number of seconds to wait before initiating the ownership verification call. Can be a value between 0 and 60, inclusive. + :ivar verification_call_extension: The numerical extension to dial when making the ownership verification call. + :ivar verification_code: The digits the user must pass in the ownership verification call. + :ivar verification_type: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.incoming_phone_number_sid: Optional[str] = payload.get( + "incoming_phone_number_sid" + ) + self.address_sid: Optional[str] = payload.get("address_sid") + self.signing_document_sid: Optional[str] = payload.get("signing_document_sid") + self.phone_number: Optional[str] = payload.get("phone_number") + self.capabilities: Optional[str] = payload.get("capabilities") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.status: Optional["HostedNumberOrderInstance.Status"] = payload.get( + "status" + ) + self.failure_reason: Optional[str] = payload.get("failure_reason") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.email: Optional[str] = payload.get("email") + self.cc_emails: Optional[List[str]] = payload.get("cc_emails") + self.url: Optional[str] = payload.get("url") + self.contact_title: Optional[str] = payload.get("contact_title") + self.contact_phone_number: Optional[str] = payload.get("contact_phone_number") + self.bulk_hosting_request_sid: Optional[str] = payload.get( + "bulk_hosting_request_sid" + ) + self.next_step: Optional[str] = payload.get("next_step") + self.verification_attempts: Optional[int] = deserialize.integer( + payload.get("verification_attempts") + ) + self.verification_call_sids: Optional[List[str]] = payload.get( + "verification_call_sids" + ) + self.verification_call_delay: Optional[int] = deserialize.integer( + payload.get("verification_call_delay") + ) + self.verification_call_extension: Optional[str] = payload.get( + "verification_call_extension" + ) + self.verification_code: Optional[str] = payload.get("verification_code") + self.verification_type: Optional[ + "HostedNumberOrderInstance.VerificationType" + ] = payload.get("verification_type") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[HostedNumberOrderContext] = None + + @property + def _proxy(self) -> "HostedNumberOrderContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: HostedNumberOrderContext for this HostedNumberOrderInstance + """ + if self._context is None: + self._context = HostedNumberOrderContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the HostedNumberOrderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the HostedNumberOrderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "HostedNumberOrderInstance": + """ + Fetch the HostedNumberOrderInstance + + + :returns: The fetched HostedNumberOrderInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "HostedNumberOrderInstance": + """ + Asynchronous coroutine to fetch the HostedNumberOrderInstance + + + :returns: The fetched HostedNumberOrderInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + status: "HostedNumberOrderInstance.Status", + verification_call_delay: Union[int, object] = values.unset, + verification_call_extension: Union[str, object] = values.unset, + ) -> "HostedNumberOrderInstance": + """ + Update the HostedNumberOrderInstance + + :param status: + :param verification_call_delay: The number of seconds to wait before initiating the ownership verification call. Can be a value between 0 and 60, inclusive. + :param verification_call_extension: The numerical extension to dial when making the ownership verification call. + + :returns: The updated HostedNumberOrderInstance + """ + return self._proxy.update( + status=status, + verification_call_delay=verification_call_delay, + verification_call_extension=verification_call_extension, + ) + + async def update_async( + self, + status: "HostedNumberOrderInstance.Status", + verification_call_delay: Union[int, object] = values.unset, + verification_call_extension: Union[str, object] = values.unset, + ) -> "HostedNumberOrderInstance": + """ + Asynchronous coroutine to update the HostedNumberOrderInstance + + :param status: + :param verification_call_delay: The number of seconds to wait before initiating the ownership verification call. Can be a value between 0 and 60, inclusive. + :param verification_call_extension: The numerical extension to dial when making the ownership verification call. + + :returns: The updated HostedNumberOrderInstance + """ + return await self._proxy.update_async( + status=status, + verification_call_delay=verification_call_delay, + verification_call_extension=verification_call_extension, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class HostedNumberOrderContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the HostedNumberOrderContext + + :param version: Version that contains the resource + :param sid: The SID of the HostedNumberOrder resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/HostedNumber/Orders/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the HostedNumberOrderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the HostedNumberOrderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> HostedNumberOrderInstance: + """ + Fetch the HostedNumberOrderInstance + + + :returns: The fetched HostedNumberOrderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return HostedNumberOrderInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> HostedNumberOrderInstance: + """ + Asynchronous coroutine to fetch the HostedNumberOrderInstance + + + :returns: The fetched HostedNumberOrderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return HostedNumberOrderInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + status: "HostedNumberOrderInstance.Status", + verification_call_delay: Union[int, object] = values.unset, + verification_call_extension: Union[str, object] = values.unset, + ) -> HostedNumberOrderInstance: + """ + Update the HostedNumberOrderInstance + + :param status: + :param verification_call_delay: The number of seconds to wait before initiating the ownership verification call. Can be a value between 0 and 60, inclusive. + :param verification_call_extension: The numerical extension to dial when making the ownership verification call. + + :returns: The updated HostedNumberOrderInstance + """ + + data = values.of( + { + "Status": status, + "VerificationCallDelay": verification_call_delay, + "VerificationCallExtension": verification_call_extension, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return HostedNumberOrderInstance( + self._version, payload, sid=self._solution["sid"] + ) + + async def update_async( + self, + status: "HostedNumberOrderInstance.Status", + verification_call_delay: Union[int, object] = values.unset, + verification_call_extension: Union[str, object] = values.unset, + ) -> HostedNumberOrderInstance: + """ + Asynchronous coroutine to update the HostedNumberOrderInstance + + :param status: + :param verification_call_delay: The number of seconds to wait before initiating the ownership verification call. Can be a value between 0 and 60, inclusive. + :param verification_call_extension: The numerical extension to dial when making the ownership verification call. + + :returns: The updated HostedNumberOrderInstance + """ + + data = values.of( + { + "Status": status, + "VerificationCallDelay": verification_call_delay, + "VerificationCallExtension": verification_call_extension, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return HostedNumberOrderInstance( + self._version, payload, sid=self._solution["sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class HostedNumberOrderPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> HostedNumberOrderInstance: + """ + Build an instance of HostedNumberOrderInstance + + :param payload: Payload response from the API + """ + return HostedNumberOrderInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class HostedNumberOrderList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the HostedNumberOrderList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/HostedNumber/Orders" + + def create( + self, + phone_number: str, + contact_phone_number: str, + address_sid: str, + email: str, + account_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_capability: Union[bool, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + status_callback_url: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + contact_title: Union[str, object] = values.unset, + ) -> HostedNumberOrderInstance: + """ + Create the HostedNumberOrderInstance + + :param phone_number: The number to host in [+E.164](https://en.wikipedia.org/wiki/E.164) format + :param contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + :param address_sid: Optional. A 34 character string that uniquely identifies the Address resource that represents the address of the owner of this phone number. + :param email: Optional. Email of the owner of this phone number that is being hosted. + :param account_sid: This defaults to the AccountSid of the authorization the user is using. This can be provided to specify a subaccount to add the HostedNumberOrder to. + :param friendly_name: A 128 character string that is a human readable text that describes this resource. + :param cc_emails: Optional. A list of emails that the LOA document for this HostedNumberOrder will be carbon copied to. + :param sms_url: The URL that Twilio should request when somebody sends an SMS to the phone number. This will be copied onto the IncomingPhoneNumber resource. + :param sms_method: The HTTP method that should be used to request the SmsUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + :param sms_fallback_url: A URL that Twilio will request if an error occurs requesting or executing the TwiML defined by SmsUrl. This will be copied onto the IncomingPhoneNumber resource. + :param sms_capability: Used to specify that the SMS capability will be hosted on Twilio's platform. + :param sms_fallback_method: The HTTP method that should be used to request the SmsFallbackUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + :param status_callback_url: Optional. The Status Callback URL attached to the IncomingPhoneNumber resource. + :param status_callback_method: Optional. The Status Callback Method attached to the IncomingPhoneNumber resource. + :param sms_application_sid: Optional. The 34 character sid of the application Twilio should use to handle SMS messages sent to this number. If a `SmsApplicationSid` is present, Twilio will ignore all of the SMS urls above and use those set on the application. + :param contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + + :returns: The created HostedNumberOrderInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "ContactPhoneNumber": contact_phone_number, + "AddressSid": address_sid, + "Email": email, + "AccountSid": account_sid, + "FriendlyName": friendly_name, + "CcEmails": serialize.map(cc_emails, lambda e: e), + "SmsUrl": sms_url, + "SmsMethod": sms_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsCapability": serialize.boolean_to_string(sms_capability), + "SmsFallbackMethod": sms_fallback_method, + "StatusCallbackUrl": status_callback_url, + "StatusCallbackMethod": status_callback_method, + "SmsApplicationSid": sms_application_sid, + "ContactTitle": contact_title, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return HostedNumberOrderInstance(self._version, payload) + + async def create_async( + self, + phone_number: str, + contact_phone_number: str, + address_sid: str, + email: str, + account_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_capability: Union[bool, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + status_callback_url: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + contact_title: Union[str, object] = values.unset, + ) -> HostedNumberOrderInstance: + """ + Asynchronously create the HostedNumberOrderInstance + + :param phone_number: The number to host in [+E.164](https://en.wikipedia.org/wiki/E.164) format + :param contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + :param address_sid: Optional. A 34 character string that uniquely identifies the Address resource that represents the address of the owner of this phone number. + :param email: Optional. Email of the owner of this phone number that is being hosted. + :param account_sid: This defaults to the AccountSid of the authorization the user is using. This can be provided to specify a subaccount to add the HostedNumberOrder to. + :param friendly_name: A 128 character string that is a human readable text that describes this resource. + :param cc_emails: Optional. A list of emails that the LOA document for this HostedNumberOrder will be carbon copied to. + :param sms_url: The URL that Twilio should request when somebody sends an SMS to the phone number. This will be copied onto the IncomingPhoneNumber resource. + :param sms_method: The HTTP method that should be used to request the SmsUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + :param sms_fallback_url: A URL that Twilio will request if an error occurs requesting or executing the TwiML defined by SmsUrl. This will be copied onto the IncomingPhoneNumber resource. + :param sms_capability: Used to specify that the SMS capability will be hosted on Twilio's platform. + :param sms_fallback_method: The HTTP method that should be used to request the SmsFallbackUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + :param status_callback_url: Optional. The Status Callback URL attached to the IncomingPhoneNumber resource. + :param status_callback_method: Optional. The Status Callback Method attached to the IncomingPhoneNumber resource. + :param sms_application_sid: Optional. The 34 character sid of the application Twilio should use to handle SMS messages sent to this number. If a `SmsApplicationSid` is present, Twilio will ignore all of the SMS urls above and use those set on the application. + :param contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + + :returns: The created HostedNumberOrderInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "ContactPhoneNumber": contact_phone_number, + "AddressSid": address_sid, + "Email": email, + "AccountSid": account_sid, + "FriendlyName": friendly_name, + "CcEmails": serialize.map(cc_emails, lambda e: e), + "SmsUrl": sms_url, + "SmsMethod": sms_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsCapability": serialize.boolean_to_string(sms_capability), + "SmsFallbackMethod": sms_fallback_method, + "StatusCallbackUrl": status_callback_url, + "StatusCallbackMethod": status_callback_method, + "SmsApplicationSid": sms_application_sid, + "ContactTitle": contact_title, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return HostedNumberOrderInstance(self._version, payload) + + def stream( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + sms_capability: Union[bool, object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[HostedNumberOrderInstance]: + """ + Streams HostedNumberOrderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "HostedNumberOrderInstance.Status" status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param bool sms_capability: Whether the SMS capability will be hosted on our platform. Can be `true` of `false`. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 128 characters. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + status=status, + sms_capability=sms_capability, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + sms_capability: Union[bool, object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[HostedNumberOrderInstance]: + """ + Asynchronously streams HostedNumberOrderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "HostedNumberOrderInstance.Status" status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param bool sms_capability: Whether the SMS capability will be hosted on our platform. Can be `true` of `false`. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 128 characters. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + status=status, + sms_capability=sms_capability, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + sms_capability: Union[bool, object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[HostedNumberOrderInstance]: + """ + Lists HostedNumberOrderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "HostedNumberOrderInstance.Status" status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param bool sms_capability: Whether the SMS capability will be hosted on our platform. Can be `true` of `false`. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 128 characters. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + status=status, + sms_capability=sms_capability, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + sms_capability: Union[bool, object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[HostedNumberOrderInstance]: + """ + Asynchronously lists HostedNumberOrderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "HostedNumberOrderInstance.Status" status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param bool sms_capability: Whether the SMS capability will be hosted on our platform. Can be `true` of `false`. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 128 characters. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + status=status, + sms_capability=sms_capability, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + sms_capability: Union[bool, object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> HostedNumberOrderPage: + """ + Retrieve a single page of HostedNumberOrderInstance records from the API. + Request is executed immediately + + :param status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param sms_capability: Whether the SMS capability will be hosted on our platform. Can be `true` of `false`. + :param phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param friendly_name: A human readable description of this resource, up to 128 characters. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of HostedNumberOrderInstance + """ + data = values.of( + { + "Status": status, + "SmsCapability": serialize.boolean_to_string(sms_capability), + "PhoneNumber": phone_number, + "IncomingPhoneNumberSid": incoming_phone_number_sid, + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return HostedNumberOrderPage(self._version, response) + + async def page_async( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + sms_capability: Union[bool, object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> HostedNumberOrderPage: + """ + Asynchronously retrieve a single page of HostedNumberOrderInstance records from the API. + Request is executed immediately + + :param status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param sms_capability: Whether the SMS capability will be hosted on our platform. Can be `true` of `false`. + :param phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param friendly_name: A human readable description of this resource, up to 128 characters. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of HostedNumberOrderInstance + """ + data = values.of( + { + "Status": status, + "SmsCapability": serialize.boolean_to_string(sms_capability), + "PhoneNumber": phone_number, + "IncomingPhoneNumberSid": incoming_phone_number_sid, + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return HostedNumberOrderPage(self._version, response) + + def get_page(self, target_url: str) -> HostedNumberOrderPage: + """ + Retrieve a specific page of HostedNumberOrderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of HostedNumberOrderInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return HostedNumberOrderPage(self._version, response) + + async def get_page_async(self, target_url: str) -> HostedNumberOrderPage: + """ + Asynchronously retrieve a specific page of HostedNumberOrderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of HostedNumberOrderInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return HostedNumberOrderPage(self._version, response) + + def get(self, sid: str) -> HostedNumberOrderContext: + """ + Constructs a HostedNumberOrderContext + + :param sid: The SID of the HostedNumberOrder resource to update. + """ + return HostedNumberOrderContext(self._version, sid=sid) + + def __call__(self, sid: str) -> HostedNumberOrderContext: + """ + Constructs a HostedNumberOrderContext + + :param sid: The SID of the HostedNumberOrder resource to update. + """ + return HostedNumberOrderContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__init__.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__init__.py new file mode 100644 index 00000000..189117d8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__init__.py @@ -0,0 +1,113 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.numbers.v2.regulatory_compliance.bundle import BundleList +from twilio.rest.numbers.v2.regulatory_compliance.end_user import EndUserList +from twilio.rest.numbers.v2.regulatory_compliance.end_user_type import EndUserTypeList +from twilio.rest.numbers.v2.regulatory_compliance.regulation import RegulationList +from twilio.rest.numbers.v2.regulatory_compliance.supporting_document import ( + SupportingDocumentList, +) +from twilio.rest.numbers.v2.regulatory_compliance.supporting_document_type import ( + SupportingDocumentTypeList, +) + + +class RegulatoryComplianceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the RegulatoryComplianceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/RegulatoryCompliance" + + self._bundles: Optional[BundleList] = None + self._end_users: Optional[EndUserList] = None + self._end_user_types: Optional[EndUserTypeList] = None + self._regulations: Optional[RegulationList] = None + self._supporting_documents: Optional[SupportingDocumentList] = None + self._supporting_document_types: Optional[SupportingDocumentTypeList] = None + + @property + def bundles(self) -> BundleList: + """ + Access the bundles + """ + if self._bundles is None: + self._bundles = BundleList(self._version) + return self._bundles + + @property + def end_users(self) -> EndUserList: + """ + Access the end_users + """ + if self._end_users is None: + self._end_users = EndUserList(self._version) + return self._end_users + + @property + def end_user_types(self) -> EndUserTypeList: + """ + Access the end_user_types + """ + if self._end_user_types is None: + self._end_user_types = EndUserTypeList(self._version) + return self._end_user_types + + @property + def regulations(self) -> RegulationList: + """ + Access the regulations + """ + if self._regulations is None: + self._regulations = RegulationList(self._version) + return self._regulations + + @property + def supporting_documents(self) -> SupportingDocumentList: + """ + Access the supporting_documents + """ + if self._supporting_documents is None: + self._supporting_documents = SupportingDocumentList(self._version) + return self._supporting_documents + + @property + def supporting_document_types(self) -> SupportingDocumentTypeList: + """ + Access the supporting_document_types + """ + if self._supporting_document_types is None: + self._supporting_document_types = SupportingDocumentTypeList(self._version) + return self._supporting_document_types + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d9785d2cce55bdc7970cc155d321a7b20601cd6 GIT binary patch literal 4979 zcmd5D5rkkd$YqLmQ-#p z49lDE?|bup^L^iZ?~n0#guwOQpMSLQR)UbfBGbG&Tw?dA zBj$jh=5hH6Twvj2wy6j5~KcQG7dU8@!ooCn<~<*P0!%98g7Vr1Y4CPG6gN;r!HF1eHg ziJ&M=Bjrva#A$C{y2PD@scQ$5iz(3<9~amk;D8I}n)50Ot|5L+`&>l8^tNFdWo1;E zt`_HXW(gr;2S0m3S1Q#x)5t5c!tU18?OEmO%ym_GPv4xK%D7OQn#G;8s$D*Sw{o+h zm%vB4CSF3BseF|M+pbudbh->`tzwM2?+Dbko?qZ5lVzn;wiUf#*!*Gge37D7s%oZL zQzL)Jcb}3R`DVp7$|cPNI`)QP*|&77TxEG3_|P5L7AS#?e7jmIm^vB&7o92<-n4Y) zvPqYntyP*9iCg;Js;S}BuF-S1tCdQb*+%K^WI10g>LuIN^c>bSXUdBR6{8!jWcOp> ze+J2;ldJ>@>WxH>aRMa``;!9DF5ojEe420Rg^PJmXK0sI^fTg!=1 zy;Pu8h*`@?dNj2mVl5{|nHQ~=bBe-bZluzJ8>*Jm(@rcVNco+BrJM5%ial|{l=5Vw z)I#tT<^GqI*D^WG7c2Mr_3N{_N!_|KNSOTQ6RMTXHKiu^M(| z{MO9uYTz&O&@N0xoFLQfDl6sPxI`I`Vjju!z&s#J1G2y9Fe%1w(F-!mm88seQh z1lF~_Uy9}Wr(tyqOUr~3IL(ei92(7P3{D{EI8(evBqQXdR{ zIQnRG^W3)pubYV1J8SPW8aCTGu9)di=K~^`CYC~2JgACJ%CKJE64@gZ)`Rel?1T(C>Xuw%e zQ|6fg^~tO$Os_yk0&NTL@An(DjQH+b8RdqSUocAgkuKN@;#L3pWpO-G-9wamXG}c` ziHS#tKQqwr;nPt1mCcSYxrcb+7YnLnjC4+LBvPlaYbJ3E@gcJ!xt-LC(zmPrt~nhNASKgNP>wSU$Eosde6TI z+;;sUKgD+iZY52<f&R*Q|<;O*DU(p2@TMvF5Me$^1{gJd=6U zINyAx3Ea)V`I<+X^XfBsx2Z!sOr5F!cN(!F9_T!9u`A(;#)J7w`Lal`33de(*jrn# zz_8<&BukMJAjZn25A#FxGhK}7II}`h(+=at# ze(iT|J}RqJ!a&>I9kV3p=6&Cr_nvd^x!*mv{(DtbfW!0spMLxFkB@QO|Du5Ph^8lh z2cB!3%nfidFS`RJz?<|9_>%qsKg%N|0?CSj zie%+LWwL6Zip7bE>SS;r$o!r}O>)V=66W_NYLj&Xb&}v9zp6=cAf*N=YedG^5DU$q`D9L?Tk*A4O19gbK2^;VcN6xg1%j9x4`z zuvW(;Y0UnIXbRvzvKT3m2*t1|@t6oW>HjMvP{u2RXn9j!&@wC(-^$jOaDyn8g(%9jD=CmRW4WCTJW707r z-_ia3$E2Pkhr&kbzUPna?>2`z5!G0s=x`=oG~UwlLrMx|q=UvJq}4EM<#Z-9q;+?8 zrjZ;Sig%cEgyf78JI%86rlnLmBPnt`!#WdVjU=O~;b1rMdPOf(f!_N7x9<)sXwYOJWEik2Q$V+!IbscA>p`vL|R zjU!1o51 zuE4tn?@GLvD79zSn1vj#^0BC|N~uR*+-6^@5pvrhuZ%v)!As&mL;3RMV;`v28r0f| z@9-k`67;)if_sS{Xzu4i4SH~YN3B@( z0f%HxoKsTgP8^P(JfX!iO2<$%b{6EMoyaf-?Nk*l)0r}Ox%1o>gij48h}K6Uv2=1M z5hv2^R8n$e7_Eedz$)}bY9kt7ia)Iq&LwWXVfjR0zHZrNpZWwM)a7t=?>U2pb?;Dg zB$1BFx?79OF#&1TL(2_`^n9g@EHm>6Ikd zBQaH>wc8904^bqDZ&*!)g1V>;gMNwg;;DEB+~z)|WLR4&NiTIRIqS#?kwf3E*Tl8- zlUsX^oE!pFYm`HfrOdv^NSTfy0l&rn3`eAn*x&;ID_M{8!g4xxm9 ze#f5oFZ}4jN4sWs96>nvvrRkaHXY7xIy_%l_xiJ!pPj6ptz4UTyEX@?cnjL!yz71$ zavpBw`l3D|rmFVJ)<6EnjLqAHY~|@t=4l0d*Yyr05Ivwn!^8aLTEa@<9{u|O zO&mR@nxaV2loU4?duWnuwU-9dD$_))gpGz?Vy2SH86AqAOej)%(5?{ViDJok>XdXY zs>aj9niP!@ZE0btCy^*LV#Z2Q6?&JNekl%p70MK;VP^Y=+C{zWHpW%!mQ4EESJXrF zq=fG5?l7vI=GiMGs9P{DdUbInAbL~QtDBLG%vMd`R%tfJU-)VW7JbbH8h`$YP#TAjB3u)qWbP zhLXZzmiHu$(E>V@vO#G!xMIe);x|Eu!}fPAMu%x*M8487w8^f54a_1`_Y4i?(y~Ko zlsHQRT8`*8W*aunHiYMb;Td0eCK$e_?nPEZeId;y=9Fx-8d5mF3(mvH!ZCi#^)7F% zjgW}0pKs?)$b^=a<4n0KKX8;zPxnw%jV7fc-HlKHMbe(0TPIxN*Svd zcGfYdbtEMe3ELF5Q#OzQN2LYb&#Y0&U@4VYi;&hT$rT70S|O>PLUzhUF&KJ@Hc)mG z()rVIuoIP#v9&*Eu!)g}wmzDPWw1`ziz{uM;F$zt)*@{_6*J!rT zgrOK7Mqr`jH;U4ZNh8e_BB`}V^3S)foo`y66S9ez+k{q+IR)!^S=k@ zVHbj8`oMDFT4XtJ|NMC;-7Lx2qmC9^`W2|tkMJt?5PK{xZQ)A$Bo2EcmHGz8!3b?p@J^#=7b;4WX`r<{e zM2DC8Ga!f3M|NEz?cUVHovG#a{g$5A%UQm6%sR&bQ=hSS)`fZsSOO%OaIc_pA5qhQ zXCNPJDFt~j1gQfAB}%HdgZ6Bme=Zt3O=^rK*h-7ADS~s4mx|VZ8Vb^n^9SHq4EG{- zAt&(R}_f52bkdG58P0yn~wwl(b<6)%kMzA)Z5&Fdc8Jw!9pZrv5$ zr1NKW{#+3u-1F}u?DVA}b#nXt4{!B;*!Mx-+^!?pT}Nhj9sRhqf3~)N!aE<_F&EsE4eq&hel~b;#&?j($`DTs zwjGtIPr|YMgaL+HRN6bLt>h3IrhC#S&nU4B!@pDlbX1yb;9eP3rBP9dDA_(=_hCbX zonB_dQ2K?F>2!jr_-YU3AstI4?LZ}rL>Grs8ej@SepOlxRAOdTrlcwpPlzdrL?nW} z7cnr~H#}{u9@JHp9O|rA4IcU85_eZ{iR}~T?s9nLe16fFYv!Kk`}t4Z4dRaZruH0r zhdQQWH@8lmo;JgK4t%72ko=6&a$(L>{R>y6xGe96FGs#yn^#;lDdai4at4;ZLiIoQs z3fduR!2={-9H=Q@zI^Nh)mn*Km!RJQa#x|>wG1n-gY>Ls++bi^tMC~`>ZUF1UqVU= ztm|F~>jEltF*wi`{4OXGGOh|>Z=tW@&6#s3ijigpUncyaW<*_!_$V133hjZ?EQ zF%XAvHxvsK%;=WPQy7$i5=lZR3LuBoU}>aw3#OI}n9|Thhg0$I001ymToaPSaiVoJ z2A~EjPAU^09I?7otcVtLT?W03uIfB$gY)|e*t{uEwayD@dc03<$H0U{wF56EXqZrC z(o`2B!)hE54$0KQ%o*~61`cc0%ZA8cNMw^)wK+;*3y6FRSv3+;1VmOB0g>QR0{NWa zUc+8~roMZwz9&on`#8k*eu&pIZ& zcY<|W`irIp1f86Vao?CKRGxPTsa#&Hsd>H==Sz#p$cNeSMZmomC#T%ep91~ zy@7j?y@8-Ujqa&K2k+MwG}+r4d!n!6_O_O0u`m#Y1VR!XHuz(zTf0 zQaYv$E!SSW`r=$eXSShpzHaG_`nOx&Y`J+b=jIwWEX4z|w&cz*8kb2#!K)Vca<_2h82 zX7ydKK=UtHduJzq(L6K$`oHizEPs7na}7=tot*Y7%)N)ry|*y;fOkU--u0;m@yY54 zIiuuUAct}9{U)7hw8fLIl9Vr=Xv#I(TC)5&V6>l82^CIRjxNl2bK4tL*Q@55H)oqS z&(}3i%5TK4$8R=)w_CP=w_Av}>jD$ryEsUA;>%_~=SNYeDsOHP$z!;w)dCi`3$`7`GChf`mpWFU%_XA6GL3WJ^vYVufEWjt4a;D5W zc*d3%W{0SZr@Vw1bB_t{dfyR@oa169Xq8z+E{TY*vGNq&vX4=lzd&uFfciT~pLXe$ z2h5Y-KA21BfgbzF_ug`+6nd%S{Q2`8wEykEX|IwZgD&}AC6g7YOb0Vvut^q{HP81S zn-)}}Bvpf>3pn77venu_#D0h5A_1u?u?~}+PIp=*GDdo+>ttd*1mSGJ)CV1PmRvDcYi9ntE%&Eu?EMf zcd^TLDhw<3L-^%aTQM<;$iBmO{v z_-#>Jp+1jcR=-QmMRI7xaY)`v6#S=f43i0CxxEk39-;ijM5}%eaat*5QpN?El@l+7 zbtb3%1#%g3_$wn(OKxw;Hg72<(Uz?XB=@3pS|qY}>|M>@ev03_Qn=l{9{wVQjRY^z zbDjnhcCWt$@T5uyvuZz_1wGwLJv{*Dt3eOd9 z4Vq9%6;uC!O0HfU0yJeEA%H5`T&O4E6sh(y)v$0IYJht?i1;1?-0PYP?#>2x-#RrL zJTT)sz+_mcz68NDK)XTeO_-e1smW@i)xxpno3|3;p}E4Qf>A8Qwn^2Hb%#gu|iEehWNK+e#RP3W{g~UoHS^P+$N=c^Lrbk_GsEBVx#-SC}M9*0OBx zz%bjG4Jn~sYJ@R4O|4TKgFfQShg5oST42Uv&%=)?KXfjGh!n(1AgLo_Ek>)&?{lO1~WFpz}SYt zX#~Q~lzqf04X6QXL?tv`OJ2?fyJmb{3sD2)G{%Vr>>7?3&;b%gqfac(%+%-}20kq? z7m%r_wQXaav&6@<=vba`R)){lY-U~Q3;9c#lBBcBn38&A49p*qkE%8rrE>{GpL&ga zfAi}iR!v;Ap=!31b2t4>vO8QZQcFO1U_GU_ z)r5#fY$-V6f{kO`mPX~_b82^ioO>AT+^&DL{r=!~ACTA%e1@?olkSQLCKKti4FsFM zwHUy*WDfPyMz3EWsX$Ee1*BmydVQxJ*0UBWy_PCoM@}O-Bu9)Dg+!3`knCb(+=^PA zD@ytGWX$y?JAB*X96Nm5KQ7#VhcCNicigst9~Wi!m}p>#*yW2~*)AV-Id=J;FWu#P z9IK}^3v>E6c-w5?;0U%!n9*^PJGy)jR23bsMNc~c_mxTsXAAk=^!*bBW3(lgGP z{|WhCA?G4FBjhkh?h^TEV;J%+3SsCTqpiY*aN6qtFc$apCJ22|0?P+@=c_nmz1wDL-fNCrVXX8T1g2)~T& z)jt7!-k;U`?#JtuMgyjW7%iiQE`1F?Z2?DLN36Z6aB#Fy{1Wl?pCgNb{d^6q{fH=# z!QVyDPxsyy{`M|@ZYA%4jYuNxjNo6dy>JrBi7m)~?o6Lu``lHt$%Mbc-E> zN%Re>0s|8*vk?}{N{U^4hKZPjdz}dhmo@Eri@Qr9vU`@zp0JC`)Wr5p*2klthX$#C zc2}ssC;($e`99U+3La?57}-Jr%on4nbs?i`P_vZe5bkHw2uE>Y>Gb`&YSeZA=+Q7{ux*fwsrJU{}c|)Xr97Lub_{JutJ(H(1__C&n{U%wf$yjcFC>@&pgaR za4>YEYidJwW!J>WY!LV9ifl!Ie5|?IG~GEH?4I#;FFd^=F~wA${|JwTDVG&VkTa!^ z(=PSFg&q`+B6E<37J@>t5QGY{lBpnKG=Waq6IY^w7=!v)Hd;c#6grGBAIrwavXTAl z$)m_dm5u@XoT5?vOT_2_wunUO%AHSF{ z?LEu*_xYZs!mU;C6)A=uq>}{9cf)bQJy75lk&K1QQ}3AS9uziL^d68lTSk#?{V*aa zL3oy3`gkf4Kg$eFp}DOK(G6p)zD3HBf@Mj?frV@=cci{a-)21jZEMlTt>R4DuG7?} zPAV{^urx8;)cWd_D*6Oy1O?^EZrYMe#@o=RY;EkZN<})@Mkpz4_?YriMxip4m_>$^ z2KK8|sHiWXIZKy{8CKHw)uvz;YimUzmo88h>J9Leh3eX=#b?n|$TC{v#F(h$|0J7xIj|`{DA;cb;R)i#zH^x9o{4 zQC{d{AIphi0bzz7%L%F6){7|SJ{zy!b~&NG4aVyW@ha&B*2M)|HqdW{Fhqk;T%rSZ z{;LP*qYWLyzB79mQQ<;-o+QRGlrj{F_1xMGb8B{F*X*!m#@Z(#GuBq)j^py`&qaXJ zI3KPF+-Yq4g`2CY%efH!MULXX_yr~4K-nMoCG-AL+k}cQHtpoE^I_pnJv;dut}fw+ z!WPfJl!faLL0TBm?B(SQ+%QF2~lD>qIPi-P8K)BsQj-B4aqV)z9iS&Ao<`1v^e zU{GSjfgTtL5}Ot_MP$WsN;yWeMZdg4cSq@`0vWR6wBm4LI>vk&B~56@)YS|O2EEYY z_{psi21~^f1g8NzL09Y#cUDKR$087sfpu)OFdha>ZQtbh92*RwuP8Hac7wR_;)Oy&^Y3$@Ei+%E> z`z)K8gvvp0^c3<5+ zSGPJ_x4K|TF5Ef=tJ(TBFiETrO!)A#NHt3*x4p6Z`tGT9v%#%1zO4q>;v{fe*YJR* zAM~8*x0R90oEtp^V>`}`E;<>!MDGE)KIZpd3%{%H5!aC>TzZyFjII6+oW6xz{1&CL z(70Af10#H7 z=~HgyE4!-VT9|d3RrC1K!}d9hd7^<>6MtvDdz6KXT}Q$-LWa?MF;!IXj- z61|UsQ~wQ|qAjQHqxmLEwJjK#E@{OcAQh?`cIs8Z&TO`(I>(}}*V=9fzK(25$6U*{Y|FN}mc7}Qy&rA=$@A+*GaRF{UQ25? z?*lm4-B7!~mMitdvw)$PB|gm*{7ek2g5POlt#%?})cRduYZ^}DYx4z*>UP{LOkPjk ztot~)ea5%l(D|GLLQKsTh({SX^*^Ds`k%@9FL0c_qaQ)Rue9KIKZ?bZ6+47ZsQ;Bp zl6`d1JrabCE>Yhe(8!xU|3Qqr*)Ul~-Y-!fuAmXthmfnUFC>*3crT&kFgb-Q6@wI{ zouqNEf?30pk(qj(9I{r?-2kmsS_~O@s0PSKP=QK1wn}KB`VKja*=UELzD3S|Am<}; z*!0s3t3M`3CWltk1vfVSm?FtJ1|g?iz$dXA8-8*74ew_hUb%Mjw#29Y<>HPzO|3Z* zZ``p6uFiSM=PUY26Uvke&}EAX^5NE;@v|t8R2sIG(yIBDYd`fii97EEnz_iSoK6Y>u=BdDfpz-UW=m?{Eku-a+IQAH@AM%du`Kg^LTBX-Z;N5{9fgB z<){89#BF!#TP9ado}1i|tzVN95rLW-mricI;hEf-ZCIQ0Qk0KFuDZ#=$)(u2<)|2q zdqcj0dPDX(g=-3*7p^G~HTJ;@+#89==@__;1PpYXks)9r#;*;DM74|;h+Pb3V(dbk zqE{H|Q21mNzkf%&Hnox*;y}I4kruXYm{`ATtX5N&Wo5HKabv&Kr_x!P-r~%YAY9H) zuc7ohXS!)Q&aPnTHO>^$zZm*pn5!|aWjxK;vK=)s*~0L@d%j)952^1_e~JXKE2j}l z=iEHcf9k5_h0oeJzWwjG!*kr>EO+?txUMYM^$GXnCtUX@+?G$cwV!ay?|Kfn_-FW; y#x-|2=DT}TIN{e2v@iSfU-2FqLhTnW;)m;v+yKBw}2yFZeP!@08BKd#7%}&bz literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/end_user_type.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/end_user_type.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a93c678a9aa8af9f83f05aeaee3f7760a30e73d GIT binary patch literal 18679 zcmeHPeQ*@#dEdR;`_#t?Nq{5-UXTGDNGA*iZ1E8bupJDRF#;!5NY2OY3N5}5dG`*G zkP^qHiD;eJByA*j+A&T$wG_Lx(smO2pT_<#opz?W$TQOH#52saf3%tYan9kfLuWeu zJ@31_+LKPiI8K_GdeOc6?)$y(`@GNdd!Of7{<)?mEa3Xq&z>A?ypU0DxQ>>_Vjzw-hOXd>X*{KeqY+(?@tH%1L6R45(p53{(Gs!CV) zSF^Y;RgH~ zEVT-$)oQhqx`w6JAhlL)bW+!{)Cf}R)H)}%X?Rt%KJg1t5W+I9Q-hizC$owwUrZSC zIW?o|iJYp)XNM^}9*@h5|0scy;#85{d9du!D&;Cd?NGINob@^?%cIUeB+~=_P=x2i z=5j+ucUM;y*@+>o(^?~B=hWmND{>?& zXRM>9q)kx8nDvzeTFDTkywJL#lqWb=Ab zMOrm=;d%}{fr&#W$dXPZ&Z$XG(>x4X4<#LuZ(_TtLcfSD=TXFdZ%9z86ptz?Ue%}i z)xdzK8Ko3S4XS>M4fw}}0a5W?sp$`?VWnCLT#;V08tku9YLws=slOWc5biaKU-b`o zlrZA8zU#5}Nw;<(q05G*&^oGeKBGOIS7jro zYngMH^F&V86g8961~iou1X}B)=45J5)~#vbOUfG?&^0xqq=w^}L|W~Zd*s19maJ1( z6H4N2N|hDWNa`9}Agc#M2JvX;GT5IW9-e$y8IkcprxVFRI;Y;)6|`HL|IEPL)reJTBjU*4SE@feU;unSr6ia4MTnOfP6NDOp5MHxe22EA0ob z|5I^7$Wbc0u1cfAw;2tak4O)6a><^kPw?Vbf>ihg97R#^YK>%f;iS_newz&FE{;mcEvPCJKmw znV~o%0LFsjNsF!eOvzAF1A09bYoLG)BNUG_1|N?bG;<`*p1GAj+rA)NGrC{QqCE(Uwk7<7=MW1qi2Mhej!wQ zHBbmPO|E@6xbeoO=&Rdb**>MtZMt_{dOo<&vFnXv)5qS7%yoQzTzWUyvao&U8~djB z&3tuk`$Lq_ym0>mKUw$Iy0^bLcYiNxR4puNq39QC>R;UTozG3){c`(D?M1JrC5&>l zNZ-3}T>4f`2?G&Kzpm!;dM0TRKcxvYm2A6QL1cmmg;JMX&qQ;Jn?N}45cy)U$^@o} zw92o0UV}KH3k1d^EMBQ6h$QdG`(avKx-3ipK15ucOJBe?CVm;iAq-+?bTF=K=Muh4 z3^9q49dH^1aS~f3J_y04W%FQEN#c=4Ozr{Ov)i&$<%AB9qh~K^T=-CbRu3HG&?vk4 zyn+L}DB^J0C@~sWo-JpcVKEAy7TGN-=^HRVX1%L|)fo1b#Q^p7D1r)i;bzc!$~sY; z>5tQ3heujmmF?bQJntT=azBD+gkqggUH8I)s|RMQGQ6y9Y6B?qs5?5*Z9KN)v?)NtG)@f%czLfmr>CkL{_4r^9~K6kagK`1?w)} z;sTdu^dU&!L0gC}-DBZOGf(JbfNEi#D!jWh(@~EeMc<~671rAkcg>&Pf#;Ft3Jt_q z`3I;t@i5F?EltSftC!~^av>tmMK;X_H!YtTdgtfxE1g7e3W;$dj=9yb`ABRw7@Lj6ZW+}m z_3VbN;&pMe^onn*SVoLXSehc9cQZWHq)YK!A!cVWCZ5K_N_fB~(<6c%d(CQd49DK{ zj>KJTXAxt7w53~%9O#6e1tbDTlWnmIgf#>?1YyO{S|#d!l*7*ztI(dI>y{`ln~Gf+ zROulEHuZfOO!*96d`ukkC_<&l85Ktzp8Y*>LKKDP*Ga;#NEA2i8Sz~nJ8*fdcN&Ky zjxndbrYE+;6rVE13kFd^vpaxx%cIRFCCoPIQ97ax~@V?->*s}j-I`1qd2l{KR<`YtkY`j ziJh?uoywQT4o*v^bUv$P7#}r#fCgzpC+0QnVLa6gSX|y93bEdXU=1JcO0u8l(pER9 zF;H=}(6DBr{aQOl`sR_J^uEZ8G0X?p0_!v& z77(a26a*h#5#IOseZgYA@R-;qzVEH|?ORy8p~&vh&Z*?guBpLk>-peAZyRr=KcKv# zEck1G>8bXuFL@CwvRG@t*H)?z__~S+j*F9R9}0A5Q^dMWqDSYVm!zw796|YMTJ_RN zdO%_)X782iejm=!bRPEMJRGp%e#C=_OGw9Ax*@!JI6ot$BB)Hm{uBMFWId~1o6 zHsYL;Z6RtQ2^W(YO6ZBSY~hM-+0s@(Sm1C^n;-#9#6*XEn0I>V=2br>?ErX&%mC0x zd)G+^h96!;;jXQ0bX`WTU_nCEr?+4}7%j8S%yzLU#q+ubBt`sVan(5W(xjoUXE*^f zD8J6twlzZzlK%>d8$AdJ$=8-4d4M9q-EO?S`XO<)@!)*pg9ZBg!cV1tt^KE3M1aCW zoNC+9R2h?|y-4I#nni%~sw1r`NheKkNgi<&irM|BRhdXC$t48@dEPnmp{jL_imywy zvUJRot8&sSlHaHYt&k92aw$Fr`2BWE*f{}xI||*ZOAO&Om1GjG>%0M-o4+TSREKh= z_u&UmL4f$vYHl!#13ebb3=BdWgi{@(2YoXdKs%(eHa*z^eJdiIQ9VX6#)23g_VV@q z0;M(}D3e7T+ci~KX@*?VRQ}5du*!8pL-R!RT6FTzcRR-eH(F!kffs{?VDpXoH4~lJ zI_K**7wR`poqkjLN$9Q6PxsE&Z)TkQ-y@qAfTth5`shM+1A*zNt;<)^a{;8OM<64{Gs4!2#*JD;*8Yx>nNZYLfKnJJ-U6i$KP|W z_)bvl*(tpf+J<-;WjJEx3d+I|^Lv0}^?NWBeJ6rtBi)6>PZ4J7_fk*0DcFmkd~x?7 zWyB5b7J2rHaPlvxDdLs-0jeFnJyx_DB&et#q)H?J3>Ow;@Mxs6+~8xFpc;380=wrU zJ%vcm+gs-%kIV)iVVojbr5~Z*AEbaVJO^{1rx*z?&igtj#Ug;_knYaxas#ld%pJl}G0DQr)!N3;*Gmjz>_!{;_{bt0qZOLN7m4Iz% zF6lrfJWxko{7S?|+;S7L$z2Y)bm2s1rINB?pj3#r(5L8LfMCjQx!%Q%2IsE{`Gf_q23vmWbn3Qsnm01maDRie?)m3)PpqYrd zbN>?U7^@LLVpW6lT)+3#1FsyI0sVB(2D_I_8kFSoMH4rH;~WM-`+218_IrUkKB)Ji zr3EYM4q+HNDbX6!18^_mL9ai*Da8!U{j>UXxKn+rCz_0kP`1(V)EgN>q22i%@ zwq>iGvO$!s`Iu!xC|j#W&dbhQI*~g`9q_^qze=rF8?1d>g(tuBB$Yk+)W(6JQjMNh z-$@^p%YK5MYtZu=_yW``G!jXPfTOH+J=fv6Nx|D7zZv=Ucy4h$H{f|4^6J5j8WC@0 z$G`Pp7i-FR5*c{ep`wf(5$)2C@x3LdK)~gth9{f?g}B9#1Yy_%y?5GS6)T_LsPAQr z=uQrAP9Gzie*H14H|ljAuLyJ@Vew2QBf*l)?$eZ;A<%f8qtuV6JZ+NYN2wc)_c=!- z)0fiHTFwj&f%C)-oMQDhRH}UD{yuW`kh+x)|Yt-vlE<~O+CZXh#QuJ8q zh&3vqzL#FpC2*uf0>t4=eqRpe*mOms0Hg?Xx3IIig$Nm96Sm(346PtQ)aOQ3Iyf_b z7SiKzgKsJ^qNRpqvXGJim$!!|)PVsl3G;gnnRpz^!mds>_dHDaDJHPk%saz`*#iBL zQr+DZv+L(mISdKb5pMi|+P!>;9kP){i)dkSSa?XQX|g0c1F>91=p8I|0vkcMe0m6P zBeMs`(!&jPWGS}a3A%0Gf6SVa_NX&>YIE^AmxrDMh9mM*fZvFUJ!4gsF(T5Fz{bS7 zi^=j4bs&KkBrlgtmZv(+TElc`v)gixSu!kksFdj)$i5CUV~2ckP|Yxp6+_K&(>aWa zPP>akwPR##Qmm0MFBIxx_YV8zG0vj{G(Kl2G+tDI(qFkvvuE=;&=Q~7#R^z2MpNxk zKD0y*I?*9G*3b+m;CV54yP@*dE^0Y$wMl2;UE!=T8z7uWM&Ng$#nhM#`&&D!(IMZn zW5blz4!hiwNnCEfG^1keEy-ZHD` zCE~1-VM;V(rk}s?w2yN%D$VMdeqKy}3Mr1QS?2H~g|v}1E_BEk9B=6zDo^Mec&A-} zu3-JO_4BK?6;^GV+C3AUTeW}OzYuA7VfgCs^*vMD3vGMGhvy=D$E6!cgk^0$(pHGH z0mf{ZSv%e3MseUA&PD9%Is8ihh`?6qS7c4@T2}Q>#{8fS@Rn%sS^`1!%UbkE3R41 zcc5j{WeQT_K5P*DsS7ht6}k?+7@u2x zcs_F2#Tlc8NObD%8UM`1A4cXP56lK1DEfrDBjPP1g0`RC-Lqc&vDmXtdh>3?%7CID z`NRoJ-3XRw30B~cuREH8*DUylBY-FIKS1jauc8;dQ`VFsEbO#!I+N0#V!o6>a_v#_ zUV$_&14}Bzl+HZqnD`?&CqK!A(~~v`fX7NM>$GX1tFtQXvNke=@gzyUlYuyx>iG&Oybv%g&Lw zw+&8--fN!cs{vaY@eA!inK5r4LXpKT3JlD66Ezr?vv^Cu4881U{6bws>Ywoo*9@$5 zBqOT1&4KLqonPn%HeYX4)Cnip)_8|UkUuKZOpyMUCWB!LGfXed!9$rF<8dU%7V~Pb z!woVPa$vDd*t&gw%ihA4y$eg3*Ibij4t8*5sB=@n`kiXJ3? zRHXEeen}b78i&HaV$ok2JJ9g6YxjvSi81NV{QJb~o;}j{rJer27I%bS_3rflK-wey zt+-E|5qJ9kPTV8?eQ=*>VW(X7DK%qOF&xDe7G?hF4j%ahx^Ux>$~FsF+M$g4bH{Id zOuD^wSn()c&GB9zgO|&wPx0NMkANS_t{{fDLoRa4+`+E@hzidKxge91A7z5#<+ROve=XS8me4_{MW(^CCd*p2IG zFbYG1>-aGL>>@?#Hk@TKl#0!fT4V(k64!-v*g7DlxZ1tL^*WBSgx+F>xpO*&k44CN zTb*FD8Kmbv4B%EZGk9ilo%Gqxt&MJHjZ2*uFJ9~~jY zfs3C$sHx?!VhHclPRxOt1FVpRx;3P8xv_rhLQ~s9>*n_Z5+Mp~`EhB{=>L`3&J(k( zkI&Vg9Cv$sG_0LCaP7c+!{$Q6=0)4T^yWEO{~Nc!`rjBH55mE}?ykw)%VRH%O$|b& zGaKB?&2QFL!9WDT!6|+W?&COm5MKFx-TXjLK{tB3GiCr3)xt1SDDg*brmzGvfxJKC z5uj#f0{NZr2>mh$RsSjlU!&l03QkhcN5L})dY5nMAMwEip}mv2@ov|OIkX63T} zC~etqq7Zk+`OS81^ZJ+9zqEe7`JO_v%VUS{+7|NJX(6AT6}E0MfE?RHXVW23eCKYl z=X26Ko7W+3hQXM~3J+dbX8xnCPREkcw-Kypka7%uC}drg+&e3om0&P*^b+vLvW?c{ z`)4=hx-U9#lkQ^Vza25)7Q91h5?^j6e}|%Xaq{rx=ZT~CSG|zB^a&t@3=_SU#RRFA zexHr-lL|gYyYLfbb^yPU#pj;zKI9*OnE|UWE{!bX<~J~r`V|Ca$5=B+>rNC~=JLRB zshvaK^aeRB!30n*;6oZFJhm1Zw$3-i3JtOOhCPLbJu~??&(Ad+9S{CIvZ0dLa8n7< z6+7Pk01@YSi}=#35`O$7w6*kLd}p-guy$`E{4rVk|062wwa8E($Li@<5tua=0a{vC z=HBwh$S5bhTARSEgOS^_v5WwD{skh#BWQ&mj_QS$4V)o%7MeTfo9`_&-#g!YsL*`q z?cG1!HrIT5zTtEQVkC(3gsoz|x2Hk;k=V0J`tdr%m}72b{zpeA_qhiA$xYA5r3?PX z4maz=R~I8!91aC23bj%`N%m#;X~6QybFqO>-~W6wh6XLy7Tg%WK%BWdG$O&E*RZi? zE8-*WZ|Ch*cotJ%TJ*}=bp7sEJ74LX>3cVF|7`Gn4h!A$LHnD@jZZRf`Zd(nzeB-y z5x7T4--zIg8ho{}oLkvB1ith?q1u}el(}@`nGcJ`cL&a5Gz}luS&U7Y?JV{k8p~O9 z#>Nu$^!7$KEOivCrEKQ+NMPFZLierHIhDJNks?wjvB=a7I+-eT(md)HDF`DleR+82 z<#akpFo!eKpFMkCP39Q)XZBv5ftly2zzY;GN}$EozemAg3Lc^07y<)h79QY-5rq;d z_y@}HVTth}Oi>E??!O-RK)|ioBFJ|yv~7Jqu-3QlMr7@z_v%>Dhd92{ZET%9eCzmh0vB#h@ST>R_hU6^?Jmzig-lLweZ_4gtk*nBsf)@d|{_1;;xGHgnG5J zwHpheO{EY$-)HyO?5c*is~SDItI>0}ux-a1t<$XwxOGf-EVReosGhEVKXjMxz8j6r zlWmh1Cbt(Fw-kLyKvQehP42qxpWIhiy|oyiq@aLO4U+?t>u}a8Qng}O2sf9iDE5%} z+id-i81~(FeOFPyZR&F+x)qx!Zm^`8uUSccU-yeh!fp1hd&s@8o7@Y#ClB+qyWu8l zrNQO!!$p@vqKn>Wv;HvdfF8p`P7hrke1CGZ`{ zHVczrY&S5MQQ|CYhujM8=U=KF)W453+B$}cpy(Av@qJIVD1F!}h>wc%!tsJ|{5@gA zd%}J13El4rJKqzwz9($F>F*K6HZgA8L<(+A(w@XVZBOhkZPWIgXd|B^ojLIdJ^j+AAG(fkZS$e+?|<*i z?Cfg6;8&f5LEM?S&;Q>0zyJ50f3Bzq2)Mrd^CN@j4hh1)(TjPxjfc4@JX{cDpa2NGrdW$fJ*FHcnTSFmSy zyfP8&53*-Zyed)MU(KGq@tQ^Y5bhUb|7k%ED8Wlk4o`mr%Pm80 zxl&=}E?~J8$gNcBt=vYI8$@oEQf=in4OfS1BEJ#^At2#8Fc{OMXi8S3lMziirX&?L zl2&Bt=r9$B!(l1^k1{ALObywcC-Yv7TDB_G4>b#i*{GwEG-~}rHof2vRd`7_OgZe8 z5*l*!Fmm`)IJ}0Qj81s=8mr&%C~M5C8uidQ?~*DLxOn{nB{bk+vtLP~G5DWZ|8Rg$ z)5%yomXbQ8-b~`CqG~*o<_>@9K}8zM9F51K(g9v?|L(p6Qun@|PTsorp#!_SjH!-C zG}b7RNv8_tTY6|nNurH(KVO8D+Q~*4Os9vmt~F~?D2@!pI*c_!aaxHEvMRe$QZkj6 z6gie=z(m;~iAXXNiN}XK1OGwT6Y}cL?&PrU+7*kYb=TgQmezd_4W(nLWF)S;4<_-T z`+CxZ04Y_k=+=glQS&wA(EXaC#v<|9h@yK=MB*7m3yFHLC#j_)$*8h3l}szA(#WbZ zv-T@mDx*df{2|6SMd!vn$S{qD}KdGPXnGa!hk4yPFM5?lrp(e_MLWJG6w0# zK04lNyx4B2?^l9KmEtsd^UA`2OAefN_gCLii!!vRk-ds{z#*5PcJ zy;t|`IM~JkEQ5VY0 zi)btTpZgl-`|IKbA#IijXI-Phm%$50#Y@Ioh{CAjxXB%?dcZcT#;6dc-q>}Wx(>59 z)U_bFPF<(1t~Ks;>bh)oJ?{g9+g8{6K6O2|y5{b@-aL41b^T_)vN-BIC2HlEJ>j?o znOQ0bF%dJtxH09)s1+_VONWJ!uUEYTuX@FR8dH*Te3)UbUKZ0*K$T1~tpYPRCWX_4 z^cAQT&Hy+0Yq_dCmWioK0!XRp&WsulmFsRTGo+}r4Pwby8mR9)rli?8>QW4*E~8{Q zCGC`~pd^Gu_lLDqJVTonjiUzLbL%cmi4Uj}Ra;C6gV-MqGh!SLYqWU8dY)7lQt>Jz zBP}I1uL%zgsJ)Ej-6w^s9>HIE)|>S;jxTt_xA@8(q3^AFVbz2(eaHGUu5-TG)$3l~ zGr8xL;PmRxoN>M3Yo1+s=gX@mS6xm_uiQl$jq@{l_Wi8or!BMPEptxC17d(R%Xx&Z zZt*8AueQAQ$n@p|l-D#{G#2Vq)I7WHkMA8{`uvLLR^*(HW;8xmiTn*+XIx*dV4F|( zs7gAcCZi?^!|xDi2G~YBjfV?_3Y1%PJsC>pw~uh#+8+68rBO&0iPXR3xa8n9fkIZ3 z(j$QcJ4gO2Kx;ym!FClXl9XZwSA%54*qStuQWgjVn@W!0Hg# zg=UFZ@|biYqQ+7gO^QSbZM06QJ08yuV&qB@6>@}{Iu(Qb1>u0i3S)dOMi7);d|tIK zDUUik3xEVL`6838SU@qfoD|tDzR?vB+n}3j2Wp`H8r(EmOo^ed?g!Ay*}oS3R@!?AEC==@+dXvsHB$D$ZBT)-_(}J>Prr?rdG? zs@vICd1lwS2Xj85s_vPwvtv`fR*p%vv1Bx!krmo%T3U_7u!p0@BBOVXQVgxS@Nzx0 zI&L8qYr~RJ@g<9D0~s9G{>Pf8`;>HakgdS{-)CElp@bcOqB*=N?g`#&{?Q*0GKpDzX*s`;`b0<(S>E+goz0`)Q!05Zq{Vd!PcIYXf*8- z#{iYqccgKCcb%-+9+YZJkYM%eXh|PG`}j;y$_AxbX3Xnol4`CY>W^&ZT8uZap}Y!1Q^QVGh$fD#RXcPzXBa#RJbG3o9pDJ1@x*zWp{J0#wSr^w=Q zJIBFzbjgm>#BJ@xmyABgpxz(1ge9X3-16cf$cXD&o(1evQxLtu zQY2GykyK>}f-eLSCia)wtq(?`gM@n5Yr^&_l53(gZz|RSnz{Rsn49Jc;EIRw!^gxi zhb)wuoKbPqVw&F&FNmUWuEiw`i?m559V70?$F@E`);lTc9^z(^^rTaFbgtFKM|JUp zhOGsHz$wBt{}$3sPYtQtMmkH-g>aaDdpO*=C7y~#;@Y-OtA2vOCV8D<$IqMlez5Cu z_vOdNH$K1Zxos1RCq6sVvL@Ty_ud?d15YhlERKY>a8G82`lP=wL zJQYhaPNut|i6k`je)MBdHr)%tOS-Ear%5d2&|XJI(l0ePmN!$h`JwT7xvLNIARLh|lu;i}8w zUij?5RROo0&*%2#8ia?$KJhJQjk{}h!NMH7hdL&rm)A`UP8#pq?t4vpHSso;q?;=l@K!|y7+{y+bCNZISqUWD%bz5iZc4g`B&}->`c;fXZ@Bqck&(VJqK}6K1K;R-0LI^dt9IOr&5Q~YH zVw$p;Hup?PZ9dNqW0rh9=D2a6F~MT8*mI*!*|`Pa0QD?;173~mIMKDDONOQ9IN5=U zu2J;$lKYZ@rem%&5m0uO?t7H_sWR*2@3Mzz@k?IQ?uZ@fQ%T{_YkIi&kA*YE_iI&= zA=s}-)K4YX9M@ne@N`F`%1~N&-oN_*IFcs;@jnG)6wpNXFf`V5@1PQqVXk6$s1hs3 zu4gpdks46RJfc?{N<}!G3Uf49??yf+>5tG8Bi2l5bLRzj-6coT5p|F%EJk7(BkZ#L zg84|u1h}WD!8s&Azy_hJ;hEvH!&j=7z8ITX-kn|EJ+hFafU97I zO&3DvL*qNX+HuBvrM2^n_gP=o*L0<(;X=pxj+vTe*_vguwTEdq+>n~n4)+I#o_O%rw1wNrN%36s1+Ej zm6QVYA!@T9iCyYv^6*GWX3XXN*QmiQ$ordTg4?sf?XNAE4)#p>dbqq_RV3hZnVu{i zT#6uyuYQgalG#<#oYjMrFw#zJF)zHU{q*`U61%`odIS>}AEN@22_dlOTovx$6EAvm z0^KK~Z?k(&%1hjB#S%9%uJ~K#+_>kqi#J(uo7eq-A#y)ph};AZ5f1Az*s(Bo7qaY* zEybz06t^KnI}{IuXeY#AFB8KZvJ20?VRy)*SLV@#9Egmo%@=EE9JbfU&S@8Gz~n92 z*Mf@lcq13=T^t#*1kD|pSX?eJ45tQ4S<P5^ve;OT){vz zxAPk)oFf!x%5&9v22d|Vo_khL0}&^1R=Z?S$j;9$C; z1G*s)x0D3>;d5n3!vh{@m|kdxrgxh>-G1v0{$<;n4{rgh%&(Lw8JAoS zX5DCeZ@_z#ynvNAqr4ICEw=Y2ytksQAGWV%Jhw61*Fv!37CXDAP$E?V=_)W_5NlwZ zo+OGQ3z(y%1xyHA62Pznp5VB}hOcY8qM<*O;mR6fWbyl2nR-J`n`wzuC}iaANz6z~ zzqrtnWMj4jtz|~~C2DF!@aLP6uGDR`%tO6A*r5&;Z2=HuGt%AhSR$6z{X<~)VGUtm zT-+iCZeC=oVTEIC1SYj_$NDQAKnptymz-P`8uhZBID?%35@?OpKSOx(UaK4ds9x<#6oB&2s38)C~ z`ylXu4c942yOeX`88$!7Z4< zkvYrs+?V8N#9fQ7(GSHtVM=xun38Xmm%0jhDa^-9nEBWp8MO0Mdw2~P9G~#pEcP~w z1>3&OVkwG{(XHDo7UcRii=`7dx6WeKQLu(yJ2zFwkfR5fEW(2K^m0yljZnTPQCx~i zo<_div}|LNyd}=930fSrcsSqnxMh9Qh4A_Cb+~22GH^?Z_bXZTvGlU%^2r|r zr-R$4eA{!?sB=vt-~CgYyBCXpBX%!x{q0gbMeTevfO6uHb7ZwHGWVC_oTf$z4vI)% zav7EzhMfur(!s3`4kqKVM_GId^ve|?3L=NBSD=F_5O`D; z)XRh`(h{X3j5HiEMNDW4>6F!{p|l-U5S?c#d`!o%YTVY{pm*NZ-ELWTBix1Jk=M~I zjIu;(_Q2IPOX<6CHE!{ZV&@$V+Bv&C+G|mZLiaqjEXpr9w4YKnEvP&}k>M1-}`jtWFk!4+$ zjj@0u6dxkEOL)c`bsU2MdYyT^z{QUjz;@|9?>JWuEvOFv{Tonc%-e@lWKSmre)J%M zqX>DvQluNv1l(pbw@rk6s~Ft-x7S2S=zg2cd|(5iF@3+OY)1Veh;MI5R7vGPNG)@4 zwd45)7CytyOjO-qCp_Fl571TzBab+E>ji-~j6scduw@Yw6UZ zN>VRlnj5!|MCtdMm!;{@88*A7Q#!1PJZJ9{vz@5J8hBP ze#Bz?W%n({Z+qawD>r{${yyp(^&{#UY8YK(f%lEy4%qy9zDO6;K1;^hk7F<~_!y)J z?B2;^@U7AGlKnm}f|wpHOWCpqYUMS#{oH*(wteN463x&jQ(}n(zQBR6r^JVCwsU?& z;gj};ebksiET;><~ybwp#4dwwds5xeJ+Ptt?a>k_J(}=cuT`G zWhnpLg#>6(1BBPgS-@>F-9eSF zEw-PDIMs3T?P}qU5F(^rL&dR02%)t^^JZ!1ha&qzT*m4T^n=HFN^Y|mGd5#k1 zZz97LI}D-w%z#XdMlshMckV2r5#}i7vKs@9;N}-^vHP1vWT0Ofkguh=bUt>QS zG26zRMXk%;3i?P-0hhoTiAM8`#3NH3`=(kyJ6*H?jQyxY?Sczi&u^WnU6!q#cT}Q| zj!M)8&iL?Mh^mD+MUi+eG4Z+S;D#yR2JT%d<`qo)Sr4FZ=3oTZf_@wL1vEEbfp_bc z_y;t&W_}bR(qrc%Mfw_c)NQtcc!v)VU~!wRfR^Aa7kJ6<5L;2dLiG2mlzfen2qi}; ziBcjX>Aex%Ct{YT`|8*6TAF-Q#d(SVk#DXe{E&$F^QglQ6n#8&ys7Q^w&&Vrn(oXt z%{yn*Oy`W6>73DZh-UH|8eFe$X~DA|z>z+R_Xh_ph=n9!8T3k+ zqj|n=7@igVh)Tv)>YQ(>AUd2MwoXdmU?)Xcu&ZOqz}xPPw|++>6aA=eD6BlP)z;uJ$~92jPCE*?3RfDKmn@UNli zUSlYB{$SFG^c=^us^36Ta8OG3(W(<5_OlgC%QXvrNvKUqaO6Kkjb2@<`+z&^t-O!Bn)EhL3_S81Y`VPmnK z*DSz3Ui_bggS*fPx3km;%?mjx?8r8C%rvdfHm#p&+L3MA@!H-0xN^Gb;7sko5}1gS z!F7j3!}q(syH@;>*j?@VaSNW7{!fs8z9(I$SH zI}@cqTAO*mI6`P603Y!u2->{zaX-YSK<*72R^x8`UZ#772drfQaE z{mbU6>3zR=voLmx^MULZ=R=9Sd0--M9-PRt1BzEWq<96W3#Jx?vi_9>Dl%>s)}=T- zTQr}@Du$G@iU6goA~-244<^0kp`yfvQ(Bh@N` zk+SkI(pw%zdb7hw@9#U0p*1hJPFgs-qVwhQ$?~_VSGhM9Pb;#DL8h#tX{D?pkSVKN zsBa!$GJaxwRkm(vMQiCG?PfYiyLo&k&s%!8m50N% zi10EG*AkuT4K?fDa2TI3#79>>>ER*R;`xWHh!=4JNraRie`kc0$fsV$CFRbe5u6<% z2MGT*N~xb#ewS4(rpA%9ms7{l;PMrKmR(U0r*V@a?k7E*F(5vhv zB$YEeC@21miZdF|$aE{}GiJxki`RTx_;;7Lsegq6a6>^;kmQ`AD8A(=7hUhP3gUy} zjIcK=?ER$>dQ;f+rqK1KaMznc`Ds?^?uo;-zsC3WP@#xA0S%>3`Q79rh9~$>T*@eE>jP6R>`(x zX_o-cjJ!iPcz32PCOQJs+uKM3yLR_POq+dy_Yp(H#O|nCL`abfF`n4{u{*IFQSLI) zwEygW=ibb$tWuTy0J=M7Nzl!EZ{Am(Jm=hVzk5&mudAxO0}6E)7d@$FL*r9CpTC!>+h{*d6x_dsrDM z=8abjSHvraE8|teRV>dDtB(7IeJt*b)x=i~uVQgmtTtXZT*u<>Sbe-3r@|jRdKA|KOHI!B&^6_zc91I5K{C|`|SwX7E?mSqQ)Js{4 zP&-sD7-YRp%JQW7AF?Td|51cL2?i;LB`KgTCyybA$AZBwis_B;>@Kt2;3TWei|Xaj zIB${)({Pb|i2~~In9;5*Qy=_)qx>;1C)1f|ESi)%<^HkwaYaq>OrjnBPoGre(Xr#P zXjmTN;{osgBJS~vnmdAb zn~ug6ze}_CCdM_XFB(p3(&1<-t+}5YO-GZ7P)u_iO(3GV52cA2lB!nKn;K7qjileM zRYa7OqDDip=!Bwq@=@pMP;5*|p)22^L@FIhgp~uyL|QqUMpliHHK3%DV`^AIUL|#H zNxNPEanU&*Nk>8_lrZOe9=i2J?rCuEA3;nNVOWHy+8CpYV04>eHyK^>2p%C)8?h^n zh@?0bm*O6=wV;WJL-8msij6p@g%L60JYO~JRVpHN5%+oNJ-w6R%7{y;8nHz@=cVCl zJ?=%^7pad_;9i4!CGM+~+EbhKN|sycT(noE)MG4meJs^T+0B$If-yyW=N-chrR$f@ zy{lGh&}t)ohYO`wVcbpA!dY>+c~I~-Xsv@|qoYYR9Zj6*ONPhdN+NB%tb#WHy0a^{ z0k=H;BjT_R^*covQyCTkE_qfaNzP+}5+kwG!C_R?a91%4%lAfprhet4k zPE|P_RnBN`RXL@Ep^Y?mXmnIfo<_{2oE?p-N@SvuGNQyQ#N(YtfquV7a|eToP+SQH zHE%E&Pe#UK6t4^hzYBTLpE&vkdY>55s*fD(?>p50WN_f%3x^JVOLGq#eEQ&lp@V&z zyZ6YEf#+U8%ysbFM-B}j(nuMH1`j>g-+TD*?*)wlb3%@Ya{JtYo?}NL3#ntz96B^~ ztWQb3oKB7&JDrS%m0n0~`q*hDar)Td=<#EzXjHpInbPP|l~lSb!Szem z>Fr3L7>kkojR(WY_-HIj;?$Kg-&8Q7zpB9KxaQ=fR2wmpHvFa5A~-KB)ig~zmRkJN z)k}4&r`s$c?PtYQCAdsD zWxheiH66qjVU8@>VqfkJxai%>qPaG3v zFg-r1XiiLJq^GJ!LebcmssvRfl)?<@R8%#orZkC_@`loBHF|t3t)#R{nrVY!lq2=U zQ)8o)3Aq|mWBxkL0ZCR=QdZGKGz|r1KcS@Au+*&>o7zc1fPyXxx+&O3!FCEBqJUnn zRufGnAKBTxEoe;c>cjMG2L(H+fG3zr#>QxFM`vMuI(BGMN{NlA9aPLu0V9Yf7-Ysn zFqk44B2(!Vm1Z~f5d;(KSJ36g@1WtOWN3jeUJ-6N1yA(_SH|5u)AWgZ?TvN*cOQJ` z!C7Tt-NVz;>+Yp3+pat~_u$p|!j`^i=@WPJ($#p^FFRo3V1wkJd{@+z`UA+Y1hi*ql|KYD1P^J%Krw)E)ZAGUqa z_R+T&9_^d4w{tu)$d z^(mY()nmR`Y0-#? zqzm4+y$2;u7es?cSiDqEFcIt%|JO^*K$mWxDsm_xM|CR?O9*D>$s<Jf0Uc@ke%t12wm=oE}FR6P#Ev;pFJ-um2nm(VZ zyHOJL_TrYJmn<`R(wss11>+MdnMb_Hb5!$D1g{9$8lkf0jlCE4&R58vw(nS~slQZp zv1+Nl`BMMI{>wWu_5NE9`|9fHzSp14x`mqhH>NI3&AZzfrxkD*y?e%Cq#??2*eR30 zP)NTF^B6oK-X1fl)2GA~=sor-mJ`J!W~tXRq>d?abVQD@CgjvuIIJj<)K>Y4P%H&L z!P`~OL{o~{m*1uy#Aq}puc7uKVWF)06w)h_mDl@ys@8-6WUVGzox5;u(YH3^Tf5*} zKkr_@oM=Rj*YKAcK=6zp-WTCsg9UUBE&afD$^M59hcGDY5?+`7rTvWPx81&I{z$gs zI;kcTBn{!DnuG#RD4=gBtyAhZL+pNo+LfGY!4NG4m(lzgP-J3r`8OZ1);@v4%s%~} zG)I8=jjfkny!hf`LuaO;bD^PY(bqNa?wa>?-Og2_=&Nfsi)WPa3qb14v#0u>MShZ0i;xhJ?Gd_92w{G6O?zh3d ze{BB5a_pPrbovbt*<{=bMy@h^OOiaXsr)vR~5a-W#l#a_8UedygkqH%P2)mNSAsPuh&#-m7L7FUi%gv6*Av2a#oy? zt@Zzes?)NOtG3pH8QJ8*#sIjm(fcct6~T`+-rFfQNw3`^{&TTI`mtk6;UrzOmWha` z$OtaFBDV9i%F$OO)`z7aB*O;n6O7nlQ1~PnV}|Z5uEJlJEZ-L80(*r>LGwZG2?U0mzJ%4-G5qi; zamp4EN)d-7)KL3B5HE?M@OqmhjEiJ5&e((N zx_~Ecd-l-g!P!xD-^9-H3>OFj-xyVc!N8taG7KYpU%;&QJ`Mi?1dLIB(K`6kzN@`g zzdN(*?R{_Un_WBm{9;>IrgiYwIhy8PePFFPv273E6A9=$CxI8X2g>&?pPSk@Cu!2D zWHiB6PMQNyX*{Kd&>l1~t)euSzSv62W?m(NI+i2oXrtLWsUNFWi!xj-EFgZwa_%YpNXXtSmey4vIJJZI1ooQq!6&kN7)h z!&e`gJvnD&?0e#))Ccj;+0$%~;H>_otw`OuZabBC9)&UaD`G?3Z*Tbi~1g=T9Fi=zN6$t%4epi z2PgKc9K$uG>zB^Gt5z$~>MD#|Lg^}uyO!-J)j`EpGl}5fBH@Y!7O*)ZoW+x(Z3O%B zZ3IBQHU{UKvx5yrN-5AcB1LHyA#p0Yek^{U0AcgVxZUrV_|!B(4grAWo0(;-79G{G zOa|O~)-j$QS>Luqb=b9}ojwZf(i z&x-T)2N&xPXX+2%6l@LNrRv%@5*HFT?T79%og}iLqC3879i2$2cx~(9Tv^Szc z-j*oMOQq}!@ThRg-0(p+`ZXy6XQjSzK`iX*lZa@}zJrGk4jsfi?TjnwlS#HE5Y=2K zl@L}mDUhFOc3W~pJ%I9D_mi;b6QKH!5VuZ#tVAiuz#uqBU;ZOiqb&qbyGE#Mx#Yj- zpV|M}sYG1$6$AxTrAMW}fkLWs3;b`W zGO;olLrt#a_2`U2-5^z}HR`vEwf{kKkVT8r+JrO?y!59ylDDxeSL(28U1C(iLcw zU8P%|v>~6C3q@DNK^DmSPNOBric9TB*6kW>?Bie!v&Fkku}!yL0K}td&Hm)UA@)+4 zs#AMW8kI*GMn;$`20)2@}Ir%EVi5o$gjRw zJu{Z6*?7w(5i3Z>O5ZAV^vapk{cl9>RqDR3*ADq}Smp0auz{1Yfh*4jz{dRy8+WVE z<0q^1?&nhVF9YMVMP3)8K1J>waS+wwn-chBApYF z5Oe6-r^K9j%G4qHfT)hMwBDGsPfG8*-XrS+*OVje<1wb$O0+%cKs)9k0;4S2cQeNG zxeg zx|86@Jon;o+jE0MbCOCXi8_TqldydsVl%sipFI|RMru<{Qo!adw$>};>^Wx<9I3uZ z#q)}ecmh@$E(<_e0(vqgI1UlH@aj{4f~rtWANxwb**7$7t+P5Gf zb(~mfe^xxn)ArpmCWxvLEBV8y)!%gZZI_-340s{)NHA zgu$B^22%@HsJ{m?s~0GEor3RCkXOpzr{o(5`1u+>DX+l9467()V)Y`br;0h13a(^| zS;0&{@#~LJfvf1RjAad#zCF{ty_jWN9xA8Q%kXW1O5e4Aqj>#MasPVhde0Wb3(P!o zxlGd@j;8+(0I2FQ3`HgTXW2-^wFJffbU zW=~Qh-FF32>S~cNN;OJ#V+aaX3;cG{>#$g69vxk{c#0=#W6`^^OPb`J_p_--#V+gF6AwiuC z-MLB+ZXf_=n3a4E?`2n3z->1CIo-1BypE$H!F_bkHdmqm@IKtK?X?c?eABj^fP1#1 z9*OmPa{}(!?qcvxF2?_mQH=jl7Vy6fIS<9262E*KeWJ@Tpd)|-Is!<)JB&Z`(v1!w zw;fs5v(PxtEh!Eijk5vygW&^o%*9YaTSP+KJ?`*3wZ`SFOK0BsaXbcN*v#Gpf%>C) zE*D_^NFvxmZkz6K75QY5!O>7AZKpg-zGxBQf_u&5Am3r5_LOk&p0m z!n83vinCg@ACinShzec|W-Y+tjPnj)T!`<*jjy_BbOv}|iKCCegt*5*DFC1760jEf z7D-S8nt)MK2@`sD!;MlU` z8cgO(EEw644HXo`aC3wiv;BseJ#2tDt6nU^r0i8D!Zc1!xfzO4FTDSa6x&3>4~*a_ z5u+0+l0+v^`pbQ@b+h5w=6CwDfbsW>^ShqUu}HSY>DV)~p1^%R2G&RcUmItUbJKW3 z#mM%EjiK5$pxWT^QcHRGQ`i+kxn1zHaKqCA2shai5vSrEaRcji0N=i!nr_srWIi3O zK)kDzYSyaPj5&dNdnwPryH_l`$}CGLcI}E~>&&uMC|iG*WvfxPq4Y1km)sFMoVwib z7%}KrgH*Md@)o3=N+W2z3OzU7OCP1n-bc^1=(#ykhj&jSks|fbbuE^31JbRLM)tf7 z&zq2Lx1^hqUX8lsqtb%-8n&bG05n)zDQ!v4Lkx)yTNNNFNv0@CF&FJG0DmfWQy}a% zXx1OM;jC-g)LwVo8K5D2sciwXs|o*IgZ2GDlJf{X+0V#enzaLQj>r=Q3IX{NI*LYb zqVcr%oFW1G0y?!2jlWUnnYj?upr4c-}fn6%vidoUe4fIXP; zDJeezmYV(|wun7yx|&QmBKAoK$2@^QIKDFc0c~0E2j?B}2d8CHc87il0-5js0CN^7 z+TvMu7{o08bsn1`cLu&WMX?nQW##vq^x@=>a(#6tzfxcA(Jy0%Z3UBu5E8m@zU!ZW znKg-_H-C&MU+}V}?`xDiPr>&opjEHmT^6s=oV;JvTD(=%!1lf=O}n!noTWJ7e7XBsRflqUGSD>NNM~Kr8#Q$ zHRz3d#Lo(qM*&{ev%f{WzDL~OBwgRzhPdX4MdQ)5<{8B@4ZeI6O2Jl$iJ%dQ?)AvE zF=0>91}L>ubWPe#hbmBzt|D|T3XESAQQaBiC)#m1@E!Xa*z zQ{>Er7V^VFBCf>Y1Dzj;^-woIhQmhCBOe{buaQ~8^h4wR)MUaKzX|7Qc>e*NBprTp z@cK-v-%gC-h&~$J76Wy$ zqucoL80Vo88lNdBG+tD|an^`A+~v)}sTI7$DVwi=_r-Xs!_S8X<4=i?;u91^;SgN& zPOdam-rAXHn!DV@lPP?`!eBNwK$#?Ys~im|0U6$b9jwMyd0TgPx8JhnG7t9aj)}|z z5y!9?xyGXk(5|sj8Wisla1}A4`D@jmK>Bbvl5Xn1K!77o2XNCW=tl%uCAjz!#mEtu zglNveO*bmd>S<11O#O4@q)1CJ8giKCJtWIoY`npLL&}$qssJA95U@A4`r_)vRa-Kv zw#@Fh>R(v3XWF@hBRbf4yS#Ju!3=y@#}|CNrlo>&I{LDG~OoG`?so7A+FyXW&<~yl|Y^w4nSpO`;}LvX%@q+k9HM z@BbGlGSOBB0;5L$4=D?R!U2G7f=4Btufs<@mKxiZTGvD1tD51+rXN?z3J&9>rB#ec z++V|Aj?NC7#*!|^$TF{${U^5zZ`i}O6GGVbkl|S=ald~UQTB_r*DGPt)Z@>y6J@6C zg9t?yJ0mbd#~!M;s*55+hkoog+QVF?m0|U7w1-@3@kY$E!qV+`U3;iMgADfjMU`v_ z!!5`^2|Prr-6JC7q$gcLuh~-9b1IW4=!%nmD#k* z)Fhi9fhO5p4VT!p)xUB8NypB5jrT@l`!DT6RbAGG>@TvE|HUuq0e0g(-e0rmuT$M< z_|>M};#*=s`ZMQl@v?2F^do7z^Cx1r_g(vT=buYErGF*v7O#rioj((IN`K+rE$Ze~ zI{C7a&?=az#SxBz54D-L%HN|4tF2OMr;HRBfmmN+Z_T=+M)WSaN&#Q&M6bK3Ad&#Y z3U|~hj54sZO0+#$xTAIf8rswX1MrKC0<{76r(m`Kv?78LBC>q$Fpj&JhLH6zOWw*F z;J^%_CdyeQjBkBKkDEh04z8B*A>rKR|N)M<`pg z%XMF(+_L)Z)o-m{Y}uA+vH19KQEnwKpH}knDI?EW7oHeCJ?r+1;`I$;?_<*Sjctf) zUigC0aYwk46r61$`Nw)d$kFzG*{v-6$l|Ni+*xv7hHs#;6$M8w<1iq33KlnsbpFE> z4B5a}(DSlqoqb1@a1`4}zxnw$PsSdaWsQ$#W9mIRaM;`=(zjcXt8Wglfqu!^k9nxU z-;|~*e5)=QhfBETmh zhBTMKh!ObLKs{a{*R;6>L z4%jkv`&W2S$dA0E4iIMed*V$1$a z%l?mce7t3$<>+GF(Gna=M$!ugTKjNso%okx?<(o%ZHO_qxzfs#R$A6&5R{pf$?=pf zIP06LZxEh;6K|V#1Ux?gO^t6|;kug!?Bk#t0ngls=`P20N+4?K1=T=`k@Ck#+x#?-87^ww2{&M$2S@pl5ruttg z_!|V)fznre@Wml~t){H5GYXu?c+`1nWFvwCKP062=xCVte%7Cea*t>I86AzY{;$)> z{tR8Sk@;=?{eHRloc}6%{0IeA6fi%WQHs%$m^-%F7Cr_ynp(3Cioid|SDSUQsJq}(J*-^TOTIc4>@i$4 z`3HaQzX|+X5b}nl^_y?HnjE`t_?l+y7pAff#4(Ke_L&10_h#t{c?i|c*KW;tI&&UM z@61>06)p98Y5e($NTOyF+?6t(?Nk#PX4PhRCmB5=ZmCEq)T^Ga?#OujIS-{DF?wvV zR72cSjZ)TXlbYE$oYhS``>)h6*j=+`5xyqZK2ON*xsBf8BKXZEK!A$+8tOFTn zsNLZvI7~E z!hM67JTqx$0=og_nbu)w=WX{M{;yx`Q$NE42(pkmg&=DeMe(MsQj|V#7sNGxD;!=F z4rheJe=F?F2s=L$9{Eh@`ApdUnXvgYVeKvFkWCyE=htq#C9v47gml~{4v3e1w*(fs d^|Yf#+%q$DOTg{crc)9U$36#ICvq2~{|9kdl#c)a literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/supporting_document_type.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/__pycache__/supporting_document_type.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84809135c824bc45d7021efc5fd1211a8a62630d GIT binary patch literal 19280 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__init__.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__init__.py new file mode 100644 index 00000000..079540d8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__init__.py @@ -0,0 +1,1013 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.numbers.v2.regulatory_compliance.bundle.bundle_copy import ( + BundleCopyList, +) +from twilio.rest.numbers.v2.regulatory_compliance.bundle.evaluation import ( + EvaluationList, +) +from twilio.rest.numbers.v2.regulatory_compliance.bundle.item_assignment import ( + ItemAssignmentList, +) +from twilio.rest.numbers.v2.regulatory_compliance.bundle.replace_items import ( + ReplaceItemsList, +) + + +class BundleInstance(InstanceResource): + + class EndUserType(object): + INDIVIDUAL = "individual" + BUSINESS = "business" + + class SortBy(object): + VALID_UNTIL = "valid-until" + DATE_UPDATED = "date-updated" + + class SortDirection(object): + ASC = "ASC" + DESC = "DESC" + + class Status(object): + DRAFT = "draft" + PENDING_REVIEW = "pending-review" + IN_REVIEW = "in-review" + TWILIO_REJECTED = "twilio-rejected" + TWILIO_APPROVED = "twilio-approved" + PROVISIONALLY_APPROVED = "provisionally-approved" + + """ + :ivar sid: The unique string that we created to identify the Bundle resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Bundle resource. + :ivar regulation_sid: The unique string of a regulation that is associated to the Bundle resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar status: + :ivar valid_until: The date and time in GMT in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format when the resource will be valid until. + :ivar email: The email address that will receive updates when the Bundle resource changes status. + :ivar status_callback: The URL we call to inform your application of status changes. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Bundle resource. + :ivar links: The URLs of the Assigned Items of the Bundle resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.regulation_sid: Optional[str] = payload.get("regulation_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.status: Optional["BundleInstance.Status"] = payload.get("status") + self.valid_until: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("valid_until") + ) + self.email: Optional[str] = payload.get("email") + self.status_callback: Optional[str] = payload.get("status_callback") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[BundleContext] = None + + @property + def _proxy(self) -> "BundleContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: BundleContext for this BundleInstance + """ + if self._context is None: + self._context = BundleContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the BundleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the BundleInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "BundleInstance": + """ + Fetch the BundleInstance + + + :returns: The fetched BundleInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "BundleInstance": + """ + Asynchronous coroutine to fetch the BundleInstance + + + :returns: The fetched BundleInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + status: Union["BundleInstance.Status", object] = values.unset, + status_callback: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + ) -> "BundleInstance": + """ + Update the BundleInstance + + :param status: + :param status_callback: The URL we call to inform your application of status changes. + :param friendly_name: The string that you assigned to describe the resource. + :param email: The email address that will receive updates when the Bundle resource changes status. + + :returns: The updated BundleInstance + """ + return self._proxy.update( + status=status, + status_callback=status_callback, + friendly_name=friendly_name, + email=email, + ) + + async def update_async( + self, + status: Union["BundleInstance.Status", object] = values.unset, + status_callback: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + ) -> "BundleInstance": + """ + Asynchronous coroutine to update the BundleInstance + + :param status: + :param status_callback: The URL we call to inform your application of status changes. + :param friendly_name: The string that you assigned to describe the resource. + :param email: The email address that will receive updates when the Bundle resource changes status. + + :returns: The updated BundleInstance + """ + return await self._proxy.update_async( + status=status, + status_callback=status_callback, + friendly_name=friendly_name, + email=email, + ) + + @property + def bundle_copies(self) -> BundleCopyList: + """ + Access the bundle_copies + """ + return self._proxy.bundle_copies + + @property + def evaluations(self) -> EvaluationList: + """ + Access the evaluations + """ + return self._proxy.evaluations + + @property + def item_assignments(self) -> ItemAssignmentList: + """ + Access the item_assignments + """ + return self._proxy.item_assignments + + @property + def replace_items(self) -> ReplaceItemsList: + """ + Access the replace_items + """ + return self._proxy.replace_items + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BundleContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the BundleContext + + :param version: Version that contains the resource + :param sid: The unique string that we created to identify the Bundle resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/RegulatoryCompliance/Bundles/{sid}".format(**self._solution) + + self._bundle_copies: Optional[BundleCopyList] = None + self._evaluations: Optional[EvaluationList] = None + self._item_assignments: Optional[ItemAssignmentList] = None + self._replace_items: Optional[ReplaceItemsList] = None + + def delete(self) -> bool: + """ + Deletes the BundleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the BundleInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> BundleInstance: + """ + Fetch the BundleInstance + + + :returns: The fetched BundleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return BundleInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> BundleInstance: + """ + Asynchronous coroutine to fetch the BundleInstance + + + :returns: The fetched BundleInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return BundleInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + status: Union["BundleInstance.Status", object] = values.unset, + status_callback: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + ) -> BundleInstance: + """ + Update the BundleInstance + + :param status: + :param status_callback: The URL we call to inform your application of status changes. + :param friendly_name: The string that you assigned to describe the resource. + :param email: The email address that will receive updates when the Bundle resource changes status. + + :returns: The updated BundleInstance + """ + + data = values.of( + { + "Status": status, + "StatusCallback": status_callback, + "FriendlyName": friendly_name, + "Email": email, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BundleInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + status: Union["BundleInstance.Status", object] = values.unset, + status_callback: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + ) -> BundleInstance: + """ + Asynchronous coroutine to update the BundleInstance + + :param status: + :param status_callback: The URL we call to inform your application of status changes. + :param friendly_name: The string that you assigned to describe the resource. + :param email: The email address that will receive updates when the Bundle resource changes status. + + :returns: The updated BundleInstance + """ + + data = values.of( + { + "Status": status, + "StatusCallback": status_callback, + "FriendlyName": friendly_name, + "Email": email, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BundleInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def bundle_copies(self) -> BundleCopyList: + """ + Access the bundle_copies + """ + if self._bundle_copies is None: + self._bundle_copies = BundleCopyList( + self._version, + self._solution["sid"], + ) + return self._bundle_copies + + @property + def evaluations(self) -> EvaluationList: + """ + Access the evaluations + """ + if self._evaluations is None: + self._evaluations = EvaluationList( + self._version, + self._solution["sid"], + ) + return self._evaluations + + @property + def item_assignments(self) -> ItemAssignmentList: + """ + Access the item_assignments + """ + if self._item_assignments is None: + self._item_assignments = ItemAssignmentList( + self._version, + self._solution["sid"], + ) + return self._item_assignments + + @property + def replace_items(self) -> ReplaceItemsList: + """ + Access the replace_items + """ + if self._replace_items is None: + self._replace_items = ReplaceItemsList( + self._version, + self._solution["sid"], + ) + return self._replace_items + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BundlePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> BundleInstance: + """ + Build an instance of BundleInstance + + :param payload: Payload response from the API + """ + return BundleInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class BundleList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the BundleList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/RegulatoryCompliance/Bundles" + + def create( + self, + friendly_name: str, + email: str, + status_callback: Union[str, object] = values.unset, + regulation_sid: Union[str, object] = values.unset, + iso_country: Union[str, object] = values.unset, + end_user_type: Union["BundleInstance.EndUserType", object] = values.unset, + number_type: Union[str, object] = values.unset, + is_test: Union[bool, object] = values.unset, + ) -> BundleInstance: + """ + Create the BundleInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param email: The email address that will receive updates when the Bundle resource changes status. + :param status_callback: The URL we call to inform your application of status changes. + :param regulation_sid: The unique string of a regulation that is associated to the Bundle resource. + :param iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + :param end_user_type: + :param number_type: The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll-free`. + :param is_test: Indicates that Bundle is a Test Bundle and will be Auto-Rejected + + :returns: The created BundleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Email": email, + "StatusCallback": status_callback, + "RegulationSid": regulation_sid, + "IsoCountry": iso_country, + "EndUserType": end_user_type, + "NumberType": number_type, + "IsTest": serialize.boolean_to_string(is_test), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BundleInstance(self._version, payload) + + async def create_async( + self, + friendly_name: str, + email: str, + status_callback: Union[str, object] = values.unset, + regulation_sid: Union[str, object] = values.unset, + iso_country: Union[str, object] = values.unset, + end_user_type: Union["BundleInstance.EndUserType", object] = values.unset, + number_type: Union[str, object] = values.unset, + is_test: Union[bool, object] = values.unset, + ) -> BundleInstance: + """ + Asynchronously create the BundleInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param email: The email address that will receive updates when the Bundle resource changes status. + :param status_callback: The URL we call to inform your application of status changes. + :param regulation_sid: The unique string of a regulation that is associated to the Bundle resource. + :param iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + :param end_user_type: + :param number_type: The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll-free`. + :param is_test: Indicates that Bundle is a Test Bundle and will be Auto-Rejected + + :returns: The created BundleInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Email": email, + "StatusCallback": status_callback, + "RegulationSid": regulation_sid, + "IsoCountry": iso_country, + "EndUserType": end_user_type, + "NumberType": number_type, + "IsTest": serialize.boolean_to_string(is_test), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BundleInstance(self._version, payload) + + def stream( + self, + status: Union["BundleInstance.Status", object] = values.unset, + friendly_name: Union[str, object] = values.unset, + regulation_sid: Union[str, object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + has_valid_until_date: Union[bool, object] = values.unset, + sort_by: Union["BundleInstance.SortBy", object] = values.unset, + sort_direction: Union["BundleInstance.SortDirection", object] = values.unset, + valid_until_date: Union[datetime, object] = values.unset, + valid_until_date_before: Union[datetime, object] = values.unset, + valid_until_date_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[BundleInstance]: + """ + Streams BundleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "BundleInstance.Status" status: The verification status of the Bundle resource. Please refer to [Bundle Statuses](https://www.twilio.com/docs/phone-numbers/regulatory/api/bundles#bundle-statuses) for more details. + :param str friendly_name: The string that you assigned to describe the resource. The column can contain 255 variable characters. + :param str regulation_sid: The unique string of a [Regulation resource](https://www.twilio.com/docs/phone-numbers/regulatory/api/regulations) that is associated to the Bundle resource. + :param str iso_country: The 2-digit [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + :param str number_type: The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll-free`. + :param bool has_valid_until_date: Indicates that the Bundle is a valid Bundle until a specified expiration date. + :param "BundleInstance.SortBy" sort_by: Can be `valid-until` or `date-updated`. Defaults to `date-created`. + :param "BundleInstance.SortDirection" sort_direction: Default is `DESC`. Can be `ASC` or `DESC`. + :param datetime valid_until_date: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param datetime valid_until_date_before: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param datetime valid_until_date_after: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + status=status, + friendly_name=friendly_name, + regulation_sid=regulation_sid, + iso_country=iso_country, + number_type=number_type, + has_valid_until_date=has_valid_until_date, + sort_by=sort_by, + sort_direction=sort_direction, + valid_until_date=valid_until_date, + valid_until_date_before=valid_until_date_before, + valid_until_date_after=valid_until_date_after, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + status: Union["BundleInstance.Status", object] = values.unset, + friendly_name: Union[str, object] = values.unset, + regulation_sid: Union[str, object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + has_valid_until_date: Union[bool, object] = values.unset, + sort_by: Union["BundleInstance.SortBy", object] = values.unset, + sort_direction: Union["BundleInstance.SortDirection", object] = values.unset, + valid_until_date: Union[datetime, object] = values.unset, + valid_until_date_before: Union[datetime, object] = values.unset, + valid_until_date_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[BundleInstance]: + """ + Asynchronously streams BundleInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "BundleInstance.Status" status: The verification status of the Bundle resource. Please refer to [Bundle Statuses](https://www.twilio.com/docs/phone-numbers/regulatory/api/bundles#bundle-statuses) for more details. + :param str friendly_name: The string that you assigned to describe the resource. The column can contain 255 variable characters. + :param str regulation_sid: The unique string of a [Regulation resource](https://www.twilio.com/docs/phone-numbers/regulatory/api/regulations) that is associated to the Bundle resource. + :param str iso_country: The 2-digit [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + :param str number_type: The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll-free`. + :param bool has_valid_until_date: Indicates that the Bundle is a valid Bundle until a specified expiration date. + :param "BundleInstance.SortBy" sort_by: Can be `valid-until` or `date-updated`. Defaults to `date-created`. + :param "BundleInstance.SortDirection" sort_direction: Default is `DESC`. Can be `ASC` or `DESC`. + :param datetime valid_until_date: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param datetime valid_until_date_before: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param datetime valid_until_date_after: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + status=status, + friendly_name=friendly_name, + regulation_sid=regulation_sid, + iso_country=iso_country, + number_type=number_type, + has_valid_until_date=has_valid_until_date, + sort_by=sort_by, + sort_direction=sort_direction, + valid_until_date=valid_until_date, + valid_until_date_before=valid_until_date_before, + valid_until_date_after=valid_until_date_after, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + status: Union["BundleInstance.Status", object] = values.unset, + friendly_name: Union[str, object] = values.unset, + regulation_sid: Union[str, object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + has_valid_until_date: Union[bool, object] = values.unset, + sort_by: Union["BundleInstance.SortBy", object] = values.unset, + sort_direction: Union["BundleInstance.SortDirection", object] = values.unset, + valid_until_date: Union[datetime, object] = values.unset, + valid_until_date_before: Union[datetime, object] = values.unset, + valid_until_date_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BundleInstance]: + """ + Lists BundleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "BundleInstance.Status" status: The verification status of the Bundle resource. Please refer to [Bundle Statuses](https://www.twilio.com/docs/phone-numbers/regulatory/api/bundles#bundle-statuses) for more details. + :param str friendly_name: The string that you assigned to describe the resource. The column can contain 255 variable characters. + :param str regulation_sid: The unique string of a [Regulation resource](https://www.twilio.com/docs/phone-numbers/regulatory/api/regulations) that is associated to the Bundle resource. + :param str iso_country: The 2-digit [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + :param str number_type: The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll-free`. + :param bool has_valid_until_date: Indicates that the Bundle is a valid Bundle until a specified expiration date. + :param "BundleInstance.SortBy" sort_by: Can be `valid-until` or `date-updated`. Defaults to `date-created`. + :param "BundleInstance.SortDirection" sort_direction: Default is `DESC`. Can be `ASC` or `DESC`. + :param datetime valid_until_date: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param datetime valid_until_date_before: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param datetime valid_until_date_after: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + status=status, + friendly_name=friendly_name, + regulation_sid=regulation_sid, + iso_country=iso_country, + number_type=number_type, + has_valid_until_date=has_valid_until_date, + sort_by=sort_by, + sort_direction=sort_direction, + valid_until_date=valid_until_date, + valid_until_date_before=valid_until_date_before, + valid_until_date_after=valid_until_date_after, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + status: Union["BundleInstance.Status", object] = values.unset, + friendly_name: Union[str, object] = values.unset, + regulation_sid: Union[str, object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + has_valid_until_date: Union[bool, object] = values.unset, + sort_by: Union["BundleInstance.SortBy", object] = values.unset, + sort_direction: Union["BundleInstance.SortDirection", object] = values.unset, + valid_until_date: Union[datetime, object] = values.unset, + valid_until_date_before: Union[datetime, object] = values.unset, + valid_until_date_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BundleInstance]: + """ + Asynchronously lists BundleInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "BundleInstance.Status" status: The verification status of the Bundle resource. Please refer to [Bundle Statuses](https://www.twilio.com/docs/phone-numbers/regulatory/api/bundles#bundle-statuses) for more details. + :param str friendly_name: The string that you assigned to describe the resource. The column can contain 255 variable characters. + :param str regulation_sid: The unique string of a [Regulation resource](https://www.twilio.com/docs/phone-numbers/regulatory/api/regulations) that is associated to the Bundle resource. + :param str iso_country: The 2-digit [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + :param str number_type: The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll-free`. + :param bool has_valid_until_date: Indicates that the Bundle is a valid Bundle until a specified expiration date. + :param "BundleInstance.SortBy" sort_by: Can be `valid-until` or `date-updated`. Defaults to `date-created`. + :param "BundleInstance.SortDirection" sort_direction: Default is `DESC`. Can be `ASC` or `DESC`. + :param datetime valid_until_date: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param datetime valid_until_date_before: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param datetime valid_until_date_after: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + status=status, + friendly_name=friendly_name, + regulation_sid=regulation_sid, + iso_country=iso_country, + number_type=number_type, + has_valid_until_date=has_valid_until_date, + sort_by=sort_by, + sort_direction=sort_direction, + valid_until_date=valid_until_date, + valid_until_date_before=valid_until_date_before, + valid_until_date_after=valid_until_date_after, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + status: Union["BundleInstance.Status", object] = values.unset, + friendly_name: Union[str, object] = values.unset, + regulation_sid: Union[str, object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + has_valid_until_date: Union[bool, object] = values.unset, + sort_by: Union["BundleInstance.SortBy", object] = values.unset, + sort_direction: Union["BundleInstance.SortDirection", object] = values.unset, + valid_until_date: Union[datetime, object] = values.unset, + valid_until_date_before: Union[datetime, object] = values.unset, + valid_until_date_after: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BundlePage: + """ + Retrieve a single page of BundleInstance records from the API. + Request is executed immediately + + :param status: The verification status of the Bundle resource. Please refer to [Bundle Statuses](https://www.twilio.com/docs/phone-numbers/regulatory/api/bundles#bundle-statuses) for more details. + :param friendly_name: The string that you assigned to describe the resource. The column can contain 255 variable characters. + :param regulation_sid: The unique string of a [Regulation resource](https://www.twilio.com/docs/phone-numbers/regulatory/api/regulations) that is associated to the Bundle resource. + :param iso_country: The 2-digit [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + :param number_type: The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll-free`. + :param has_valid_until_date: Indicates that the Bundle is a valid Bundle until a specified expiration date. + :param sort_by: Can be `valid-until` or `date-updated`. Defaults to `date-created`. + :param sort_direction: Default is `DESC`. Can be `ASC` or `DESC`. + :param valid_until_date: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param valid_until_date_before: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param valid_until_date_after: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BundleInstance + """ + data = values.of( + { + "Status": status, + "FriendlyName": friendly_name, + "RegulationSid": regulation_sid, + "IsoCountry": iso_country, + "NumberType": number_type, + "HasValidUntilDate": serialize.boolean_to_string(has_valid_until_date), + "SortBy": sort_by, + "SortDirection": sort_direction, + "ValidUntilDate": serialize.iso8601_datetime(valid_until_date), + "ValidUntilDate<": serialize.iso8601_datetime(valid_until_date_before), + "ValidUntilDate>": serialize.iso8601_datetime(valid_until_date_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BundlePage(self._version, response) + + async def page_async( + self, + status: Union["BundleInstance.Status", object] = values.unset, + friendly_name: Union[str, object] = values.unset, + regulation_sid: Union[str, object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + has_valid_until_date: Union[bool, object] = values.unset, + sort_by: Union["BundleInstance.SortBy", object] = values.unset, + sort_direction: Union["BundleInstance.SortDirection", object] = values.unset, + valid_until_date: Union[datetime, object] = values.unset, + valid_until_date_before: Union[datetime, object] = values.unset, + valid_until_date_after: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BundlePage: + """ + Asynchronously retrieve a single page of BundleInstance records from the API. + Request is executed immediately + + :param status: The verification status of the Bundle resource. Please refer to [Bundle Statuses](https://www.twilio.com/docs/phone-numbers/regulatory/api/bundles#bundle-statuses) for more details. + :param friendly_name: The string that you assigned to describe the resource. The column can contain 255 variable characters. + :param regulation_sid: The unique string of a [Regulation resource](https://www.twilio.com/docs/phone-numbers/regulatory/api/regulations) that is associated to the Bundle resource. + :param iso_country: The 2-digit [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + :param number_type: The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll-free`. + :param has_valid_until_date: Indicates that the Bundle is a valid Bundle until a specified expiration date. + :param sort_by: Can be `valid-until` or `date-updated`. Defaults to `date-created`. + :param sort_direction: Default is `DESC`. Can be `ASC` or `DESC`. + :param valid_until_date: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param valid_until_date_before: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param valid_until_date_after: Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BundleInstance + """ + data = values.of( + { + "Status": status, + "FriendlyName": friendly_name, + "RegulationSid": regulation_sid, + "IsoCountry": iso_country, + "NumberType": number_type, + "HasValidUntilDate": serialize.boolean_to_string(has_valid_until_date), + "SortBy": sort_by, + "SortDirection": sort_direction, + "ValidUntilDate": serialize.iso8601_datetime(valid_until_date), + "ValidUntilDate<": serialize.iso8601_datetime(valid_until_date_before), + "ValidUntilDate>": serialize.iso8601_datetime(valid_until_date_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BundlePage(self._version, response) + + def get_page(self, target_url: str) -> BundlePage: + """ + Retrieve a specific page of BundleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BundleInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return BundlePage(self._version, response) + + async def get_page_async(self, target_url: str) -> BundlePage: + """ + Asynchronously retrieve a specific page of BundleInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BundleInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return BundlePage(self._version, response) + + def get(self, sid: str) -> BundleContext: + """ + Constructs a BundleContext + + :param sid: The unique string that we created to identify the Bundle resource. + """ + return BundleContext(self._version, sid=sid) + + def __call__(self, sid: str) -> BundleContext: + """ + Constructs a BundleContext + + :param sid: The unique string that we created to identify the Bundle resource. + """ + return BundleContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e5275c24533cc78901fed3f3f43740deba9f88d GIT binary patch literal 50874 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 R>*2PS1tiXY%+Z?-`QL;#Of3Ka literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/evaluation.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/evaluation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0236e87ca915e95d37956f6961dd06d5ed095720 GIT binary patch literal 20723 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%0A#{Z5Y?IZ%b-uow$tw$%9J~mZz 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/item_assignment.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/item_assignment.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..757d6cd4842b21f4200564735d8a831a2789c305 GIT binary patch literal 23249 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 YI&tSz!wmtq8=Fo`D71el(47JDzo+#9c>n+a literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/replace_items.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/__pycache__/replace_items.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d83894e91496cd5c0b6ec131ccf3c7bdb928944 GIT binary patch literal 6779 zcmdT|UrZdw8K1q|`^y0raBPE}ccr zVIMxKG_hJNId$^TKpv_jQl%I^3?B}xjoJp znyTqTI~?E4eDlpWv$Nly-|QdC%Yy{U8=t>Ca$_4If5MJaJcY*cBs8XoN@7G6R98Ys z3Nb;zwmacUx?}F77!#A8n1}Jigg5Dn`I7#apY=V7Kr$E$vbHx-mJG#0tnEvbCo5tV z0&$VkMD<@GYCsF#bn`W1m5dt%ZkZM;a>LnBq+I!%KuA!6GBBc>Qru8A>7rsv=e3kZ z6-!g4p)3x|vMjCrAp==5PGmJF_jL)Tpi`^l{Dh zjwy+ZX2Q&HN6NI6R9x%ROd~_%8t_70x@nd4eP`idKu?_8AE(|zXE_FqUxEv0Bqo3x zxR`MYV4N<^T{KQHKvcKpQAN$G`85Bqs|IGN9?duGog~A8>b(+*1ympOU108FEI3In z39+(%5((H_`m}UHiEAB}mNcF1-m@35c~+M9LbbLNRfxG&S4>phF<3d~RXs7E>W%rc zzKDNy$3|MC{gz^7OxvSUW!M_8fH$M+sq^(z8`HIm;{iS8G%GD;5YQdf;^0@~4ns+& zsWAqOtyt@LZuqY19ey`FkzbZmN>Y<$J1EOZL(L?x9g^i&;Jp?`JZ*g~rv~hb-uCXc zj_%WPU;EjP_H%ZiquXg#4xH=g>ga*)v+b<|?QOQhXzA_k>p2UItyp*Tcl30(balNT zJNy~4jK{T_Yi$~Q9*n{q?Cj_m7;Mwb3zm@{95eK|)&kaO4UTE4vB55VXwcLxtv;>9 zFDU0VbC5rK1Jz8cA;tZsVeAO>&u0>fWzeh~HEPQhS}!E^a#7a_kErikT?kgH;jyaD4m;by^#1d?-&I^n%2 z2i97Y$Pu{^iecWyvMxs($QF09iLARswz%#lvSNv>}GzJ|_P7N9>9F1yO z&aDf;K_g}*OCq6e+YJ_ImnreMkx5x-j&?=CIUpRce)%xfA-E*6EE3pW2*Mb6${;Z7 zstmLAgzeFi3RIPROpZew83GryLm2JlIMpzr7kZgAGF2+UE+S#uV`kDC#XzH{bPIxu z`@Ck+JupZgL4tvjK8j=?5;PAxteeL1qm74UCz;UwICcO@1j#`pbwKQZY#NCS=9Y-Z z7ELWNOdrOL_Vl{zwU;%u;=kf@tS|>;Ne?!Gj+4cg@bLA;urqyOZAW6dU58(xhFdo z>Yqi_4UrH zozvwDp?%A4S7VTA%zMeBhd$_hzjM~Nu=hAj2rfmRxOHLX!dz45LbMBIc7ECTqs7Lq z`Nl3sMa4pBKd3m&RMf0^$>HXIC6Eu2@|x*`dAF+;X1r0sf}HK8nw6ocxRc%BJP4j8 zi)2@z0kBgTEgeM(D5~oU$&pcrb?eJUaqVV7sEs%+$I>SN#Eupt$C|FSSPA)ATpbSL z+r`q084nPrB01JALD+{h0l7p$YvHH~MVt7;nN89eB|f63v`wd=G?rCCy6-3+gH0`; z0@6tYIF1~732?uA7CUd0Utg1afVMNV3B3+!uw2Yus~r;>VXK zx&Z}whYgxkEI?GQXrnD$u!S)bj~=$d40$!sjEL=0nw}VM+{B#m>18?EoG`$7%@fh$ zj5DCfL~r>E+W6w#>dVeeB&6@0_@?`^IyNI~wL|`~P8L@_236ZehHxnM2TM z0jNgL9*J(Ws&skcL`1a3QA1DBMwo4TSjwfxp&fD2!^rZ*jg+NbvP?XP!t-FT;QQUw zJNfWwm}4FV@+!%PNcGmK18*IGz20v7r2FIU#pd4m=H7+ozAtL~7pnRveM^%mr#HUEM<3Jmb@2-#)(d%h?bL$F$DjzQM`17?}J;C>Uc>>k! z-dXc@>+GeEqOAK_{4R3yjXuvAVfvA83Dz8XpxQY67Yl9<%klt_QXs4f8o*CY92ObG zbpymj04xIR^$v>wc}0MuYkeQ|{V*mLAaH;|;2?v*;nFva=$waJ3091wO**9*9xefA z9nf*#4|G)U1(v>wp~3~hW3&h?9JLTqL>)tl^Q>zF&H=L&3+}NHK=c&9kwH9RHJa_`@riCS_9k zD;Z6K!vYA;^+0ff%sQ-VT+>MgO{I$?8r9hL&{HJ1$LZ%&Nsu%p1qRN8C&7F}8qzSF z;Z;N}-2WgJNG#utA8Y6)8!oSHZUQ9N?lavKv2Vmf4?)Fk9G#YVt1ZeI zsz*fTvukghn>!vjtX`T_Yf2TPl|-F{+7H4e#z_b^D`66-SWBsSe`)TyRss3$!RLj! zEoT3q}G$b_7W%!Z- z;n^zYs*Q3J7^9#UG4_P(d!$_|Ag^Mka;xqfI9oF;ri#$=U~6N8-6*4}UXb;}lyxQN z%DF%E-7FaQglJ)4Vr669Ik-)X77?r?3w!e8efPtFa~}q$4vv3PG~iYSp}mz?^8ZaU-4G*s@Vai50KqV|1MYwv!pQda#yHm$Ahh6^uzIALkO;Zps@ix=xLq1I<;LQCOyDRnhmDl%#sDcjo;k85em z7JGa82WCXuo7AikL$%%D2et^fRIz;{nxewRkGUPhehCgX;-mQTY?m<%Sdihh( zXJCkB1C|bFJlvf+kc%OkK92-*aS^HV1W#W8-uSlCGhj}|)oM85IuP)vDiYp$J$p5K zC%o&uU4Y`sE0*127+hr~NUCe5B5y^ee>zv+JGb+>g{r_}lfE}A=KZ_w?2JOo zKku)(Q?+%f{;m4Os(tfS`q!=`()ak*|GX!@4jy$GBFo#Z zDfcft9`XY`Gr&Bv_;IzL93$5v3=Ecy|FP(yEoL?qAE8Fd$e4+2!9V`r9F}&170@mu zh(BpJk{%?zNS*`I&HRa;g=WF2=s6tw2@pHPEnimfFxI&h#m|829cU1E_kzh12jXge zj?;bvgaP6IiYIN~`EL0;<%`>o%x^!k-jiw`15c_6e*15`Q$7HWw`w9zeXZrulhwkf z`-PJah@T!f2Px# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/bundle_copy.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/bundle_copy.py new file mode 100644 index 00000000..d20a5696 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/bundle_copy.py @@ -0,0 +1,382 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class BundleCopyInstance(InstanceResource): + + class Status(object): + DRAFT = "draft" + PENDING_REVIEW = "pending-review" + IN_REVIEW = "in-review" + TWILIO_REJECTED = "twilio-rejected" + TWILIO_APPROVED = "twilio-approved" + PROVISIONALLY_APPROVED = "provisionally-approved" + + """ + :ivar sid: The unique string that we created to identify the Bundle resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Bundle resource. + :ivar regulation_sid: The unique string of a regulation that is associated to the Bundle resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar status: + :ivar valid_until: The date and time in GMT in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format when the resource will be valid until. + :ivar email: The email address that will receive updates when the Bundle resource changes status. + :ivar status_callback: The URL we call to inform your application of status changes. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], bundle_sid: str): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.regulation_sid: Optional[str] = payload.get("regulation_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.status: Optional["BundleCopyInstance.Status"] = payload.get("status") + self.valid_until: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("valid_until") + ) + self.email: Optional[str] = payload.get("email") + self.status_callback: Optional[str] = payload.get("status_callback") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "bundle_sid": bundle_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class BundleCopyPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> BundleCopyInstance: + """ + Build an instance of BundleCopyInstance + + :param payload: Payload response from the API + """ + return BundleCopyInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class BundleCopyList(ListResource): + + def __init__(self, version: Version, bundle_sid: str): + """ + Initialize the BundleCopyList + + :param version: Version that contains the resource + :param bundle_sid: The unique string that we created to identify the Bundle resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "bundle_sid": bundle_sid, + } + self._uri = "/RegulatoryCompliance/Bundles/{bundle_sid}/Copies".format( + **self._solution + ) + + def create( + self, friendly_name: Union[str, object] = values.unset + ) -> BundleCopyInstance: + """ + Create the BundleCopyInstance + + :param friendly_name: The string that you assigned to describe the copied bundle. + + :returns: The created BundleCopyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BundleCopyInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + async def create_async( + self, friendly_name: Union[str, object] = values.unset + ) -> BundleCopyInstance: + """ + Asynchronously create the BundleCopyInstance + + :param friendly_name: The string that you assigned to describe the copied bundle. + + :returns: The created BundleCopyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return BundleCopyInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[BundleCopyInstance]: + """ + Streams BundleCopyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[BundleCopyInstance]: + """ + Asynchronously streams BundleCopyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BundleCopyInstance]: + """ + Lists BundleCopyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[BundleCopyInstance]: + """ + Asynchronously lists BundleCopyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BundleCopyPage: + """ + Retrieve a single page of BundleCopyInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BundleCopyInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BundleCopyPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> BundleCopyPage: + """ + Asynchronously retrieve a single page of BundleCopyInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of BundleCopyInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return BundleCopyPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> BundleCopyPage: + """ + Retrieve a specific page of BundleCopyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BundleCopyInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return BundleCopyPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> BundleCopyPage: + """ + Asynchronously retrieve a specific page of BundleCopyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of BundleCopyInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return BundleCopyPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/evaluation.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/evaluation.py new file mode 100644 index 00000000..fd450648 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/evaluation.py @@ -0,0 +1,487 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class EvaluationInstance(InstanceResource): + + class Status(object): + COMPLIANT = "compliant" + NONCOMPLIANT = "noncompliant" + + """ + :ivar sid: The unique string that identifies the Evaluation resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Bundle resource. + :ivar regulation_sid: The unique string of a regulation that is associated to the Bundle resource. + :ivar bundle_sid: The unique string that we created to identify the Bundle resource. + :ivar status: + :ivar results: The results of the Evaluation which includes the valid and invalid attributes. + :ivar date_created: + :ivar url: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + bundle_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.regulation_sid: Optional[str] = payload.get("regulation_sid") + self.bundle_sid: Optional[str] = payload.get("bundle_sid") + self.status: Optional["EvaluationInstance.Status"] = payload.get("status") + self.results: Optional[List[Dict[str, object]]] = payload.get("results") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "bundle_sid": bundle_sid, + "sid": sid or self.sid, + } + self._context: Optional[EvaluationContext] = None + + @property + def _proxy(self) -> "EvaluationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: EvaluationContext for this EvaluationInstance + """ + if self._context is None: + self._context = EvaluationContext( + self._version, + bundle_sid=self._solution["bundle_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "EvaluationInstance": + """ + Fetch the EvaluationInstance + + + :returns: The fetched EvaluationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "EvaluationInstance": + """ + Asynchronous coroutine to fetch the EvaluationInstance + + + :returns: The fetched EvaluationInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EvaluationContext(InstanceContext): + + def __init__(self, version: Version, bundle_sid: str, sid: str): + """ + Initialize the EvaluationContext + + :param version: Version that contains the resource + :param bundle_sid: The unique string that we created to identify the Bundle resource. + :param sid: The unique string that identifies the Evaluation resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "bundle_sid": bundle_sid, + "sid": sid, + } + self._uri = ( + "/RegulatoryCompliance/Bundles/{bundle_sid}/Evaluations/{sid}".format( + **self._solution + ) + ) + + def fetch(self) -> EvaluationInstance: + """ + Fetch the EvaluationInstance + + + :returns: The fetched EvaluationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return EvaluationInstance( + self._version, + payload, + bundle_sid=self._solution["bundle_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> EvaluationInstance: + """ + Asynchronous coroutine to fetch the EvaluationInstance + + + :returns: The fetched EvaluationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return EvaluationInstance( + self._version, + payload, + bundle_sid=self._solution["bundle_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EvaluationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> EvaluationInstance: + """ + Build an instance of EvaluationInstance + + :param payload: Payload response from the API + """ + return EvaluationInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class EvaluationList(ListResource): + + def __init__(self, version: Version, bundle_sid: str): + """ + Initialize the EvaluationList + + :param version: Version that contains the resource + :param bundle_sid: The unique string that identifies the Bundle resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "bundle_sid": bundle_sid, + } + self._uri = "/RegulatoryCompliance/Bundles/{bundle_sid}/Evaluations".format( + **self._solution + ) + + def create(self) -> EvaluationInstance: + """ + Create the EvaluationInstance + + + :returns: The created EvaluationInstance + """ + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = self._version.create(method="POST", uri=self._uri, headers=headers) + + return EvaluationInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + async def create_async(self) -> EvaluationInstance: + """ + Asynchronously create the EvaluationInstance + + + :returns: The created EvaluationInstance + """ + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, headers=headers + ) + + return EvaluationInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[EvaluationInstance]: + """ + Streams EvaluationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[EvaluationInstance]: + """ + Asynchronously streams EvaluationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EvaluationInstance]: + """ + Lists EvaluationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EvaluationInstance]: + """ + Asynchronously lists EvaluationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EvaluationPage: + """ + Retrieve a single page of EvaluationInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EvaluationInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EvaluationPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EvaluationPage: + """ + Asynchronously retrieve a single page of EvaluationInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EvaluationInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EvaluationPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> EvaluationPage: + """ + Retrieve a specific page of EvaluationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EvaluationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return EvaluationPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> EvaluationPage: + """ + Asynchronously retrieve a specific page of EvaluationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EvaluationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return EvaluationPage(self._version, response, self._solution) + + def get(self, sid: str) -> EvaluationContext: + """ + Constructs a EvaluationContext + + :param sid: The unique string that identifies the Evaluation resource. + """ + return EvaluationContext( + self._version, bundle_sid=self._solution["bundle_sid"], sid=sid + ) + + def __call__(self, sid: str) -> EvaluationContext: + """ + Constructs a EvaluationContext + + :param sid: The unique string that identifies the Evaluation resource. + """ + return EvaluationContext( + self._version, bundle_sid=self._solution["bundle_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/item_assignment.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/item_assignment.py new file mode 100644 index 00000000..4eb1fe2b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/item_assignment.py @@ -0,0 +1,540 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ItemAssignmentInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Item Assignment resource. + :ivar bundle_sid: The unique string that we created to identify the Bundle resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Item Assignment resource. + :ivar object_sid: The SID of an object bag that holds information of the different items. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Identity resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + bundle_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.bundle_sid: Optional[str] = payload.get("bundle_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.object_sid: Optional[str] = payload.get("object_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "bundle_sid": bundle_sid, + "sid": sid or self.sid, + } + self._context: Optional[ItemAssignmentContext] = None + + @property + def _proxy(self) -> "ItemAssignmentContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ItemAssignmentContext for this ItemAssignmentInstance + """ + if self._context is None: + self._context = ItemAssignmentContext( + self._version, + bundle_sid=self._solution["bundle_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ItemAssignmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ItemAssignmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ItemAssignmentInstance": + """ + Fetch the ItemAssignmentInstance + + + :returns: The fetched ItemAssignmentInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ItemAssignmentInstance": + """ + Asynchronous coroutine to fetch the ItemAssignmentInstance + + + :returns: The fetched ItemAssignmentInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ItemAssignmentContext(InstanceContext): + + def __init__(self, version: Version, bundle_sid: str, sid: str): + """ + Initialize the ItemAssignmentContext + + :param version: Version that contains the resource + :param bundle_sid: The unique string that we created to identify the Bundle resource. + :param sid: The unique string that we created to identify the Identity resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "bundle_sid": bundle_sid, + "sid": sid, + } + self._uri = ( + "/RegulatoryCompliance/Bundles/{bundle_sid}/ItemAssignments/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the ItemAssignmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ItemAssignmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ItemAssignmentInstance: + """ + Fetch the ItemAssignmentInstance + + + :returns: The fetched ItemAssignmentInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ItemAssignmentInstance( + self._version, + payload, + bundle_sid=self._solution["bundle_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ItemAssignmentInstance: + """ + Asynchronous coroutine to fetch the ItemAssignmentInstance + + + :returns: The fetched ItemAssignmentInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ItemAssignmentInstance( + self._version, + payload, + bundle_sid=self._solution["bundle_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ItemAssignmentPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ItemAssignmentInstance: + """ + Build an instance of ItemAssignmentInstance + + :param payload: Payload response from the API + """ + return ItemAssignmentInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ItemAssignmentList(ListResource): + + def __init__(self, version: Version, bundle_sid: str): + """ + Initialize the ItemAssignmentList + + :param version: Version that contains the resource + :param bundle_sid: The unique string that we created to identify the Bundle resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "bundle_sid": bundle_sid, + } + self._uri = "/RegulatoryCompliance/Bundles/{bundle_sid}/ItemAssignments".format( + **self._solution + ) + + def create(self, object_sid: str) -> ItemAssignmentInstance: + """ + Create the ItemAssignmentInstance + + :param object_sid: The SID of an object bag that holds information of the different items. + + :returns: The created ItemAssignmentInstance + """ + + data = values.of( + { + "ObjectSid": object_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ItemAssignmentInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + async def create_async(self, object_sid: str) -> ItemAssignmentInstance: + """ + Asynchronously create the ItemAssignmentInstance + + :param object_sid: The SID of an object bag that holds information of the different items. + + :returns: The created ItemAssignmentInstance + """ + + data = values.of( + { + "ObjectSid": object_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ItemAssignmentInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ItemAssignmentInstance]: + """ + Streams ItemAssignmentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ItemAssignmentInstance]: + """ + Asynchronously streams ItemAssignmentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ItemAssignmentInstance]: + """ + Lists ItemAssignmentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ItemAssignmentInstance]: + """ + Asynchronously lists ItemAssignmentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ItemAssignmentPage: + """ + Retrieve a single page of ItemAssignmentInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ItemAssignmentInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ItemAssignmentPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ItemAssignmentPage: + """ + Asynchronously retrieve a single page of ItemAssignmentInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ItemAssignmentInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ItemAssignmentPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ItemAssignmentPage: + """ + Retrieve a specific page of ItemAssignmentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ItemAssignmentInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ItemAssignmentPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ItemAssignmentPage: + """ + Asynchronously retrieve a specific page of ItemAssignmentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ItemAssignmentInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ItemAssignmentPage(self._version, response, self._solution) + + def get(self, sid: str) -> ItemAssignmentContext: + """ + Constructs a ItemAssignmentContext + + :param sid: The unique string that we created to identify the Identity resource. + """ + return ItemAssignmentContext( + self._version, bundle_sid=self._solution["bundle_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ItemAssignmentContext: + """ + Constructs a ItemAssignmentContext + + :param sid: The unique string that we created to identify the Identity resource. + """ + return ItemAssignmentContext( + self._version, bundle_sid=self._solution["bundle_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/replace_items.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/replace_items.py new file mode 100644 index 00000000..a6a1de02 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/bundle/replace_items.py @@ -0,0 +1,163 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class ReplaceItemsInstance(InstanceResource): + + class Status(object): + DRAFT = "draft" + PENDING_REVIEW = "pending-review" + IN_REVIEW = "in-review" + TWILIO_REJECTED = "twilio-rejected" + TWILIO_APPROVED = "twilio-approved" + PROVISIONALLY_APPROVED = "provisionally-approved" + + """ + :ivar sid: The unique string that we created to identify the Bundle resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Bundle resource. + :ivar regulation_sid: The unique string of a regulation that is associated to the Bundle resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar status: + :ivar valid_until: The date and time in GMT in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format when the resource will be valid until. + :ivar email: The email address that will receive updates when the Bundle resource changes status. + :ivar status_callback: The URL we call to inform your application of status changes. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + """ + + def __init__(self, version: Version, payload: Dict[str, Any], bundle_sid: str): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.regulation_sid: Optional[str] = payload.get("regulation_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.status: Optional["ReplaceItemsInstance.Status"] = payload.get("status") + self.valid_until: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("valid_until") + ) + self.email: Optional[str] = payload.get("email") + self.status_callback: Optional[str] = payload.get("status_callback") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "bundle_sid": bundle_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ReplaceItemsList(ListResource): + + def __init__(self, version: Version, bundle_sid: str): + """ + Initialize the ReplaceItemsList + + :param version: Version that contains the resource + :param bundle_sid: The unique string that identifies the Bundle where the item assignments are going to be replaced. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "bundle_sid": bundle_sid, + } + self._uri = "/RegulatoryCompliance/Bundles/{bundle_sid}/ReplaceItems".format( + **self._solution + ) + + def create(self, from_bundle_sid: str) -> ReplaceItemsInstance: + """ + Create the ReplaceItemsInstance + + :param from_bundle_sid: The source bundle sid to copy the item assignments from. + + :returns: The created ReplaceItemsInstance + """ + + data = values.of( + { + "FromBundleSid": from_bundle_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ReplaceItemsInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + async def create_async(self, from_bundle_sid: str) -> ReplaceItemsInstance: + """ + Asynchronously create the ReplaceItemsInstance + + :param from_bundle_sid: The source bundle sid to copy the item assignments from. + + :returns: The created ReplaceItemsInstance + """ + + data = values.of( + { + "FromBundleSid": from_bundle_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ReplaceItemsInstance( + self._version, payload, bundle_sid=self._solution["bundle_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/end_user.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/end_user.py new file mode 100644 index 00000000..ab180337 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/end_user.py @@ -0,0 +1,638 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class EndUserInstance(InstanceResource): + + class Type(object): + INDIVIDUAL = "individual" + BUSINESS = "business" + + """ + :ivar sid: The unique string created by Twilio to identify the End User resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the End User resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar type: + :ivar attributes: The set of parameters that are the attributes of the End Users resource which are listed in the End User Types. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the End User resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.type: Optional["EndUserInstance.Type"] = payload.get("type") + self.attributes: Optional[Dict[str, object]] = payload.get("attributes") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[EndUserContext] = None + + @property + def _proxy(self) -> "EndUserContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: EndUserContext for this EndUserInstance + """ + if self._context is None: + self._context = EndUserContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the EndUserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the EndUserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "EndUserInstance": + """ + Fetch the EndUserInstance + + + :returns: The fetched EndUserInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "EndUserInstance": + """ + Asynchronous coroutine to fetch the EndUserInstance + + + :returns: The fetched EndUserInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + attributes: Union[object, object] = values.unset, + ) -> "EndUserInstance": + """ + Update the EndUserInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The set of parameters that are the attributes of the End User resource which are derived End User Types. + + :returns: The updated EndUserInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + attributes=attributes, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + attributes: Union[object, object] = values.unset, + ) -> "EndUserInstance": + """ + Asynchronous coroutine to update the EndUserInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The set of parameters that are the attributes of the End User resource which are derived End User Types. + + :returns: The updated EndUserInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + attributes=attributes, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EndUserContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the EndUserContext + + :param version: Version that contains the resource + :param sid: The unique string created by Twilio to identify the End User resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/RegulatoryCompliance/EndUsers/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the EndUserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the EndUserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> EndUserInstance: + """ + Fetch the EndUserInstance + + + :returns: The fetched EndUserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return EndUserInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> EndUserInstance: + """ + Asynchronous coroutine to fetch the EndUserInstance + + + :returns: The fetched EndUserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return EndUserInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + attributes: Union[object, object] = values.unset, + ) -> EndUserInstance: + """ + Update the EndUserInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The set of parameters that are the attributes of the End User resource which are derived End User Types. + + :returns: The updated EndUserInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Attributes": serialize.object(attributes), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return EndUserInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + attributes: Union[object, object] = values.unset, + ) -> EndUserInstance: + """ + Asynchronous coroutine to update the EndUserInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The set of parameters that are the attributes of the End User resource which are derived End User Types. + + :returns: The updated EndUserInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Attributes": serialize.object(attributes), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return EndUserInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EndUserPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> EndUserInstance: + """ + Build an instance of EndUserInstance + + :param payload: Payload response from the API + """ + return EndUserInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class EndUserList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the EndUserList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/RegulatoryCompliance/EndUsers" + + def create( + self, + friendly_name: str, + type: "EndUserInstance.Type", + attributes: Union[object, object] = values.unset, + ) -> EndUserInstance: + """ + Create the EndUserInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param type: + :param attributes: The set of parameters that are the attributes of the End User resource which are derived End User Types. + + :returns: The created EndUserInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Attributes": serialize.object(attributes), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return EndUserInstance(self._version, payload) + + async def create_async( + self, + friendly_name: str, + type: "EndUserInstance.Type", + attributes: Union[object, object] = values.unset, + ) -> EndUserInstance: + """ + Asynchronously create the EndUserInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param type: + :param attributes: The set of parameters that are the attributes of the End User resource which are derived End User Types. + + :returns: The created EndUserInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Attributes": serialize.object(attributes), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return EndUserInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[EndUserInstance]: + """ + Streams EndUserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[EndUserInstance]: + """ + Asynchronously streams EndUserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EndUserInstance]: + """ + Lists EndUserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EndUserInstance]: + """ + Asynchronously lists EndUserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EndUserPage: + """ + Retrieve a single page of EndUserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EndUserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EndUserPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EndUserPage: + """ + Asynchronously retrieve a single page of EndUserInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EndUserInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EndUserPage(self._version, response) + + def get_page(self, target_url: str) -> EndUserPage: + """ + Retrieve a specific page of EndUserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EndUserInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return EndUserPage(self._version, response) + + async def get_page_async(self, target_url: str) -> EndUserPage: + """ + Asynchronously retrieve a specific page of EndUserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EndUserInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return EndUserPage(self._version, response) + + def get(self, sid: str) -> EndUserContext: + """ + Constructs a EndUserContext + + :param sid: The unique string created by Twilio to identify the End User resource. + """ + return EndUserContext(self._version, sid=sid) + + def __call__(self, sid: str) -> EndUserContext: + """ + Constructs a EndUserContext + + :param sid: The unique string created by Twilio to identify the End User resource. + """ + return EndUserContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/end_user_type.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/end_user_type.py new file mode 100644 index 00000000..f14c8905 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/end_user_type.py @@ -0,0 +1,408 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class EndUserTypeInstance(InstanceResource): + """ + :ivar sid: The unique string that identifies the End-User Type resource. + :ivar friendly_name: A human-readable description that is assigned to describe the End-User Type resource. Examples can include first name, last name, email, business name, etc + :ivar machine_name: A machine-readable description of the End-User Type resource. Examples can include first_name, last_name, email, business_name, etc. + :ivar fields: The required information for creating an End-User. The required fields will change as regulatory needs change and will differ for businesses and individuals. + :ivar url: The absolute URL of the End-User Type resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.machine_name: Optional[str] = payload.get("machine_name") + self.fields: Optional[List[Dict[str, object]]] = payload.get("fields") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[EndUserTypeContext] = None + + @property + def _proxy(self) -> "EndUserTypeContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: EndUserTypeContext for this EndUserTypeInstance + """ + if self._context is None: + self._context = EndUserTypeContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "EndUserTypeInstance": + """ + Fetch the EndUserTypeInstance + + + :returns: The fetched EndUserTypeInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "EndUserTypeInstance": + """ + Asynchronous coroutine to fetch the EndUserTypeInstance + + + :returns: The fetched EndUserTypeInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EndUserTypeContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the EndUserTypeContext + + :param version: Version that contains the resource + :param sid: The unique string that identifies the End-User Type resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/RegulatoryCompliance/EndUserTypes/{sid}".format(**self._solution) + + def fetch(self) -> EndUserTypeInstance: + """ + Fetch the EndUserTypeInstance + + + :returns: The fetched EndUserTypeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return EndUserTypeInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> EndUserTypeInstance: + """ + Asynchronous coroutine to fetch the EndUserTypeInstance + + + :returns: The fetched EndUserTypeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return EndUserTypeInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class EndUserTypePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> EndUserTypeInstance: + """ + Build an instance of EndUserTypeInstance + + :param payload: Payload response from the API + """ + return EndUserTypeInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class EndUserTypeList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the EndUserTypeList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/RegulatoryCompliance/EndUserTypes" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[EndUserTypeInstance]: + """ + Streams EndUserTypeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[EndUserTypeInstance]: + """ + Asynchronously streams EndUserTypeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EndUserTypeInstance]: + """ + Lists EndUserTypeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[EndUserTypeInstance]: + """ + Asynchronously lists EndUserTypeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EndUserTypePage: + """ + Retrieve a single page of EndUserTypeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EndUserTypeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EndUserTypePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> EndUserTypePage: + """ + Asynchronously retrieve a single page of EndUserTypeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of EndUserTypeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return EndUserTypePage(self._version, response) + + def get_page(self, target_url: str) -> EndUserTypePage: + """ + Retrieve a specific page of EndUserTypeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EndUserTypeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return EndUserTypePage(self._version, response) + + async def get_page_async(self, target_url: str) -> EndUserTypePage: + """ + Asynchronously retrieve a specific page of EndUserTypeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of EndUserTypeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return EndUserTypePage(self._version, response) + + def get(self, sid: str) -> EndUserTypeContext: + """ + Constructs a EndUserTypeContext + + :param sid: The unique string that identifies the End-User Type resource. + """ + return EndUserTypeContext(self._version, sid=sid) + + def __call__(self, sid: str) -> EndUserTypeContext: + """ + Constructs a EndUserTypeContext + + :param sid: The unique string that identifies the End-User Type resource. + """ + return EndUserTypeContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/regulation.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/regulation.py new file mode 100644 index 00000000..9c122790 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/regulation.py @@ -0,0 +1,525 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RegulationInstance(InstanceResource): + + class EndUserType(object): + INDIVIDUAL = "individual" + BUSINESS = "business" + + """ + :ivar sid: The unique string that identifies the Regulation resource. + :ivar friendly_name: A human-readable description that is assigned to describe the Regulation resource. Examples can include Germany: Mobile - Business. + :ivar iso_country: The ISO country code of the phone number's country. + :ivar number_type: The type of phone number restricted by the regulatory requirement. For example, Germany mobile phone numbers provisioned by businesses require a business name with commercial register proof from the Handelsregisterauszug and a proof of address from Handelsregisterauszug or a trade license by Gewerbeanmeldung. + :ivar end_user_type: + :ivar requirements: The SID of an object that holds the regulatory information of the phone number country, phone number type, and end user type. + :ivar url: The absolute URL of the Regulation resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.iso_country: Optional[str] = payload.get("iso_country") + self.number_type: Optional[str] = payload.get("number_type") + self.end_user_type: Optional["RegulationInstance.EndUserType"] = payload.get( + "end_user_type" + ) + self.requirements: Optional[Dict[str, object]] = payload.get("requirements") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[RegulationContext] = None + + @property + def _proxy(self) -> "RegulationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RegulationContext for this RegulationInstance + """ + if self._context is None: + self._context = RegulationContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch( + self, include_constraints: Union[bool, object] = values.unset + ) -> "RegulationInstance": + """ + Fetch the RegulationInstance + + :param include_constraints: A boolean parameter indicating whether to include constraints or not for supporting end user, documents and their fields + + :returns: The fetched RegulationInstance + """ + return self._proxy.fetch( + include_constraints=include_constraints, + ) + + async def fetch_async( + self, include_constraints: Union[bool, object] = values.unset + ) -> "RegulationInstance": + """ + Asynchronous coroutine to fetch the RegulationInstance + + :param include_constraints: A boolean parameter indicating whether to include constraints or not for supporting end user, documents and their fields + + :returns: The fetched RegulationInstance + """ + return await self._proxy.fetch_async( + include_constraints=include_constraints, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RegulationContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the RegulationContext + + :param version: Version that contains the resource + :param sid: The unique string that identifies the Regulation resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/RegulatoryCompliance/Regulations/{sid}".format(**self._solution) + + def fetch( + self, include_constraints: Union[bool, object] = values.unset + ) -> RegulationInstance: + """ + Fetch the RegulationInstance + + :param include_constraints: A boolean parameter indicating whether to include constraints or not for supporting end user, documents and their fields + + :returns: The fetched RegulationInstance + """ + + data = values.of( + { + "IncludeConstraints": serialize.boolean_to_string(include_constraints), + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return RegulationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async( + self, include_constraints: Union[bool, object] = values.unset + ) -> RegulationInstance: + """ + Asynchronous coroutine to fetch the RegulationInstance + + :param include_constraints: A boolean parameter indicating whether to include constraints or not for supporting end user, documents and their fields + + :returns: The fetched RegulationInstance + """ + + data = values.of( + { + "IncludeConstraints": serialize.boolean_to_string(include_constraints), + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return RegulationInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RegulationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RegulationInstance: + """ + Build an instance of RegulationInstance + + :param payload: Payload response from the API + """ + return RegulationInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RegulationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the RegulationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/RegulatoryCompliance/Regulations" + + def stream( + self, + end_user_type: Union["RegulationInstance.EndUserType", object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + include_constraints: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RegulationInstance]: + """ + Streams RegulationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "RegulationInstance.EndUserType" end_user_type: The type of End User the regulation requires - can be `individual` or `business`. + :param str iso_country: The ISO country code of the phone number's country. + :param str number_type: The type of phone number that the regulatory requiremnt is restricting. + :param bool include_constraints: A boolean parameter indicating whether to include constraints or not for supporting end user, documents and their fields + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + end_user_type=end_user_type, + iso_country=iso_country, + number_type=number_type, + include_constraints=include_constraints, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + end_user_type: Union["RegulationInstance.EndUserType", object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + include_constraints: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RegulationInstance]: + """ + Asynchronously streams RegulationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "RegulationInstance.EndUserType" end_user_type: The type of End User the regulation requires - can be `individual` or `business`. + :param str iso_country: The ISO country code of the phone number's country. + :param str number_type: The type of phone number that the regulatory requiremnt is restricting. + :param bool include_constraints: A boolean parameter indicating whether to include constraints or not for supporting end user, documents and their fields + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + end_user_type=end_user_type, + iso_country=iso_country, + number_type=number_type, + include_constraints=include_constraints, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + end_user_type: Union["RegulationInstance.EndUserType", object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + include_constraints: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RegulationInstance]: + """ + Lists RegulationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "RegulationInstance.EndUserType" end_user_type: The type of End User the regulation requires - can be `individual` or `business`. + :param str iso_country: The ISO country code of the phone number's country. + :param str number_type: The type of phone number that the regulatory requiremnt is restricting. + :param bool include_constraints: A boolean parameter indicating whether to include constraints or not for supporting end user, documents and their fields + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + end_user_type=end_user_type, + iso_country=iso_country, + number_type=number_type, + include_constraints=include_constraints, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + end_user_type: Union["RegulationInstance.EndUserType", object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + include_constraints: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RegulationInstance]: + """ + Asynchronously lists RegulationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "RegulationInstance.EndUserType" end_user_type: The type of End User the regulation requires - can be `individual` or `business`. + :param str iso_country: The ISO country code of the phone number's country. + :param str number_type: The type of phone number that the regulatory requiremnt is restricting. + :param bool include_constraints: A boolean parameter indicating whether to include constraints or not for supporting end user, documents and their fields + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + end_user_type=end_user_type, + iso_country=iso_country, + number_type=number_type, + include_constraints=include_constraints, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + end_user_type: Union["RegulationInstance.EndUserType", object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + include_constraints: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RegulationPage: + """ + Retrieve a single page of RegulationInstance records from the API. + Request is executed immediately + + :param end_user_type: The type of End User the regulation requires - can be `individual` or `business`. + :param iso_country: The ISO country code of the phone number's country. + :param number_type: The type of phone number that the regulatory requiremnt is restricting. + :param include_constraints: A boolean parameter indicating whether to include constraints or not for supporting end user, documents and their fields + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RegulationInstance + """ + data = values.of( + { + "EndUserType": end_user_type, + "IsoCountry": iso_country, + "NumberType": number_type, + "IncludeConstraints": serialize.boolean_to_string(include_constraints), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RegulationPage(self._version, response) + + async def page_async( + self, + end_user_type: Union["RegulationInstance.EndUserType", object] = values.unset, + iso_country: Union[str, object] = values.unset, + number_type: Union[str, object] = values.unset, + include_constraints: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RegulationPage: + """ + Asynchronously retrieve a single page of RegulationInstance records from the API. + Request is executed immediately + + :param end_user_type: The type of End User the regulation requires - can be `individual` or `business`. + :param iso_country: The ISO country code of the phone number's country. + :param number_type: The type of phone number that the regulatory requiremnt is restricting. + :param include_constraints: A boolean parameter indicating whether to include constraints or not for supporting end user, documents and their fields + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RegulationInstance + """ + data = values.of( + { + "EndUserType": end_user_type, + "IsoCountry": iso_country, + "NumberType": number_type, + "IncludeConstraints": serialize.boolean_to_string(include_constraints), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RegulationPage(self._version, response) + + def get_page(self, target_url: str) -> RegulationPage: + """ + Retrieve a specific page of RegulationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RegulationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RegulationPage(self._version, response) + + async def get_page_async(self, target_url: str) -> RegulationPage: + """ + Asynchronously retrieve a specific page of RegulationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RegulationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RegulationPage(self._version, response) + + def get(self, sid: str) -> RegulationContext: + """ + Constructs a RegulationContext + + :param sid: The unique string that identifies the Regulation resource. + """ + return RegulationContext(self._version, sid=sid) + + def __call__(self, sid: str) -> RegulationContext: + """ + Constructs a RegulationContext + + :param sid: The unique string that identifies the Regulation resource. + """ + return RegulationContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/supporting_document.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/supporting_document.py new file mode 100644 index 00000000..b72f9938 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/supporting_document.py @@ -0,0 +1,658 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class SupportingDocumentInstance(InstanceResource): + + class Status(object): + DRAFT = "draft" + PENDING_REVIEW = "pending-review" + REJECTED = "rejected" + APPROVED = "approved" + EXPIRED = "expired" + PROVISIONALLY_APPROVED = "provisionally-approved" + + """ + :ivar sid: The unique string created by Twilio to identify the Supporting Document resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Document resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar mime_type: The image type uploaded in the Supporting Document container. + :ivar status: + :ivar failure_reason: The failure reason of the Supporting Document Resource. + :ivar errors: A list of errors that occurred during the registering RC Bundle + :ivar type: The type of the Supporting Document. + :ivar attributes: The set of parameters that are the attributes of the Supporting Documents resource which are listed in the Supporting Document Types. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Supporting Document resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.mime_type: Optional[str] = payload.get("mime_type") + self.status: Optional["SupportingDocumentInstance.Status"] = payload.get( + "status" + ) + self.failure_reason: Optional[str] = payload.get("failure_reason") + self.errors: Optional[List[Dict[str, object]]] = payload.get("errors") + self.type: Optional[str] = payload.get("type") + self.attributes: Optional[Dict[str, object]] = payload.get("attributes") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[SupportingDocumentContext] = None + + @property + def _proxy(self) -> "SupportingDocumentContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SupportingDocumentContext for this SupportingDocumentInstance + """ + if self._context is None: + self._context = SupportingDocumentContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the SupportingDocumentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SupportingDocumentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "SupportingDocumentInstance": + """ + Fetch the SupportingDocumentInstance + + + :returns: The fetched SupportingDocumentInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SupportingDocumentInstance": + """ + Asynchronous coroutine to fetch the SupportingDocumentInstance + + + :returns: The fetched SupportingDocumentInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + attributes: Union[object, object] = values.unset, + ) -> "SupportingDocumentInstance": + """ + Update the SupportingDocumentInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The set of parameters that are the attributes of the Supporting Document resource which are derived Supporting Document Types. + + :returns: The updated SupportingDocumentInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + attributes=attributes, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + attributes: Union[object, object] = values.unset, + ) -> "SupportingDocumentInstance": + """ + Asynchronous coroutine to update the SupportingDocumentInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The set of parameters that are the attributes of the Supporting Document resource which are derived Supporting Document Types. + + :returns: The updated SupportingDocumentInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + attributes=attributes, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SupportingDocumentContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the SupportingDocumentContext + + :param version: Version that contains the resource + :param sid: The unique string created by Twilio to identify the Supporting Document resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/RegulatoryCompliance/SupportingDocuments/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the SupportingDocumentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SupportingDocumentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> SupportingDocumentInstance: + """ + Fetch the SupportingDocumentInstance + + + :returns: The fetched SupportingDocumentInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SupportingDocumentInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> SupportingDocumentInstance: + """ + Asynchronous coroutine to fetch the SupportingDocumentInstance + + + :returns: The fetched SupportingDocumentInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SupportingDocumentInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + attributes: Union[object, object] = values.unset, + ) -> SupportingDocumentInstance: + """ + Update the SupportingDocumentInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The set of parameters that are the attributes of the Supporting Document resource which are derived Supporting Document Types. + + :returns: The updated SupportingDocumentInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Attributes": serialize.object(attributes), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SupportingDocumentInstance( + self._version, payload, sid=self._solution["sid"] + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + attributes: Union[object, object] = values.unset, + ) -> SupportingDocumentInstance: + """ + Asynchronous coroutine to update the SupportingDocumentInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param attributes: The set of parameters that are the attributes of the Supporting Document resource which are derived Supporting Document Types. + + :returns: The updated SupportingDocumentInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Attributes": serialize.object(attributes), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SupportingDocumentInstance( + self._version, payload, sid=self._solution["sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SupportingDocumentPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SupportingDocumentInstance: + """ + Build an instance of SupportingDocumentInstance + + :param payload: Payload response from the API + """ + return SupportingDocumentInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SupportingDocumentList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SupportingDocumentList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/RegulatoryCompliance/SupportingDocuments" + + def create( + self, + friendly_name: str, + type: str, + attributes: Union[object, object] = values.unset, + ) -> SupportingDocumentInstance: + """ + Create the SupportingDocumentInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param type: The type of the Supporting Document. + :param attributes: The set of parameters that are the attributes of the Supporting Documents resource which are derived Supporting Document Types. + + :returns: The created SupportingDocumentInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Attributes": serialize.object(attributes), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SupportingDocumentInstance(self._version, payload) + + async def create_async( + self, + friendly_name: str, + type: str, + attributes: Union[object, object] = values.unset, + ) -> SupportingDocumentInstance: + """ + Asynchronously create the SupportingDocumentInstance + + :param friendly_name: The string that you assigned to describe the resource. + :param type: The type of the Supporting Document. + :param attributes: The set of parameters that are the attributes of the Supporting Documents resource which are derived Supporting Document Types. + + :returns: The created SupportingDocumentInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "Type": type, + "Attributes": serialize.object(attributes), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SupportingDocumentInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SupportingDocumentInstance]: + """ + Streams SupportingDocumentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SupportingDocumentInstance]: + """ + Asynchronously streams SupportingDocumentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SupportingDocumentInstance]: + """ + Lists SupportingDocumentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SupportingDocumentInstance]: + """ + Asynchronously lists SupportingDocumentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SupportingDocumentPage: + """ + Retrieve a single page of SupportingDocumentInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SupportingDocumentInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SupportingDocumentPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SupportingDocumentPage: + """ + Asynchronously retrieve a single page of SupportingDocumentInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SupportingDocumentInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SupportingDocumentPage(self._version, response) + + def get_page(self, target_url: str) -> SupportingDocumentPage: + """ + Retrieve a specific page of SupportingDocumentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SupportingDocumentInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SupportingDocumentPage(self._version, response) + + async def get_page_async(self, target_url: str) -> SupportingDocumentPage: + """ + Asynchronously retrieve a specific page of SupportingDocumentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SupportingDocumentInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SupportingDocumentPage(self._version, response) + + def get(self, sid: str) -> SupportingDocumentContext: + """ + Constructs a SupportingDocumentContext + + :param sid: The unique string created by Twilio to identify the Supporting Document resource. + """ + return SupportingDocumentContext(self._version, sid=sid) + + def __call__(self, sid: str) -> SupportingDocumentContext: + """ + Constructs a SupportingDocumentContext + + :param sid: The unique string created by Twilio to identify the Supporting Document resource. + """ + return SupportingDocumentContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/supporting_document_type.py b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/supporting_document_type.py new file mode 100644 index 00000000..692248cb --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/numbers/v2/regulatory_compliance/supporting_document_type.py @@ -0,0 +1,410 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Numbers + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class SupportingDocumentTypeInstance(InstanceResource): + """ + :ivar sid: The unique string that identifies the Supporting Document Type resource. + :ivar friendly_name: A human-readable description of the Supporting Document Type resource. + :ivar machine_name: The machine-readable description of the Supporting Document Type resource. + :ivar fields: The required information for creating a Supporting Document. The required fields will change as regulatory needs change and will differ for businesses and individuals. + :ivar url: The absolute URL of the Supporting Document Type resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.machine_name: Optional[str] = payload.get("machine_name") + self.fields: Optional[List[Dict[str, object]]] = payload.get("fields") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[SupportingDocumentTypeContext] = None + + @property + def _proxy(self) -> "SupportingDocumentTypeContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SupportingDocumentTypeContext for this SupportingDocumentTypeInstance + """ + if self._context is None: + self._context = SupportingDocumentTypeContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "SupportingDocumentTypeInstance": + """ + Fetch the SupportingDocumentTypeInstance + + + :returns: The fetched SupportingDocumentTypeInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SupportingDocumentTypeInstance": + """ + Asynchronous coroutine to fetch the SupportingDocumentTypeInstance + + + :returns: The fetched SupportingDocumentTypeInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SupportingDocumentTypeContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the SupportingDocumentTypeContext + + :param version: Version that contains the resource + :param sid: The unique string that identifies the Supporting Document Type resource. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/RegulatoryCompliance/SupportingDocumentTypes/{sid}".format( + **self._solution + ) + + def fetch(self) -> SupportingDocumentTypeInstance: + """ + Fetch the SupportingDocumentTypeInstance + + + :returns: The fetched SupportingDocumentTypeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SupportingDocumentTypeInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> SupportingDocumentTypeInstance: + """ + Asynchronous coroutine to fetch the SupportingDocumentTypeInstance + + + :returns: The fetched SupportingDocumentTypeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SupportingDocumentTypeInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SupportingDocumentTypePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SupportingDocumentTypeInstance: + """ + Build an instance of SupportingDocumentTypeInstance + + :param payload: Payload response from the API + """ + return SupportingDocumentTypeInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SupportingDocumentTypeList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SupportingDocumentTypeList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/RegulatoryCompliance/SupportingDocumentTypes" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SupportingDocumentTypeInstance]: + """ + Streams SupportingDocumentTypeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SupportingDocumentTypeInstance]: + """ + Asynchronously streams SupportingDocumentTypeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SupportingDocumentTypeInstance]: + """ + Lists SupportingDocumentTypeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SupportingDocumentTypeInstance]: + """ + Asynchronously lists SupportingDocumentTypeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SupportingDocumentTypePage: + """ + Retrieve a single page of SupportingDocumentTypeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SupportingDocumentTypeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SupportingDocumentTypePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SupportingDocumentTypePage: + """ + Asynchronously retrieve a single page of SupportingDocumentTypeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SupportingDocumentTypeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SupportingDocumentTypePage(self._version, response) + + def get_page(self, target_url: str) -> SupportingDocumentTypePage: + """ + Retrieve a specific page of SupportingDocumentTypeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SupportingDocumentTypeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SupportingDocumentTypePage(self._version, response) + + async def get_page_async(self, target_url: str) -> SupportingDocumentTypePage: + """ + Asynchronously retrieve a specific page of SupportingDocumentTypeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SupportingDocumentTypeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SupportingDocumentTypePage(self._version, response) + + def get(self, sid: str) -> SupportingDocumentTypeContext: + """ + Constructs a SupportingDocumentTypeContext + + :param sid: The unique string that identifies the Supporting Document Type resource. + """ + return SupportingDocumentTypeContext(self._version, sid=sid) + + def __call__(self, sid: str) -> SupportingDocumentTypeContext: + """ + Constructs a SupportingDocumentTypeContext + + :param sid: The unique string that identifies the Supporting Document Type resource. + """ + return SupportingDocumentTypeContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/oauth/OauthBase.py b/venv/Lib/site-packages/twilio/rest/oauth/OauthBase.py new file mode 100644 index 00000000..87cbbac2 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/oauth/OauthBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.oauth.v1 import V1 + + +class OauthBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Oauth Domain + + :returns: Domain for Oauth + """ + super().__init__(twilio, "https://oauth.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Oauth + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/oauth/__init__.py b/venv/Lib/site-packages/twilio/rest/oauth/__init__.py new file mode 100644 index 00000000..586cf6b4 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/oauth/__init__.py @@ -0,0 +1,16 @@ +from warnings import warn + +from twilio.rest.oauth.OauthBase import OauthBase +from twilio.rest.oauth.v1.token import TokenList + + +class Oauth(OauthBase): + + @property + def token(self) -> TokenList: + warn( + "token is deprecated. Use v1.token instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.token diff --git a/venv/Lib/site-packages/twilio/rest/oauth/__pycache__/OauthBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/oauth/__pycache__/OauthBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17981a75fb60a15e29b1496ae17190a62cb618bf GIT binary patch literal 1963 zcmahKO>Y}TboRsRwc~t{mNpetHKi@chuT;|s0vX<+dzqcq(I2QG8#6!<9O+M*UWC* z*zzHVNF)+bDX+KYt}!GkLL-j z-Jic`{Gb!^D;@?blOl(Ufb0>6REeWFs;4y7s;VHad0JDi>JrzzOw*_u63=+qrdc%= zqLSOhF}8@4<@$k^*sJC`W-(`duMm=_bh+V%)D9d@?^z*T<31Nw#2vcY0VZRNjvfjG zBr!meT^{~@Or;Vo$|pam1y*Sf-@zl#k^+JWhcRTzBLdX!)lflVjFk~fjU?pqz%1)Y z-9$1K18<2%lm&Nq{2T%Ls}0OjiY}6OAYaRa-NmKlcW2W&c~%%wD44Y#1t*F{ms;Gv zac6B)|?j|s8H933_&R@gua8gxZfK*4} zT3y{Hbr__rLRIG(N8?6ab@VO$Ahl4<0?hcFG|l?^R))S}k?7#k_qg6~GI z<+)uhDLy_*xunQP{DG9t}2hGKz7H7is78kL} zm<#?Gi#67+09_BcR~I=*AkHx++rn6g*-^UrV&&Fs?X!@Ju=c^i!g6h%hj*i(Rci;X z&2K=HqgtE$?b?U#YAtjlezj%Ucda!Z))MDs!NaH=U^wMrNlUGcD1iO$^oTTw>SdsZ z=K(z5B+m*YH?fob$(-3g^XTH+znF86FJ9T!cg;iKlh{ZqV#DnoE(}{X<`Y2nNRNCu zWQ~x`sR(7{>XCy~9~v|u{)Zk+hSGgwSng3rR-isGvmtF)Xi)!0SBk0_2gAYu@K6yG zu!ZQ7iYb7x+OBj9qdK%J7f|3;0Gp(rCxxl|*LJQw8hho**>n4szunlL|K|P2lc(-) z>}+gLikCp_ME-D2^2Z6?BORrvcKI;kJ0fVi@cpxBUBGp6ybcw-1ucR;T6pV*lB3){ zvh0TI^Z(W8PRuRKi&B!wTz^Q!X^7!?sxW%!jm6EdbBANMFxpUfXXU5!m|E#F*%-MrP*0%|8ijhuVP9pUPzD{-wVN zY%+LhXt9`&vy3@`4N)6Wr{(%<0;eyYPOs-Gd}KgNvo)4}gJ7D7YHaDPhK%MzvkzaNzHnUEMZP zGs~Jx$9nARA2Bf2PC%$dQc_sSUlT_G#2Nfj6*e3@zh((;DL;dJeX+ynRa| zjcO>Wlr=f42a-{zx+++;J?{)`v5+jF&Iy)O%*#Rs^{t4tS!5d=`%5n@4uZoZexZgH z#_Orpo=?pz1CCIzXiZ@M)w9({_dHdA3-3v-w&E=^u_cqH*G|GZd$7)8>9twh_Ljm| zo(Lto-Bi_rbtXL738OHX<4nl81XnTV`(YeP-*=i_KBm$@Y+Gs3_v4_!d_OJwej}l+2yw;t zU$=s2U@10v(qvqAIW8zG{1Nzh#8W5=LxDidD6tFQ&5537nX@0de?VP*9jwXU_>jk; z=dxW$i}=;l^h7?_nVhnNl%0&SlM%!}$Z^l<^#2~i#pT^)&0JEh;|9-)_j6_od|DZB eD*{1JCxjfs)n71w40rxoB{KW2b_(jsV*df4M%cLk literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/oauth/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/oauth/v1/__init__.py new file mode 100644 index 00000000..e05c7de5 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/oauth/v1/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Oauth + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.oauth.v1.authorize import AuthorizeList +from twilio.rest.oauth.v1.token import TokenList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Oauth + + :param domain: The Twilio.oauth domain + """ + super().__init__(domain, "v1") + self._authorize: Optional[AuthorizeList] = None + self._token: Optional[TokenList] = None + + @property + def authorize(self) -> AuthorizeList: + if self._authorize is None: + self._authorize = AuthorizeList(self) + return self._authorize + + @property + def token(self) -> TokenList: + if self._token is None: + self._token = TokenList(self) + return self._token + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/oauth/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/oauth/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acec8fb6cf6ea666019685cffabe037fccfc753f GIT binary patch literal 2363 zcmcf?O>YxNbauU7uRlV7AfN=&DN#$U2pg-1R)IokgHQxbD5Ozkxteag6S8IPb!RuG zHkQaCQWFV8FI6J-!m%hng-iNzKr13u>ZQG<4XB7y-($%$J@0Ft9}W!U z2t0Rx`eK2Yg#3m?|4GNlP8EV0Ql=5B8ce2Ht{kuj;j>0pu;0CnrJDlFM1A3h|xv)d- z(76tZ8DsRt4;jc}Xehr5yhO%YyHwB*nlUC%?NQoGe!xZoUQkgI#*iaP1bAex1{{Sk zRz@s#qS)ocFY8HTr5fvjbLA41FM-Yp1(3#QnpjmGZ)6=LVI=~jlhfluWHlj7H@(Ly{KB? zi;_HLAq-o=c)9F@*lxKe;|_s1-;cE-QKn@H5v^e7mQ64|K%{S6E% zCshrGRd+O=n%7szJPhq}p=$87lj7#Q?ikC)M(m-Qkz5P7>0R6`Xy$-tE*sVS3i(>A z7Os(ECemjsk?F_?>-w%B48Sptoeu$gr>&7N5w7Yzau=>rPjj@5*aj{Ja9QF(QvEzg zM=z$jj;uEh$7ItDUE6~?$a>CJXj@f_`t$JsB)a1*Ti6Y%BE&B9cnV5BPD(6D)FZuJ znJOAlI#_IR5m}76a2R7zj-k3Neq^!`>t0MnM!>y!feRzbGA0|#Sb%X;y7c_BkH%}C z1`t~9(&Xe!ZGs0kLcdjO`)-||hd~KzZQg9xF1vHJzzzAymR-MLU*|zBlyh1ZJP6A& z%yPR@?uSxpb;KSxp_`wrl={rWzzB{5c(z2I6i9Z@YUW4l@cO~~2Y#{Mdi2h_E5@C{ zM`Ps`<8FQjv`AzM9xjSz9rjG}VBE52R{>cgJ@REDdVwtM4U@j~$VO}ry-QSHZFh}4 z(58yI7z8~5ixo(*4?Y2UpkfGMluc^fEkJS!g^9`RmdLO9!F%Uc&u!+9KOPzTVdCeJ z%F4u@=|_V@_inG=-n2%<0nq(Fvl55kK*(z^d_)F;?8UCE(sEk57Gxx`w?Qd*1Axlr z^y=x&{K(@YqxUDiFGDhyFqvDcw>GUKFDC<5szrFe)<{Py>Rp~p?-k*AY}x z)A2e~@D_{_%$kk6CD9yL?GMK3$98?eZSw!L=c3}cR8 zht$ll({h{F1>T@&NL};NoE`8|yuk$aHQK*hqE?rzLo^Z#a5Ja{R%-9MC$ccnkyk3o z(Np!3`5%LWRFru2o?B;B{m+UqAaQzw69BeTnx_4!7c}GPQKB8)A}6-Un_J|)EpqCK Pc}yE!IrNmkM>_fkYUW9e literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/oauth/v1/__pycache__/authorize.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/oauth/v1/__pycache__/authorize.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a68dd01e289c43a370fc8f5942450e515d740262 GIT binary patch literal 5159 zcmdTIU2GJ`dG_x1cJI#^Ot243SeKu0&^yTw29i6^W{?l)O}j3?lMVzi)Q$e72!g zr9^6n^S3kKd^7XS_don0m5LK+H~;wkiBDSz`5O-EO$<7#Rp`tUgXD=J7@?w23gttk za6Vj$}rDEa+qeFFK_aE7XBr>wx9Bnx)fW>ev;gQ@|w$O~-8-OK(!< zz(U=(H6KQU!Rl$~`~*y#lDq(B9x{Y{*a*>x5vC%IQmGJ114SV+M+$-wxslAv2H*=J zBYGo}kIj**LOwo1GLpBw52S4~bC%Y5n$2>t^qNx|QyAQtQQcKt8wE@i9d10X=~t9X z!-Jg8lcsz|J*lkC6m8AW1NY#(VjurjF9P_vFi%{LM(}R9N^XM7R)xFZE7$~54Ncaa z*hg__G$^V>ZR|cnGNB{W7_9dC+IRYU$1XW=rLpq^1EXVSsB^`&%VSfvsnb5N4R>scT2o_#=J=Rn zx-?q`VQ81BGv;#B>}J$)yKS`L?x~(`{Br5$$}?;SoH4t5i@qWCb@CTE z^{%umcPzC3N$z@dr03qz#iL852S?7#MgA;ztO617qKvu~X6b?S5XT#rH(qF-%m|s# zT7fGHo$?~Hr%Z@Mno?jUwT$8nXt)e4!@V@LSKptIwAbI<=~cd|=@X_!U$_LRvCZy3 z>APo+yKwH!p4^tZo?0Y}0^13^Imorbb^%0fAsedteChaeC>TcqaGlgzNb7Od4*g65 z7h771f~w=HTC$Bw5&KD1eH*+pn2}V~uyr^Ea|c7wcwxt73?;?Y!uBFA71)DLi$zrh zMqdIfXY>uuC`%$e0zBI}2H>+Bu1?>JuC7r(OoE+d;2y zLmPC_s|*LKQAR;E0ZBtYeyz~Y)ujv=pfs~!Qr6fhC@MgAK4pa!6)4xHCrn_cevkqQ zwWy5KMiBx6i*>l6w=M&E`~%dHcmUGyq_mSUGRm{52n796K* z79LV@`1VQ(JOaH!;l>0r?lh$q-#ge;(JZ4;2Q?(So-eUX;(~<@8}{E2D^HaG){_0; zeju4F3UIAUE0>|b~vYIb^hI$N+=DGQRJ7QP;gwbo{mNyoOlXdm3R>@JF4vaSx? z%#(e|4;WrzI4IyQp_`2OZZd-6@WSWLjxI*LXo*6JVt8S6Bx!U^Y z7qSbGXX}NY$Zy9E!wk=3i!nbEWDs!#!BGTXMu4u)P9b<50hV1(3_x8Beg(iz18TOd zAuSA_Iey9sT<}8x5GguITY5foJG1b;``L^4JHPc{$MBr=s53Vw-IAB(^xwC)&!=yv zA1T?D&Vwuaj;^F%hTr2vG}W>imUqPGqP3l*t$jXwJNxmDgUdS(uC#S581I|!nM>`z z-&G5fwnM8V)E1wUp2(!N>(0&(_kOTP?s-;o7Vxv_=U9!uLmrpi1n>z@G@pn0r1!p`dN1{HN6&Ic z&t~&U9|QAA$Dh5>hH5det~CcUyGr4z^AsG zWM92ExH!0SICn3(m|Qv9bMNHh$&~{~J{pB69G|+ zlAY;=wuQpNp5?ZKH3?BN0jmBxyB5wb?>bzIAu3K_ohgR#n2A~!e1mSTgDMX%i5+V11WFL~3|3P{ml4B3aD^H@^h2!@- X4nHCAeRBBQg3xno@F~GBm&3mRwyN!P literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/oauth/v1/__pycache__/token.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/oauth/v1/__pycache__/token.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7f700464170fce9cc05ea5eaef62be0770a2f35 GIT binary patch literal 7047 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 IzkD733I2;700000 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/oauth/v1/authorize.py b/venv/Lib/site-packages/twilio/rest/oauth/v1/authorize.py new file mode 100644 index 00000000..a353c4b8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/oauth/v1/authorize.py @@ -0,0 +1,130 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Oauth + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class AuthorizeInstance(InstanceResource): + """ + :ivar redirect_to: The callback URL + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.redirect_to: Optional[str] = payload.get("redirect_to") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class AuthorizeList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AuthorizeList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/authorize" + + def fetch( + self, + response_type: Union[str, object] = values.unset, + client_id: Union[str, object] = values.unset, + redirect_uri: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + state: Union[str, object] = values.unset, + ) -> AuthorizeInstance: + """ + Asynchronously fetch the AuthorizeInstance + + :param response_type: Response Type:param client_id: The Client Identifier:param redirect_uri: The url to which response will be redirected to:param scope: The scope of the access request:param state: An opaque value which can be used to maintain state between the request and callback + :returns: The fetched AuthorizeInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + params = values.of( + { + "ResponseType": response_type, + "ClientId": client_id, + "RedirectUri": redirect_uri, + "Scope": scope, + "State": state, + } + ) + + payload = self._version.fetch( + method="GET", uri=self._uri, headers=headers, params=params + ) + + return AuthorizeInstance(self._version, payload) + + async def fetch_async( + self, + response_type: Union[str, object] = values.unset, + client_id: Union[str, object] = values.unset, + redirect_uri: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + state: Union[str, object] = values.unset, + ) -> AuthorizeInstance: + """ + Asynchronously fetch the AuthorizeInstance + + :param response_type: Response Type:param client_id: The Client Identifier:param redirect_uri: The url to which response will be redirected to:param scope: The scope of the access request:param state: An opaque value which can be used to maintain state between the request and callback + :returns: The fetched AuthorizeInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + params = values.of( + { + "ResponseType": response_type, + "ClientId": client_id, + "RedirectUri": redirect_uri, + "Scope": scope, + "State": state, + } + ) + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers, params=params + ) + + return AuthorizeInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/oauth/v1/token.py b/venv/Lib/site-packages/twilio/rest/oauth/v1/token.py new file mode 100644 index 00000000..18de1008 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/oauth/v1/token.py @@ -0,0 +1,170 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Oauth + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class TokenInstance(InstanceResource): + """ + :ivar access_token: Token which carries the necessary information to access a Twilio resource directly. + :ivar refresh_token: Token which carries the information necessary to get a new access token. + :ivar id_token: Token which carries the information necessary of user profile. + :ivar token_type: Token type + :ivar expires_in: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.access_token: Optional[str] = payload.get("access_token") + self.refresh_token: Optional[str] = payload.get("refresh_token") + self.id_token: Optional[str] = payload.get("id_token") + self.token_type: Optional[str] = payload.get("token_type") + self.expires_in: Optional[int] = payload.get("expires_in") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class TokenList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the TokenList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/token" + + def create( + self, + grant_type: str, + client_id: str, + client_secret: Union[str, object] = values.unset, + code: Union[str, object] = values.unset, + redirect_uri: Union[str, object] = values.unset, + audience: Union[str, object] = values.unset, + refresh_token: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + ) -> TokenInstance: + """ + Create the TokenInstance + + :param grant_type: Grant type is a credential representing resource owner's authorization which can be used by client to obtain access token. + :param client_id: A 34 character string that uniquely identifies this OAuth App. + :param client_secret: The credential for confidential OAuth App. + :param code: JWT token related to the authorization code grant type. + :param redirect_uri: The redirect uri + :param audience: The targeted audience uri + :param refresh_token: JWT token related to refresh access token. + :param scope: The scope of token + + :returns: The created TokenInstance + """ + + data = values.of( + { + "GrantType": grant_type, + "ClientId": client_id, + "ClientSecret": client_secret, + "Code": code, + "RedirectUri": redirect_uri, + "Audience": audience, + "RefreshToken": refresh_token, + "Scope": scope, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TokenInstance(self._version, payload) + + async def create_async( + self, + grant_type: str, + client_id: str, + client_secret: Union[str, object] = values.unset, + code: Union[str, object] = values.unset, + redirect_uri: Union[str, object] = values.unset, + audience: Union[str, object] = values.unset, + refresh_token: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + ) -> TokenInstance: + """ + Asynchronously create the TokenInstance + + :param grant_type: Grant type is a credential representing resource owner's authorization which can be used by client to obtain access token. + :param client_id: A 34 character string that uniquely identifies this OAuth App. + :param client_secret: The credential for confidential OAuth App. + :param code: JWT token related to the authorization code grant type. + :param redirect_uri: The redirect uri + :param audience: The targeted audience uri + :param refresh_token: JWT token related to refresh access token. + :param scope: The scope of token + + :returns: The created TokenInstance + """ + + data = values.of( + { + "GrantType": grant_type, + "ClientId": client_id, + "ClientSecret": client_secret, + "Code": code, + "RedirectUri": redirect_uri, + "Audience": audience, + "RefreshToken": refresh_token, + "Scope": scope, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TokenInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/PreviewBase.py b/venv/Lib/site-packages/twilio/rest/preview/PreviewBase.py new file mode 100644 index 00000000..dd8317b4 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/PreviewBase.py @@ -0,0 +1,66 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.preview.hosted_numbers import HostedNumbers +from twilio.rest.preview.marketplace import Marketplace +from twilio.rest.preview.wireless import Wireless + + +class PreviewBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Preview Domain + + :returns: Domain for Preview + """ + super().__init__(twilio, "https://preview.twilio.com") + self._hosted_numbers: Optional[HostedNumbers] = None + self._marketplace: Optional[Marketplace] = None + self._wireless: Optional[Wireless] = None + + @property + def hosted_numbers(self) -> HostedNumbers: + """ + :returns: Versions hosted_numbers of Preview + """ + if self._hosted_numbers is None: + self._hosted_numbers = HostedNumbers(self) + return self._hosted_numbers + + @property + def marketplace(self) -> Marketplace: + """ + :returns: Versions marketplace of Preview + """ + if self._marketplace is None: + self._marketplace = Marketplace(self) + return self._marketplace + + @property + def wireless(self) -> Wireless: + """ + :returns: Versions wireless of Preview + """ + if self._wireless is None: + self._wireless = Wireless(self) + return self._wireless + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/__init__.py b/venv/Lib/site-packages/twilio/rest/preview/__init__.py new file mode 100644 index 00000000..501ae417 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/__init__.py @@ -0,0 +1,88 @@ +from warnings import warn + +from twilio.rest.preview.PreviewBase import PreviewBase +from twilio.rest.preview.hosted_numbers.authorization_document import ( + AuthorizationDocumentList, +) +from twilio.rest.preview.hosted_numbers.hosted_number_order import HostedNumberOrderList +from twilio.rest.preview.marketplace.available_add_on import AvailableAddOnList +from twilio.rest.preview.marketplace.installed_add_on import InstalledAddOnList +from twilio.rest.preview.sync.service import ServiceList +from twilio.rest.preview.wireless.command import CommandList +from twilio.rest.preview.wireless.rate_plan import RatePlanList +from twilio.rest.preview.wireless.sim import SimList + + +class Preview(PreviewBase): + + @property + def authorization_documents(self) -> AuthorizationDocumentList: + warn( + "authorization_documents is deprecated. Use hosted_numbers.authorization_documents instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.hosted_numbers.authorization_documents + + @property + def hosted_number_orders(self) -> HostedNumberOrderList: + warn( + "hosted_number_orders is deprecated. Use hosted_numbers.hosted_number_orders instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.hosted_numbers.hosted_number_orders + + @property + def available_add_ons(self) -> AvailableAddOnList: + warn( + "available_add_ons is deprecated. Use marketplace.available_add_ons instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.marketplace.available_add_ons + + @property + def installed_add_ons(self) -> InstalledAddOnList: + warn( + "installed_add_ons is deprecated. Use marketplace.installed_add_ons instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.marketplace.installed_add_ons + + @property + def services(self) -> ServiceList: + warn( + "services is deprecated. Use sync.services instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.sync.services + + @property + def commands(self) -> CommandList: + warn( + "commands is deprecated. Use wireless.commands instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.wireless.commands + + @property + def rate_plans(self) -> RatePlanList: + warn( + "rate_plans is deprecated. Use wireless.rate_plans instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.wireless.rate_plans + + @property + def sims(self) -> SimList: + warn( + "sims is deprecated. Use wireless.sims instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.wireless.sims diff --git a/venv/Lib/site-packages/twilio/rest/preview/__pycache__/PreviewBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/__pycache__/PreviewBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b964fd6b00ad87309ef259e453f9f2b6c545d26 GIT binary patch literal 2951 zcmc&$&2Jk;6rc51*59Tr{URTexCKm!O##s=q!Fb-C4#0Aq#zl?u?_*}(@4b2B zpX2cef_CGV&&z-GA@nPsv|G?4c1l33ArPq%f5~))>{PWfk2VaCa%!7grCa3jDCb#bF$9|K<2FCtRQA>H(eQDQM8&bj#B-2JMvZ6zpU$8wrEzSGeIY4%~vUNWI{C9l@KRM$|8Woa3ko%NM$#G zPM9ou@yqy~fJOBZi-HfpCn94AvAB~MFFnp*7%N<{APEZZO-;=fCaHDJHmijNQ!CQ* zkbibzff@^i_qDl#rP*|}suZs&SE*HSPncuWvUA?4bDm#3I@xNCC18*Gp>Af|fg>QX zUWV?`5_%9r;lyg+rhIh$aC7+FU3p^b?D$IHuH3)%+8I6`+ZsK+61b7r0e$3zTtJIZ zjyjDyBclER5NoJ`zUYW{iKUd?iEIOHc=izej>`Uaka$vkq7$p#fPMt1!6mbBZ!EA` z+7sZ6k0oIn7J}}!#16n<@dIFX2zn>cyF&eVH)g%E5pJ4+ZV9y_D3-bx9omczHKQ-w zPrvfhp*!g}RwnPp@K*BRy<~bbnQqEy_AF@s$8f#*G`PAl^$A#|;KU4`J;aVe*Ns%P z%ea1|8>TM7DQ?t*QU7MNzZpGoAD{Yh@(w=DF&YpU;mss&%J~1l=e<8T4N*>Z$Qr zQSGx{%qMQ|O%AA!d_zKdeQ$Hm!J#dlRl@hwi106y4Sj#DBg13)=`%VrF7D(+R?BGq+5G7>uoT#?jo ziR;h!Up>+Bn`-IMJz7SsKsfm7`ocp5L+daKC0f2v@Wie7UkHXBf1A-tdDQUwCtNh# z5e;`lgX=GH(O^e3*h&S1BkSqE5exzbvHf%=;q(!rnnmzGWY?;iah36!=^XIhqd8vL zRq@0zo&!$Q6Yyt1faHvHak3D7{#<8!YnVXJ8QM>=>lO=Co&No_+S%;FE#Mo1)3~1S ziuza{cLO=WvM}YP)_MuLmS2*jKYd{-@bEB_`hP8sA1|w$bSap;2k%+vgu5 I7{prt03j^qa{vGU literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e7ba000a7c1a114089c9cce6e5135b0c57ac7fb GIT binary patch literal 4199 zcmc&%OK;mo5MJs@y-eG2nz{{QS&biR8>Ked*maDiP7KsW0w+yU1R(^lw79Vula#uo zWyolN9&%_7MT=gNzYwH9q5q&4DHjJs3>0X4$jzQgL8%i%XOE6z8w zyTjjdxio^$56{0|UCbc#2fgt=aaY*=8HC43K?nUYO$@h#bL-Y>m8hGtrB;pk zYGqx=hILIfEl{3ZsG1g5me%!UOs*3J6IancSC>^yUe@rOqFgsTbkQ&^S<|o*L^HQA zsjC(28fC6jbzL?T_cnV|w(t#2_U1_5Qgy1TI59Y*8xY$4749D+j6_aBVgyGO4#)0A zl*q%_GuK{>Gc*BcG=L@<$^#k;pecr?0gVUH3`4VkCIV=Vp*?^m1E|2zUO@Q(+Q-m- zKvMzqL?d0y*h!avJ3+9uPK*i{h?G_n4R-e?43ClJ>lDt4cy>zU7eB`w`WD@fd7Ae1 zexfaV(k)bsEp3W&FyWHoX57rHW?sQHf-8^^rIi25#Q9a0e#v0@H%o_lLfWyclwQ$C ze9GBrsDjFxhU-`>#t4na?w@z3h9bKIg{T@UcF+Fl?Nf)$4>QJ0tlcvy8~N9FuFRC- z;fPtjy100|Jde#at6D49t59QeD^R@UIyUO%YwB{@R4sh22G1g|V6$v(sG3?mPq1m7 zhdAjXI4?=6p<0qusx`=4F#YC`o1Vjh?FS=s42JK}pM3U3cJ*cU%!^ZR?uy#(7-_%7y! zUJ9CZrHjyg#!k2GJGgqEa@FsZRoigk09y;;Y>l;qu_ixuENqobRqtL@j=>Qaic!lB zZa$>kWIb-E$(ILMnGI(pxZIYC12!*7hOA>rveS~JSCw^*%2`SJW?j}?4PPVG8YWhQ z(7u!PKZN#;?4Tw|D$#?5@N}SiB1zGKu6;t^hzPBE0&hf!(43Mi9cTnkot@D+^?N8v zhhF%ZFJX9yevjvNB8m9LX7Tbr2(G(Pl;~l|POmFXH%Bj0-L$Wp_H~oZ_dcPzNnba4 zBwgXj2h^?LyA^!5QAaiEt44j*_>*hYYus0j`>MiEEA0vYhKLHRELpfq#gjHqU%H^z zHJvVa$Z0`Kv;{5IoEEg?CY!#G5!%VypN3iO>y{2{#aSNh3rFzZH=WZUveerjg*gYh zk&a%5)ye<69Xv!?QQ7&he+!;rtm5pmVP^i;`#y&2FPh U+vwwe6AK(y_ AuthorizationDocumentList: + if self._authorization_documents is None: + self._authorization_documents = AuthorizationDocumentList(self) + return self._authorization_documents + + @property + def hosted_number_orders(self) -> HostedNumberOrderList: + if self._hosted_number_orders is None: + self._hosted_number_orders = HostedNumberOrderList(self) + return self._hosted_number_orders + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd14093f3a78726bc46c4523ff30f7de88086e8e GIT binary patch literal 2651 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/__init__.py b/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/__init__.py new file mode 100644 index 00000000..49d3d40d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/__init__.py @@ -0,0 +1,755 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Preview + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.preview.hosted_numbers.authorization_document.dependent_hosted_number_order import ( + DependentHostedNumberOrderList, +) + + +class AuthorizationDocumentInstance(InstanceResource): + + class Status(object): + OPENED = "opened" + SIGNING = "signing" + SIGNED = "signed" + CANCELED = "canceled" + FAILED = "failed" + + """ + :ivar sid: A 34 character string that uniquely identifies this AuthorizationDocument. + :ivar address_sid: A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + :ivar status: + :ivar email: Email that this AuthorizationDocument will be sent to for signing. + :ivar cc_emails: Email recipients who will be informed when an Authorization Document has been sent and signed. + :ivar date_created: The date this resource was created, given as [GMT RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date that this resource was updated, given as [GMT RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar url: + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.address_sid: Optional[str] = payload.get("address_sid") + self.status: Optional["AuthorizationDocumentInstance.Status"] = payload.get( + "status" + ) + self.email: Optional[str] = payload.get("email") + self.cc_emails: Optional[List[str]] = payload.get("cc_emails") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[AuthorizationDocumentContext] = None + + @property + def _proxy(self) -> "AuthorizationDocumentContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AuthorizationDocumentContext for this AuthorizationDocumentInstance + """ + if self._context is None: + self._context = AuthorizationDocumentContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "AuthorizationDocumentInstance": + """ + Fetch the AuthorizationDocumentInstance + + + :returns: The fetched AuthorizationDocumentInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AuthorizationDocumentInstance": + """ + Asynchronous coroutine to fetch the AuthorizationDocumentInstance + + + :returns: The fetched AuthorizationDocumentInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + hosted_number_order_sids: Union[List[str], object] = values.unset, + address_sid: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + contact_title: Union[str, object] = values.unset, + contact_phone_number: Union[str, object] = values.unset, + ) -> "AuthorizationDocumentInstance": + """ + Update the AuthorizationDocumentInstance + + :param hosted_number_order_sids: A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + :param address_sid: A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param cc_emails: Email recipients who will be informed when an Authorization Document has been sent and signed + :param status: + :param contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + :param contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + + :returns: The updated AuthorizationDocumentInstance + """ + return self._proxy.update( + hosted_number_order_sids=hosted_number_order_sids, + address_sid=address_sid, + email=email, + cc_emails=cc_emails, + status=status, + contact_title=contact_title, + contact_phone_number=contact_phone_number, + ) + + async def update_async( + self, + hosted_number_order_sids: Union[List[str], object] = values.unset, + address_sid: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + contact_title: Union[str, object] = values.unset, + contact_phone_number: Union[str, object] = values.unset, + ) -> "AuthorizationDocumentInstance": + """ + Asynchronous coroutine to update the AuthorizationDocumentInstance + + :param hosted_number_order_sids: A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + :param address_sid: A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param cc_emails: Email recipients who will be informed when an Authorization Document has been sent and signed + :param status: + :param contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + :param contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + + :returns: The updated AuthorizationDocumentInstance + """ + return await self._proxy.update_async( + hosted_number_order_sids=hosted_number_order_sids, + address_sid=address_sid, + email=email, + cc_emails=cc_emails, + status=status, + contact_title=contact_title, + contact_phone_number=contact_phone_number, + ) + + @property + def dependent_hosted_number_orders(self) -> DependentHostedNumberOrderList: + """ + Access the dependent_hosted_number_orders + """ + return self._proxy.dependent_hosted_number_orders + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AuthorizationDocumentContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the AuthorizationDocumentContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this AuthorizationDocument. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/AuthorizationDocuments/{sid}".format(**self._solution) + + self._dependent_hosted_number_orders: Optional[ + DependentHostedNumberOrderList + ] = None + + def fetch(self) -> AuthorizationDocumentInstance: + """ + Fetch the AuthorizationDocumentInstance + + + :returns: The fetched AuthorizationDocumentInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AuthorizationDocumentInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AuthorizationDocumentInstance: + """ + Asynchronous coroutine to fetch the AuthorizationDocumentInstance + + + :returns: The fetched AuthorizationDocumentInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AuthorizationDocumentInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + hosted_number_order_sids: Union[List[str], object] = values.unset, + address_sid: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + contact_title: Union[str, object] = values.unset, + contact_phone_number: Union[str, object] = values.unset, + ) -> AuthorizationDocumentInstance: + """ + Update the AuthorizationDocumentInstance + + :param hosted_number_order_sids: A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + :param address_sid: A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param cc_emails: Email recipients who will be informed when an Authorization Document has been sent and signed + :param status: + :param contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + :param contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + + :returns: The updated AuthorizationDocumentInstance + """ + + data = values.of( + { + "HostedNumberOrderSids": serialize.map( + hosted_number_order_sids, lambda e: e + ), + "AddressSid": address_sid, + "Email": email, + "CcEmails": serialize.map(cc_emails, lambda e: e), + "Status": status, + "ContactTitle": contact_title, + "ContactPhoneNumber": contact_phone_number, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthorizationDocumentInstance( + self._version, payload, sid=self._solution["sid"] + ) + + async def update_async( + self, + hosted_number_order_sids: Union[List[str], object] = values.unset, + address_sid: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + contact_title: Union[str, object] = values.unset, + contact_phone_number: Union[str, object] = values.unset, + ) -> AuthorizationDocumentInstance: + """ + Asynchronous coroutine to update the AuthorizationDocumentInstance + + :param hosted_number_order_sids: A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + :param address_sid: A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param cc_emails: Email recipients who will be informed when an Authorization Document has been sent and signed + :param status: + :param contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + :param contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + + :returns: The updated AuthorizationDocumentInstance + """ + + data = values.of( + { + "HostedNumberOrderSids": serialize.map( + hosted_number_order_sids, lambda e: e + ), + "AddressSid": address_sid, + "Email": email, + "CcEmails": serialize.map(cc_emails, lambda e: e), + "Status": status, + "ContactTitle": contact_title, + "ContactPhoneNumber": contact_phone_number, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthorizationDocumentInstance( + self._version, payload, sid=self._solution["sid"] + ) + + @property + def dependent_hosted_number_orders(self) -> DependentHostedNumberOrderList: + """ + Access the dependent_hosted_number_orders + """ + if self._dependent_hosted_number_orders is None: + self._dependent_hosted_number_orders = DependentHostedNumberOrderList( + self._version, + self._solution["sid"], + ) + return self._dependent_hosted_number_orders + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AuthorizationDocumentPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AuthorizationDocumentInstance: + """ + Build an instance of AuthorizationDocumentInstance + + :param payload: Payload response from the API + """ + return AuthorizationDocumentInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AuthorizationDocumentList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AuthorizationDocumentList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/AuthorizationDocuments" + + def create( + self, + hosted_number_order_sids: List[str], + address_sid: str, + email: str, + contact_title: str, + contact_phone_number: str, + cc_emails: Union[List[str], object] = values.unset, + ) -> AuthorizationDocumentInstance: + """ + Create the AuthorizationDocumentInstance + + :param hosted_number_order_sids: A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + :param address_sid: A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + :param contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + :param cc_emails: Email recipients who will be informed when an Authorization Document has been sent and signed. + + :returns: The created AuthorizationDocumentInstance + """ + + data = values.of( + { + "HostedNumberOrderSids": serialize.map( + hosted_number_order_sids, lambda e: e + ), + "AddressSid": address_sid, + "Email": email, + "ContactTitle": contact_title, + "ContactPhoneNumber": contact_phone_number, + "CcEmails": serialize.map(cc_emails, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthorizationDocumentInstance(self._version, payload) + + async def create_async( + self, + hosted_number_order_sids: List[str], + address_sid: str, + email: str, + contact_title: str, + contact_phone_number: str, + cc_emails: Union[List[str], object] = values.unset, + ) -> AuthorizationDocumentInstance: + """ + Asynchronously create the AuthorizationDocumentInstance + + :param hosted_number_order_sids: A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + :param address_sid: A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param contact_title: The title of the person authorized to sign the Authorization Document for this phone number. + :param contact_phone_number: The contact phone number of the person authorized to sign the Authorization Document. + :param cc_emails: Email recipients who will be informed when an Authorization Document has been sent and signed. + + :returns: The created AuthorizationDocumentInstance + """ + + data = values.of( + { + "HostedNumberOrderSids": serialize.map( + hosted_number_order_sids, lambda e: e + ), + "AddressSid": address_sid, + "Email": email, + "ContactTitle": contact_title, + "ContactPhoneNumber": contact_phone_number, + "CcEmails": serialize.map(cc_emails, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthorizationDocumentInstance(self._version, payload) + + def stream( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AuthorizationDocumentInstance]: + """ + Streams AuthorizationDocumentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str email: Email that this AuthorizationDocument will be sent to for signing. + :param "AuthorizationDocumentInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(email=email, status=status, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AuthorizationDocumentInstance]: + """ + Asynchronously streams AuthorizationDocumentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str email: Email that this AuthorizationDocument will be sent to for signing. + :param "AuthorizationDocumentInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + email=email, status=status, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthorizationDocumentInstance]: + """ + Lists AuthorizationDocumentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str email: Email that this AuthorizationDocument will be sent to for signing. + :param "AuthorizationDocumentInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + email=email, + status=status, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthorizationDocumentInstance]: + """ + Asynchronously lists AuthorizationDocumentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str email: Email that this AuthorizationDocument will be sent to for signing. + :param "AuthorizationDocumentInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + email=email, + status=status, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthorizationDocumentPage: + """ + Retrieve a single page of AuthorizationDocumentInstance records from the API. + Request is executed immediately + + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthorizationDocumentInstance + """ + data = values.of( + { + "Email": email, + "Status": status, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthorizationDocumentPage(self._version, response) + + async def page_async( + self, + email: Union[str, object] = values.unset, + status: Union["AuthorizationDocumentInstance.Status", object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthorizationDocumentPage: + """ + Asynchronously retrieve a single page of AuthorizationDocumentInstance records from the API. + Request is executed immediately + + :param email: Email that this AuthorizationDocument will be sent to for signing. + :param status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthorizationDocumentInstance + """ + data = values.of( + { + "Email": email, + "Status": status, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthorizationDocumentPage(self._version, response) + + def get_page(self, target_url: str) -> AuthorizationDocumentPage: + """ + Retrieve a specific page of AuthorizationDocumentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthorizationDocumentInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AuthorizationDocumentPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AuthorizationDocumentPage: + """ + Asynchronously retrieve a specific page of AuthorizationDocumentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthorizationDocumentInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AuthorizationDocumentPage(self._version, response) + + def get(self, sid: str) -> AuthorizationDocumentContext: + """ + Constructs a AuthorizationDocumentContext + + :param sid: A 34 character string that uniquely identifies this AuthorizationDocument. + """ + return AuthorizationDocumentContext(self._version, sid=sid) + + def __call__(self, sid: str) -> AuthorizationDocumentContext: + """ + Constructs a AuthorizationDocumentContext + + :param sid: A 34 character string that uniquely identifies this AuthorizationDocument. + """ + return AuthorizationDocumentContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa6cd140f03794c5b60c8f662ed1761385285cb8 GIT binary patch literal 35540 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/__pycache__/dependent_hosted_number_order.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/authorization_document/__pycache__/dependent_hosted_number_order.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8805aa309a90e85330b379bf620f3c315440428b GIT binary patch literal 25126 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 str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class DependentHostedNumberOrderPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> DependentHostedNumberOrderInstance: + """ + Build an instance of DependentHostedNumberOrderInstance + + :param payload: Payload response from the API + """ + return DependentHostedNumberOrderInstance( + self._version, + payload, + signing_document_sid=self._solution["signing_document_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DependentHostedNumberOrderList(ListResource): + + def __init__(self, version: Version, signing_document_sid: str): + """ + Initialize the DependentHostedNumberOrderList + + :param version: Version that contains the resource + :param signing_document_sid: A 34 character string that uniquely identifies the LOA document associated with this HostedNumberOrder. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "signing_document_sid": signing_document_sid, + } + self._uri = "/AuthorizationDocuments/{signing_document_sid}/DependentHostedNumberOrders".format( + **self._solution + ) + + def stream( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DependentHostedNumberOrderInstance]: + """ + Streams DependentHostedNumberOrderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "DependentHostedNumberOrderInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 64 characters. + :param str unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + unique_name=unique_name, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DependentHostedNumberOrderInstance]: + """ + Asynchronously streams DependentHostedNumberOrderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "DependentHostedNumberOrderInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 64 characters. + :param str unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + unique_name=unique_name, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DependentHostedNumberOrderInstance]: + """ + Lists DependentHostedNumberOrderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "DependentHostedNumberOrderInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 64 characters. + :param str unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + unique_name=unique_name, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DependentHostedNumberOrderInstance]: + """ + Asynchronously lists DependentHostedNumberOrderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "DependentHostedNumberOrderInstance.Status" status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 64 characters. + :param str unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + unique_name=unique_name, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DependentHostedNumberOrderPage: + """ + Retrieve a single page of DependentHostedNumberOrderInstance records from the API. + Request is executed immediately + + :param status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param friendly_name: A human readable description of this resource, up to 64 characters. + :param unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DependentHostedNumberOrderInstance + """ + data = values.of( + { + "Status": status, + "PhoneNumber": phone_number, + "IncomingPhoneNumberSid": incoming_phone_number_sid, + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DependentHostedNumberOrderPage(self._version, response, self._solution) + + async def page_async( + self, + status: Union[ + "DependentHostedNumberOrderInstance.Status", object + ] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DependentHostedNumberOrderPage: + """ + Asynchronously retrieve a single page of DependentHostedNumberOrderInstance records from the API. + Request is executed immediately + + :param status: Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource#status-values) for more information on each of these statuses. + :param phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param friendly_name: A human readable description of this resource, up to 64 characters. + :param unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DependentHostedNumberOrderInstance + """ + data = values.of( + { + "Status": status, + "PhoneNumber": phone_number, + "IncomingPhoneNumberSid": incoming_phone_number_sid, + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DependentHostedNumberOrderPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DependentHostedNumberOrderPage: + """ + Retrieve a specific page of DependentHostedNumberOrderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DependentHostedNumberOrderInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DependentHostedNumberOrderPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DependentHostedNumberOrderPage: + """ + Asynchronously retrieve a specific page of DependentHostedNumberOrderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DependentHostedNumberOrderInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DependentHostedNumberOrderPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/hosted_number_order.py b/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/hosted_number_order.py new file mode 100644 index 00000000..0c20af87 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/hosted_numbers/hosted_number_order.py @@ -0,0 +1,985 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Preview + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class HostedNumberOrderInstance(InstanceResource): + + class Status(object): + RECEIVED = "received" + PENDING_VERIFICATION = "pending-verification" + VERIFIED = "verified" + PENDING_LOA = "pending-loa" + CARRIER_PROCESSING = "carrier-processing" + TESTING = "testing" + COMPLETED = "completed" + FAILED = "failed" + ACTION_REQUIRED = "action-required" + + class VerificationType(object): + PHONE_CALL = "phone-call" + PHONE_BILL = "phone-bill" + + """ + :ivar sid: A 34 character string that uniquely identifies this HostedNumberOrder. + :ivar account_sid: A 34 character string that uniquely identifies the account. + :ivar incoming_phone_number_sid: A 34 character string that uniquely identifies the [IncomingPhoneNumber](https://www.twilio.com/docs/phone-numbers/api/incomingphonenumber-resource) resource that represents the phone number being hosted. + :ivar address_sid: A 34 character string that uniquely identifies the Address resource that represents the address of the owner of this phone number. + :ivar signing_document_sid: A 34 character string that uniquely identifies the [Authorization Document](https://www.twilio.com/docs/phone-numbers/hosted-numbers/hosted-numbers-api/authorization-document-resource) the user needs to sign. + :ivar phone_number: Phone number to be hosted. This must be in [E.164](https://en.wikipedia.org/wiki/E.164) format, e.g., +16175551212 + :ivar capabilities: + :ivar friendly_name: A 64 character string that is a human-readable text that describes this resource. + :ivar unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :ivar status: + :ivar failure_reason: A message that explains why a hosted_number_order went to status \"action-required\" + :ivar date_created: The date this resource was created, given as [GMT RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date that this resource was updated, given as [GMT RFC 2822](http://www.ietf.org/rfc/rfc2822.txt) format. + :ivar verification_attempts: The number of attempts made to verify ownership of the phone number that is being hosted. + :ivar email: Email of the owner of this phone number that is being hosted. + :ivar cc_emails: A list of emails that LOA document for this HostedNumberOrder will be carbon copied to. + :ivar url: The URL of this HostedNumberOrder. + :ivar verification_type: + :ivar verification_document_sid: A 34 character string that uniquely identifies the Identity Document resource that represents the document for verifying ownership of the number to be hosted. + :ivar extension: A numerical extension to be used when making the ownership verification call. + :ivar call_delay: A value between 0-30 specifying the number of seconds to delay initiating the ownership verification call. + :ivar verification_code: A verification code provided in the response for a user to enter when they pick up the phone call. + :ivar verification_call_sids: A list of 34 character strings that are unique identifiers for the calls placed as part of ownership verification. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.incoming_phone_number_sid: Optional[str] = payload.get( + "incoming_phone_number_sid" + ) + self.address_sid: Optional[str] = payload.get("address_sid") + self.signing_document_sid: Optional[str] = payload.get("signing_document_sid") + self.phone_number: Optional[str] = payload.get("phone_number") + self.capabilities: Optional[str] = payload.get("capabilities") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.unique_name: Optional[str] = payload.get("unique_name") + self.status: Optional["HostedNumberOrderInstance.Status"] = payload.get( + "status" + ) + self.failure_reason: Optional[str] = payload.get("failure_reason") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.verification_attempts: Optional[int] = deserialize.integer( + payload.get("verification_attempts") + ) + self.email: Optional[str] = payload.get("email") + self.cc_emails: Optional[List[str]] = payload.get("cc_emails") + self.url: Optional[str] = payload.get("url") + self.verification_type: Optional[ + "HostedNumberOrderInstance.VerificationType" + ] = payload.get("verification_type") + self.verification_document_sid: Optional[str] = payload.get( + "verification_document_sid" + ) + self.extension: Optional[str] = payload.get("extension") + self.call_delay: Optional[int] = deserialize.integer(payload.get("call_delay")) + self.verification_code: Optional[str] = payload.get("verification_code") + self.verification_call_sids: Optional[List[str]] = payload.get( + "verification_call_sids" + ) + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[HostedNumberOrderContext] = None + + @property + def _proxy(self) -> "HostedNumberOrderContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: HostedNumberOrderContext for this HostedNumberOrderInstance + """ + if self._context is None: + self._context = HostedNumberOrderContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the HostedNumberOrderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the HostedNumberOrderInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "HostedNumberOrderInstance": + """ + Fetch the HostedNumberOrderInstance + + + :returns: The fetched HostedNumberOrderInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "HostedNumberOrderInstance": + """ + Asynchronous coroutine to fetch the HostedNumberOrderInstance + + + :returns: The fetched HostedNumberOrderInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + verification_code: Union[str, object] = values.unset, + verification_type: Union[ + "HostedNumberOrderInstance.VerificationType", object + ] = values.unset, + verification_document_sid: Union[str, object] = values.unset, + extension: Union[str, object] = values.unset, + call_delay: Union[int, object] = values.unset, + ) -> "HostedNumberOrderInstance": + """ + Update the HostedNumberOrderInstance + + :param friendly_name: A 64 character string that is a human readable text that describes this resource. + :param unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param email: Email of the owner of this phone number that is being hosted. + :param cc_emails: Optional. A list of emails that LOA document for this HostedNumberOrder will be carbon copied to. + :param status: + :param verification_code: A verification code that is given to the user via a phone call to the phone number that is being hosted. + :param verification_type: + :param verification_document_sid: Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + :param extension: Digits to dial after connecting the verification call. + :param call_delay: The number of seconds, between 0 and 60, to delay before initiating the verification call. Defaults to 0. + + :returns: The updated HostedNumberOrderInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + unique_name=unique_name, + email=email, + cc_emails=cc_emails, + status=status, + verification_code=verification_code, + verification_type=verification_type, + verification_document_sid=verification_document_sid, + extension=extension, + call_delay=call_delay, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + verification_code: Union[str, object] = values.unset, + verification_type: Union[ + "HostedNumberOrderInstance.VerificationType", object + ] = values.unset, + verification_document_sid: Union[str, object] = values.unset, + extension: Union[str, object] = values.unset, + call_delay: Union[int, object] = values.unset, + ) -> "HostedNumberOrderInstance": + """ + Asynchronous coroutine to update the HostedNumberOrderInstance + + :param friendly_name: A 64 character string that is a human readable text that describes this resource. + :param unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param email: Email of the owner of this phone number that is being hosted. + :param cc_emails: Optional. A list of emails that LOA document for this HostedNumberOrder will be carbon copied to. + :param status: + :param verification_code: A verification code that is given to the user via a phone call to the phone number that is being hosted. + :param verification_type: + :param verification_document_sid: Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + :param extension: Digits to dial after connecting the verification call. + :param call_delay: The number of seconds, between 0 and 60, to delay before initiating the verification call. Defaults to 0. + + :returns: The updated HostedNumberOrderInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + unique_name=unique_name, + email=email, + cc_emails=cc_emails, + status=status, + verification_code=verification_code, + verification_type=verification_type, + verification_document_sid=verification_document_sid, + extension=extension, + call_delay=call_delay, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class HostedNumberOrderContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the HostedNumberOrderContext + + :param version: Version that contains the resource + :param sid: A 34 character string that uniquely identifies this HostedNumberOrder. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/HostedNumberOrders/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the HostedNumberOrderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the HostedNumberOrderInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> HostedNumberOrderInstance: + """ + Fetch the HostedNumberOrderInstance + + + :returns: The fetched HostedNumberOrderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return HostedNumberOrderInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> HostedNumberOrderInstance: + """ + Asynchronous coroutine to fetch the HostedNumberOrderInstance + + + :returns: The fetched HostedNumberOrderInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return HostedNumberOrderInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + verification_code: Union[str, object] = values.unset, + verification_type: Union[ + "HostedNumberOrderInstance.VerificationType", object + ] = values.unset, + verification_document_sid: Union[str, object] = values.unset, + extension: Union[str, object] = values.unset, + call_delay: Union[int, object] = values.unset, + ) -> HostedNumberOrderInstance: + """ + Update the HostedNumberOrderInstance + + :param friendly_name: A 64 character string that is a human readable text that describes this resource. + :param unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param email: Email of the owner of this phone number that is being hosted. + :param cc_emails: Optional. A list of emails that LOA document for this HostedNumberOrder will be carbon copied to. + :param status: + :param verification_code: A verification code that is given to the user via a phone call to the phone number that is being hosted. + :param verification_type: + :param verification_document_sid: Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + :param extension: Digits to dial after connecting the verification call. + :param call_delay: The number of seconds, between 0 and 60, to delay before initiating the verification call. Defaults to 0. + + :returns: The updated HostedNumberOrderInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Email": email, + "CcEmails": serialize.map(cc_emails, lambda e: e), + "Status": status, + "VerificationCode": verification_code, + "VerificationType": verification_type, + "VerificationDocumentSid": verification_document_sid, + "Extension": extension, + "CallDelay": call_delay, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return HostedNumberOrderInstance( + self._version, payload, sid=self._solution["sid"] + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + verification_code: Union[str, object] = values.unset, + verification_type: Union[ + "HostedNumberOrderInstance.VerificationType", object + ] = values.unset, + verification_document_sid: Union[str, object] = values.unset, + extension: Union[str, object] = values.unset, + call_delay: Union[int, object] = values.unset, + ) -> HostedNumberOrderInstance: + """ + Asynchronous coroutine to update the HostedNumberOrderInstance + + :param friendly_name: A 64 character string that is a human readable text that describes this resource. + :param unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param email: Email of the owner of this phone number that is being hosted. + :param cc_emails: Optional. A list of emails that LOA document for this HostedNumberOrder will be carbon copied to. + :param status: + :param verification_code: A verification code that is given to the user via a phone call to the phone number that is being hosted. + :param verification_type: + :param verification_document_sid: Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + :param extension: Digits to dial after connecting the verification call. + :param call_delay: The number of seconds, between 0 and 60, to delay before initiating the verification call. Defaults to 0. + + :returns: The updated HostedNumberOrderInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "Email": email, + "CcEmails": serialize.map(cc_emails, lambda e: e), + "Status": status, + "VerificationCode": verification_code, + "VerificationType": verification_type, + "VerificationDocumentSid": verification_document_sid, + "Extension": extension, + "CallDelay": call_delay, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return HostedNumberOrderInstance( + self._version, payload, sid=self._solution["sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class HostedNumberOrderPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> HostedNumberOrderInstance: + """ + Build an instance of HostedNumberOrderInstance + + :param payload: Payload response from the API + """ + return HostedNumberOrderInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class HostedNumberOrderList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the HostedNumberOrderList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/HostedNumberOrders" + + def create( + self, + phone_number: str, + sms_capability: bool, + account_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + status_callback_url: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + verification_type: Union[ + "HostedNumberOrderInstance.VerificationType", object + ] = values.unset, + verification_document_sid: Union[str, object] = values.unset, + ) -> HostedNumberOrderInstance: + """ + Create the HostedNumberOrderInstance + + :param phone_number: The number to host in [+E.164](https://en.wikipedia.org/wiki/E.164) format + :param sms_capability: Used to specify that the SMS capability will be hosted on Twilio's platform. + :param account_sid: This defaults to the AccountSid of the authorization the user is using. This can be provided to specify a subaccount to add the HostedNumberOrder to. + :param friendly_name: A 64 character string that is a human readable text that describes this resource. + :param unique_name: Optional. Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param cc_emails: Optional. A list of emails that the LOA document for this HostedNumberOrder will be carbon copied to. + :param sms_url: The URL that Twilio should request when somebody sends an SMS to the phone number. This will be copied onto the IncomingPhoneNumber resource. + :param sms_method: The HTTP method that should be used to request the SmsUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + :param sms_fallback_url: A URL that Twilio will request if an error occurs requesting or executing the TwiML defined by SmsUrl. This will be copied onto the IncomingPhoneNumber resource. + :param sms_fallback_method: The HTTP method that should be used to request the SmsFallbackUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + :param status_callback_url: Optional. The Status Callback URL attached to the IncomingPhoneNumber resource. + :param status_callback_method: Optional. The Status Callback Method attached to the IncomingPhoneNumber resource. + :param sms_application_sid: Optional. The 34 character sid of the application Twilio should use to handle SMS messages sent to this number. If a `SmsApplicationSid` is present, Twilio will ignore all of the SMS urls above and use those set on the application. + :param address_sid: Optional. A 34 character string that uniquely identifies the Address resource that represents the address of the owner of this phone number. + :param email: Optional. Email of the owner of this phone number that is being hosted. + :param verification_type: + :param verification_document_sid: Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + + :returns: The created HostedNumberOrderInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "SmsCapability": serialize.boolean_to_string(sms_capability), + "AccountSid": account_sid, + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "CcEmails": serialize.map(cc_emails, lambda e: e), + "SmsUrl": sms_url, + "SmsMethod": sms_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsFallbackMethod": sms_fallback_method, + "StatusCallbackUrl": status_callback_url, + "StatusCallbackMethod": status_callback_method, + "SmsApplicationSid": sms_application_sid, + "AddressSid": address_sid, + "Email": email, + "VerificationType": verification_type, + "VerificationDocumentSid": verification_document_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return HostedNumberOrderInstance(self._version, payload) + + async def create_async( + self, + phone_number: str, + sms_capability: bool, + account_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + cc_emails: Union[List[str], object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + status_callback_url: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + email: Union[str, object] = values.unset, + verification_type: Union[ + "HostedNumberOrderInstance.VerificationType", object + ] = values.unset, + verification_document_sid: Union[str, object] = values.unset, + ) -> HostedNumberOrderInstance: + """ + Asynchronously create the HostedNumberOrderInstance + + :param phone_number: The number to host in [+E.164](https://en.wikipedia.org/wiki/E.164) format + :param sms_capability: Used to specify that the SMS capability will be hosted on Twilio's platform. + :param account_sid: This defaults to the AccountSid of the authorization the user is using. This can be provided to specify a subaccount to add the HostedNumberOrder to. + :param friendly_name: A 64 character string that is a human readable text that describes this resource. + :param unique_name: Optional. Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param cc_emails: Optional. A list of emails that the LOA document for this HostedNumberOrder will be carbon copied to. + :param sms_url: The URL that Twilio should request when somebody sends an SMS to the phone number. This will be copied onto the IncomingPhoneNumber resource. + :param sms_method: The HTTP method that should be used to request the SmsUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + :param sms_fallback_url: A URL that Twilio will request if an error occurs requesting or executing the TwiML defined by SmsUrl. This will be copied onto the IncomingPhoneNumber resource. + :param sms_fallback_method: The HTTP method that should be used to request the SmsFallbackUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + :param status_callback_url: Optional. The Status Callback URL attached to the IncomingPhoneNumber resource. + :param status_callback_method: Optional. The Status Callback Method attached to the IncomingPhoneNumber resource. + :param sms_application_sid: Optional. The 34 character sid of the application Twilio should use to handle SMS messages sent to this number. If a `SmsApplicationSid` is present, Twilio will ignore all of the SMS urls above and use those set on the application. + :param address_sid: Optional. A 34 character string that uniquely identifies the Address resource that represents the address of the owner of this phone number. + :param email: Optional. Email of the owner of this phone number that is being hosted. + :param verification_type: + :param verification_document_sid: Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + + :returns: The created HostedNumberOrderInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "SmsCapability": serialize.boolean_to_string(sms_capability), + "AccountSid": account_sid, + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "CcEmails": serialize.map(cc_emails, lambda e: e), + "SmsUrl": sms_url, + "SmsMethod": sms_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsFallbackMethod": sms_fallback_method, + "StatusCallbackUrl": status_callback_url, + "StatusCallbackMethod": status_callback_method, + "SmsApplicationSid": sms_application_sid, + "AddressSid": address_sid, + "Email": email, + "VerificationType": verification_type, + "VerificationDocumentSid": verification_document_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return HostedNumberOrderInstance(self._version, payload) + + def stream( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[HostedNumberOrderInstance]: + """ + Streams HostedNumberOrderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "HostedNumberOrderInstance.Status" status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 64 characters. + :param str unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + unique_name=unique_name, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[HostedNumberOrderInstance]: + """ + Asynchronously streams HostedNumberOrderInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param "HostedNumberOrderInstance.Status" status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 64 characters. + :param str unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + unique_name=unique_name, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[HostedNumberOrderInstance]: + """ + Lists HostedNumberOrderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "HostedNumberOrderInstance.Status" status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 64 characters. + :param str unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + unique_name=unique_name, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[HostedNumberOrderInstance]: + """ + Asynchronously lists HostedNumberOrderInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param "HostedNumberOrderInstance.Status" status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param str phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param str incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param str friendly_name: A human readable description of this resource, up to 64 characters. + :param str unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + status=status, + phone_number=phone_number, + incoming_phone_number_sid=incoming_phone_number_sid, + friendly_name=friendly_name, + unique_name=unique_name, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> HostedNumberOrderPage: + """ + Retrieve a single page of HostedNumberOrderInstance records from the API. + Request is executed immediately + + :param status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param friendly_name: A human readable description of this resource, up to 64 characters. + :param unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of HostedNumberOrderInstance + """ + data = values.of( + { + "Status": status, + "PhoneNumber": phone_number, + "IncomingPhoneNumberSid": incoming_phone_number_sid, + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return HostedNumberOrderPage(self._version, response) + + async def page_async( + self, + status: Union["HostedNumberOrderInstance.Status", object] = values.unset, + phone_number: Union[str, object] = values.unset, + incoming_phone_number_sid: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + unique_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> HostedNumberOrderPage: + """ + Asynchronously retrieve a single page of HostedNumberOrderInstance records from the API. + Request is executed immediately + + :param status: The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + :param phone_number: An E164 formatted phone number hosted by this HostedNumberOrder. + :param incoming_phone_number_sid: A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + :param friendly_name: A human readable description of this resource, up to 64 characters. + :param unique_name: Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of HostedNumberOrderInstance + """ + data = values.of( + { + "Status": status, + "PhoneNumber": phone_number, + "IncomingPhoneNumberSid": incoming_phone_number_sid, + "FriendlyName": friendly_name, + "UniqueName": unique_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return HostedNumberOrderPage(self._version, response) + + def get_page(self, target_url: str) -> HostedNumberOrderPage: + """ + Retrieve a specific page of HostedNumberOrderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of HostedNumberOrderInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return HostedNumberOrderPage(self._version, response) + + async def get_page_async(self, target_url: str) -> HostedNumberOrderPage: + """ + Asynchronously retrieve a specific page of HostedNumberOrderInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of HostedNumberOrderInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return HostedNumberOrderPage(self._version, response) + + def get(self, sid: str) -> HostedNumberOrderContext: + """ + Constructs a HostedNumberOrderContext + + :param sid: A 34 character string that uniquely identifies this HostedNumberOrder. + """ + return HostedNumberOrderContext(self._version, sid=sid) + + def __call__(self, sid: str) -> HostedNumberOrderContext: + """ + Constructs a HostedNumberOrderContext + + :param sid: A 34 character string that uniquely identifies this HostedNumberOrder. + """ + return HostedNumberOrderContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/marketplace/__init__.py b/venv/Lib/site-packages/twilio/rest/preview/marketplace/__init__.py new file mode 100644 index 00000000..fcc99a41 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/marketplace/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Preview + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.preview.marketplace.available_add_on import AvailableAddOnList +from twilio.rest.preview.marketplace.installed_add_on import InstalledAddOnList + + +class Marketplace(Version): + + def __init__(self, domain: Domain): + """ + Initialize the Marketplace version of Preview + + :param domain: The Twilio.preview domain + """ + super().__init__(domain, "marketplace") + self._available_add_ons: Optional[AvailableAddOnList] = None + self._installed_add_ons: Optional[InstalledAddOnList] = None + + @property + def available_add_ons(self) -> AvailableAddOnList: + if self._available_add_ons is None: + self._available_add_ons = AvailableAddOnList(self) + return self._available_add_ons + + @property + def installed_add_ons(self) -> InstalledAddOnList: + if self._installed_add_ons is None: + self._installed_add_ons = InstalledAddOnList(self) + return self._installed_add_ons + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/marketplace/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/marketplace/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06308f3d2a2a640da28d43fce38b63d21259e949 GIT binary patch literal 2546 zcmcf?O>f*pbnNx+I=h>uO`}p!N=FGKETUd6NGPhJ22xcKZBjKU2W!zVu_ukG*LKIw zhK=@+LnP8eB`zpEa;@?Q_zzrKC~9R-E9}q8@Bc4&HI{ppZ;-p zxPsuh_0yN@2PK4l6Pw;s%#cGHkUiug8@ZaR`&vu4bxq&}ztA#lL*j;CY?bVi#EX8p zW!k31Oa4%+VplYzqYKC_?;zJ?#(qKBwyT|?dWHU>AymQetgL%6c0!loO&a5CEMS}_ z%*Cr6!6t;@7q1`)5)q1WRbXJ7N%e^cJ3@^Rd1@EqZvFyUY~TYC#UVscN2WVZLuQ8GM)oPCrK2~G#VkWY2=;Bas=#zIqOnnKEy$oVCH&>yo@6cY0+SV`hLf%{4R1| z*HUvSO1vk-l^FJE4l?%TGL%)$Joy-*kwsIfm-aN4uNC^ zXr&#)uI{3*HM_Qq>gBY0iSp|#iG1p?wB*W*J9^)348X;O4nG0#owkRPoOx64qFc~o zUCq_@Gacv{ppx8z-1Qtn9lc)Ix*=mMs%9bZ5|8@c7L#G_y9#crXyR}!FOghrCZe3S zu)3_M1D4f^6{%{-VzXRae zHhNM+Lq~3w@0llWpZNaNeY5fK-2AR_-#jhXU(C~oAcxWtXUPT+92j8vBfOD0zXHe} z>Y}f5)(d3&Xp-l(i}o{p$bByI?|RGVj<#6W`3T5ynAou8$6$$t1f;~Aex91$oxfk3d^mFa!N}CTk*T}p6dwcG z|I=sw1{?@pABBaN1(3Pw_j#b&UiNu_{hqM$mH-3J08u4SbnhPOXmx#y6{QhOLq-Mln z-1DR(3y!}j7%~atfTe{v;rz6~hO>@#nC}x(*Z3$JLteL zi|4i5?Wahr2V-W>z*XxyW}q+Rsr_QpO_vFk^@*)0>r6-;}Xl?JF6s*Q>o+ znku$3R&T?FlsBTWpPOe@u4efMuocxGi>^H=Xqxt?Uek=H<47BSgr*;%cORi8_@0zb NY1X&XPZ2EA&_9l$mcsx5 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/__init__.py b/venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/__init__.py new file mode 100644 index 00000000..e81ec649 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/__init__.py @@ -0,0 +1,438 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Preview + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.preview.marketplace.available_add_on.available_add_on_extension import ( + AvailableAddOnExtensionList, +) + + +class AvailableAddOnInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the AvailableAddOn resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar description: A short description of the Add-on's functionality. + :ivar pricing_type: How customers are charged for using this Add-on. + :ivar configuration_schema: The JSON object with the configuration that must be provided when installing a given Add-on. + :ivar url: The absolute URL of the resource. + :ivar links: The URLs of related resources. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.description: Optional[str] = payload.get("description") + self.pricing_type: Optional[str] = payload.get("pricing_type") + self.configuration_schema: Optional[Dict[str, object]] = payload.get( + "configuration_schema" + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[AvailableAddOnContext] = None + + @property + def _proxy(self) -> "AvailableAddOnContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AvailableAddOnContext for this AvailableAddOnInstance + """ + if self._context is None: + self._context = AvailableAddOnContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "AvailableAddOnInstance": + """ + Fetch the AvailableAddOnInstance + + + :returns: The fetched AvailableAddOnInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AvailableAddOnInstance": + """ + Asynchronous coroutine to fetch the AvailableAddOnInstance + + + :returns: The fetched AvailableAddOnInstance + """ + return await self._proxy.fetch_async() + + @property + def extensions(self) -> AvailableAddOnExtensionList: + """ + Access the extensions + """ + return self._proxy.extensions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AvailableAddOnContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the AvailableAddOnContext + + :param version: Version that contains the resource + :param sid: The SID of the AvailableAddOn resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/AvailableAddOns/{sid}".format(**self._solution) + + self._extensions: Optional[AvailableAddOnExtensionList] = None + + def fetch(self) -> AvailableAddOnInstance: + """ + Fetch the AvailableAddOnInstance + + + :returns: The fetched AvailableAddOnInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AvailableAddOnInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AvailableAddOnInstance: + """ + Asynchronous coroutine to fetch the AvailableAddOnInstance + + + :returns: The fetched AvailableAddOnInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AvailableAddOnInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + @property + def extensions(self) -> AvailableAddOnExtensionList: + """ + Access the extensions + """ + if self._extensions is None: + self._extensions = AvailableAddOnExtensionList( + self._version, + self._solution["sid"], + ) + return self._extensions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AvailableAddOnPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AvailableAddOnInstance: + """ + Build an instance of AvailableAddOnInstance + + :param payload: Payload response from the API + """ + return AvailableAddOnInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AvailableAddOnList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AvailableAddOnList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/AvailableAddOns" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AvailableAddOnInstance]: + """ + Streams AvailableAddOnInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AvailableAddOnInstance]: + """ + Asynchronously streams AvailableAddOnInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AvailableAddOnInstance]: + """ + Lists AvailableAddOnInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AvailableAddOnInstance]: + """ + Asynchronously lists AvailableAddOnInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AvailableAddOnPage: + """ + Retrieve a single page of AvailableAddOnInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AvailableAddOnInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AvailableAddOnPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AvailableAddOnPage: + """ + Asynchronously retrieve a single page of AvailableAddOnInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AvailableAddOnInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AvailableAddOnPage(self._version, response) + + def get_page(self, target_url: str) -> AvailableAddOnPage: + """ + Retrieve a specific page of AvailableAddOnInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AvailableAddOnInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AvailableAddOnPage(self._version, response) + + async def get_page_async(self, target_url: str) -> AvailableAddOnPage: + """ + Asynchronously retrieve a specific page of AvailableAddOnInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AvailableAddOnInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AvailableAddOnPage(self._version, response) + + def get(self, sid: str) -> AvailableAddOnContext: + """ + Constructs a AvailableAddOnContext + + :param sid: The SID of the AvailableAddOn resource to fetch. + """ + return AvailableAddOnContext(self._version, sid=sid) + + def __call__(self, sid: str) -> AvailableAddOnContext: + """ + Constructs a AvailableAddOnContext + + :param sid: The SID of the AvailableAddOn resource to fetch. + """ + return AvailableAddOnContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..077766cea45579916287cfa7fd47c70d87e6ba5f GIT binary patch literal 19722 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/__pycache__/available_add_on_extension.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/__pycache__/available_add_on_extension.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d9d8676f55118fbcc949000e7973416e58d2442 GIT binary patch literal 20241 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 Bx3>TQ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/available_add_on_extension.py b/venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/available_add_on_extension.py new file mode 100644 index 00000000..4c05f424 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/marketplace/available_add_on/available_add_on_extension.py @@ -0,0 +1,445 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Preview + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AvailableAddOnExtensionInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the AvailableAddOnExtension resource. + :ivar available_add_on_sid: The SID of the AvailableAddOn resource to which this extension applies. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar product_name: The name of the Product this Extension is used within. + :ivar unique_name: An application-defined string that uniquely identifies the resource. + :ivar url: The absolute URL of the resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + available_add_on_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.available_add_on_sid: Optional[str] = payload.get("available_add_on_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.product_name: Optional[str] = payload.get("product_name") + self.unique_name: Optional[str] = payload.get("unique_name") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "available_add_on_sid": available_add_on_sid, + "sid": sid or self.sid, + } + self._context: Optional[AvailableAddOnExtensionContext] = None + + @property + def _proxy(self) -> "AvailableAddOnExtensionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AvailableAddOnExtensionContext for this AvailableAddOnExtensionInstance + """ + if self._context is None: + self._context = AvailableAddOnExtensionContext( + self._version, + available_add_on_sid=self._solution["available_add_on_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "AvailableAddOnExtensionInstance": + """ + Fetch the AvailableAddOnExtensionInstance + + + :returns: The fetched AvailableAddOnExtensionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AvailableAddOnExtensionInstance": + """ + Asynchronous coroutine to fetch the AvailableAddOnExtensionInstance + + + :returns: The fetched AvailableAddOnExtensionInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AvailableAddOnExtensionContext(InstanceContext): + + def __init__(self, version: Version, available_add_on_sid: str, sid: str): + """ + Initialize the AvailableAddOnExtensionContext + + :param version: Version that contains the resource + :param available_add_on_sid: The SID of the AvailableAddOn resource with the extension to fetch. + :param sid: The SID of the AvailableAddOn Extension resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "available_add_on_sid": available_add_on_sid, + "sid": sid, + } + self._uri = "/AvailableAddOns/{available_add_on_sid}/Extensions/{sid}".format( + **self._solution + ) + + def fetch(self) -> AvailableAddOnExtensionInstance: + """ + Fetch the AvailableAddOnExtensionInstance + + + :returns: The fetched AvailableAddOnExtensionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AvailableAddOnExtensionInstance( + self._version, + payload, + available_add_on_sid=self._solution["available_add_on_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AvailableAddOnExtensionInstance: + """ + Asynchronous coroutine to fetch the AvailableAddOnExtensionInstance + + + :returns: The fetched AvailableAddOnExtensionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AvailableAddOnExtensionInstance( + self._version, + payload, + available_add_on_sid=self._solution["available_add_on_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AvailableAddOnExtensionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AvailableAddOnExtensionInstance: + """ + Build an instance of AvailableAddOnExtensionInstance + + :param payload: Payload response from the API + """ + return AvailableAddOnExtensionInstance( + self._version, + payload, + available_add_on_sid=self._solution["available_add_on_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AvailableAddOnExtensionList(ListResource): + + def __init__(self, version: Version, available_add_on_sid: str): + """ + Initialize the AvailableAddOnExtensionList + + :param version: Version that contains the resource + :param available_add_on_sid: The SID of the AvailableAddOn resource with the extensions to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "available_add_on_sid": available_add_on_sid, + } + self._uri = "/AvailableAddOns/{available_add_on_sid}/Extensions".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AvailableAddOnExtensionInstance]: + """ + Streams AvailableAddOnExtensionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AvailableAddOnExtensionInstance]: + """ + Asynchronously streams AvailableAddOnExtensionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AvailableAddOnExtensionInstance]: + """ + Lists AvailableAddOnExtensionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AvailableAddOnExtensionInstance]: + """ + Asynchronously lists AvailableAddOnExtensionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AvailableAddOnExtensionPage: + """ + Retrieve a single page of AvailableAddOnExtensionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AvailableAddOnExtensionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AvailableAddOnExtensionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AvailableAddOnExtensionPage: + """ + Asynchronously retrieve a single page of AvailableAddOnExtensionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AvailableAddOnExtensionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AvailableAddOnExtensionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AvailableAddOnExtensionPage: + """ + Retrieve a specific page of AvailableAddOnExtensionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AvailableAddOnExtensionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AvailableAddOnExtensionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AvailableAddOnExtensionPage: + """ + Asynchronously retrieve a specific page of AvailableAddOnExtensionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AvailableAddOnExtensionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AvailableAddOnExtensionPage(self._version, response, self._solution) + + def get(self, sid: str) -> AvailableAddOnExtensionContext: + """ + Constructs a AvailableAddOnExtensionContext + + :param sid: The SID of the AvailableAddOn Extension resource to fetch. + """ + return AvailableAddOnExtensionContext( + self._version, + available_add_on_sid=self._solution["available_add_on_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> AvailableAddOnExtensionContext: + """ + Constructs a AvailableAddOnExtensionContext + + :param sid: The SID of the AvailableAddOn Extension resource to fetch. + """ + return AvailableAddOnExtensionContext( + self._version, + available_add_on_sid=self._solution["available_add_on_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/marketplace/installed_add_on/__init__.py b/venv/Lib/site-packages/twilio/rest/preview/marketplace/installed_add_on/__init__.py new file mode 100644 index 00000000..7f1fadc5 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/marketplace/installed_add_on/__init__.py @@ -0,0 +1,671 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Preview + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.preview.marketplace.installed_add_on.installed_add_on_extension import ( + InstalledAddOnExtensionList, +) + + +class InstalledAddOnInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the InstalledAddOn resource. This Sid can also be found in the Console on that specific Add-ons page as the 'Available Add-on Sid'. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the InstalledAddOn resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar description: A short description of the Add-on's functionality. + :ivar configuration: The JSON object that represents the current configuration of installed Add-on. + :ivar unique_name: An application-defined string that uniquely identifies the resource. + :ivar date_created: The date and time in GMT when the resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the resource. + :ivar links: The URLs of related resources. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.description: Optional[str] = payload.get("description") + self.configuration: Optional[Dict[str, object]] = payload.get("configuration") + self.unique_name: Optional[str] = payload.get("unique_name") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[InstalledAddOnContext] = None + + @property + def _proxy(self) -> "InstalledAddOnContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InstalledAddOnContext for this InstalledAddOnInstance + """ + if self._context is None: + self._context = InstalledAddOnContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the InstalledAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InstalledAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "InstalledAddOnInstance": + """ + Fetch the InstalledAddOnInstance + + + :returns: The fetched InstalledAddOnInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InstalledAddOnInstance": + """ + Asynchronous coroutine to fetch the InstalledAddOnInstance + + + :returns: The fetched InstalledAddOnInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> "InstalledAddOnInstance": + """ + Update the InstalledAddOnInstance + + :param configuration: Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The updated InstalledAddOnInstance + """ + return self._proxy.update( + configuration=configuration, + unique_name=unique_name, + ) + + async def update_async( + self, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> "InstalledAddOnInstance": + """ + Asynchronous coroutine to update the InstalledAddOnInstance + + :param configuration: Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The updated InstalledAddOnInstance + """ + return await self._proxy.update_async( + configuration=configuration, + unique_name=unique_name, + ) + + @property + def extensions(self) -> InstalledAddOnExtensionList: + """ + Access the extensions + """ + return self._proxy.extensions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InstalledAddOnContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the InstalledAddOnContext + + :param version: Version that contains the resource + :param sid: The SID of the InstalledAddOn resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/InstalledAddOns/{sid}".format(**self._solution) + + self._extensions: Optional[InstalledAddOnExtensionList] = None + + def delete(self) -> bool: + """ + Deletes the InstalledAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InstalledAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> InstalledAddOnInstance: + """ + Fetch the InstalledAddOnInstance + + + :returns: The fetched InstalledAddOnInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InstalledAddOnInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InstalledAddOnInstance: + """ + Asynchronous coroutine to fetch the InstalledAddOnInstance + + + :returns: The fetched InstalledAddOnInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InstalledAddOnInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> InstalledAddOnInstance: + """ + Update the InstalledAddOnInstance + + :param configuration: Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The updated InstalledAddOnInstance + """ + + data = values.of( + { + "Configuration": serialize.object(configuration), + "UniqueName": unique_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> InstalledAddOnInstance: + """ + Asynchronous coroutine to update the InstalledAddOnInstance + + :param configuration: Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The updated InstalledAddOnInstance + """ + + data = values.of( + { + "Configuration": serialize.object(configuration), + "UniqueName": unique_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def extensions(self) -> InstalledAddOnExtensionList: + """ + Access the extensions + """ + if self._extensions is None: + self._extensions = InstalledAddOnExtensionList( + self._version, + self._solution["sid"], + ) + return self._extensions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InstalledAddOnPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InstalledAddOnInstance: + """ + Build an instance of InstalledAddOnInstance + + :param payload: Payload response from the API + """ + return InstalledAddOnInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InstalledAddOnList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the InstalledAddOnList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/InstalledAddOns" + + def create( + self, + available_add_on_sid: str, + accept_terms_of_service: bool, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> InstalledAddOnInstance: + """ + Create the InstalledAddOnInstance + + :param available_add_on_sid: The SID of the AvaliableAddOn to install. + :param accept_terms_of_service: Whether the Terms of Service were accepted. + :param configuration: The JSON object that represents the configuration of the new Add-on being installed. + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The created InstalledAddOnInstance + """ + + data = values.of( + { + "AvailableAddOnSid": available_add_on_sid, + "AcceptTermsOfService": serialize.boolean_to_string( + accept_terms_of_service + ), + "Configuration": serialize.object(configuration), + "UniqueName": unique_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnInstance(self._version, payload) + + async def create_async( + self, + available_add_on_sid: str, + accept_terms_of_service: bool, + configuration: Union[object, object] = values.unset, + unique_name: Union[str, object] = values.unset, + ) -> InstalledAddOnInstance: + """ + Asynchronously create the InstalledAddOnInstance + + :param available_add_on_sid: The SID of the AvaliableAddOn to install. + :param accept_terms_of_service: Whether the Terms of Service were accepted. + :param configuration: The JSON object that represents the configuration of the new Add-on being installed. + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + + :returns: The created InstalledAddOnInstance + """ + + data = values.of( + { + "AvailableAddOnSid": available_add_on_sid, + "AcceptTermsOfService": serialize.boolean_to_string( + accept_terms_of_service + ), + "Configuration": serialize.object(configuration), + "UniqueName": unique_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InstalledAddOnInstance]: + """ + Streams InstalledAddOnInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InstalledAddOnInstance]: + """ + Asynchronously streams InstalledAddOnInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InstalledAddOnInstance]: + """ + Lists InstalledAddOnInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InstalledAddOnInstance]: + """ + Asynchronously lists InstalledAddOnInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InstalledAddOnPage: + """ + Retrieve a single page of InstalledAddOnInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InstalledAddOnInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InstalledAddOnPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InstalledAddOnPage: + """ + Asynchronously retrieve a single page of InstalledAddOnInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InstalledAddOnInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InstalledAddOnPage(self._version, response) + + def get_page(self, target_url: str) -> InstalledAddOnPage: + """ + Retrieve a specific page of InstalledAddOnInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InstalledAddOnInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InstalledAddOnPage(self._version, response) + + async def get_page_async(self, target_url: str) -> InstalledAddOnPage: + """ + Asynchronously retrieve a specific page of InstalledAddOnInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InstalledAddOnInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InstalledAddOnPage(self._version, response) + + def get(self, sid: str) -> InstalledAddOnContext: + """ + Constructs a InstalledAddOnContext + + :param sid: The SID of the InstalledAddOn resource to update. + """ + return InstalledAddOnContext(self._version, sid=sid) + + def __call__(self, sid: str) -> InstalledAddOnContext: + """ + Constructs a InstalledAddOnContext + + :param sid: The SID of the InstalledAddOn resource to update. + """ + return InstalledAddOnContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/marketplace/installed_add_on/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/marketplace/installed_add_on/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b02f332b8b33ee8d391a22a0db7cc96b9402936f GIT binary patch literal 28804 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 "InstalledAddOnExtensionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InstalledAddOnExtensionContext for this InstalledAddOnExtensionInstance + """ + if self._context is None: + self._context = InstalledAddOnExtensionContext( + self._version, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "InstalledAddOnExtensionInstance": + """ + Fetch the InstalledAddOnExtensionInstance + + + :returns: The fetched InstalledAddOnExtensionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InstalledAddOnExtensionInstance": + """ + Asynchronous coroutine to fetch the InstalledAddOnExtensionInstance + + + :returns: The fetched InstalledAddOnExtensionInstance + """ + return await self._proxy.fetch_async() + + def update(self, enabled: bool) -> "InstalledAddOnExtensionInstance": + """ + Update the InstalledAddOnExtensionInstance + + :param enabled: Whether the Extension should be invoked. + + :returns: The updated InstalledAddOnExtensionInstance + """ + return self._proxy.update( + enabled=enabled, + ) + + async def update_async(self, enabled: bool) -> "InstalledAddOnExtensionInstance": + """ + Asynchronous coroutine to update the InstalledAddOnExtensionInstance + + :param enabled: Whether the Extension should be invoked. + + :returns: The updated InstalledAddOnExtensionInstance + """ + return await self._proxy.update_async( + enabled=enabled, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class InstalledAddOnExtensionContext(InstanceContext): + + def __init__(self, version: Version, installed_add_on_sid: str, sid: str): + """ + Initialize the InstalledAddOnExtensionContext + + :param version: Version that contains the resource + :param installed_add_on_sid: The SID of the InstalledAddOn resource with the extension to update. + :param sid: The SID of the InstalledAddOn Extension resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "installed_add_on_sid": installed_add_on_sid, + "sid": sid, + } + self._uri = "/InstalledAddOns/{installed_add_on_sid}/Extensions/{sid}".format( + **self._solution + ) + + def fetch(self) -> InstalledAddOnExtensionInstance: + """ + Fetch the InstalledAddOnExtensionInstance + + + :returns: The fetched InstalledAddOnExtensionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InstalledAddOnExtensionInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InstalledAddOnExtensionInstance: + """ + Asynchronous coroutine to fetch the InstalledAddOnExtensionInstance + + + :returns: The fetched InstalledAddOnExtensionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InstalledAddOnExtensionInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=self._solution["sid"], + ) + + def update(self, enabled: bool) -> InstalledAddOnExtensionInstance: + """ + Update the InstalledAddOnExtensionInstance + + :param enabled: Whether the Extension should be invoked. + + :returns: The updated InstalledAddOnExtensionInstance + """ + + data = values.of( + { + "Enabled": serialize.boolean_to_string(enabled), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnExtensionInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=self._solution["sid"], + ) + + async def update_async(self, enabled: bool) -> InstalledAddOnExtensionInstance: + """ + Asynchronous coroutine to update the InstalledAddOnExtensionInstance + + :param enabled: Whether the Extension should be invoked. + + :returns: The updated InstalledAddOnExtensionInstance + """ + + data = values.of( + { + "Enabled": serialize.boolean_to_string(enabled), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return InstalledAddOnExtensionInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class InstalledAddOnExtensionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InstalledAddOnExtensionInstance: + """ + Build an instance of InstalledAddOnExtensionInstance + + :param payload: Payload response from the API + """ + return InstalledAddOnExtensionInstance( + self._version, + payload, + installed_add_on_sid=self._solution["installed_add_on_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InstalledAddOnExtensionList(ListResource): + + def __init__(self, version: Version, installed_add_on_sid: str): + """ + Initialize the InstalledAddOnExtensionList + + :param version: Version that contains the resource + :param installed_add_on_sid: The SID of the InstalledAddOn resource with the extensions to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "installed_add_on_sid": installed_add_on_sid, + } + self._uri = "/InstalledAddOns/{installed_add_on_sid}/Extensions".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InstalledAddOnExtensionInstance]: + """ + Streams InstalledAddOnExtensionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InstalledAddOnExtensionInstance]: + """ + Asynchronously streams InstalledAddOnExtensionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InstalledAddOnExtensionInstance]: + """ + Lists InstalledAddOnExtensionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InstalledAddOnExtensionInstance]: + """ + Asynchronously lists InstalledAddOnExtensionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InstalledAddOnExtensionPage: + """ + Retrieve a single page of InstalledAddOnExtensionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InstalledAddOnExtensionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InstalledAddOnExtensionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InstalledAddOnExtensionPage: + """ + Asynchronously retrieve a single page of InstalledAddOnExtensionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InstalledAddOnExtensionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InstalledAddOnExtensionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> InstalledAddOnExtensionPage: + """ + Retrieve a specific page of InstalledAddOnExtensionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InstalledAddOnExtensionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InstalledAddOnExtensionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> InstalledAddOnExtensionPage: + """ + Asynchronously retrieve a specific page of InstalledAddOnExtensionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InstalledAddOnExtensionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InstalledAddOnExtensionPage(self._version, response, self._solution) + + def get(self, sid: str) -> InstalledAddOnExtensionContext: + """ + Constructs a InstalledAddOnExtensionContext + + :param sid: The SID of the InstalledAddOn Extension resource to update. + """ + return InstalledAddOnExtensionContext( + self._version, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> InstalledAddOnExtensionContext: + """ + Constructs a InstalledAddOnExtensionContext + + :param sid: The SID of the InstalledAddOn Extension resource to update. + """ + return InstalledAddOnExtensionContext( + self._version, + installed_add_on_sid=self._solution["installed_add_on_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/wireless/__init__.py b/venv/Lib/site-packages/twilio/rest/preview/wireless/__init__.py new file mode 100644 index 00000000..85ed4fb5 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/wireless/__init__.py @@ -0,0 +1,59 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Preview + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.preview.wireless.command import CommandList +from twilio.rest.preview.wireless.rate_plan import RatePlanList +from twilio.rest.preview.wireless.sim import SimList + + +class Wireless(Version): + + def __init__(self, domain: Domain): + """ + Initialize the Wireless version of Preview + + :param domain: The Twilio.preview domain + """ + super().__init__(domain, "wireless") + self._commands: Optional[CommandList] = None + self._rate_plans: Optional[RatePlanList] = None + self._sims: Optional[SimList] = None + + @property + def commands(self) -> CommandList: + if self._commands is None: + self._commands = CommandList(self) + return self._commands + + @property + def rate_plans(self) -> RatePlanList: + if self._rate_plans is None: + self._rate_plans = RatePlanList(self) + return self._rate_plans + + @property + def sims(self) -> SimList: + if self._sims is None: + self._sims = SimList(self) + return self._sims + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/wireless/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/wireless/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..764974206f3a70fbc8ef0de821f8d3452a514188 GIT binary patch literal 2826 zcmc&0O>YxNbk<(m8{0{MP)Y)6hC&N&h)q@0N)}3s2tsLTh)CK>maAdoog`bJBOr*H`ciD*TnNU*;vaZ5#S?RfR(&HI>nZ{ElF zes_18z_|6}wfSO-ke_i8jzoa$&H}PV3{oP7V#F+^8Y{&V#N$@Hs+LrVt5%|#EF~qL zuu@g6q)9w!byd@)w8T?ZrkX8f6%r$th@q_zql>E>asQlBcO#w4=)Wq2q$!N)dDEd4 z+u(Fbcjz3iaiP21pfe3*GsfuN4+%(Os3>P2ytE9YIz(_ERAWq@+M=`-{eX-M_&~(x zFoqPlM1V)O%0Tfk#tMi9oA~5Hv@dH(WnVOqgU$UdQ5emI<(CNXz;d`RrFe$_h4SUJ ze@#oKW!iLvP71zg@+F^$cL$$4&uM*O#xg5(+Lya}acY{LpB&Ho+7nl%FBXHVwsc1- z=?kv?m;0ty>bwRz^pYP0Tjb>_^R8QWiiLs=Y`t!d1Tg}(%PaFzWXz^D+ojwvU1>~3 z9#Yk73%X@B^66hN_BqAVuGC%AuIU!wsn5A^U;$`y%&zJtVwnqe71WH&rsKjgdlhnF z($Z_eIyGfh5v};SxT746ST5eI$q-;tjn_=q z)Gf2gWfVfI=%Rnq)SivfC(y_*J9CymDO#Fi2j#~&U zFNB5`LhJJNhUkTpn)}1M$%m|dAUp2>c)m=YW=U7iYU+V@c>U0wfk)cututra>dl_5 z_daN=kF>*Er%t!kTj^bpCSFo-cR|!D(9oiR-pG(&1!Rr1$X5|-4_V&lMqzD{jX)nl zABp_4-W0i~Oypu>AIOO$fP0GQgUP`isCW&ar-ec2@H8ZyK-o6|ER&xyy|+hKM>jLa zo(!J4d+_04zCCtxVyn0B_KnpWo7$i_1Y-ZCX9B|jzU_xez)MBM0Dw-<(tA18?2Dqf zN5l|1Cjm(B9%qg`$Q;?s9Dg!2e0S{O(7WxiN7z;sNwdL-2PO zRjia|cjO!{&!Ah!Lbq-gSBsmO!6*In&cPoBA!Z+A%$lpsO|AcBhd|5EM(i7Fq@m3uNW!Gu^QJ880SSbCZ3#l}<9s~j3nnz5>FELezV8T%TZ z9-kxdAC4@0Ppb=f#f00Cbt8@-LuT0^Vlo&*fO&Dp6#`4d>ke8}g=MYKu?8M@UH`a%LCot{CLjri>v*`L|WYLI4 zBi6uobI2NqSOYuhL}GaT_#Xr&c@6UTiCmADV$85B;D6F>)XmzQ!2aU(`K>WOqdPnw zJOu(%!8_2&@m~OWS>B0&f!#EG2l7in+s_A$MBbtI_A5oBx|G-K(N_vXp8GM7cZ$jG zyN4a^g?7%5?x?_0z*Z-_^-f$-l;2`mMSXUZC`Y%+$!+r1HaWLVKHMf}pC(Tz!|kPK I1SYxHpWryX!2kdN literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview/wireless/__pycache__/command.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/wireless/__pycache__/command.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b52f454d7287d473cc667f5941fa000c3513e3fc GIT binary patch literal 23733 zcmeHPYj7Lab>77rAV`1&Me!wRC7BW-lAvCeTw0Q?hwUnsXhoFj4$TCHfTaWpAedcH z5-HMgY&DTuJC>3*qNWeaZCaC28Zqf3&NMTPfAlr^Q6kI?F*|XinYJ@+r$698o;aHR z=y&ejT`WLQe#LG)^-8>Z@42tD_i^rb&pj7EtgZD4cwYR`)2I3l3&Ourz<8Xxr}z_i zt_cZYP)LXgTS`oegQ7@&d&-u!58Bg?K}Xs-=uEo?U1|5AJM9_tq`iY)md26trE3Oj z(*8j|3p-P_>AJx>=69t6>EK|H`Q54dbi-f+^LtXEbmL$n^LtY((oKU+qF@sq6B53Q zLZU_v-n4Vx23InwAJkg8&ZIUoY8|KnxyhuqFlrFgdbz=*wvIQ1L$Uu71;HobId&?k zO7ToWmd?dg>7+a&E3vGckWP$KbTk^3O8ZvSAs2s``jj~!NC27+9 z2QmflA4zyjG)fc}B!{Y;90G;=qS0RR>4k7|uUT$%l4a&e^>iql7fFeUT?9Wv4plg0 zlq*S82mf!RAM){LI+si(Gg6OqM3K)X<#U`!ZHNEaQ?fKVb|RIGOUHP+qmK+6llC4t z7~#45pE&kNpWf7|n94H6#gZq2@TWL$F` zNXE08<4{t~YMv)Xv&qazETuV*kHDjO4rXaEWE8D-uR1;wH-cfCR+ErbSxLrH$q89= zosFf&WEJHH4vwhV*hpO7pBc%@=d&OM4bo9r&5S8=88koDX9>H1LsnGOh$zRA*hx9g z2RnB?dZ4Jl^CiqnSr`;CH*E=V(C)?TNZ4dY!Y(^ym+T(4wIEf(A$w#O`G#GWgkdq^ zyjVNvm3;|+!hO+kQ!j9^CQ+O4TyzZj@%G|fn{dglVH@V0W3cX$a9$h?3<%*mEwDe6 zMq4I~FPZpv*64l7voS?dlZie{Fcyzz#zwNy3UUI2CN5V})nvMo6z5f0i_}TcG$yH) zj+V}jsa8rNsmO8a!!jbeJQ`PIn$=6_W1}=8%IITCiYL?DXL+}1?$OwIDicd+c6?Uc zp|>BsNMw>|DqgV(!taUKge+0nbJ;N|yomTo@g`&qJ)$saJ8cMAPGWAtOfe}$bwP)G z)zjLH(va5VWSO*fOIowuWzsq?u7|P3io7D3>P()v;iY+LY%ap7ga2z zlfr4USBzLeNQx*qXoM3;6|FZy<3iZquQVa3)mUbw<}1xb&8^Qs&8<%|&2OD;nv2gd z&1=pq%}*1?m`{30pGBG-b0^%OIn}XIS7u5j!W>?U3TX@&C@G?>{)wzUHH|mSGs28g>~C6IbQJOH*LAqHQP0p zUf6WtlHXoPFnio3ykfA2u*?X&Iwr1|}h0cc&uKUU62NyRV%56TB_lI73{PN?| zbqoHDMZ0Z_k7WnHTXx+mLBS=g-&FPupwu>8+4hx(rtf>X^Ll5&ZfiwZFVum)ZRaJ& zi?v0xhoHF>IXk9|#C3s5w33Luh`=?P2#j3rJR8oI1gCJ?6pW=*)hAFwq`~-2+f9gX zdN6^whxx13gcZ>~@t-~#MD*xbMV4YCQc_?10Vmn&FAZlD21ksDZVpcLSi+sL(b$QU zEM1QSqSD3uL}Mq)O&sShP(6J>Bk ziNW!Srixl3oW2if)L(=1tWXFF{@_cyFYlhOk$%#?DIaXSR(rKJ-`ISu|7!n@`*V%q zJ5Kwmx=ROMI9%`u!N!-SE>F#S+LbQkE*mw}pKM{?0nc)y=CnCxkVt=R= z!=rLGeu_12#W(n>wem4^!Z77PpH!x&{-7spQ?{Z`&B+ofTi{nqZKm9h@WhIW%n_FM z)0C7}I4N8(jzhrO~(8$wGI1?Myz3FM`Hxj zmo()A_~?nYs!hpr3?hNL7S4Z=I7XW`wO)Jb>Qjp=x^pYK7gj_T1Ce=8WIhnNtNM}Z zxz!uR8)Ap!73W5=Y|zo_LQP%dqADStwhA&t(37xTBq62?98TkIHEd`M#{+`lyQ!Bs zh3)uh6MdD+Dd9~FVaMH)WI3W_&L*+XjY-2wQXWa9#wA6@3Z`PQi_uD2Z6qI##ZOW9 zEtiFlWl6d#N=uqz8<;9S3db06pMkI)!iP_ZQ?`Uqt#KyBNmCYoO}r+G!V7HarPMtUGjWo5Cal4R!jD=9zI|YB@7(96cfP#m`ktA!GoM~;>&>+e{Gv!p z%yVnjiWA+t_?|bS?~Ef)>R=#JQLS`gYR{}gbDYj3N0_A4oB$SSRe1otaI6MCIOkKQ)rSZhbTv_ z4%gyxDiw`lISGTxMB~G(YZYRMIka}G2{>Mo*D=FW;WacG{W`JJ=T7e$hYZ#KxR9*iLM)-MZfezXyH?=-8YOdfCR? zhq>!vy}-dN;n+BhZ{smV&3RBNHlFsS8&7N`Y;3b&iX9sSQMD~a!jUBLWPFxUAKqUV zzf9W=GiKZ#c20cWl=}yP^|?aCD&lpZVG%8(F(sCkbi~jn>8cOpiDemZi2*IK5+IqF z!o;khk7qSi3z+K?111xJUVW~qy%!J-2_b}?$~rL31{|AhY?^6~=$MiOkRgatYFa+T z=*v*#vwW1TM`&WDUatNbCVbBzQhgW>!S}i{_zqk`P}d4^SMh9t^9B38Hb)?$5krXUzf;b74?Jnf1-ig&#j06VEX>)Im ztok!4e$!#7O{Z+x8k1gicud+*ir+|6dMBI=V!MozFtXjscEsNe#zse>Gh}N|?`aiV zIoIBJTprD8_QxJM2GQ z^R(P=)R_kaE0lz{yNW;q3{pEYS zx&7tZ>$Qu`TXM}?@}cJG#LLO+$+?vUyU?<=DA-zjKNoBv-zE1Q>`vCaQ|}kNNPAap zK(){9b?x0QzU~qCZgsrw-2{J`JTS%mMWn^i%&!2lRQkY*@*tcgoc@x5pR${3+C$F6 zaLPOO04NiiDmvD{OH}~gx2Tv$$RT7p(e+N~&DbdeyeW@Swok#aqB90ssw@;7m(5V> z_khcGEe7`I0{egP*h1jYyypI9{qoF~W$l0(}-zPvGMM;pcxic$tBcnppe zIT5U5s3J`fv`PRu6&$tBhi+D#QF@A7;aHC=WV`H;o%#`l4M+&b77PgyO0p#!goMVOVV72;cPE{N za6KMdAWiIoa;XxwK+-~BT_CXtS<@kw9&CzqD(&kh(k7ZAnF~Og^$>|G_!;zIOA)bTV0=Gxq|lf0<0BL2 zQwv0_F@K3HDrLs9P6`ar#GUAPr-4sZ z?@^va+9ez6LsWpVYBCm$3HN=(6bb0FZAfq@W2isutsKB4&-ef)zIgM{){9LhUTGHv zNqwZ8G@S3iqtb4G2Cd7v^TvUh&`f-$`IY{HfZ!YkEMA2moayy<$j|C$1(XfZdXzy= z@z=p?C1@YEF~DvEV8?K+25CN8>aYu^d$e8f$ZpxIPakJl$W<0{mxVlKA#Yj8C;Ntj ziJFVf!J3cuo2u9Lp?|3#U+S-3_Xnrq6txy#aIb!Ijit080 zDo}^-E!FNdTbjz|&Ps&pOxajp7V^nWka5juiIu+!-&~!CkFX_L&=SpwR;(!0GLA$W zU{{MJ+>UT-Vik*TL;Pxl+b!WW2(Ln3*qS6H_*XN9)f(WcwI*;Q`xd5MiCeK4;WdWY z2pCrAte`xoG?swQN{E{I$89)wOPZLfy0(ex{XnWFv-}CKsZ#0>+byaj+G&EoKpZ<~ zX4*;mta8nf0gs3!Q*HDQNT!lJe|w4A=yv0pl0Jye#Wfc{s3)V7v=)G#I&}hP&{16{ z;x`F6bZ2MiT1|2!o*GLqGaIJHjeAgz@%Z3jt^YspSP^q|ybN`YebO=MoODgP6XGA3 zrWsS7d#fW7wuC)t8njG#p*Mb*SIN~F z;p0lmoc4!dp{4l_@=-XDOx*Re-SbGc=h*nDe0Qx?-*>*}+_`f-bc)l1FO^5g1T#@m z{=g9KiGgFY4&}4xUxg0kH3w`#V#?F-hFwhYS5g9LF8*PPsRx>^;Zu}Zn2@$s871d) z$c?AbkYCS;Wq=G+Pb3M7lhfvohCz{_}TfMBlGQ_UT8Ra$$fj>BTy^W zS^78aCuZE!gdiUmu^zzV;*(PN9uZIGMVpY8%1I>Hj`}`A0K{G=c!(dXT$RSmEY33@Qr{J@2 z`j^gAKW{?)px&IV3XM#)>dgBs#F*+3%gp0Ni0Cc#50QkcZ9j}DXlQ)5=9;%wPQjLK zOLV^F^RP_A+qKUpzTPA5^Eh6Qw87tBvU<~;sbo5t)x4w7y1*uOLXMLb#dv5Uv$gvh z@Vpn>4O+jAm2b+8wUiVu6^}X5vCgxj8rw}h)szQ0DpFIh+9A@U2ROk_`HlL32pzG1 z0^8MOJ%_l ztgZNp3e%o)7P}>t%&$;Fi7f=uayp}oml)Aa;^`ZV1I?@=Er%cwRSiX;HP9j@`{&Bi z$_=3{vFvO6q~oJ#If(^KE47ia^a&85|1|moHaq-VBYN|9hRueeGE2|NF`Vkca6!h= zEo|{+9PjE`C44=se@?+Zj#U?tqyzGB42?-Q2SzfSY8Gp1SoLYpC-qlji<=VBHz@Mw zV0)kKmd>4$N7yX@RnAJV(M(BWs%(~9V%6}Gp5PiI z4#vP{3}TQ>$lX#hB1a_H4tBB}-O`rLn>UB6VL{z&k=ZBW+?_Socv6Ncd~B4M;x+1n z-uznSOPJoXPNjsWR)N6Hb}35vA{-p9lcHOzp%06)f>g~xtw`p?G>K=u9Gg`uhDu=7 zXfB>r`5jPHFC3%exPg!I0!ZbMjF-NdmIOkLP(eQ+;DmP7)m4l2n{xG=X6}cHZ2hiF zu6!UwKn>D79}JP(v?kxwKK)d#DO{)#f-O)Z6HbFMBDXMH46M%u)Uz|3=)q#_|38;44GcKE#taF7AV4)rtZ6Ruj{fP4PFyn=WL+a}%FN z4-l^{Hf$A`v|)KK@-ao)LQ~uxA4w(8$R>24>jQukW$04Ix~ky(I>Fa)!oSkfY~_5~ zKr*;8kjTvXg4AqMPWpUZyz^%*!)#Rj-+NZk)tkDKr$b5tB!4bN&Eo)*{tYqtMHOLZaXQ&ZQG0(2fwlb z6@dGy?FB#ZT_gUyJCJ6|Jpfl^zHtjF^^o{=Tc6|496Ma!5V!ko z+IP6V<>+&KM|?>9OL2$muf;yccRde@Ita~X&d4KL4FjZHOI7`3^Jl2Sis3%wlg(e9 z^UQxnFPiK0QCzl8LIWqopcNW931ufW9BH@oWz0CC!+?w~Ps+z=M9{TYy3s~I)$?oWpQd&co4M15DSec@G$hUCnDYgHlgPJQN-PXI0N+ zhLEJ}FxAESOl9YuOO9!n&W)d?o}`TWS!y+X-8ABr>*RcioG*~`G#t%i*u+*p)*-E4 zIj$N7|34&YL?=Gh<5Yf@3U}3p{Hl%l=JomZj+5bg_83782rl$807|Hmmc~mS11!Z>m_NT z{4t#BLV*&N0~OX%Ob7Kgi3S2k6(_wPSUR+r&pN%{snrtSd#%BLC_em~=>Qrqy}#+PYnV~;`SPy(&@ST6n_ zjJ$q*=qazF*OVDJTCG0lbe%hsoYckT!>!I3So$u{xZzkf=y==~8hQs%0^jL12(7ER z;Ooh?^enb)&$Vn{Y}uD<+4qC{|8dho%kjm~@hSt5Ak%M%x?X+z-jMj$;@*14ciZ4& z7jvu2Iht11jTz*Sbqphx9^5xJrPcs`5n*DVDT!c52yM$)oGdVmZH#_1&obSs-4Cbx zVY4=Vm7dsupY5sXMt#{ezWYF!Fn;RJXusWHvsk)rwHo(5)7R5;p&tkCpZDC)0iyLw zXf`s*{(in#nL}>n+vI!)j+Hz5^#!sVjYiAmia~t@OelXrIlJJLUC2b3vqZeTryF3@ z2=C?w7;7x!2H0WZe0Uy(!i z*s5QYr2CNyIe&*g^Debfxo&-nVffZv7UlQ-eoIRu-AdCOFDT8dz7kzJtCFZ zqfm)G3R&2r;5)Qlxc653YGjiR zr@L~E8w#~V!Y@@>CVPNL!LqSTEYSR4Q4Epqv-fV~kI7dIiazJ|8`}y3UNa9C=~ZYZ zzsg8+7j%-#x#J2*cuhY;H-mT3&EOr=`x)s*ze&PnVOSIxmxW2{_lMh*BeVq2T8@3d z_$U;q{8x;y6bO91ag&eMEWRYsYNXZhEkoo)3_mSdLvd`CYqyXi#wBm#XDgLj%DJj) z66|Z(Z{R3(l%~a+CPlh^GoI`mw2(F4_)R`qaJ8T{hPEe6X~-8@wkWbCldXDBB0XEX z+0BQ$o?ZO6p7toOBLa|JP$_M}E{Y<4b4hf()h>vue<~bW6b|KtLq8R|-Vh#mL+E=$ z*!qUB@eN_^9oMHtv0t2T+Hgl;zB{LE`$X}ucqMvAV4gdlvIWJRSMIwb;B{w1zYBrx Kw*-1KM*bJ?wdp

    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

    `8y^_lexDwxdERj+#R3%k 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/service/phone_number.py b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/phone_number.py new file mode 100644 index 00000000..3c8517ce --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/phone_number.py @@ -0,0 +1,662 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Proxy + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class PhoneNumberInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the PhoneNumber resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the PhoneNumber resource. + :ivar service_sid: The SID of the PhoneNumber resource's parent [Service](https://www.twilio.com/docs/proxy/api/service) resource. + :ivar date_created: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time in GMT when the resource was created. + :ivar date_updated: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time in GMT when the resource was last updated. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar iso_country: The ISO Country Code for the phone number. + :ivar capabilities: + :ivar url: The absolute URL of the PhoneNumber resource. + :ivar is_reserved: Whether the phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + :ivar in_use: The number of open session assigned to the number. See the [How many Phone Numbers do I need?](https://www.twilio.com/docs/proxy/phone-numbers-needed) guide for more information. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.phone_number: Optional[str] = payload.get("phone_number") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.iso_country: Optional[str] = payload.get("iso_country") + self.capabilities: Optional[str] = payload.get("capabilities") + self.url: Optional[str] = payload.get("url") + self.is_reserved: Optional[bool] = payload.get("is_reserved") + self.in_use: Optional[int] = deserialize.integer(payload.get("in_use")) + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[PhoneNumberContext] = None + + @property + def _proxy(self) -> "PhoneNumberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PhoneNumberContext for this PhoneNumberInstance + """ + if self._context is None: + self._context = PhoneNumberContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the PhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "PhoneNumberInstance": + """ + Fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "PhoneNumberInstance": + """ + Asynchronous coroutine to fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + return await self._proxy.fetch_async() + + def update( + self, is_reserved: Union[bool, object] = values.unset + ) -> "PhoneNumberInstance": + """ + Update the PhoneNumberInstance + + :param is_reserved: Whether the phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + + :returns: The updated PhoneNumberInstance + """ + return self._proxy.update( + is_reserved=is_reserved, + ) + + async def update_async( + self, is_reserved: Union[bool, object] = values.unset + ) -> "PhoneNumberInstance": + """ + Asynchronous coroutine to update the PhoneNumberInstance + + :param is_reserved: Whether the phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + + :returns: The updated PhoneNumberInstance + """ + return await self._proxy.update_async( + is_reserved=is_reserved, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PhoneNumberContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the PhoneNumberContext + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) of the PhoneNumber resource to update. + :param sid: The Twilio-provided string that uniquely identifies the PhoneNumber resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/PhoneNumbers/{sid}".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the PhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PhoneNumberInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> PhoneNumberInstance: + """ + Fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return PhoneNumberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> PhoneNumberInstance: + """ + Asynchronous coroutine to fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return PhoneNumberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, is_reserved: Union[bool, object] = values.unset + ) -> PhoneNumberInstance: + """ + Update the PhoneNumberInstance + + :param is_reserved: Whether the phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + + :returns: The updated PhoneNumberInstance + """ + + data = values.of( + { + "IsReserved": serialize.boolean_to_string(is_reserved), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, is_reserved: Union[bool, object] = values.unset + ) -> PhoneNumberInstance: + """ + Asynchronous coroutine to update the PhoneNumberInstance + + :param is_reserved: Whether the phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + + :returns: The updated PhoneNumberInstance + """ + + data = values.of( + { + "IsReserved": serialize.boolean_to_string(is_reserved), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PhoneNumberPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> PhoneNumberInstance: + """ + Build an instance of PhoneNumberInstance + + :param payload: Payload response from the API + """ + return PhoneNumberInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class PhoneNumberList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the PhoneNumberList + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) of the PhoneNumber resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/PhoneNumbers".format(**self._solution) + + def create( + self, + sid: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + is_reserved: Union[bool, object] = values.unset, + ) -> PhoneNumberInstance: + """ + Create the PhoneNumberInstance + + :param sid: The SID of a Twilio [IncomingPhoneNumber](https://www.twilio.com/docs/phone-numbers/api/incomingphonenumber-resource) resource that represents the Twilio Number you would like to assign to your Proxy Service. + :param phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + :param is_reserved: Whether the new phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + + :returns: The created PhoneNumberInstance + """ + + data = values.of( + { + "Sid": sid, + "PhoneNumber": phone_number, + "IsReserved": serialize.boolean_to_string(is_reserved), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + sid: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + is_reserved: Union[bool, object] = values.unset, + ) -> PhoneNumberInstance: + """ + Asynchronously create the PhoneNumberInstance + + :param sid: The SID of a Twilio [IncomingPhoneNumber](https://www.twilio.com/docs/phone-numbers/api/incomingphonenumber-resource) resource that represents the Twilio Number you would like to assign to your Proxy Service. + :param phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + :param is_reserved: Whether the new phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + + :returns: The created PhoneNumberInstance + """ + + data = values.of( + { + "Sid": sid, + "PhoneNumber": phone_number, + "IsReserved": serialize.boolean_to_string(is_reserved), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[PhoneNumberInstance]: + """ + Streams PhoneNumberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[PhoneNumberInstance]: + """ + Asynchronously streams PhoneNumberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PhoneNumberInstance]: + """ + Lists PhoneNumberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PhoneNumberInstance]: + """ + Asynchronously lists PhoneNumberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PhoneNumberPage: + """ + Retrieve a single page of PhoneNumberInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PhoneNumberInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PhoneNumberPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PhoneNumberPage: + """ + Asynchronously retrieve a single page of PhoneNumberInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PhoneNumberInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PhoneNumberPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> PhoneNumberPage: + """ + Retrieve a specific page of PhoneNumberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PhoneNumberInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return PhoneNumberPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> PhoneNumberPage: + """ + Asynchronously retrieve a specific page of PhoneNumberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PhoneNumberInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return PhoneNumberPage(self._version, response, self._solution) + + def get(self, sid: str) -> PhoneNumberContext: + """ + Constructs a PhoneNumberContext + + :param sid: The Twilio-provided string that uniquely identifies the PhoneNumber resource to update. + """ + return PhoneNumberContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> PhoneNumberContext: + """ + Constructs a PhoneNumberContext + + :param sid: The Twilio-provided string that uniquely identifies the PhoneNumber resource to update. + """ + return PhoneNumberContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/__init__.py b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/__init__.py new file mode 100644 index 00000000..839db075 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/__init__.py @@ -0,0 +1,784 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Proxy + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.proxy.v1.service.session.interaction import InteractionList +from twilio.rest.proxy.v1.service.session.participant import ParticipantList + + +class SessionInstance(InstanceResource): + + class Mode(object): + MESSAGE_ONLY = "message-only" + VOICE_ONLY = "voice-only" + VOICE_AND_MESSAGE = "voice-and-message" + + class Status(object): + OPEN = "open" + IN_PROGRESS = "in-progress" + CLOSED = "closed" + FAILED = "failed" + UNKNOWN = "unknown" + + """ + :ivar sid: The unique string that we created to identify the Session resource. + :ivar service_sid: The SID of the [Service](https://www.twilio.com/docs/proxy/api/service) the session is associated with. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Session resource. + :ivar date_started: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session started. + :ivar date_ended: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session ended. + :ivar date_last_interaction: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session last had an interaction. + :ivar date_expiry: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + :ivar unique_name: An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. Supports UTF-8 characters. **This value should not have PII.** + :ivar status: + :ivar closed_reason: The reason the Session ended. + :ivar ttl: The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + :ivar mode: + :ivar date_created: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time in GMT when the resource was created. + :ivar date_updated: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time in GMT when the resource was last updated. + :ivar url: The absolute URL of the Session resource. + :ivar links: The URLs of resources related to the Session. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_started: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_started") + ) + self.date_ended: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_ended") + ) + self.date_last_interaction: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_last_interaction") + ) + self.date_expiry: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_expiry") + ) + self.unique_name: Optional[str] = payload.get("unique_name") + self.status: Optional["SessionInstance.Status"] = payload.get("status") + self.closed_reason: Optional[str] = payload.get("closed_reason") + self.ttl: Optional[int] = deserialize.integer(payload.get("ttl")) + self.mode: Optional["SessionInstance.Mode"] = payload.get("mode") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[SessionContext] = None + + @property + def _proxy(self) -> "SessionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SessionContext for this SessionInstance + """ + if self._context is None: + self._context = SessionContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the SessionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SessionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "SessionInstance": + """ + Fetch the SessionInstance + + + :returns: The fetched SessionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SessionInstance": + """ + Asynchronous coroutine to fetch the SessionInstance + + + :returns: The fetched SessionInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + date_expiry: Union[datetime, object] = values.unset, + ttl: Union[int, object] = values.unset, + status: Union["SessionInstance.Status", object] = values.unset, + ) -> "SessionInstance": + """ + Update the SessionInstance + + :param date_expiry: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + :param ttl: The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + :param status: + + :returns: The updated SessionInstance + """ + return self._proxy.update( + date_expiry=date_expiry, + ttl=ttl, + status=status, + ) + + async def update_async( + self, + date_expiry: Union[datetime, object] = values.unset, + ttl: Union[int, object] = values.unset, + status: Union["SessionInstance.Status", object] = values.unset, + ) -> "SessionInstance": + """ + Asynchronous coroutine to update the SessionInstance + + :param date_expiry: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + :param ttl: The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + :param status: + + :returns: The updated SessionInstance + """ + return await self._proxy.update_async( + date_expiry=date_expiry, + ttl=ttl, + status=status, + ) + + @property + def interactions(self) -> InteractionList: + """ + Access the interactions + """ + return self._proxy.interactions + + @property + def participants(self) -> ParticipantList: + """ + Access the participants + """ + return self._proxy.participants + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SessionContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the SessionContext + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) of the resource to update. + :param sid: The Twilio-provided string that uniquely identifies the Session resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Sessions/{sid}".format(**self._solution) + + self._interactions: Optional[InteractionList] = None + self._participants: Optional[ParticipantList] = None + + def delete(self) -> bool: + """ + Deletes the SessionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SessionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> SessionInstance: + """ + Fetch the SessionInstance + + + :returns: The fetched SessionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SessionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> SessionInstance: + """ + Asynchronous coroutine to fetch the SessionInstance + + + :returns: The fetched SessionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SessionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + date_expiry: Union[datetime, object] = values.unset, + ttl: Union[int, object] = values.unset, + status: Union["SessionInstance.Status", object] = values.unset, + ) -> SessionInstance: + """ + Update the SessionInstance + + :param date_expiry: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + :param ttl: The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + :param status: + + :returns: The updated SessionInstance + """ + + data = values.of( + { + "DateExpiry": serialize.iso8601_datetime(date_expiry), + "Ttl": ttl, + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SessionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + date_expiry: Union[datetime, object] = values.unset, + ttl: Union[int, object] = values.unset, + status: Union["SessionInstance.Status", object] = values.unset, + ) -> SessionInstance: + """ + Asynchronous coroutine to update the SessionInstance + + :param date_expiry: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + :param ttl: The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + :param status: + + :returns: The updated SessionInstance + """ + + data = values.of( + { + "DateExpiry": serialize.iso8601_datetime(date_expiry), + "Ttl": ttl, + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SessionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + @property + def interactions(self) -> InteractionList: + """ + Access the interactions + """ + if self._interactions is None: + self._interactions = InteractionList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._interactions + + @property + def participants(self) -> ParticipantList: + """ + Access the participants + """ + if self._participants is None: + self._participants = ParticipantList( + self._version, + self._solution["service_sid"], + self._solution["sid"], + ) + return self._participants + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SessionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SessionInstance: + """ + Build an instance of SessionInstance + + :param payload: Payload response from the API + """ + return SessionInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SessionList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the SessionList + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) of the resource to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/Sessions".format(**self._solution) + + def create( + self, + unique_name: Union[str, object] = values.unset, + date_expiry: Union[datetime, object] = values.unset, + ttl: Union[int, object] = values.unset, + mode: Union["SessionInstance.Mode", object] = values.unset, + status: Union["SessionInstance.Status", object] = values.unset, + participants: Union[List[object], object] = values.unset, + ) -> SessionInstance: + """ + Create the SessionInstance + + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + :param date_expiry: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + :param ttl: The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + :param mode: + :param status: + :param participants: The Participant objects to include in the new session. + + :returns: The created SessionInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "DateExpiry": serialize.iso8601_datetime(date_expiry), + "Ttl": ttl, + "Mode": mode, + "Status": status, + "Participants": serialize.map( + participants, lambda e: serialize.object(e) + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SessionInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async( + self, + unique_name: Union[str, object] = values.unset, + date_expiry: Union[datetime, object] = values.unset, + ttl: Union[int, object] = values.unset, + mode: Union["SessionInstance.Mode", object] = values.unset, + status: Union["SessionInstance.Status", object] = values.unset, + participants: Union[List[object], object] = values.unset, + ) -> SessionInstance: + """ + Asynchronously create the SessionInstance + + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + :param date_expiry: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + :param ttl: The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + :param mode: + :param status: + :param participants: The Participant objects to include in the new session. + + :returns: The created SessionInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "DateExpiry": serialize.iso8601_datetime(date_expiry), + "Ttl": ttl, + "Mode": mode, + "Status": status, + "Participants": serialize.map( + participants, lambda e: serialize.object(e) + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SessionInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SessionInstance]: + """ + Streams SessionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SessionInstance]: + """ + Asynchronously streams SessionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SessionInstance]: + """ + Lists SessionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SessionInstance]: + """ + Asynchronously lists SessionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SessionPage: + """ + Retrieve a single page of SessionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SessionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SessionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SessionPage: + """ + Asynchronously retrieve a single page of SessionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SessionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SessionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> SessionPage: + """ + Retrieve a specific page of SessionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SessionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SessionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> SessionPage: + """ + Asynchronously retrieve a specific page of SessionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SessionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SessionPage(self._version, response, self._solution) + + def get(self, sid: str) -> SessionContext: + """ + Constructs a SessionContext + + :param sid: The Twilio-provided string that uniquely identifies the Session resource to update. + """ + return SessionContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> SessionContext: + """ + Constructs a SessionContext + + :param sid: The Twilio-provided string that uniquely identifies the Session resource to update. + """ + return SessionContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35d08ca469c7b51f809c68c3dd29bbe1e106fba8 GIT binary patch literal 32054 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/__pycache__/interaction.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/__pycache__/interaction.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5b3db412a87716ad19e846de7c63d4725136e92 GIT binary patch literal 23585 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 G5c&V "InteractionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: InteractionContext for this InteractionInstance + """ + if self._context is None: + self._context = InteractionContext( + self._version, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the InteractionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InteractionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "InteractionInstance": + """ + Fetch the InteractionInstance + + + :returns: The fetched InteractionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "InteractionInstance": + """ + Asynchronous coroutine to fetch the InteractionInstance + + + :returns: The fetched InteractionInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InteractionContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, session_sid: str, sid: str): + """ + Initialize the InteractionContext + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) of the resource to fetch. + :param session_sid: The SID of the parent [Session](https://www.twilio.com/docs/proxy/api/session) of the resource to fetch. + :param sid: The Twilio-provided string that uniquely identifies the Interaction resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "session_sid": session_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Sessions/{session_sid}/Interactions/{sid}".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the InteractionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the InteractionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> InteractionInstance: + """ + Fetch the InteractionInstance + + + :returns: The fetched InteractionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return InteractionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> InteractionInstance: + """ + Asynchronous coroutine to fetch the InteractionInstance + + + :returns: The fetched InteractionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return InteractionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class InteractionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> InteractionInstance: + """ + Build an instance of InteractionInstance + + :param payload: Payload response from the API + """ + return InteractionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class InteractionList(ListResource): + + def __init__(self, version: Version, service_sid: str, session_sid: str): + """ + Initialize the InteractionList + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) to read the resources from. + :param session_sid: The SID of the parent [Session](https://www.twilio.com/docs/proxy/api/session) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "session_sid": session_sid, + } + self._uri = ( + "/Services/{service_sid}/Sessions/{session_sid}/Interactions".format( + **self._solution + ) + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[InteractionInstance]: + """ + Streams InteractionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[InteractionInstance]: + """ + Asynchronously streams InteractionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InteractionInstance]: + """ + Lists InteractionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[InteractionInstance]: + """ + Asynchronously lists InteractionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InteractionPage: + """ + Retrieve a single page of InteractionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InteractionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InteractionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> InteractionPage: + """ + Asynchronously retrieve a single page of InteractionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of InteractionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return InteractionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> InteractionPage: + """ + Retrieve a specific page of InteractionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InteractionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return InteractionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> InteractionPage: + """ + Asynchronously retrieve a specific page of InteractionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of InteractionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return InteractionPage(self._version, response, self._solution) + + def get(self, sid: str) -> InteractionContext: + """ + Constructs a InteractionContext + + :param sid: The Twilio-provided string that uniquely identifies the Interaction resource to fetch. + """ + return InteractionContext( + self._version, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> InteractionContext: + """ + Constructs a InteractionContext + + :param sid: The Twilio-provided string that uniquely identifies the Interaction resource to fetch. + """ + return InteractionContext( + self._version, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/__init__.py b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/__init__.py new file mode 100644 index 00000000..7ad20fcf --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/__init__.py @@ -0,0 +1,634 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Proxy + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.proxy.v1.service.session.participant.message_interaction import ( + MessageInteractionList, +) + + +class ParticipantInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Participant resource. + :ivar session_sid: The SID of the parent [Session](https://www.twilio.com/docs/proxy/api/session) resource. + :ivar service_sid: The SID of the resource's parent [Service](https://www.twilio.com/docs/proxy/api/service) resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Participant resource. + :ivar friendly_name: The string that you assigned to describe the participant. This value must be 255 characters or fewer. Supports UTF-8 characters. **This value should not have PII.** + :ivar identifier: The phone number or channel identifier of the Participant. This value must be 191 characters or fewer. Supports UTF-8 characters. + :ivar proxy_identifier: The phone number or short code (masked number) of the participant's partner. The participant will call or message the partner participant at this number. + :ivar proxy_identifier_sid: The SID of the Proxy Identifier assigned to the Participant. + :ivar date_deleted: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Participant was removed from the session. + :ivar date_created: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time in GMT when the resource was created. + :ivar date_updated: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time in GMT when the resource was last updated. + :ivar url: The absolute URL of the Participant resource. + :ivar links: The URLs to resources related the participant. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + session_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.session_sid: Optional[str] = payload.get("session_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.identifier: Optional[str] = payload.get("identifier") + self.proxy_identifier: Optional[str] = payload.get("proxy_identifier") + self.proxy_identifier_sid: Optional[str] = payload.get("proxy_identifier_sid") + self.date_deleted: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_deleted") + ) + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "service_sid": service_sid, + "session_sid": session_sid, + "sid": sid or self.sid, + } + self._context: Optional[ParticipantContext] = None + + @property + def _proxy(self) -> "ParticipantContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ParticipantContext for this ParticipantInstance + """ + if self._context is None: + self._context = ParticipantContext( + self._version, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ParticipantInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ParticipantInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ParticipantInstance": + """ + Fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ParticipantInstance": + """ + Asynchronous coroutine to fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + return await self._proxy.fetch_async() + + @property + def message_interactions(self) -> MessageInteractionList: + """ + Access the message_interactions + """ + return self._proxy.message_interactions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ParticipantContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, session_sid: str, sid: str): + """ + Initialize the ParticipantContext + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) of the resource to fetch. + :param session_sid: The SID of the parent [Session](https://www.twilio.com/docs/proxy/api/session) of the resource to fetch. + :param sid: The Twilio-provided string that uniquely identifies the Participant resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "session_sid": session_sid, + "sid": sid, + } + self._uri = ( + "/Services/{service_sid}/Sessions/{session_sid}/Participants/{sid}".format( + **self._solution + ) + ) + + self._message_interactions: Optional[MessageInteractionList] = None + + def delete(self) -> bool: + """ + Deletes the ParticipantInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ParticipantInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ParticipantInstance: + """ + Fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ParticipantInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ParticipantInstance: + """ + Asynchronous coroutine to fetch the ParticipantInstance + + + :returns: The fetched ParticipantInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + sid=self._solution["sid"], + ) + + @property + def message_interactions(self) -> MessageInteractionList: + """ + Access the message_interactions + """ + if self._message_interactions is None: + self._message_interactions = MessageInteractionList( + self._version, + self._solution["service_sid"], + self._solution["session_sid"], + self._solution["sid"], + ) + return self._message_interactions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ParticipantPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ParticipantInstance: + """ + Build an instance of ParticipantInstance + + :param payload: Payload response from the API + """ + return ParticipantInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ParticipantList(ListResource): + + def __init__(self, version: Version, service_sid: str, session_sid: str): + """ + Initialize the ParticipantList + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) of the resources to read. + :param session_sid: The SID of the parent [Session](https://www.twilio.com/docs/proxy/api/session) of the resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "session_sid": session_sid, + } + self._uri = ( + "/Services/{service_sid}/Sessions/{session_sid}/Participants".format( + **self._solution + ) + ) + + def create( + self, + identifier: str, + friendly_name: Union[str, object] = values.unset, + proxy_identifier: Union[str, object] = values.unset, + proxy_identifier_sid: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Create the ParticipantInstance + + :param identifier: The phone number of the Participant. + :param friendly_name: The string that you assigned to describe the participant. This value must be 255 characters or fewer. **This value should not have PII.** + :param proxy_identifier: The proxy phone number to use for the Participant. If not specified, Proxy will select a number from the pool. + :param proxy_identifier_sid: The SID of the Proxy Identifier to assign to the Participant. + + :returns: The created ParticipantInstance + """ + + data = values.of( + { + "Identifier": identifier, + "FriendlyName": friendly_name, + "ProxyIdentifier": proxy_identifier, + "ProxyIdentifierSid": proxy_identifier_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + ) + + async def create_async( + self, + identifier: str, + friendly_name: Union[str, object] = values.unset, + proxy_identifier: Union[str, object] = values.unset, + proxy_identifier_sid: Union[str, object] = values.unset, + ) -> ParticipantInstance: + """ + Asynchronously create the ParticipantInstance + + :param identifier: The phone number of the Participant. + :param friendly_name: The string that you assigned to describe the participant. This value must be 255 characters or fewer. **This value should not have PII.** + :param proxy_identifier: The proxy phone number to use for the Participant. If not specified, Proxy will select a number from the pool. + :param proxy_identifier_sid: The SID of the Proxy Identifier to assign to the Participant. + + :returns: The created ParticipantInstance + """ + + data = values.of( + { + "Identifier": identifier, + "FriendlyName": friendly_name, + "ProxyIdentifier": proxy_identifier, + "ProxyIdentifierSid": proxy_identifier_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ParticipantInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ParticipantInstance]: + """ + Streams ParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ParticipantInstance]: + """ + Asynchronously streams ParticipantInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantInstance]: + """ + Lists ParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ParticipantInstance]: + """ + Asynchronously lists ParticipantInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantPage: + """ + Retrieve a single page of ParticipantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ParticipantPage: + """ + Asynchronously retrieve a single page of ParticipantInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ParticipantInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ParticipantPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ParticipantPage: + """ + Retrieve a specific page of ParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ParticipantPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ParticipantPage: + """ + Asynchronously retrieve a specific page of ParticipantInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ParticipantInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ParticipantPage(self._version, response, self._solution) + + def get(self, sid: str) -> ParticipantContext: + """ + Constructs a ParticipantContext + + :param sid: The Twilio-provided string that uniquely identifies the Participant resource to fetch. + """ + return ParticipantContext( + self._version, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> ParticipantContext: + """ + Constructs a ParticipantContext + + :param sid: The Twilio-provided string that uniquely identifies the Participant resource to fetch. + """ + return ParticipantContext( + self._version, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6654723200d69279d1c8ae1a78e84a784fdee90c GIT binary patch literal 27762 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 T5%6=T`z0rC5}yh5%b@vxT`ii_ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/__pycache__/message_interaction.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/session/participant/__pycache__/message_interaction.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3ff1903c47e691850ee158dbdf715bf2877cb87 GIT binary patch literal 26111 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 b=50-U=lIdP9By|v_c-uy;uDVUjF "MessageInteractionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MessageInteractionContext for this MessageInteractionInstance + """ + if self._context is None: + self._context = MessageInteractionContext( + self._version, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + participant_sid=self._solution["participant_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "MessageInteractionInstance": + """ + Fetch the MessageInteractionInstance + + + :returns: The fetched MessageInteractionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MessageInteractionInstance": + """ + Asynchronous coroutine to fetch the MessageInteractionInstance + + + :returns: The fetched MessageInteractionInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessageInteractionContext(InstanceContext): + + def __init__( + self, + version: Version, + service_sid: str, + session_sid: str, + participant_sid: str, + sid: str, + ): + """ + Initialize the MessageInteractionContext + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) of the resource to fetch. + :param session_sid: The SID of the parent [Session](https://www.twilio.com/docs/proxy/api/session) of the resource to fetch. + :param participant_sid: The SID of the [Participant](https://www.twilio.com/docs/proxy/api/participant) resource. + :param sid: The Twilio-provided string that uniquely identifies the MessageInteraction resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "session_sid": session_sid, + "participant_sid": participant_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/Sessions/{session_sid}/Participants/{participant_sid}/MessageInteractions/{sid}".format( + **self._solution + ) + + def fetch(self) -> MessageInteractionInstance: + """ + Fetch the MessageInteractionInstance + + + :returns: The fetched MessageInteractionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MessageInteractionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + participant_sid=self._solution["participant_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MessageInteractionInstance: + """ + Asynchronous coroutine to fetch the MessageInteractionInstance + + + :returns: The fetched MessageInteractionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MessageInteractionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + participant_sid=self._solution["participant_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessageInteractionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MessageInteractionInstance: + """ + Build an instance of MessageInteractionInstance + + :param payload: Payload response from the API + """ + return MessageInteractionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + participant_sid=self._solution["participant_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MessageInteractionList(ListResource): + + def __init__( + self, version: Version, service_sid: str, session_sid: str, participant_sid: str + ): + """ + Initialize the MessageInteractionList + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) to read the resources from. + :param session_sid: The SID of the parent [Session](https://www.twilio.com/docs/proxy/api/session) to read the resources from. + :param participant_sid: The SID of the [Participant](https://www.twilio.com/docs/proxy/api/participant) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "session_sid": session_sid, + "participant_sid": participant_sid, + } + self._uri = "/Services/{service_sid}/Sessions/{session_sid}/Participants/{participant_sid}/MessageInteractions".format( + **self._solution + ) + + def create( + self, + body: Union[str, object] = values.unset, + media_url: Union[List[str], object] = values.unset, + ) -> MessageInteractionInstance: + """ + Create the MessageInteractionInstance + + :param body: The message to send to the participant + :param media_url: Reserved. Not currently supported. + + :returns: The created MessageInteractionInstance + """ + + data = values.of( + { + "Body": body, + "MediaUrl": serialize.map(media_url, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInteractionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + participant_sid=self._solution["participant_sid"], + ) + + async def create_async( + self, + body: Union[str, object] = values.unset, + media_url: Union[List[str], object] = values.unset, + ) -> MessageInteractionInstance: + """ + Asynchronously create the MessageInteractionInstance + + :param body: The message to send to the participant + :param media_url: Reserved. Not currently supported. + + :returns: The created MessageInteractionInstance + """ + + data = values.of( + { + "Body": body, + "MediaUrl": serialize.map(media_url, lambda e: e), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInteractionInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + participant_sid=self._solution["participant_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MessageInteractionInstance]: + """ + Streams MessageInteractionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MessageInteractionInstance]: + """ + Asynchronously streams MessageInteractionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInteractionInstance]: + """ + Lists MessageInteractionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInteractionInstance]: + """ + Asynchronously lists MessageInteractionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessageInteractionPage: + """ + Retrieve a single page of MessageInteractionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInteractionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessageInteractionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessageInteractionPage: + """ + Asynchronously retrieve a single page of MessageInteractionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInteractionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessageInteractionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MessageInteractionPage: + """ + Retrieve a specific page of MessageInteractionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInteractionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MessageInteractionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MessageInteractionPage: + """ + Asynchronously retrieve a specific page of MessageInteractionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInteractionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MessageInteractionPage(self._version, response, self._solution) + + def get(self, sid: str) -> MessageInteractionContext: + """ + Constructs a MessageInteractionContext + + :param sid: The Twilio-provided string that uniquely identifies the MessageInteraction resource to fetch. + """ + return MessageInteractionContext( + self._version, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + participant_sid=self._solution["participant_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MessageInteractionContext: + """ + Constructs a MessageInteractionContext + + :param sid: The Twilio-provided string that uniquely identifies the MessageInteraction resource to fetch. + """ + return MessageInteractionContext( + self._version, + service_sid=self._solution["service_sid"], + session_sid=self._solution["session_sid"], + participant_sid=self._solution["participant_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/service/short_code.py b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/short_code.py new file mode 100644 index 00000000..df71d4bd --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/short_code.py @@ -0,0 +1,638 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Proxy + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ShortCodeInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the ShortCode resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the ShortCode resource. + :ivar service_sid: The SID of the ShortCode resource's parent [Service](https://www.twilio.com/docs/proxy/api/service) resource. + :ivar date_created: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time in GMT when the resource was created. + :ivar date_updated: The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time in GMT when the resource was last updated. + :ivar short_code: The short code's number. + :ivar iso_country: The ISO Country Code for the short code. + :ivar capabilities: + :ivar url: The absolute URL of the ShortCode resource. + :ivar is_reserved: Whether the short code should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + service_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.service_sid: Optional[str] = payload.get("service_sid") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.short_code: Optional[str] = payload.get("short_code") + self.iso_country: Optional[str] = payload.get("iso_country") + self.capabilities: Optional[str] = payload.get("capabilities") + self.url: Optional[str] = payload.get("url") + self.is_reserved: Optional[bool] = payload.get("is_reserved") + + self._solution = { + "service_sid": service_sid, + "sid": sid or self.sid, + } + self._context: Optional[ShortCodeContext] = None + + @property + def _proxy(self) -> "ShortCodeContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ShortCodeContext for this ShortCodeInstance + """ + if self._context is None: + self._context = ShortCodeContext( + self._version, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ShortCodeInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ShortCodeInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ShortCodeInstance": + """ + Fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ShortCodeInstance": + """ + Asynchronous coroutine to fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + return await self._proxy.fetch_async() + + def update( + self, is_reserved: Union[bool, object] = values.unset + ) -> "ShortCodeInstance": + """ + Update the ShortCodeInstance + + :param is_reserved: Whether the short code should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + + :returns: The updated ShortCodeInstance + """ + return self._proxy.update( + is_reserved=is_reserved, + ) + + async def update_async( + self, is_reserved: Union[bool, object] = values.unset + ) -> "ShortCodeInstance": + """ + Asynchronous coroutine to update the ShortCodeInstance + + :param is_reserved: Whether the short code should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + + :returns: The updated ShortCodeInstance + """ + return await self._proxy.update_async( + is_reserved=is_reserved, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ShortCodeContext(InstanceContext): + + def __init__(self, version: Version, service_sid: str, sid: str): + """ + Initialize the ShortCodeContext + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) of the resource to update. + :param sid: The Twilio-provided string that uniquely identifies the ShortCode resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + "sid": sid, + } + self._uri = "/Services/{service_sid}/ShortCodes/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the ShortCodeInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ShortCodeInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ShortCodeInstance: + """ + Fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ShortCodeInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ShortCodeInstance: + """ + Asynchronous coroutine to fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ShortCodeInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def update( + self, is_reserved: Union[bool, object] = values.unset + ) -> ShortCodeInstance: + """ + Update the ShortCodeInstance + + :param is_reserved: Whether the short code should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + + :returns: The updated ShortCodeInstance + """ + + data = values.of( + { + "IsReserved": serialize.boolean_to_string(is_reserved), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ShortCodeInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, is_reserved: Union[bool, object] = values.unset + ) -> ShortCodeInstance: + """ + Asynchronous coroutine to update the ShortCodeInstance + + :param is_reserved: Whether the short code should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + + :returns: The updated ShortCodeInstance + """ + + data = values.of( + { + "IsReserved": serialize.boolean_to_string(is_reserved), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ShortCodeInstance( + self._version, + payload, + service_sid=self._solution["service_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ShortCodePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ShortCodeInstance: + """ + Build an instance of ShortCodeInstance + + :param payload: Payload response from the API + """ + return ShortCodeInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ShortCodeList(ListResource): + + def __init__(self, version: Version, service_sid: str): + """ + Initialize the ShortCodeList + + :param version: Version that contains the resource + :param service_sid: The SID of the parent [Service](https://www.twilio.com/docs/proxy/api/service) to read the resources from. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "service_sid": service_sid, + } + self._uri = "/Services/{service_sid}/ShortCodes".format(**self._solution) + + def create(self, sid: str) -> ShortCodeInstance: + """ + Create the ShortCodeInstance + + :param sid: The SID of a Twilio [ShortCode](https://www.twilio.com/en-us/messaging/channels/sms/short-codes) resource that represents the short code you would like to assign to your Proxy Service. + + :returns: The created ShortCodeInstance + """ + + data = values.of( + { + "Sid": sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ShortCodeInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + async def create_async(self, sid: str) -> ShortCodeInstance: + """ + Asynchronously create the ShortCodeInstance + + :param sid: The SID of a Twilio [ShortCode](https://www.twilio.com/en-us/messaging/channels/sms/short-codes) resource that represents the short code you would like to assign to your Proxy Service. + + :returns: The created ShortCodeInstance + """ + + data = values.of( + { + "Sid": sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ShortCodeInstance( + self._version, payload, service_sid=self._solution["service_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ShortCodeInstance]: + """ + Streams ShortCodeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ShortCodeInstance]: + """ + Asynchronously streams ShortCodeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ShortCodeInstance]: + """ + Lists ShortCodeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ShortCodeInstance]: + """ + Asynchronously lists ShortCodeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ShortCodePage: + """ + Retrieve a single page of ShortCodeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ShortCodeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ShortCodePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ShortCodePage: + """ + Asynchronously retrieve a single page of ShortCodeInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ShortCodeInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ShortCodePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ShortCodePage: + """ + Retrieve a specific page of ShortCodeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ShortCodeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ShortCodePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ShortCodePage: + """ + Asynchronously retrieve a specific page of ShortCodeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ShortCodeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ShortCodePage(self._version, response, self._solution) + + def get(self, sid: str) -> ShortCodeContext: + """ + Constructs a ShortCodeContext + + :param sid: The Twilio-provided string that uniquely identifies the ShortCode resource to update. + """ + return ShortCodeContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ShortCodeContext: + """ + Constructs a ShortCodeContext + + :param sid: The Twilio-provided string that uniquely identifies the ShortCode resource to update. + """ + return ShortCodeContext( + self._version, service_sid=self._solution["service_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/routes/RoutesBase.py b/venv/Lib/site-packages/twilio/rest/routes/RoutesBase.py new file mode 100644 index 00000000..a47d67f0 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/routes/RoutesBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.routes.v2 import V2 + + +class RoutesBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Routes Domain + + :returns: Domain for Routes + """ + super().__init__(twilio, "https://routes.twilio.com") + self._v2: Optional[V2] = None + + @property + def v2(self) -> V2: + """ + :returns: Versions v2 of Routes + """ + if self._v2 is None: + self._v2 = V2(self) + return self._v2 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/routes/__init__.py b/venv/Lib/site-packages/twilio/rest/routes/__init__.py new file mode 100644 index 00000000..a559ba0d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/routes/__init__.py @@ -0,0 +1,35 @@ +from warnings import warn + +from twilio.rest.routes.RoutesBase import RoutesBase +from twilio.rest.routes.v2.phone_number import PhoneNumberList +from twilio.rest.routes.v2.sip_domain import SipDomainList +from twilio.rest.routes.v2.trunk import TrunkList + + +class Routes(RoutesBase): + @property + def phone_numbers(self) -> PhoneNumberList: + warn( + "phone_numbers is deprecated. Use v2.phone_numbers instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.phone_numbers + + @property + def sip_domains(self) -> SipDomainList: + warn( + "sip_domains is deprecated. Use v2.sip_domains instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.sip_domains + + @property + def trunks(self) -> TrunkList: + warn( + "trunks is deprecated. Use v2.trunks instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.trunks diff --git a/venv/Lib/site-packages/twilio/rest/routes/__pycache__/RoutesBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/routes/__pycache__/RoutesBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..125817f869d638fab3df53519d527fe06e510fa3 GIT binary patch literal 1975 zcmahKO>Y}TboRsRwUacVp=lzjY62<9huXqIsER^G+dzqcq-sNjETdtwJC2vGcg^hB zjV&K?h(sb0wGu+fm17n0OSlxop<1;k#DSY3ji`F!&CJ?Kix9KxH*ene*Q|dU8_OeD zyT5!{|ItL~H*pxOOo|*X1G0xaR6(BR>4DbJE4n6dBQP3f#gw=iWExh*l6WS_HtdS6 zAst;up0$O%EHw`dWv`O!*oB<)gN9HZj|BzU#zzoraV-oO*bz1582)K7KF| z1c?Bmc6s>sF_ltWA+LT?3#{Uvcn6O>O9}`o4k3amj{*qoUR5YajF6JRQX`678ki+L zsjDPYG4Q4=3R!R`j$a5M{8a~LF%~Y=JCLvD!S3?P>Id^_odPG0F%-;c@#uwO;gu#0 zuiRL|*Hr~0Rs_{L=goM&REmJiYgimknU;J zsOj6N27|OUS}|$HGpJS5J#))ENG(*dK(m3C*)l7+ZM30P^0!dIO7b_O7N_x5C#H$T z@A`osx%vsWFu+K7K70qj_u3xfL*|a&L%T50JHBZkKUXd$~0QosEHIW&wDh zu~V?c!Y5`E0294k?v9DPiAs!^Gd3--v2@H`8U%zC zG&T-Y8RGl0AIuhp1eg?zcL6-xLVYuvd2_#ggkbBRM%JmmZe^zLU;PWgc4!O;{fSIw zcK?mP5o|JeX=u5SPqKt~kqc2CKJX@BZD%{-by+PUA+g(v9z6EyeK Pn$c$OPaPrHq?LaF=1BTZ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/routes/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d58e3ce39c2fbb6a8432964bca7da0f417762ceb GIT binary patch literal 1770 zcmcgsOK;Oa5MDpxI3XdW6hV1JQCkj?AQcF4s8A)K5+G2-8_5bXCSHoEU+g-mTA{+B z2RNV}+rNO|pKvK$s4RK{4v0%3aN)$v+G$e=5+_#j?Ci|vncZ)8_I0tCCorDBy>tJI zLdXYPbVnvtIyXUCCN{Apmw1vPNvO-N>?wvKbj4M@jFAz#>S|ur$O=8<>R!&sNkk^+ zh^;LWJ4=<9kOzm6pVO<)4|D!%(26KOV{r9eIs29p@J{A!a4i98|? z)UIc1exPmXUF{mFs`dGa5P30uK@6`rykgUk(WVtqyH>fuX{CL<_8Z3M5w+~vXWYUI zAeu*3bH=4@>Q+^T`;7;u(jZRY--2>D{&Xz2kH^Jrk>FpIQ}-Unb5(xcJUh{Vgp4;X zUbt|*F-7@I6oid-;56y!Y3fIfHuc+$OU~T}cOrT;gsj#y<&9|8ah+hCQ67ymQS@=s zbbKc=&009ec0u&{p@in`N5LD*4}*9@KI(cLrb&IX5W>@ z-jv2x^|1~B$^Wj;N$!NEEpF-Gs@=6X}W#Re?VaiE1j9;(rh;@8wp|^R`^@oy1tYIV8l18j0Y~dr!@Lh^W z`e1&0VZ@2!N`K(il@xTu2l~TAbrPBcD`m*N#neyzR6_eC8v_SEKfD5BLy;tDoeX~> ZC)Ua2I+<7}$G&U(rSenb2Z2dM_yv;Dp~(OM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/routes/v2/__init__.py b/venv/Lib/site-packages/twilio/rest/routes/v2/__init__.py new file mode 100644 index 00000000..56a140ef --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/routes/v2/__init__.py @@ -0,0 +1,59 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Routes + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.routes.v2.phone_number import PhoneNumberList +from twilio.rest.routes.v2.sip_domain import SipDomainList +from twilio.rest.routes.v2.trunk import TrunkList + + +class V2(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V2 version of Routes + + :param domain: The Twilio.routes domain + """ + super().__init__(domain, "v2") + self._phone_numbers: Optional[PhoneNumberList] = None + self._sip_domains: Optional[SipDomainList] = None + self._trunks: Optional[TrunkList] = None + + @property + def phone_numbers(self) -> PhoneNumberList: + if self._phone_numbers is None: + self._phone_numbers = PhoneNumberList(self) + return self._phone_numbers + + @property + def sip_domains(self) -> SipDomainList: + if self._sip_domains is None: + self._sip_domains = SipDomainList(self) + return self._sip_domains + + @property + def trunks(self) -> TrunkList: + if self._trunks is None: + self._trunks = TrunkList(self) + return self._trunks + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/routes/v2/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/routes/v2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e57442682604d3e827e6592b5b89e7565fe9327 GIT binary patch literal 2785 zcmc&0O>Y}Tbawr<{zx3!(o&MrNoradh}{MOY7`0;sj7&QMok(C%hj;)j+>=x?=rh~ zv1N%IB9TZ`J)uP6(j!$a{0}Y(t<-4MNJyM|3#1iQPrR8~ZyhxfH(0OUym?Ji~~xEdki)DFg-@CRhRffqz1 zhY(H?TMqb>R#0GgXkv(^uy%jR%pobXO?p z4bR>eZhY0DbT$knWB;c#jF|%ja1bYRE45m&Xl4wW<+Sbsv6Pd z=tf|nln_)6sIeYuQczPsjrUN~pq~L+VmVssTS4C{rT$rz*L-z;%#Rzwm5SPPwJ6~H zc6&1bepJ?w7cy7X4!Q#k*ij5+BhY~s0xAhDh+Wq^$>SEq(^B)1c2(qn7u8hV^i16{ z+f<}sehfEdkg;9u7EUNU?&wUfVR>O*9WYoBK&ZM3E5Ua@R0kdhz9FZ%uUBwdEDJ}p)AM76F7Y@J+;;&yUqVkaDA~W7*wWruKYH)TL+$kT`Hxqk54FMV z56<)T`1X5eSE6?^dmxVdIHO*J)hjT*!iRex5_}DiHPk_0hpd;#(tsBxv4b`OeModD zated6 zrrQ1BV9)*?F5BbY&{leAGo5>kM}IaR;P<(ECxm-=D~mTZ{J*((h-WzUmHW$%5pAVhy#FyxOK= zBhN6qX~Oqb$5m$1x?#02qYktW^q9`)b0|43i`^Z^U+9%Zvrhk2qkU*Xeu4_}J5`t; zyKw*2Y{Ky1M-mcrrQCc7w{>~;m(Xqs4djGl`79qbb-hMm)T9Wh*+#?Sc!rQ~;QJyu zjQ@)feeP=xgHILnTB2LnAZLh@I>9j!{gZ(C5!YjEgkycdFse|?A|$V{BS00!_o?VF z#{WDCaEvo70MD1vZZsJ?x88h)VA(y2;{Cg7Bz9{3yT1@Ddyy^yJdv#7^&6Zu9I}Q( z*3f#AvxY*}&~7Rg%dMaK8^I#NAda8T_rpAe(OLoj<6g@#>o*ynD*j}B5eHw DpYo{( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/routes/v2/__pycache__/phone_number.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/routes/v2/__pycache__/phone_number.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed8883e9c8bfb59a4dc579c60dbb473a5a11653f GIT binary patch literal 12358 zcmeHNU2qgvcJ7|(oL8irpB^+hv^n-dH#I6 z2N)rxTsBFd%8pHK?MhUo0yoXS3=5w~yO|33HJ@0|1X{BtN2VBmWDlOIm}Ll?vRD?V5kZ)VDW2boz$ zV&aU%O0E=}X5%c2d3VZ{cE{amF3zR-IG^^!J+z!ldDFhQFYS-}=`)`Sr0e2!H1A0T z)1i2X=Dn%>?VqI)@ebQw*NsfKENL|F=|8+OXwpeIOX&hlo&Zt?8Tfph*8{Yk1I~o z&PG$S9Sm*^iH&i&@c1$&IN_Kzt{~tX#-G)GEMSP~vXWA=LXU7Zo7ZI3C_~Y~pEe;2 zx%`Eck`&Gv&CVVlJtqvD8HyR5M^2wR-e*cWl~8G?L|)5Qh+85~;kb!T{l+ zjH)FvN%`4qMw72-P!zF>&dO>wPm(f}1y3rf=6LqLC=(S1P8#ZJq(1YZ+zzVvmvDk) zCeFesa!G95?PsL01ExK%G5cfrYuz?_@RIqNE(JQB<;1+Ve(hU)#Rmwv5L zLojNicWw!uhi&h3q(0CSvZZp^e5& zsv`9X1Huyrh2%tnB$Ap;1XUwS<|1@SXhJ@tyq1?!1woPIjHZk$vT;g=G8eM>j3k^P z*`%zh*#4}15i~=9Q=weUq@lHn>w{t7U^$oXoIa6E!Z4ahmx1qT%qNTv4X({dtQQzC zS~~|ACyJbrQUx)SNXz&p6L~l-0+AC^;zCLmK>L$Kp{K$ckcCZtq~=5+I@vpgRpDNq%9GvmSGeYT8FG>30jHu)>DCr z`bS6uJnC-1NZk#9qt`jmM-NpXi5_&GWIgCSd*+j=)6uZbtNENvbe||H8ATIC-F;Ek z=wt+iNw#3pgvnM+nlVAi>k&oG;&~Hsc(mpOEh1^fI=@H(91s--PMSuV*Ev;AjgtsA z+k^>yCBGX3Z#IhvCJ&&tpOB^7PsHx z(BbRc+o3YN9iw}QtmR22X`%|2F}M#Dhps_p7Bv=2*IlniwKa5MCT;XsYgS#;B^LGM zeb+s}IJ`j9jSS6Kn+ZG*_te7xY6f1WV=ALzP)tV

  2. &znjkIP6?>`kVAW!bk;qZo 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 M-BVu>xH0Yj9~%9rng9R* literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/routes/v2/__pycache__/trunk.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/routes/v2/__pycache__/trunk.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3502e8e2631c6758b8d467a50216bfcc45260705 GIT binary patch literal 12124 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 IM)&@I0cN7bU;qFB literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/routes/v2/phone_number.py b/venv/Lib/site-packages/twilio/rest/routes/v2/phone_number.py new file mode 100644 index 00000000..1b67509b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/routes/v2/phone_number.py @@ -0,0 +1,311 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Routes + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class PhoneNumberInstance(InstanceResource): + """ + :ivar phone_number: The phone number in E.164 format + :ivar url: The absolute URL of the resource. + :ivar sid: A 34 character string that uniquely identifies the Inbound Processing Region assignments for this phone number. + :ivar account_sid: The unique SID identifier of the Account. + :ivar friendly_name: A human readable description of the Inbound Processing Region assignments for this phone number, up to 64 characters. + :ivar voice_region: The Inbound Processing Region used for this phone number for voice. + :ivar date_created: The date that this phone number was assigned an Inbound Processing Region, given in ISO 8601 format. + :ivar date_updated: The date that the Inbound Processing Region was updated for this phone number, given in ISO 8601 format. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + phone_number: Optional[str] = None, + ): + super().__init__(version) + + self.phone_number: Optional[str] = payload.get("phone_number") + self.url: Optional[str] = payload.get("url") + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.voice_region: Optional[str] = payload.get("voice_region") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "phone_number": phone_number or self.phone_number, + } + self._context: Optional[PhoneNumberContext] = None + + @property + def _proxy(self) -> "PhoneNumberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PhoneNumberContext for this PhoneNumberInstance + """ + if self._context is None: + self._context = PhoneNumberContext( + self._version, + phone_number=self._solution["phone_number"], + ) + return self._context + + def fetch(self) -> "PhoneNumberInstance": + """ + Fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "PhoneNumberInstance": + """ + Asynchronous coroutine to fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "PhoneNumberInstance": + """ + Update the PhoneNumberInstance + + :param voice_region: The Inbound Processing Region used for this phone number for voice + :param friendly_name: A human readable description of this resource, up to 64 characters. + + :returns: The updated PhoneNumberInstance + """ + return self._proxy.update( + voice_region=voice_region, + friendly_name=friendly_name, + ) + + async def update_async( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "PhoneNumberInstance": + """ + Asynchronous coroutine to update the PhoneNumberInstance + + :param voice_region: The Inbound Processing Region used for this phone number for voice + :param friendly_name: A human readable description of this resource, up to 64 characters. + + :returns: The updated PhoneNumberInstance + """ + return await self._proxy.update_async( + voice_region=voice_region, + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PhoneNumberContext(InstanceContext): + + def __init__(self, version: Version, phone_number: str): + """ + Initialize the PhoneNumberContext + + :param version: Version that contains the resource + :param phone_number: The phone number in E.164 format + """ + super().__init__(version) + + # Path Solution + self._solution = { + "phone_number": phone_number, + } + self._uri = "/PhoneNumbers/{phone_number}".format(**self._solution) + + def fetch(self) -> PhoneNumberInstance: + """ + Fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return PhoneNumberInstance( + self._version, + payload, + phone_number=self._solution["phone_number"], + ) + + async def fetch_async(self) -> PhoneNumberInstance: + """ + Asynchronous coroutine to fetch the PhoneNumberInstance + + + :returns: The fetched PhoneNumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return PhoneNumberInstance( + self._version, + payload, + phone_number=self._solution["phone_number"], + ) + + def update( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> PhoneNumberInstance: + """ + Update the PhoneNumberInstance + + :param voice_region: The Inbound Processing Region used for this phone number for voice + :param friendly_name: A human readable description of this resource, up to 64 characters. + + :returns: The updated PhoneNumberInstance + """ + + data = values.of( + { + "VoiceRegion": voice_region, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, payload, phone_number=self._solution["phone_number"] + ) + + async def update_async( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> PhoneNumberInstance: + """ + Asynchronous coroutine to update the PhoneNumberInstance + + :param voice_region: The Inbound Processing Region used for this phone number for voice + :param friendly_name: A human readable description of this resource, up to 64 characters. + + :returns: The updated PhoneNumberInstance + """ + + data = values.of( + { + "VoiceRegion": voice_region, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return PhoneNumberInstance( + self._version, payload, phone_number=self._solution["phone_number"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PhoneNumberList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PhoneNumberList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, phone_number: str) -> PhoneNumberContext: + """ + Constructs a PhoneNumberContext + + :param phone_number: The phone number in E.164 format + """ + return PhoneNumberContext(self._version, phone_number=phone_number) + + def __call__(self, phone_number: str) -> PhoneNumberContext: + """ + Constructs a PhoneNumberContext + + :param phone_number: The phone number in E.164 format + """ + return PhoneNumberContext(self._version, phone_number=phone_number) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/routes/v2/sip_domain.py b/venv/Lib/site-packages/twilio/rest/routes/v2/sip_domain.py new file mode 100644 index 00000000..2326a5db --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/routes/v2/sip_domain.py @@ -0,0 +1,311 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Routes + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class SipDomainInstance(InstanceResource): + """ + :ivar sip_domain: + :ivar url: + :ivar sid: + :ivar account_sid: + :ivar friendly_name: + :ivar voice_region: + :ivar date_created: + :ivar date_updated: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + sip_domain: Optional[str] = None, + ): + super().__init__(version) + + self.sip_domain: Optional[str] = payload.get("sip_domain") + self.url: Optional[str] = payload.get("url") + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.voice_region: Optional[str] = payload.get("voice_region") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "sip_domain": sip_domain or self.sip_domain, + } + self._context: Optional[SipDomainContext] = None + + @property + def _proxy(self) -> "SipDomainContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SipDomainContext for this SipDomainInstance + """ + if self._context is None: + self._context = SipDomainContext( + self._version, + sip_domain=self._solution["sip_domain"], + ) + return self._context + + def fetch(self) -> "SipDomainInstance": + """ + Fetch the SipDomainInstance + + + :returns: The fetched SipDomainInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SipDomainInstance": + """ + Asynchronous coroutine to fetch the SipDomainInstance + + + :returns: The fetched SipDomainInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "SipDomainInstance": + """ + Update the SipDomainInstance + + :param voice_region: + :param friendly_name: + + :returns: The updated SipDomainInstance + """ + return self._proxy.update( + voice_region=voice_region, + friendly_name=friendly_name, + ) + + async def update_async( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "SipDomainInstance": + """ + Asynchronous coroutine to update the SipDomainInstance + + :param voice_region: + :param friendly_name: + + :returns: The updated SipDomainInstance + """ + return await self._proxy.update_async( + voice_region=voice_region, + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SipDomainContext(InstanceContext): + + def __init__(self, version: Version, sip_domain: str): + """ + Initialize the SipDomainContext + + :param version: Version that contains the resource + :param sip_domain: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sip_domain": sip_domain, + } + self._uri = "/SipDomains/{sip_domain}".format(**self._solution) + + def fetch(self) -> SipDomainInstance: + """ + Fetch the SipDomainInstance + + + :returns: The fetched SipDomainInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SipDomainInstance( + self._version, + payload, + sip_domain=self._solution["sip_domain"], + ) + + async def fetch_async(self) -> SipDomainInstance: + """ + Asynchronous coroutine to fetch the SipDomainInstance + + + :returns: The fetched SipDomainInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SipDomainInstance( + self._version, + payload, + sip_domain=self._solution["sip_domain"], + ) + + def update( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> SipDomainInstance: + """ + Update the SipDomainInstance + + :param voice_region: + :param friendly_name: + + :returns: The updated SipDomainInstance + """ + + data = values.of( + { + "VoiceRegion": voice_region, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SipDomainInstance( + self._version, payload, sip_domain=self._solution["sip_domain"] + ) + + async def update_async( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> SipDomainInstance: + """ + Asynchronous coroutine to update the SipDomainInstance + + :param voice_region: + :param friendly_name: + + :returns: The updated SipDomainInstance + """ + + data = values.of( + { + "VoiceRegion": voice_region, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SipDomainInstance( + self._version, payload, sip_domain=self._solution["sip_domain"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SipDomainList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SipDomainList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, sip_domain: str) -> SipDomainContext: + """ + Constructs a SipDomainContext + + :param sip_domain: + """ + return SipDomainContext(self._version, sip_domain=sip_domain) + + def __call__(self, sip_domain: str) -> SipDomainContext: + """ + Constructs a SipDomainContext + + :param sip_domain: + """ + return SipDomainContext(self._version, sip_domain=sip_domain) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/routes/v2/trunk.py b/venv/Lib/site-packages/twilio/rest/routes/v2/trunk.py new file mode 100644 index 00000000..f783ce92 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/routes/v2/trunk.py @@ -0,0 +1,311 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Routes + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class TrunkInstance(InstanceResource): + """ + :ivar sip_trunk_domain: The absolute URL of the SIP Trunk + :ivar url: The absolute URL of the resource. + :ivar sid: A 34 character string that uniquely identifies the Inbound Processing Region assignments for this SIP Trunk. + :ivar account_sid: The unique SID identifier of the Account. + :ivar friendly_name: A human readable description of the Inbound Processing Region assignments for this SIP Trunk, up to 64 characters. + :ivar voice_region: The Inbound Processing Region used for this SIP Trunk for voice. + :ivar date_created: The date that this SIP Trunk was assigned an Inbound Processing Region, given in ISO 8601 format. + :ivar date_updated: The date that the Inbound Processing Region was updated for this SIP Trunk, given in ISO 8601 format. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + sip_trunk_domain: Optional[str] = None, + ): + super().__init__(version) + + self.sip_trunk_domain: Optional[str] = payload.get("sip_trunk_domain") + self.url: Optional[str] = payload.get("url") + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.voice_region: Optional[str] = payload.get("voice_region") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + + self._solution = { + "sip_trunk_domain": sip_trunk_domain or self.sip_trunk_domain, + } + self._context: Optional[TrunkContext] = None + + @property + def _proxy(self) -> "TrunkContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: TrunkContext for this TrunkInstance + """ + if self._context is None: + self._context = TrunkContext( + self._version, + sip_trunk_domain=self._solution["sip_trunk_domain"], + ) + return self._context + + def fetch(self) -> "TrunkInstance": + """ + Fetch the TrunkInstance + + + :returns: The fetched TrunkInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "TrunkInstance": + """ + Asynchronous coroutine to fetch the TrunkInstance + + + :returns: The fetched TrunkInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "TrunkInstance": + """ + Update the TrunkInstance + + :param voice_region: The Inbound Processing Region used for this SIP Trunk for voice + :param friendly_name: A human readable description of this resource, up to 64 characters. + + :returns: The updated TrunkInstance + """ + return self._proxy.update( + voice_region=voice_region, + friendly_name=friendly_name, + ) + + async def update_async( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "TrunkInstance": + """ + Asynchronous coroutine to update the TrunkInstance + + :param voice_region: The Inbound Processing Region used for this SIP Trunk for voice + :param friendly_name: A human readable description of this resource, up to 64 characters. + + :returns: The updated TrunkInstance + """ + return await self._proxy.update_async( + voice_region=voice_region, + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TrunkContext(InstanceContext): + + def __init__(self, version: Version, sip_trunk_domain: str): + """ + Initialize the TrunkContext + + :param version: Version that contains the resource + :param sip_trunk_domain: The absolute URL of the SIP Trunk + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sip_trunk_domain": sip_trunk_domain, + } + self._uri = "/Trunks/{sip_trunk_domain}".format(**self._solution) + + def fetch(self) -> TrunkInstance: + """ + Fetch the TrunkInstance + + + :returns: The fetched TrunkInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return TrunkInstance( + self._version, + payload, + sip_trunk_domain=self._solution["sip_trunk_domain"], + ) + + async def fetch_async(self) -> TrunkInstance: + """ + Asynchronous coroutine to fetch the TrunkInstance + + + :returns: The fetched TrunkInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return TrunkInstance( + self._version, + payload, + sip_trunk_domain=self._solution["sip_trunk_domain"], + ) + + def update( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> TrunkInstance: + """ + Update the TrunkInstance + + :param voice_region: The Inbound Processing Region used for this SIP Trunk for voice + :param friendly_name: A human readable description of this resource, up to 64 characters. + + :returns: The updated TrunkInstance + """ + + data = values.of( + { + "VoiceRegion": voice_region, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TrunkInstance( + self._version, payload, sip_trunk_domain=self._solution["sip_trunk_domain"] + ) + + async def update_async( + self, + voice_region: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> TrunkInstance: + """ + Asynchronous coroutine to update the TrunkInstance + + :param voice_region: The Inbound Processing Region used for this SIP Trunk for voice + :param friendly_name: A human readable description of this resource, up to 64 characters. + + :returns: The updated TrunkInstance + """ + + data = values.of( + { + "VoiceRegion": voice_region, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TrunkInstance( + self._version, payload, sip_trunk_domain=self._solution["sip_trunk_domain"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TrunkList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the TrunkList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, sip_trunk_domain: str) -> TrunkContext: + """ + Constructs a TrunkContext + + :param sip_trunk_domain: The absolute URL of the SIP Trunk + """ + return TrunkContext(self._version, sip_trunk_domain=sip_trunk_domain) + + def __call__(self, sip_trunk_domain: str) -> TrunkContext: + """ + Constructs a TrunkContext + + :param sip_trunk_domain: The absolute URL of the SIP Trunk + """ + return TrunkContext(self._version, sip_trunk_domain=sip_trunk_domain) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/serverless/ServerlessBase.py b/venv/Lib/site-packages/twilio/rest/serverless/ServerlessBase.py new file mode 100644 index 00000000..d6e227c0 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/serverless/ServerlessBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.serverless.v1 import V1 + + +class ServerlessBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Serverless Domain + + :returns: Domain for Serverless + """ + super().__init__(twilio, "https://serverless.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Serverless + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/serverless/__init__.py b/venv/Lib/site-packages/twilio/rest/serverless/__init__.py new file mode 100644 index 00000000..a9f32edb --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/serverless/__init__.py @@ -0,0 +1,15 @@ +from warnings import warn + +from twilio.rest.serverless.ServerlessBase import ServerlessBase +from twilio.rest.serverless.v1.service import ServiceList + + +class Serverless(ServerlessBase): + @property + def services(self) -> ServiceList: + warn( + "services is deprecated. Use v1.services instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.services diff --git a/venv/Lib/site-packages/twilio/rest/serverless/__pycache__/ServerlessBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/serverless/__pycache__/ServerlessBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8167e64eb40edbb23cfc0a1fa324e2203aa2a824 GIT binary patch literal 2023 zcmahKO>Y}TbauU7f8?WS15F}IHH8N7p|&Ccs-miD+CYh*Nku~r#%Q|P9mh-8yJlwN z#+DB`L?V%hS_z@#%CX8XL0k&rP_5_*ao}c1BdVTwZ+2~`rHHZp=6%0;A2a@OWF${u z?f!hb_JcvlZ%Fi3IzbK>0ofxCDHBI?bWf}6WnDu&<)!LI*-*IQrR!$dRCwCU)U)NR zMs#wWIOY~{GTb;w#s12!i24fjG)UJ!=du7SdQK>Z-3+;Kx1);P6QfV$-ej`JisOK4RBAm-``L`pS$QcQ=MftI6SqKz|Lx!%10#0n#0f zr>gokslp&_4VMj`c2eA|>W;Bx93&pf8Q^7sm)~F6(<}>4jALbL^&C z3%(n=mgly)D$gK3R1S-P{fXDC;NiOP4d z%k>5qQI;_m!ZQ}7SaSyWhU8vVg{};OtoIVxuL7AyRwd z1%B_4uYypX0q}H_JQ*gr(Vfgs*~$IW56@lsB|G=%-1N4wn>_?MiOjfEHar0Rg;}V! zeG14P>5wn`q5-lw7NU+?9deM^L;HHn|FDDM(c16zTQF$V3X}`RTGHkW4XQ6|S3wse z;9Zyi9%y0|Hi>bm7y}sT&6)Pe7b?=6Ig46v0N5nmJQ*IlcX8+9!=cxHotWA`|Lw;1 z{5KyxIx&84V`pRggg6Om&s75GxDq(Yd!(fm^fvFG{iX<-Ezj;Jp>z*R!XjeDWllQOwMPNHj z^%&i;bb5OK&A$n3>hQ|ZVj&-87;^#}PHl#*hU>2hoXF@@a)Vd#syOOt5ZJ$HC=uZ8 zQmI8#$2dhfcmtX#t9qy(a)a)M2#D zA?Pni&;<&V#LyrfAqs1;*3dnDfc4mDn4U>MgL^=Y9iS%ayLz7QSslwQ?W==JGNT=` zMDCNT$Wml6a(*Y|C~uCdo2ZV<5f}A5HMhe$(7!CtT|n>%1y4hr5;WE{s_huN!+6i^ z=&q5Ki{hEZP;9ZJF4>KjVy3G0A4t;$G4@d+v{4k*K8`sMcmW&6$W!baR)I%o6>5l>nVno5=10xs zv6L@L)-x@g&+JhVr7OpHjVmI~k$3loFWWHg-(OmK=r1DQ6wQ{OHl@0^*D(=(ib?7( zM^Ako3B1~p4a0ThzGz2r)T}Y&qNZx+?^6qcD2YT6R9hW3DLZVRS{*ybL~QBcbJDzo zpLV5JS@>R=>76}ySTc^456Uoo`c3;)``gs)m#Nv$_H17U!isBUb`T_C1A`zd2SKAr zw_=4WLGXMljE5e(#hNW-qQlg~4Mz9??1aM8%9KV%0e(@M9q5@82byI%@2>m-x%G9h zCV#7oJWoZgxTVZi-%;wxbEW5U1*%Gc0kd3zYQa~1R;GSJcIiK{#pCAV4yHRJGm43i n?3+2&1$IF?)T?m?4s=4u9-RLLxAx%rU&|)W+nGa<+aUKJhm-EI literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/serverless/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/serverless/v1/__init__.py new file mode 100644 index 00000000..e494615c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/serverless/v1/__init__.py @@ -0,0 +1,43 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Serverless + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.serverless.v1.service import ServiceList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Serverless + + :param domain: The Twilio.serverless domain + """ + super().__init__(domain, "v1") + self._services: Optional[ServiceList] = None + + @property + def services(self) -> ServiceList: + if self._services is None: + self._services = ServiceList(self) + return self._services + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/serverless/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/serverless/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..463c0c221bec5c42ad67cbdf880f5120b32ad8d5 GIT binary patch literal 2032 zcmahK&2QUO{Mm6FC;eDyM>oWZ-hhops1A_^646vK(J@twbXrRfQKp9*zcgl!ZJwQs zRMFH!C0dDUC)6G}GWAd4GCmHIMI|Io9FPKC#k3Q@_nzanLI}tDz2EoubG{!NDHP9ElN9;#lHDvP-F7 z(ig^3HPHj-(j`~s=>mC=10JwG^ouc%A>W~Xy&&84z;PWP&*5dtx|F#z3?-kp58kLn zanMf`4OhJ6NzLRB1qfvI+pA9%);+{{6!@;mV(IfJugZboYgXhA@b6(-#k6i z)Swbr%xYtq7@r$W=4yuN0wmJZCRV%UYB3XM!%je1Y!Ko=SVH1F;YQHY5Tsg2-6qRJ zHNYogOoW8IRE#%Y-21Rn{}i;t`p1ilEA<5$-jDpC-u1!y28=zbcd6H{-*(pOp%c-$ zz-rvL)@fLe#MYG<4WrUYiluJ3G)%(`dTb2BY>cdy%^~vwFv3>>Jl{mmMp1rzC-;MK zaew;T^FJF`pT2W#TiYE!0x^npMxze%8t~yrAD*=s(p^CIP#=AsicXNtiHPfnr;iR2 zdl=S``5$($9!j;SvT@L3I)KLtI|oO|Jz(|{z}OfzRunZPFxPq=z$W^2vJ!M+x}?J`PgC_}`6KkJtzp zd}mnH6HRB+Ac!+z#Mmnw8%uV!L0y-SqQWMCD^mMFjD#875eFjY_W*gmg$7zK`|f`C z7{M`^MEdwZ&17HOfBP>4$5Cd;7!EMsSGag`;Y*5a$T7{RU*MN4>!D))`-^ zcuH=)xn_mbOl~yebBiZWOXMvUCB~N%0lz4x?y}h}3kt58EL)Uu5nRbU__n<;uFK}l uvnxRIH4NVbFvuv1@~1kgXvde3a_JDgb%?GUqW7Qa)5`4jg<}MV@bV8Kc@7%@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/serverless/v1/service/__init__.py b/venv/Lib/site-packages/twilio/rest/serverless/v1/service/__init__.py new file mode 100644 index 00000000..f6e4e584 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/serverless/v1/service/__init__.py @@ -0,0 +1,742 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Serverless + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.serverless.v1.service.asset import AssetList +from twilio.rest.serverless.v1.service.build import BuildList +from twilio.rest.serverless.v1.service.environment import EnvironmentList +from twilio.rest.serverless.v1.service.function import FunctionList + + +class ServiceInstance(InstanceResource): + """ + :ivar sid: The unique string that we created to identify the Service resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Service resource. + :ivar friendly_name: The string that you assigned to describe the Service resource. + :ivar unique_name: A user-defined string that uniquely identifies the Service resource. It can be used in place of the Service resource's `sid` in the URL to address the Service resource. + :ivar include_credentials: Whether to inject Account credentials into a function invocation context. + :ivar ui_editable: Whether the Service resource's properties and subresources can be edited via the UI. + :ivar domain_base: The base domain name for this Service, which is a combination of the unique name and a randomly generated string. + :ivar date_created: The date and time in GMT when the Service resource was created specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar date_updated: The date and time in GMT when the Service resource was last updated specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + :ivar url: The absolute URL of the Service resource. + :ivar links: The URLs of the Service's nested resources. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.unique_name: Optional[str] = payload.get("unique_name") + self.include_credentials: Optional[bool] = payload.get("include_credentials") + self.ui_editable: Optional[bool] = payload.get("ui_editable") + self.domain_base: Optional[str] = payload.get("domain_base") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[ServiceContext] = None + + @property + def _proxy(self) -> "ServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ServiceContext for this ServiceInstance + """ + if self._context is None: + self._context = ServiceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ServiceInstance": + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ServiceInstance": + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + include_credentials: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ui_editable: Union[bool, object] = values.unset, + ) -> "ServiceInstance": + """ + Update the ServiceInstance + + :param include_credentials: Whether to inject Account credentials into a function invocation context. + :param friendly_name: A descriptive string that you create to describe the Service resource. It can be a maximum of 255 characters. + :param ui_editable: Whether the Service resource's properties and subresources can be edited via the UI. The default value is `false`. + + :returns: The updated ServiceInstance + """ + return self._proxy.update( + include_credentials=include_credentials, + friendly_name=friendly_name, + ui_editable=ui_editable, + ) + + async def update_async( + self, + include_credentials: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ui_editable: Union[bool, object] = values.unset, + ) -> "ServiceInstance": + """ + Asynchronous coroutine to update the ServiceInstance + + :param include_credentials: Whether to inject Account credentials into a function invocation context. + :param friendly_name: A descriptive string that you create to describe the Service resource. It can be a maximum of 255 characters. + :param ui_editable: Whether the Service resource's properties and subresources can be edited via the UI. The default value is `false`. + + :returns: The updated ServiceInstance + """ + return await self._proxy.update_async( + include_credentials=include_credentials, + friendly_name=friendly_name, + ui_editable=ui_editable, + ) + + @property + def assets(self) -> AssetList: + """ + Access the assets + """ + return self._proxy.assets + + @property + def builds(self) -> BuildList: + """ + Access the builds + """ + return self._proxy.builds + + @property + def environments(self) -> EnvironmentList: + """ + Access the environments + """ + return self._proxy.environments + + @property + def functions(self) -> FunctionList: + """ + Access the functions + """ + return self._proxy.functions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServiceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ServiceContext + + :param version: Version that contains the resource + :param sid: The `sid` or `unique_name` of the Service resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Services/{sid}".format(**self._solution) + + self._assets: Optional[AssetList] = None + self._builds: Optional[BuildList] = None + self._environments: Optional[EnvironmentList] = None + self._functions: Optional[FunctionList] = None + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ServiceInstance: + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ServiceInstance: + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + include_credentials: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ui_editable: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Update the ServiceInstance + + :param include_credentials: Whether to inject Account credentials into a function invocation context. + :param friendly_name: A descriptive string that you create to describe the Service resource. It can be a maximum of 255 characters. + :param ui_editable: Whether the Service resource's properties and subresources can be edited via the UI. The default value is `false`. + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "IncludeCredentials": serialize.boolean_to_string(include_credentials), + "FriendlyName": friendly_name, + "UiEditable": serialize.boolean_to_string(ui_editable), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + include_credentials: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ui_editable: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronous coroutine to update the ServiceInstance + + :param include_credentials: Whether to inject Account credentials into a function invocation context. + :param friendly_name: A descriptive string that you create to describe the Service resource. It can be a maximum of 255 characters. + :param ui_editable: Whether the Service resource's properties and subresources can be edited via the UI. The default value is `false`. + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "IncludeCredentials": serialize.boolean_to_string(include_credentials), + "FriendlyName": friendly_name, + "UiEditable": serialize.boolean_to_string(ui_editable), + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def assets(self) -> AssetList: + """ + Access the assets + """ + if self._assets is None: + self._assets = AssetList( + self._version, + self._solution["sid"], + ) + return self._assets + + @property + def builds(self) -> BuildList: + """ + Access the builds + """ + if self._builds is None: + self._builds = BuildList( + self._version, + self._solution["sid"], + ) + return self._builds + + @property + def environments(self) -> EnvironmentList: + """ + Access the environments + """ + if self._environments is None: + self._environments = EnvironmentList( + self._version, + self._solution["sid"], + ) + return self._environments + + @property + def functions(self) -> FunctionList: + """ + Access the functions + """ + if self._functions is None: + self._functions = FunctionList( + self._version, + self._solution["sid"], + ) + return self._functions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ServiceInstance: + """ + Build an instance of ServiceInstance + + :param payload: Payload response from the API + """ + return ServiceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services" + + def create( + self, + unique_name: str, + friendly_name: str, + include_credentials: Union[bool, object] = values.unset, + ui_editable: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Create the ServiceInstance + + :param unique_name: A user-defined string that uniquely identifies the Service resource. It can be used as an alternative to the `sid` in the URL path to address the Service resource. This value must be 50 characters or less in length and be unique. + :param friendly_name: A descriptive string that you create to describe the Service resource. It can be a maximum of 255 characters. + :param include_credentials: Whether to inject Account credentials into a function invocation context. The default value is `true`. + :param ui_editable: Whether the Service's properties and subresources can be edited via the UI. The default value is `false`. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "FriendlyName": friendly_name, + "IncludeCredentials": serialize.boolean_to_string(include_credentials), + "UiEditable": serialize.boolean_to_string(ui_editable), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + async def create_async( + self, + unique_name: str, + friendly_name: str, + include_credentials: Union[bool, object] = values.unset, + ui_editable: Union[bool, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronously create the ServiceInstance + + :param unique_name: A user-defined string that uniquely identifies the Service resource. It can be used as an alternative to the `sid` in the URL path to address the Service resource. This value must be 50 characters or less in length and be unique. + :param friendly_name: A descriptive string that you create to describe the Service resource. It can be a maximum of 255 characters. + :param include_credentials: Whether to inject Account credentials into a function invocation context. The default value is `true`. + :param ui_editable: Whether the Service's properties and subresources can be edited via the UI. The default value is `false`. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "FriendlyName": friendly_name, + "IncludeCredentials": serialize.boolean_to_string(include_credentials), + "UiEditable": serialize.boolean_to_string(ui_editable), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ServiceInstance]: + """ + Streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ServiceInstance]: + """ + Asynchronously streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Asynchronously lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Asynchronously retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + def get_page(self, target_url: str) -> ServicePage: + """ + Retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ServicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ServicePage: + """ + Asynchronously retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ServicePage(self._version, response) + + def get(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The `sid` or `unique_name` of the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The `sid` or `unique_name` of the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/serverless/v1/service/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/serverless/v1/service/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59867c16946c841eabc23b2ca746b73f4b1aeacf GIT binary patch literal 31540 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
  3. gRf+R<>PK@K&8!FCTw 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 Y?|OCn9S%Qt)}MAEvF9_6e%V<5FTEB^SpWb4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview/wireless/command.py b/venv/Lib/site-packages/twilio/rest/preview/wireless/command.py new file mode 100644 index 00000000..8e715e09 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/wireless/command.py @@ -0,0 +1,595 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Preview + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CommandInstance(InstanceResource): + """ + :ivar sid: + :ivar account_sid: + :ivar device_sid: + :ivar sim_sid: + :ivar command: + :ivar command_mode: + :ivar status: + :ivar direction: + :ivar date_created: + :ivar date_updated: + :ivar url: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.device_sid: Optional[str] = payload.get("device_sid") + self.sim_sid: Optional[str] = payload.get("sim_sid") + self.command: Optional[str] = payload.get("command") + self.command_mode: Optional[str] = payload.get("command_mode") + self.status: Optional[str] = payload.get("status") + self.direction: Optional[str] = payload.get("direction") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[CommandContext] = None + + @property + def _proxy(self) -> "CommandContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CommandContext for this CommandInstance + """ + if self._context is None: + self._context = CommandContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "CommandInstance": + """ + Fetch the CommandInstance + + + :returns: The fetched CommandInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CommandInstance": + """ + Asynchronous coroutine to fetch the CommandInstance + + + :returns: The fetched CommandInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CommandContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the CommandContext + + :param version: Version that contains the resource + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Commands/{sid}".format(**self._solution) + + def fetch(self) -> CommandInstance: + """ + Fetch the CommandInstance + + + :returns: The fetched CommandInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CommandInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CommandInstance: + """ + Asynchronous coroutine to fetch the CommandInstance + + + :returns: The fetched CommandInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CommandInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CommandPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CommandInstance: + """ + Build an instance of CommandInstance + + :param payload: Payload response from the API + """ + return CommandInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CommandList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CommandList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Commands" + + def create( + self, + command: str, + device: Union[str, object] = values.unset, + sim: Union[str, object] = values.unset, + callback_method: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + command_mode: Union[str, object] = values.unset, + include_sid: Union[str, object] = values.unset, + ) -> CommandInstance: + """ + Create the CommandInstance + + :param command: + :param device: + :param sim: + :param callback_method: + :param callback_url: + :param command_mode: + :param include_sid: + + :returns: The created CommandInstance + """ + + data = values.of( + { + "Command": command, + "Device": device, + "Sim": sim, + "CallbackMethod": callback_method, + "CallbackUrl": callback_url, + "CommandMode": command_mode, + "IncludeSid": include_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CommandInstance(self._version, payload) + + async def create_async( + self, + command: str, + device: Union[str, object] = values.unset, + sim: Union[str, object] = values.unset, + callback_method: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + command_mode: Union[str, object] = values.unset, + include_sid: Union[str, object] = values.unset, + ) -> CommandInstance: + """ + Asynchronously create the CommandInstance + + :param command: + :param device: + :param sim: + :param callback_method: + :param callback_url: + :param command_mode: + :param include_sid: + + :returns: The created CommandInstance + """ + + data = values.of( + { + "Command": command, + "Device": device, + "Sim": sim, + "CallbackMethod": callback_method, + "CallbackUrl": callback_url, + "CommandMode": command_mode, + "IncludeSid": include_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CommandInstance(self._version, payload) + + def stream( + self, + device: Union[str, object] = values.unset, + sim: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CommandInstance]: + """ + Streams CommandInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str device: + :param str sim: + :param str status: + :param str direction: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + device=device, + sim=sim, + status=status, + direction=direction, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + device: Union[str, object] = values.unset, + sim: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CommandInstance]: + """ + Asynchronously streams CommandInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str device: + :param str sim: + :param str status: + :param str direction: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + device=device, + sim=sim, + status=status, + direction=direction, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + device: Union[str, object] = values.unset, + sim: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CommandInstance]: + """ + Lists CommandInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str device: + :param str sim: + :param str status: + :param str direction: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + device=device, + sim=sim, + status=status, + direction=direction, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + device: Union[str, object] = values.unset, + sim: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CommandInstance]: + """ + Asynchronously lists CommandInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str device: + :param str sim: + :param str status: + :param str direction: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + device=device, + sim=sim, + status=status, + direction=direction, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + device: Union[str, object] = values.unset, + sim: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CommandPage: + """ + Retrieve a single page of CommandInstance records from the API. + Request is executed immediately + + :param device: + :param sim: + :param status: + :param direction: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CommandInstance + """ + data = values.of( + { + "Device": device, + "Sim": sim, + "Status": status, + "Direction": direction, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CommandPage(self._version, response) + + async def page_async( + self, + device: Union[str, object] = values.unset, + sim: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + direction: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CommandPage: + """ + Asynchronously retrieve a single page of CommandInstance records from the API. + Request is executed immediately + + :param device: + :param sim: + :param status: + :param direction: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CommandInstance + """ + data = values.of( + { + "Device": device, + "Sim": sim, + "Status": status, + "Direction": direction, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CommandPage(self._version, response) + + def get_page(self, target_url: str) -> CommandPage: + """ + Retrieve a specific page of CommandInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CommandInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CommandPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CommandPage: + """ + Asynchronously retrieve a specific page of CommandInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CommandInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CommandPage(self._version, response) + + def get(self, sid: str) -> CommandContext: + """ + Constructs a CommandContext + + :param sid: + """ + return CommandContext(self._version, sid=sid) + + def __call__(self, sid: str) -> CommandContext: + """ + Constructs a CommandContext + + :param sid: + """ + return CommandContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/wireless/rate_plan.py b/venv/Lib/site-packages/twilio/rest/preview/wireless/rate_plan.py new file mode 100644 index 00000000..95e45f1e --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/wireless/rate_plan.py @@ -0,0 +1,699 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Preview + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RatePlanInstance(InstanceResource): + """ + :ivar sid: + :ivar unique_name: + :ivar account_sid: + :ivar friendly_name: + :ivar data_enabled: + :ivar data_metering: + :ivar data_limit: + :ivar messaging_enabled: + :ivar voice_enabled: + :ivar national_roaming_enabled: + :ivar international_roaming: + :ivar date_created: + :ivar date_updated: + :ivar url: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.unique_name: Optional[str] = payload.get("unique_name") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.data_enabled: Optional[bool] = payload.get("data_enabled") + self.data_metering: Optional[str] = payload.get("data_metering") + self.data_limit: Optional[int] = deserialize.integer(payload.get("data_limit")) + self.messaging_enabled: Optional[bool] = payload.get("messaging_enabled") + self.voice_enabled: Optional[bool] = payload.get("voice_enabled") + self.national_roaming_enabled: Optional[bool] = payload.get( + "national_roaming_enabled" + ) + self.international_roaming: Optional[List[str]] = payload.get( + "international_roaming" + ) + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[RatePlanContext] = None + + @property + def _proxy(self) -> "RatePlanContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RatePlanContext for this RatePlanInstance + """ + if self._context is None: + self._context = RatePlanContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RatePlanInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RatePlanInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "RatePlanInstance": + """ + Fetch the RatePlanInstance + + + :returns: The fetched RatePlanInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "RatePlanInstance": + """ + Asynchronous coroutine to fetch the RatePlanInstance + + + :returns: The fetched RatePlanInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + unique_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "RatePlanInstance": + """ + Update the RatePlanInstance + + :param unique_name: + :param friendly_name: + + :returns: The updated RatePlanInstance + """ + return self._proxy.update( + unique_name=unique_name, + friendly_name=friendly_name, + ) + + async def update_async( + self, + unique_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> "RatePlanInstance": + """ + Asynchronous coroutine to update the RatePlanInstance + + :param unique_name: + :param friendly_name: + + :returns: The updated RatePlanInstance + """ + return await self._proxy.update_async( + unique_name=unique_name, + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RatePlanContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the RatePlanContext + + :param version: Version that contains the resource + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/RatePlans/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the RatePlanInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RatePlanInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> RatePlanInstance: + """ + Fetch the RatePlanInstance + + + :returns: The fetched RatePlanInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return RatePlanInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> RatePlanInstance: + """ + Asynchronous coroutine to fetch the RatePlanInstance + + + :returns: The fetched RatePlanInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return RatePlanInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + unique_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> RatePlanInstance: + """ + Update the RatePlanInstance + + :param unique_name: + :param friendly_name: + + :returns: The updated RatePlanInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RatePlanInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + unique_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + ) -> RatePlanInstance: + """ + Asynchronous coroutine to update the RatePlanInstance + + :param unique_name: + :param friendly_name: + + :returns: The updated RatePlanInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RatePlanInstance(self._version, payload, sid=self._solution["sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RatePlanPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RatePlanInstance: + """ + Build an instance of RatePlanInstance + + :param payload: Payload response from the API + """ + return RatePlanInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RatePlanList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the RatePlanList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/RatePlans" + + def create( + self, + unique_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + data_enabled: Union[bool, object] = values.unset, + data_limit: Union[int, object] = values.unset, + data_metering: Union[str, object] = values.unset, + messaging_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + commands_enabled: Union[bool, object] = values.unset, + national_roaming_enabled: Union[bool, object] = values.unset, + international_roaming: Union[List[str], object] = values.unset, + ) -> RatePlanInstance: + """ + Create the RatePlanInstance + + :param unique_name: + :param friendly_name: + :param data_enabled: + :param data_limit: + :param data_metering: + :param messaging_enabled: + :param voice_enabled: + :param commands_enabled: + :param national_roaming_enabled: + :param international_roaming: + + :returns: The created RatePlanInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "FriendlyName": friendly_name, + "DataEnabled": serialize.boolean_to_string(data_enabled), + "DataLimit": data_limit, + "DataMetering": data_metering, + "MessagingEnabled": serialize.boolean_to_string(messaging_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "CommandsEnabled": serialize.boolean_to_string(commands_enabled), + "NationalRoamingEnabled": serialize.boolean_to_string( + national_roaming_enabled + ), + "InternationalRoaming": serialize.map( + international_roaming, lambda e: e + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RatePlanInstance(self._version, payload) + + async def create_async( + self, + unique_name: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + data_enabled: Union[bool, object] = values.unset, + data_limit: Union[int, object] = values.unset, + data_metering: Union[str, object] = values.unset, + messaging_enabled: Union[bool, object] = values.unset, + voice_enabled: Union[bool, object] = values.unset, + commands_enabled: Union[bool, object] = values.unset, + national_roaming_enabled: Union[bool, object] = values.unset, + international_roaming: Union[List[str], object] = values.unset, + ) -> RatePlanInstance: + """ + Asynchronously create the RatePlanInstance + + :param unique_name: + :param friendly_name: + :param data_enabled: + :param data_limit: + :param data_metering: + :param messaging_enabled: + :param voice_enabled: + :param commands_enabled: + :param national_roaming_enabled: + :param international_roaming: + + :returns: The created RatePlanInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "FriendlyName": friendly_name, + "DataEnabled": serialize.boolean_to_string(data_enabled), + "DataLimit": data_limit, + "DataMetering": data_metering, + "MessagingEnabled": serialize.boolean_to_string(messaging_enabled), + "VoiceEnabled": serialize.boolean_to_string(voice_enabled), + "CommandsEnabled": serialize.boolean_to_string(commands_enabled), + "NationalRoamingEnabled": serialize.boolean_to_string( + national_roaming_enabled + ), + "InternationalRoaming": serialize.map( + international_roaming, lambda e: e + ), + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RatePlanInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RatePlanInstance]: + """ + Streams RatePlanInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RatePlanInstance]: + """ + Asynchronously streams RatePlanInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RatePlanInstance]: + """ + Lists RatePlanInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RatePlanInstance]: + """ + Asynchronously lists RatePlanInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RatePlanPage: + """ + Retrieve a single page of RatePlanInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RatePlanInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RatePlanPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RatePlanPage: + """ + Asynchronously retrieve a single page of RatePlanInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RatePlanInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RatePlanPage(self._version, response) + + def get_page(self, target_url: str) -> RatePlanPage: + """ + Retrieve a specific page of RatePlanInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RatePlanInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RatePlanPage(self._version, response) + + async def get_page_async(self, target_url: str) -> RatePlanPage: + """ + Asynchronously retrieve a specific page of RatePlanInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RatePlanInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RatePlanPage(self._version, response) + + def get(self, sid: str) -> RatePlanContext: + """ + Constructs a RatePlanContext + + :param sid: + """ + return RatePlanContext(self._version, sid=sid) + + def __call__(self, sid: str) -> RatePlanContext: + """ + Constructs a RatePlanContext + + :param sid: + """ + return RatePlanContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/wireless/sim/__init__.py b/venv/Lib/site-packages/twilio/rest/preview/wireless/sim/__init__.py new file mode 100644 index 00000000..07a9e74d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview/wireless/sim/__init__.py @@ -0,0 +1,833 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Preview + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.preview.wireless.sim.usage import UsageList + + +class SimInstance(InstanceResource): + """ + :ivar sid: + :ivar unique_name: + :ivar account_sid: + :ivar rate_plan_sid: + :ivar friendly_name: + :ivar iccid: + :ivar e_id: + :ivar status: + :ivar commands_callback_url: + :ivar commands_callback_method: + :ivar sms_fallback_method: + :ivar sms_fallback_url: + :ivar sms_method: + :ivar sms_url: + :ivar voice_fallback_method: + :ivar voice_fallback_url: + :ivar voice_method: + :ivar voice_url: + :ivar date_created: + :ivar date_updated: + :ivar url: + :ivar links: + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], sid: Optional[str] = None + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.unique_name: Optional[str] = payload.get("unique_name") + self.account_sid: Optional[str] = payload.get("account_sid") + self.rate_plan_sid: Optional[str] = payload.get("rate_plan_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.iccid: Optional[str] = payload.get("iccid") + self.e_id: Optional[str] = payload.get("e_id") + self.status: Optional[str] = payload.get("status") + self.commands_callback_url: Optional[str] = payload.get("commands_callback_url") + self.commands_callback_method: Optional[str] = payload.get( + "commands_callback_method" + ) + self.sms_fallback_method: Optional[str] = payload.get("sms_fallback_method") + self.sms_fallback_url: Optional[str] = payload.get("sms_fallback_url") + self.sms_method: Optional[str] = payload.get("sms_method") + self.sms_url: Optional[str] = payload.get("sms_url") + self.voice_fallback_method: Optional[str] = payload.get("voice_fallback_method") + self.voice_fallback_url: Optional[str] = payload.get("voice_fallback_url") + self.voice_method: Optional[str] = payload.get("voice_method") + self.voice_url: Optional[str] = payload.get("voice_url") + self.date_created: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.iso8601_datetime( + payload.get("date_updated") + ) + self.url: Optional[str] = payload.get("url") + self.links: Optional[Dict[str, object]] = payload.get("links") + + self._solution = { + "sid": sid or self.sid, + } + self._context: Optional[SimContext] = None + + @property + def _proxy(self) -> "SimContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SimContext for this SimInstance + """ + if self._context is None: + self._context = SimContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "SimInstance": + """ + Fetch the SimInstance + + + :returns: The fetched SimInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SimInstance": + """ + Asynchronous coroutine to fetch the SimInstance + + + :returns: The fetched SimInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + unique_name: Union[str, object] = values.unset, + callback_method: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + rate_plan: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + commands_callback_method: Union[str, object] = values.unset, + commands_callback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + ) -> "SimInstance": + """ + Update the SimInstance + + :param unique_name: + :param callback_method: + :param callback_url: + :param friendly_name: + :param rate_plan: + :param status: + :param commands_callback_method: + :param commands_callback_url: + :param sms_fallback_method: + :param sms_fallback_url: + :param sms_method: + :param sms_url: + :param voice_fallback_method: + :param voice_fallback_url: + :param voice_method: + :param voice_url: + + :returns: The updated SimInstance + """ + return self._proxy.update( + unique_name=unique_name, + callback_method=callback_method, + callback_url=callback_url, + friendly_name=friendly_name, + rate_plan=rate_plan, + status=status, + commands_callback_method=commands_callback_method, + commands_callback_url=commands_callback_url, + sms_fallback_method=sms_fallback_method, + sms_fallback_url=sms_fallback_url, + sms_method=sms_method, + sms_url=sms_url, + voice_fallback_method=voice_fallback_method, + voice_fallback_url=voice_fallback_url, + voice_method=voice_method, + voice_url=voice_url, + ) + + async def update_async( + self, + unique_name: Union[str, object] = values.unset, + callback_method: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + rate_plan: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + commands_callback_method: Union[str, object] = values.unset, + commands_callback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + ) -> "SimInstance": + """ + Asynchronous coroutine to update the SimInstance + + :param unique_name: + :param callback_method: + :param callback_url: + :param friendly_name: + :param rate_plan: + :param status: + :param commands_callback_method: + :param commands_callback_url: + :param sms_fallback_method: + :param sms_fallback_url: + :param sms_method: + :param sms_url: + :param voice_fallback_method: + :param voice_fallback_url: + :param voice_method: + :param voice_url: + + :returns: The updated SimInstance + """ + return await self._proxy.update_async( + unique_name=unique_name, + callback_method=callback_method, + callback_url=callback_url, + friendly_name=friendly_name, + rate_plan=rate_plan, + status=status, + commands_callback_method=commands_callback_method, + commands_callback_url=commands_callback_url, + sms_fallback_method=sms_fallback_method, + sms_fallback_url=sms_fallback_url, + sms_method=sms_method, + sms_url=sms_url, + voice_fallback_method=voice_fallback_method, + voice_fallback_url=voice_fallback_url, + voice_method=voice_method, + voice_url=voice_url, + ) + + @property + def usage(self) -> UsageList: + """ + Access the usage + """ + return self._proxy.usage + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SimContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the SimContext + + :param version: Version that contains the resource + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Sims/{sid}".format(**self._solution) + + self._usage: Optional[UsageList] = None + + def fetch(self) -> SimInstance: + """ + Fetch the SimInstance + + + :returns: The fetched SimInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SimInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> SimInstance: + """ + Asynchronous coroutine to fetch the SimInstance + + + :returns: The fetched SimInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SimInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + unique_name: Union[str, object] = values.unset, + callback_method: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + rate_plan: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + commands_callback_method: Union[str, object] = values.unset, + commands_callback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + ) -> SimInstance: + """ + Update the SimInstance + + :param unique_name: + :param callback_method: + :param callback_url: + :param friendly_name: + :param rate_plan: + :param status: + :param commands_callback_method: + :param commands_callback_url: + :param sms_fallback_method: + :param sms_fallback_url: + :param sms_method: + :param sms_url: + :param voice_fallback_method: + :param voice_fallback_url: + :param voice_method: + :param voice_url: + + :returns: The updated SimInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "CallbackMethod": callback_method, + "CallbackUrl": callback_url, + "FriendlyName": friendly_name, + "RatePlan": rate_plan, + "Status": status, + "CommandsCallbackMethod": commands_callback_method, + "CommandsCallbackUrl": commands_callback_url, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SimInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + unique_name: Union[str, object] = values.unset, + callback_method: Union[str, object] = values.unset, + callback_url: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + rate_plan: Union[str, object] = values.unset, + status: Union[str, object] = values.unset, + commands_callback_method: Union[str, object] = values.unset, + commands_callback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + ) -> SimInstance: + """ + Asynchronous coroutine to update the SimInstance + + :param unique_name: + :param callback_method: + :param callback_url: + :param friendly_name: + :param rate_plan: + :param status: + :param commands_callback_method: + :param commands_callback_url: + :param sms_fallback_method: + :param sms_fallback_url: + :param sms_method: + :param sms_url: + :param voice_fallback_method: + :param voice_fallback_url: + :param voice_method: + :param voice_url: + + :returns: The updated SimInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "CallbackMethod": callback_method, + "CallbackUrl": callback_url, + "FriendlyName": friendly_name, + "RatePlan": rate_plan, + "Status": status, + "CommandsCallbackMethod": commands_callback_method, + "CommandsCallbackUrl": commands_callback_url, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SimInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def usage(self) -> UsageList: + """ + Access the usage + """ + if self._usage is None: + self._usage = UsageList( + self._version, + self._solution["sid"], + ) + return self._usage + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SimPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SimInstance: + """ + Build an instance of SimInstance + + :param payload: Payload response from the API + """ + return SimInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SimList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the SimList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Sims" + + def stream( + self, + status: Union[str, object] = values.unset, + iccid: Union[str, object] = values.unset, + rate_plan: Union[str, object] = values.unset, + e_id: Union[str, object] = values.unset, + sim_registration_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SimInstance]: + """ + Streams SimInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str status: + :param str iccid: + :param str rate_plan: + :param str e_id: + :param str sim_registration_code: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + status=status, + iccid=iccid, + rate_plan=rate_plan, + e_id=e_id, + sim_registration_code=sim_registration_code, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + status: Union[str, object] = values.unset, + iccid: Union[str, object] = values.unset, + rate_plan: Union[str, object] = values.unset, + e_id: Union[str, object] = values.unset, + sim_registration_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SimInstance]: + """ + Asynchronously streams SimInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str status: + :param str iccid: + :param str rate_plan: + :param str e_id: + :param str sim_registration_code: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + status=status, + iccid=iccid, + rate_plan=rate_plan, + e_id=e_id, + sim_registration_code=sim_registration_code, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + status: Union[str, object] = values.unset, + iccid: Union[str, object] = values.unset, + rate_plan: Union[str, object] = values.unset, + e_id: Union[str, object] = values.unset, + sim_registration_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SimInstance]: + """ + Lists SimInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str status: + :param str iccid: + :param str rate_plan: + :param str e_id: + :param str sim_registration_code: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + status=status, + iccid=iccid, + rate_plan=rate_plan, + e_id=e_id, + sim_registration_code=sim_registration_code, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + status: Union[str, object] = values.unset, + iccid: Union[str, object] = values.unset, + rate_plan: Union[str, object] = values.unset, + e_id: Union[str, object] = values.unset, + sim_registration_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SimInstance]: + """ + Asynchronously lists SimInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str status: + :param str iccid: + :param str rate_plan: + :param str e_id: + :param str sim_registration_code: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + status=status, + iccid=iccid, + rate_plan=rate_plan, + e_id=e_id, + sim_registration_code=sim_registration_code, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + status: Union[str, object] = values.unset, + iccid: Union[str, object] = values.unset, + rate_plan: Union[str, object] = values.unset, + e_id: Union[str, object] = values.unset, + sim_registration_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SimPage: + """ + Retrieve a single page of SimInstance records from the API. + Request is executed immediately + + :param status: + :param iccid: + :param rate_plan: + :param e_id: + :param sim_registration_code: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SimInstance + """ + data = values.of( + { + "Status": status, + "Iccid": iccid, + "RatePlan": rate_plan, + "EId": e_id, + "SimRegistrationCode": sim_registration_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SimPage(self._version, response) + + async def page_async( + self, + status: Union[str, object] = values.unset, + iccid: Union[str, object] = values.unset, + rate_plan: Union[str, object] = values.unset, + e_id: Union[str, object] = values.unset, + sim_registration_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SimPage: + """ + Asynchronously retrieve a single page of SimInstance records from the API. + Request is executed immediately + + :param status: + :param iccid: + :param rate_plan: + :param e_id: + :param sim_registration_code: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SimInstance + """ + data = values.of( + { + "Status": status, + "Iccid": iccid, + "RatePlan": rate_plan, + "EId": e_id, + "SimRegistrationCode": sim_registration_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SimPage(self._version, response) + + def get_page(self, target_url: str) -> SimPage: + """ + Retrieve a specific page of SimInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SimInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SimPage(self._version, response) + + async def get_page_async(self, target_url: str) -> SimPage: + """ + Asynchronously retrieve a specific page of SimInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SimInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SimPage(self._version, response) + + def get(self, sid: str) -> SimContext: + """ + Constructs a SimContext + + :param sid: + """ + return SimContext(self._version, sid=sid) + + def __call__(self, sid: str) -> SimContext: + """ + Constructs a SimContext + + :param sid: + """ + return SimContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview/wireless/sim/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview/wireless/sim/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cea5ccc5b9ba71d96f659a9b42c2f094c8488c7 GIT binary patch literal 31984 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 k!3~C{Hm-25v1~s(_q`2 "UsageContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UsageContext for this UsageInstance + """ + if self._context is None: + self._context = UsageContext( + self._version, + sim_sid=self._solution["sim_sid"], + ) + return self._context + + def fetch( + self, + end: Union[str, object] = values.unset, + start: Union[str, object] = values.unset, + ) -> "UsageInstance": + """ + Fetch the UsageInstance + + :param end: + :param start: + + :returns: The fetched UsageInstance + """ + return self._proxy.fetch( + end=end, + start=start, + ) + + async def fetch_async( + self, + end: Union[str, object] = values.unset, + start: Union[str, object] = values.unset, + ) -> "UsageInstance": + """ + Asynchronous coroutine to fetch the UsageInstance + + :param end: + :param start: + + :returns: The fetched UsageInstance + """ + return await self._proxy.fetch_async( + end=end, + start=start, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UsageContext(InstanceContext): + + def __init__(self, version: Version, sim_sid: str): + """ + Initialize the UsageContext + + :param version: Version that contains the resource + :param sim_sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sim_sid": sim_sid, + } + self._uri = "/Sims/{sim_sid}/Usage".format(**self._solution) + + def fetch( + self, + end: Union[str, object] = values.unset, + start: Union[str, object] = values.unset, + ) -> UsageInstance: + """ + Fetch the UsageInstance + + :param end: + :param start: + + :returns: The fetched UsageInstance + """ + + data = values.of( + { + "End": end, + "Start": start, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return UsageInstance( + self._version, + payload, + sim_sid=self._solution["sim_sid"], + ) + + async def fetch_async( + self, + end: Union[str, object] = values.unset, + start: Union[str, object] = values.unset, + ) -> UsageInstance: + """ + Asynchronous coroutine to fetch the UsageInstance + + :param end: + :param start: + + :returns: The fetched UsageInstance + """ + + data = values.of( + { + "End": end, + "Start": start, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return UsageInstance( + self._version, + payload, + sim_sid=self._solution["sim_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UsageList(ListResource): + + def __init__(self, version: Version, sim_sid: str): + """ + Initialize the UsageList + + :param version: Version that contains the resource + :param sim_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sim_sid": sim_sid, + } + + def get(self) -> UsageContext: + """ + Constructs a UsageContext + + """ + return UsageContext(self._version, sim_sid=self._solution["sim_sid"]) + + def __call__(self) -> UsageContext: + """ + Constructs a UsageContext + + """ + return UsageContext(self._version, sim_sid=self._solution["sim_sid"]) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/PreviewIamBase.py b/venv/Lib/site-packages/twilio/rest/preview_iam/PreviewIamBase.py new file mode 100644 index 00000000..22fcbe70 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview_iam/PreviewIamBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.preview_iam.v1 import V1 + + +class PreviewIamBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the PreviewIam Domain + + :returns: Domain for PreviewIam + """ + super().__init__(twilio, "https://preview-iam.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of PreviewIam + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/__init__.py b/venv/Lib/site-packages/twilio/rest/preview_iam/__init__.py new file mode 100644 index 00000000..9a5bf85b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview_iam/__init__.py @@ -0,0 +1,26 @@ +from twilio.rest.preview_iam.PreviewIamBase import PreviewIamBase + +from twilio.rest.preview_iam.v1.authorize import ( + AuthorizeList, +) +from twilio.rest.preview_iam.v1.token import ( + TokenList, +) +from twilio.rest.preview_iam.versionless.organization import ( + OrganizationList, +) +from twilio.rest.preview_iam.versionless import Versionless + + +class PreviewIam(PreviewIamBase): + @property + def organization(self) -> OrganizationList: + return Versionless(self).organization + + @property + def authorize(self) -> AuthorizeList: + return self.v1.authorize + + @property + def token(self) -> TokenList: + return self.v1.token diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/__pycache__/PreviewIamBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview_iam/__pycache__/PreviewIamBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c96e8d29e6fc926f23b9cd9354a0a90990bcbf2d GIT binary patch literal 2026 zcmahKO>Y}TbauU7ubs~}(4pFhg$DKw#0Qo*zgpTi-F5vp2UpE~Ou^X<#y$~>Utz^aBjbYMia`GXZzk}i7q^!UIskXvX zRdtV4VUTu*%NkGHDXv#lTiex+6AR@G&l|vHtnfq#o9KcX_6k9n?bYNV8%K8>sYChHe61yqa zlIMhu={jvL%QNr~mBS)nf8sSKc(^INU@qa%sxRn3zAx9F?lq+mCo}7q^+KFT!Sd_N z`Ban+HXB?-24fERXDmvwW(nw8z}>3ILPAlNG1)7|0?d}uooD8axyly-7eVFYrKQ!% zA`fndexuU#9gELH=fg^qd(Fxx&Uz(qLO$Ctt=r}X4=S ziD7Wno_vAci}F=q2A2Rl-62ngNp^HU^RqE^bm76}`CpBNhnHvev;*S=_$1QfVp;G6 z^cSWf8}}I?honQk>9YpN&UlD2a&^dYq7M!15&uIE#z$$t+i$|4S!+-)80>&HOVqEv ztYLXojDU5a1GuM%QP=|XOT{?ANNtwd=U%8tvowuTZvfaK-5ePnzjJl}>Vu)zA5C67 zy7I&J-s1NkJsg|3v%SB)Hzv-3*mISDb6g3W zaA;cq9X9cj_9X{derj4Z$K(I2(Vn=rDz8*wkkR#fM7#oloJ|@g6MZuFl3|D$Z=*&A zfGoiHjLb4Wgfs1#bq+I~W32Amn=azRjC~6)PRtSbzavL2G8zJ&E)lk5^#x8?lnO#2 zrVtxR?tsNzm$AGe#(*lrd|&oP7-$H=1Tx+O@N}1SwM_c0qvk1rt$Uv6qg_=`Pu*Sk zi@Jhr*>GaIen|~A7Wbo3^ay}Pj7_)r~qSnJ!!|^r*PGodGxx(vsRc!e<2<%@p zlrZpm$<(6P&QJ=_IegOa!WEjOI8Pb(Bq+y@an7C@*Wzkj7gykj0~jFEO(}} zfeQx%C(B@uo;{wtp5-MO4o|6jFT6m`& zugd~e01fq^5rL|JhI`OxP0lEOtXsOTP~w$oaTfQa=h^wwx&fwvybiaFcG~_TXn%4% zL)$o)k!S=6zu)cI?l$(rjM#IGf1NsfasPJyIfJd|A5Bh9=N}NZABUJhMEKEt#`R<~(6}uWH$rJ4y-jMoWSGhGjaVhG7*g&oH!7jm9BG{d{+a zT5lnPK(Zk)tLSUu;?}JXiPT;qyPL>1)ocr3bW8_ct#~ zOO-J{Y993k9RM^Cf$~!5FqryqPqCd)&aks!R?+9g&_;E=x|c}pCQ?l`Mb7~Ip9`g2 z6kqmu!~Ry~IpFGpJynXZ3xG1di%x|bE9)yw^|Gihmx=kRVH8b=7=|A+496{$ZSMCQ z#_O_aw;8oW-4dZ*jViE|I6WHX9v6V}8%=roZ6sC=REu(yn*==UDVR0%QI79RSk{^& z+7ATpRtPBr0@+vEUV7^er_voN-Jz13HBKc3^&Qqp2I+W`T&B;z7IdD*J5THBJgqAV z{|QjuE&kQhf-7TM=X}K`{nTGVgR|fY_%}}t>;6BE^|=t!zw!^CiQ6i~q?aI7SLH)> sJUFtuGz|p53+y_W{Se0Z6Ph>(OISKkx(4C#pGqH2ZjKxvc!`yM0Re_u#Q*>R literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/preview_iam/v1/__init__.py new file mode 100644 index 00000000..22432777 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview_iam/v1/__init__.py @@ -0,0 +1,51 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Organization Public API + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.preview_iam.v1.authorize import AuthorizeList +from twilio.rest.preview_iam.v1.token import TokenList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of PreviewIam + + :param domain: The Twilio.preview_iam domain + """ + super().__init__(domain, "v1") + self._authorize: Optional[AuthorizeList] = None + self._token: Optional[TokenList] = None + + @property + def authorize(self) -> AuthorizeList: + if self._authorize is None: + self._authorize = AuthorizeList(self) + return self._authorize + + @property + def token(self) -> TokenList: + if self._token is None: + self._token = TokenList(self) + return self._token + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview_iam/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45b1fa9fe65ad1033b75b9b7f054bf6d45a0582b GIT binary patch literal 2477 zcmcf?O>Y}TbauVA*B@z0Q?;dO!_WeaRn^8q0+g1PLQoa8B!Pw;R)%4-JBgRBcg^hD z#jd615Q#);RW2xzxb#SspVCYCI7F*PLgK_NkXBSZ@n&YdF)D%^o9NB^n)m(24~K^G z2)?^NeqMJo2>r^5{+EuCJp+(+WFrIFimkdzLp4-|<0&`Q&hUKVWkL{y{}b2;m$-a==~oYQT{g zAr+3rMkKqE*d;x2S*pf*U|gEy$~;^kKjnZsto7|;%zeoJzJ4t)49~D7({s9J==dI< zZ7sNtg)h%e3E8xdZ5mk2X$onR`EAFB5{?g66VEiMXEq&tMV8oSxE_YhV4_l4a>9CR zp=|k$iZ7Ky-*o}iMVmD83Y(QXtqNCZ`~9AAi{lrWf5%OY3ym= zcsZn2U8qd@*z-e7Z70NGonlKkX_#Kiblpxl{~MpAk`n1NB4N`7JUdTW0JQ-$GwC-> zhhsyRTVdU2PM2PDf)E(FIsXRrIAO_YlrSDmv{wWAYZ!cr3U=fI*djs;b|CpQ zz<3;c?*aH$Sw~?aT2p)IF05uxv6apE4lEjQNn$}z{X9@dEv34?C?+4aDbEQV(}g;S zdd^pITUHDEi+GmNwnJ}DnGM-peqo|%GP8kYn7q{#&)sxf$1gXfHgOVh;w4hs)#;KJ zrGr+JvPdVy0l$Pqc>>cR`w(SF$XifKMOr}JMaJKvC`X9sF(Cm@0psOopS?d(`y_xU zYgebH=4z8PxDoozTHALldKm^XthK4vu3d8$YJn5db4}B_VJ^|27K%74j0Rz4AlOQ~ zTImN=Zg$uK@Y5~KSId3oF<=Cz06bkrkBcaGU@iNDer)5&{lh=&uWi5a)~a@Ac>8Q+ zRl8f*11%I~7!6y@vlLFnACF!%@nb;NQ4f95mkgZC2g9UMJ+v9$hh`=^|9tN{dZ0{~ zR5lEH3|?*^*$Z$4+yZ7J0Ha(|>248{ODLY0$Zi?^QW(B>Y3sJaX^$+U+fUj2#Bu|1&Fg6dXcc2jO5@4n!{ovPz4Y>FSV?z{Wu-co~4q=KR|E zt-{!&$Ng3%8CsN=fa~WQJ$u+lfuQ$Qct1oCk(s8-4YUys3gh|ali|- zjCS+r;J8SxG{iT}GaFQF8fo};%jI~HkT2oEloG~&*~QRDI{ZGseuf<}L+nK^5LF)q zEJ_6-V`Cf}ikH%&u1iQsVTXV#X6;=uYb?iaa&UwTJ_7J`1?_5j`t^n~yUmmGRZ1 JPY@i!&|h5YcQpV2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/v1/__pycache__/authorize.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview_iam/v1/__pycache__/authorize.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8365fd3e868c288bc456d6cf94bb401f64c95331 GIT binary patch literal 5229 zcmdTIZEPGzb@uM|_C6gaPGdW)kouI(NI* z**!Zp7ZK5@xDt^PA+ReUHT_jt0mVrC;3xgfpO}DZt%wu^Nbm<;6=PS#&hxc2jACGay7ucj~8gr^+Sf)H$nJ5~X zJUBYU=SD19r?$q7GM_CoYueC3g?-K1lrNO2sg@1-oTp-o$pyzL+u8p9Ny8~rCNi2; z>bE>1$FhoceUSFqSS;nqGIC+;Y}UWHqH5bR+@M-zn#JZ7|O` zR4Z_jGnQ;xj!bpKk(~mSHNHtnH7jbdIGc(66YVP%a)X2BtQ$IGXpS4Xz|XE0UGcIB zDoP1%cv>x1s13c=A=7qLQ==EDZB>{?0hbsyY^P}~y+N4`3pLMnJs9=}Yp0;|V{jQt zass$bKo@dBJwQWxkcu=+rF@_hDDt6sk{9&QjYKY@13n+n!#6^?=sdY9Qc>&>jKK@8uPdjs z|NQ=VnJV5hmg+ti+^OWXzXb`OA0u9H7UlJ80@k&eao zKSp{U9U8cIcA|5h^PxXQI@W-QxM4<}3Ntldhlt~iYaNfZKxTzhU_H;T3tfHG z^G8{g^UR>8UYvz{29a$z9rtI?tB^G7F}Jhww^XfQnDm89kQ&=u-|;c7iOi^{gdw$* zd1D~6?Z79N$dbTzgMc=QF0(xV@#0VxMR~r8ygAg4EdjVrYAvKS%i5uzisNEaEm64j zn4**{y;8(}LQ&oVNA+hUMbRw{cEPm7P(Ny${hud2GP`W z6&~^SY!a&x?b1MKW3GZ|_oRhHTbknCZh1a*Gs>OBO@dHm%e1ND%$BJe)rt_g9L3Px zL?Z!!BoO~KNaXN=NJd!)FxKix6Z#|qe_ZYVf(|63M$nvUC>P1RhP9~CNIloWdaxSS zL&stAKd-9_)j%~^4OK;5{DoLgUDu>4nZkIprA=WV+tTzf(4wqcS~XmiektAcxm=4l z@jAitc~>KM{d0j)M*i|sIBvsg2JKl>D=^EnDmG+*Jax3fX8WmE1RHjc^=xRbEuj|p%!HHEvUMjIx*TsRvt8EtE|F=%!@LAJ54ollZwsR z%O&s#^a`096U;a>l$ySaaHg_q>Wz}9q1lb3i4_x9EHG@?e?zT2UjkT9oCfy;&7@I* z>pg0@4AnHx#Qj&(Gcz;kyv0gs&q%1-2GV13966V6i9 z^Y<5R#a>6sECQ^v>?nZxVZA)hz7D9lwuVkHNM`sh$8f<90YE(HB5j=usoSZ=@7+(2 z-tYSMgIyQrrAJ+vdFfVUCDQq~o$U*qw>uy8WLCR-SLIh%JNLuy<9ImPvKEZ&ip_^> zyGdL7Li%?4<6Q?=b{$-8>sZv^H{LUr+kdyG79?%GYb4MXo0pzMNNdlX-5+*;(7h}@ z*m3NBlOZPxk&QI3uK@ ztRJ+(zJy=^0j4ze8iFq)_zHrf07iW4VqZfH#!)xU?_5za7H!xUI{|agvzn8DpX+>% z)p#6oxa=l?fADnjS(r~}_xs8Bk{@>rtaJ=)HJ{ESU_PC(XD_s&S`@5n-NyX)qrn5G zg2G3=!YLv2(JT9)|7is~+lz-i@F~?aI?f5U4@g-TfTmKK*RgZk(ymuQSCQ7QpcAC^ zs8>PnVEd8L7ZAt@c#VwWdr?8GKmv9cCRFxC0B+ctn1a`#R}7;|vy%w0f@UuxH~^rz zYVJiO0*p=eH^7mgYOaN%V$U7vDS=OIFG;_4Z+K~VwJ&oov6NUnJaF&$((%;;hdvzs zVA%gWPRiozkJ`HyFWu=~d~>BeRTBYG3zOZQi*1Yf#eFMn2Wt|dA_S;T-`TTxeq~Qz zEsCfZX?^L|rN!P`Z?5diXZAyA_u zsaDnlUpEXDl3`AIFB&Wr7(S`_t+{dUm71AQ;fc#5eRmTk0~H|uzXZI&yb_RM5#n|> z(-gttHs&$3yKT+$e$w!42eSpgZ_h;Wt;B1>^~iDWeRhHk0S@ed*qAhGK|v562NFW) vSr-v94@mkU+5dNveMpWxB(FRP?-a84JNljw_&(|TjvySpHT;y|m+Rr*-c$h6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/v1/__pycache__/token.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview_iam/v1/__pycache__/token.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa32f1b9dd9e79d2fb9226011ab2b9b87cb84b94 GIT binary patch literal 7098 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 PBx&?w>@$LIZijyWw@oE; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/v1/authorize.py b/venv/Lib/site-packages/twilio/rest/preview_iam/v1/authorize.py new file mode 100644 index 00000000..4166b4ae --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview_iam/v1/authorize.py @@ -0,0 +1,130 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Organization Public API + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class AuthorizeInstance(InstanceResource): + """ + :ivar redirect_to: The callback URL + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.redirect_to: Optional[str] = payload.get("redirect_to") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class AuthorizeList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the AuthorizeList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/authorize" + + def fetch( + self, + response_type: Union[str, object] = values.unset, + client_id: Union[str, object] = values.unset, + redirect_uri: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + state: Union[str, object] = values.unset, + ) -> AuthorizeInstance: + """ + Asynchronously fetch the AuthorizeInstance + + :param response_type: Response Type:param client_id: The Client Identifier:param redirect_uri: The url to which response will be redirected to:param scope: The scope of the access request:param state: An opaque value which can be used to maintain state between the request and callback + :returns: The fetched AuthorizeInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + params = values.of( + { + "response_type": response_type, + "client_id": client_id, + "redirect_uri": redirect_uri, + "scope": scope, + "state": state, + } + ) + + payload = self._version.fetch( + method="GET", uri=self._uri, headers=headers, params=params + ) + + return AuthorizeInstance(self._version, payload) + + async def fetch_async( + self, + response_type: Union[str, object] = values.unset, + client_id: Union[str, object] = values.unset, + redirect_uri: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + state: Union[str, object] = values.unset, + ) -> AuthorizeInstance: + """ + Asynchronously fetch the AuthorizeInstance + + :param response_type: Response Type:param client_id: The Client Identifier:param redirect_uri: The url to which response will be redirected to:param scope: The scope of the access request:param state: An opaque value which can be used to maintain state between the request and callback + :returns: The fetched AuthorizeInstance + """ + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + params = values.of( + { + "response_type": response_type, + "client_id": client_id, + "redirect_uri": redirect_uri, + "scope": scope, + "state": state, + } + ) + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers, params=params + ) + + return AuthorizeInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/v1/token.py b/venv/Lib/site-packages/twilio/rest/preview_iam/v1/token.py new file mode 100644 index 00000000..34d9f300 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview_iam/v1/token.py @@ -0,0 +1,170 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Organization Public API + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional, Union +from twilio.base import values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class TokenInstance(InstanceResource): + """ + :ivar access_token: Token which carries the necessary information to access a Twilio resource directly. + :ivar refresh_token: Token which carries the information necessary to get a new access token. + :ivar id_token: Token which carries the information necessary of user profile. + :ivar token_type: Token type + :ivar expires_in: + """ + + def __init__(self, version: Version, payload: Dict[str, Any]): + super().__init__(version) + + self.access_token: Optional[str] = payload.get("access_token") + self.refresh_token: Optional[str] = payload.get("refresh_token") + self.id_token: Optional[str] = payload.get("id_token") + self.token_type: Optional[str] = payload.get("token_type") + self.expires_in: Optional[int] = payload.get("expires_in") + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + + return "" + + +class TokenList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the TokenList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/token" + + def create( + self, + grant_type: str, + client_id: str, + client_secret: Union[str, object] = values.unset, + code: Union[str, object] = values.unset, + redirect_uri: Union[str, object] = values.unset, + audience: Union[str, object] = values.unset, + refresh_token: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + ) -> TokenInstance: + """ + Create the TokenInstance + + :param grant_type: Grant type is a credential representing resource owner's authorization which can be used by client to obtain access token. + :param client_id: A 34 character string that uniquely identifies this OAuth App. + :param client_secret: The credential for confidential OAuth App. + :param code: JWT token related to the authorization code grant type. + :param redirect_uri: The redirect uri + :param audience: The targeted audience uri + :param refresh_token: JWT token related to refresh access token. + :param scope: The scope of token + + :returns: The created TokenInstance + """ + + data = values.of( + { + "grant_type": grant_type, + "client_id": client_id, + "client_secret": client_secret, + "code": code, + "redirect_uri": redirect_uri, + "audience": audience, + "refresh_token": refresh_token, + "scope": scope, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TokenInstance(self._version, payload) + + async def create_async( + self, + grant_type: str, + client_id: str, + client_secret: Union[str, object] = values.unset, + code: Union[str, object] = values.unset, + redirect_uri: Union[str, object] = values.unset, + audience: Union[str, object] = values.unset, + refresh_token: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + ) -> TokenInstance: + """ + Asynchronously create the TokenInstance + + :param grant_type: Grant type is a credential representing resource owner's authorization which can be used by client to obtain access token. + :param client_id: A 34 character string that uniquely identifies this OAuth App. + :param client_secret: The credential for confidential OAuth App. + :param code: JWT token related to the authorization code grant type. + :param redirect_uri: The redirect uri + :param audience: The targeted audience uri + :param refresh_token: JWT token related to refresh access token. + :param scope: The scope of token + + :returns: The created TokenInstance + """ + + data = values.of( + { + "grant_type": grant_type, + "client_id": client_id, + "client_secret": client_secret, + "code": code, + "redirect_uri": redirect_uri, + "audience": audience, + "refresh_token": refresh_token, + "scope": scope, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TokenInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/__init__.py b/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/__init__.py new file mode 100644 index 00000000..7d6d210f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/__init__.py @@ -0,0 +1,43 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Organization Public API + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.preview_iam.versionless.organization import OrganizationList + + +class Versionless(Version): + + def __init__(self, domain: Domain): + """ + Initialize the Versionless version of PreviewIam + + :param domain: The Twilio.preview_iam domain + """ + super().__init__(domain, "Organizations") + self._organization: Optional[OrganizationList] = None + + @property + def organization(self) -> OrganizationList: + if self._organization is None: + self._organization = OrganizationList(self) + return self._organization + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b37694219834bc7b0c9e14c5e82fa44e4545fbd6 GIT binary patch literal 2222 zcmah~L2nyH6rNqL?TwQ(A%zf7+D@P$_)wcjNQJ0GR0OJsHi;l`u#ASy?j#<%-Ze98 zr?z~^Ark4K5*L&lxmLOG1NaAA5-4i5A`%iOZhWMcqYiA2W%vx{Wy!Yn4H}8Ej z{$Y5yfMDGF@$=gES%iL*i{5~>8YfFI?II6VkY{+NZ`93-X-GcfXX;kPQoQA7>$yr! z@mW7#w=1@ROmqWzxoza-skNWc?kWRqyEx#yWg=9-Fji|!U^nzA-gE@spaJDhL_NIL zmTE!>KKrCViiq5(W=;OJOsrBS(vRFmh>F_9xZD3gEEn(t6RjacO4L#k8M0diiRK6? zOD=Ju#pS+V(p8(aX<`S?wM%I%(}m?{lE{G7o?nb*4E^ibR}0GVGT(3l)^Q>h26&~p z<}(*xUs+VTr4V~mxSTbVw!y;|^Pq&Ur>lvV8#Hhl4ByZt4mqwxQA5m?%Ns1JHP=dR zSTBd#C<;Sg^cGhVHz68jmiB62kbHBA7CPCkJ3R{(K}Dh9yZ^bDF=H+RrFzfW1E~;AH5NH-UU(?4qczx@&gPJ-ByW z!!!1iJ#eEyO8Oq!W--&bqv|Aav>336IX>%9RjO2Q+|m`n;W}R7w8iM=qEpu$lso4d z4tMHUXDHiA@#-e?Sy*alYr^{Kez1N@6*8Az2k1rB77bd}n{2Hr zSVXTh9QU@fK}9uE*_JsKQ8|@zIXSm%K)IJxsnO=c5U}%nszRln_C?T$Ngz+Q(BmOA zaPDsY(4N>E|Mt=Yd-l=W@9bDV+b^Gh9>qCMqb3hrL#~n`Pog^d5iq-`i@xY-QuEem zByH5_qWxq)bhan_k9`0tW2tEJb704FK<*oS1STOpVE!D?cqm=)&P4i%X$_X!W`Jy= zUk67X4qiAMyl^l${mazscb9*fy1KLQVCdqbk@F8nrVdA@4(usD2DZzvWR^V^tH=!}3Ss)ws@Ij5^A=I|}Yt+9aq?~cx;YY95fuv|(V zbpAf#FF;c1vH&Dyd_w-&buE2On&*LRq2mG?omIyz4oV~kPMrdh3xw1|ujxyEh>$Pg z{m~jO{~Q&dVjG@Yz<< AccountList: + """ + Access the accounts + """ + if self._accounts is None: + self._accounts = AccountList( + self._version, + self._solution["organization_sid"], + ) + return self._accounts + + @property + def role_assignments(self) -> RoleAssignmentList: + """ + Access the role_assignments + """ + if self._role_assignments is None: + self._role_assignments = RoleAssignmentList( + self._version, + self._solution["organization_sid"], + ) + return self._role_assignments + + @property + def users(self) -> UserList: + """ + Access the users + """ + if self._users is None: + self._users = UserList( + self._version, + self._solution["organization_sid"], + ) + return self._users + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OrganizationList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the OrganizationList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, organization_sid: str) -> OrganizationContext: + """ + Constructs a OrganizationContext + + :param organization_sid: + """ + return OrganizationContext(self._version, organization_sid=organization_sid) + + def __call__(self, organization_sid: str) -> OrganizationContext: + """ + Constructs a OrganizationContext + + :param organization_sid: + """ + return OrganizationContext(self._version, organization_sid=organization_sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f7c5cb57fe3d474b88694ef1d641f507c0172bc GIT binary patch literal 5517 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__pycache__/account.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__pycache__/account.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfa0858d7a88d55e365ad57aa3ff0037cd392ef0 GIT binary patch literal 18912 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__pycache__/user.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/__pycache__/user.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6716535ab47c474518c2456e3248c8bf3110841f GIT binary patch literal 39824 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 WjpGg+vHQl7hy#I "AccountContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AccountContext for this AccountInstance + """ + if self._context is None: + self._context = AccountContext( + self._version, + organization_sid=self._solution["organization_sid"], + account_sid=self._solution["account_sid"], + ) + return self._context + + def fetch(self) -> "AccountInstance": + """ + Fetch the AccountInstance + + + :returns: The fetched AccountInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AccountInstance": + """ + Asynchronous coroutine to fetch the AccountInstance + + + :returns: The fetched AccountInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AccountContext(InstanceContext): + + def __init__(self, version: Version, organization_sid: str, account_sid: str): + """ + Initialize the AccountContext + + :param version: Version that contains the resource + :param organization_sid: + :param account_sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "organization_sid": organization_sid, + "account_sid": account_sid, + } + self._uri = "/{organization_sid}/Accounts/{account_sid}".format( + **self._solution + ) + + def fetch(self) -> AccountInstance: + """ + Fetch the AccountInstance + + + :returns: The fetched AccountInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AccountInstance( + self._version, + payload, + organization_sid=self._solution["organization_sid"], + account_sid=self._solution["account_sid"], + ) + + async def fetch_async(self) -> AccountInstance: + """ + Asynchronous coroutine to fetch the AccountInstance + + + :returns: The fetched AccountInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AccountInstance( + self._version, + payload, + organization_sid=self._solution["organization_sid"], + account_sid=self._solution["account_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AccountPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AccountInstance: + """ + Build an instance of AccountInstance + + :param payload: Payload response from the API + """ + return AccountInstance( + self._version, payload, organization_sid=self._solution["organization_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AccountList(ListResource): + + def __init__(self, version: Version, organization_sid: str): + """ + Initialize the AccountList + + :param version: Version that contains the resource + :param organization_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "organization_sid": organization_sid, + } + self._uri = "/{organization_sid}/Accounts".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AccountInstance]: + """ + Streams AccountInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AccountInstance]: + """ + Asynchronously streams AccountInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AccountInstance]: + """ + Lists AccountInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AccountInstance]: + """ + Asynchronously lists AccountInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AccountPage: + """ + Retrieve a single page of AccountInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AccountInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AccountPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AccountPage: + """ + Asynchronously retrieve a single page of AccountInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AccountInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AccountPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AccountPage: + """ + Retrieve a specific page of AccountInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AccountInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AccountPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AccountPage: + """ + Asynchronously retrieve a specific page of AccountInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AccountInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AccountPage(self._version, response, self._solution) + + def get(self, account_sid: str) -> AccountContext: + """ + Constructs a AccountContext + + :param account_sid: + """ + return AccountContext( + self._version, + organization_sid=self._solution["organization_sid"], + account_sid=account_sid, + ) + + def __call__(self, account_sid: str) -> AccountContext: + """ + Constructs a AccountContext + + :param account_sid: + """ + return AccountContext( + self._version, + organization_sid=self._solution["organization_sid"], + account_sid=account_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/role_assignment.py b/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/role_assignment.py new file mode 100644 index 00000000..9d356f2c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/role_assignment.py @@ -0,0 +1,574 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Organization Public API + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class RoleAssignmentInstance(InstanceResource): + + class PublicApiCreateRoleAssignmentRequest(object): + """ + :ivar role_sid: Twilio Role Sid representing assigned role + :ivar scope: Twilio Sid representing scope of this assignment + :ivar identity: Twilio Sid representing identity of this assignment + """ + + def __init__(self, payload: Dict[str, Any]): + + self.role_sid: Optional[str] = payload.get("role_sid") + self.scope: Optional[str] = payload.get("scope") + self.identity: Optional[str] = payload.get("identity") + + def to_dict(self): + return { + "role_sid": self.role_sid, + "scope": self.scope, + "identity": self.identity, + } + + """ + :ivar sid: Twilio Role Assignment Sid representing this role assignment + :ivar role_sid: Twilio Role Sid representing assigned role + :ivar scope: Twilio Sid representing identity of this assignment + :ivar identity: Twilio Sid representing scope of this assignment + :ivar code: Twilio-specific error code + :ivar message: Error message + :ivar more_info: Link to Error Code References + :ivar status: HTTP response status code + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + organization_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.role_sid: Optional[str] = payload.get("role_sid") + self.scope: Optional[str] = payload.get("scope") + self.identity: Optional[str] = payload.get("identity") + self.code: Optional[int] = payload.get("code") + self.message: Optional[str] = payload.get("message") + self.more_info: Optional[str] = payload.get("moreInfo") + self.status: Optional[int] = payload.get("status") + + self._solution = { + "organization_sid": organization_sid, + "sid": sid or self.sid, + } + self._context: Optional[RoleAssignmentContext] = None + + @property + def _proxy(self) -> "RoleAssignmentContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RoleAssignmentContext for this RoleAssignmentInstance + """ + if self._context is None: + self._context = RoleAssignmentContext( + self._version, + organization_sid=self._solution["organization_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RoleAssignmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleAssignmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class RoleAssignmentContext(InstanceContext): + + class PublicApiCreateRoleAssignmentRequest(object): + """ + :ivar role_sid: Twilio Role Sid representing assigned role + :ivar scope: Twilio Sid representing scope of this assignment + :ivar identity: Twilio Sid representing identity of this assignment + """ + + def __init__(self, payload: Dict[str, Any]): + + self.role_sid: Optional[str] = payload.get("role_sid") + self.scope: Optional[str] = payload.get("scope") + self.identity: Optional[str] = payload.get("identity") + + def to_dict(self): + return { + "role_sid": self.role_sid, + "scope": self.scope, + "identity": self.identity, + } + + def __init__(self, version: Version, organization_sid: str, sid: str): + """ + Initialize the RoleAssignmentContext + + :param version: Version that contains the resource + :param organization_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "organization_sid": organization_sid, + "sid": sid, + } + self._uri = "/{organization_sid}/RoleAssignments/{sid}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the RoleAssignmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + headers["Accept"] = "application/scim+json" + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RoleAssignmentInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + headers["Accept"] = "application/scim+json" + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class RoleAssignmentPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RoleAssignmentInstance: + """ + Build an instance of RoleAssignmentInstance + + :param payload: Payload response from the API + """ + return RoleAssignmentInstance( + self._version, payload, organization_sid=self._solution["organization_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RoleAssignmentList(ListResource): + + class PublicApiCreateRoleAssignmentRequest(object): + """ + :ivar role_sid: Twilio Role Sid representing assigned role + :ivar scope: Twilio Sid representing scope of this assignment + :ivar identity: Twilio Sid representing identity of this assignment + """ + + def __init__(self, payload: Dict[str, Any]): + + self.role_sid: Optional[str] = payload.get("role_sid") + self.scope: Optional[str] = payload.get("scope") + self.identity: Optional[str] = payload.get("identity") + + def to_dict(self): + return { + "role_sid": self.role_sid, + "scope": self.scope, + "identity": self.identity, + } + + def __init__(self, version: Version, organization_sid: str): + """ + Initialize the RoleAssignmentList + + :param version: Version that contains the resource + :param organization_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "organization_sid": organization_sid, + } + self._uri = "/{organization_sid}/RoleAssignments".format(**self._solution) + + def create( + self, + public_api_create_role_assignment_request: PublicApiCreateRoleAssignmentRequest, + ) -> RoleAssignmentInstance: + """ + Create the RoleAssignmentInstance + + :param public_api_create_role_assignment_request: + + :returns: The created RoleAssignmentInstance + """ + data = public_api_create_role_assignment_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleAssignmentInstance( + self._version, payload, organization_sid=self._solution["organization_sid"] + ) + + async def create_async( + self, + public_api_create_role_assignment_request: PublicApiCreateRoleAssignmentRequest, + ) -> RoleAssignmentInstance: + """ + Asynchronously create the RoleAssignmentInstance + + :param public_api_create_role_assignment_request: + + :returns: The created RoleAssignmentInstance + """ + data = public_api_create_role_assignment_request.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return RoleAssignmentInstance( + self._version, payload, organization_sid=self._solution["organization_sid"] + ) + + def stream( + self, + identity: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RoleAssignmentInstance]: + """ + Streams RoleAssignmentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str identity: + :param str scope: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(identity=identity, scope=scope, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + identity: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RoleAssignmentInstance]: + """ + Asynchronously streams RoleAssignmentInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str identity: + :param str scope: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + identity=identity, scope=scope, page_size=limits["page_size"] + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + identity: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleAssignmentInstance]: + """ + Lists RoleAssignmentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str identity: + :param str scope: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + identity=identity, + scope=scope, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + identity: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RoleAssignmentInstance]: + """ + Asynchronously lists RoleAssignmentInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str identity: + :param str scope: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + identity=identity, + scope=scope, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + identity: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RoleAssignmentPage: + """ + Retrieve a single page of RoleAssignmentInstance records from the API. + Request is executed immediately + + :param identity: + :param scope: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleAssignmentInstance + """ + data = values.of( + { + "Identity": identity, + "Scope": scope, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RoleAssignmentPage(self._version, response, self._solution) + + async def page_async( + self, + identity: Union[str, object] = values.unset, + scope: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RoleAssignmentPage: + """ + Asynchronously retrieve a single page of RoleAssignmentInstance records from the API. + Request is executed immediately + + :param identity: + :param scope: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RoleAssignmentInstance + """ + data = values.of( + { + "Identity": identity, + "Scope": scope, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RoleAssignmentPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> RoleAssignmentPage: + """ + Retrieve a specific page of RoleAssignmentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleAssignmentInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RoleAssignmentPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> RoleAssignmentPage: + """ + Asynchronously retrieve a specific page of RoleAssignmentInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RoleAssignmentInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RoleAssignmentPage(self._version, response, self._solution) + + def get(self, sid: str) -> RoleAssignmentContext: + """ + Constructs a RoleAssignmentContext + + :param sid: + """ + return RoleAssignmentContext( + self._version, organization_sid=self._solution["organization_sid"], sid=sid + ) + + def __call__(self, sid: str) -> RoleAssignmentContext: + """ + Constructs a RoleAssignmentContext + + :param sid: + """ + return RoleAssignmentContext( + self._version, organization_sid=self._solution["organization_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/user.py b/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/user.py new file mode 100644 index 00000000..166f76b4 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/preview_iam/versionless/organization/user.py @@ -0,0 +1,1050 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Organization Public API + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class UserInstance(InstanceResource): + + class ScimEmailAddress(object): + """ + :ivar primary: Indicates if this email address is the primary one + :ivar value: The actual email address value + :ivar type: The type of email address (e.g., work, home, etc.) + """ + + def __init__(self, payload: Dict[str, Any]): + + self.primary: Optional[bool] = payload.get("primary") + self.value: Optional[str] = payload.get("value") + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "primary": self.primary, + "value": self.value, + "type": self.type, + } + + class ScimMeta(object): + """ + :ivar resource_type: Indicates the type of the resource + :ivar created: The date and time when the resource was created in the system + :ivar last_modified: The date and time when the resource was last modified + :ivar version: A version identifier for the resource. This can be used to manage resource versioning and concurrency control. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.resource_type: Optional[str] = payload.get("resource_type") + self.created: Optional[datetime] = payload.get("created") + self.last_modified: Optional[datetime] = payload.get("last_modified") + self.version: Optional[str] = payload.get("version") + + def to_dict(self): + return { + "resource_type": self.resource_type, + "created": self.created, + "last_modified": self.last_modified, + "version": self.version, + } + + class ScimName(object): + """ + :ivar given_name: The user's first or given name + :ivar family_name: The user's last or family name + """ + + def __init__(self, payload: Dict[str, Any]): + + self.given_name: Optional[str] = payload.get("given_name") + self.family_name: Optional[str] = payload.get("family_name") + + def to_dict(self): + return { + "given_name": self.given_name, + "family_name": self.family_name, + } + + class ScimUser(object): + """ + :ivar id: Unique Twilio user sid + :ivar external_id: External unique resource id defined by provisioning client + :ivar user_name: Unique username, MUST be same as primary email address + :ivar display_name: User friendly display name + :ivar name: + :ivar emails: Email address list of the user. Primary email must be defined if there are more than 1 email. Primary email must match the username. + :ivar active: Indicates whether the user is active + :ivar locale: User's locale + :ivar timezone: User's time zone + :ivar schemas: An array of URIs that indicate the schemas supported for this user resource + :ivar meta: + :ivar detail: A human-readable description of the error + :ivar scim_type: A scimType error code as defined in RFC7644 + :ivar status: Http status code + :ivar code: Twilio-specific error code + :ivar more_info: Link to Error Code References + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.external_id: Optional[str] = payload.get("external_id") + self.user_name: Optional[str] = payload.get("user_name") + self.display_name: Optional[str] = payload.get("display_name") + self.name: Optional[UserList.ScimName] = payload.get("name") + self.emails: Optional[List[UserList.ScimEmailAddress]] = payload.get( + "emails" + ) + self.active: Optional[bool] = payload.get("active") + self.locale: Optional[str] = payload.get("locale") + self.timezone: Optional[str] = payload.get("timezone") + self.schemas: Optional[List[str]] = payload.get("schemas") + self.meta: Optional[UserList.ScimMeta] = payload.get("meta") + self.detail: Optional[str] = payload.get("detail") + self.scim_type: Optional[str] = payload.get("scim_type") + self.status: Optional[str] = payload.get("status") + self.code: Optional[int] = payload.get("code") + self.more_info: Optional[str] = payload.get("more_info") + + def to_dict(self): + return { + "id": self.id, + "externalId": self.external_id, + "userName": self.user_name, + "displayName": self.display_name, + "name": self.name.to_dict() if self.name is not None else None, + "emails": ( + [emails.to_dict() for emails in self.emails] + if self.emails is not None + else None + ), + "active": self.active, + "locale": self.locale, + "timezone": self.timezone, + "schemas": self.schemas, + "meta": self.meta.to_dict() if self.meta is not None else None, + "detail": self.detail, + "scimType": self.scim_type, + "status": self.status, + "code": self.code, + "moreInfo": self.more_info, + } + + """ + :ivar id: Unique Twilio user sid + :ivar external_id: External unique resource id defined by provisioning client + :ivar user_name: Unique username, MUST be same as primary email address + :ivar display_name: User friendly display name + :ivar name: + :ivar emails: Email address list of the user. Primary email must be defined if there are more than 1 email. Primary email must match the username. + :ivar active: Indicates whether the user is active + :ivar locale: User's locale + :ivar timezone: User's time zone + :ivar schemas: An array of URIs that indicate the schemas supported for this user resource + :ivar meta: + :ivar detail: A human-readable description of the error + :ivar scim_type: A scimType error code as defined in RFC7644 + :ivar status: Http status code + :ivar code: Twilio-specific error code + :ivar more_info: Link to Error Code References + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + organization_sid: str, + id: Optional[str] = None, + ): + super().__init__(version) + + self.id: Optional[str] = payload.get("id") + self.external_id: Optional[str] = payload.get("externalId") + self.user_name: Optional[str] = payload.get("userName") + self.display_name: Optional[str] = payload.get("displayName") + self.name: Optional[UserList.str] = payload.get("name") + self.emails: Optional[List[UserList.str]] = payload.get("emails") + self.active: Optional[bool] = payload.get("active") + self.locale: Optional[str] = payload.get("locale") + self.timezone: Optional[str] = payload.get("timezone") + self.schemas: Optional[List[str]] = payload.get("schemas") + self.meta: Optional[UserList.str] = payload.get("meta") + self.detail: Optional[str] = payload.get("detail") + self.scim_type: Optional[str] = payload.get("scimType") + self.status: Optional[str] = payload.get("status") + self.code: Optional[int] = payload.get("code") + self.more_info: Optional[str] = payload.get("moreInfo") + + self._solution = { + "organization_sid": organization_sid, + "id": id or self.id, + } + self._context: Optional[UserContext] = None + + @property + def _proxy(self) -> "UserContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: UserContext for this UserInstance + """ + if self._context is None: + self._context = UserContext( + self._version, + organization_sid=self._solution["organization_sid"], + id=self._solution["id"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "UserInstance": + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "UserInstance": + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + return await self._proxy.fetch_async() + + def update( + self, scim_user: ScimUser, if_match: Union[str, object] = values.unset + ) -> "UserInstance": + """ + Update the UserInstance + + :param scim_user: + :param if_match: + + :returns: The updated UserInstance + """ + return self._proxy.update( + scim_user=scim_user, + if_match=if_match, + ) + + async def update_async( + self, scim_user: ScimUser, if_match: Union[str, object] = values.unset + ) -> "UserInstance": + """ + Asynchronous coroutine to update the UserInstance + + :param scim_user: + :param if_match: + + :returns: The updated UserInstance + """ + return await self._proxy.update_async( + scim_user=scim_user, + if_match=if_match, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserContext(InstanceContext): + + class ScimEmailAddress(object): + """ + :ivar primary: Indicates if this email address is the primary one + :ivar value: The actual email address value + :ivar type: The type of email address (e.g., work, home, etc.) + """ + + def __init__(self, payload: Dict[str, Any]): + + self.primary: Optional[bool] = payload.get("primary") + self.value: Optional[str] = payload.get("value") + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "primary": self.primary, + "value": self.value, + "type": self.type, + } + + class ScimMeta(object): + """ + :ivar resource_type: Indicates the type of the resource + :ivar created: The date and time when the resource was created in the system + :ivar last_modified: The date and time when the resource was last modified + :ivar version: A version identifier for the resource. This can be used to manage resource versioning and concurrency control. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.resource_type: Optional[str] = payload.get("resource_type") + self.created: Optional[datetime] = payload.get("created") + self.last_modified: Optional[datetime] = payload.get("last_modified") + self.version: Optional[str] = payload.get("version") + + def to_dict(self): + return { + "resource_type": self.resource_type, + "created": self.created, + "last_modified": self.last_modified, + "version": self.version, + } + + class ScimName(object): + """ + :ivar given_name: The user's first or given name + :ivar family_name: The user's last or family name + """ + + def __init__(self, payload: Dict[str, Any]): + + self.given_name: Optional[str] = payload.get("given_name") + self.family_name: Optional[str] = payload.get("family_name") + + def to_dict(self): + return { + "given_name": self.given_name, + "family_name": self.family_name, + } + + class ScimUser(object): + """ + :ivar id: Unique Twilio user sid + :ivar external_id: External unique resource id defined by provisioning client + :ivar user_name: Unique username, MUST be same as primary email address + :ivar display_name: User friendly display name + :ivar name: + :ivar emails: Email address list of the user. Primary email must be defined if there are more than 1 email. Primary email must match the username. + :ivar active: Indicates whether the user is active + :ivar locale: User's locale + :ivar timezone: User's time zone + :ivar schemas: An array of URIs that indicate the schemas supported for this user resource + :ivar meta: + :ivar detail: A human-readable description of the error + :ivar scim_type: A scimType error code as defined in RFC7644 + :ivar status: Http status code + :ivar code: Twilio-specific error code + :ivar more_info: Link to Error Code References + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.external_id: Optional[str] = payload.get("external_id") + self.user_name: Optional[str] = payload.get("user_name") + self.display_name: Optional[str] = payload.get("display_name") + self.name: Optional[UserList.ScimName] = payload.get("name") + self.emails: Optional[List[UserList.ScimEmailAddress]] = payload.get( + "emails" + ) + self.active: Optional[bool] = payload.get("active") + self.locale: Optional[str] = payload.get("locale") + self.timezone: Optional[str] = payload.get("timezone") + self.schemas: Optional[List[str]] = payload.get("schemas") + self.meta: Optional[UserList.ScimMeta] = payload.get("meta") + self.detail: Optional[str] = payload.get("detail") + self.scim_type: Optional[str] = payload.get("scim_type") + self.status: Optional[str] = payload.get("status") + self.code: Optional[int] = payload.get("code") + self.more_info: Optional[str] = payload.get("more_info") + + def to_dict(self): + return { + "id": self.id, + "externalId": self.external_id, + "userName": self.user_name, + "displayName": self.display_name, + "name": self.name.to_dict() if self.name is not None else None, + "emails": ( + [emails.to_dict() for emails in self.emails] + if self.emails is not None + else None + ), + "active": self.active, + "locale": self.locale, + "timezone": self.timezone, + "schemas": self.schemas, + "meta": self.meta.to_dict() if self.meta is not None else None, + "detail": self.detail, + "scimType": self.scim_type, + "status": self.status, + "code": self.code, + "moreInfo": self.more_info, + } + + def __init__(self, version: Version, organization_sid: str, id: str): + """ + Initialize the UserContext + + :param version: Version that contains the resource + :param organization_sid: + :param id: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "organization_sid": organization_sid, + "id": id, + } + self._uri = "/{organization_sid}/scim/Users/{id}".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + headers["Accept"] = "application/scim+json" + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the UserInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + headers["Accept"] = "application/scim+json" + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> UserInstance: + """ + Fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/scim+json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return UserInstance( + self._version, + payload, + organization_sid=self._solution["organization_sid"], + id=self._solution["id"], + ) + + async def fetch_async(self) -> UserInstance: + """ + Asynchronous coroutine to fetch the UserInstance + + + :returns: The fetched UserInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/scim+json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return UserInstance( + self._version, + payload, + organization_sid=self._solution["organization_sid"], + id=self._solution["id"], + ) + + def update( + self, scim_user: ScimUser, if_match: Union[str, object] = values.unset + ) -> UserInstance: + """ + Update the UserInstance + + :param scim_user: + :param if_match: + + :returns: The updated UserInstance + """ + data = scim_user.to_dict() + + headers = values.of({}) + + if not ( + if_match is values.unset or (isinstance(if_match, str) and not if_match) + ): + headers["If-Match"] = if_match + + headers["Content-Type"] = "application/json" + + headers["Content-Type"] = "application/scim+json" + + headers["Accept"] = "application/scim+json" + + payload = self._version.update( + method="PUT", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + organization_sid=self._solution["organization_sid"], + id=self._solution["id"], + ) + + async def update_async( + self, scim_user: ScimUser, if_match: Union[str, object] = values.unset + ) -> UserInstance: + """ + Asynchronous coroutine to update the UserInstance + + :param scim_user: + :param if_match: + + :returns: The updated UserInstance + """ + data = scim_user.to_dict() + + headers = values.of({}) + + if not ( + if_match is values.unset or (isinstance(if_match, str) and not if_match) + ): + headers["If-Match"] = if_match + + headers["Content-Type"] = "application/json" + + headers["Content-Type"] = "application/scim+json" + + headers["Accept"] = "application/scim+json" + + payload = await self._version.update_async( + method="PUT", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, + payload, + organization_sid=self._solution["organization_sid"], + id=self._solution["id"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class UserPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> UserInstance: + """ + Build an instance of UserInstance + + :param payload: Payload response from the API + """ + return UserInstance( + self._version, payload, organization_sid=self._solution["organization_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class UserList(ListResource): + + class ScimEmailAddress(object): + """ + :ivar primary: Indicates if this email address is the primary one + :ivar value: The actual email address value + :ivar type: The type of email address (e.g., work, home, etc.) + """ + + def __init__(self, payload: Dict[str, Any]): + + self.primary: Optional[bool] = payload.get("primary") + self.value: Optional[str] = payload.get("value") + self.type: Optional[str] = payload.get("type") + + def to_dict(self): + return { + "primary": self.primary, + "value": self.value, + "type": self.type, + } + + class ScimMeta(object): + """ + :ivar resource_type: Indicates the type of the resource + :ivar created: The date and time when the resource was created in the system + :ivar last_modified: The date and time when the resource was last modified + :ivar version: A version identifier for the resource. This can be used to manage resource versioning and concurrency control. + """ + + def __init__(self, payload: Dict[str, Any]): + + self.resource_type: Optional[str] = payload.get("resource_type") + self.created: Optional[datetime] = payload.get("created") + self.last_modified: Optional[datetime] = payload.get("last_modified") + self.version: Optional[str] = payload.get("version") + + def to_dict(self): + return { + "resource_type": self.resource_type, + "created": self.created, + "last_modified": self.last_modified, + "version": self.version, + } + + class ScimName(object): + """ + :ivar given_name: The user's first or given name + :ivar family_name: The user's last or family name + """ + + def __init__(self, payload: Dict[str, Any]): + + self.given_name: Optional[str] = payload.get("given_name") + self.family_name: Optional[str] = payload.get("family_name") + + def to_dict(self): + return { + "given_name": self.given_name, + "family_name": self.family_name, + } + + class ScimUser(object): + """ + :ivar id: Unique Twilio user sid + :ivar external_id: External unique resource id defined by provisioning client + :ivar user_name: Unique username, MUST be same as primary email address + :ivar display_name: User friendly display name + :ivar name: + :ivar emails: Email address list of the user. Primary email must be defined if there are more than 1 email. Primary email must match the username. + :ivar active: Indicates whether the user is active + :ivar locale: User's locale + :ivar timezone: User's time zone + :ivar schemas: An array of URIs that indicate the schemas supported for this user resource + :ivar meta: + :ivar detail: A human-readable description of the error + :ivar scim_type: A scimType error code as defined in RFC7644 + :ivar status: Http status code + :ivar code: Twilio-specific error code + :ivar more_info: Link to Error Code References + """ + + def __init__(self, payload: Dict[str, Any]): + + self.id: Optional[str] = payload.get("id") + self.external_id: Optional[str] = payload.get("external_id") + self.user_name: Optional[str] = payload.get("user_name") + self.display_name: Optional[str] = payload.get("display_name") + self.name: Optional[UserList.ScimName] = payload.get("name") + self.emails: Optional[List[UserList.ScimEmailAddress]] = payload.get( + "emails" + ) + self.active: Optional[bool] = payload.get("active") + self.locale: Optional[str] = payload.get("locale") + self.timezone: Optional[str] = payload.get("timezone") + self.schemas: Optional[List[str]] = payload.get("schemas") + self.meta: Optional[UserList.ScimMeta] = payload.get("meta") + self.detail: Optional[str] = payload.get("detail") + self.scim_type: Optional[str] = payload.get("scim_type") + self.status: Optional[str] = payload.get("status") + self.code: Optional[int] = payload.get("code") + self.more_info: Optional[str] = payload.get("more_info") + + def to_dict(self): + return { + "id": self.id, + "externalId": self.external_id, + "userName": self.user_name, + "displayName": self.display_name, + "name": self.name.to_dict() if self.name is not None else None, + "emails": ( + [emails.to_dict() for emails in self.emails] + if self.emails is not None + else None + ), + "active": self.active, + "locale": self.locale, + "timezone": self.timezone, + "schemas": self.schemas, + "meta": self.meta.to_dict() if self.meta is not None else None, + "detail": self.detail, + "scimType": self.scim_type, + "status": self.status, + "code": self.code, + "moreInfo": self.more_info, + } + + def __init__(self, version: Version, organization_sid: str): + """ + Initialize the UserList + + :param version: Version that contains the resource + :param organization_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "organization_sid": organization_sid, + } + self._uri = "/{organization_sid}/scim/Users".format(**self._solution) + + def create(self, scim_user: ScimUser) -> UserInstance: + """ + Create the UserInstance + + :param scim_user: + + :returns: The created UserInstance + """ + data = scim_user.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Content-Type"] = "application/scim+json" + + headers["Accept"] = "application/scim+json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, organization_sid=self._solution["organization_sid"] + ) + + async def create_async(self, scim_user: ScimUser) -> UserInstance: + """ + Asynchronously create the UserInstance + + :param scim_user: + + :returns: The created UserInstance + """ + data = scim_user.to_dict() + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/json" + + headers["Content-Type"] = "application/scim+json" + + headers["Accept"] = "application/scim+json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return UserInstance( + self._version, payload, organization_sid=self._solution["organization_sid"] + ) + + def stream( + self, + filter: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[UserInstance]: + """ + Streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str filter: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(filter=filter, page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + filter: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[UserInstance]: + """ + Asynchronously streams UserInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str filter: + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(filter=filter, page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + filter: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str filter: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + filter=filter, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + filter: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[UserInstance]: + """ + Asynchronously lists UserInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str filter: + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + filter=filter, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + filter: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param filter: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "filter": filter, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/scim+json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + async def page_async( + self, + filter: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> UserPage: + """ + Asynchronously retrieve a single page of UserInstance records from the API. + Request is executed immediately + + :param filter: + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of UserInstance + """ + data = values.of( + { + "filter": filter, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/scim+json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return UserPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> UserPage: + """ + Retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return UserPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> UserPage: + """ + Asynchronously retrieve a specific page of UserInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of UserInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return UserPage(self._version, response, self._solution) + + def get(self, id: str) -> UserContext: + """ + Constructs a UserContext + + :param id: + """ + return UserContext( + self._version, organization_sid=self._solution["organization_sid"], id=id + ) + + def __call__(self, id: str) -> UserContext: + """ + Constructs a UserContext + + :param id: + """ + return UserContext( + self._version, organization_sid=self._solution["organization_sid"], id=id + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/PricingBase.py b/venv/Lib/site-packages/twilio/rest/pricing/PricingBase.py new file mode 100644 index 00000000..cf624e18 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/PricingBase.py @@ -0,0 +1,55 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.pricing.v1 import V1 +from twilio.rest.pricing.v2 import V2 + + +class PricingBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Pricing Domain + + :returns: Domain for Pricing + """ + super().__init__(twilio, "https://pricing.twilio.com") + self._v1: Optional[V1] = None + self._v2: Optional[V2] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Pricing + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + @property + def v2(self) -> V2: + """ + :returns: Versions v2 of Pricing + """ + if self._v2 is None: + self._v2 = V2(self) + return self._v2 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/__init__.py b/venv/Lib/site-packages/twilio/rest/pricing/__init__.py new file mode 100644 index 00000000..91da8751 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/__init__.py @@ -0,0 +1,55 @@ +from warnings import warn + +from twilio.rest.pricing.PricingBase import PricingBase +from twilio.rest.pricing.v1.messaging import MessagingList +from twilio.rest.pricing.v1.phone_number import PhoneNumberList +from twilio.rest.pricing.v2.country import CountryList +from twilio.rest.pricing.v2.number import NumberList +from twilio.rest.pricing.v2.voice import VoiceList + + +class Pricing(PricingBase): + @property + def messaging(self) -> MessagingList: + warn( + "messaging is deprecated. Use v1.messaging instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.messaging + + @property + def phone_numbers(self) -> PhoneNumberList: + warn( + "phone_numbers is deprecated. Use v1.phone_numbers instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.phone_numbers + + @property + def voice(self) -> VoiceList: + warn( + "voice is deprecated. Use v2.voice instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.voice + + @property + def countries(self) -> CountryList: + warn( + "countries is deprecated. Use v2.countries instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.countries + + @property + def numbers(self) -> NumberList: + warn( + "numbers is deprecated. Use v2.numbers instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v2.numbers diff --git a/venv/Lib/site-packages/twilio/rest/pricing/__pycache__/PricingBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/__pycache__/PricingBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8273227ccb7a20428aca90a7d2ab8533fbd16a3 GIT binary patch literal 2346 zcmd57O>Y}TbauU7ubofYDh;KeX+nyOR9o?>ib_S>pb`O1fwYH}(XiPaH%r&M%k0LD zEgy1-L?X3nC4`bI$11;pU%;gx4%LdD5C?7nH=^o^_h#2l+E8(2Y`=M5^X7fc^N%AV zB?9Z-&tID?zxq2pS+r%LzaTG`Ol%{H`3gS60*VIf+;+mIl>ZUI7yjN%% zrXg|ND>h4JNg*n^N}R$5aSX2Q=2FwG#!lqg+VaU*I64ySjlh~DBp7go$2 zy4(gKV~ierC@_%407-XA93?ZYREqlPPo4s+w2R;VN79l5im8M#6iN~Sp6=H1fW#Q9 zB9<9R+10*T)|F>d%}fn$OD&=CmF3}?HH3UBIq{x`8 zCSwu0P3ih`^U7TPM#M!_|7c-hsXou6+i?)qTY+oyOVAr}y~X`j{bP5z9=S0;7h3jh z>lTmdsRvcTqqv%RRn7dyd{@G@7=b%FCk`|F4o-k1ng;M}oje^T#nG+8PsZfV#G^Cs z{bF2vd}d}-yKBhpp3ws}lIUrkY?u&(g)!i-_Zfg~(j{LFLT9j~&0iwzal7CXR#J|0)NySL9#} z92ErwveqwTp!QM*YGu@$L~tZNV5T+3x4KQ*N?GmjK~=7cpyk5 zBs8vt(`lf2P`^(sd&Twnf1c=!Us#eOqmq^D;=`lCz>~uZ8GE_UQ*I5MjxYI`GgW96fmtt+?GuxPNG1j_7q@AE{cVC z6S0x(dE4Cc7%MB{HQ>tTdtWx6DB?*3Cs6PyfM*+IPc!mocUt=dw!ITXAKg>+{N#hn ze-YSvxjtiWypR2hD4(C&nf{x=CL@%0Tq_SJ1;(7fhS2o59l|6Q_!N_4+4Ne*IpN5G zD6qWAP$s~kBI8dc4sj}BHvC$%G7+y3*3#U_SWko1)FXU+&y5Rdt}lvrfyADS-T|I;imMu`@D(TRW{iyR zRY!BPMppP~C+Fskyznzl!7Um^iOA#=Vrd)1%F@)mR5+e7)z8)P53o^_0%f(yJb34? zGP`Aa%O5v6g=X<{%6W4cfGall0VrL)+4ksC*S$_z1m!QbyPnVbQ8RZSnEj@0wDmP?H-casEd_xsz8qib%%?MNjR7s$)KIkC_sG30Y z0xbZVPN2nprltj%Xu(06QNPQ)mXw$$rUs`v`~u7t@#B~!`SOTo$-l;;O5}TTOBqG> z-?t#?Pd{IhnzFQ3cSj0WZC^aWC+l!l`qE<65duu3cPgz(9;QKD&JRtHveD zSNwLT(Zj5Lv`js}(W73kamBvg;I>a+@4$%7Wy%}=s_oeA1xC5Q&eJM#<*(a^%>_JFA}E? z((3^C6jBqKeL7yVx%;KL9c_-C0s6Dn>{U@PW3{U5QS3;Kpi1k3Dwv0)DWf#Sku-uc zgOZ#B6P3|B<0QFrd-L{=HvL=#skg+TXw&fpRM!*nBZXnpu*x7C(+{arL3QGd7V};K zn4L!RJnBI|YWLLlqyJ;+nW(En3!lY>mquj~vEBeMSr`|_7RLJK`i?dulv%1x1)6Dk zO_!QxkTXrUZFL>=3#R#9x9LO?t;5 MessagingList: + if self._messaging is None: + self._messaging = MessagingList(self) + return self._messaging + + @property + def phone_numbers(self) -> PhoneNumberList: + if self._phone_numbers is None: + self._phone_numbers = PhoneNumberList(self) + return self._phone_numbers + + @property + def voice(self) -> VoiceList: + if self._voice is None: + self._voice = VoiceList(self) + return self._voice + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6986be7d75f9b8abbc0dd6149b6a33dab60fab6a GIT binary patch literal 2777 zcmc&$&2JM&6rWvxtv?c{ghESb*d_$zB5d4BMGap?4MGu+M3ClSxteaglVr=<>&|XW zZ6c9Fq&gCaUMeE>!m%iq{vW-Bf<&|;Ql*~SQ`&%vIQ6}m^Z_Rag4ncsVF z-uTC!o)m%S)=!@=Tuc!13l2I@EMRu#fVo3VQX-~esrKsSecB~pN z#RVU;6IHFG2|jKotEo~-@CiFz&6F|P#KHEe!rBr|MLjj5?I*P9(uM7jLE)$#w-6$2SF6sJG_yaKx z-~|(@p%f)zhy<5hDuYCFlopT+CXwPoI4@li&eAlngURKTXpGy1;b%y2!E$F_UB@-# z+p#aFWSFj5w&mzY^(k&utlGR3V(j4c7MNaNoVBfrJ}vDopSv=xpPd@dOYe!v>2sq& zsBOa)PR63=ycBPJvd(JYqo0>aaClywqELLY34@Ais$Eq+KRAfm>8q^or;V}LhDw&az0@bXV3X9CCZ88T{y^<+K zSRhSsBXgBw*{?ikC11?7{k%OVR@p@XkBiW9k* zA9EM$jQbj;7A#1qpQ6=H-uzx#$CS~U$eHWMX#?|>i}+EO*>gM%8~2lxiW;HRMP$0Z z{JiwZX!%nYwp+e1K0aL@WA0VYsh5TGS*SU$++ejv`Jy#jb}f$`ts9lA#yoS&o+$YO zXRcQWHeP5H3!Tm7>rI}8HCpMJV!k7M8wBoqK%Om=CmE9LT}|BA-dfvpclSf>(B=on z+tHiZ&5usCqYt%#%_D_&^j3NYtcf4z%vO>IJjh=Y=_3 zBI|)aWt2Z{ZLB0pf{!3IGQvkT$fDeZ|iST_ux>5DK zR7b5oK=zUZ)8`%rBG5fb58h7?Zln)A9xDED@WIgW_SnPB0RZ?YJ9Ixgw4n|CZxDAO zIt|I+A;v^?w={qzxMK+E-43MNCst2vqz51G8@@aCT>X(elf>mSx>e1>y zDX*P;a5?2?il^_riWd3>u1RTd6y@MU*shBOuuQg7q;EtZ%Vn{<)Ql<<-Gx>ibJ0dV zL+O`rsYngS|1RQi`&ymD{lvYdI3s)j6{4!%K~4n!0C0Z9^*F~P;r9eBsKRWU(wxF~ zgH+Vt$Kq6R{L3WBUR2mXo~@AWXfk$et?`t=XL}Ec_in3^*nzcEe-QZWL^=XMB2~j{ zH&8Vks)j?=z&A})4TP$J?Nlr_vNrrDfsY7-Sbiec>nA8RoeJQOd(ArBjvRZ5-!EHV ze%5eVKIrru)9>%<*2o4gg5~Rh0=s3W&F33kJwwFLAAXHl_W=~~_4mKVQq;2yya*&# zwZw!i>$!GPrt~z&n#W!y+VOToQIy}+j1qmipD6pc$l)zAvPDL>$eAtj{*(AYWu(3L JDS?le>n~ourIP>v literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/__init__.py b/venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/__init__.py new file mode 100644 index 00000000..df5c148b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/__init__.py @@ -0,0 +1,54 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.pricing.v1.messaging.country import CountryList + + +class MessagingList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the MessagingList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Messaging" + + self._countries: Optional[CountryList] = None + + @property + def countries(self) -> CountryList: + """ + Access the countries + """ + if self._countries is None: + self._countries = CountryList(self._version) + return self._countries + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08ff0e70e0005bf1edcecac19b2a8fbc66f00b48 GIT binary patch literal 2221 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 PIq}f>A^Z|V?y~vc-JLLY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/country.py b/venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/country.py new file mode 100644 index 00000000..49360cd8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v1/messaging/country.py @@ -0,0 +1,415 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CountryInstance(InstanceResource): + """ + :ivar country: The name of the country. + :ivar iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). + :ivar outbound_sms_prices: The list of [OutboundSMSPrice](https://www.twilio.com/docs/sms/api/pricing#outbound-sms-price) records that represent the price to send a message for each MCC/MNC applicable in this country. + :ivar inbound_sms_prices: The list of [InboundPrice](https://www.twilio.com/docs/sms/api/pricing#inbound-price) records that describe the price to receive an inbound SMS to the different Twilio phone number types supported in this country + :ivar price_unit: The currency in which prices are measured, specified in [ISO 4127](http://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g. `usd`, `eur`, `jpy`). + :ivar url: The absolute URL of the resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + iso_country: Optional[str] = None, + ): + super().__init__(version) + + self.country: Optional[str] = payload.get("country") + self.iso_country: Optional[str] = payload.get("iso_country") + self.outbound_sms_prices: Optional[List[str]] = payload.get( + "outbound_sms_prices" + ) + self.inbound_sms_prices: Optional[List[str]] = payload.get("inbound_sms_prices") + self.price_unit: Optional[str] = payload.get("price_unit") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "iso_country": iso_country or self.iso_country, + } + self._context: Optional[CountryContext] = None + + @property + def _proxy(self) -> "CountryContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CountryContext for this CountryInstance + """ + if self._context is None: + self._context = CountryContext( + self._version, + iso_country=self._solution["iso_country"], + ) + return self._context + + def fetch(self) -> "CountryInstance": + """ + Fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CountryInstance": + """ + Asynchronous coroutine to fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CountryContext(InstanceContext): + + def __init__(self, version: Version, iso_country: str): + """ + Initialize the CountryContext + + :param version: Version that contains the resource + :param iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "iso_country": iso_country, + } + self._uri = "/Messaging/Countries/{iso_country}".format(**self._solution) + + def fetch(self) -> CountryInstance: + """ + Fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CountryInstance( + self._version, + payload, + iso_country=self._solution["iso_country"], + ) + + async def fetch_async(self) -> CountryInstance: + """ + Asynchronous coroutine to fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CountryInstance( + self._version, + payload, + iso_country=self._solution["iso_country"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CountryPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CountryInstance: + """ + Build an instance of CountryInstance + + :param payload: Payload response from the API + """ + return CountryInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CountryList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CountryList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Messaging/Countries" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CountryInstance]: + """ + Streams CountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CountryInstance]: + """ + Asynchronously streams CountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CountryInstance]: + """ + Lists CountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CountryInstance]: + """ + Asynchronously lists CountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CountryPage: + """ + Retrieve a single page of CountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CountryPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CountryPage: + """ + Asynchronously retrieve a single page of CountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CountryPage(self._version, response) + + def get_page(self, target_url: str) -> CountryPage: + """ + Retrieve a specific page of CountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CountryInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CountryPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CountryPage: + """ + Asynchronously retrieve a specific page of CountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CountryInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CountryPage(self._version, response) + + def get(self, iso_country: str) -> CountryContext: + """ + Constructs a CountryContext + + :param iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + """ + return CountryContext(self._version, iso_country=iso_country) + + def __call__(self, iso_country: str) -> CountryContext: + """ + Constructs a CountryContext + + :param iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + """ + return CountryContext(self._version, iso_country=iso_country) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/__init__.py b/venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/__init__.py new file mode 100644 index 00000000..429ce9b1 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/__init__.py @@ -0,0 +1,54 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.pricing.v1.phone_number.country import CountryList + + +class PhoneNumberList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the PhoneNumberList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/PhoneNumbers" + + self._countries: Optional[CountryList] = None + + @property + def countries(self) -> CountryList: + """ + Access the countries + """ + if self._countries is None: + self._countries = CountryList(self._version) + return self._countries + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..964d1476ae61c8a0b58c1d37199af75032d88cb5 GIT binary patch literal 2242 zcmZ`)&2Jk;6rZ)%pK(5*h^AE)28voNlr<4bg-q2CwWW$ENz{fOETdtwJC2vGcbD0< zi!DpdArgtys$5Wd!~d*koM z$BP8UogY4JKFkpE8*T;z_Hyhl!n93nQX{rzr(CU-s--ksr`>c*ujz8FyO~zDmX+&_ zn``B3d5xsVWnyPHh@Ip5gS2v2D|GYag88RLNRh%=X*wabe4EpoW=Pk#$AuYjo33_I z%owB3Kgd89Lqj<$@}F&@HKKxk(2Oy8YM;{n@B?hzz!y}MgfZmEEfPGkUk8p_F;>A< z;zY44L%*yqjg@Mm2hNpCRK{>&`w0>}us-lhDW0Le1O0kYrRk>QIzFAH%fhi7Z%r{V zckqpxoCfVx*Rkk|(z|-;+6q0tykIEn#if-?)g;xf8A>Cw9r^q6O_u`hfepQ^ir@=F zp3;n>Agop@K8Vf0nN4a0;)q*KsdCY$o*z+eJCO{=l83ZRuWh<+*C_shwJ&RNekq6? z-!olUm##Qrbd`sGTUZ?Sx$9hnAcW=E1;6b@qKg`qf{mgHhRE&*u>TTJ$w^HEWTtG5 zryHqF(g1{RlxjN9*lC_^q-=dde~@^n<$#w5US>nD6*kEiTCI4El(X^Va?|(tV!O4< z1s)maIw}+^HF7wfjlbPK)&)_<6udRPS)FQ@`S@);dFxPlkk0eYh5NA{g z6rwAgxk`YAV4kc*We}GUbVUgc>`jl{0PAE7G>(Eaq(GjolP43TFtL^UK0kf$@K5>I zAHQ;ZQ@>q!JU73o-=duiAi9DcnvCELRn#G z+dFbFSwqoDGapt|vi?^44o;-B-*4C{@ z`5EytDDTS_>{Tyd3bsjCE2nymVYth}?>O+Fo3tSu?%8ga3LZeM0T3qk|8rPYRVl(M z{m8VMj>rGk1RDTH@Azr;#u>>=Xk4E&4&3$3eIj0k$VO8GFvlPmdl8J3NcXiE{D2?-hfR|E4U0E)17zA-TjD$dx z#^Xs7S=@CQD{Ep3xH8UjvVwh4;VXB+06XCfmWy$YG26Ew>TJ{v;O|2qj^iV$4UJVZf}x1w-X6Au#q&d(U~(w8`w~YOY$J^bp*W1tjfDS%b!-+JR?qk0C61R oVkfO>+Fz-Xrtcji+OfSX(cb-)ocx_!c#@sb=D%|H2u#w?zXuUgq5uE@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/__pycache__/country.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/__pycache__/country.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b17aaf89e4c0c27cbe4452d5b6d5353fab78dabc GIT binary patch literal 18418 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/country.py b/venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/country.py new file mode 100644 index 00000000..2d11cd1c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v1/phone_number/country.py @@ -0,0 +1,413 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CountryInstance(InstanceResource): + """ + :ivar country: The name of the country. + :ivar iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). + :ivar phone_number_prices: The list of [PhoneNumberPrice](https://www.twilio.com/docs/phone-numbers/pricing#phone-number-price) records. + :ivar price_unit: The currency in which prices are measured, specified in [ISO 4127](http://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g. `usd`, `eur`, `jpy`). + :ivar url: The absolute URL of the resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + iso_country: Optional[str] = None, + ): + super().__init__(version) + + self.country: Optional[str] = payload.get("country") + self.iso_country: Optional[str] = payload.get("iso_country") + self.phone_number_prices: Optional[List[str]] = payload.get( + "phone_number_prices" + ) + self.price_unit: Optional[str] = payload.get("price_unit") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "iso_country": iso_country or self.iso_country, + } + self._context: Optional[CountryContext] = None + + @property + def _proxy(self) -> "CountryContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CountryContext for this CountryInstance + """ + if self._context is None: + self._context = CountryContext( + self._version, + iso_country=self._solution["iso_country"], + ) + return self._context + + def fetch(self) -> "CountryInstance": + """ + Fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CountryInstance": + """ + Asynchronous coroutine to fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CountryContext(InstanceContext): + + def __init__(self, version: Version, iso_country: str): + """ + Initialize the CountryContext + + :param version: Version that contains the resource + :param iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "iso_country": iso_country, + } + self._uri = "/PhoneNumbers/Countries/{iso_country}".format(**self._solution) + + def fetch(self) -> CountryInstance: + """ + Fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CountryInstance( + self._version, + payload, + iso_country=self._solution["iso_country"], + ) + + async def fetch_async(self) -> CountryInstance: + """ + Asynchronous coroutine to fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CountryInstance( + self._version, + payload, + iso_country=self._solution["iso_country"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CountryPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CountryInstance: + """ + Build an instance of CountryInstance + + :param payload: Payload response from the API + """ + return CountryInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CountryList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CountryList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/PhoneNumbers/Countries" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CountryInstance]: + """ + Streams CountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CountryInstance]: + """ + Asynchronously streams CountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CountryInstance]: + """ + Lists CountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CountryInstance]: + """ + Asynchronously lists CountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CountryPage: + """ + Retrieve a single page of CountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CountryPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CountryPage: + """ + Asynchronously retrieve a single page of CountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CountryPage(self._version, response) + + def get_page(self, target_url: str) -> CountryPage: + """ + Retrieve a specific page of CountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CountryInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CountryPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CountryPage: + """ + Asynchronously retrieve a specific page of CountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CountryInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CountryPage(self._version, response) + + def get(self, iso_country: str) -> CountryContext: + """ + Constructs a CountryContext + + :param iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + """ + return CountryContext(self._version, iso_country=iso_country) + + def __call__(self, iso_country: str) -> CountryContext: + """ + Constructs a CountryContext + + :param iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + """ + return CountryContext(self._version, iso_country=iso_country) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__init__.py b/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__init__.py new file mode 100644 index 00000000..a801a300 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__init__.py @@ -0,0 +1,65 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.pricing.v1.voice.country import CountryList +from twilio.rest.pricing.v1.voice.number import NumberList + + +class VoiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the VoiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Voice" + + self._countries: Optional[CountryList] = None + self._numbers: Optional[NumberList] = None + + @property + def countries(self) -> CountryList: + """ + Access the countries + """ + if self._countries is None: + self._countries = CountryList(self._version) + return self._countries + + @property + def numbers(self) -> NumberList: + """ + Access the numbers + """ + if self._numbers is None: + self._numbers = NumberList(self._version) + return self._numbers + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40a3974b9f5dc877d85cb93de8167975b12220b2 GIT binary patch literal 2629 zcmd5;&2JM&6rZ)%pK(YaNPN^uw*>)Km9+vws?1jrAQTl63MmK6)v(!}kS*(7cXn-R z%Mm$5Y9fK?rAm(U)FKZ3LwZR|4|D|*Qq@CyavP!|PJM4?y$Pc2x$Di_H}7j^e($}R zd_OptC-B_+@y7hmX+nO%LH|ib%tjTMRbr7Uu@o!eDD^}&p&*}hl6AGJ3SMj5Y z_>_~WXRBGkr=46qU(G8dK`s(2vqY>cQy(Q|?CL-}SIQf|D}>}VcxL8pUo$<6X}1ku zyUAR}jeuF&Y#Y^-Qf=#p0u)hn6kkc+7)DmxOfU|*Q7UHbYFan`ffxtyf{D~niV`tI zf>U;DAdwuUW#pnDQe2MX(ynlprjZ>4mm$#@mkYyBkl=*1eq2q%Ipo{7ujM67w{6Gv zv~leUw@uro zHr-$@_-Gep5}VF;aAFK57b7(9*=Sa>VTQ^!sNWCxn7_#%MQe1OfgB_aGQqX zwDtUNnER3vW~Up0?YV{neBqMq2UnTzHMz-PoVm`p4@zJM&UsBY;BB;kVScJvpJg0J zrYs^!qlzLMH5h*Z^~y+9ftpQN3QNuA8fZE~$^A2-S>`Wt@om1KV)y4iiAftCD#}i%P@b zMqP^*S9dx@|z9D!z`sX%t>je(k8dVJT*mf zZ03W`6`Ao%$x!u~Gsp3033HT+0-)5#O=;TVs~hJkwU2$kt@h#MK6f|JQn_QEGRssb4WB8Cibjp zGH6|F_BaKxvXtaQ5RSu%P9QH)_8%&ICkTAphQ>!wmy3NnBU@<2!V;Pv0kTMXc~Tg@ ze`e*(`oOzS$4cKG{BHc=_~Wtnm(Smwelj$2|IW&t_3Rkm4aWZioDRlNY{Mxk&sYU0 z4a0JI2FV^Idx30+Clk4Jc5ZLI6!k5p;=g2 zSkD&Uga#tWQv&N^m9&*oqB9q-?h5x>He7^;Hpgw|T25QztO2DD{bAs_xz(r@S)YDI zyKI>Aw#)w21uF-i≥bH|Ws~qF-aE&^H<04OK-Lskw@&!sigR4MlIR2L*`ZdfpINT~cXp6e#`%ocrgIyaY{ebf^ z+j|w=#gOLUgIz2k*^wxyl!V^-L?I}?T5B#U8ELMr4 zKxGsr7TFO`HSvk$$0|g!oKK6VssVK@HiGreT7Ku{aOcUkUGjjM>a`G9eyhtBW N%3l^X34BDTzX3`NmLLEC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__pycache__/country.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__pycache__/country.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bd8bee65adbcf0bf28d252857b7efe4b3454db8 GIT binary patch literal 18680 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 G=6?eNiTf4+ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__pycache__/number.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/__pycache__/number.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4692f5d2435b59b5c8fb80c8e9694b84ae1d1e3 GIT binary patch literal 8399 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 "CountryContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CountryContext for this CountryInstance + """ + if self._context is None: + self._context = CountryContext( + self._version, + iso_country=self._solution["iso_country"], + ) + return self._context + + def fetch(self) -> "CountryInstance": + """ + Fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CountryInstance": + """ + Asynchronous coroutine to fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CountryContext(InstanceContext): + + def __init__(self, version: Version, iso_country: str): + """ + Initialize the CountryContext + + :param version: Version that contains the resource + :param iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "iso_country": iso_country, + } + self._uri = "/Voice/Countries/{iso_country}".format(**self._solution) + + def fetch(self) -> CountryInstance: + """ + Fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CountryInstance( + self._version, + payload, + iso_country=self._solution["iso_country"], + ) + + async def fetch_async(self) -> CountryInstance: + """ + Asynchronous coroutine to fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CountryInstance( + self._version, + payload, + iso_country=self._solution["iso_country"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CountryPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CountryInstance: + """ + Build an instance of CountryInstance + + :param payload: Payload response from the API + """ + return CountryInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CountryList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CountryList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Voice/Countries" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CountryInstance]: + """ + Streams CountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CountryInstance]: + """ + Asynchronously streams CountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CountryInstance]: + """ + Lists CountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CountryInstance]: + """ + Asynchronously lists CountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CountryPage: + """ + Retrieve a single page of CountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CountryPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CountryPage: + """ + Asynchronously retrieve a single page of CountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CountryPage(self._version, response) + + def get_page(self, target_url: str) -> CountryPage: + """ + Retrieve a specific page of CountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CountryInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CountryPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CountryPage: + """ + Asynchronously retrieve a specific page of CountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CountryInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CountryPage(self._version, response) + + def get(self, iso_country: str) -> CountryContext: + """ + Constructs a CountryContext + + :param iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + """ + return CountryContext(self._version, iso_country=iso_country) + + def __call__(self, iso_country: str) -> CountryContext: + """ + Constructs a CountryContext + + :param iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + """ + return CountryContext(self._version, iso_country=iso_country) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/number.py b/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/number.py new file mode 100644 index 00000000..5bff8cd5 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v1/voice/number.py @@ -0,0 +1,197 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class NumberInstance(InstanceResource): + """ + :ivar number: The phone number. + :ivar country: The name of the country. + :ivar iso_country: The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). + :ivar outbound_call_price: + :ivar inbound_call_price: + :ivar price_unit: The currency in which prices are measured, specified in [ISO 4127](http://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g. `usd`, `eur`, `jpy`). + :ivar url: The absolute URL of the resource. + """ + + def __init__( + self, version: Version, payload: Dict[str, Any], number: Optional[str] = None + ): + super().__init__(version) + + self.number: Optional[str] = payload.get("number") + self.country: Optional[str] = payload.get("country") + self.iso_country: Optional[str] = payload.get("iso_country") + self.outbound_call_price: Optional[str] = payload.get("outbound_call_price") + self.inbound_call_price: Optional[str] = payload.get("inbound_call_price") + self.price_unit: Optional[str] = payload.get("price_unit") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "number": number or self.number, + } + self._context: Optional[NumberContext] = None + + @property + def _proxy(self) -> "NumberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: NumberContext for this NumberInstance + """ + if self._context is None: + self._context = NumberContext( + self._version, + number=self._solution["number"], + ) + return self._context + + def fetch(self) -> "NumberInstance": + """ + Fetch the NumberInstance + + + :returns: The fetched NumberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "NumberInstance": + """ + Asynchronous coroutine to fetch the NumberInstance + + + :returns: The fetched NumberInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NumberContext(InstanceContext): + + def __init__(self, version: Version, number: str): + """ + Initialize the NumberContext + + :param version: Version that contains the resource + :param number: The phone number to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "number": number, + } + self._uri = "/Voice/Numbers/{number}".format(**self._solution) + + def fetch(self) -> NumberInstance: + """ + Fetch the NumberInstance + + + :returns: The fetched NumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return NumberInstance( + self._version, + payload, + number=self._solution["number"], + ) + + async def fetch_async(self) -> NumberInstance: + """ + Asynchronous coroutine to fetch the NumberInstance + + + :returns: The fetched NumberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return NumberInstance( + self._version, + payload, + number=self._solution["number"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NumberList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the NumberList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, number: str) -> NumberContext: + """ + Constructs a NumberContext + + :param number: The phone number to fetch. + """ + return NumberContext(self._version, number=number) + + def __call__(self, number: str) -> NumberContext: + """ + Constructs a NumberContext + + :param number: The phone number to fetch. + """ + return NumberContext(self._version, number=number) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/__init__.py b/venv/Lib/site-packages/twilio/rest/pricing/v2/__init__.py new file mode 100644 index 00000000..d0fd67f7 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v2/__init__.py @@ -0,0 +1,59 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.pricing.v2.country import CountryList +from twilio.rest.pricing.v2.number import NumberList +from twilio.rest.pricing.v2.voice import VoiceList + + +class V2(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V2 version of Pricing + + :param domain: The Twilio.pricing domain + """ + super().__init__(domain, "v2") + self._countries: Optional[CountryList] = None + self._numbers: Optional[NumberList] = None + self._voice: Optional[VoiceList] = None + + @property + def countries(self) -> CountryList: + if self._countries is None: + self._countries = CountryList(self) + return self._countries + + @property + def numbers(self) -> NumberList: + if self._numbers is None: + self._numbers = NumberList(self) + return self._numbers + + @property + def voice(self) -> VoiceList: + if self._voice is None: + self._voice = VoiceList(self) + return self._voice + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af85e989b2eafd926c4cc934fbd45f5cf26c3096 GIT binary patch literal 2738 zcmc&0OK%fLcy|3-Kax;Fq0Nge5GuFDrdG=#yov}y5s*ZX=3u#+ZoFf%W$krm*QPc` z}#d6Y2$Z=kdzK%Zqah}vSTv+ zrs3+>S&ebSW2U~)LNTROfAK>GvM3sgS%R0yKx>x@u7hTjid{Rp-U)xeMgl%ikrGOg zBS-|eWv2ujiBXzIELcRc^WnO*BaEeLpa+Y~B~clV3*=`AaKln>U0ugLwyhi9^le&1wr+^lQLXUjFy^>v}N$IoTh4)XBoEDW+MLc z1-&Vwt2>pjWJIb^d!lY|qpHgjV_mSIZgO>5U4bYx@YQBvIvew2Zllh)uTg5jhLrj# zS{4bjmEJX%jP*jrdWQ*%h9KBl}58MOjelqEEWM^t^a}qV%Z?2Q6Kinwl$3 zGWUk()Jwwn9F&McG1 zd$iN@gkXJVyh4Nz0od(TA}FAC3VaIi_fY4BN2j}|H`4m! zk)sd1M**N@QTiIr)j|}YUmYiv6^YObk6E+FIqMBuNLjWQ}SKO1+PzTzHsK@%lU)8fO}FJTs%pffaAKD?Hk|$86Y$XDIy=UJWVX_~%4iWnZgvc!0Rq5?6u`qd*kVC}JY` z2LbaVuE#mni{BSCoHDa*O0x>z2V7BZpNLDu@jsCO2T))Gc(zQoqsiFuwdPX-)AoK6 z@84DA7}Frt%EOTE~{<;uYSGD2nojno*)pM~E`A eMc&;a<6Gp!7Wrt46rRM7DB~*!o)VbET7Ltjke0^) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/__pycache__/country.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v2/__pycache__/country.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2502243b4b32266fffa5e4db48fe4e7d3c18169c GIT binary patch literal 18704 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 C2nB@z literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/__pycache__/number.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v2/__pycache__/number.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4661c3a5de0a96886855c0e631fb87264134370e GIT binary patch literal 10558 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 LzU1IW_x!&BW)>H# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/country.py b/venv/Lib/site-packages/twilio/rest/pricing/v2/country.py new file mode 100644 index 00000000..30672235 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v2/country.py @@ -0,0 +1,417 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CountryInstance(InstanceResource): + """ + :ivar country: The name of the country. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). + :ivar terminating_prefix_prices: The list of [TerminatingPrefixPrice](https://www.twilio.com/docs/voice/pricing#outbound-prefix-price-with-origin) records. + :ivar originating_call_prices: The list of [OriginatingCallPrice](https://www.twilio.com/docs/voice/pricing#inbound-call-price) records. + :ivar price_unit: The currency in which prices are measured, specified in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g. `usd`, `eur`, `jpy`). + :ivar url: The absolute URL of the resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + iso_country: Optional[str] = None, + ): + super().__init__(version) + + self.country: Optional[str] = payload.get("country") + self.iso_country: Optional[str] = payload.get("iso_country") + self.terminating_prefix_prices: Optional[List[str]] = payload.get( + "terminating_prefix_prices" + ) + self.originating_call_prices: Optional[List[str]] = payload.get( + "originating_call_prices" + ) + self.price_unit: Optional[str] = payload.get("price_unit") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "iso_country": iso_country or self.iso_country, + } + self._context: Optional[CountryContext] = None + + @property + def _proxy(self) -> "CountryContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CountryContext for this CountryInstance + """ + if self._context is None: + self._context = CountryContext( + self._version, + iso_country=self._solution["iso_country"], + ) + return self._context + + def fetch(self) -> "CountryInstance": + """ + Fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CountryInstance": + """ + Asynchronous coroutine to fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CountryContext(InstanceContext): + + def __init__(self, version: Version, iso_country: str): + """ + Initialize the CountryContext + + :param version: Version that contains the resource + :param iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the origin-based voice pricing information to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "iso_country": iso_country, + } + self._uri = "/Trunking/Countries/{iso_country}".format(**self._solution) + + def fetch(self) -> CountryInstance: + """ + Fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CountryInstance( + self._version, + payload, + iso_country=self._solution["iso_country"], + ) + + async def fetch_async(self) -> CountryInstance: + """ + Asynchronous coroutine to fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CountryInstance( + self._version, + payload, + iso_country=self._solution["iso_country"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CountryPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CountryInstance: + """ + Build an instance of CountryInstance + + :param payload: Payload response from the API + """ + return CountryInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CountryList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CountryList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Trunking/Countries" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CountryInstance]: + """ + Streams CountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CountryInstance]: + """ + Asynchronously streams CountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CountryInstance]: + """ + Lists CountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CountryInstance]: + """ + Asynchronously lists CountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CountryPage: + """ + Retrieve a single page of CountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CountryPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CountryPage: + """ + Asynchronously retrieve a single page of CountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CountryPage(self._version, response) + + def get_page(self, target_url: str) -> CountryPage: + """ + Retrieve a specific page of CountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CountryInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CountryPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CountryPage: + """ + Asynchronously retrieve a specific page of CountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CountryInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CountryPage(self._version, response) + + def get(self, iso_country: str) -> CountryContext: + """ + Constructs a CountryContext + + :param iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the origin-based voice pricing information to fetch. + """ + return CountryContext(self._version, iso_country=iso_country) + + def __call__(self, iso_country: str) -> CountryContext: + """ + Constructs a CountryContext + + :param iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the origin-based voice pricing information to fetch. + """ + return CountryContext(self._version, iso_country=iso_country) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/number.py b/venv/Lib/site-packages/twilio/rest/pricing/v2/number.py new file mode 100644 index 00000000..1dead393 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v2/number.py @@ -0,0 +1,236 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class NumberInstance(InstanceResource): + """ + :ivar destination_number: The destination phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar origination_number: The origination phone number in [[E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar country: The name of the country. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) + :ivar terminating_prefix_prices: + :ivar originating_call_price: + :ivar price_unit: The currency in which prices are measured, specified in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g. `usd`, `eur`, `jpy`). + :ivar url: The absolute URL of the resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + destination_number: Optional[str] = None, + ): + super().__init__(version) + + self.destination_number: Optional[str] = payload.get("destination_number") + self.origination_number: Optional[str] = payload.get("origination_number") + self.country: Optional[str] = payload.get("country") + self.iso_country: Optional[str] = payload.get("iso_country") + self.terminating_prefix_prices: Optional[List[str]] = payload.get( + "terminating_prefix_prices" + ) + self.originating_call_price: Optional[str] = payload.get( + "originating_call_price" + ) + self.price_unit: Optional[str] = payload.get("price_unit") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "destination_number": destination_number or self.destination_number, + } + self._context: Optional[NumberContext] = None + + @property + def _proxy(self) -> "NumberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: NumberContext for this NumberInstance + """ + if self._context is None: + self._context = NumberContext( + self._version, + destination_number=self._solution["destination_number"], + ) + return self._context + + def fetch( + self, origination_number: Union[str, object] = values.unset + ) -> "NumberInstance": + """ + Fetch the NumberInstance + + :param origination_number: The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + + :returns: The fetched NumberInstance + """ + return self._proxy.fetch( + origination_number=origination_number, + ) + + async def fetch_async( + self, origination_number: Union[str, object] = values.unset + ) -> "NumberInstance": + """ + Asynchronous coroutine to fetch the NumberInstance + + :param origination_number: The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + + :returns: The fetched NumberInstance + """ + return await self._proxy.fetch_async( + origination_number=origination_number, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NumberContext(InstanceContext): + + def __init__(self, version: Version, destination_number: str): + """ + Initialize the NumberContext + + :param version: Version that contains the resource + :param destination_number: The destination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "destination_number": destination_number, + } + self._uri = "/Trunking/Numbers/{destination_number}".format(**self._solution) + + def fetch( + self, origination_number: Union[str, object] = values.unset + ) -> NumberInstance: + """ + Fetch the NumberInstance + + :param origination_number: The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + + :returns: The fetched NumberInstance + """ + + data = values.of( + { + "OriginationNumber": origination_number, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return NumberInstance( + self._version, + payload, + destination_number=self._solution["destination_number"], + ) + + async def fetch_async( + self, origination_number: Union[str, object] = values.unset + ) -> NumberInstance: + """ + Asynchronous coroutine to fetch the NumberInstance + + :param origination_number: The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + + :returns: The fetched NumberInstance + """ + + data = values.of( + { + "OriginationNumber": origination_number, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return NumberInstance( + self._version, + payload, + destination_number=self._solution["destination_number"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NumberList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the NumberList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, destination_number: str) -> NumberContext: + """ + Constructs a NumberContext + + :param destination_number: The destination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + """ + return NumberContext(self._version, destination_number=destination_number) + + def __call__(self, destination_number: str) -> NumberContext: + """ + Constructs a NumberContext + + :param destination_number: The destination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + """ + return NumberContext(self._version, destination_number=destination_number) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__init__.py b/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__init__.py new file mode 100644 index 00000000..1ebbcbb6 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__init__.py @@ -0,0 +1,65 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.pricing.v2.voice.country import CountryList +from twilio.rest.pricing.v2.voice.number import NumberList + + +class VoiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the VoiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Voice" + + self._countries: Optional[CountryList] = None + self._numbers: Optional[NumberList] = None + + @property + def countries(self) -> CountryList: + """ + Access the countries + """ + if self._countries is None: + self._countries = CountryList(self._version) + return self._countries + + @property + def numbers(self) -> NumberList: + """ + Access the numbers + """ + if self._numbers is None: + self._numbers = NumberList(self._version) + return self._numbers + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae7003957a0eb51eaa54900c570ec71daa137d36 GIT binary patch literal 2629 zcmd5;&2JM&6rZ)%pK%}%BtDv?+kybA%32LVs?1jrAQZJE6jBbBt6{S{CR^6K?(Evs zmLqbA)In9T|>Ys4ZIVkuU_QR<0GLP0+1Bgh^a z@F^!#&sMU6PdmAKzLHl+f?On4W|>%7ranx{*p;Dnu9!D|R|v^#@XRgPzGiwB({35Q zc7wT$8v(Pl`8KL4rP}rn1t_BED87=sHjJzWOfU|*Q7UHbYFan`ffxtyf{D~niV`tI zf>U;@AdwuUCFG(YQe2AT(ynlprjZ>4mm$#@mkYyBkl=*Xeq2q%Ipo{7ujVC8w`|Au zv`OtUw@urIqmG_X_-Gep5VTOG!sNWCxn7_#%MQe1OfgB_aGQqX zwDtUNnERpIg zOj$&dMioUit1$io>Xng-0yUek6qc+dR!9wMcezkeS;|VXbS+`2%j&}@LM0=lS&*g% zq&cw6gDkzQR)$u{=Srn;l@v2!?wV(t43`jQT5_RgVqh`27W~_s0rHiyMuJ$mn&^_d z&{5_;zQ%r>^zu90s%u;H@oRo$tZE`!zQ&S|z zW3nJ)fR$! z778k;wwT+herV5EeLG;24a2-?++cn+5cOPwr3R&jEd5ezsw5ms{iW%RHXnwWI=f>$ z^uF#5ko!k~yjUX7caYqU)yxmsed~LF%D(k%&)AB3C->~#R+`b7XKkA?pn3kpx^92O0Ri9KtY z3|bePJx)QaEGGF*2*=?>Cy2eK+}F^3lY5E9dXbKHfQc@Am5LjqC*91IGUYoDRiM4B!-%XRHF0 zMqs%-gJds~eLx1`$wV%lUEAP9qA4^Tgyz)hsf{7+$=Koh!8eOvFFqPO4$xdeXcku& zH?m`|Ljw`yDS>sdM%qd-(W%9&yUe|o4Hu!I)ws=E%V}$zHK6pNKMXuKw;Q!A>(ei5 zmke{kcGCBNJZM-7gf!3=!pbF_#Xjzu}peuA$9D2W{be5H%8JsdWm%E&Gi$1 z68LN;`-0v`#Eq{XK-GAx8t;vyQ>FETe}Po)P|Pt?EQA?KEzg9lrGs_@?qiN!AMTgO zl|FCyOn2b200iX)$1&sK=%7C8Q2|GIDAM3Tr$+~!-kQ=|ctYy3Jta!v!T&Us#VS!0 zsEotJB0B=9m)VmtE2sH8pumH{$DZ#c6-D_YQBc&aF`|rZrHOLvDLL{hIr)^7pQn#1 Mr7sIx1U@3v-%`w$Bme*a literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__pycache__/country.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/__pycache__/country.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d99ee159823c68f96818c308b696b677c31b5f2 GIT binary patch literal 18693 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/country.py b/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/country.py new file mode 100644 index 00000000..997f3684 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/country.py @@ -0,0 +1,417 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CountryInstance(InstanceResource): + """ + :ivar country: The name of the country. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). + :ivar outbound_prefix_prices: The list of [OutboundPrefixPriceWithOrigin](https://www.twilio.com/docs/voice/pricing#outbound-prefix-price-with-origin) records. + :ivar inbound_call_prices: The list of [InboundCallPrice](https://www.twilio.com/docs/voice/pricing#inbound-call-price) records. + :ivar price_unit: The currency in which prices are measured, specified in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g. `usd`, `eur`, `jpy`). + :ivar url: The absolute URL of the resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + iso_country: Optional[str] = None, + ): + super().__init__(version) + + self.country: Optional[str] = payload.get("country") + self.iso_country: Optional[str] = payload.get("iso_country") + self.outbound_prefix_prices: Optional[List[str]] = payload.get( + "outbound_prefix_prices" + ) + self.inbound_call_prices: Optional[List[str]] = payload.get( + "inbound_call_prices" + ) + self.price_unit: Optional[str] = payload.get("price_unit") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "iso_country": iso_country or self.iso_country, + } + self._context: Optional[CountryContext] = None + + @property + def _proxy(self) -> "CountryContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CountryContext for this CountryInstance + """ + if self._context is None: + self._context = CountryContext( + self._version, + iso_country=self._solution["iso_country"], + ) + return self._context + + def fetch(self) -> "CountryInstance": + """ + Fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CountryInstance": + """ + Asynchronous coroutine to fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CountryContext(InstanceContext): + + def __init__(self, version: Version, iso_country: str): + """ + Initialize the CountryContext + + :param version: Version that contains the resource + :param iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the origin-based voice pricing information to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "iso_country": iso_country, + } + self._uri = "/Voice/Countries/{iso_country}".format(**self._solution) + + def fetch(self) -> CountryInstance: + """ + Fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CountryInstance( + self._version, + payload, + iso_country=self._solution["iso_country"], + ) + + async def fetch_async(self) -> CountryInstance: + """ + Asynchronous coroutine to fetch the CountryInstance + + + :returns: The fetched CountryInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CountryInstance( + self._version, + payload, + iso_country=self._solution["iso_country"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CountryPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CountryInstance: + """ + Build an instance of CountryInstance + + :param payload: Payload response from the API + """ + return CountryInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CountryList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the CountryList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Voice/Countries" + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CountryInstance]: + """ + Streams CountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CountryInstance]: + """ + Asynchronously streams CountryInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CountryInstance]: + """ + Lists CountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CountryInstance]: + """ + Asynchronously lists CountryInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CountryPage: + """ + Retrieve a single page of CountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CountryPage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CountryPage: + """ + Asynchronously retrieve a single page of CountryInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CountryInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CountryPage(self._version, response) + + def get_page(self, target_url: str) -> CountryPage: + """ + Retrieve a specific page of CountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CountryInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CountryPage(self._version, response) + + async def get_page_async(self, target_url: str) -> CountryPage: + """ + Asynchronously retrieve a specific page of CountryInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CountryInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CountryPage(self._version, response) + + def get(self, iso_country: str) -> CountryContext: + """ + Constructs a CountryContext + + :param iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the origin-based voice pricing information to fetch. + """ + return CountryContext(self._version, iso_country=iso_country) + + def __call__(self, iso_country: str) -> CountryContext: + """ + Constructs a CountryContext + + :param iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the origin-based voice pricing information to fetch. + """ + return CountryContext(self._version, iso_country=iso_country) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/number.py b/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/number.py new file mode 100644 index 00000000..97a3a526 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/pricing/v2/voice/number.py @@ -0,0 +1,234 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Pricing + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, List, Optional, Union +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class NumberInstance(InstanceResource): + """ + :ivar destination_number: The destination phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar origination_number: The origination phone number in [[E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar country: The name of the country. + :ivar iso_country: The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) + :ivar outbound_call_prices: The list of [OutboundCallPriceWithOrigin](https://www.twilio.com/docs/voice/pricing#outbound-call-price-with-origin) records. + :ivar inbound_call_price: + :ivar price_unit: The currency in which prices are measured, specified in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g. `usd`, `eur`, `jpy`). + :ivar url: The absolute URL of the resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + destination_number: Optional[str] = None, + ): + super().__init__(version) + + self.destination_number: Optional[str] = payload.get("destination_number") + self.origination_number: Optional[str] = payload.get("origination_number") + self.country: Optional[str] = payload.get("country") + self.iso_country: Optional[str] = payload.get("iso_country") + self.outbound_call_prices: Optional[List[str]] = payload.get( + "outbound_call_prices" + ) + self.inbound_call_price: Optional[str] = payload.get("inbound_call_price") + self.price_unit: Optional[str] = payload.get("price_unit") + self.url: Optional[str] = payload.get("url") + + self._solution = { + "destination_number": destination_number or self.destination_number, + } + self._context: Optional[NumberContext] = None + + @property + def _proxy(self) -> "NumberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: NumberContext for this NumberInstance + """ + if self._context is None: + self._context = NumberContext( + self._version, + destination_number=self._solution["destination_number"], + ) + return self._context + + def fetch( + self, origination_number: Union[str, object] = values.unset + ) -> "NumberInstance": + """ + Fetch the NumberInstance + + :param origination_number: The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + + :returns: The fetched NumberInstance + """ + return self._proxy.fetch( + origination_number=origination_number, + ) + + async def fetch_async( + self, origination_number: Union[str, object] = values.unset + ) -> "NumberInstance": + """ + Asynchronous coroutine to fetch the NumberInstance + + :param origination_number: The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + + :returns: The fetched NumberInstance + """ + return await self._proxy.fetch_async( + origination_number=origination_number, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NumberContext(InstanceContext): + + def __init__(self, version: Version, destination_number: str): + """ + Initialize the NumberContext + + :param version: Version that contains the resource + :param destination_number: The destination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "destination_number": destination_number, + } + self._uri = "/Voice/Numbers/{destination_number}".format(**self._solution) + + def fetch( + self, origination_number: Union[str, object] = values.unset + ) -> NumberInstance: + """ + Fetch the NumberInstance + + :param origination_number: The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + + :returns: The fetched NumberInstance + """ + + data = values.of( + { + "OriginationNumber": origination_number, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return NumberInstance( + self._version, + payload, + destination_number=self._solution["destination_number"], + ) + + async def fetch_async( + self, origination_number: Union[str, object] = values.unset + ) -> NumberInstance: + """ + Asynchronous coroutine to fetch the NumberInstance + + :param origination_number: The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + + :returns: The fetched NumberInstance + """ + + data = values.of( + { + "OriginationNumber": origination_number, + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return NumberInstance( + self._version, + payload, + destination_number=self._solution["destination_number"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NumberList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the NumberList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + def get(self, destination_number: str) -> NumberContext: + """ + Constructs a NumberContext + + :param destination_number: The destination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + """ + return NumberContext(self._version, destination_number=destination_number) + + def __call__(self, destination_number: str) -> NumberContext: + """ + Constructs a NumberContext + + :param destination_number: The destination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + """ + return NumberContext(self._version, destination_number=destination_number) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/proxy/ProxyBase.py b/venv/Lib/site-packages/twilio/rest/proxy/ProxyBase.py new file mode 100644 index 00000000..da1baec1 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/proxy/ProxyBase.py @@ -0,0 +1,44 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + +from twilio.base.domain import Domain +from twilio.rest import Client +from twilio.rest.proxy.v1 import V1 + + +class ProxyBase(Domain): + + def __init__(self, twilio: Client): + """ + Initialize the Proxy Domain + + :returns: Domain for Proxy + """ + super().__init__(twilio, "https://proxy.twilio.com") + self._v1: Optional[V1] = None + + @property + def v1(self) -> V1: + """ + :returns: Versions v1 of Proxy + """ + if self._v1 is None: + self._v1 = V1(self) + return self._v1 + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/proxy/__init__.py b/venv/Lib/site-packages/twilio/rest/proxy/__init__.py new file mode 100644 index 00000000..aec2a3d1 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/proxy/__init__.py @@ -0,0 +1,15 @@ +from warnings import warn + +from twilio.rest.proxy.ProxyBase import ProxyBase +from twilio.rest.proxy.v1.service import ServiceList + + +class Proxy(ProxyBase): + @property + def services(self) -> ServiceList: + warn( + "services is deprecated. Use v1.services instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.v1.services diff --git a/venv/Lib/site-packages/twilio/rest/proxy/__pycache__/ProxyBase.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/proxy/__pycache__/ProxyBase.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d841524ec236fac5f385f7ec92a29cbd0869f11 GIT binary patch literal 1963 zcmahK&u`mQ_}OtBCry9Qjja>Y^u{(&4oirH&{V34ZG}+*?SRrl6!dWIm&VMo&9j>| zQ4T#+qLrvN38D7N1!?M^!et;1leL`?2X29`V%mxCdv=l*gm`wo_r34;ujl+YK3*WO zc7Oh&`GZEtuXq@&Y>FH%0gYpQ~H#?7>}nkI40&9?NKF7d3JYZ)~| zAu72|Y<-K^Ij$XK5_`3L$0+5^?-fD{lrA@&kXpXY={+-~Yuw|)jJQo#JHTX&(a}SJ zfFuS;vdhE2kEv9`Mfv0>wZJOv;X8QbSyDhS;V_0wc|?HPy*esLjIj!0sgZ_vu)Dal{O)X8C)W%^3I#LQBmYFP=u*JF z8+R7y?WBUfD1&ManiZzXA?F`o&s;zBl2dRZx4rm6@vRhg$zfCrjTH#Yt(&PLc;cs+qnjw$% z=$_*`zNH@X3iC_Q@!^{QzEk!{G-U3mJ+ce)+*54jAk~3M1u7d_=%}Sk_hW3NTnnBP zIi~A$xvY$I4fVp*u`9`%6+BuOUO1a_Xu}s&iVj7(GlMP!7=1YjylnZc#Zo5DhU)C@{mBBXH2$*u@JMPbo0f^t=al#As1o&gN23V`aBQsMt)Fl z`;NtLK$D|-n|tm0ht6s}bRvE=Fs-}h8V~D<^NQeMRFUCSWUyG$a?lY)u-}~?kp@w{ z4D|3kfaja!S&`%?c5*)%Gy7*AU3~i&WA5?AE8E(xaR_`8>q$i{xZT5rVavvR0>~ce zkuQg=5wbZIp^RKTa**mng9gO^(1XcPx^E22J?h8`)CXoZr0pv88~^A^NfqN@Sm*#A zDq;e*5M5F+1u$0I)oyWAhj#S>3cLznlk^LuICcNp&b3EluRJ+>ZvXPP8{6~Wy#ILe z)cuW}jqOSC5{RA1AI?esIH7x_qmM>azkXb8b6WV{97`4;JGx$JBE?IQwPf12nMeO1rSJh=HMf$cCeAoQoQS-OAe zF9MqkUK&~~72+IYwr@eydejLVZ%yFz#nb8aT*Vt<%iAunYw=jhz^fxui%%b;lp#a7 z+wE$Sp^W$}s3k6Oq+S?vNu92X%W%Y53lZsO6h-+%%`4i`8KRv3ja+$3E<7cdp6TZl M`anM-ut_U_110tKod5s; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/proxy/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/proxy/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82d46403278a98ac667a740fe26e4a2dd11a9a74 GIT binary patch literal 907 zcmZWn&1=*^6n~SiP1oJFiuhHrLGTd7tP7q*7Sw_)mLk?7gg{JprZsIgS!ZUmZt)=4 zgC4|V{THPECtlQxCD@aC=⁣(vvgEejJ>`o8O!F`Fn3ZRjXwX=k3=gPhTN`A5s|| zeFz2(0d@cbMiI1;i;%=hq_kC6&9NG3ZQa!oC~yz3whdS(>aJSEyGGxzO9xW1QKt0* z8jE}C0ZpFw?*xnp<-{_fY1kr*A>*wgs*uAJFt{xA9U$N$46Z^{jEJ_TU}am|9s0X^ zU$wPN&+}#mCA>@Hmf$o#l8;O{cqqgU@Uaaeu8h2}@^Rcbf)}u%jVzOU!(<1rSbUxK_`=)qfSA=*8 zKh4TsrSZLTY47a0qmnjNJ}krR>36+1y>Bz~UuNb%oAU$V2urq+nZ6$fZQ}b`+4tKC z?nV+HLQ5p#e*qjjCu%}lK6+^e)U;P8(8mM4Q z|CSF$ob+6>OPMLZo|qyl<~vvLb|h~n=k4Sy<)5T->)FNsJtjLW`pernBb+BK9-Frc kZVh@t802!81cxd@Xdll1g8Dw(_-mNRdfhw%apkf90N%#nEC2ui literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/__init__.py b/venv/Lib/site-packages/twilio/rest/proxy/v1/__init__.py new file mode 100644 index 00000000..83737dc0 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/proxy/v1/__init__.py @@ -0,0 +1,43 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Proxy + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional +from twilio.base.version import Version +from twilio.base.domain import Domain +from twilio.rest.proxy.v1.service import ServiceList + + +class V1(Version): + + def __init__(self, domain: Domain): + """ + Initialize the V1 version of Proxy + + :param domain: The Twilio.proxy domain + """ + super().__init__(domain, "v1") + self._services: Optional[ServiceList] = None + + @property + def services(self) -> ServiceList: + if self._services is None: + self._services = ServiceList(self) + return self._services + + def __repr__(self) -> str: + """ + Provide a friendly representation + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/proxy/v1/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7ca17fb7374a986d2467226d814b609c8d7bb90 GIT binary patch literal 2002 zcmahKOK%%Rcy_&BubpSpk`|GmfzX15vc^*25LFQsDOE&qswPCpG8#6!<9O+McbQ$g zb!1gJL?V%hdP2#OBUOG1m-0ANDqf=~g&T5Y%ywgZRa`&NWEs85*{QwOhixR?-vUwoXw zS%e=Hy9ECtQ>`;9+zvlRi16CQxI6fO%?bE{ij)w-IfCSXyX@A0BQZis97~Nzc4=Uj zbj4w*n(BdZX_71RaDn`c1MaZaw~I0NA%A`ST0xfSzU#RGp2c@q@IaJCRt}06Hz*EU z>z-@lRjGCN=E^F*ac9YtXDiFAH|NtrdsY--IApcr;9Rxwa!7qRgKxlK(++_+rglT9EC$#QVoV)37QxuUNz?LMmgjZM!XLczMI|wo!`Kac%L6>O zMp*;|p!#Cav|Nr2tx(o>ZF<{{Vq1=jgz4;{;}3!U3Z{{wssa~1|cpuBP7X_NLDfesTNVM&hn50 z@QG*+ArVgy~=!=2q1+q0Ba~-j|=rBDG z-RU#`;~dO`QYorz6!e%5;IYESV2ii~%q{>-jDAf;Qhfq*t=9o;p}bPM-O)&J~5`*1gM?M322!UAGv+hQHts&9kds&dfSDE(ZY4+ zQs419n9&dl4qdVMO&Vy<%X&rg_+!g%xIX>g6Pp*V%g4eL4~n@~UU-byOAyAnlnLP; z2}%1XiECUd2Ve{J3TS*r3UiDJfH=GaI&sW$aILW&9-2d)V1ebEhOa6=r3nBN2B`8Milx$L_K?GprB zZvyF~JvEbk_2BKl5NyYpKBHI2W@ip&{zkBg;Dw<|v5@2laRM8n*5gj-`WuW-Q*u$x zy18ye)J$(L<1I@j&PwF96)7fDseoS(d3nut*-VE#}YO>?)9a p_@Xxe^fHQ~{HYEr+Q}4BrjF2?N9gJintP^CDl "ServiceContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ServiceContext for this ServiceInstance + """ + if self._context is None: + self._context = ServiceContext( + self._version, + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "ServiceInstance": + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ServiceInstance": + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + unique_name: Union[str, object] = values.unset, + default_ttl: Union[int, object] = values.unset, + callback_url: Union[str, object] = values.unset, + geo_match_level: Union["ServiceInstance.GeoMatchLevel", object] = values.unset, + number_selection_behavior: Union[ + "ServiceInstance.NumberSelectionBehavior", object + ] = values.unset, + intercept_callback_url: Union[str, object] = values.unset, + out_of_session_callback_url: Union[str, object] = values.unset, + chat_instance_sid: Union[str, object] = values.unset, + ) -> "ServiceInstance": + """ + Update the ServiceInstance + + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + :param default_ttl: The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + :param callback_url: The URL we should call when the interaction status changes. + :param geo_match_level: + :param number_selection_behavior: + :param intercept_callback_url: The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + :param out_of_session_callback_url: The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/en-us/serverless/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + :param chat_instance_sid: The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + + :returns: The updated ServiceInstance + """ + return self._proxy.update( + unique_name=unique_name, + default_ttl=default_ttl, + callback_url=callback_url, + geo_match_level=geo_match_level, + number_selection_behavior=number_selection_behavior, + intercept_callback_url=intercept_callback_url, + out_of_session_callback_url=out_of_session_callback_url, + chat_instance_sid=chat_instance_sid, + ) + + async def update_async( + self, + unique_name: Union[str, object] = values.unset, + default_ttl: Union[int, object] = values.unset, + callback_url: Union[str, object] = values.unset, + geo_match_level: Union["ServiceInstance.GeoMatchLevel", object] = values.unset, + number_selection_behavior: Union[ + "ServiceInstance.NumberSelectionBehavior", object + ] = values.unset, + intercept_callback_url: Union[str, object] = values.unset, + out_of_session_callback_url: Union[str, object] = values.unset, + chat_instance_sid: Union[str, object] = values.unset, + ) -> "ServiceInstance": + """ + Asynchronous coroutine to update the ServiceInstance + + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + :param default_ttl: The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + :param callback_url: The URL we should call when the interaction status changes. + :param geo_match_level: + :param number_selection_behavior: + :param intercept_callback_url: The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + :param out_of_session_callback_url: The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/en-us/serverless/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + :param chat_instance_sid: The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + + :returns: The updated ServiceInstance + """ + return await self._proxy.update_async( + unique_name=unique_name, + default_ttl=default_ttl, + callback_url=callback_url, + geo_match_level=geo_match_level, + number_selection_behavior=number_selection_behavior, + intercept_callback_url=intercept_callback_url, + out_of_session_callback_url=out_of_session_callback_url, + chat_instance_sid=chat_instance_sid, + ) + + @property + def phone_numbers(self) -> PhoneNumberList: + """ + Access the phone_numbers + """ + return self._proxy.phone_numbers + + @property + def sessions(self) -> SessionList: + """ + Access the sessions + """ + return self._proxy.sessions + + @property + def short_codes(self) -> ShortCodeList: + """ + Access the short_codes + """ + return self._proxy.short_codes + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServiceContext(InstanceContext): + + def __init__(self, version: Version, sid: str): + """ + Initialize the ServiceContext + + :param version: Version that contains the resource + :param sid: The Twilio-provided string that uniquely identifies the Service resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "sid": sid, + } + self._uri = "/Services/{sid}".format(**self._solution) + + self._phone_numbers: Optional[PhoneNumberList] = None + self._sessions: Optional[SessionList] = None + self._short_codes: Optional[ShortCodeList] = None + + def delete(self) -> bool: + """ + Deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the ServiceInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> ServiceInstance: + """ + Fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ServiceInstance: + """ + Asynchronous coroutine to fetch the ServiceInstance + + + :returns: The fetched ServiceInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ServiceInstance( + self._version, + payload, + sid=self._solution["sid"], + ) + + def update( + self, + unique_name: Union[str, object] = values.unset, + default_ttl: Union[int, object] = values.unset, + callback_url: Union[str, object] = values.unset, + geo_match_level: Union["ServiceInstance.GeoMatchLevel", object] = values.unset, + number_selection_behavior: Union[ + "ServiceInstance.NumberSelectionBehavior", object + ] = values.unset, + intercept_callback_url: Union[str, object] = values.unset, + out_of_session_callback_url: Union[str, object] = values.unset, + chat_instance_sid: Union[str, object] = values.unset, + ) -> ServiceInstance: + """ + Update the ServiceInstance + + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + :param default_ttl: The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + :param callback_url: The URL we should call when the interaction status changes. + :param geo_match_level: + :param number_selection_behavior: + :param intercept_callback_url: The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + :param out_of_session_callback_url: The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/en-us/serverless/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + :param chat_instance_sid: The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "DefaultTtl": default_ttl, + "CallbackUrl": callback_url, + "GeoMatchLevel": geo_match_level, + "NumberSelectionBehavior": number_selection_behavior, + "InterceptCallbackUrl": intercept_callback_url, + "OutOfSessionCallbackUrl": out_of_session_callback_url, + "ChatInstanceSid": chat_instance_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + async def update_async( + self, + unique_name: Union[str, object] = values.unset, + default_ttl: Union[int, object] = values.unset, + callback_url: Union[str, object] = values.unset, + geo_match_level: Union["ServiceInstance.GeoMatchLevel", object] = values.unset, + number_selection_behavior: Union[ + "ServiceInstance.NumberSelectionBehavior", object + ] = values.unset, + intercept_callback_url: Union[str, object] = values.unset, + out_of_session_callback_url: Union[str, object] = values.unset, + chat_instance_sid: Union[str, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronous coroutine to update the ServiceInstance + + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + :param default_ttl: The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + :param callback_url: The URL we should call when the interaction status changes. + :param geo_match_level: + :param number_selection_behavior: + :param intercept_callback_url: The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + :param out_of_session_callback_url: The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/en-us/serverless/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + :param chat_instance_sid: The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + + :returns: The updated ServiceInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "DefaultTtl": default_ttl, + "CallbackUrl": callback_url, + "GeoMatchLevel": geo_match_level, + "NumberSelectionBehavior": number_selection_behavior, + "InterceptCallbackUrl": intercept_callback_url, + "OutOfSessionCallbackUrl": out_of_session_callback_url, + "ChatInstanceSid": chat_instance_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload, sid=self._solution["sid"]) + + @property + def phone_numbers(self) -> PhoneNumberList: + """ + Access the phone_numbers + """ + if self._phone_numbers is None: + self._phone_numbers = PhoneNumberList( + self._version, + self._solution["sid"], + ) + return self._phone_numbers + + @property + def sessions(self) -> SessionList: + """ + Access the sessions + """ + if self._sessions is None: + self._sessions = SessionList( + self._version, + self._solution["sid"], + ) + return self._sessions + + @property + def short_codes(self) -> ShortCodeList: + """ + Access the short_codes + """ + if self._short_codes is None: + self._short_codes = ShortCodeList( + self._version, + self._solution["sid"], + ) + return self._short_codes + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ServicePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ServiceInstance: + """ + Build an instance of ServiceInstance + + :param payload: Payload response from the API + """ + return ServiceInstance(self._version, payload) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ServiceList(ListResource): + + def __init__(self, version: Version): + """ + Initialize the ServiceList + + :param version: Version that contains the resource + + """ + super().__init__(version) + + self._uri = "/Services" + + def create( + self, + unique_name: str, + default_ttl: Union[int, object] = values.unset, + callback_url: Union[str, object] = values.unset, + geo_match_level: Union["ServiceInstance.GeoMatchLevel", object] = values.unset, + number_selection_behavior: Union[ + "ServiceInstance.NumberSelectionBehavior", object + ] = values.unset, + intercept_callback_url: Union[str, object] = values.unset, + out_of_session_callback_url: Union[str, object] = values.unset, + chat_instance_sid: Union[str, object] = values.unset, + ) -> ServiceInstance: + """ + Create the ServiceInstance + + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + :param default_ttl: The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + :param callback_url: The URL we should call when the interaction status changes. + :param geo_match_level: + :param number_selection_behavior: + :param intercept_callback_url: The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + :param out_of_session_callback_url: The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/en-us/serverless/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + :param chat_instance_sid: The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "DefaultTtl": default_ttl, + "CallbackUrl": callback_url, + "GeoMatchLevel": geo_match_level, + "NumberSelectionBehavior": number_selection_behavior, + "InterceptCallbackUrl": intercept_callback_url, + "OutOfSessionCallbackUrl": out_of_session_callback_url, + "ChatInstanceSid": chat_instance_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + async def create_async( + self, + unique_name: str, + default_ttl: Union[int, object] = values.unset, + callback_url: Union[str, object] = values.unset, + geo_match_level: Union["ServiceInstance.GeoMatchLevel", object] = values.unset, + number_selection_behavior: Union[ + "ServiceInstance.NumberSelectionBehavior", object + ] = values.unset, + intercept_callback_url: Union[str, object] = values.unset, + out_of_session_callback_url: Union[str, object] = values.unset, + chat_instance_sid: Union[str, object] = values.unset, + ) -> ServiceInstance: + """ + Asynchronously create the ServiceInstance + + :param unique_name: An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + :param default_ttl: The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + :param callback_url: The URL we should call when the interaction status changes. + :param geo_match_level: + :param number_selection_behavior: + :param intercept_callback_url: The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + :param out_of_session_callback_url: The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/en-us/serverless/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + :param chat_instance_sid: The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + + :returns: The created ServiceInstance + """ + + data = values.of( + { + "UniqueName": unique_name, + "DefaultTtl": default_ttl, + "CallbackUrl": callback_url, + "GeoMatchLevel": geo_match_level, + "NumberSelectionBehavior": number_selection_behavior, + "InterceptCallbackUrl": intercept_callback_url, + "OutOfSessionCallbackUrl": out_of_session_callback_url, + "ChatInstanceSid": chat_instance_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ServiceInstance(self._version, payload) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ServiceInstance]: + """ + Streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ServiceInstance]: + """ + Asynchronously streams ServiceInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ServiceInstance]: + """ + Asynchronously lists ServiceInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ServicePage: + """ + Asynchronously retrieve a single page of ServiceInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ServiceInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ServicePage(self._version, response) + + def get_page(self, target_url: str) -> ServicePage: + """ + Retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ServicePage(self._version, response) + + async def get_page_async(self, target_url: str) -> ServicePage: + """ + Asynchronously retrieve a specific page of ServiceInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ServiceInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ServicePage(self._version, response) + + def get(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The Twilio-provided string that uniquely identifies the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __call__(self, sid: str) -> ServiceContext: + """ + Constructs a ServiceContext + + :param sid: The Twilio-provided string that uniquely identifies the Service resource to update. + """ + return ServiceContext(self._version, sid=sid) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/proxy/v1/service/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/proxy/v1/service/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11d19404bb8d2e1fef365798c2e724c8dd047b2b GIT binary patch literal 37037 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

  4. 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 ZYK#B6{l0*o``f?dLd5$Efqq%O{}-F>PnQ4y literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/mobile.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/__pycache__/mobile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfdfec5c80809117f39856bb0974efb84c7152a2 GIT binary patch literal 36443 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 "AssignedAddOnContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AssignedAddOnContext for this AssignedAddOnInstance + """ + if self._context is None: + self._context = AssignedAddOnContext( + self._version, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AssignedAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AssignedAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AssignedAddOnInstance": + """ + Fetch the AssignedAddOnInstance + + + :returns: The fetched AssignedAddOnInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AssignedAddOnInstance": + """ + Asynchronous coroutine to fetch the AssignedAddOnInstance + + + :returns: The fetched AssignedAddOnInstance + """ + return await self._proxy.fetch_async() + + @property + def extensions(self) -> AssignedAddOnExtensionList: + """ + Access the extensions + """ + return self._proxy.extensions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssignedAddOnContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, resource_sid: str, sid: str): + """ + Initialize the AssignedAddOnContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the resource to fetch. + :param resource_sid: The SID of the Phone Number to which the Add-on is assigned. + :param sid: The Twilio-provided string that uniquely identifies the resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "resource_sid": resource_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/IncomingPhoneNumbers/{resource_sid}/AssignedAddOns/{sid}.json".format( + **self._solution + ) + + self._extensions: Optional[AssignedAddOnExtensionList] = None + + def delete(self) -> bool: + """ + Deletes the AssignedAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AssignedAddOnInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AssignedAddOnInstance: + """ + Fetch the AssignedAddOnInstance + + + :returns: The fetched AssignedAddOnInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AssignedAddOnInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AssignedAddOnInstance: + """ + Asynchronous coroutine to fetch the AssignedAddOnInstance + + + :returns: The fetched AssignedAddOnInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AssignedAddOnInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + sid=self._solution["sid"], + ) + + @property + def extensions(self) -> AssignedAddOnExtensionList: + """ + Access the extensions + """ + if self._extensions is None: + self._extensions = AssignedAddOnExtensionList( + self._version, + self._solution["account_sid"], + self._solution["resource_sid"], + self._solution["sid"], + ) + return self._extensions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssignedAddOnPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AssignedAddOnInstance: + """ + Build an instance of AssignedAddOnInstance + + :param payload: Payload response from the API + """ + return AssignedAddOnInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AssignedAddOnList(ListResource): + + def __init__(self, version: Version, account_sid: str, resource_sid: str): + """ + Initialize the AssignedAddOnList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the resources to read. + :param resource_sid: The SID of the Phone Number to which the Add-on is assigned. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "resource_sid": resource_sid, + } + self._uri = "/Accounts/{account_sid}/IncomingPhoneNumbers/{resource_sid}/AssignedAddOns.json".format( + **self._solution + ) + + def create(self, installed_add_on_sid: str) -> AssignedAddOnInstance: + """ + Create the AssignedAddOnInstance + + :param installed_add_on_sid: The SID that identifies the Add-on installation. + + :returns: The created AssignedAddOnInstance + """ + + data = values.of( + { + "InstalledAddOnSid": installed_add_on_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AssignedAddOnInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + ) + + async def create_async(self, installed_add_on_sid: str) -> AssignedAddOnInstance: + """ + Asynchronously create the AssignedAddOnInstance + + :param installed_add_on_sid: The SID that identifies the Add-on installation. + + :returns: The created AssignedAddOnInstance + """ + + data = values.of( + { + "InstalledAddOnSid": installed_add_on_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AssignedAddOnInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AssignedAddOnInstance]: + """ + Streams AssignedAddOnInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AssignedAddOnInstance]: + """ + Asynchronously streams AssignedAddOnInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssignedAddOnInstance]: + """ + Lists AssignedAddOnInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssignedAddOnInstance]: + """ + Asynchronously lists AssignedAddOnInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssignedAddOnPage: + """ + Retrieve a single page of AssignedAddOnInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssignedAddOnInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssignedAddOnPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssignedAddOnPage: + """ + Asynchronously retrieve a single page of AssignedAddOnInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssignedAddOnInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssignedAddOnPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AssignedAddOnPage: + """ + Retrieve a specific page of AssignedAddOnInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssignedAddOnInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AssignedAddOnPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AssignedAddOnPage: + """ + Asynchronously retrieve a specific page of AssignedAddOnInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssignedAddOnInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AssignedAddOnPage(self._version, response, self._solution) + + def get(self, sid: str) -> AssignedAddOnContext: + """ + Constructs a AssignedAddOnContext + + :param sid: The Twilio-provided string that uniquely identifies the resource to fetch. + """ + return AssignedAddOnContext( + self._version, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> AssignedAddOnContext: + """ + Constructs a AssignedAddOnContext + + :param sid: The Twilio-provided string that uniquely identifies the resource to fetch. + """ + return AssignedAddOnContext( + self._version, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/assigned_add_on/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/assigned_add_on/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1bb24310486e35c7313cc93eb402e8a8065ea8ce GIT binary patch literal 25974 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 "AssignedAddOnExtensionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AssignedAddOnExtensionContext for this AssignedAddOnExtensionInstance + """ + if self._context is None: + self._context = AssignedAddOnExtensionContext( + self._version, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + assigned_add_on_sid=self._solution["assigned_add_on_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "AssignedAddOnExtensionInstance": + """ + Fetch the AssignedAddOnExtensionInstance + + + :returns: The fetched AssignedAddOnExtensionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AssignedAddOnExtensionInstance": + """ + Asynchronous coroutine to fetch the AssignedAddOnExtensionInstance + + + :returns: The fetched AssignedAddOnExtensionInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssignedAddOnExtensionContext(InstanceContext): + + def __init__( + self, + version: Version, + account_sid: str, + resource_sid: str, + assigned_add_on_sid: str, + sid: str, + ): + """ + Initialize the AssignedAddOnExtensionContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the resource to fetch. + :param resource_sid: The SID of the Phone Number to which the Add-on is assigned. + :param assigned_add_on_sid: The SID that uniquely identifies the assigned Add-on installation. + :param sid: The Twilio-provided string that uniquely identifies the resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "resource_sid": resource_sid, + "assigned_add_on_sid": assigned_add_on_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/IncomingPhoneNumbers/{resource_sid}/AssignedAddOns/{assigned_add_on_sid}/Extensions/{sid}.json".format( + **self._solution + ) + + def fetch(self) -> AssignedAddOnExtensionInstance: + """ + Fetch the AssignedAddOnExtensionInstance + + + :returns: The fetched AssignedAddOnExtensionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AssignedAddOnExtensionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + assigned_add_on_sid=self._solution["assigned_add_on_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AssignedAddOnExtensionInstance: + """ + Asynchronous coroutine to fetch the AssignedAddOnExtensionInstance + + + :returns: The fetched AssignedAddOnExtensionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AssignedAddOnExtensionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + assigned_add_on_sid=self._solution["assigned_add_on_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AssignedAddOnExtensionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AssignedAddOnExtensionInstance: + """ + Build an instance of AssignedAddOnExtensionInstance + + :param payload: Payload response from the API + """ + return AssignedAddOnExtensionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + assigned_add_on_sid=self._solution["assigned_add_on_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AssignedAddOnExtensionList(ListResource): + + def __init__( + self, + version: Version, + account_sid: str, + resource_sid: str, + assigned_add_on_sid: str, + ): + """ + Initialize the AssignedAddOnExtensionList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the resources to read. + :param resource_sid: The SID of the Phone Number to which the Add-on is assigned. + :param assigned_add_on_sid: The SID that uniquely identifies the assigned Add-on installation. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "resource_sid": resource_sid, + "assigned_add_on_sid": assigned_add_on_sid, + } + self._uri = "/Accounts/{account_sid}/IncomingPhoneNumbers/{resource_sid}/AssignedAddOns/{assigned_add_on_sid}/Extensions.json".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AssignedAddOnExtensionInstance]: + """ + Streams AssignedAddOnExtensionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AssignedAddOnExtensionInstance]: + """ + Asynchronously streams AssignedAddOnExtensionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssignedAddOnExtensionInstance]: + """ + Lists AssignedAddOnExtensionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AssignedAddOnExtensionInstance]: + """ + Asynchronously lists AssignedAddOnExtensionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssignedAddOnExtensionPage: + """ + Retrieve a single page of AssignedAddOnExtensionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssignedAddOnExtensionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssignedAddOnExtensionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AssignedAddOnExtensionPage: + """ + Asynchronously retrieve a single page of AssignedAddOnExtensionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AssignedAddOnExtensionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AssignedAddOnExtensionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AssignedAddOnExtensionPage: + """ + Retrieve a specific page of AssignedAddOnExtensionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssignedAddOnExtensionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AssignedAddOnExtensionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AssignedAddOnExtensionPage: + """ + Asynchronously retrieve a specific page of AssignedAddOnExtensionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AssignedAddOnExtensionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AssignedAddOnExtensionPage(self._version, response, self._solution) + + def get(self, sid: str) -> AssignedAddOnExtensionContext: + """ + Constructs a AssignedAddOnExtensionContext + + :param sid: The Twilio-provided string that uniquely identifies the resource to fetch. + """ + return AssignedAddOnExtensionContext( + self._version, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + assigned_add_on_sid=self._solution["assigned_add_on_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> AssignedAddOnExtensionContext: + """ + Constructs a AssignedAddOnExtensionContext + + :param sid: The Twilio-provided string that uniquely identifies the resource to fetch. + """ + return AssignedAddOnExtensionContext( + self._version, + account_sid=self._solution["account_sid"], + resource_sid=self._solution["resource_sid"], + assigned_add_on_sid=self._solution["assigned_add_on_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/local.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/local.py new file mode 100644 index 00000000..af67fb0a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/local.py @@ -0,0 +1,672 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class LocalInstance(InstanceResource): + + class AddressRequirement(object): + NONE = "none" + ANY = "any" + LOCAL = "local" + FOREIGN = "foreign" + + class EmergencyAddressStatus(object): + REGISTERED = "registered" + UNREGISTERED = "unregistered" + PENDING_REGISTRATION = "pending-registration" + REGISTRATION_FAILURE = "registration-failure" + PENDING_UNREGISTRATION = "pending-unregistration" + UNREGISTRATION_FAILURE = "unregistration-failure" + + class EmergencyStatus(object): + ACTIVE = "Active" + INACTIVE = "Inactive" + + class VoiceReceiveMode(object): + VOICE = "voice" + FAX = "fax" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the resource. + :ivar address_sid: The SID of the Address resource associated with the phone number. + :ivar address_requirements: + :ivar api_version: The API version used to start a new TwiML session. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar identity_sid: The SID of the Identity resource that we associate with the phone number. Some regions require an Identity to meet local regulations. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar origin: The phone number's origin. `twilio` identifies Twilio-owned phone numbers and `hosted` identifies hosted phone numbers. + :ivar sid: The unique string that that we created to identify the resource. + :ivar sms_application_sid: The SID of the application that handles SMS messages sent to the phone number. If an `sms_application_sid` is present, we ignore all `sms_*_url` values and use those of the application. + :ivar sms_fallback_method: The HTTP method we use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :ivar sms_fallback_url: The URL that we call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :ivar sms_method: The HTTP method we use to call `sms_url`. Can be: `GET` or `POST`. + :ivar sms_url: The URL we call when the phone number receives an incoming SMS message. + :ivar status_callback: The URL we call using the `status_callback_method` to send status information to your application. + :ivar status_callback_method: The HTTP method we use to call `status_callback`. Can be: `GET` or `POST`. + :ivar trunk_sid: The SID of the Trunk that handles calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar voice_receive_mode: + :ivar voice_application_sid: The SID of the application that handles calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :ivar voice_caller_id_lookup: Whether we look up the caller's caller-ID name from the CNAM database ($0.01 per look up). Can be: `true` or `false`. + :ivar voice_fallback_method: The HTTP method we use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :ivar voice_fallback_url: The URL that we call when an error occurs retrieving or executing the TwiML requested by `url`. + :ivar voice_method: The HTTP method we use to call `voice_url`. Can be: `GET` or `POST`. + :ivar voice_url: The URL we call when this phone number receives a call. The `voice_url` will not be used if a `voice_application_sid` or a `trunk_sid` is set. + :ivar emergency_status: + :ivar emergency_address_sid: The SID of the emergency address configuration that we use for emergency calling from this phone number. + :ivar emergency_address_status: + :ivar bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + :ivar status: + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.address_sid: Optional[str] = payload.get("address_sid") + self.address_requirements: Optional["LocalInstance.AddressRequirement"] = ( + payload.get("address_requirements") + ) + self.api_version: Optional[str] = payload.get("api_version") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.identity_sid: Optional[str] = payload.get("identity_sid") + self.phone_number: Optional[str] = payload.get("phone_number") + self.origin: Optional[str] = payload.get("origin") + self.sid: Optional[str] = payload.get("sid") + self.sms_application_sid: Optional[str] = payload.get("sms_application_sid") + self.sms_fallback_method: Optional[str] = payload.get("sms_fallback_method") + self.sms_fallback_url: Optional[str] = payload.get("sms_fallback_url") + self.sms_method: Optional[str] = payload.get("sms_method") + self.sms_url: Optional[str] = payload.get("sms_url") + self.status_callback: Optional[str] = payload.get("status_callback") + self.status_callback_method: Optional[str] = payload.get( + "status_callback_method" + ) + self.trunk_sid: Optional[str] = payload.get("trunk_sid") + self.uri: Optional[str] = payload.get("uri") + self.voice_receive_mode: Optional["LocalInstance.VoiceReceiveMode"] = ( + payload.get("voice_receive_mode") + ) + self.voice_application_sid: Optional[str] = payload.get("voice_application_sid") + self.voice_caller_id_lookup: Optional[bool] = payload.get( + "voice_caller_id_lookup" + ) + self.voice_fallback_method: Optional[str] = payload.get("voice_fallback_method") + self.voice_fallback_url: Optional[str] = payload.get("voice_fallback_url") + self.voice_method: Optional[str] = payload.get("voice_method") + self.voice_url: Optional[str] = payload.get("voice_url") + self.emergency_status: Optional["LocalInstance.EmergencyStatus"] = payload.get( + "emergency_status" + ) + self.emergency_address_sid: Optional[str] = payload.get("emergency_address_sid") + self.emergency_address_status: Optional[ + "LocalInstance.EmergencyAddressStatus" + ] = payload.get("emergency_address_status") + self.bundle_sid: Optional[str] = payload.get("bundle_sid") + self.status: Optional[str] = payload.get("status") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class LocalPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> LocalInstance: + """ + Build an instance of LocalInstance + + :param payload: Payload response from the API + """ + return LocalInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class LocalList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the LocalList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/IncomingPhoneNumbers/Local.json".format( + **self._solution + ) + + def create( + self, + phone_number: str, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + emergency_status: Union["LocalInstance.EmergencyStatus", object] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "LocalInstance.VoiceReceiveMode", object + ] = values.unset, + bundle_sid: Union[str, object] = values.unset, + ) -> LocalInstance: + """ + Create the LocalInstance + + :param phone_number: The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + :param api_version: The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the new phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param identity_sid: The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from the new phone number. + :param trunk_sid: The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param voice_receive_mode: + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + + :returns: The created LocalInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "ApiVersion": api_version, + "FriendlyName": friendly_name, + "SmsApplicationSid": sms_application_sid, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceApplicationSid": voice_application_sid, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + "IdentitySid": identity_sid, + "AddressSid": address_sid, + "EmergencyStatus": emergency_status, + "EmergencyAddressSid": emergency_address_sid, + "TrunkSid": trunk_sid, + "VoiceReceiveMode": voice_receive_mode, + "BundleSid": bundle_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return LocalInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + phone_number: str, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + emergency_status: Union["LocalInstance.EmergencyStatus", object] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "LocalInstance.VoiceReceiveMode", object + ] = values.unset, + bundle_sid: Union[str, object] = values.unset, + ) -> LocalInstance: + """ + Asynchronously create the LocalInstance + + :param phone_number: The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + :param api_version: The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the new phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param identity_sid: The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from the new phone number. + :param trunk_sid: The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param voice_receive_mode: + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + + :returns: The created LocalInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "ApiVersion": api_version, + "FriendlyName": friendly_name, + "SmsApplicationSid": sms_application_sid, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceApplicationSid": voice_application_sid, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + "IdentitySid": identity_sid, + "AddressSid": address_sid, + "EmergencyStatus": emergency_status, + "EmergencyAddressSid": emergency_address_sid, + "TrunkSid": trunk_sid, + "VoiceReceiveMode": voice_receive_mode, + "BundleSid": bundle_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return LocalInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[LocalInstance]: + """ + Streams LocalInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[LocalInstance]: + """ + Asynchronously streams LocalInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[LocalInstance]: + """ + Lists LocalInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[LocalInstance]: + """ + Asynchronously lists LocalInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> LocalPage: + """ + Retrieve a single page of LocalInstance records from the API. + Request is executed immediately + + :param beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param friendly_name: A string that identifies the resources to read. + :param phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of LocalInstance + """ + data = values.of( + { + "Beta": serialize.boolean_to_string(beta), + "FriendlyName": friendly_name, + "PhoneNumber": phone_number, + "Origin": origin, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return LocalPage(self._version, response, self._solution) + + async def page_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> LocalPage: + """ + Asynchronously retrieve a single page of LocalInstance records from the API. + Request is executed immediately + + :param beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param friendly_name: A string that identifies the resources to read. + :param phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of LocalInstance + """ + data = values.of( + { + "Beta": serialize.boolean_to_string(beta), + "FriendlyName": friendly_name, + "PhoneNumber": phone_number, + "Origin": origin, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return LocalPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> LocalPage: + """ + Retrieve a specific page of LocalInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of LocalInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return LocalPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> LocalPage: + """ + Asynchronously retrieve a specific page of LocalInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of LocalInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return LocalPage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/mobile.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/mobile.py new file mode 100644 index 00000000..27fc8a0e --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/mobile.py @@ -0,0 +1,676 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MobileInstance(InstanceResource): + + class AddressRequirement(object): + NONE = "none" + ANY = "any" + LOCAL = "local" + FOREIGN = "foreign" + + class EmergencyAddressStatus(object): + REGISTERED = "registered" + UNREGISTERED = "unregistered" + PENDING_REGISTRATION = "pending-registration" + REGISTRATION_FAILURE = "registration-failure" + PENDING_UNREGISTRATION = "pending-unregistration" + UNREGISTRATION_FAILURE = "unregistration-failure" + + class EmergencyStatus(object): + ACTIVE = "Active" + INACTIVE = "Inactive" + + class VoiceReceiveMode(object): + VOICE = "voice" + FAX = "fax" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the resource. + :ivar address_sid: The SID of the Address resource associated with the phone number. + :ivar address_requirements: + :ivar api_version: The API version used to start a new TwiML session. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar identity_sid: The SID of the Identity resource that we associate with the phone number. Some regions require an Identity to meet local regulations. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar origin: The phone number's origin. `twilio` identifies Twilio-owned phone numbers and `hosted` identifies hosted phone numbers. + :ivar sid: The unique string that that we created to identify the resource. + :ivar sms_application_sid: The SID of the application that handles SMS messages sent to the phone number. If an `sms_application_sid` is present, we ignore all `sms_*_url` values and use those of the application. + :ivar sms_fallback_method: The HTTP method we use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :ivar sms_fallback_url: The URL that we call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :ivar sms_method: The HTTP method we use to call `sms_url`. Can be: `GET` or `POST`. + :ivar sms_url: The URL we call when the phone number receives an incoming SMS message. + :ivar status_callback: The URL we call using the `status_callback_method` to send status information to your application. + :ivar status_callback_method: The HTTP method we use to call `status_callback`. Can be: `GET` or `POST`. + :ivar trunk_sid: The SID of the Trunk that handles calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar voice_receive_mode: + :ivar voice_application_sid: The SID of the application that handles calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :ivar voice_caller_id_lookup: Whether we look up the caller's caller-ID name from the CNAM database ($0.01 per look up). Can be: `true` or `false`. + :ivar voice_fallback_method: The HTTP method we use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :ivar voice_fallback_url: The URL that we call when an error occurs retrieving or executing the TwiML requested by `url`. + :ivar voice_method: The HTTP method we use to call `voice_url`. Can be: `GET` or `POST`. + :ivar voice_url: The URL we call when the phone number receives a call. The `voice_url` will not be used if a `voice_application_sid` or a `trunk_sid` is set. + :ivar emergency_status: + :ivar emergency_address_sid: The SID of the emergency address configuration that we use for emergency calling from this phone number. + :ivar emergency_address_status: + :ivar bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + :ivar status: + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.address_sid: Optional[str] = payload.get("address_sid") + self.address_requirements: Optional["MobileInstance.AddressRequirement"] = ( + payload.get("address_requirements") + ) + self.api_version: Optional[str] = payload.get("api_version") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.identity_sid: Optional[str] = payload.get("identity_sid") + self.phone_number: Optional[str] = payload.get("phone_number") + self.origin: Optional[str] = payload.get("origin") + self.sid: Optional[str] = payload.get("sid") + self.sms_application_sid: Optional[str] = payload.get("sms_application_sid") + self.sms_fallback_method: Optional[str] = payload.get("sms_fallback_method") + self.sms_fallback_url: Optional[str] = payload.get("sms_fallback_url") + self.sms_method: Optional[str] = payload.get("sms_method") + self.sms_url: Optional[str] = payload.get("sms_url") + self.status_callback: Optional[str] = payload.get("status_callback") + self.status_callback_method: Optional[str] = payload.get( + "status_callback_method" + ) + self.trunk_sid: Optional[str] = payload.get("trunk_sid") + self.uri: Optional[str] = payload.get("uri") + self.voice_receive_mode: Optional["MobileInstance.VoiceReceiveMode"] = ( + payload.get("voice_receive_mode") + ) + self.voice_application_sid: Optional[str] = payload.get("voice_application_sid") + self.voice_caller_id_lookup: Optional[bool] = payload.get( + "voice_caller_id_lookup" + ) + self.voice_fallback_method: Optional[str] = payload.get("voice_fallback_method") + self.voice_fallback_url: Optional[str] = payload.get("voice_fallback_url") + self.voice_method: Optional[str] = payload.get("voice_method") + self.voice_url: Optional[str] = payload.get("voice_url") + self.emergency_status: Optional["MobileInstance.EmergencyStatus"] = payload.get( + "emergency_status" + ) + self.emergency_address_sid: Optional[str] = payload.get("emergency_address_sid") + self.emergency_address_status: Optional[ + "MobileInstance.EmergencyAddressStatus" + ] = payload.get("emergency_address_status") + self.bundle_sid: Optional[str] = payload.get("bundle_sid") + self.status: Optional[str] = payload.get("status") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MobilePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MobileInstance: + """ + Build an instance of MobileInstance + + :param payload: Payload response from the API + """ + return MobileInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MobileList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the MobileList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/IncomingPhoneNumbers/Mobile.json".format( + **self._solution + ) + + def create( + self, + phone_number: str, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + emergency_status: Union[ + "MobileInstance.EmergencyStatus", object + ] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "MobileInstance.VoiceReceiveMode", object + ] = values.unset, + bundle_sid: Union[str, object] = values.unset, + ) -> MobileInstance: + """ + Create the MobileInstance + + :param phone_number: The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + :param api_version: The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, the is a formatted version of the phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those of the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the new phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param identity_sid: The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from the new phone number. + :param trunk_sid: The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param voice_receive_mode: + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + + :returns: The created MobileInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "ApiVersion": api_version, + "FriendlyName": friendly_name, + "SmsApplicationSid": sms_application_sid, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceApplicationSid": voice_application_sid, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + "IdentitySid": identity_sid, + "AddressSid": address_sid, + "EmergencyStatus": emergency_status, + "EmergencyAddressSid": emergency_address_sid, + "TrunkSid": trunk_sid, + "VoiceReceiveMode": voice_receive_mode, + "BundleSid": bundle_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MobileInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + phone_number: str, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + emergency_status: Union[ + "MobileInstance.EmergencyStatus", object + ] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "MobileInstance.VoiceReceiveMode", object + ] = values.unset, + bundle_sid: Union[str, object] = values.unset, + ) -> MobileInstance: + """ + Asynchronously create the MobileInstance + + :param phone_number: The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + :param api_version: The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, the is a formatted version of the phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those of the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the new phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param identity_sid: The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from the new phone number. + :param trunk_sid: The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param voice_receive_mode: + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + + :returns: The created MobileInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "ApiVersion": api_version, + "FriendlyName": friendly_name, + "SmsApplicationSid": sms_application_sid, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceApplicationSid": voice_application_sid, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + "IdentitySid": identity_sid, + "AddressSid": address_sid, + "EmergencyStatus": emergency_status, + "EmergencyAddressSid": emergency_address_sid, + "TrunkSid": trunk_sid, + "VoiceReceiveMode": voice_receive_mode, + "BundleSid": bundle_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MobileInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MobileInstance]: + """ + Streams MobileInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MobileInstance]: + """ + Asynchronously streams MobileInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MobileInstance]: + """ + Lists MobileInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MobileInstance]: + """ + Asynchronously lists MobileInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MobilePage: + """ + Retrieve a single page of MobileInstance records from the API. + Request is executed immediately + + :param beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param friendly_name: A string that identifies the resources to read. + :param phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MobileInstance + """ + data = values.of( + { + "Beta": serialize.boolean_to_string(beta), + "FriendlyName": friendly_name, + "PhoneNumber": phone_number, + "Origin": origin, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MobilePage(self._version, response, self._solution) + + async def page_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MobilePage: + """ + Asynchronously retrieve a single page of MobileInstance records from the API. + Request is executed immediately + + :param beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param friendly_name: A string that identifies the resources to read. + :param phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MobileInstance + """ + data = values.of( + { + "Beta": serialize.boolean_to_string(beta), + "FriendlyName": friendly_name, + "PhoneNumber": phone_number, + "Origin": origin, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MobilePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MobilePage: + """ + Retrieve a specific page of MobileInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MobileInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MobilePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MobilePage: + """ + Asynchronously retrieve a specific page of MobileInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MobileInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MobilePage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/toll_free.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/toll_free.py new file mode 100644 index 00000000..86290ff9 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/incoming_phone_number/toll_free.py @@ -0,0 +1,676 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class TollFreeInstance(InstanceResource): + + class AddressRequirement(object): + NONE = "none" + ANY = "any" + LOCAL = "local" + FOREIGN = "foreign" + + class EmergencyAddressStatus(object): + REGISTERED = "registered" + UNREGISTERED = "unregistered" + PENDING_REGISTRATION = "pending-registration" + REGISTRATION_FAILURE = "registration-failure" + PENDING_UNREGISTRATION = "pending-unregistration" + UNREGISTRATION_FAILURE = "unregistration-failure" + + class EmergencyStatus(object): + ACTIVE = "Active" + INACTIVE = "Inactive" + + class VoiceReceiveMode(object): + VOICE = "voice" + FAX = "fax" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the resource. + :ivar address_sid: The SID of the Address resource associated with the phone number. + :ivar address_requirements: + :ivar api_version: The API version used to start a new TwiML session. + :ivar beta: Whether the phone number is new to the Twilio platform. Can be: `true` or `false`. + :ivar capabilities: + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar identity_sid: The SID of the Identity resource that we associate with the phone number. Some regions require an Identity to meet local regulations. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar origin: The phone number's origin. `twilio` identifies Twilio-owned phone numbers and `hosted` identifies hosted phone numbers. + :ivar sid: The unique string that that we created to identify the resource. + :ivar sms_application_sid: The SID of the application that handles SMS messages sent to the phone number. If an `sms_application_sid` is present, we ignore all `sms_*_url` values and use those of the application. + :ivar sms_fallback_method: The HTTP method we use to call `sms_fallback_url`. Can be: `GET` or `POST`. + :ivar sms_fallback_url: The URL that we call when an error occurs while retrieving or executing the TwiML from `sms_url`. + :ivar sms_method: The HTTP method we use to call `sms_url`. Can be: `GET` or `POST`. + :ivar sms_url: The URL we call when the phone number receives an incoming SMS message. + :ivar status_callback: The URL we call using the `status_callback_method` to send status information to your application. + :ivar status_callback_method: The HTTP method we use to call `status_callback`. Can be: `GET` or `POST`. + :ivar trunk_sid: The SID of the Trunk that handles calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar voice_receive_mode: + :ivar voice_application_sid: The SID of the application that handles calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :ivar voice_caller_id_lookup: Whether we look up the caller's caller-ID name from the CNAM database ($0.01 per look up). Can be: `true` or `false`. + :ivar voice_fallback_method: The HTTP method we use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :ivar voice_fallback_url: The URL that we call when an error occurs retrieving or executing the TwiML requested by `url`. + :ivar voice_method: The HTTP method we use to call `voice_url`. Can be: `GET` or `POST`. + :ivar voice_url: The URL we call when the phone number receives a call. The `voice_url` will not be used if a `voice_application_sid` or a `trunk_sid` is set. + :ivar emergency_status: + :ivar emergency_address_sid: The SID of the emergency address configuration that we use for emergency calling from this phone number. + :ivar emergency_address_status: + :ivar bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + :ivar status: + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.address_sid: Optional[str] = payload.get("address_sid") + self.address_requirements: Optional["TollFreeInstance.AddressRequirement"] = ( + payload.get("address_requirements") + ) + self.api_version: Optional[str] = payload.get("api_version") + self.beta: Optional[bool] = payload.get("beta") + self.capabilities: Optional[str] = payload.get("capabilities") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.identity_sid: Optional[str] = payload.get("identity_sid") + self.phone_number: Optional[str] = payload.get("phone_number") + self.origin: Optional[str] = payload.get("origin") + self.sid: Optional[str] = payload.get("sid") + self.sms_application_sid: Optional[str] = payload.get("sms_application_sid") + self.sms_fallback_method: Optional[str] = payload.get("sms_fallback_method") + self.sms_fallback_url: Optional[str] = payload.get("sms_fallback_url") + self.sms_method: Optional[str] = payload.get("sms_method") + self.sms_url: Optional[str] = payload.get("sms_url") + self.status_callback: Optional[str] = payload.get("status_callback") + self.status_callback_method: Optional[str] = payload.get( + "status_callback_method" + ) + self.trunk_sid: Optional[str] = payload.get("trunk_sid") + self.uri: Optional[str] = payload.get("uri") + self.voice_receive_mode: Optional["TollFreeInstance.VoiceReceiveMode"] = ( + payload.get("voice_receive_mode") + ) + self.voice_application_sid: Optional[str] = payload.get("voice_application_sid") + self.voice_caller_id_lookup: Optional[bool] = payload.get( + "voice_caller_id_lookup" + ) + self.voice_fallback_method: Optional[str] = payload.get("voice_fallback_method") + self.voice_fallback_url: Optional[str] = payload.get("voice_fallback_url") + self.voice_method: Optional[str] = payload.get("voice_method") + self.voice_url: Optional[str] = payload.get("voice_url") + self.emergency_status: Optional["TollFreeInstance.EmergencyStatus"] = ( + payload.get("emergency_status") + ) + self.emergency_address_sid: Optional[str] = payload.get("emergency_address_sid") + self.emergency_address_status: Optional[ + "TollFreeInstance.EmergencyAddressStatus" + ] = payload.get("emergency_address_status") + self.bundle_sid: Optional[str] = payload.get("bundle_sid") + self.status: Optional[str] = payload.get("status") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TollFreePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> TollFreeInstance: + """ + Build an instance of TollFreeInstance + + :param payload: Payload response from the API + """ + return TollFreeInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class TollFreeList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the TollFreeList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/IncomingPhoneNumbers/TollFree.json".format( + **self._solution + ) + + def create( + self, + phone_number: str, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + emergency_status: Union[ + "TollFreeInstance.EmergencyStatus", object + ] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "TollFreeInstance.VoiceReceiveMode", object + ] = values.unset, + bundle_sid: Union[str, object] = values.unset, + ) -> TollFreeInstance: + """ + Create the TollFreeInstance + + :param phone_number: The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + :param api_version: The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all `sms_*_url` values and use those of the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the new phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param identity_sid: The SID of the Identity resource that we should associate with the new phone number. Some regions require an Identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from the new phone number. + :param trunk_sid: The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param voice_receive_mode: + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + + :returns: The created TollFreeInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "ApiVersion": api_version, + "FriendlyName": friendly_name, + "SmsApplicationSid": sms_application_sid, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceApplicationSid": voice_application_sid, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + "IdentitySid": identity_sid, + "AddressSid": address_sid, + "EmergencyStatus": emergency_status, + "EmergencyAddressSid": emergency_address_sid, + "TrunkSid": trunk_sid, + "VoiceReceiveMode": voice_receive_mode, + "BundleSid": bundle_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TollFreeInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + phone_number: str, + api_version: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + sms_application_sid: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + status_callback: Union[str, object] = values.unset, + status_callback_method: Union[str, object] = values.unset, + voice_application_sid: Union[str, object] = values.unset, + voice_caller_id_lookup: Union[bool, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + identity_sid: Union[str, object] = values.unset, + address_sid: Union[str, object] = values.unset, + emergency_status: Union[ + "TollFreeInstance.EmergencyStatus", object + ] = values.unset, + emergency_address_sid: Union[str, object] = values.unset, + trunk_sid: Union[str, object] = values.unset, + voice_receive_mode: Union[ + "TollFreeInstance.VoiceReceiveMode", object + ] = values.unset, + bundle_sid: Union[str, object] = values.unset, + ) -> TollFreeInstance: + """ + Asynchronously create the TollFreeInstance + + :param phone_number: The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + :param api_version: The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + :param friendly_name: A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + :param sms_application_sid: The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all `sms_*_url` values and use those of the application. + :param sms_fallback_method: The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_fallback_url: The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + :param sms_method: The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param sms_url: The URL we should call when the new phone number receives an incoming SMS message. + :param status_callback: The URL we should call using the `status_callback_method` to send status information to your application. + :param status_callback_method: The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_application_sid: The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + :param voice_caller_id_lookup: Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + :param voice_fallback_method: The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + :param voice_method: The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + :param voice_url: The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + :param identity_sid: The SID of the Identity resource that we should associate with the new phone number. Some regions require an Identity to meet local regulations. + :param address_sid: The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + :param emergency_status: + :param emergency_address_sid: The SID of the emergency address configuration to use for emergency calling from the new phone number. + :param trunk_sid: The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + :param voice_receive_mode: + :param bundle_sid: The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + + :returns: The created TollFreeInstance + """ + + data = values.of( + { + "PhoneNumber": phone_number, + "ApiVersion": api_version, + "FriendlyName": friendly_name, + "SmsApplicationSid": sms_application_sid, + "SmsFallbackMethod": sms_fallback_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsMethod": sms_method, + "SmsUrl": sms_url, + "StatusCallback": status_callback, + "StatusCallbackMethod": status_callback_method, + "VoiceApplicationSid": voice_application_sid, + "VoiceCallerIdLookup": serialize.boolean_to_string( + voice_caller_id_lookup + ), + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceUrl": voice_url, + "IdentitySid": identity_sid, + "AddressSid": address_sid, + "EmergencyStatus": emergency_status, + "EmergencyAddressSid": emergency_address_sid, + "TrunkSid": trunk_sid, + "VoiceReceiveMode": voice_receive_mode, + "BundleSid": bundle_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return TollFreeInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[TollFreeInstance]: + """ + Streams TollFreeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[TollFreeInstance]: + """ + Asynchronously streams TollFreeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TollFreeInstance]: + """ + Lists TollFreeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TollFreeInstance]: + """ + Asynchronously lists TollFreeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param bool beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param str friendly_name: A string that identifies the resources to read. + :param str phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param str origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + beta=beta, + friendly_name=friendly_name, + phone_number=phone_number, + origin=origin, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TollFreePage: + """ + Retrieve a single page of TollFreeInstance records from the API. + Request is executed immediately + + :param beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param friendly_name: A string that identifies the resources to read. + :param phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TollFreeInstance + """ + data = values.of( + { + "Beta": serialize.boolean_to_string(beta), + "FriendlyName": friendly_name, + "PhoneNumber": phone_number, + "Origin": origin, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TollFreePage(self._version, response, self._solution) + + async def page_async( + self, + beta: Union[bool, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + phone_number: Union[str, object] = values.unset, + origin: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TollFreePage: + """ + Asynchronously retrieve a single page of TollFreeInstance records from the API. + Request is executed immediately + + :param beta: Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + :param friendly_name: A string that identifies the resources to read. + :param phone_number: The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + :param origin: Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TollFreeInstance + """ + data = values.of( + { + "Beta": serialize.boolean_to_string(beta), + "FriendlyName": friendly_name, + "PhoneNumber": phone_number, + "Origin": origin, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TollFreePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> TollFreePage: + """ + Retrieve a specific page of TollFreeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TollFreeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return TollFreePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> TollFreePage: + """ + Asynchronously retrieve a specific page of TollFreeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TollFreeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return TollFreePage(self._version, response, self._solution) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/key.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/key.py new file mode 100644 index 00000000..8b18dbd4 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/key.py @@ -0,0 +1,566 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class KeyInstance(InstanceResource): + """ + :ivar sid: The unique string that that we created to identify the Key resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[KeyContext] = None + + @property + def _proxy(self) -> "KeyContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: KeyContext for this KeyInstance + """ + if self._context is None: + self._context = KeyContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the KeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the KeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "KeyInstance": + """ + Fetch the KeyInstance + + + :returns: The fetched KeyInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "KeyInstance": + """ + Asynchronous coroutine to fetch the KeyInstance + + + :returns: The fetched KeyInstance + """ + return await self._proxy.fetch_async() + + def update(self, friendly_name: Union[str, object] = values.unset) -> "KeyInstance": + """ + Update the KeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated KeyInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + ) + + async def update_async( + self, friendly_name: Union[str, object] = values.unset + ) -> "KeyInstance": + """ + Asynchronous coroutine to update the KeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated KeyInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class KeyContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the KeyContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Key resources to update. + :param sid: The Twilio-provided string that uniquely identifies the Key resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Keys/{sid}.json".format(**self._solution) + + def delete(self) -> bool: + """ + Deletes the KeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the KeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> KeyInstance: + """ + Fetch the KeyInstance + + + :returns: The fetched KeyInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return KeyInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> KeyInstance: + """ + Asynchronous coroutine to fetch the KeyInstance + + + :returns: The fetched KeyInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return KeyInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update(self, friendly_name: Union[str, object] = values.unset) -> KeyInstance: + """ + Update the KeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated KeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return KeyInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, friendly_name: Union[str, object] = values.unset + ) -> KeyInstance: + """ + Asynchronous coroutine to update the KeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated KeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return KeyInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class KeyPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> KeyInstance: + """ + Build an instance of KeyInstance + + :param payload: Payload response from the API + """ + return KeyInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class KeyList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the KeyList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Key resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Keys.json".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[KeyInstance]: + """ + Streams KeyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[KeyInstance]: + """ + Asynchronously streams KeyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[KeyInstance]: + """ + Lists KeyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[KeyInstance]: + """ + Asynchronously lists KeyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> KeyPage: + """ + Retrieve a single page of KeyInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of KeyInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return KeyPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> KeyPage: + """ + Asynchronously retrieve a single page of KeyInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of KeyInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return KeyPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> KeyPage: + """ + Retrieve a specific page of KeyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of KeyInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return KeyPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> KeyPage: + """ + Asynchronously retrieve a specific page of KeyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of KeyInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return KeyPage(self._version, response, self._solution) + + def get(self, sid: str) -> KeyContext: + """ + Constructs a KeyContext + + :param sid: The Twilio-provided string that uniquely identifies the Key resource to update. + """ + return KeyContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> KeyContext: + """ + Constructs a KeyContext + + :param sid: The Twilio-provided string that uniquely identifies the Key resource to update. + """ + return KeyContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__init__.py new file mode 100644 index 00000000..d5369d11 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__init__.py @@ -0,0 +1,1014 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.message.feedback import FeedbackList +from twilio.rest.api.v2010.account.message.media import MediaList + + +class MessageInstance(InstanceResource): + + class AddressRetention(object): + RETAIN = "retain" + OBFUSCATE = "obfuscate" + + class ContentRetention(object): + RETAIN = "retain" + DISCARD = "discard" + + class Direction(object): + INBOUND = "inbound" + OUTBOUND_API = "outbound-api" + OUTBOUND_CALL = "outbound-call" + OUTBOUND_REPLY = "outbound-reply" + + class RiskCheck(object): + ENABLE = "enable" + DISABLE = "disable" + + class ScheduleType(object): + FIXED = "fixed" + + class Status(object): + QUEUED = "queued" + SENDING = "sending" + SENT = "sent" + FAILED = "failed" + DELIVERED = "delivered" + UNDELIVERED = "undelivered" + RECEIVING = "receiving" + RECEIVED = "received" + ACCEPTED = "accepted" + SCHEDULED = "scheduled" + READ = "read" + PARTIALLY_DELIVERED = "partially_delivered" + CANCELED = "canceled" + + class TrafficType(object): + FREE = "free" + + class UpdateStatus(object): + CANCELED = "canceled" + + """ + :ivar body: The text content of the message + :ivar num_segments: The number of segments that make up the complete message. SMS message bodies that exceed the [character limit](https://www.twilio.com/docs/glossary/what-sms-character-limit) are segmented and charged as multiple messages. Note: For messages sent via a Messaging Service, `num_segments` is initially `0`, since a sender hasn't yet been assigned. + :ivar direction: + :ivar from_: The sender's phone number (in [E.164](https://en.wikipedia.org/wiki/E.164) format), [alphanumeric sender ID](https://www.twilio.com/docs/sms/quickstart), [Wireless SIM](https://www.twilio.com/docs/iot/wireless/programmable-wireless-send-machine-machine-sms-commands), [short code](https://www.twilio.com/en-us/messaging/channels/sms/short-codes), or [channel address](https://www.twilio.com/docs/messaging/channels) (e.g., `whatsapp:+15554449999`). For incoming messages, this is the number or channel address of the sender. For outgoing messages, this value is a Twilio phone number, alphanumeric sender ID, short code, or channel address from which the message is sent. + :ivar to: The recipient's phone number (in [E.164](https://en.wikipedia.org/wiki/E.164) format) or [channel address](https://www.twilio.com/docs/messaging/channels) (e.g. `whatsapp:+15552229999`) + :ivar date_updated: The [RFC 2822](https://datatracker.ietf.org/doc/html/rfc2822#section-3.3) timestamp (in GMT) of when the Message resource was last updated + :ivar price: The amount billed for the message in the currency specified by `price_unit`. The `price` is populated after the message has been sent/received, and may not be immediately availalble. View the [Pricing page](https://www.twilio.com/en-us/pricing) for more details. + :ivar error_message: The description of the `error_code` if the Message `status` is `failed` or `undelivered`. If no error was encountered, the value is `null`. The value returned in this field for a specific error cause is subject to change as Twilio improves errors. Users should not use the `error_code` and `error_message` fields programmatically. + :ivar uri: The URI of the Message resource, relative to `https://api.twilio.com`. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) associated with the Message resource + :ivar num_media: The number of media files associated with the Message resource. + :ivar status: + :ivar messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource) associated with the Message resource. A unique default value is assigned if a Messaging Service is not used. + :ivar sid: The unique, Twilio-provided string that identifies the Message resource. + :ivar date_sent: The [RFC 2822](https://datatracker.ietf.org/doc/html/rfc2822#section-3.3) timestamp (in GMT) of when the Message was sent. For an outgoing message, this is when Twilio sent the message. For an incoming message, this is when Twilio sent the HTTP request to your incoming message webhook URL. + :ivar date_created: The [RFC 2822](https://datatracker.ietf.org/doc/html/rfc2822#section-3.3) timestamp (in GMT) of when the Message resource was created + :ivar error_code: The [error code](https://www.twilio.com/docs/api/errors) returned if the Message `status` is `failed` or `undelivered`. If no error was encountered, the value is `null`. The value returned in this field for a specific error cause is subject to change as Twilio improves errors. Users should not use the `error_code` and `error_message` fields programmatically. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g. `usd`, `eur`, `jpy`). + :ivar api_version: The API version used to process the Message + :ivar subresource_uris: A list of related resources identified by their URIs relative to `https://api.twilio.com` + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.body: Optional[str] = payload.get("body") + self.num_segments: Optional[str] = payload.get("num_segments") + self.direction: Optional["MessageInstance.Direction"] = payload.get("direction") + self.from_: Optional[str] = payload.get("from") + self.to: Optional[str] = payload.get("to") + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.price: Optional[str] = payload.get("price") + self.error_message: Optional[str] = payload.get("error_message") + self.uri: Optional[str] = payload.get("uri") + self.account_sid: Optional[str] = payload.get("account_sid") + self.num_media: Optional[str] = payload.get("num_media") + self.status: Optional["MessageInstance.Status"] = payload.get("status") + self.messaging_service_sid: Optional[str] = payload.get("messaging_service_sid") + self.sid: Optional[str] = payload.get("sid") + self.date_sent: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_sent") + ) + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.error_code: Optional[int] = deserialize.integer(payload.get("error_code")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.api_version: Optional[str] = payload.get("api_version") + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[MessageContext] = None + + @property + def _proxy(self) -> "MessageContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MessageContext for this MessageInstance + """ + if self._context is None: + self._context = MessageContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "MessageInstance": + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MessageInstance": + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + body: Union[str, object] = values.unset, + status: Union["MessageInstance.UpdateStatus", object] = values.unset, + ) -> "MessageInstance": + """ + Update the MessageInstance + + :param body: The new `body` of the Message resource. To redact the text content of a Message, this parameter's value must be an empty string + :param status: + + :returns: The updated MessageInstance + """ + return self._proxy.update( + body=body, + status=status, + ) + + async def update_async( + self, + body: Union[str, object] = values.unset, + status: Union["MessageInstance.UpdateStatus", object] = values.unset, + ) -> "MessageInstance": + """ + Asynchronous coroutine to update the MessageInstance + + :param body: The new `body` of the Message resource. To redact the text content of a Message, this parameter's value must be an empty string + :param status: + + :returns: The updated MessageInstance + """ + return await self._proxy.update_async( + body=body, + status=status, + ) + + @property + def feedback(self) -> FeedbackList: + """ + Access the feedback + """ + return self._proxy.feedback + + @property + def media(self) -> MediaList: + """ + Access the media + """ + return self._proxy.media + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessageContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the MessageContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Message resources to update. + :param sid: The SID of the Message resource to be updated + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Messages/{sid}.json".format( + **self._solution + ) + + self._feedback: Optional[FeedbackList] = None + self._media: Optional[MediaList] = None + + def delete(self) -> bool: + """ + Deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MessageInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MessageInstance: + """ + Fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MessageInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MessageInstance: + """ + Asynchronous coroutine to fetch the MessageInstance + + + :returns: The fetched MessageInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MessageInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + body: Union[str, object] = values.unset, + status: Union["MessageInstance.UpdateStatus", object] = values.unset, + ) -> MessageInstance: + """ + Update the MessageInstance + + :param body: The new `body` of the Message resource. To redact the text content of a Message, this parameter's value must be an empty string + :param status: + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Body": body, + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + body: Union[str, object] = values.unset, + status: Union["MessageInstance.UpdateStatus", object] = values.unset, + ) -> MessageInstance: + """ + Asynchronous coroutine to update the MessageInstance + + :param body: The new `body` of the Message resource. To redact the text content of a Message, this parameter's value must be an empty string + :param status: + + :returns: The updated MessageInstance + """ + + data = values.of( + { + "Body": body, + "Status": status, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + @property + def feedback(self) -> FeedbackList: + """ + Access the feedback + """ + if self._feedback is None: + self._feedback = FeedbackList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._feedback + + @property + def media(self) -> MediaList: + """ + Access the media + """ + if self._media is None: + self._media = MediaList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._media + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MessagePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MessageInstance: + """ + Build an instance of MessageInstance + + :param payload: Payload response from the API + """ + return MessageInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MessageList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the MessageList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) associated with the Message resources. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Messages.json".format(**self._solution) + + def create( + self, + to: str, + status_callback: Union[str, object] = values.unset, + application_sid: Union[str, object] = values.unset, + max_price: Union[float, object] = values.unset, + provide_feedback: Union[bool, object] = values.unset, + attempt: Union[int, object] = values.unset, + validity_period: Union[int, object] = values.unset, + force_delivery: Union[bool, object] = values.unset, + content_retention: Union[ + "MessageInstance.ContentRetention", object + ] = values.unset, + address_retention: Union[ + "MessageInstance.AddressRetention", object + ] = values.unset, + smart_encoded: Union[bool, object] = values.unset, + persistent_action: Union[List[str], object] = values.unset, + traffic_type: Union["MessageInstance.TrafficType", object] = values.unset, + shorten_urls: Union[bool, object] = values.unset, + schedule_type: Union["MessageInstance.ScheduleType", object] = values.unset, + send_at: Union[datetime, object] = values.unset, + send_as_mms: Union[bool, object] = values.unset, + content_variables: Union[str, object] = values.unset, + risk_check: Union["MessageInstance.RiskCheck", object] = values.unset, + from_: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + media_url: Union[List[str], object] = values.unset, + content_sid: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Create the MessageInstance + + :param to: The recipient's phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (for SMS/MMS) or [channel address](https://www.twilio.com/docs/messaging/channels), e.g. `whatsapp:+15552229999`. + :param status_callback: The URL of the endpoint to which Twilio sends [Message status callback requests](https://www.twilio.com/docs/sms/api/message-resource#twilios-request-to-the-statuscallback-url). URL must contain a valid hostname and underscores are not allowed. If you include this parameter with the `messaging_service_sid`, Twilio uses this URL instead of the Status Callback URL of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource). + :param application_sid: The SID of the associated [TwiML Application](https://www.twilio.com/docs/usage/api/applications). [Message status callback requests](https://www.twilio.com/docs/sms/api/message-resource#twilios-request-to-the-statuscallback-url) are sent to the TwiML App's `message_status_callback` URL. Note that the `status_callback` parameter of a request takes priority over the `application_sid` parameter; if both are included `application_sid` is ignored. + :param max_price: [OBSOLETE] This parameter will no longer have any effect as of 2024-06-03. + :param provide_feedback: Boolean indicating whether or not you intend to provide delivery confirmation feedback to Twilio (used in conjunction with the [Message Feedback subresource](https://www.twilio.com/docs/sms/api/message-feedback-resource)). Default value is `false`. + :param attempt: Total number of attempts made (including this request) to send the message regardless of the provider used + :param validity_period: The maximum length in seconds that the Message can remain in Twilio's outgoing message queue. If a queued Message exceeds the `validity_period`, the Message is not sent. Accepted values are integers from `1` to `36000`. Default value is `36000`. A `validity_period` greater than `5` is recommended. [Learn more about the validity period](https://www.twilio.com/blog/take-more-control-of-outbound-messages-using-validity-period-html) + :param force_delivery: Reserved + :param content_retention: + :param address_retention: + :param smart_encoded: Whether to detect Unicode characters that have a similar GSM-7 character and replace them. Can be: `true` or `false`. + :param persistent_action: Rich actions for non-SMS/MMS channels. Used for [sending location in WhatsApp messages](https://www.twilio.com/docs/whatsapp/message-features#location-messages-with-whatsapp). + :param traffic_type: + :param shorten_urls: For Messaging Services with [Link Shortening configured](https://www.twilio.com/docs/messaging/features/link-shortening) only: A Boolean indicating whether or not Twilio should shorten links in the `body` of the Message. Default value is `false`. If `true`, the `messaging_service_sid` parameter must also be provided. + :param schedule_type: + :param send_at: The time that Twilio will send the message. Must be in ISO 8601 format. + :param send_as_mms: If set to `true`, Twilio delivers the message as a single MMS message, regardless of the presence of media. + :param content_variables: For [Content Editor/API](https://www.twilio.com/docs/content) only: Key-value pairs of [Template variables](https://www.twilio.com/docs/content/using-variables-with-content-api) and their substitution values. `content_sid` parameter must also be provided. If values are not defined in the `content_variables` parameter, the [Template's default placeholder values](https://www.twilio.com/docs/content/content-api-resources#create-templates) are used. + :param risk_check: + :param from_: The sender's Twilio phone number (in [E.164](https://en.wikipedia.org/wiki/E.164) format), [alphanumeric sender ID](https://www.twilio.com/docs/sms/quickstart), [Wireless SIM](https://www.twilio.com/docs/iot/wireless/programmable-wireless-send-machine-machine-sms-commands), [short code](https://www.twilio.com/en-us/messaging/channels/sms/short-codes), or [channel address](https://www.twilio.com/docs/messaging/channels) (e.g., `whatsapp:+15554449999`). The value of the `from` parameter must be a sender that is hosted within Twilio and belongs to the Account creating the Message. If you are using `messaging_service_sid`, this parameter can be empty (Twilio assigns a `from` value from the Messaging Service's Sender Pool) or you can provide a specific sender from your Sender Pool. + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/services) you want to associate with the Message. When this parameter is provided and the `from` parameter is omitted, Twilio selects the optimal sender from the Messaging Service's Sender Pool. You may also provide a `from` parameter if you want to use a specific Sender from the Sender Pool. + :param body: The text content of the outgoing message. Can be up to 1,600 characters in length. SMS only: If the `body` contains more than 160 [GSM-7](https://www.twilio.com/docs/glossary/what-is-gsm-7-character-encoding) characters (or 70 [UCS-2](https://www.twilio.com/docs/glossary/what-is-ucs-2-character-encoding) characters), the message is segmented and charged accordingly. For long `body` text, consider using the [send_as_mms parameter](https://www.twilio.com/blog/mms-for-long-text-messages). + :param media_url: The URL of media to include in the Message content. `jpeg`, `jpg`, `gif`, and `png` file types are fully supported by Twilio and content is formatted for delivery on destination devices. The media size limit is 5 MB for supported file types (`jpeg`, `jpg`, `png`, `gif`) and 500 KB for [other types](https://www.twilio.com/docs/messaging/guides/accepted-mime-types) of accepted media. To send more than one image in the message, provide multiple `media_url` parameters in the POST request. You can include up to ten `media_url` parameters per message. [International](https://support.twilio.com/hc/en-us/articles/223179808-Sending-and-receiving-MMS-messages) and [carrier](https://support.twilio.com/hc/en-us/articles/223133707-Is-MMS-supported-for-all-carriers-in-US-and-Canada-) limits apply. + :param content_sid: For [Content Editor/API](https://www.twilio.com/docs/content) only: The SID of the Content Template to be used with the Message, e.g., `HXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`. If this parameter is not provided, a Content Template is not used. Find the SID in the Console on the Content Editor page. For Content API users, the SID is found in Twilio's response when [creating the Template](https://www.twilio.com/docs/content/content-api-resources#create-templates) or by [fetching your Templates](https://www.twilio.com/docs/content/content-api-resources#fetch-all-content-resources). + + :returns: The created MessageInstance + """ + + data = values.of( + { + "To": to, + "StatusCallback": status_callback, + "ApplicationSid": application_sid, + "MaxPrice": max_price, + "ProvideFeedback": serialize.boolean_to_string(provide_feedback), + "Attempt": attempt, + "ValidityPeriod": validity_period, + "ForceDelivery": serialize.boolean_to_string(force_delivery), + "ContentRetention": content_retention, + "AddressRetention": address_retention, + "SmartEncoded": serialize.boolean_to_string(smart_encoded), + "PersistentAction": serialize.map(persistent_action, lambda e: e), + "TrafficType": traffic_type, + "ShortenUrls": serialize.boolean_to_string(shorten_urls), + "ScheduleType": schedule_type, + "SendAt": serialize.iso8601_datetime(send_at), + "SendAsMms": serialize.boolean_to_string(send_as_mms), + "ContentVariables": content_variables, + "RiskCheck": risk_check, + "From": from_, + "MessagingServiceSid": messaging_service_sid, + "Body": body, + "MediaUrl": serialize.map(media_url, lambda e: e), + "ContentSid": content_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + to: str, + status_callback: Union[str, object] = values.unset, + application_sid: Union[str, object] = values.unset, + max_price: Union[float, object] = values.unset, + provide_feedback: Union[bool, object] = values.unset, + attempt: Union[int, object] = values.unset, + validity_period: Union[int, object] = values.unset, + force_delivery: Union[bool, object] = values.unset, + content_retention: Union[ + "MessageInstance.ContentRetention", object + ] = values.unset, + address_retention: Union[ + "MessageInstance.AddressRetention", object + ] = values.unset, + smart_encoded: Union[bool, object] = values.unset, + persistent_action: Union[List[str], object] = values.unset, + traffic_type: Union["MessageInstance.TrafficType", object] = values.unset, + shorten_urls: Union[bool, object] = values.unset, + schedule_type: Union["MessageInstance.ScheduleType", object] = values.unset, + send_at: Union[datetime, object] = values.unset, + send_as_mms: Union[bool, object] = values.unset, + content_variables: Union[str, object] = values.unset, + risk_check: Union["MessageInstance.RiskCheck", object] = values.unset, + from_: Union[str, object] = values.unset, + messaging_service_sid: Union[str, object] = values.unset, + body: Union[str, object] = values.unset, + media_url: Union[List[str], object] = values.unset, + content_sid: Union[str, object] = values.unset, + ) -> MessageInstance: + """ + Asynchronously create the MessageInstance + + :param to: The recipient's phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (for SMS/MMS) or [channel address](https://www.twilio.com/docs/messaging/channels), e.g. `whatsapp:+15552229999`. + :param status_callback: The URL of the endpoint to which Twilio sends [Message status callback requests](https://www.twilio.com/docs/sms/api/message-resource#twilios-request-to-the-statuscallback-url). URL must contain a valid hostname and underscores are not allowed. If you include this parameter with the `messaging_service_sid`, Twilio uses this URL instead of the Status Callback URL of the [Messaging Service](https://www.twilio.com/docs/messaging/api/service-resource). + :param application_sid: The SID of the associated [TwiML Application](https://www.twilio.com/docs/usage/api/applications). [Message status callback requests](https://www.twilio.com/docs/sms/api/message-resource#twilios-request-to-the-statuscallback-url) are sent to the TwiML App's `message_status_callback` URL. Note that the `status_callback` parameter of a request takes priority over the `application_sid` parameter; if both are included `application_sid` is ignored. + :param max_price: [OBSOLETE] This parameter will no longer have any effect as of 2024-06-03. + :param provide_feedback: Boolean indicating whether or not you intend to provide delivery confirmation feedback to Twilio (used in conjunction with the [Message Feedback subresource](https://www.twilio.com/docs/sms/api/message-feedback-resource)). Default value is `false`. + :param attempt: Total number of attempts made (including this request) to send the message regardless of the provider used + :param validity_period: The maximum length in seconds that the Message can remain in Twilio's outgoing message queue. If a queued Message exceeds the `validity_period`, the Message is not sent. Accepted values are integers from `1` to `36000`. Default value is `36000`. A `validity_period` greater than `5` is recommended. [Learn more about the validity period](https://www.twilio.com/blog/take-more-control-of-outbound-messages-using-validity-period-html) + :param force_delivery: Reserved + :param content_retention: + :param address_retention: + :param smart_encoded: Whether to detect Unicode characters that have a similar GSM-7 character and replace them. Can be: `true` or `false`. + :param persistent_action: Rich actions for non-SMS/MMS channels. Used for [sending location in WhatsApp messages](https://www.twilio.com/docs/whatsapp/message-features#location-messages-with-whatsapp). + :param traffic_type: + :param shorten_urls: For Messaging Services with [Link Shortening configured](https://www.twilio.com/docs/messaging/features/link-shortening) only: A Boolean indicating whether or not Twilio should shorten links in the `body` of the Message. Default value is `false`. If `true`, the `messaging_service_sid` parameter must also be provided. + :param schedule_type: + :param send_at: The time that Twilio will send the message. Must be in ISO 8601 format. + :param send_as_mms: If set to `true`, Twilio delivers the message as a single MMS message, regardless of the presence of media. + :param content_variables: For [Content Editor/API](https://www.twilio.com/docs/content) only: Key-value pairs of [Template variables](https://www.twilio.com/docs/content/using-variables-with-content-api) and their substitution values. `content_sid` parameter must also be provided. If values are not defined in the `content_variables` parameter, the [Template's default placeholder values](https://www.twilio.com/docs/content/content-api-resources#create-templates) are used. + :param risk_check: + :param from_: The sender's Twilio phone number (in [E.164](https://en.wikipedia.org/wiki/E.164) format), [alphanumeric sender ID](https://www.twilio.com/docs/sms/quickstart), [Wireless SIM](https://www.twilio.com/docs/iot/wireless/programmable-wireless-send-machine-machine-sms-commands), [short code](https://www.twilio.com/en-us/messaging/channels/sms/short-codes), or [channel address](https://www.twilio.com/docs/messaging/channels) (e.g., `whatsapp:+15554449999`). The value of the `from` parameter must be a sender that is hosted within Twilio and belongs to the Account creating the Message. If you are using `messaging_service_sid`, this parameter can be empty (Twilio assigns a `from` value from the Messaging Service's Sender Pool) or you can provide a specific sender from your Sender Pool. + :param messaging_service_sid: The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/services) you want to associate with the Message. When this parameter is provided and the `from` parameter is omitted, Twilio selects the optimal sender from the Messaging Service's Sender Pool. You may also provide a `from` parameter if you want to use a specific Sender from the Sender Pool. + :param body: The text content of the outgoing message. Can be up to 1,600 characters in length. SMS only: If the `body` contains more than 160 [GSM-7](https://www.twilio.com/docs/glossary/what-is-gsm-7-character-encoding) characters (or 70 [UCS-2](https://www.twilio.com/docs/glossary/what-is-ucs-2-character-encoding) characters), the message is segmented and charged accordingly. For long `body` text, consider using the [send_as_mms parameter](https://www.twilio.com/blog/mms-for-long-text-messages). + :param media_url: The URL of media to include in the Message content. `jpeg`, `jpg`, `gif`, and `png` file types are fully supported by Twilio and content is formatted for delivery on destination devices. The media size limit is 5 MB for supported file types (`jpeg`, `jpg`, `png`, `gif`) and 500 KB for [other types](https://www.twilio.com/docs/messaging/guides/accepted-mime-types) of accepted media. To send more than one image in the message, provide multiple `media_url` parameters in the POST request. You can include up to ten `media_url` parameters per message. [International](https://support.twilio.com/hc/en-us/articles/223179808-Sending-and-receiving-MMS-messages) and [carrier](https://support.twilio.com/hc/en-us/articles/223133707-Is-MMS-supported-for-all-carriers-in-US-and-Canada-) limits apply. + :param content_sid: For [Content Editor/API](https://www.twilio.com/docs/content) only: The SID of the Content Template to be used with the Message, e.g., `HXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`. If this parameter is not provided, a Content Template is not used. Find the SID in the Console on the Content Editor page. For Content API users, the SID is found in Twilio's response when [creating the Template](https://www.twilio.com/docs/content/content-api-resources#create-templates) or by [fetching your Templates](https://www.twilio.com/docs/content/content-api-resources#fetch-all-content-resources). + + :returns: The created MessageInstance + """ + + data = values.of( + { + "To": to, + "StatusCallback": status_callback, + "ApplicationSid": application_sid, + "MaxPrice": max_price, + "ProvideFeedback": serialize.boolean_to_string(provide_feedback), + "Attempt": attempt, + "ValidityPeriod": validity_period, + "ForceDelivery": serialize.boolean_to_string(force_delivery), + "ContentRetention": content_retention, + "AddressRetention": address_retention, + "SmartEncoded": serialize.boolean_to_string(smart_encoded), + "PersistentAction": serialize.map(persistent_action, lambda e: e), + "TrafficType": traffic_type, + "ShortenUrls": serialize.boolean_to_string(shorten_urls), + "ScheduleType": schedule_type, + "SendAt": serialize.iso8601_datetime(send_at), + "SendAsMms": serialize.boolean_to_string(send_as_mms), + "ContentVariables": content_variables, + "RiskCheck": risk_check, + "From": from_, + "MessagingServiceSid": messaging_service_sid, + "Body": body, + "MediaUrl": serialize.map(media_url, lambda e: e), + "ContentSid": content_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MessageInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + date_sent: Union[datetime, object] = values.unset, + date_sent_before: Union[datetime, object] = values.unset, + date_sent_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MessageInstance]: + """ + Streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str to: Filter by recipient. For example: Set this `to` parameter to `+15558881111` to retrieve a list of Message resources with `to` properties of `+15558881111` + :param str from_: Filter by sender. For example: Set this `from` parameter to `+15552229999` to retrieve a list of Message resources with `from` properties of `+15552229999` + :param datetime date_sent: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param datetime date_sent_before: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param datetime date_sent_after: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + to=to, + from_=from_, + date_sent=date_sent, + date_sent_before=date_sent_before, + date_sent_after=date_sent_after, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + date_sent: Union[datetime, object] = values.unset, + date_sent_before: Union[datetime, object] = values.unset, + date_sent_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MessageInstance]: + """ + Asynchronously streams MessageInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str to: Filter by recipient. For example: Set this `to` parameter to `+15558881111` to retrieve a list of Message resources with `to` properties of `+15558881111` + :param str from_: Filter by sender. For example: Set this `from` parameter to `+15552229999` to retrieve a list of Message resources with `from` properties of `+15552229999` + :param datetime date_sent: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param datetime date_sent_before: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param datetime date_sent_after: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + to=to, + from_=from_, + date_sent=date_sent, + date_sent_before=date_sent_before, + date_sent_after=date_sent_after, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + date_sent: Union[datetime, object] = values.unset, + date_sent_before: Union[datetime, object] = values.unset, + date_sent_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str to: Filter by recipient. For example: Set this `to` parameter to `+15558881111` to retrieve a list of Message resources with `to` properties of `+15558881111` + :param str from_: Filter by sender. For example: Set this `from` parameter to `+15552229999` to retrieve a list of Message resources with `from` properties of `+15552229999` + :param datetime date_sent: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param datetime date_sent_before: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param datetime date_sent_after: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + to=to, + from_=from_, + date_sent=date_sent, + date_sent_before=date_sent_before, + date_sent_after=date_sent_after, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + date_sent: Union[datetime, object] = values.unset, + date_sent_before: Union[datetime, object] = values.unset, + date_sent_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MessageInstance]: + """ + Asynchronously lists MessageInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str to: Filter by recipient. For example: Set this `to` parameter to `+15558881111` to retrieve a list of Message resources with `to` properties of `+15558881111` + :param str from_: Filter by sender. For example: Set this `from` parameter to `+15552229999` to retrieve a list of Message resources with `from` properties of `+15552229999` + :param datetime date_sent: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param datetime date_sent_before: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param datetime date_sent_after: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + to=to, + from_=from_, + date_sent=date_sent, + date_sent_before=date_sent_before, + date_sent_after=date_sent_after, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + date_sent: Union[datetime, object] = values.unset, + date_sent_before: Union[datetime, object] = values.unset, + date_sent_after: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param to: Filter by recipient. For example: Set this `to` parameter to `+15558881111` to retrieve a list of Message resources with `to` properties of `+15558881111` + :param from_: Filter by sender. For example: Set this `from` parameter to `+15552229999` to retrieve a list of Message resources with `from` properties of `+15552229999` + :param date_sent: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param date_sent_before: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param date_sent_after: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "To": to, + "From": from_, + "DateSent": serialize.iso8601_datetime(date_sent), + "DateSent<": serialize.iso8601_datetime(date_sent_before), + "DateSent>": serialize.iso8601_datetime(date_sent_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + async def page_async( + self, + to: Union[str, object] = values.unset, + from_: Union[str, object] = values.unset, + date_sent: Union[datetime, object] = values.unset, + date_sent_before: Union[datetime, object] = values.unset, + date_sent_after: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MessagePage: + """ + Asynchronously retrieve a single page of MessageInstance records from the API. + Request is executed immediately + + :param to: Filter by recipient. For example: Set this `to` parameter to `+15558881111` to retrieve a list of Message resources with `to` properties of `+15558881111` + :param from_: Filter by sender. For example: Set this `from` parameter to `+15552229999` to retrieve a list of Message resources with `from` properties of `+15552229999` + :param date_sent: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param date_sent_before: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param date_sent_after: Filter by Message `sent_date`. Accepts GMT dates in the following formats: `YYYY-MM-DD` (to find Messages with a specific `sent_date`), `<=YYYY-MM-DD` (to find Messages with `sent_date`s on and before a specific date), and `>=YYYY-MM-DD` (to find Messages with `sent_dates` on and after a specific date). + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MessageInstance + """ + data = values.of( + { + "To": to, + "From": from_, + "DateSent": serialize.iso8601_datetime(date_sent), + "DateSent<": serialize.iso8601_datetime(date_sent_before), + "DateSent>": serialize.iso8601_datetime(date_sent_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MessagePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MessagePage: + """ + Retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MessagePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MessagePage: + """ + Asynchronously retrieve a specific page of MessageInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MessageInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MessagePage(self._version, response, self._solution) + + def get(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: The SID of the Message resource to be updated + """ + return MessageContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> MessageContext: + """ + Constructs a MessageContext + + :param sid: The SID of the Message resource to be updated + """ + return MessageContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09430ae6e48c0488e274685b0d282c328fd178cf GIT binary patch literal 60823 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__pycache__/feedback.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/__pycache__/feedback.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e415f8fe08bdaf9fa3c0b125845424ffc234a06d GIT binary patch literal 6460 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/feedback.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/feedback.py new file mode 100644 index 00000000..cda2de2f --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/feedback.py @@ -0,0 +1,170 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class FeedbackInstance(InstanceResource): + + class Outcome(object): + CONFIRMED = "confirmed" + UNCONFIRMED = "unconfirmed" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) associated with this MessageFeedback resource. + :ivar message_sid: The SID of the Message resource associated with this MessageFeedback resource. + :ivar outcome: + :ivar date_created: The date and time in GMT when this MessageFeedback resource was created, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when this MessageFeedback resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + message_sid: str, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.message_sid: Optional[str] = payload.get("message_sid") + self.outcome: Optional["FeedbackInstance.Outcome"] = payload.get("outcome") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "message_sid": message_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class FeedbackList(ListResource): + + def __init__(self, version: Version, account_sid: str, message_sid: str): + """ + Initialize the FeedbackList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) associated with the Message resource for which to create MessageFeedback. + :param message_sid: The SID of the Message resource for which to create MessageFeedback. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "message_sid": message_sid, + } + self._uri = ( + "/Accounts/{account_sid}/Messages/{message_sid}/Feedback.json".format( + **self._solution + ) + ) + + def create( + self, outcome: Union["FeedbackInstance.Outcome", object] = values.unset + ) -> FeedbackInstance: + """ + Create the FeedbackInstance + + :param outcome: + + :returns: The created FeedbackInstance + """ + + data = values.of( + { + "Outcome": outcome, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return FeedbackInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + message_sid=self._solution["message_sid"], + ) + + async def create_async( + self, outcome: Union["FeedbackInstance.Outcome", object] = values.unset + ) -> FeedbackInstance: + """ + Asynchronously create the FeedbackInstance + + :param outcome: + + :returns: The created FeedbackInstance + """ + + data = values.of( + { + "Outcome": outcome, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return FeedbackInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + message_sid=self._solution["message_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/media.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/media.py new file mode 100644 index 00000000..b5d2926d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/message/media.py @@ -0,0 +1,564 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MediaInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) associated with this Media resource. + :ivar content_type: The default [MIME type](https://en.wikipedia.org/wiki/Internet_media_type) of the media, for example `image/jpeg`, `image/png`, or `image/gif`. + :ivar date_created: The date and time in GMT when this Media resource was created, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT when this Media resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar parent_sid: The SID of the Message resource that is associated with this Media resource. + :ivar sid: The unique string that identifies this Media resource. + :ivar uri: The URI of this Media resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + message_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.content_type: Optional[str] = payload.get("content_type") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.parent_sid: Optional[str] = payload.get("parent_sid") + self.sid: Optional[str] = payload.get("sid") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "message_sid": message_sid, + "sid": sid or self.sid, + } + self._context: Optional[MediaContext] = None + + @property + def _proxy(self) -> "MediaContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MediaContext for this MediaInstance + """ + if self._context is None: + self._context = MediaContext( + self._version, + account_sid=self._solution["account_sid"], + message_sid=self._solution["message_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the MediaInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MediaInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "MediaInstance": + """ + Fetch the MediaInstance + + + :returns: The fetched MediaInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MediaInstance": + """ + Asynchronous coroutine to fetch the MediaInstance + + + :returns: The fetched MediaInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MediaContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, message_sid: str, sid: str): + """ + Initialize the MediaContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) associated with the Media resource. + :param message_sid: The SID of the Message resource that is associated with the Media resource. + :param sid: The Twilio-provided string that uniquely identifies the Media resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "message_sid": message_sid, + "sid": sid, + } + self._uri = ( + "/Accounts/{account_sid}/Messages/{message_sid}/Media/{sid}.json".format( + **self._solution + ) + ) + + def delete(self) -> bool: + """ + Deletes the MediaInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the MediaInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> MediaInstance: + """ + Fetch the MediaInstance + + + :returns: The fetched MediaInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MediaInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + message_sid=self._solution["message_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> MediaInstance: + """ + Asynchronous coroutine to fetch the MediaInstance + + + :returns: The fetched MediaInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MediaInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + message_sid=self._solution["message_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MediaPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MediaInstance: + """ + Build an instance of MediaInstance + + :param payload: Payload response from the API + """ + return MediaInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + message_sid=self._solution["message_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MediaList(ListResource): + + def __init__(self, version: Version, account_sid: str, message_sid: str): + """ + Initialize the MediaList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that is associated with the Media resources. + :param message_sid: The SID of the Message resource that is associated with the Media resources. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "message_sid": message_sid, + } + self._uri = "/Accounts/{account_sid}/Messages/{message_sid}/Media.json".format( + **self._solution + ) + + def stream( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MediaInstance]: + """ + Streams MediaInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param datetime date_created: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param datetime date_created_before: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param datetime date_created_after: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MediaInstance]: + """ + Asynchronously streams MediaInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param datetime date_created: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param datetime date_created_before: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param datetime date_created_after: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MediaInstance]: + """ + Lists MediaInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param datetime date_created: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param datetime date_created_before: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param datetime date_created_after: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MediaInstance]: + """ + Asynchronously lists MediaInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param datetime date_created: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param datetime date_created_before: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param datetime date_created_after: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MediaPage: + """ + Retrieve a single page of MediaInstance records from the API. + Request is executed immediately + + :param date_created: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param date_created_before: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param date_created_after: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MediaInstance + """ + data = values.of( + { + "DateCreated": serialize.iso8601_datetime(date_created), + "DateCreated<": serialize.iso8601_datetime(date_created_before), + "DateCreated>": serialize.iso8601_datetime(date_created_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MediaPage(self._version, response, self._solution) + + async def page_async( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MediaPage: + """ + Asynchronously retrieve a single page of MediaInstance records from the API. + Request is executed immediately + + :param date_created: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param date_created_before: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param date_created_after: Only include Media resources that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read Media that were created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read Media that were created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read Media that were created on or after midnight of this date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MediaInstance + """ + data = values.of( + { + "DateCreated": serialize.iso8601_datetime(date_created), + "DateCreated<": serialize.iso8601_datetime(date_created_before), + "DateCreated>": serialize.iso8601_datetime(date_created_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MediaPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MediaPage: + """ + Retrieve a specific page of MediaInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MediaInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MediaPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MediaPage: + """ + Asynchronously retrieve a specific page of MediaInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MediaInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MediaPage(self._version, response, self._solution) + + def get(self, sid: str) -> MediaContext: + """ + Constructs a MediaContext + + :param sid: The Twilio-provided string that uniquely identifies the Media resource to fetch. + """ + return MediaContext( + self._version, + account_sid=self._solution["account_sid"], + message_sid=self._solution["message_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> MediaContext: + """ + Constructs a MediaContext + + :param sid: The Twilio-provided string that uniquely identifies the Media resource to fetch. + """ + return MediaContext( + self._version, + account_sid=self._solution["account_sid"], + message_sid=self._solution["message_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/new_key.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/new_key.py new file mode 100644 index 00000000..ba811ec1 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/new_key.py @@ -0,0 +1,144 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class NewKeyInstance(InstanceResource): + """ + :ivar sid: The unique string that that we created to identify the NewKey resource. You will use this as the basic-auth `user` when authenticating to the API. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT that the API Key was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the new API Key was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar secret: The secret your application uses to sign Access Tokens and to authenticate to the REST API (you will use this as the basic-auth `password`). **Note that for security reasons, this field is ONLY returned when the API Key is first created.** + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.secret: Optional[str] = payload.get("secret") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NewKeyList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the NewKeyList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that will be responsible for the new Key resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Keys.json".format(**self._solution) + + def create( + self, friendly_name: Union[str, object] = values.unset + ) -> NewKeyInstance: + """ + Create the NewKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The created NewKeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return NewKeyInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, friendly_name: Union[str, object] = values.unset + ) -> NewKeyInstance: + """ + Asynchronously create the NewKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The created NewKeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return NewKeyInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/new_signing_key.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/new_signing_key.py new file mode 100644 index 00000000..95341d31 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/new_signing_key.py @@ -0,0 +1,144 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, Optional, Union +from twilio.base import deserialize, values + +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class NewSigningKeyInstance(InstanceResource): + """ + :ivar sid: The unique string that that we created to identify the NewSigningKey resource. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar secret: The secret your application uses to sign Access Tokens and to authenticate to the REST API (you will use this as the basic-auth `password`). **Note that for security reasons, this field is ONLY returned when the API Key is first created.** + """ + + def __init__(self, version: Version, payload: Dict[str, Any], account_sid: str): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.secret: Optional[str] = payload.get("secret") + + self._solution = { + "account_sid": account_sid, + } + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NewSigningKeyList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the NewSigningKeyList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that will be responsible for the new Key resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/SigningKeys.json".format(**self._solution) + + def create( + self, friendly_name: Union[str, object] = values.unset + ) -> NewSigningKeyInstance: + """ + Create the NewSigningKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The created NewSigningKeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return NewSigningKeyInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, friendly_name: Union[str, object] = values.unset + ) -> NewSigningKeyInstance: + """ + Asynchronously create the NewSigningKeyInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The created NewSigningKeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return NewSigningKeyInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/notification.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/notification.py new file mode 100644 index 00000000..cd35efea --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/notification.py @@ -0,0 +1,540 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import date, datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class NotificationInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Notification resource. + :ivar api_version: The API version used to generate the notification. Can be empty for events that don't have a specific API version, such as incoming phone calls. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Notification resource is associated with. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar error_code: A unique error code for the error condition that is described in our [Error Dictionary](https://www.twilio.com/docs/api/errors). + :ivar log: An integer log level that corresponds to the type of notification: `0` is ERROR, `1` is WARNING. + :ivar message_date: The date the notification was actually generated in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. Message buffering can cause this value to differ from `date_created`. + :ivar message_text: The text of the notification. + :ivar more_info: The URL for more information about the error condition. This value is a page in our [Error Dictionary](https://www.twilio.com/docs/api/errors). + :ivar request_method: The HTTP method used to generate the notification. If the notification was generated during a phone call, this is the HTTP Method used to request the resource on your server. If the notification was generated by your use of our REST API, this is the HTTP method used to call the resource on our servers. + :ivar request_url: The URL of the resource that generated the notification. If the notification was generated during a phone call, this is the URL of the resource on your server that caused the notification. If the notification was generated by your use of our REST API, this is the URL of the resource you called. + :ivar request_variables: The HTTP GET or POST variables we sent to your server. However, if the notification was generated by our REST API, this contains the HTTP POST or PUT variables you sent to our API. + :ivar response_body: The HTTP body returned by your server. + :ivar response_headers: The HTTP headers returned by your server. + :ivar sid: The unique string that that we created to identify the Notification resource. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.call_sid: Optional[str] = payload.get("call_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.error_code: Optional[str] = payload.get("error_code") + self.log: Optional[str] = payload.get("log") + self.message_date: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("message_date") + ) + self.message_text: Optional[str] = payload.get("message_text") + self.more_info: Optional[str] = payload.get("more_info") + self.request_method: Optional[str] = payload.get("request_method") + self.request_url: Optional[str] = payload.get("request_url") + self.request_variables: Optional[str] = payload.get("request_variables") + self.response_body: Optional[str] = payload.get("response_body") + self.response_headers: Optional[str] = payload.get("response_headers") + self.sid: Optional[str] = payload.get("sid") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[NotificationContext] = None + + @property + def _proxy(self) -> "NotificationContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: NotificationContext for this NotificationInstance + """ + if self._context is None: + self._context = NotificationContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "NotificationInstance": + """ + Fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "NotificationInstance": + """ + Asynchronous coroutine to fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NotificationContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the NotificationContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Notification resource to fetch. + :param sid: The Twilio-provided string that uniquely identifies the Notification resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Notifications/{sid}.json".format( + **self._solution + ) + + def fetch(self) -> NotificationInstance: + """ + Fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return NotificationInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> NotificationInstance: + """ + Asynchronous coroutine to fetch the NotificationInstance + + + :returns: The fetched NotificationInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return NotificationInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class NotificationPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> NotificationInstance: + """ + Build an instance of NotificationInstance + + :param payload: Payload response from the API + """ + return NotificationInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class NotificationList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the NotificationList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Notification resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Notifications.json".format( + **self._solution + ) + + def stream( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[NotificationInstance]: + """ + Streams NotificationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param date message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + log=log, + message_date=message_date, + message_date_before=message_date_before, + message_date_after=message_date_after, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[NotificationInstance]: + """ + Asynchronously streams NotificationInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param int log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param date message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + log=log, + message_date=message_date, + message_date_before=message_date_before, + message_date_after=message_date_after, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[NotificationInstance]: + """ + Lists NotificationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param date message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + log=log, + message_date=message_date, + message_date_before=message_date_before, + message_date_after=message_date_after, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[NotificationInstance]: + """ + Asynchronously lists NotificationInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param int log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param date message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param date message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + log=log, + message_date=message_date, + message_date_before=message_date_before, + message_date_after=message_date_after, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> NotificationPage: + """ + Retrieve a single page of NotificationInstance records from the API. + Request is executed immediately + + :param log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of NotificationInstance + """ + data = values.of( + { + "Log": log, + "MessageDate": serialize.iso8601_date(message_date), + "MessageDate<": serialize.iso8601_date(message_date_before), + "MessageDate>": serialize.iso8601_date(message_date_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return NotificationPage(self._version, response, self._solution) + + async def page_async( + self, + log: Union[int, object] = values.unset, + message_date: Union[date, object] = values.unset, + message_date_before: Union[date, object] = values.unset, + message_date_after: Union[date, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> NotificationPage: + """ + Asynchronously retrieve a single page of NotificationInstance records from the API. + Request is executed immediately + + :param log: Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + :param message_date: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param message_date_before: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param message_date_after: Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of NotificationInstance + """ + data = values.of( + { + "Log": log, + "MessageDate": serialize.iso8601_date(message_date), + "MessageDate<": serialize.iso8601_date(message_date_before), + "MessageDate>": serialize.iso8601_date(message_date_after), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return NotificationPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> NotificationPage: + """ + Retrieve a specific page of NotificationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of NotificationInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return NotificationPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> NotificationPage: + """ + Asynchronously retrieve a specific page of NotificationInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of NotificationInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return NotificationPage(self._version, response, self._solution) + + def get(self, sid: str) -> NotificationContext: + """ + Constructs a NotificationContext + + :param sid: The Twilio-provided string that uniquely identifies the Notification resource to fetch. + """ + return NotificationContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> NotificationContext: + """ + Constructs a NotificationContext + + :param sid: The Twilio-provided string that uniquely identifies the Notification resource to fetch. + """ + return NotificationContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/outgoing_caller_id.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/outgoing_caller_id.py new file mode 100644 index 00000000..eeb9954c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/outgoing_caller_id.py @@ -0,0 +1,620 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class OutgoingCallerIdInstance(InstanceResource): + """ + :ivar sid: The unique string that that we created to identify the OutgoingCallerId resource. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the OutgoingCallerId resource. + :ivar phone_number: The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.account_sid: Optional[str] = payload.get("account_sid") + self.phone_number: Optional[str] = payload.get("phone_number") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[OutgoingCallerIdContext] = None + + @property + def _proxy(self) -> "OutgoingCallerIdContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: OutgoingCallerIdContext for this OutgoingCallerIdInstance + """ + if self._context is None: + self._context = OutgoingCallerIdContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the OutgoingCallerIdInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the OutgoingCallerIdInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "OutgoingCallerIdInstance": + """ + Fetch the OutgoingCallerIdInstance + + + :returns: The fetched OutgoingCallerIdInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "OutgoingCallerIdInstance": + """ + Asynchronous coroutine to fetch the OutgoingCallerIdInstance + + + :returns: The fetched OutgoingCallerIdInstance + """ + return await self._proxy.fetch_async() + + def update( + self, friendly_name: Union[str, object] = values.unset + ) -> "OutgoingCallerIdInstance": + """ + Update the OutgoingCallerIdInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated OutgoingCallerIdInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + ) + + async def update_async( + self, friendly_name: Union[str, object] = values.unset + ) -> "OutgoingCallerIdInstance": + """ + Asynchronous coroutine to update the OutgoingCallerIdInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated OutgoingCallerIdInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OutgoingCallerIdContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the OutgoingCallerIdContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the OutgoingCallerId resources to update. + :param sid: The Twilio-provided string that uniquely identifies the OutgoingCallerId resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/OutgoingCallerIds/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the OutgoingCallerIdInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the OutgoingCallerIdInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> OutgoingCallerIdInstance: + """ + Fetch the OutgoingCallerIdInstance + + + :returns: The fetched OutgoingCallerIdInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return OutgoingCallerIdInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> OutgoingCallerIdInstance: + """ + Asynchronous coroutine to fetch the OutgoingCallerIdInstance + + + :returns: The fetched OutgoingCallerIdInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return OutgoingCallerIdInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, friendly_name: Union[str, object] = values.unset + ) -> OutgoingCallerIdInstance: + """ + Update the OutgoingCallerIdInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated OutgoingCallerIdInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return OutgoingCallerIdInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, friendly_name: Union[str, object] = values.unset + ) -> OutgoingCallerIdInstance: + """ + Asynchronous coroutine to update the OutgoingCallerIdInstance + + :param friendly_name: A descriptive string that you create to describe the resource. It can be up to 64 characters long. + + :returns: The updated OutgoingCallerIdInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return OutgoingCallerIdInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class OutgoingCallerIdPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> OutgoingCallerIdInstance: + """ + Build an instance of OutgoingCallerIdInstance + + :param payload: Payload response from the API + """ + return OutgoingCallerIdInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class OutgoingCallerIdList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the OutgoingCallerIdList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the OutgoingCallerId resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/OutgoingCallerIds.json".format( + **self._solution + ) + + def stream( + self, + phone_number: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[OutgoingCallerIdInstance]: + """ + Streams OutgoingCallerIdInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str phone_number: The phone number of the OutgoingCallerId resources to read. + :param str friendly_name: The string that identifies the OutgoingCallerId resources to read. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + phone_number=phone_number, + friendly_name=friendly_name, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + phone_number: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[OutgoingCallerIdInstance]: + """ + Asynchronously streams OutgoingCallerIdInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str phone_number: The phone number of the OutgoingCallerId resources to read. + :param str friendly_name: The string that identifies the OutgoingCallerId resources to read. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + phone_number=phone_number, + friendly_name=friendly_name, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + phone_number: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[OutgoingCallerIdInstance]: + """ + Lists OutgoingCallerIdInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str phone_number: The phone number of the OutgoingCallerId resources to read. + :param str friendly_name: The string that identifies the OutgoingCallerId resources to read. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + phone_number=phone_number, + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + phone_number: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[OutgoingCallerIdInstance]: + """ + Asynchronously lists OutgoingCallerIdInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str phone_number: The phone number of the OutgoingCallerId resources to read. + :param str friendly_name: The string that identifies the OutgoingCallerId resources to read. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + phone_number=phone_number, + friendly_name=friendly_name, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + phone_number: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> OutgoingCallerIdPage: + """ + Retrieve a single page of OutgoingCallerIdInstance records from the API. + Request is executed immediately + + :param phone_number: The phone number of the OutgoingCallerId resources to read. + :param friendly_name: The string that identifies the OutgoingCallerId resources to read. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of OutgoingCallerIdInstance + """ + data = values.of( + { + "PhoneNumber": phone_number, + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return OutgoingCallerIdPage(self._version, response, self._solution) + + async def page_async( + self, + phone_number: Union[str, object] = values.unset, + friendly_name: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> OutgoingCallerIdPage: + """ + Asynchronously retrieve a single page of OutgoingCallerIdInstance records from the API. + Request is executed immediately + + :param phone_number: The phone number of the OutgoingCallerId resources to read. + :param friendly_name: The string that identifies the OutgoingCallerId resources to read. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of OutgoingCallerIdInstance + """ + data = values.of( + { + "PhoneNumber": phone_number, + "FriendlyName": friendly_name, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return OutgoingCallerIdPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> OutgoingCallerIdPage: + """ + Retrieve a specific page of OutgoingCallerIdInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of OutgoingCallerIdInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return OutgoingCallerIdPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> OutgoingCallerIdPage: + """ + Asynchronously retrieve a specific page of OutgoingCallerIdInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of OutgoingCallerIdInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return OutgoingCallerIdPage(self._version, response, self._solution) + + def get(self, sid: str) -> OutgoingCallerIdContext: + """ + Constructs a OutgoingCallerIdContext + + :param sid: The Twilio-provided string that uniquely identifies the OutgoingCallerId resource to update. + """ + return OutgoingCallerIdContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> OutgoingCallerIdContext: + """ + Constructs a OutgoingCallerIdContext + + :param sid: The Twilio-provided string that uniquely identifies the OutgoingCallerId resource to update. + """ + return OutgoingCallerIdContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/__init__.py new file mode 100644 index 00000000..e76fda12 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/__init__.py @@ -0,0 +1,687 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.queue.member import MemberList + + +class QueueInstance(InstanceResource): + """ + :ivar date_updated: The date and time in GMT that this resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar current_size: The number of calls currently in the queue. + :ivar friendly_name: A string that you assigned to describe this resource. + :ivar uri: The URI of this resource, relative to `https://api.twilio.com`. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this Queue resource. + :ivar average_wait_time: The average wait time in seconds of the members in this queue. This is calculated at the time of the request. + :ivar sid: The unique string that that we created to identify this Queue resource. + :ivar date_created: The date and time in GMT that this resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar max_size: The maximum number of calls that can be in the queue. The default is 1000 and the maximum is 5000. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.current_size: Optional[int] = deserialize.integer( + payload.get("current_size") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.uri: Optional[str] = payload.get("uri") + self.account_sid: Optional[str] = payload.get("account_sid") + self.average_wait_time: Optional[int] = deserialize.integer( + payload.get("average_wait_time") + ) + self.sid: Optional[str] = payload.get("sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.max_size: Optional[int] = deserialize.integer(payload.get("max_size")) + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[QueueContext] = None + + @property + def _proxy(self) -> "QueueContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: QueueContext for this QueueInstance + """ + if self._context is None: + self._context = QueueContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the QueueInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the QueueInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "QueueInstance": + """ + Fetch the QueueInstance + + + :returns: The fetched QueueInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "QueueInstance": + """ + Asynchronous coroutine to fetch the QueueInstance + + + :returns: The fetched QueueInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + max_size: Union[int, object] = values.unset, + ) -> "QueueInstance": + """ + Update the QueueInstance + + :param friendly_name: A descriptive string that you created to describe this resource. It can be up to 64 characters long. + :param max_size: The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + + :returns: The updated QueueInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + max_size=max_size, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + max_size: Union[int, object] = values.unset, + ) -> "QueueInstance": + """ + Asynchronous coroutine to update the QueueInstance + + :param friendly_name: A descriptive string that you created to describe this resource. It can be up to 64 characters long. + :param max_size: The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + + :returns: The updated QueueInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + max_size=max_size, + ) + + @property + def members(self) -> MemberList: + """ + Access the members + """ + return self._proxy.members + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class QueueContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the QueueContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Queue resource to update. + :param sid: The Twilio-provided string that uniquely identifies the Queue resource to update + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Queues/{sid}.json".format(**self._solution) + + self._members: Optional[MemberList] = None + + def delete(self) -> bool: + """ + Deletes the QueueInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the QueueInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> QueueInstance: + """ + Fetch the QueueInstance + + + :returns: The fetched QueueInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return QueueInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> QueueInstance: + """ + Asynchronous coroutine to fetch the QueueInstance + + + :returns: The fetched QueueInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return QueueInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + max_size: Union[int, object] = values.unset, + ) -> QueueInstance: + """ + Update the QueueInstance + + :param friendly_name: A descriptive string that you created to describe this resource. It can be up to 64 characters long. + :param max_size: The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + + :returns: The updated QueueInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "MaxSize": max_size, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return QueueInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + max_size: Union[int, object] = values.unset, + ) -> QueueInstance: + """ + Asynchronous coroutine to update the QueueInstance + + :param friendly_name: A descriptive string that you created to describe this resource. It can be up to 64 characters long. + :param max_size: The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + + :returns: The updated QueueInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "MaxSize": max_size, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return QueueInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + @property + def members(self) -> MemberList: + """ + Access the members + """ + if self._members is None: + self._members = MemberList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._members + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class QueuePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> QueueInstance: + """ + Build an instance of QueueInstance + + :param payload: Payload response from the API + """ + return QueueInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class QueueList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the QueueList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Queue resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Queues.json".format(**self._solution) + + def create( + self, friendly_name: str, max_size: Union[int, object] = values.unset + ) -> QueueInstance: + """ + Create the QueueInstance + + :param friendly_name: A descriptive string that you created to describe this resource. It can be up to 64 characters long. + :param max_size: The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + + :returns: The created QueueInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "MaxSize": max_size, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return QueueInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, friendly_name: str, max_size: Union[int, object] = values.unset + ) -> QueueInstance: + """ + Asynchronously create the QueueInstance + + :param friendly_name: A descriptive string that you created to describe this resource. It can be up to 64 characters long. + :param max_size: The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + + :returns: The created QueueInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "MaxSize": max_size, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return QueueInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[QueueInstance]: + """ + Streams QueueInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[QueueInstance]: + """ + Asynchronously streams QueueInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[QueueInstance]: + """ + Lists QueueInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[QueueInstance]: + """ + Asynchronously lists QueueInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> QueuePage: + """ + Retrieve a single page of QueueInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of QueueInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return QueuePage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> QueuePage: + """ + Asynchronously retrieve a single page of QueueInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of QueueInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return QueuePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> QueuePage: + """ + Retrieve a specific page of QueueInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of QueueInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return QueuePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> QueuePage: + """ + Asynchronously retrieve a specific page of QueueInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of QueueInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return QueuePage(self._version, response, self._solution) + + def get(self, sid: str) -> QueueContext: + """ + Constructs a QueueContext + + :param sid: The Twilio-provided string that uniquely identifies the Queue resource to update + """ + return QueueContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> QueueContext: + """ + Constructs a QueueContext + + :param sid: The Twilio-provided string that uniquely identifies the Queue resource to update + """ + return QueueContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..890cc0e484a12ba1c2b3abfe99cfca2979f5e940 GIT binary patch literal 28051 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 L_o+a4)|dYSFGskT literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/__pycache__/member.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/__pycache__/member.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..711df37b5eab8fa6b4dfe3da1972bc5ceab578c8 GIT binary patch literal 23309 zcmeHvd2k%pd1v=b&xrvB#NZ}CH&0+FU_gSG10E50NTEeSG!M%QQ63Iw8st!OKs^Ie z0D(l27za$r5m`x0Fc&G?iGfgwp={Nf&Tg%w|6H}TRUE@rK=n!+rjkms{|!AFfUcdY5@B7~Oe(!tp-)d{U0-iU2a_a2-VL|vu3K)+=_Y^*a z=b8``hJ~0Ivn9l&I4p|fw;JJ4NFPKup{Xlb|ziJuB3a|o%9TQSRN_iP1X$8 zBz?m^7Iq|RlXb&&%NFuywyNHz{PGQTI$lx!Yu76qH|tPt~F z5@Iz<{VhB1+i(ku^&z%asWW3+S!^9*{YtYL+s0z+5xYWZFk{=t8-jtzKZ}CkmGK-u z8_&qmbWD*iL^ARjC8em5tP+z?k5h6u9F~j!D1xHGRFJ*7vn;6RvSgups8~46TAh^T zN%J3~DS-dT!c)RwieW)=sL9Ebh~d6)xQ~2#B|N&%tT#N#3iGUbK2*-Dq|DS^1YaVD z8a!##E6dad|8L|!>E+XOA)bh*^5Bt! zAzpIm`Qrx$^l45+GOSQ!ESoNwYx((6C51Bbv-|_3)evjtY&JWZ8R+XvBRMh}@72E# zlCw(mEX%S#EvM31S&7B7tTR#8NHUTdizE``A@Bbp$_a{^JBII?jVG0$OS2EA#x-ew zJet*{L-9;jb3Z?tji*zQgyuMrf=6>7%n~7_Rjqa~GoFeX!Jtj6i76RHjYksk2}N_B zk0i#F4C?nEOl7i>R8-lQPGyx>vxurUqK+z=^q3k|5a*-zEMeEz6g7hukt7|7oKd2j z(7Ef=1BHKv=Xb%AiZCpKFKsb#*zN&c$83revnvk8sklaLZO9dq6lV6Tvca7`=#9+QTBc-Pd|iFwD77p+;mI`HfnW;mE>tfH6}0ee+*t7h@X$B zaunY+oQcPXs1*6w!ToZ2gnjuJ_aWt_Zi8knT(}U*GLj5M)5*SAI-2P_pN>bBK2TC0 z)zYgP--VUu&B{h3Q8(x{9gQ=Aa3P*O%ZZYAgUBhYq+S_Q#uU9T6or~1oDh?26ilob z*?QzN@$*Vbj;G|K&+L=?zuez1kEGRPBx|jCG@XePHR@c$>*<1&8dFszm6eTjs)pE) zb-`M}m>TDkbK>YhV{(j9^r9Q&$DwL7 zN;I8{aS@;o_AF%RX@!rlV%Jz-D}KGN(nPZH=yj2NN%4+ouJfErG}mZkJduvXw3c9R;#%U@`ySu^h-+{Eg^;f30nFi@tTk|6E8a_g>NB!QoMyUdPHH;cFtG~ zc@%SFW{ycAtS?A{ko6c@&atJ{2=RB7nruc}#v3)7{k7CsS6Ul|s?=yVYBJua(QTBj zQbw}mHAnH8T6Y*V8E>?1&PJ8iotC^cW>4*t(xl^6F$3jcQaESMiIENg=lWASYBxk9 z)D(njjr4IL=pIsA5!7l+I8<{RY@^x1ADYJ`YqbTr=j>`TUd+#m2kSIPW^7bZHFr21 zPk{x(n*EHDWr-^FSF2Y?qQt^sV`Wj>DcTi>{6C|p>Po7xgPcxss2R-@&ZHA##NDVD z?88f>A(8XZ?)|r-{x>w)r3Vr|L+ZX2t z7P|IKOK;YGxOvy&=EJ$ohnIYTx1PKF+>C$0*IlsN`n}WAPu=bJokI7P#jb%|*TC%^ z@9q52&i5x4b{<{mI!0xe)&#%*)Z0(ZDhq42BJBPUS-W@Ux_91w_PytR^xThY7Iqz9 z=stm@x~1;EAJoj%%s;o#{WOL1PNAb~scp?ttNfGJ%{TXd|M1&~@42LQw2DNp(7%0J z`c`cLLl88ls$|F1R8*G)6erM(GuiQ9;JHRrNwHeh4Y$_uNQpvZ|%Ok`%aDgVMlPOzVTY^)!L;F z`Nq)oq1oNJj$d19Uv(pNJv6&A*S>A3t@FmJ>#JtHxwb9$J&w-0>HTjW&ijP=#5rlAfd<3}|G}K4XOwL8ESvb!p?NEP08+L_ zr~p1!S$2b_f;P1eEou&yPYuCunMk!C;fco5vLTjrh;ovA#3a_y3|zc?anUd5{PKc- z%^mle2L_ggdM`0(qG#zh(X(fj5$qg z18`PNr--JbX*CV`onq<}>--a(z#(G>Ygo2kO(L;uQ%hg9i%jIe#lOVh-AJKsP8|e!qY({A#N)l&`x2`H!^fFl)U5SL` zeUOQ#75UV&2acbTAqr0&dHxuDkrV_K%EXkB$XFsv`vaa5GIC@TLm#G!uzQe|6k!W7 zrscERSuMQg<+;%bbsU|;Xcg=~Gx`>~R1y*+@@`jU#5tQvB0}8(#~>*uF9St~1Y9va zLthmwFkz?eL|~bu<0VfaDMMvJQ_UumuFm;aFVzQ@0&RJRP`{=i*z3J{!S3;Lo-HS# zH&DLtbvTd9v!!GN&b3wHT>C#z2wah3L*$RhCvSw3~_2!y-O{!}Sf$EyQpO~Zv`m6Wq!fo|N z@w;NT^gYK$v1BbZcZ8QvJ-|-!94+}}Pt10SbTeIcSraSm4~2*#4Iz2~v zWZ6^Pb3!gk4~ojv5jA~24oos4kEn47mBcu~elP12biRVk`;DKis;d-x*s(U6jmQh1EOydrRL%R}b?Cdjp zLT27?QkTC3hY`n5+K;`ve|~WOm6;tk_FUgHyL$Gki!1wb?ZLCt}EQ!=B{%s{A;^wV6rmYN~5(B&p=5_v}} zY?OGyYsj4;sSNSy69UcGy03Pld$;$$H}s>S#a%~oyN)dEI{MT0V+#$(rd><^ZHxY0 zIsdNPFD&>E+;JaZ;xs4{Z*4>+Y7ZR4A0U4-^&y3Y0~=LuIGjw!#uDWBg~P7^3e{6w z;V^(Obhe%iZFOwFyP`Gkz#BWbhUP2LnJrh&UR{-UQH)z?Zp(Yf=M@@T@-^hctgf8da<%tk zDx2RbIO~39t8;V~?C|B8Pj)%h78+cRzI>yweb*09zI*bXz0ToX3N+{0TV8)NI=lVm z%Q?B9McnnY6&%QrU-Nj`(atmC%-T-`db2Obh8o2v&Bp*|3hyJT6x&toI<6}L&6P&n z48L_;@(nwH>Jnn=0%GdY{ciZ(isu}G2W1aXTMzJIuTrB(icd#vsRk#oUI(z=$1UYU zsXDYPp%1la*UwPfdI+yNMvxrACa4U2z8 zWJrpWv?fw6d%h?BzK9*NnKEtjV0RaX{9wdlUiY zOJX5{9W$%IP(;ghSPN>&by+KZJ;))=heO!$NRnYTdQCySaaCa`by1r!aqR94@}zZ@ zahYPwz@CQyvcQ-xoQ=~qF)fe8bqzSlupo@IYPALm%Ln;+ka^1l8IxLNL~NHovA0j3 z#!TNu%WO~eu^j>;%@I%aap{jZqq|d~bD4B%Xik`OsI;^&X~|e3;fZG6m`+nBe)cBPGB}B4_*ruaeg+|D09Qr4$|ux*UA*Hv zvgmsu=X>FvV5_ZLYG}R|x*ED?hd*x@Jhk8QaG663MafD}GKVzsf*Z6C5L{PJgo-Lo zT(GDw;v`OjNrS7*V3m}c7+~6ShLl4|4{1S&AjVw?rS}KuMsKUKk+o7nF4j z4#QdlZP$WVgEM>opm*AJw<9#|y5i2c+wOuIdaw2_HmuJzte-t`TYAs)BhQa_+-X?P z6pMfIcP;^?I((T>*rnEv8+F&~ZcgP|w=DrBNL@|cd@i2~86oEkoS}yhlNzU7jGCAhR!U7O!M&vvM7bu~Do_yLi~VOR@OyBW>I~Sv z3Mqj+YOmKWwrX~$0XVQN04N+Q-Km;9=c80ADK#}m<O_4%_KK0iy$T^#4 zKS2=SVFm#{SZx)GulC|hy_a@#y};shXzPKGEorH2@9}YL8BEHCIRj9$Imse6B|^ni zCiKddO@_~N!D*p&0;9?$r@r>mMvB**B_FGk2~uk4*9J&uU(V^?97vuh4O&erAJU#cK+H{=>N00^7O-Wb0= zKAXM$0vILG1xESYJhB{2Gez&IM-;uk>P!H!?Jg19pPeawA>mhHm>R|uz9LhYV!Kw| zLu8gDhd?Ry6>>~kS5*pT;5?!fXB*`*DNgHprks2!qk;98k}sF!pHQK9;c!X*`RLdX z_x-un{&G5Q+wyNC@Yn4Pi63kb_x4C1bV1;Ue&ta*br7?y?uApLT9Z1t1%FQvL{s-u zO9#k#7Eb93{~Tf_f~70Gfk9OO%T_~5sE4R3+G|X#t%ii@G)6#}N~dxv9c@~XE(Y%` z-^_4~Yb9EF9E@x0qJL-3k2CxQ|NcAf{T$<3p&qA(PmuF9au`%aX9lWFPJkSyRFjs& zlx=mGd?XUp7s+7@hY3chCn@eFI933vha$-#Jt*@xZ~#E%r53}HQSfH9s6xDG6zoxnp zv~&7ny7)SD7#QpZy!bAT25%t3J{SwZaEM!07^pB!YRH<r;^@+>=MK1K!gT`23fAzrqk&jrGY8IoP! z$JllV+vqaBC6TByzNPN)d7C01)y&%@69&zvfdmAw z>OL2YX_;05=+q4m)cer9HD+E9^7H%m|Po&riNURo1xB=nT zSb(LsA-xgdc1ySk;gu*$(ykf)4hCL#Lb9|PGLLMt%P{OH(XR0jMYCNe5nCC2EmelE zY2OLx*%XUU2)y10E-^(_Mev%&vP=g4KZ#re+KxR@+`2d|>Lfno#E!>@j5$usg;)f2 z1RWJIVRq_8R0A-$1P#{ZDt#mq3jTGHe5C1pip8LzA{30BscyIE7Mf0ocNz~bHXhG4 z9tRHG1epmvgm}LDOH2%1@J;o96 z6v4ezQ`s|V=j;4CMfe4*LXcJYQwc$GM2wp!u`D7@toQO=sar90G=NYp;vg#QbiAQlRpG6{q zuq@8R$s7{)=WJ4O1brBUVcxen`c7Fd&~8#b{&}FwHuPCj7=6;UI^%AJV6!J7{*ENVoW$8H05a ztV9)d`jb*1QS_oRdc>|jq9i?luD&}tXZvY)Mb+8fIMX0EU zp#W?tVh^eI^jH?O#Amix0N;zzRCkbfEs})+!6+eAg|;YiNLQQ4XR}~4*jonUhQ05u`#z||H7fBs(&c zJyxriM;Cbjx9lb0*5ismiIl{m2m~;-mYpX!A}^zp=6ADNyFoVbN&P}H>XJYgIgBj7 zkc^m=FC-&f@qB#AsD2aNIAj%!>hB^(^Rgv`S#4`R&V0J@m?f{&{x*|b@w zu1TF%aIR%&VYtNd+&75p6% z3f)M-25|#S@af1M7wMLoS1z@$1!LE?!V+3Py0k!qR(2(}rVbSd!Z4K|om~-SKBVXr z8M@ryzF&CD9<`kjqP8uDDZa!n(LgD(U$wpIgNo9KKhJjLnX(^)D>B~&fhjKbh#TE9 zzgwB&LWBK6N|efnFQf!!pxUO32<9PMu3vR2p=dtyA?c5uJH?x}?b3Io ze&=6`o4nt*_dEYe+AjT#xKo@L`<;I)ZkPU}d#9+YNZItuN=mC?>JmpIN^n+F_Yg1u ztL{DS@xhVi)D}V7h3j^g^&+3S@swf zlF*>skykJcrl>p$)B8AZ7dZkfAaw??6HOyw8ho`d4!}%x#|nTIb*ZEJl{Y9*%BxCr zjDGYco=oC*RA5M)7`I>v98Y53ihVaaK|7-yr%y;1cP{vJ8i3z?EVe z#qw!0+rxbok2z3v1-_5wrtmSsP+viiTY|*Mr;sxOr^MdL$!0FYtdoMvteXfH;nq#G z6!Y81F3$OXL=oR6=Mp)liIe6w&MYmz1E3=+R9%U}Fp9qZ9SMNnLJAZH*|2fy>{@DF zyVS8BM#ZEnfURNXWZD3J<4*69I~`wLXgE4;wJHs?T-$wh_hMjuF0j663Mkz^0~@Et z4X_Pq^iI2Rg}=UiX5Ee6>%FtB^ILzo=iNOE{=IkHdpQV0;>&nUJ){F&d=%4B(no$( z*?gJp(i32N=uYdIrsRpdW@Y~}O$pTeg*5mjNCR~Slv|bU)jvV%&~hIC78N>8j>+Td zpCP!MeJN+jDo*Un7x(``OibzA#_RL(F@ANR^LpoE+vZ%G#iW<>aXT6Hwv$osLzy}6 zLi&SD1A6rO;F`TY@q=~ZUa$1Q`VH`FUYK~2g##=^qvok6vJ&b_8sRMGO~Q7})QOrIWbPq&fNT#b_?Q znIbV87a4A1?$kerQ?iNG+(Zb}6T^;#>8D2I|0cSo-_HQp-yk%$@&%?V7wB3HgmQt< zVqkkNuzh~)_PK??!D;u0{IbUCCGrurRxN%gyMv|61cb(pm%W&Z-HrNmfg(4D?z(yvF9kR(rXgPPbW z6yG*A2>96+CNz6_2&g(H<7#9CD<9*L{$bXHU)jsK*OXf>>xlO|?O z@`C**@TsvV9ZKu_3Ed>rB24&(z_>H_OTFS}8sf3beh@#*jFY4lSDesH&HuI?HYEtl#9{<=d(BO9SdVo|i>RQd`kVW;XJl0zHoa^qkoBiQDPbSm{P$(bXEkrEM#I!_L> zQmkk?{M(dF&TdRwrV|5Uro#;|R&?bByym0q^?vkY3gvqQdEFB3w7XgyJMa2iX6%=z z@(%cMuf4HjX5ZD_c}l@`PjADOP|mZu;Gy95VyQvVQfyExDTg2mwp{tmoM!_SMA$6Z z3TtDdJ@_r5l)2W=Nvw(~A-u#!1_S!6^;J1{bkfjs_2ZW8Ae$X-3v4mI8T+dQ> z=m)+z-#yQl9Q(w(jcqe)XU@+&m22FPcTf!KYQ`P?o6eb?xu&kXi^aJGBgP{Wd+5&zAb*eiO`xtm+^0=;Jk3hbS4WuXj@ou4pbVSYNZj~S!hJggg| zlAUURMa_0v?NdJ~+NTn|3FEf5?vHNF@;jy-mgtaSYi#_ipjt~MJ1b^^mdJjPR;{BvZPq*q0u{}4IwjNs)^y#3 zkXhwx_0|+p^cYUUIg_yyV>ZSwr%)4Pbp~EOaPQ*3P_ak-J0yUQgv=Q@dAlfz_iR2< z`nW?7SN*+kXi+$n6At~o@YF}bmp>8)J`(yr61qMTR^NA~MDZE%PSg7P0`uKJZU4GW kJRn|q{=UFG_s>gBV&9d<`vP9~H(jtJ(DAWAZ`P6j3u(8bSpWb4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/member.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/member.py new file mode 100644 index 00000000..30ff4abb --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/queue/member.py @@ -0,0 +1,564 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class MemberInstance(InstanceResource): + """ + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Member resource is associated with. + :ivar date_enqueued: The date that the member was enqueued, given in RFC 2822 format. + :ivar position: This member's current position in the queue. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar wait_time: The number of seconds the member has been in the queue. + :ivar queue_sid: The SID of the Queue the member is in. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + queue_sid: str, + call_sid: Optional[str] = None, + ): + super().__init__(version) + + self.call_sid: Optional[str] = payload.get("call_sid") + self.date_enqueued: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_enqueued") + ) + self.position: Optional[int] = deserialize.integer(payload.get("position")) + self.uri: Optional[str] = payload.get("uri") + self.wait_time: Optional[int] = deserialize.integer(payload.get("wait_time")) + self.queue_sid: Optional[str] = payload.get("queue_sid") + + self._solution = { + "account_sid": account_sid, + "queue_sid": queue_sid, + "call_sid": call_sid or self.call_sid, + } + self._context: Optional[MemberContext] = None + + @property + def _proxy(self) -> "MemberContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: MemberContext for this MemberInstance + """ + if self._context is None: + self._context = MemberContext( + self._version, + account_sid=self._solution["account_sid"], + queue_sid=self._solution["queue_sid"], + call_sid=self._solution["call_sid"], + ) + return self._context + + def fetch(self) -> "MemberInstance": + """ + Fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "MemberInstance": + """ + Asynchronous coroutine to fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + return await self._proxy.fetch_async() + + def update( + self, url: str, method: Union[str, object] = values.unset + ) -> "MemberInstance": + """ + Update the MemberInstance + + :param url: The absolute URL of the Queue resource. + :param method: How to pass the update request data. Can be `GET` or `POST` and the default is `POST`. `POST` sends the data as encoded form data and `GET` sends the data as query parameters. + + :returns: The updated MemberInstance + """ + return self._proxy.update( + url=url, + method=method, + ) + + async def update_async( + self, url: str, method: Union[str, object] = values.unset + ) -> "MemberInstance": + """ + Asynchronous coroutine to update the MemberInstance + + :param url: The absolute URL of the Queue resource. + :param method: How to pass the update request data. Can be `GET` or `POST` and the default is `POST`. `POST` sends the data as encoded form data and `GET` sends the data as query parameters. + + :returns: The updated MemberInstance + """ + return await self._proxy.update_async( + url=url, + method=method, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MemberContext(InstanceContext): + + def __init__( + self, version: Version, account_sid: str, queue_sid: str, call_sid: str + ): + """ + Initialize the MemberContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Member resource(s) to update. + :param queue_sid: The SID of the Queue in which to find the members to update. + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resource(s) to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "queue_sid": queue_sid, + "call_sid": call_sid, + } + self._uri = ( + "/Accounts/{account_sid}/Queues/{queue_sid}/Members/{call_sid}.json".format( + **self._solution + ) + ) + + def fetch(self) -> MemberInstance: + """ + Fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return MemberInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + queue_sid=self._solution["queue_sid"], + call_sid=self._solution["call_sid"], + ) + + async def fetch_async(self) -> MemberInstance: + """ + Asynchronous coroutine to fetch the MemberInstance + + + :returns: The fetched MemberInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return MemberInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + queue_sid=self._solution["queue_sid"], + call_sid=self._solution["call_sid"], + ) + + def update( + self, url: str, method: Union[str, object] = values.unset + ) -> MemberInstance: + """ + Update the MemberInstance + + :param url: The absolute URL of the Queue resource. + :param method: How to pass the update request data. Can be `GET` or `POST` and the default is `POST`. `POST` sends the data as encoded form data and `GET` sends the data as query parameters. + + :returns: The updated MemberInstance + """ + + data = values.of( + { + "Url": url, + "Method": method, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + queue_sid=self._solution["queue_sid"], + call_sid=self._solution["call_sid"], + ) + + async def update_async( + self, url: str, method: Union[str, object] = values.unset + ) -> MemberInstance: + """ + Asynchronous coroutine to update the MemberInstance + + :param url: The absolute URL of the Queue resource. + :param method: How to pass the update request data. Can be `GET` or `POST` and the default is `POST`. `POST` sends the data as encoded form data and `GET` sends the data as query parameters. + + :returns: The updated MemberInstance + """ + + data = values.of( + { + "Url": url, + "Method": method, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return MemberInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + queue_sid=self._solution["queue_sid"], + call_sid=self._solution["call_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class MemberPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> MemberInstance: + """ + Build an instance of MemberInstance + + :param payload: Payload response from the API + """ + return MemberInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + queue_sid=self._solution["queue_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class MemberList(ListResource): + + def __init__(self, version: Version, account_sid: str, queue_sid: str): + """ + Initialize the MemberList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Member resource(s) to read. + :param queue_sid: The SID of the Queue in which to find the members + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "queue_sid": queue_sid, + } + self._uri = "/Accounts/{account_sid}/Queues/{queue_sid}/Members.json".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[MemberInstance]: + """ + Streams MemberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[MemberInstance]: + """ + Asynchronously streams MemberInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MemberInstance]: + """ + Lists MemberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[MemberInstance]: + """ + Asynchronously lists MemberInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MemberPage: + """ + Retrieve a single page of MemberInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MemberInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MemberPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> MemberPage: + """ + Asynchronously retrieve a single page of MemberInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of MemberInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return MemberPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> MemberPage: + """ + Retrieve a specific page of MemberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MemberInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return MemberPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> MemberPage: + """ + Asynchronously retrieve a specific page of MemberInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of MemberInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return MemberPage(self._version, response, self._solution) + + def get(self, call_sid: str) -> MemberContext: + """ + Constructs a MemberContext + + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resource(s) to update. + """ + return MemberContext( + self._version, + account_sid=self._solution["account_sid"], + queue_sid=self._solution["queue_sid"], + call_sid=call_sid, + ) + + def __call__(self, call_sid: str) -> MemberContext: + """ + Constructs a MemberContext + + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resource(s) to update. + """ + return MemberContext( + self._version, + account_sid=self._solution["account_sid"], + queue_sid=self._solution["queue_sid"], + call_sid=call_sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/__init__.py new file mode 100644 index 00000000..807fb3ca --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/__init__.py @@ -0,0 +1,720 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.recording.add_on_result import AddOnResultList +from twilio.rest.api.v2010.account.recording.transcription import TranscriptionList + + +class RecordingInstance(InstanceResource): + + class Source(object): + DIALVERB = "DialVerb" + CONFERENCE = "Conference" + OUTBOUNDAPI = "OutboundAPI" + TRUNKING = "Trunking" + RECORDVERB = "RecordVerb" + STARTCALLRECORDINGAPI = "StartCallRecordingAPI" + STARTCONFERENCERECORDINGAPI = "StartConferenceRecordingAPI" + + class Status(object): + IN_PROGRESS = "in-progress" + PAUSED = "paused" + STOPPED = "stopped" + PROCESSING = "processing" + COMPLETED = "completed" + ABSENT = "absent" + DELETED = "deleted" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording resource. + :ivar api_version: The API version used during the recording. + :ivar call_sid: The SID of the [Call](https://www.twilio.com/docs/voice/api/call-resource) the Recording resource is associated with. This will always refer to the parent leg of a two-leg call. + :ivar conference_sid: The Conference SID that identifies the conference associated with the recording, if a conference recording. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar start_time: The start time of the recording in GMT and in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar duration: The length of the recording in seconds. + :ivar sid: The unique string that that we created to identify the Recording resource. + :ivar price: The one-time cost of creating the recording in the `price_unit` currency. + :ivar price_unit: The currency used in the `price` property. Example: `USD`. + :ivar status: + :ivar channels: The number of channels in the final recording file. Can be: `1` or `2`. Default: `1`. + :ivar source: + :ivar error_code: The error code that describes why the recording is `absent`. The error code is described in our [Error Dictionary](https://www.twilio.com/docs/api/errors). This value is null if the recording `status` is not `absent`. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar encryption_details: How to decrypt the recording if it was encrypted using [Call Recording Encryption](https://www.twilio.com/docs/voice/tutorials/voice-recording-encryption) feature. + :ivar subresource_uris: A list of related resources identified by their relative URIs. + :ivar media_url: The URL of the media file associated with this recording resource. When stored externally, this is the full URL location of the media file. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.call_sid: Optional[str] = payload.get("call_sid") + self.conference_sid: Optional[str] = payload.get("conference_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.start_time: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("start_time") + ) + self.duration: Optional[str] = payload.get("duration") + self.sid: Optional[str] = payload.get("sid") + self.price: Optional[str] = payload.get("price") + self.price_unit: Optional[str] = payload.get("price_unit") + self.status: Optional["RecordingInstance.Status"] = payload.get("status") + self.channels: Optional[int] = deserialize.integer(payload.get("channels")) + self.source: Optional["RecordingInstance.Source"] = payload.get("source") + self.error_code: Optional[int] = deserialize.integer(payload.get("error_code")) + self.uri: Optional[str] = payload.get("uri") + self.encryption_details: Optional[Dict[str, object]] = payload.get( + "encryption_details" + ) + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.media_url: Optional[str] = payload.get("media_url") + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[RecordingContext] = None + + @property + def _proxy(self) -> "RecordingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: RecordingContext for this RecordingInstance + """ + if self._context is None: + self._context = RecordingContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch( + self, include_soft_deleted: Union[bool, object] = values.unset + ) -> "RecordingInstance": + """ + Fetch the RecordingInstance + + :param include_soft_deleted: A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + + :returns: The fetched RecordingInstance + """ + return self._proxy.fetch( + include_soft_deleted=include_soft_deleted, + ) + + async def fetch_async( + self, include_soft_deleted: Union[bool, object] = values.unset + ) -> "RecordingInstance": + """ + Asynchronous coroutine to fetch the RecordingInstance + + :param include_soft_deleted: A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + + :returns: The fetched RecordingInstance + """ + return await self._proxy.fetch_async( + include_soft_deleted=include_soft_deleted, + ) + + @property + def add_on_results(self) -> AddOnResultList: + """ + Access the add_on_results + """ + return self._proxy.add_on_results + + @property + def transcriptions(self) -> TranscriptionList: + """ + Access the transcriptions + """ + return self._proxy.transcriptions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RecordingContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the RecordingContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording resource to fetch. + :param sid: The Twilio-provided string that uniquely identifies the Recording resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Recordings/{sid}.json".format( + **self._solution + ) + + self._add_on_results: Optional[AddOnResultList] = None + self._transcriptions: Optional[TranscriptionList] = None + + def delete(self) -> bool: + """ + Deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the RecordingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch( + self, include_soft_deleted: Union[bool, object] = values.unset + ) -> RecordingInstance: + """ + Fetch the RecordingInstance + + :param include_soft_deleted: A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + + :returns: The fetched RecordingInstance + """ + + data = values.of( + { + "IncludeSoftDeleted": serialize.boolean_to_string(include_soft_deleted), + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async( + self, include_soft_deleted: Union[bool, object] = values.unset + ) -> RecordingInstance: + """ + Asynchronous coroutine to fetch the RecordingInstance + + :param include_soft_deleted: A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + + :returns: The fetched RecordingInstance + """ + + data = values.of( + { + "IncludeSoftDeleted": serialize.boolean_to_string(include_soft_deleted), + } + ) + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + + return RecordingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + @property + def add_on_results(self) -> AddOnResultList: + """ + Access the add_on_results + """ + if self._add_on_results is None: + self._add_on_results = AddOnResultList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._add_on_results + + @property + def transcriptions(self) -> TranscriptionList: + """ + Access the transcriptions + """ + if self._transcriptions is None: + self._transcriptions = TranscriptionList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._transcriptions + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class RecordingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> RecordingInstance: + """ + Build an instance of RecordingInstance + + :param payload: Payload response from the API + """ + return RecordingInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class RecordingList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the RecordingList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/Recordings.json".format(**self._solution) + + def stream( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + call_sid: Union[str, object] = values.unset, + conference_sid: Union[str, object] = values.unset, + include_soft_deleted: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[RecordingInstance]: + """ + Streams RecordingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param datetime date_created: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param datetime date_created_before: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param datetime date_created_after: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param str call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + :param str conference_sid: The Conference SID that identifies the conference associated with the recording to read. + :param bool include_soft_deleted: A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + call_sid=call_sid, + conference_sid=conference_sid, + include_soft_deleted=include_soft_deleted, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + call_sid: Union[str, object] = values.unset, + conference_sid: Union[str, object] = values.unset, + include_soft_deleted: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[RecordingInstance]: + """ + Asynchronously streams RecordingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param datetime date_created: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param datetime date_created_before: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param datetime date_created_after: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param str call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + :param str conference_sid: The Conference SID that identifies the conference associated with the recording to read. + :param bool include_soft_deleted: A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + call_sid=call_sid, + conference_sid=conference_sid, + include_soft_deleted=include_soft_deleted, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + call_sid: Union[str, object] = values.unset, + conference_sid: Union[str, object] = values.unset, + include_soft_deleted: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RecordingInstance]: + """ + Lists RecordingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param datetime date_created: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param datetime date_created_before: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param datetime date_created_after: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param str call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + :param str conference_sid: The Conference SID that identifies the conference associated with the recording to read. + :param bool include_soft_deleted: A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + call_sid=call_sid, + conference_sid=conference_sid, + include_soft_deleted=include_soft_deleted, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + call_sid: Union[str, object] = values.unset, + conference_sid: Union[str, object] = values.unset, + include_soft_deleted: Union[bool, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[RecordingInstance]: + """ + Asynchronously lists RecordingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param datetime date_created: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param datetime date_created_before: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param datetime date_created_after: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param str call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + :param str conference_sid: The Conference SID that identifies the conference associated with the recording to read. + :param bool include_soft_deleted: A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + date_created=date_created, + date_created_before=date_created_before, + date_created_after=date_created_after, + call_sid=call_sid, + conference_sid=conference_sid, + include_soft_deleted=include_soft_deleted, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + call_sid: Union[str, object] = values.unset, + conference_sid: Union[str, object] = values.unset, + include_soft_deleted: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RecordingPage: + """ + Retrieve a single page of RecordingInstance records from the API. + Request is executed immediately + + :param date_created: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param date_created_before: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param date_created_after: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + :param conference_sid: The Conference SID that identifies the conference associated with the recording to read. + :param include_soft_deleted: A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RecordingInstance + """ + data = values.of( + { + "DateCreated": serialize.iso8601_datetime(date_created), + "DateCreated<": serialize.iso8601_datetime(date_created_before), + "DateCreated>": serialize.iso8601_datetime(date_created_after), + "CallSid": call_sid, + "ConferenceSid": conference_sid, + "IncludeSoftDeleted": serialize.boolean_to_string(include_soft_deleted), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RecordingPage(self._version, response, self._solution) + + async def page_async( + self, + date_created: Union[datetime, object] = values.unset, + date_created_before: Union[datetime, object] = values.unset, + date_created_after: Union[datetime, object] = values.unset, + call_sid: Union[str, object] = values.unset, + conference_sid: Union[str, object] = values.unset, + include_soft_deleted: Union[bool, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> RecordingPage: + """ + Asynchronously retrieve a single page of RecordingInstance records from the API. + Request is executed immediately + + :param date_created: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param date_created_before: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param date_created_after: Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + :param call_sid: The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + :param conference_sid: The Conference SID that identifies the conference associated with the recording to read. + :param include_soft_deleted: A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of RecordingInstance + """ + data = values.of( + { + "DateCreated": serialize.iso8601_datetime(date_created), + "DateCreated<": serialize.iso8601_datetime(date_created_before), + "DateCreated>": serialize.iso8601_datetime(date_created_after), + "CallSid": call_sid, + "ConferenceSid": conference_sid, + "IncludeSoftDeleted": serialize.boolean_to_string(include_soft_deleted), + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return RecordingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> RecordingPage: + """ + Retrieve a specific page of RecordingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RecordingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return RecordingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> RecordingPage: + """ + Asynchronously retrieve a specific page of RecordingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of RecordingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return RecordingPage(self._version, response, self._solution) + + def get(self, sid: str) -> RecordingContext: + """ + Constructs a RecordingContext + + :param sid: The Twilio-provided string that uniquely identifies the Recording resource to fetch. + """ + return RecordingContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> RecordingContext: + """ + Constructs a RecordingContext + + :param sid: The Twilio-provided string that uniquely identifies the Recording resource to fetch. + """ + return RecordingContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42c75009b6ddac3c9e8c2063e4c32abae29aa520 GIT binary patch literal 39695 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/__pycache__/transcription.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/__pycache__/transcription.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01b512a110064278f25d4667980ebbf8ca80a831 GIT binary patch literal 22454 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 Fe+7`0A-Vtn literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/__init__.py new file mode 100644 index 00000000..95296f3c --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/__init__.py @@ -0,0 +1,553 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.recording.add_on_result.payload import PayloadList + + +class AddOnResultInstance(InstanceResource): + + class Status(object): + CANCELED = "canceled" + COMPLETED = "completed" + DELETED = "deleted" + FAILED = "failed" + IN_PROGRESS = "in-progress" + INIT = "init" + PROCESSING = "processing" + QUEUED = "queued" + + """ + :ivar sid: The unique string that that we created to identify the Recording AddOnResult resource. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording AddOnResult resource. + :ivar status: + :ivar add_on_sid: The SID of the Add-on to which the result belongs. + :ivar add_on_configuration_sid: The SID of the Add-on configuration. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_completed: The date and time in GMT that the result was completed specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar reference_sid: The SID of the recording to which the AddOnResult resource belongs. + :ivar subresource_uris: A list of related resources identified by their relative URIs. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + reference_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.status: Optional["AddOnResultInstance.Status"] = payload.get("status") + self.add_on_sid: Optional[str] = payload.get("add_on_sid") + self.add_on_configuration_sid: Optional[str] = payload.get( + "add_on_configuration_sid" + ) + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.date_completed: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_completed") + ) + self.reference_sid: Optional[str] = payload.get("reference_sid") + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + + self._solution = { + "account_sid": account_sid, + "reference_sid": reference_sid, + "sid": sid or self.sid, + } + self._context: Optional[AddOnResultContext] = None + + @property + def _proxy(self) -> "AddOnResultContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AddOnResultContext for this AddOnResultInstance + """ + if self._context is None: + self._context = AddOnResultContext( + self._version, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AddOnResultInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AddOnResultInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AddOnResultInstance": + """ + Fetch the AddOnResultInstance + + + :returns: The fetched AddOnResultInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AddOnResultInstance": + """ + Asynchronous coroutine to fetch the AddOnResultInstance + + + :returns: The fetched AddOnResultInstance + """ + return await self._proxy.fetch_async() + + @property + def payloads(self) -> PayloadList: + """ + Access the payloads + """ + return self._proxy.payloads + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AddOnResultContext(InstanceContext): + + def __init__( + self, version: Version, account_sid: str, reference_sid: str, sid: str + ): + """ + Initialize the AddOnResultContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording AddOnResult resource to fetch. + :param reference_sid: The SID of the recording to which the result to fetch belongs. + :param sid: The Twilio-provided string that uniquely identifies the Recording AddOnResult resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "reference_sid": reference_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Recordings/{reference_sid}/AddOnResults/{sid}.json".format( + **self._solution + ) + + self._payloads: Optional[PayloadList] = None + + def delete(self) -> bool: + """ + Deletes the AddOnResultInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AddOnResultInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AddOnResultInstance: + """ + Fetch the AddOnResultInstance + + + :returns: The fetched AddOnResultInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AddOnResultInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AddOnResultInstance: + """ + Asynchronous coroutine to fetch the AddOnResultInstance + + + :returns: The fetched AddOnResultInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AddOnResultInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + sid=self._solution["sid"], + ) + + @property + def payloads(self) -> PayloadList: + """ + Access the payloads + """ + if self._payloads is None: + self._payloads = PayloadList( + self._version, + self._solution["account_sid"], + self._solution["reference_sid"], + self._solution["sid"], + ) + return self._payloads + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class AddOnResultPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> AddOnResultInstance: + """ + Build an instance of AddOnResultInstance + + :param payload: Payload response from the API + """ + return AddOnResultInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AddOnResultList(ListResource): + + def __init__(self, version: Version, account_sid: str, reference_sid: str): + """ + Initialize the AddOnResultList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording AddOnResult resources to read. + :param reference_sid: The SID of the recording to which the result to read belongs. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "reference_sid": reference_sid, + } + self._uri = "/Accounts/{account_sid}/Recordings/{reference_sid}/AddOnResults.json".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AddOnResultInstance]: + """ + Streams AddOnResultInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AddOnResultInstance]: + """ + Asynchronously streams AddOnResultInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AddOnResultInstance]: + """ + Lists AddOnResultInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AddOnResultInstance]: + """ + Asynchronously lists AddOnResultInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AddOnResultPage: + """ + Retrieve a single page of AddOnResultInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AddOnResultInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AddOnResultPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AddOnResultPage: + """ + Asynchronously retrieve a single page of AddOnResultInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AddOnResultInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AddOnResultPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> AddOnResultPage: + """ + Retrieve a specific page of AddOnResultInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AddOnResultInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AddOnResultPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> AddOnResultPage: + """ + Asynchronously retrieve a specific page of AddOnResultInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AddOnResultInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AddOnResultPage(self._version, response, self._solution) + + def get(self, sid: str) -> AddOnResultContext: + """ + Constructs a AddOnResultContext + + :param sid: The Twilio-provided string that uniquely identifies the Recording AddOnResult resource to fetch. + """ + return AddOnResultContext( + self._version, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> AddOnResultContext: + """ + Constructs a AddOnResultContext + + :param sid: The Twilio-provided string that uniquely identifies the Recording AddOnResult resource to fetch. + """ + return AddOnResultContext( + self._version, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..623ba5fe95f41bb29aeca16fdc3120666197ad44 GIT binary patch literal 23093 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/__init__.py new file mode 100644 index 00000000..08e6ea21 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/__init__.py @@ -0,0 +1,566 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.recording.add_on_result.payload.data import DataList + + +class PayloadInstance(InstanceResource): + """ + :ivar sid: The unique string that that we created to identify the Recording AddOnResult Payload resource. + :ivar add_on_result_sid: The SID of the AddOnResult to which the payload belongs. + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording AddOnResult Payload resource. + :ivar label: The string provided by the vendor that describes the payload. + :ivar add_on_sid: The SID of the Add-on to which the result belongs. + :ivar add_on_configuration_sid: The SID of the Add-on configuration. + :ivar content_type: The MIME type of the payload. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar reference_sid: The SID of the recording to which the AddOnResult resource that contains the payload belongs. + :ivar subresource_uris: A list of related resources identified by their relative URIs. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + reference_sid: str, + add_on_result_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.add_on_result_sid: Optional[str] = payload.get("add_on_result_sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.label: Optional[str] = payload.get("label") + self.add_on_sid: Optional[str] = payload.get("add_on_sid") + self.add_on_configuration_sid: Optional[str] = payload.get( + "add_on_configuration_sid" + ) + self.content_type: Optional[str] = payload.get("content_type") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.reference_sid: Optional[str] = payload.get("reference_sid") + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + + self._solution = { + "account_sid": account_sid, + "reference_sid": reference_sid, + "add_on_result_sid": add_on_result_sid, + "sid": sid or self.sid, + } + self._context: Optional[PayloadContext] = None + + @property + def _proxy(self) -> "PayloadContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: PayloadContext for this PayloadInstance + """ + if self._context is None: + self._context = PayloadContext( + self._version, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the PayloadInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PayloadInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "PayloadInstance": + """ + Fetch the PayloadInstance + + + :returns: The fetched PayloadInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "PayloadInstance": + """ + Asynchronous coroutine to fetch the PayloadInstance + + + :returns: The fetched PayloadInstance + """ + return await self._proxy.fetch_async() + + @property + def data(self) -> DataList: + """ + Access the data + """ + return self._proxy.data + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PayloadContext(InstanceContext): + + def __init__( + self, + version: Version, + account_sid: str, + reference_sid: str, + add_on_result_sid: str, + sid: str, + ): + """ + Initialize the PayloadContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording AddOnResult Payload resource to fetch. + :param reference_sid: The SID of the recording to which the AddOnResult resource that contains the payload to fetch belongs. + :param add_on_result_sid: The SID of the AddOnResult to which the payload to fetch belongs. + :param sid: The Twilio-provided string that uniquely identifies the Recording AddOnResult Payload resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "reference_sid": reference_sid, + "add_on_result_sid": add_on_result_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Recordings/{reference_sid}/AddOnResults/{add_on_result_sid}/Payloads/{sid}.json".format( + **self._solution + ) + + self._data: Optional[DataList] = None + + def delete(self) -> bool: + """ + Deletes the PayloadInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the PayloadInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> PayloadInstance: + """ + Fetch the PayloadInstance + + + :returns: The fetched PayloadInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return PayloadInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> PayloadInstance: + """ + Asynchronous coroutine to fetch the PayloadInstance + + + :returns: The fetched PayloadInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return PayloadInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + sid=self._solution["sid"], + ) + + @property + def data(self) -> DataList: + """ + Access the data + """ + if self._data is None: + self._data = DataList( + self._version, + self._solution["account_sid"], + self._solution["reference_sid"], + self._solution["add_on_result_sid"], + self._solution["sid"], + ) + return self._data + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class PayloadPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> PayloadInstance: + """ + Build an instance of PayloadInstance + + :param payload: Payload response from the API + """ + return PayloadInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class PayloadList(ListResource): + + def __init__( + self, + version: Version, + account_sid: str, + reference_sid: str, + add_on_result_sid: str, + ): + """ + Initialize the PayloadList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording AddOnResult Payload resources to read. + :param reference_sid: The SID of the recording to which the AddOnResult resource that contains the payloads to read belongs. + :param add_on_result_sid: The SID of the AddOnResult to which the payloads to read belongs. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "reference_sid": reference_sid, + "add_on_result_sid": add_on_result_sid, + } + self._uri = "/Accounts/{account_sid}/Recordings/{reference_sid}/AddOnResults/{add_on_result_sid}/Payloads.json".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[PayloadInstance]: + """ + Streams PayloadInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[PayloadInstance]: + """ + Asynchronously streams PayloadInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PayloadInstance]: + """ + Lists PayloadInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[PayloadInstance]: + """ + Asynchronously lists PayloadInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PayloadPage: + """ + Retrieve a single page of PayloadInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PayloadInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PayloadPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> PayloadPage: + """ + Asynchronously retrieve a single page of PayloadInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of PayloadInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return PayloadPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> PayloadPage: + """ + Retrieve a specific page of PayloadInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PayloadInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return PayloadPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> PayloadPage: + """ + Asynchronously retrieve a specific page of PayloadInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of PayloadInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return PayloadPage(self._version, response, self._solution) + + def get(self, sid: str) -> PayloadContext: + """ + Constructs a PayloadContext + + :param sid: The Twilio-provided string that uniquely identifies the Recording AddOnResult Payload resource to fetch. + """ + return PayloadContext( + self._version, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> PayloadContext: + """ + Constructs a PayloadContext + + :param sid: The Twilio-provided string that uniquely identifies the Recording AddOnResult Payload resource to fetch. + """ + return PayloadContext( + self._version, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32f9bb739ca3eea7de7c2e805147419570547472 GIT binary patch literal 24394 zcmeHvYj6}-mS$#E)>9>w&@IJyc&Ukp}{iEqkBijQ(aW1pm4pMRRT*$ zwih!!B7$DS_D)O8b}V>yVk`}wvAh#8#`|M>{9_|JV*jW{9V10;JBEne*qE7LMHe2s ziTN?#xi>Q_t5iiBKe`>ePSDMp_x(8c+;hKkZvD^NTCafT#@~Ja!rwnH2>+WtjK`sS z3jYYtgrEomf+8xmm>3raM3MaVm@RG}u*anVDef3>#GM1qxNE=_cMrJZo&gU_BgMS& znt__QZ@|aC9kJSY-9R1lJ7fNM{XjkQyJAb?4Fe6#?~XObn+BSg-xF(&w+yr}zc;ot z-a61K3O3=0pwwIw6rWmu&(7O9(8fY*5n89#nW610)Q`}5wZ#lw#zL1Mv_Wk!Lpz2W z15M%oD++>F#&h~YG%ZJxiYi|Yr{(i%Le;_(nJ3lL zp>SR#C8p-$^F?x~!m~!XvP^aG|3><=UOr5hqp@gG?vi^`Q650!hX0uhs+<}+7mG&Z z(>%?|L#Iy5y(f+adCvalPaoQ)4|6P>W|_i6nPkaW%g?9O1oFs7_yi=iAgkph4Y=I-H7j>GOl=j2gMXlJq6zL^30*N;Jb76JeFa!-=7AEH)hU{u5D7K+L%n%xfkZ zR|Bq`y*DwOllr2OOinr;O=oiM=Tn(zG7*mD9A^^n>uqLOY3XzB^4<({652B{Lpv19$a;mcrjI-)Cth1vQ9{W?2vJBGGV4Bdv`C{ek*7kYW*iyI7rzI^#|FvHeMFp`XSE6GT@I~tC6 zgUGwXJaK?`-Rw7p=jrIO zlYHo^j9FJQA(spnAL5Fm#S4lg6NAz7Ls)580@bF1iY-ZKZ4n|epoUOpIHmG_K6muF zLo$6Dv#C#-H5c)MkUp|J7lp{-gd!7*kfRCt$aAOppb&>M$cSwc#*Cy>Y9u-s#ZV&o z3nvdBl(#;+b!+JyN7c+=FsYsI)&?W=M=63Ca0huXsl~&YMU5ItQA_mY@Dz;#*UQLy zX8Fr*nWhe^nhM@laf&o^1(r;{brG54$5u1VSvZ;~p|VOuk{&u|WDE^y(ey64SB`-% z(!^?NjIjeF0rnNn6=*&PqDVj~{MaT4eha-Ej6?q5@`%aYb( zq|G!NzKbn}ulTM~tJ^5acw@ADMy}6QqQ@x7c%#Hxqr@t$@LJLun|QT(t+Ax_o8{U^ zrBTPI^A#}-@p@FaXwHn00$aWBClcCHZ-gjF7g}O`4GV$Veyts!8c6`!QaCvW+Z%FT zoxq9qTXla4w`HrsXXUdwpOt^=Upnv6TB+>%@})a1u}WDiZv(X^(2#Sahf=DRbB99F zL^Kl$vT)oaxL)0MR+?q^rE6JgTXsh7lJfUR}xL19s=6v>F@Kh_E!GsY(q*)({gYL!mU$Es4%}UVr@W5AHg924Z0P?6IRqPoM2m z(=TO`sk4`o(TLg$DK&Ez`|72$$D`-YrlT3PD;18s1nDk)mT&sqU|Sis*b7EZjxw~^=dfs&u#3Z zfYyaIo8CV5*0CAa+?r>R#k&ybd3V|LvYE4UfdlyVFYMg+{+0KxEcn(H?6zmUlxJ<; zDQw>M?(XT`Gq28VI!r-rzv$UL-*Y_Mb9}+q_~xaaMUxK~lT}%(A}zuyaZGTp5@&xxK8fPqaop26JXXKijLNNtVD23GCod;x**JKS z31A~v%xBbE-(;Z*osj3h3zK&)yKaY!(Sh#yT3rR8vh)?hj) z_r_wyO7u`Utl=c7C10Tp9D)RiU3v}tAW1FV#peo=fKK-ZOInDQl&uG|Ih9towi;s; zkThB=xw_I4!6|e(LEC`nX;IsVSDJ`K);3cHXNX!mJknBDWsrxTpya;~=XD`pFZk-; z+oVjj*ScTO%t`ZY8N`>JN>u&r}kz$erKU`)t$uc#8fETxp!gJy0?RG1!uSP zWmg?qXlkA4ztw+td$uX?sK&XxZoKctbNM=tnO-4y_ASl+Z3@5Kg;0;HgHt z7fs4VBKNy$#ZC1@nIQgjry^8lzHNFl$N$Lj4~UQE7z~g`&VZDE9d;H zXWgq84-a+x4g3{O!Z`+U?DGuK8$iacprjw$ChR|OID}KePT_|17xv3y!1nkDX3rRO za6wBZi2A|Vlh}k3DnC~6_H!BdD;d^)V_bc_s!*7Kj76jSI~azMjwbEOT_2O4Rm@k;4 zdsxlr$MUk)S0+pFlR?S>_EMhSV1mYoIatC)L$#NNs<|w4kfkMwe=!}(S-(8zUp4Dq z_1mDsA#jIqd9FD) z?+?zpgR}nNV{I3bmJk{-XTD zau9`%G?jOalKucO=_WW>MP6dzj9IP7`d7@lS1hIw+R9lsuE7IrUc5*hD|-~%H4-H% zbf(fF(_ry^g5kTTmpKNc|Dt(}D^^lGxMFam$Ho2q1jmu&uso%6!vKR~Tu_%|!C=CVe5rxBW45s}eM4q$g_?S3mQ-n%`Gb)bS?&(AG zV{t+hg&WHxVOS(aJ#8CtTp8PYWvqW%%sDw4Gi}e=f;~C$rJQ&vO+%0Nu+9FlXAeQo zucWknBb&;nHUua!rG-MlJ+Wj2d)&UDnfOQ4W;(7g*7799ba_60WxA#r0 zochlEvhHmAsb3W&q`A6cr8u&74~Nl%0NR7!rNcq6tUme5*uH5gCtXZN6HGSAIdH;= zr?qdRjAQo)dF>PX4_8)Lg@$Gm@U*1z}u`8ogLS@&T^!~v0b0IfZ(2ae$>q2*>|a@)-dw>tAK3ULc9ZFvv* zyh7`;d=2@0LdS}HE&1w%I;6k;;>T1h*5SJ8bDVuPqfp?lU?BZE15GDt-E$WQltonftZ*1%5*fvngqlmIIg@oa02C5ZNCuEW%ia9-X8 zKE-t|R>cmd^ROdg;8e5*^%?zy0R(VeZ@i)W8G%Ch$xwfv2II`DOb6E zY^+<~f)I(WjRh~JlZpOm00`O|&^=?uY$sw{P);JSKIb4zE*x;N{iy1y=B$@kI!zIf zHO_$7B4A{xUaP)ZOla#iBGYH#5VW zZzirM9@^mtHsnD88-u`xyqs~;CbmcrA;F+93I{;HDUnr@z@kD?x~j}hDoI=l7|cZz zBu6#+Gb+AgGprcEF74WOMC6=(hmIdQeF&0^Gp=SXB$b?3z-yRkCbV)&b34W`Tz>nL;DaROlejfaQ(o!)P_popsx_tvh6(-?uk?yxOnmEndtDNQ~?O8NW zJ5SC9IQ{y7YB367Bg$kA8c{6{r(`H8$~@(i4kbV3{13`OGA)x2%g402ZQ{jSFU~i2 zXPdhh8kgN|db{ndwwWV&yU@~85Ns{pPXt@NH!s*cY#SiUbuUq<1 za=>3g!K6}Q6ubts`!o~`x`buW9%O$CTE_NRg_b3Qmd9+F8WhT&$|aB55Kd%V_9%`v zgj9)RwhmR|Tu;d7rnq-J_jGXsE6uA>rytjcQz@9au(M4!alo7toK{U`a`q#KPBZGL z4l=sfGPF<)6HXb`FkzEnjCRf|X+<)PM9C3^iL>Up(jX?b(as@5`YN2o%d#Ul?z-vD zy4xN!v`lo}>Y8s@n{8M-b>_bGQ_lyUpY5D&Sj!~&|Ksmm07m)T_2&T1FSK^tsk>cw zcP!hweWAVcPVjbcYDKo)Kq+Ut_GdeL3B|0tRW~`5tzY}7)lvTPKw}(c96PrC?)i zTfxTKh>bOR$6b%yLj8&_g$nZ?6!`i+s%j(Rfe=0%P4`wJ3H32q2%zAl4IBP zU9&aIf6=zmP;%&8Vk}$VWpIqwvi04%e|E*zZ2dMPf>=qR#@S9vj&E}~f8_eeth=qU z^uVU=8k@GS12(1|qM@VByoA6U2-t?dFA=)ZewS)GO3pDjrK=VezQV}Hvbi#Vp9&Ba zENunt1eNt2%DJX0{-kd?1V3pfDg7BZCE^Z&D;1=6jx53I_oVvQ57Jijq5aG;2D&EdXLG!YPWO3O5?9r>B=m2rG}*8i(>rC@pe_PmQXD}rRm)`bmx8*Q(CTEI!8fo_HtQ&3r_=Vb036U5 z`I%f5I4G%*xnxIUWWcgMSiHdch3ni+XqE;)XpQNl1+*XeAm#a7W53T|TWsRY9uHxOax=#~2Xjf|02JnUcI+RssQJ!)=ImH^SFmPkqixZP6AcO$-Al_nP7hWKWD zw_Cnj@VyLqiBm3xzk}h{%fWcsOnyl=`<0Nc2+_0gkl&6!h9H$e*N$q?HGpdZnoZ97 z#er)ERsRcCjLFa{L)Fx$MXd7w37i^eYZ5#@to$}`YP0gM5T~wChdJ5W6_DUa_^ZT< zIZDj72!Lj5P+u8P%ub-dklC)t%rKWyqE>R~0L-yr!eIy*E`f%P-G!*r#D#Yf|Nl0U ze~KMau7(RgbV<4ypjT*qO`L7IJm2(cw&~S}!Xh~MhaR>;z*06Ek7jb76!tu53`SI@ z+>FpFHXd_T{|Q2>9V06lU0GGsV}zDjd4*p3sGZA6z<<$2dd4KAVY|ZQ zB|{YsrX_`6MDtB@IF-Rdh%d69!}1_|)O3jiB;%f3*top~!$9yn8AReUl}x9jWI~8LG|?E7w%DkfO@wV9>LK$TYgO!O z2Cng-NiZMe)`2kaDQ)6rIZgJ2D52Oae8kmwQX4KdM8B{`w5BVpSPOQ^XHw`5ZXSRL zOjF3jQ2ZPM*-ZpKMvR+~C23F}k_`c~@ll{eF&h}YCG5%@^?Z8|3S^x}JC6=h`^=_LdlhvM#vY2F48O7!PvXLeNo=fvxNkP1ZkD4#H7LVC zbpy+>S>Dpq(-W}lb*8PUc_|S!(`7UouHmSPBgRmQ8pUhGae)ZYY?<~3mL`k~=%rnS z1F(e-1GyU7bV4jsIw#SH<($03(+hC<1m>3P8Fwx~T{C=r`0kFWP1)5u#)s$pFo-VE z;oR+;S~s(Fx_i#QYu3Gs@xet5k9t=48#snVPDPevM}o5F^D(`0HO*5qL1rUeWP$)y zS2Ix65ssme=EPa8<-nZypnk&}jaB;%Z!|_ie}BUp>7w-0^G59tz!v(gtWo;`LULZV zi7;#BoR6UDEHUDRgc@+$kmw=nQ_ise$PMW-#_c#pLYoLed6OZ-O{?cy?43zzSz4=y1xd#56eB^|%zY*ii@wCJSwnK$ z5TNTE*nLZcBNf|{#xBIN?T*AZ`TJ}$`o6L0;|fP6X_l!=Q|DBeQW}yNE`NM^LKSrZ z5L71t-z)Y|qa@Wlmg~@IsyahEJ3- z2>t6DJ|R~+dJ)Au;o$Xk=M&nSSa|&bQ6sqkC$3W7K$kt)ftBvm?>?KFAD`e(s2*4KR^*jLtl;()RRDu#ORgO-k8 z+J)N2ybZyh<|+KsUs429#r%qSf0ZUB-qoeM#oJ;~`eWyA@vd!$^e56*=bwo^-nZ>r zoqsOvkp5EKEzXEro&QbTA^nwmx2VfWndD1qB3Hv?CJstOsB^|+${zwcV3j|rsOfA3 zHvPo>&44kfsM@QPL$N9LsQJqUV-5v3)fLAc)LvQPR|%j}V6k1%NDO7Y?8S2F2j2?LC(6m=Fo| zqQbbD6~aE%WA;>A0{Y0g>H8Eaf9zwX1&K`8Y5Z!-h^ze@bgTvZOmYPn zz_?Vj_x%0Yt`oBz-OIKFC3va%MoiE0C)6v)JO1?DBPG2#}=QR!Qp1 zU=WbA)-tKe6TWI?6lGEs$o?C?@f+bA+62f|`(twcGdU@8UM5E)=O=Lb7ccW06sM5G zi~~r}*ZvEf#VeRnmTvj9g1IR0zi1tk7{TouW#Nk~<+kN_mfv1J-?k;&W-)@~OSzrQ zAlu0d@`>v???Sv`BU7>i+i^;k4dW!T6 zdm|>=zJ&qQ?!YNI_U7C~3Pj4L#W<5^jnIE3(k8<=s0bPa{Kf>^X4YpL*UvWwvyH*| z#vR$l9Wz7sFU~a{9e4l2-(G!#v62oE8{1(179R6Z41f7kNtXOP1Xq5X{xS&A+yv}l z9JPzm;uAK3{|`vBU#Cs&zhW*mVkY!cX-u7{qq9X``)7zPrN=sh^7K=dVOCy3l|0T3 zf?{fXe$r|Xa07v{&aP}**L>SE*|ulq+YV&g4*c!*pKY9LJ2T&SrYeP!ob+7-rG2Ki zQ~YbOw?le=9enIJrb;*^iFbDV6|TXt9+kk!tVE7jdJrmcpVj?h7LB;$WwB|Tc8uIJ zIU!_ZAYMZeQgs{06Wt`&!fyEa;K|i&>Am=aPSOS zog1O6&@t^@%Gm{{#QYrJPixvqga27fJJ}=|rky?1gjbCw1Z@5NfzEQX&U%VIOU_zy zXa;h2C=oQ08Mu|_IQd9CVEBzj=!JHZoF9=xr@5SC2sXJH%}su1^4vu=lHuDToyIgK z`n^rQKPQI~ACZ>!9yz25s%-N8I>nH)owmjxdc#b<+Z|qJ@{PA{@=ZQ&@=ZQ6`Tn?u ze0v0W&BE&S4_!+gyC3+MPTH@JnS6?&77@hqER3GmVESuY<1(wtf#Z!q0eWH`r0hH;J4(WFH0`^ z+$C)6dADP_V*#(t)0-DI1mE>d`yP5$IQql~O>L8_CofHI$~LXbJ17KYwJe+5cGo$% zJKMZI?_yzY0qGhi2Pc=|ESqOJF?inQLJf;PEPmxx9DpT$pLlm$9+voh;?!=k$VX#a z*;kr}&Rj7qnJz(zgrw+KV=xy@0 zlKbRA-ON5n*N6CJ3}z-@ qJsPneu!)Doo1sSn^E~>t)FSrWT=Pi4>(SO;2_Kt37U<0w>%Rfo-uhqw literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/__pycache__/data.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/__pycache__/data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f119675a80382a8bee199725eca2796c179d5471 GIT binary patch literal 9580 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/data.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/data.py new file mode 100644 index 00000000..48567bad --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/add_on_result/payload/data.py @@ -0,0 +1,247 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Any, Dict, Optional +from twilio.base import values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + + +class DataInstance(InstanceResource): + """ + :ivar redirect_to: The URL to redirect to to get the data returned by the AddOn that was previously stored. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + reference_sid: str, + add_on_result_sid: str, + payload_sid: str, + ): + super().__init__(version) + + self.redirect_to: Optional[str] = payload.get("redirect_to") + + self._solution = { + "account_sid": account_sid, + "reference_sid": reference_sid, + "add_on_result_sid": add_on_result_sid, + "payload_sid": payload_sid, + } + self._context: Optional[DataContext] = None + + @property + def _proxy(self) -> "DataContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DataContext for this DataInstance + """ + if self._context is None: + self._context = DataContext( + self._version, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + payload_sid=self._solution["payload_sid"], + ) + return self._context + + def fetch(self) -> "DataInstance": + """ + Fetch the DataInstance + + + :returns: The fetched DataInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DataInstance": + """ + Asynchronous coroutine to fetch the DataInstance + + + :returns: The fetched DataInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DataContext(InstanceContext): + + def __init__( + self, + version: Version, + account_sid: str, + reference_sid: str, + add_on_result_sid: str, + payload_sid: str, + ): + """ + Initialize the DataContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording AddOnResult Payload resource to fetch. + :param reference_sid: The SID of the recording to which the AddOnResult resource that contains the payload to fetch belongs. + :param add_on_result_sid: The SID of the AddOnResult to which the payload to fetch belongs. + :param payload_sid: The Twilio-provided string that uniquely identifies the Recording AddOnResult Payload resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "reference_sid": reference_sid, + "add_on_result_sid": add_on_result_sid, + "payload_sid": payload_sid, + } + self._uri = "/Accounts/{account_sid}/Recordings/{reference_sid}/AddOnResults/{add_on_result_sid}/Payloads/{payload_sid}/Data.json".format( + **self._solution + ) + + def fetch(self) -> DataInstance: + """ + Fetch the DataInstance + + + :returns: The fetched DataInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DataInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + payload_sid=self._solution["payload_sid"], + ) + + async def fetch_async(self) -> DataInstance: + """ + Asynchronous coroutine to fetch the DataInstance + + + :returns: The fetched DataInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DataInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + payload_sid=self._solution["payload_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DataList(ListResource): + + def __init__( + self, + version: Version, + account_sid: str, + reference_sid: str, + add_on_result_sid: str, + payload_sid: str, + ): + """ + Initialize the DataList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Recording AddOnResult Payload resource to fetch. + :param reference_sid: The SID of the recording to which the AddOnResult resource that contains the payload to fetch belongs. + :param add_on_result_sid: The SID of the AddOnResult to which the payload to fetch belongs. + :param payload_sid: The Twilio-provided string that uniquely identifies the Recording AddOnResult Payload resource to fetch. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "reference_sid": reference_sid, + "add_on_result_sid": add_on_result_sid, + "payload_sid": payload_sid, + } + + def get(self) -> DataContext: + """ + Constructs a DataContext + + """ + return DataContext( + self._version, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + payload_sid=self._solution["payload_sid"], + ) + + def __call__(self) -> DataContext: + """ + Constructs a DataContext + + """ + return DataContext( + self._version, + account_sid=self._solution["account_sid"], + reference_sid=self._solution["reference_sid"], + add_on_result_sid=self._solution["add_on_result_sid"], + payload_sid=self._solution["payload_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/transcription.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/transcription.py new file mode 100644 index 00000000..472f5b2b --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/recording/transcription.py @@ -0,0 +1,524 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class TranscriptionInstance(InstanceResource): + + class Status(object): + IN_PROGRESS = "in-progress" + COMPLETED = "completed" + FAILED = "failed" + + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Transcription resource. + :ivar api_version: The API version used to create the transcription. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar duration: The duration of the transcribed audio in seconds. + :ivar price: The charge for the transcript in the currency associated with the account. This value is populated after the transcript is complete so it may not be available immediately. + :ivar price_unit: The currency in which `price` is measured, in [ISO 4127](https://www.iso.org/iso/home/standards/currency_codes.htm) format (e.g. `usd`, `eur`, `jpy`). + :ivar recording_sid: The SID of the [Recording](https://www.twilio.com/docs/voice/api/recording) from which the transcription was created. + :ivar sid: The unique string that that we created to identify the Transcription resource. + :ivar status: + :ivar transcription_text: The text content of the transcription. + :ivar type: The transcription type. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + recording_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.duration: Optional[str] = payload.get("duration") + self.price: Optional[float] = deserialize.decimal(payload.get("price")) + self.price_unit: Optional[str] = payload.get("price_unit") + self.recording_sid: Optional[str] = payload.get("recording_sid") + self.sid: Optional[str] = payload.get("sid") + self.status: Optional["TranscriptionInstance.Status"] = payload.get("status") + self.transcription_text: Optional[str] = payload.get("transcription_text") + self.type: Optional[str] = payload.get("type") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "recording_sid": recording_sid, + "sid": sid or self.sid, + } + self._context: Optional[TranscriptionContext] = None + + @property + def _proxy(self) -> "TranscriptionContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: TranscriptionContext for this TranscriptionInstance + """ + if self._context is None: + self._context = TranscriptionContext( + self._version, + account_sid=self._solution["account_sid"], + recording_sid=self._solution["recording_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the TranscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the TranscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "TranscriptionInstance": + """ + Fetch the TranscriptionInstance + + + :returns: The fetched TranscriptionInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "TranscriptionInstance": + """ + Asynchronous coroutine to fetch the TranscriptionInstance + + + :returns: The fetched TranscriptionInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TranscriptionContext(InstanceContext): + + def __init__( + self, version: Version, account_sid: str, recording_sid: str, sid: str + ): + """ + Initialize the TranscriptionContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Transcription resource to fetch. + :param recording_sid: The SID of the [Recording](https://www.twilio.com/docs/voice/api/recording) that created the transcription to fetch. + :param sid: The Twilio-provided string that uniquely identifies the Transcription resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "recording_sid": recording_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/Recordings/{recording_sid}/Transcriptions/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the TranscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the TranscriptionInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> TranscriptionInstance: + """ + Fetch the TranscriptionInstance + + + :returns: The fetched TranscriptionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return TranscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + recording_sid=self._solution["recording_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> TranscriptionInstance: + """ + Asynchronous coroutine to fetch the TranscriptionInstance + + + :returns: The fetched TranscriptionInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return TranscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + recording_sid=self._solution["recording_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class TranscriptionPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> TranscriptionInstance: + """ + Build an instance of TranscriptionInstance + + :param payload: Payload response from the API + """ + return TranscriptionInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + recording_sid=self._solution["recording_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class TranscriptionList(ListResource): + + def __init__(self, version: Version, account_sid: str, recording_sid: str): + """ + Initialize the TranscriptionList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the Transcription resources to read. + :param recording_sid: The SID of the [Recording](https://www.twilio.com/docs/voice/api/recording) that created the transcriptions to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "recording_sid": recording_sid, + } + self._uri = "/Accounts/{account_sid}/Recordings/{recording_sid}/Transcriptions.json".format( + **self._solution + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[TranscriptionInstance]: + """ + Streams TranscriptionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[TranscriptionInstance]: + """ + Asynchronously streams TranscriptionInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TranscriptionInstance]: + """ + Lists TranscriptionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[TranscriptionInstance]: + """ + Asynchronously lists TranscriptionInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TranscriptionPage: + """ + Retrieve a single page of TranscriptionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TranscriptionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TranscriptionPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> TranscriptionPage: + """ + Asynchronously retrieve a single page of TranscriptionInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of TranscriptionInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return TranscriptionPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> TranscriptionPage: + """ + Retrieve a specific page of TranscriptionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TranscriptionInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return TranscriptionPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> TranscriptionPage: + """ + Asynchronously retrieve a specific page of TranscriptionInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of TranscriptionInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return TranscriptionPage(self._version, response, self._solution) + + def get(self, sid: str) -> TranscriptionContext: + """ + Constructs a TranscriptionContext + + :param sid: The Twilio-provided string that uniquely identifies the Transcription resource to fetch. + """ + return TranscriptionContext( + self._version, + account_sid=self._solution["account_sid"], + recording_sid=self._solution["recording_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> TranscriptionContext: + """ + Constructs a TranscriptionContext + + :param sid: The Twilio-provided string that uniquely identifies the Transcription resource to fetch. + """ + return TranscriptionContext( + self._version, + account_sid=self._solution["account_sid"], + recording_sid=self._solution["recording_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/short_code.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/short_code.py new file mode 100644 index 00000000..eae35c4a --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/short_code.py @@ -0,0 +1,650 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class ShortCodeInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created this ShortCode resource. + :ivar api_version: The API version used to start a new TwiML session when an SMS message is sent to this short code. + :ivar date_created: The date and time in GMT that this resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that this resource was last updated, specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: A string that you assigned to describe this resource. By default, the `FriendlyName` is the short code. + :ivar short_code: The short code. e.g., 894546. + :ivar sid: The unique string that that we created to identify this ShortCode resource. + :ivar sms_fallback_method: The HTTP method we use to call the `sms_fallback_url`. Can be: `GET` or `POST`. + :ivar sms_fallback_url: The URL that we call if an error occurs while retrieving or executing the TwiML from `sms_url`. + :ivar sms_method: The HTTP method we use to call the `sms_url`. Can be: `GET` or `POST`. + :ivar sms_url: The URL we call when receiving an incoming SMS message to this short code. + :ivar uri: The URI of this resource, relative to `https://api.twilio.com`. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.short_code: Optional[str] = payload.get("short_code") + self.sid: Optional[str] = payload.get("sid") + self.sms_fallback_method: Optional[str] = payload.get("sms_fallback_method") + self.sms_fallback_url: Optional[str] = payload.get("sms_fallback_url") + self.sms_method: Optional[str] = payload.get("sms_method") + self.sms_url: Optional[str] = payload.get("sms_url") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[ShortCodeContext] = None + + @property + def _proxy(self) -> "ShortCodeContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: ShortCodeContext for this ShortCodeInstance + """ + if self._context is None: + self._context = ShortCodeContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def fetch(self) -> "ShortCodeInstance": + """ + Fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "ShortCodeInstance": + """ + Asynchronous coroutine to fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + ) -> "ShortCodeInstance": + """ + Update the ShortCodeInstance + + :param friendly_name: A descriptive string that you created to describe this resource. It can be up to 64 characters long. By default, the `FriendlyName` is the short code. + :param api_version: The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. + :param sms_url: The URL we should call when receiving an incoming SMS message to this short code. + :param sms_method: The HTTP method we should use when calling the `sms_url`. Can be: `GET` or `POST`. + :param sms_fallback_url: The URL that we should call if an error occurs while retrieving or executing the TwiML from `sms_url`. + :param sms_fallback_method: The HTTP method that we should use to call the `sms_fallback_url`. Can be: `GET` or `POST`. + + :returns: The updated ShortCodeInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + api_version=api_version, + sms_url=sms_url, + sms_method=sms_method, + sms_fallback_url=sms_fallback_url, + sms_fallback_method=sms_fallback_method, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + ) -> "ShortCodeInstance": + """ + Asynchronous coroutine to update the ShortCodeInstance + + :param friendly_name: A descriptive string that you created to describe this resource. It can be up to 64 characters long. By default, the `FriendlyName` is the short code. + :param api_version: The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. + :param sms_url: The URL we should call when receiving an incoming SMS message to this short code. + :param sms_method: The HTTP method we should use when calling the `sms_url`. Can be: `GET` or `POST`. + :param sms_fallback_url: The URL that we should call if an error occurs while retrieving or executing the TwiML from `sms_url`. + :param sms_fallback_method: The HTTP method that we should use to call the `sms_fallback_url`. Can be: `GET` or `POST`. + + :returns: The updated ShortCodeInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + api_version=api_version, + sms_url=sms_url, + sms_method=sms_method, + sms_fallback_url=sms_fallback_url, + sms_fallback_method=sms_fallback_method, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ShortCodeContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the ShortCodeContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the ShortCode resource(s) to update. + :param sid: The Twilio-provided string that uniquely identifies the ShortCode resource to update + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SMS/ShortCodes/{sid}.json".format( + **self._solution + ) + + def fetch(self) -> ShortCodeInstance: + """ + Fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return ShortCodeInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> ShortCodeInstance: + """ + Asynchronous coroutine to fetch the ShortCodeInstance + + + :returns: The fetched ShortCodeInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return ShortCodeInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + ) -> ShortCodeInstance: + """ + Update the ShortCodeInstance + + :param friendly_name: A descriptive string that you created to describe this resource. It can be up to 64 characters long. By default, the `FriendlyName` is the short code. + :param api_version: The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. + :param sms_url: The URL we should call when receiving an incoming SMS message to this short code. + :param sms_method: The HTTP method we should use when calling the `sms_url`. Can be: `GET` or `POST`. + :param sms_fallback_url: The URL that we should call if an error occurs while retrieving or executing the TwiML from `sms_url`. + :param sms_fallback_method: The HTTP method that we should use to call the `sms_fallback_url`. Can be: `GET` or `POST`. + + :returns: The updated ShortCodeInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ApiVersion": api_version, + "SmsUrl": sms_url, + "SmsMethod": sms_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsFallbackMethod": sms_fallback_method, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ShortCodeInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + api_version: Union[str, object] = values.unset, + sms_url: Union[str, object] = values.unset, + sms_method: Union[str, object] = values.unset, + sms_fallback_url: Union[str, object] = values.unset, + sms_fallback_method: Union[str, object] = values.unset, + ) -> ShortCodeInstance: + """ + Asynchronous coroutine to update the ShortCodeInstance + + :param friendly_name: A descriptive string that you created to describe this resource. It can be up to 64 characters long. By default, the `FriendlyName` is the short code. + :param api_version: The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. + :param sms_url: The URL we should call when receiving an incoming SMS message to this short code. + :param sms_method: The HTTP method we should use when calling the `sms_url`. Can be: `GET` or `POST`. + :param sms_fallback_url: The URL that we should call if an error occurs while retrieving or executing the TwiML from `sms_url`. + :param sms_fallback_method: The HTTP method that we should use to call the `sms_fallback_url`. Can be: `GET` or `POST`. + + :returns: The updated ShortCodeInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "ApiVersion": api_version, + "SmsUrl": sms_url, + "SmsMethod": sms_method, + "SmsFallbackUrl": sms_fallback_url, + "SmsFallbackMethod": sms_fallback_method, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return ShortCodeInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class ShortCodePage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> ShortCodeInstance: + """ + Build an instance of ShortCodeInstance + + :param payload: Payload response from the API + """ + return ShortCodeInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class ShortCodeList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the ShortCodeList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the ShortCode resource(s) to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/SMS/ShortCodes.json".format( + **self._solution + ) + + def stream( + self, + friendly_name: Union[str, object] = values.unset, + short_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[ShortCodeInstance]: + """ + Streams ShortCodeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str friendly_name: The string that identifies the ShortCode resources to read. + :param str short_code: Only show the ShortCode resources that match this pattern. You can specify partial numbers and use '*' as a wildcard for any digit. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page( + friendly_name=friendly_name, + short_code=short_code, + page_size=limits["page_size"], + ) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + friendly_name: Union[str, object] = values.unset, + short_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[ShortCodeInstance]: + """ + Asynchronously streams ShortCodeInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param str friendly_name: The string that identifies the ShortCode resources to read. + :param str short_code: Only show the ShortCode resources that match this pattern. You can specify partial numbers and use '*' as a wildcard for any digit. + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async( + friendly_name=friendly_name, + short_code=short_code, + page_size=limits["page_size"], + ) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + friendly_name: Union[str, object] = values.unset, + short_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ShortCodeInstance]: + """ + Lists ShortCodeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str friendly_name: The string that identifies the ShortCode resources to read. + :param str short_code: Only show the ShortCode resources that match this pattern. You can specify partial numbers and use '*' as a wildcard for any digit. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + friendly_name=friendly_name, + short_code=short_code, + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + friendly_name: Union[str, object] = values.unset, + short_code: Union[str, object] = values.unset, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[ShortCodeInstance]: + """ + Asynchronously lists ShortCodeInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param str friendly_name: The string that identifies the ShortCode resources to read. + :param str short_code: Only show the ShortCode resources that match this pattern. You can specify partial numbers and use '*' as a wildcard for any digit. + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + friendly_name=friendly_name, + short_code=short_code, + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + friendly_name: Union[str, object] = values.unset, + short_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ShortCodePage: + """ + Retrieve a single page of ShortCodeInstance records from the API. + Request is executed immediately + + :param friendly_name: The string that identifies the ShortCode resources to read. + :param short_code: Only show the ShortCode resources that match this pattern. You can specify partial numbers and use '*' as a wildcard for any digit. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ShortCodeInstance + """ + data = values.of( + { + "FriendlyName": friendly_name, + "ShortCode": short_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ShortCodePage(self._version, response, self._solution) + + async def page_async( + self, + friendly_name: Union[str, object] = values.unset, + short_code: Union[str, object] = values.unset, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> ShortCodePage: + """ + Asynchronously retrieve a single page of ShortCodeInstance records from the API. + Request is executed immediately + + :param friendly_name: The string that identifies the ShortCode resources to read. + :param short_code: Only show the ShortCode resources that match this pattern. You can specify partial numbers and use '*' as a wildcard for any digit. + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of ShortCodeInstance + """ + data = values.of( + { + "FriendlyName": friendly_name, + "ShortCode": short_code, + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return ShortCodePage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> ShortCodePage: + """ + Retrieve a specific page of ShortCodeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ShortCodeInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return ShortCodePage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> ShortCodePage: + """ + Asynchronously retrieve a specific page of ShortCodeInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of ShortCodeInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return ShortCodePage(self._version, response, self._solution) + + def get(self, sid: str) -> ShortCodeContext: + """ + Constructs a ShortCodeContext + + :param sid: The Twilio-provided string that uniquely identifies the ShortCode resource to update + """ + return ShortCodeContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> ShortCodeContext: + """ + Constructs a ShortCodeContext + + :param sid: The Twilio-provided string that uniquely identifies the ShortCode resource to update + """ + return ShortCodeContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/signing_key.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/signing_key.py new file mode 100644 index 00000000..8e33f218 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/signing_key.py @@ -0,0 +1,572 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class SigningKeyInstance(InstanceResource): + """ + :ivar sid: + :ivar friendly_name: + :ivar date_created: + :ivar date_updated: + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[SigningKeyContext] = None + + @property + def _proxy(self) -> "SigningKeyContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: SigningKeyContext for this SigningKeyInstance + """ + if self._context is None: + self._context = SigningKeyContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the SigningKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SigningKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "SigningKeyInstance": + """ + Fetch the SigningKeyInstance + + + :returns: The fetched SigningKeyInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "SigningKeyInstance": + """ + Asynchronous coroutine to fetch the SigningKeyInstance + + + :returns: The fetched SigningKeyInstance + """ + return await self._proxy.fetch_async() + + def update( + self, friendly_name: Union[str, object] = values.unset + ) -> "SigningKeyInstance": + """ + Update the SigningKeyInstance + + :param friendly_name: + + :returns: The updated SigningKeyInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + ) + + async def update_async( + self, friendly_name: Union[str, object] = values.unset + ) -> "SigningKeyInstance": + """ + Asynchronous coroutine to update the SigningKeyInstance + + :param friendly_name: + + :returns: The updated SigningKeyInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SigningKeyContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the SigningKeyContext + + :param version: Version that contains the resource + :param account_sid: + :param sid: + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SigningKeys/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the SigningKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the SigningKeyInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> SigningKeyInstance: + """ + Fetch the SigningKeyInstance + + + :returns: The fetched SigningKeyInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return SigningKeyInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> SigningKeyInstance: + """ + Asynchronous coroutine to fetch the SigningKeyInstance + + + :returns: The fetched SigningKeyInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return SigningKeyInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, friendly_name: Union[str, object] = values.unset + ) -> SigningKeyInstance: + """ + Update the SigningKeyInstance + + :param friendly_name: + + :returns: The updated SigningKeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SigningKeyInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, friendly_name: Union[str, object] = values.unset + ) -> SigningKeyInstance: + """ + Asynchronous coroutine to update the SigningKeyInstance + + :param friendly_name: + + :returns: The updated SigningKeyInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return SigningKeyInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class SigningKeyPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> SigningKeyInstance: + """ + Build an instance of SigningKeyInstance + + :param payload: Payload response from the API + """ + return SigningKeyInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class SigningKeyList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the SigningKeyList + + :param version: Version that contains the resource + :param account_sid: + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/SigningKeys.json".format(**self._solution) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[SigningKeyInstance]: + """ + Streams SigningKeyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[SigningKeyInstance]: + """ + Asynchronously streams SigningKeyInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SigningKeyInstance]: + """ + Lists SigningKeyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[SigningKeyInstance]: + """ + Asynchronously lists SigningKeyInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SigningKeyPage: + """ + Retrieve a single page of SigningKeyInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SigningKeyInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SigningKeyPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> SigningKeyPage: + """ + Asynchronously retrieve a single page of SigningKeyInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of SigningKeyInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return SigningKeyPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> SigningKeyPage: + """ + Retrieve a specific page of SigningKeyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SigningKeyInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return SigningKeyPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> SigningKeyPage: + """ + Asynchronously retrieve a specific page of SigningKeyInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of SigningKeyInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return SigningKeyPage(self._version, response, self._solution) + + def get(self, sid: str) -> SigningKeyContext: + """ + Constructs a SigningKeyContext + + :param sid: + """ + return SigningKeyContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> SigningKeyContext: + """ + Constructs a SigningKeyContext + + :param sid: + """ + return SigningKeyContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/__init__.py new file mode 100644 index 00000000..12c695ff --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/__init__.py @@ -0,0 +1,89 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.api.v2010.account.sip.credential_list import CredentialListList +from twilio.rest.api.v2010.account.sip.domain import DomainList +from twilio.rest.api.v2010.account.sip.ip_access_control_list import ( + IpAccessControlListList, +) + + +class SipList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the SipList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the SipDomain resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/SIP.json".format(**self._solution) + + self._credential_lists: Optional[CredentialListList] = None + self._domains: Optional[DomainList] = None + self._ip_access_control_lists: Optional[IpAccessControlListList] = None + + @property + def credential_lists(self) -> CredentialListList: + """ + Access the credential_lists + """ + if self._credential_lists is None: + self._credential_lists = CredentialListList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._credential_lists + + @property + def domains(self) -> DomainList: + """ + Access the domains + """ + if self._domains is None: + self._domains = DomainList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._domains + + @property + def ip_access_control_lists(self) -> IpAccessControlListList: + """ + Access the ip_access_control_lists + """ + if self._ip_access_control_lists is None: + self._ip_access_control_lists = IpAccessControlListList( + self._version, account_sid=self._solution["account_sid"] + ) + return self._ip_access_control_lists + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d5d388bf65690e9980ab8c1f8ccc4b21a2d6684 GIT binary patch literal 3750 zcmdT{O>7&-6`ox#$rb;kq)P1wQnGd_h$X4VlhYHx%uZGZoZNy_|Hm6{@C#Ys0awTzI{PPVDmR3T@av1YE86LQwcHw(3bL}c<7vD6)6jWOj;D%z)3 z?BvRM;~x?sISrnTP21N@*J9eX;cHh|i*X}hmUg*=W=g5{=noaBqBv3XQS;O=_8M`) zb#NM`V%MIg^^!kO;{bl(5?LrkjTmBsTlVUpi6ly^D8-9J>T0qs?TN{eYwQP$M@ynJ z9v6lmVuKsjhwEw@?h*Zl{`Fi0)3)u{u2#`5cy^>f+~5~%GRUuPr3tngAXQJPqw8Vp>m`lkZzWIH8UJN>Mg}4J#uvj$Rh*!we&Mw zA+cDn4;>Z+B1Xx2Vw4?D?xf1;?x7$6(s{LIW5nz(6C8+NIwBz27d(R-O)bV?L5t%J z&PD*)-wGhO5tn()ie%|{>IiDcW~QyLu4ryUZ1)3T148=Y+>o!^+uM2|(m^-fX4P^{ zziJ!JDsZ?OuT+jV=SLeChyYe3)ek z+WX;2YI_v60nSr|3rHXNl$B8NnbY7<)`>V7>_9~hQtD%1;l$U!WXlWn@A<&M`a7$u z8}$|De-yZ0eap2?b^($)sBf{>R{dT3a^1HBR`Cq;BjXD5>k)`mz#|agZJj&&^4TGT zRp0ii!#C5t4xd0|CgSMpL(2=G^}i3z7uU(d2{Kl?k=<8M-a2ttJvC5Caq8B02Pt_f zx2xPN4Kn1prT*l1?oBT43Wb@l+3 zCSiuNpv_xmoFJ$pNlNX&U=Nc(s2^{xmxCk?k4_WNCTZ|!t|dJWgWt+`;sk`$NsLGD z1Qj9Gtt89_0zo_lgP#n2;v+(OTM}Ja;ghff$Fl%8;$-5_zz{r6K65)J15nlR=IYChp}=?dMPR^W_J#uiT%Q+$;XP_?z>;Te`jUS!MrQZ$C`Q zXG*&(cMGQ>S`(A^#%K4(XZz|bpMn+s=iz@Tfp!G`IL#81fSb?2`vB(8LC3N1aU`;U zo4*LsDA?I}h3@ze<5+>H`maJ0L;K0%jm3UmdoX?GNML6G*qiSOTtB&X<62*x{{KMr zd;;AFs>hV9#PuBnp3Xc(dZa+WQ&!2rTzkFmIDuUqU znBepKGS_4&>y6Rn!#i&&D@$o(@bKTNlcY~`3P76FiYWTHUW!F(DCfn6^=JZ_ "CredentialListContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CredentialListContext for this CredentialListInstance + """ + if self._context is None: + self._context = CredentialListContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CredentialListInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialListInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CredentialListInstance": + """ + Fetch the CredentialListInstance + + + :returns: The fetched CredentialListInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CredentialListInstance": + """ + Asynchronous coroutine to fetch the CredentialListInstance + + + :returns: The fetched CredentialListInstance + """ + return await self._proxy.fetch_async() + + def update(self, friendly_name: str) -> "CredentialListInstance": + """ + Update the CredentialListInstance + + :param friendly_name: A human readable descriptive text for a CredentialList, up to 64 characters long. + + :returns: The updated CredentialListInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + ) + + async def update_async(self, friendly_name: str) -> "CredentialListInstance": + """ + Asynchronous coroutine to update the CredentialListInstance + + :param friendly_name: A human readable descriptive text for a CredentialList, up to 64 characters long. + + :returns: The updated CredentialListInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + ) + + @property + def credentials(self) -> CredentialList: + """ + Access the credentials + """ + return self._proxy.credentials + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialListContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the CredentialListContext + + :param version: Version that contains the resource + :param account_sid: The unique id of the Account that is responsible for this resource. + :param sid: The credential list Sid that uniquely identifies this resource + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SIP/CredentialLists/{sid}.json".format( + **self._solution + ) + + self._credentials: Optional[CredentialList] = None + + def delete(self) -> bool: + """ + Deletes the CredentialListInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialListInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CredentialListInstance: + """ + Fetch the CredentialListInstance + + + :returns: The fetched CredentialListInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CredentialListInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CredentialListInstance: + """ + Asynchronous coroutine to fetch the CredentialListInstance + + + :returns: The fetched CredentialListInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CredentialListInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update(self, friendly_name: str) -> CredentialListInstance: + """ + Update the CredentialListInstance + + :param friendly_name: A human readable descriptive text for a CredentialList, up to 64 characters long. + + :returns: The updated CredentialListInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialListInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async(self, friendly_name: str) -> CredentialListInstance: + """ + Asynchronous coroutine to update the CredentialListInstance + + :param friendly_name: A human readable descriptive text for a CredentialList, up to 64 characters long. + + :returns: The updated CredentialListInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialListInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + @property + def credentials(self) -> CredentialList: + """ + Access the credentials + """ + if self._credentials is None: + self._credentials = CredentialList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._credentials + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialListPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CredentialListInstance: + """ + Build an instance of CredentialListInstance + + :param payload: Payload response from the API + """ + return CredentialListInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CredentialListList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the CredentialListList + + :param version: Version that contains the resource + :param account_sid: The unique id of the Account that is responsible for this resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/CredentialLists.json".format( + **self._solution + ) + + def create(self, friendly_name: str) -> CredentialListInstance: + """ + Create the CredentialListInstance + + :param friendly_name: A human readable descriptive text that describes the CredentialList, up to 64 characters long. + + :returns: The created CredentialListInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialListInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async(self, friendly_name: str) -> CredentialListInstance: + """ + Asynchronously create the CredentialListInstance + + :param friendly_name: A human readable descriptive text that describes the CredentialList, up to 64 characters long. + + :returns: The created CredentialListInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialListInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CredentialListInstance]: + """ + Streams CredentialListInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CredentialListInstance]: + """ + Asynchronously streams CredentialListInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialListInstance]: + """ + Lists CredentialListInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialListInstance]: + """ + Asynchronously lists CredentialListInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialListPage: + """ + Retrieve a single page of CredentialListInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialListInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialListPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialListPage: + """ + Asynchronously retrieve a single page of CredentialListInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialListInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialListPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> CredentialListPage: + """ + Retrieve a specific page of CredentialListInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialListInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CredentialListPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> CredentialListPage: + """ + Asynchronously retrieve a specific page of CredentialListInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialListInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CredentialListPage(self._version, response, self._solution) + + def get(self, sid: str) -> CredentialListContext: + """ + Constructs a CredentialListContext + + :param sid: The credential list Sid that uniquely identifies this resource + """ + return CredentialListContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> CredentialListContext: + """ + Constructs a CredentialListContext + + :param sid: The credential list Sid that uniquely identifies this resource + """ + return CredentialListContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0cb4402dbc9b7ccdb65112df120b8899d6d9321 GIT binary patch literal 26977 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 Ilg;J-1D(MlH2?qr literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/__pycache__/credential.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/__pycache__/credential.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c5672121b7fc805776198281e1a69761f70447c GIT binary patch literal 27728 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 z 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/credential.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/credential.py new file mode 100644 index 00000000..9c52a110 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/credential_list/credential.py @@ -0,0 +1,666 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CredentialInstance(InstanceResource): + """ + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar account_sid: The unique id of the Account that is responsible for this resource. + :ivar credential_list_sid: The unique id that identifies the credential list that includes this credential. + :ivar username: The username for this credential. + :ivar date_created: The date that this resource was created, given as GMT in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar date_updated: The date that this resource was last updated, given as GMT in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar uri: The URI for this resource, relative to `https://api.twilio.com` + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + credential_list_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.credential_list_sid: Optional[str] = payload.get("credential_list_sid") + self.username: Optional[str] = payload.get("username") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "credential_list_sid": credential_list_sid, + "sid": sid or self.sid, + } + self._context: Optional[CredentialContext] = None + + @property + def _proxy(self) -> "CredentialContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CredentialContext for this CredentialInstance + """ + if self._context is None: + self._context = CredentialContext( + self._version, + account_sid=self._solution["account_sid"], + credential_list_sid=self._solution["credential_list_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CredentialInstance": + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CredentialInstance": + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + return await self._proxy.fetch_async() + + def update( + self, password: Union[str, object] = values.unset + ) -> "CredentialInstance": + """ + Update the CredentialInstance + + :param password: The password that the username will use when authenticating SIP requests. The password must be a minimum of 12 characters, contain at least 1 digit, and have mixed case. (eg `IWasAtSignal2018`) + + :returns: The updated CredentialInstance + """ + return self._proxy.update( + password=password, + ) + + async def update_async( + self, password: Union[str, object] = values.unset + ) -> "CredentialInstance": + """ + Asynchronous coroutine to update the CredentialInstance + + :param password: The password that the username will use when authenticating SIP requests. The password must be a minimum of 12 characters, contain at least 1 digit, and have mixed case. (eg `IWasAtSignal2018`) + + :returns: The updated CredentialInstance + """ + return await self._proxy.update_async( + password=password, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialContext(InstanceContext): + + def __init__( + self, version: Version, account_sid: str, credential_list_sid: str, sid: str + ): + """ + Initialize the CredentialContext + + :param version: Version that contains the resource + :param account_sid: The unique id of the Account that is responsible for this resource. + :param credential_list_sid: The unique id that identifies the credential list that includes this credential. + :param sid: The unique id that identifies the resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "credential_list_sid": credential_list_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SIP/CredentialLists/{credential_list_sid}/Credentials/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CredentialInstance: + """ + Fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CredentialInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + credential_list_sid=self._solution["credential_list_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CredentialInstance: + """ + Asynchronous coroutine to fetch the CredentialInstance + + + :returns: The fetched CredentialInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + credential_list_sid=self._solution["credential_list_sid"], + sid=self._solution["sid"], + ) + + def update(self, password: Union[str, object] = values.unset) -> CredentialInstance: + """ + Update the CredentialInstance + + :param password: The password that the username will use when authenticating SIP requests. The password must be a minimum of 12 characters, contain at least 1 digit, and have mixed case. (eg `IWasAtSignal2018`) + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "Password": password, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + credential_list_sid=self._solution["credential_list_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, password: Union[str, object] = values.unset + ) -> CredentialInstance: + """ + Asynchronous coroutine to update the CredentialInstance + + :param password: The password that the username will use when authenticating SIP requests. The password must be a minimum of 12 characters, contain at least 1 digit, and have mixed case. (eg `IWasAtSignal2018`) + + :returns: The updated CredentialInstance + """ + + data = values.of( + { + "Password": password, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + credential_list_sid=self._solution["credential_list_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CredentialInstance: + """ + Build an instance of CredentialInstance + + :param payload: Payload response from the API + """ + return CredentialInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + credential_list_sid=self._solution["credential_list_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CredentialList(ListResource): + + def __init__(self, version: Version, account_sid: str, credential_list_sid: str): + """ + Initialize the CredentialList + + :param version: Version that contains the resource + :param account_sid: The unique id of the Account that is responsible for this resource. + :param credential_list_sid: The unique id that identifies the credential list that contains the desired credentials. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "credential_list_sid": credential_list_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/CredentialLists/{credential_list_sid}/Credentials.json".format( + **self._solution + ) + + def create(self, username: str, password: str) -> CredentialInstance: + """ + Create the CredentialInstance + + :param username: The username that will be passed when authenticating SIP requests. The username should be sent in response to Twilio's challenge of the initial INVITE. It can be up to 32 characters long. + :param password: The password that the username will use when authenticating SIP requests. The password must be a minimum of 12 characters, contain at least 1 digit, and have mixed case. (eg `IWasAtSignal2018`) + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Username": username, + "Password": password, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + credential_list_sid=self._solution["credential_list_sid"], + ) + + async def create_async(self, username: str, password: str) -> CredentialInstance: + """ + Asynchronously create the CredentialInstance + + :param username: The username that will be passed when authenticating SIP requests. The username should be sent in response to Twilio's challenge of the initial INVITE. It can be up to 32 characters long. + :param password: The password that the username will use when authenticating SIP requests. The password must be a minimum of 12 characters, contain at least 1 digit, and have mixed case. (eg `IWasAtSignal2018`) + + :returns: The created CredentialInstance + """ + + data = values.of( + { + "Username": username, + "Password": password, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + credential_list_sid=self._solution["credential_list_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CredentialInstance]: + """ + Streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CredentialInstance]: + """ + Asynchronously streams CredentialInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialInstance]: + """ + Asynchronously lists CredentialInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialPage: + """ + Asynchronously retrieve a single page of CredentialInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> CredentialPage: + """ + Retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CredentialPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> CredentialPage: + """ + Asynchronously retrieve a specific page of CredentialInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CredentialPage(self._version, response, self._solution) + + def get(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: The unique id that identifies the resource to update. + """ + return CredentialContext( + self._version, + account_sid=self._solution["account_sid"], + credential_list_sid=self._solution["credential_list_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> CredentialContext: + """ + Constructs a CredentialContext + + :param sid: The unique id that identifies the resource to update. + """ + return CredentialContext( + self._version, + account_sid=self._solution["account_sid"], + credential_list_sid=self._solution["credential_list_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__init__.py new file mode 100644 index 00000000..0a45e682 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__init__.py @@ -0,0 +1,977 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, serialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.sip.domain.auth_types import AuthTypesList +from twilio.rest.api.v2010.account.sip.domain.credential_list_mapping import ( + CredentialListMappingList, +) +from twilio.rest.api.v2010.account.sip.domain.ip_access_control_list_mapping import ( + IpAccessControlListMappingList, +) + + +class DomainInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the SipDomain resource. + :ivar api_version: The API version used to process the call. + :ivar auth_type: The types of authentication you have mapped to your domain. Can be: `IP_ACL` and `CREDENTIAL_LIST`. If you have both defined for your domain, both will be returned in a comma delimited string. If `auth_type` is not defined, the domain will not be able to receive any traffic. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar domain_name: The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \"-\" and must end with `sip.twilio.com`. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar sid: The unique string that that we created to identify the SipDomain resource. + :ivar uri: The URI of the resource, relative to `https://api.twilio.com`. + :ivar voice_fallback_method: The HTTP method we use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :ivar voice_fallback_url: The URL that we call when an error occurs while retrieving or executing the TwiML requested from `voice_url`. + :ivar voice_method: The HTTP method we use to call `voice_url`. Can be: `GET` or `POST`. + :ivar voice_status_callback_method: The HTTP method we use to call `voice_status_callback_url`. Either `GET` or `POST`. + :ivar voice_status_callback_url: The URL that we call to pass status parameters (such as call ended) to your application. + :ivar voice_url: The URL we call using the `voice_method` when the domain receives a call. + :ivar subresource_uris: A list of mapping resources associated with the SIP Domain resource identified by their relative URIs. + :ivar sip_registration: Whether to allow SIP Endpoints to register with the domain to receive calls. + :ivar emergency_calling_enabled: Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + :ivar secure: Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + :ivar byoc_trunk_sid: The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + :ivar emergency_caller_sid: Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.api_version: Optional[str] = payload.get("api_version") + self.auth_type: Optional[str] = payload.get("auth_type") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.domain_name: Optional[str] = payload.get("domain_name") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.sid: Optional[str] = payload.get("sid") + self.uri: Optional[str] = payload.get("uri") + self.voice_fallback_method: Optional[str] = payload.get("voice_fallback_method") + self.voice_fallback_url: Optional[str] = payload.get("voice_fallback_url") + self.voice_method: Optional[str] = payload.get("voice_method") + self.voice_status_callback_method: Optional[str] = payload.get( + "voice_status_callback_method" + ) + self.voice_status_callback_url: Optional[str] = payload.get( + "voice_status_callback_url" + ) + self.voice_url: Optional[str] = payload.get("voice_url") + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.sip_registration: Optional[bool] = payload.get("sip_registration") + self.emergency_calling_enabled: Optional[bool] = payload.get( + "emergency_calling_enabled" + ) + self.secure: Optional[bool] = payload.get("secure") + self.byoc_trunk_sid: Optional[str] = payload.get("byoc_trunk_sid") + self.emergency_caller_sid: Optional[str] = payload.get("emergency_caller_sid") + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[DomainContext] = None + + @property + def _proxy(self) -> "DomainContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: DomainContext for this DomainInstance + """ + if self._context is None: + self._context = DomainContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the DomainInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the DomainInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "DomainInstance": + """ + Fetch the DomainInstance + + + :returns: The fetched DomainInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "DomainInstance": + """ + Asynchronous coroutine to fetch the DomainInstance + + + :returns: The fetched DomainInstance + """ + return await self._proxy.fetch_async() + + def update( + self, + friendly_name: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_status_callback_method: Union[str, object] = values.unset, + voice_status_callback_url: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + sip_registration: Union[bool, object] = values.unset, + domain_name: Union[str, object] = values.unset, + emergency_calling_enabled: Union[bool, object] = values.unset, + secure: Union[bool, object] = values.unset, + byoc_trunk_sid: Union[str, object] = values.unset, + emergency_caller_sid: Union[str, object] = values.unset, + ) -> "DomainInstance": + """ + Update the DomainInstance + + :param friendly_name: A descriptive string that you created to describe the resource. It can be up to 64 characters long. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML requested by `voice_url`. + :param voice_method: The HTTP method we should use to call `voice_url` + :param voice_status_callback_method: The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + :param voice_status_callback_url: The URL that we should call to pass status parameters (such as call ended) to your application. + :param voice_url: The URL we should call when the domain receives a call. + :param sip_registration: Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + :param domain_name: The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \\\"-\\\" and must end with `sip.twilio.com`. + :param emergency_calling_enabled: Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + :param secure: Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + :param byoc_trunk_sid: The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + :param emergency_caller_sid: Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + + :returns: The updated DomainInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + voice_fallback_method=voice_fallback_method, + voice_fallback_url=voice_fallback_url, + voice_method=voice_method, + voice_status_callback_method=voice_status_callback_method, + voice_status_callback_url=voice_status_callback_url, + voice_url=voice_url, + sip_registration=sip_registration, + domain_name=domain_name, + emergency_calling_enabled=emergency_calling_enabled, + secure=secure, + byoc_trunk_sid=byoc_trunk_sid, + emergency_caller_sid=emergency_caller_sid, + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_status_callback_method: Union[str, object] = values.unset, + voice_status_callback_url: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + sip_registration: Union[bool, object] = values.unset, + domain_name: Union[str, object] = values.unset, + emergency_calling_enabled: Union[bool, object] = values.unset, + secure: Union[bool, object] = values.unset, + byoc_trunk_sid: Union[str, object] = values.unset, + emergency_caller_sid: Union[str, object] = values.unset, + ) -> "DomainInstance": + """ + Asynchronous coroutine to update the DomainInstance + + :param friendly_name: A descriptive string that you created to describe the resource. It can be up to 64 characters long. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML requested by `voice_url`. + :param voice_method: The HTTP method we should use to call `voice_url` + :param voice_status_callback_method: The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + :param voice_status_callback_url: The URL that we should call to pass status parameters (such as call ended) to your application. + :param voice_url: The URL we should call when the domain receives a call. + :param sip_registration: Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + :param domain_name: The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \\\"-\\\" and must end with `sip.twilio.com`. + :param emergency_calling_enabled: Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + :param secure: Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + :param byoc_trunk_sid: The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + :param emergency_caller_sid: Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + + :returns: The updated DomainInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + voice_fallback_method=voice_fallback_method, + voice_fallback_url=voice_fallback_url, + voice_method=voice_method, + voice_status_callback_method=voice_status_callback_method, + voice_status_callback_url=voice_status_callback_url, + voice_url=voice_url, + sip_registration=sip_registration, + domain_name=domain_name, + emergency_calling_enabled=emergency_calling_enabled, + secure=secure, + byoc_trunk_sid=byoc_trunk_sid, + emergency_caller_sid=emergency_caller_sid, + ) + + @property + def auth(self) -> AuthTypesList: + """ + Access the auth + """ + return self._proxy.auth + + @property + def credential_list_mappings(self) -> CredentialListMappingList: + """ + Access the credential_list_mappings + """ + return self._proxy.credential_list_mappings + + @property + def ip_access_control_list_mappings(self) -> IpAccessControlListMappingList: + """ + Access the ip_access_control_list_mappings + """ + return self._proxy.ip_access_control_list_mappings + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DomainContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the DomainContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the SipDomain resource to update. + :param sid: The Twilio-provided string that uniquely identifies the SipDomain resource to update. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{sid}.json".format( + **self._solution + ) + + self._auth: Optional[AuthTypesList] = None + self._credential_list_mappings: Optional[CredentialListMappingList] = None + self._ip_access_control_list_mappings: Optional[ + IpAccessControlListMappingList + ] = None + + def delete(self) -> bool: + """ + Deletes the DomainInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the DomainInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> DomainInstance: + """ + Fetch the DomainInstance + + + :returns: The fetched DomainInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return DomainInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> DomainInstance: + """ + Asynchronous coroutine to fetch the DomainInstance + + + :returns: The fetched DomainInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return DomainInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update( + self, + friendly_name: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_status_callback_method: Union[str, object] = values.unset, + voice_status_callback_url: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + sip_registration: Union[bool, object] = values.unset, + domain_name: Union[str, object] = values.unset, + emergency_calling_enabled: Union[bool, object] = values.unset, + secure: Union[bool, object] = values.unset, + byoc_trunk_sid: Union[str, object] = values.unset, + emergency_caller_sid: Union[str, object] = values.unset, + ) -> DomainInstance: + """ + Update the DomainInstance + + :param friendly_name: A descriptive string that you created to describe the resource. It can be up to 64 characters long. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML requested by `voice_url`. + :param voice_method: The HTTP method we should use to call `voice_url` + :param voice_status_callback_method: The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + :param voice_status_callback_url: The URL that we should call to pass status parameters (such as call ended) to your application. + :param voice_url: The URL we should call when the domain receives a call. + :param sip_registration: Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + :param domain_name: The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \\\"-\\\" and must end with `sip.twilio.com`. + :param emergency_calling_enabled: Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + :param secure: Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + :param byoc_trunk_sid: The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + :param emergency_caller_sid: Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + + :returns: The updated DomainInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceStatusCallbackMethod": voice_status_callback_method, + "VoiceStatusCallbackUrl": voice_status_callback_url, + "VoiceUrl": voice_url, + "SipRegistration": serialize.boolean_to_string(sip_registration), + "DomainName": domain_name, + "EmergencyCallingEnabled": serialize.boolean_to_string( + emergency_calling_enabled + ), + "Secure": serialize.boolean_to_string(secure), + "ByocTrunkSid": byoc_trunk_sid, + "EmergencyCallerSid": emergency_caller_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DomainInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async( + self, + friendly_name: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_status_callback_method: Union[str, object] = values.unset, + voice_status_callback_url: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + sip_registration: Union[bool, object] = values.unset, + domain_name: Union[str, object] = values.unset, + emergency_calling_enabled: Union[bool, object] = values.unset, + secure: Union[bool, object] = values.unset, + byoc_trunk_sid: Union[str, object] = values.unset, + emergency_caller_sid: Union[str, object] = values.unset, + ) -> DomainInstance: + """ + Asynchronous coroutine to update the DomainInstance + + :param friendly_name: A descriptive string that you created to describe the resource. It can be up to 64 characters long. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML requested by `voice_url`. + :param voice_method: The HTTP method we should use to call `voice_url` + :param voice_status_callback_method: The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + :param voice_status_callback_url: The URL that we should call to pass status parameters (such as call ended) to your application. + :param voice_url: The URL we should call when the domain receives a call. + :param sip_registration: Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + :param domain_name: The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \\\"-\\\" and must end with `sip.twilio.com`. + :param emergency_calling_enabled: Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + :param secure: Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + :param byoc_trunk_sid: The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + :param emergency_caller_sid: Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + + :returns: The updated DomainInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + "VoiceFallbackMethod": voice_fallback_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceMethod": voice_method, + "VoiceStatusCallbackMethod": voice_status_callback_method, + "VoiceStatusCallbackUrl": voice_status_callback_url, + "VoiceUrl": voice_url, + "SipRegistration": serialize.boolean_to_string(sip_registration), + "DomainName": domain_name, + "EmergencyCallingEnabled": serialize.boolean_to_string( + emergency_calling_enabled + ), + "Secure": serialize.boolean_to_string(secure), + "ByocTrunkSid": byoc_trunk_sid, + "EmergencyCallerSid": emergency_caller_sid, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DomainInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + @property + def auth(self) -> AuthTypesList: + """ + Access the auth + """ + if self._auth is None: + self._auth = AuthTypesList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._auth + + @property + def credential_list_mappings(self) -> CredentialListMappingList: + """ + Access the credential_list_mappings + """ + if self._credential_list_mappings is None: + self._credential_list_mappings = CredentialListMappingList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._credential_list_mappings + + @property + def ip_access_control_list_mappings(self) -> IpAccessControlListMappingList: + """ + Access the ip_access_control_list_mappings + """ + if self._ip_access_control_list_mappings is None: + self._ip_access_control_list_mappings = IpAccessControlListMappingList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._ip_access_control_list_mappings + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class DomainPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> DomainInstance: + """ + Build an instance of DomainInstance + + :param payload: Payload response from the API + """ + return DomainInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class DomainList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the DomainList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the SipDomain resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains.json".format(**self._solution) + + def create( + self, + domain_name: str, + friendly_name: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_status_callback_url: Union[str, object] = values.unset, + voice_status_callback_method: Union[str, object] = values.unset, + sip_registration: Union[bool, object] = values.unset, + emergency_calling_enabled: Union[bool, object] = values.unset, + secure: Union[bool, object] = values.unset, + byoc_trunk_sid: Union[str, object] = values.unset, + emergency_caller_sid: Union[str, object] = values.unset, + ) -> DomainInstance: + """ + Create the DomainInstance + + :param domain_name: The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \\\"-\\\" and must end with `sip.twilio.com`. + :param friendly_name: A descriptive string that you created to describe the resource. It can be up to 64 characters long. + :param voice_url: The URL we should when the domain receives a call. + :param voice_method: The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML from `voice_url`. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param voice_status_callback_url: The URL that we should call to pass status parameters (such as call ended) to your application. + :param voice_status_callback_method: The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + :param sip_registration: Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + :param emergency_calling_enabled: Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + :param secure: Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + :param byoc_trunk_sid: The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + :param emergency_caller_sid: Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + + :returns: The created DomainInstance + """ + + data = values.of( + { + "DomainName": domain_name, + "FriendlyName": friendly_name, + "VoiceUrl": voice_url, + "VoiceMethod": voice_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceFallbackMethod": voice_fallback_method, + "VoiceStatusCallbackUrl": voice_status_callback_url, + "VoiceStatusCallbackMethod": voice_status_callback_method, + "SipRegistration": serialize.boolean_to_string(sip_registration), + "EmergencyCallingEnabled": serialize.boolean_to_string( + emergency_calling_enabled + ), + "Secure": serialize.boolean_to_string(secure), + "ByocTrunkSid": byoc_trunk_sid, + "EmergencyCallerSid": emergency_caller_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DomainInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async( + self, + domain_name: str, + friendly_name: Union[str, object] = values.unset, + voice_url: Union[str, object] = values.unset, + voice_method: Union[str, object] = values.unset, + voice_fallback_url: Union[str, object] = values.unset, + voice_fallback_method: Union[str, object] = values.unset, + voice_status_callback_url: Union[str, object] = values.unset, + voice_status_callback_method: Union[str, object] = values.unset, + sip_registration: Union[bool, object] = values.unset, + emergency_calling_enabled: Union[bool, object] = values.unset, + secure: Union[bool, object] = values.unset, + byoc_trunk_sid: Union[str, object] = values.unset, + emergency_caller_sid: Union[str, object] = values.unset, + ) -> DomainInstance: + """ + Asynchronously create the DomainInstance + + :param domain_name: The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \\\"-\\\" and must end with `sip.twilio.com`. + :param friendly_name: A descriptive string that you created to describe the resource. It can be up to 64 characters long. + :param voice_url: The URL we should when the domain receives a call. + :param voice_method: The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + :param voice_fallback_url: The URL that we should call when an error occurs while retrieving or executing the TwiML from `voice_url`. + :param voice_fallback_method: The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + :param voice_status_callback_url: The URL that we should call to pass status parameters (such as call ended) to your application. + :param voice_status_callback_method: The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + :param sip_registration: Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + :param emergency_calling_enabled: Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + :param secure: Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + :param byoc_trunk_sid: The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + :param emergency_caller_sid: Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + + :returns: The created DomainInstance + """ + + data = values.of( + { + "DomainName": domain_name, + "FriendlyName": friendly_name, + "VoiceUrl": voice_url, + "VoiceMethod": voice_method, + "VoiceFallbackUrl": voice_fallback_url, + "VoiceFallbackMethod": voice_fallback_method, + "VoiceStatusCallbackUrl": voice_status_callback_url, + "VoiceStatusCallbackMethod": voice_status_callback_method, + "SipRegistration": serialize.boolean_to_string(sip_registration), + "EmergencyCallingEnabled": serialize.boolean_to_string( + emergency_calling_enabled + ), + "Secure": serialize.boolean_to_string(secure), + "ByocTrunkSid": byoc_trunk_sid, + "EmergencyCallerSid": emergency_caller_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return DomainInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[DomainInstance]: + """ + Streams DomainInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[DomainInstance]: + """ + Asynchronously streams DomainInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DomainInstance]: + """ + Lists DomainInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[DomainInstance]: + """ + Asynchronously lists DomainInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DomainPage: + """ + Retrieve a single page of DomainInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DomainInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DomainPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> DomainPage: + """ + Asynchronously retrieve a single page of DomainInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of DomainInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return DomainPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> DomainPage: + """ + Retrieve a specific page of DomainInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DomainInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return DomainPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> DomainPage: + """ + Asynchronously retrieve a specific page of DomainInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of DomainInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return DomainPage(self._version, response, self._solution) + + def get(self, sid: str) -> DomainContext: + """ + Constructs a DomainContext + + :param sid: The Twilio-provided string that uniquely identifies the SipDomain resource to update. + """ + return DomainContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> DomainContext: + """ + Constructs a DomainContext + + :param sid: The Twilio-provided string that uniquely identifies the SipDomain resource to update. + """ + return DomainContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ce19a671076160ec2428941189004e0a30a6a6a GIT binary patch literal 45420 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__pycache__/credential_list_mapping.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/__pycache__/credential_list_mapping.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e44a14be0d1a28e015cb5487807a0762a2b5ce9 GIT binary patch literal 24965 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/__init__.py new file mode 100644 index 00000000..73a81ac9 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/__init__.py @@ -0,0 +1,86 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.api.v2010.account.sip.domain.auth_types.auth_type_calls import ( + AuthTypeCallsList, +) +from twilio.rest.api.v2010.account.sip.domain.auth_types.auth_type_registrations import ( + AuthTypeRegistrationsList, +) + + +class AuthTypesList(ListResource): + + def __init__(self, version: Version, account_sid: str, domain_sid: str): + """ + Initialize the AuthTypesList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the CredentialListMapping resource to fetch. + :param domain_sid: The SID of the SIP domain that contains the resource to fetch. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/Auth.json".format( + **self._solution + ) + + self._calls: Optional[AuthTypeCallsList] = None + self._registrations: Optional[AuthTypeRegistrationsList] = None + + @property + def calls(self) -> AuthTypeCallsList: + """ + Access the calls + """ + if self._calls is None: + self._calls = AuthTypeCallsList( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + return self._calls + + @property + def registrations(self) -> AuthTypeRegistrationsList: + """ + Access the registrations + """ + if self._registrations is None: + self._registrations = AuthTypeRegistrationsList( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + return self._registrations + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..791839b42ccfb9781d43ce338168364882462e0c GIT binary patch literal 3521 zcmdTGO>Y~=b#}S@5J}07BgeL++8ZfI!nWRZ-J(h4)TkgCu4+dXY&8j32GjNK&{}7? z%g!#PQf2@j1XKdtIz6;XfC9;(hZydmKcS~ydXb7078c1VK!M)q%0h#j`rgbgMOI0B z=&4KM&71e$yqS5Q^XK8=B7yJTUw*RuC%`_#N&00IWUmUy7I8?GIEtfsN<*!x3gQ_r z)6lA#z%?)1$W?O!&wBYrp;{1l&KqhJt3`#V%=KA?O{ghu9n(Em7?`Gg^;2S z-_o)h>UQ8Tebox}Tg+$NikPF{Y$KaesvrE2fFz0w#VEm{X(H7pf_iWnrDE5Pu6KGr zAmar7AR;-GB1KFQ;Fg^lP$WjFiCCgUlFgo8+7XMTXd(y7rAidW)vN2c zhy17VwW2iBs_VIdepa7px{`o)gMYNl^k(a(=i2&`l(~NC#*#j>IB&?63)hw|O($md ztWYenT2U}yYyDc2`LIU6EFBPVL+r8~Ma^*9Gy`B;P4{f#A7Dq!UKS#Af$j&9&Kx%q zhq1*b4a;v?p4T>te@DMpl(=xM8M%RPd4QL%x?yykg+Ytk4CeXQ84rO8=uUGg4I`h*d{n8AoNBlVMstw?XQP zqpg>#S(bCMEMHfh+`9HKSzIj$>JU)#ebgdIYCtQjYt_;Q`I%BJ-yoHtcsM4)Sgwz_ttI>5fcb`bvG*GQzgD(L1f%>mwGR0O@H@&wNEQ4P z(os7ZNBOPVAykz#0y*ZWx6_NKL>L{-B^`3Rf47ADJLQ)OXy|dA49wEZCt}vq*UnV3 zmX+oz2JXD?My}<#YfN~1;Px`$P-?nqajT&x#+cR<|H2Y0f^7FAu!f9Xo@{?`__wTe6Fsp8j%Qp!wwpz6WF2YS`8Co)=V^2lFd02^#${0 zmNSR>cpZ$h*Q{pK^>69viFC-3I*aUOnF@VpJMiYAqurQa)Ft~r+_g`0@7fPkUIGX4 zGJv&dGr3`C-sv;MJ0_?%=R_<4=inIcnCJ)Nb{O~z4@e~+XTw&L@wh;#3;v=s9-?93 zwJ>esTs`0oD~dJR;%=OyHYQp;LV15~RkE=bGOy0DSsa`U^iYxDl!h2GXq3BOtj}=Dr-?nbCuqIt*g2f}@ zs+IHSzI85jm>IfF@FXUVX~Feq1XUq4(<>RxHh&6@^~^vF8Y%w_@WM9%e14ZaIYx#? zHuF1$lkc7QxbSSZKqg+;9eeI^HZxY-(C&=@;rN@%_UPiH(KmKR-*`;ac9c^v`3jzjyx(WiW($ekTlnRtfEuQ)P4=P?!j3_Uz~m5N(PJEh z03QLB6^$QFXuFt-52^KB< z*7R59lgWTbmGL^(9%H~97x@u5)FBf>RmDS4dbspR`Xa0f(GOs_GC6u)+`2N1<=D3x z49anl(njF4JjBbC{uJIylEbm8#u<3yh~gF(njGFpnRC`5*+_v%khulzL<9nk{ju&#q9X@ zi5LGtVBE{3lWclC=>fR eqI~;P^1{BRD(Zd?z?0%D%K3M%?h_b AuthCallsCredentialListMappingList: + """ + Access the credential_list_mappings + """ + if self._credential_list_mappings is None: + self._credential_list_mappings = AuthCallsCredentialListMappingList( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + return self._credential_list_mappings + + @property + def ip_access_control_list_mappings( + self, + ) -> AuthCallsIpAccessControlListMappingList: + """ + Access the ip_access_control_list_mappings + """ + if self._ip_access_control_list_mappings is None: + self._ip_access_control_list_mappings = ( + AuthCallsIpAccessControlListMappingList( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + ) + return self._ip_access_control_list_mappings + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e74c7abe9a09cb2318877fb5a179f7f9aa397d99 GIT binary patch literal 3837 zcmdTH-)|g8d3JB_r|&Ly2(6PCyd@FgBE0KBnt(~8T6R?#Vkc^xJRDaIo87s1)4kng zcF*R_rOJb)rcyx412~Z?rASC53J?4Vyz}BiL9tdKA%T#1yVS9$`o#Cm?wzl_xOw4) z^=amt@5g*I-_P-%N~HpU@6MlpvZ9m-`3Ej~UpfJHssL;fi&TjvS+XNF2p|!25?fxI2 zaREPIi7AvKMl5kamF*f}Vu(^5p=6U7t@rn(Z6O@9CVa4Yyd^T@abfu`4ydr!+gDXl zNBryY*9x(j)@;Z2)G2k=w_^m_4SwMYQ~l;O$2QgFnCG3hE-$OImlm{Ga_QpoTQiB7 z9U~AzMlmE-;N#NaZPAh2}3`a(RB~VhHpD06u{DW~3@X zjLVk9QkKjVE5($0<~FHIma#l)9WWsVIa4n$%&T5qDE=`-2HN-CZ}q}>ZEZ~pMV4r$ z*U&A`40PLQ=n&d^vQs5d&Y37fm|iaoM74J!6;i3rLUSd~n1QqHd35M#mlrOnG5JgG zIhH?k2j1kQfQOg(P3)#lae|R%(M}wWe};<_9+|!QjwzP zAQwN+QAtNiz??eA_Oo{hP)0?`pftb;L;KzO?1QeB+vt_C!gLT&kvG(`NM1{H-7KcC%MC}$q%
    ucDz;^%F&OFz5(10^vQVsed!#;fl?7_1*d<_S5C;vJOgU+0M$@c4~hJE@H zkp)z-2m`pbEL=O?8JXT1`QATA&u$+Y-(0-AxUC-lUHLcVhc`Rw8{3n|9=w15{fACx z@(1ABv4fDYrLiZ)Qy`4qJ>5BQdMkH&*t?)1PF3u#o1`UGy<`#9SrF#W+4(;tIfTyIG|g--~~JEE z>|Eh75r0?}g%>}|or@#pJf8*}R`fuJp_`H<>6u)Vl-&s;P3&ff^xeOa6T6Bm$-5aC Ro)_jM>CC<2F2Pwi=D%D`1(W~) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/auth_calls_credential_list_mapping.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/auth_calls_credential_list_mapping.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fa6b760600dd4352445a45b4b48e5221d392171 GIT binary patch literal 25279 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 N-8O$Jun6nO{{wvyl<5Ef literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/auth_calls_ip_access_control_list_mapping.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/__pycache__/auth_calls_ip_access_control_list_mapping.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7512c34684521199a501763bac4ce0b4681fdebc GIT binary patch literal 25703 zcmeHvdu$xXnP>M*&y&N4_!3D`QtL@lB8QYLOAhr|Q=;rBmT5(#9DtTH9?dkRk>|m5 z4<(T%6P>NgQoG)@nZ<_GB3R4W#adiDYh@SMbryG*7&zPoxPLgy03;eQBH->8yMG*R zl#yXaI2`WxRdx6D42SYiQO-V`M`Cq#J-)84`o6Ee`qfwcUn(p80)DUm(@Ph=dqxoc zE8Unsml4VR5|LRUDhvxzG3tnm32|5yDejCr63$^~LK>D5u3=ZgJ?u_+hCK=Ius7iw z_OUWj+@Gizu1Exi1MJ=vuS`@8SFyM|UY)2Ju3>Rcd|je;xR%Ae@w!C)a6OCr;th$$ z;YLw#2u}-9|1}|6q13$VV*&1;H=lH*_JU$&pl4kuQfe`Mi=;)Nopf%IC%@I}{4Z`G1r^Ng=Apt~^+AYm~AT zAv#no6k<=El;uh5AClykA*_r6f=nM@Xp&XtMU8SG z&Ph^XYA$YHq<|iH)}$-T^bG#rEPvL|yXkT)9!tqxa^Gl-Cs4oPfBJ$VkB*&-$0G6& zFLV0%;E>#R>O_#&9C&W%c(2jT@vz1!g~!sVg1(lY8=BR|atAf*P`Q!b>_qgrow zcM93z(O8!;KFCfhkqfLye@afK(y|hbrCDPl>>-J8ax5H=j|ct#N}SUn>fR{EH62SR z9Uk4;mmJrn{#YcfODAJmTK7ITnvSKC;kfQPlSD-Ko=6iTq*T4KPa980%-ar!UJ+F^ zMU92yu?afi2OceQW1tl$fYAH4m*9|_NYUVqE5x7xE0TcqZy^5lH!iy zKI&GyiknhK{L{jS81-DM9QG;xXie02O?uZLJX{g=DuEFP zT8V27^4us_h4{K@;fgq1J1BJ2>bv{K(ie`Qr?nHKeUXTwY4rMPDo(HYYnSL8${(!)ZC9DolilHCJzytQv#DIgK}ocqC-h=WU`CIh>5j#5!^; zDL?(}5PuAjH)$~CVLn$IRU)yG7?cQ#zi|4gWAff7_UvJo|=B%|^1P%@lQczDb6PqgVDw z>z+$o-~(fE?ZgajVGOx(xmH(sKI8K6fV}9H1gM|`v*?6#Oj$S z%7rS-{BfbfGoUu&Ru9-^*tj$JU#~1+ShWe|=bfyYx*lfTT&mW-uC zA>DaiN%La#M7_ok*bqI6^n%(#wKq`EYSPhtAuSajqiF?{BF3cP(IriZkEr!jtbqb* zbpGk66=E}3D5O!Z(_AgfSMT3C)_e90rXB6 zD%`6Pd{x&y8E@0v`d@gr+}X9~{oV7sZzmRa^-oK`@HYLj=ipM$$xP45Fn~ zx)()S+m>6lFV{7G@Au}mztw)D{jNu9!2@2e%KC-p#6fXd`lHGm8Z78;RY{Mj$%rBO zlqS&lFQ8K+RKMT z>y^u3#$yGoM=Q&yW7;*=YZS?{x)Gh&A*tJN(RYsOXHY<}y=jU%@@GaC*p*Eh`$%naOoJX7Cs&*$1$HQoREv)O=9Q~$=)^{EAK ztJ(&t1p)wbj|;$lL{<}kix&H%knuCkQ?QdjZKzp_-lB~!g+v3lErciYNtr4D-yf4S2Lo`IF|FkSl^*7L7`()S&+&hNTh z!k}@?y#1fka15B^5#Y@Tg=v|# zVpJYO7fn2|24)G`$$bO0wJiw#h2|s-Ph-pM3o|b)HFRYfx)vL{m#VuLyxj}c-S=~} zRC{$(n|M>)A-(Nt6MqMS@F&)&Jf)-~7ns&t!<&^B18B|>q6S5}7FwiW>1U3DixFAT z{RgP~_pE_%kkNSw)mF-coT-)FA~5 zIk4v8;nZR@NTr0MGtOK@L5D04-bqzUy8pVq=yA}PSj%#G# z&@58)E48RH=Zt>AjJ<2noC0up(OSafN#z%6m}jK>d2{5Hn!1Fwr5u*c^#T_9qcEXi zXNSowDK()y8;)Ec)wo&}E-$itUzAsL1!<|=QwU6L{vwRDvv~0-amo=DN_EbpIO%xT z=$h|~v!W=xzCjYkMbhB&jtSQ*Q-@!f8kiS#HwP5vow_5~ql+)=;w6n{5VVIG6Zd_G z2vxf>svenmdM&IF3Q?zoLcv4v6cz{Ck)TEB3cU|41eo6Zr+4G!x-%_KN(m$ zbSiV`)Z(Gjzi1g;tR0;8+zC9l6nH)pcz(HNJ=Q9fRavLx^D|}EA(F(lgOa)nff=u( zcpbHp5EiUN{h?4I6&;IHJP-hzJQ7(2KOHQWvYl{cL5Xdto`k z+)j^kYeqVkO2wJ&q7oCTq_9;|3o6+qdZn=%jVSSWC`zhX&Lwp+r z-Pzg-mw#^CCju_4lUYL}XruKr!HQfQNreEb;xxcj36QEZ;$snyg1!$F^P!FI` zj}iAG?nT^(bik{_ej`q>Y6apF(g{`#FzB=r`X<1}nd1P35J1F^7+H#P5)CZEn_Q*v zCPGr8BEw27#pw{Dj*@FgDMkvGIHc(Jm*O9bSQ%P5<4&vr{}=SBH3^;oGQu(Na_2i^ zbz{?=qhU3ikd3uYuWTUU+_)rR1uVg>OA{-!p5Du=+F-lS6G5gWD4S+EmI=)&8x71u zi7VPSc;b}Ivmfxnt5de1Qm!|- zUh96v*8fx8c%kloh9w~<|Kd~Kq{zG39zpl&4@Mol(p2!GmP!uH3-c~@6L^y8ET++! zD%YjZm>TPFGlgDCcDQ~bxP%5lzRHypgQOlSV?Hrh)Iy|Q1tINg2ndm?EkLBQUJD(v zqe2Z&Iu`1$EY*J}Q~#a2f}_E|Tvhu<@_O>F6LG*rKCXyJ(XX%qXjaaVoC8(1%%M`| zPfW<0Hl^jal(`dyL|-%&9-dTS24_@Mr$%|B`W`O^#4+ZL;b7Q90%R|%v|U&CK+ z4gt5dKChm}`rEn6`dd=>qIv2!DIjoe!02q1rY_#wY_6u>R-*_Cx|y=dvgr%EncMV# zLDa|)WriC-*n<9UXr6s>=EbFk?o31Xa@~fT_3t#l-F*A$tW#+0$q9}||0jZ@#-9}& zJ_>65_ca3YU+ok7{NjgBvCk`gD7g?X;C$jp#`#|G{8~64{0#4eL#Vz68NeRGDl#CM zGBD*xSAZz{m8LxDKsvF1(J$&UFxgUhY%g||dLD+!dfzo>en_EDCCu!84RCdAt+Pc( zH>pP54ehIprgi7j$A=hqlms0;Oge20!|Xc7FwA1x3gX!L*p3SmRJIjSuq)lAjgSf*yjy$UyR zo!c;_S8x}T`0e1XwMzW&io+oLF1zgi7997PT(t_vc^Sv~@*D^B?>IyM{OVVTE6!7J zfdX3Rb3IfZtFhHXA*-phuTaQd40_nVR`%jr>OT{;KR{4YOXc|tyi<9ja;a%grfJV| zUDI6jt=Ns&?e)-C&3mD*nn_>P`KLYiyh6>vhvm7f4>ay;Bv!BXxsTR}A9}^3Rnmt( zc2mHNmN9<~g})f6hf4ZWrA>hqEv1R%5rPux@6nT-ev$uWap5v4U?1_MihGnv4d5|}}i z`W!Xw6a}=U!rAOl5MSb`4`q7%?Y?>I~#Gc zZ6GJ$n(ZlGqtnC5(6N4!5zCQPWOsp5oQkBl47Vo-*5q)7!W!E{>vpWSCB(hst`4`} zRt95{?-k#WZ^vUI4(su@eOyw9b_)f%)n3l10%We_n%dg2HDAc~h$!2!ea~s`$`T+s zaot+(9vzFtqXoOIaFZ(IrOds*6>Dz8@ugQj#XVrik!cj$tps1D5`0B}>V)Y9nXs`7@i6*fzGc3wc*Vv>a zv%po#EC3yDbkbPN0yag{NfS==K9shg)*exZL14uW2vZZ~m{IJFO||yFK`Q4(z;MNy zlOkKo48SZbl6aa@R3`ECCVV^ylw|N7Z&4fF?xY}P2LA&Qjdn9htSeo9SXOh#Zr06x zb>`byC+_d~_T^l-W;eNAC&jsK_XN7~r7ICBkWbTzCwBQNI;)D;0)QqZ@ddYdG-0vXxfZ0LoT9uxzzewi0D) z$}C%jvT!cGNZniXTTAMQ6OPOE&}I#WHmkv%-@5Y`+_{y;5pQ%Ip1gi7&nR8?A)Z`| zCpSgw*cdiq4C|q1n{D?ExNnIzviuFmUyu7%+kF%6HyW5|Gvb>VCb}6aZ$nv{nmkL3 zu%8GqzxlJQtO=wPL8ek^$P|DnmUJOYnLi@H^y+U1n9_@`(A@v;qosg!QCzu5W=0CeHqjKuZo+ay|P39t5OjJ1#}+$x%t-%VJQnoQZ+hz(OQ(#zN4@xczih zMDni7X*j8Qg@y@npcJ$avM!;SF zxfgwD0T1vVH2k0n#a#V2AfXirH1T&?D^;67bLvM(tlvX*j!r%j$u^P9y_u%H#gg6p z*h65MdGR*zOTJUHUh2(_Q{`nT(B1O%4bILHZr@h9R8DIiE~HFs^J8!Y!TAC5Pr!Lj1*;sR=`vcx{Ed_RaY0$`S4P5kK{|b!Oz~8U ztl@WIv1_k9P^wvMuZoTx;3+t0rlmXO%NLX+J4vc3X&L7X2PVI6m&3%RwDI5v3n2j}1CeiMcV?iY-;}}LetI;X%>FMd|uq{EY6BWh@ z5O&l9p5Uyz#$yUV$}wg`@+SgRBu2Darv6)qBb>pjUv8qc}+fRio(= z^_cGFFKn7%RGQV(-MpB39Vx|1oA!jtx5D@nLZq(0hKhjN+ToryyK!dY(z;!lb-Qjo ze!F9F-JxmsG8_$Ho88=hYj>I2hKf%n19{#!e5ub=N;tnOX#_HxIAVnz8H zo{{?x2uvr>lB&#J3uWo|aLTgS!C=kGQz}%RuvE4&OT`tQMkB33EwWU2r+%qZxvKwC zr+%qZ|1aoN_4lDB2J9+Tokoi8XOj;*8KVabb;s`1KSXx1_Iv|r<(s^Aa#u))(k>!1 zc~@1V@E;1zgl=8B{c@)J=$oO%hGR?B$84IkBU9aRYx`~Y?aM!|UaWp{!TV&^CDinb z_qA%!e)aLbjp9FueH)|?wj)+xh`Nzanlndk1w~tQt7z2sMAI;Q*Dx<(AUeX0cHKs{ z{i9N4af0zIt$8LHkG;$exWiIx@1R4H&=m#7n1X2#A4$Nc2iWvV=A!%(oBUofjSL)& zOs6cGhV^z%0Z3w6emGM3=!`ge1y~??W6gTBX}$0(x8E%5?@JSoY`#tyb*%f?XqGVG ziY(c}E~UFiX~0oiz;mYU7UAC3547H}^=nyS_za3fBvi7vun)W)mwaxaZ^!qLH_=%J zOn4FmgG6=3LB z3v~*8VSynp5^_l!GM5J3PcO}Jx3UgjpG0w{V|X2!`n4fY6ll&I6g92P|FF z_5^fITh%9mb4%4HE;yRP7ox_0r?K_dPNA|c>p=3SSxW!(*ObBBP=CXsztQMO_^ay= ziZ{fd^k?pa;!VeX>4(x@_g{%U{&$>v-G43Zm;OdPDBc$Ly8l+(Fa4eOplH}^>D0?g zQmPCWR%9w=AjW)}~vO7fO z?YGk$HX=+%xuQhI=#z1=L;_zS!zW?l<2KBM<7R9i*`Sio)p=!z#+N=}!4K`6hP`j_`Dv$QFa+ z9`CWejs*eHTdc89t;XO~iO=c@?d5s6Lis)=%u>KmC~H?w_nIzn8f|ZphQW{fO%c>oz6CRi7x_=5SFWKNEEw6` z+S}N++_Y`EbqCH1k?{g;f!#gph(*EfUVcxnZvE`xnZrwUJ2G`U@;=Pc2j{V;SHBa; zf4zU&i_hKE955W1=bpGZ^v*Zm{w5BX8fP&$97TH5{8`pfE81Dk2HqE0g{;`Rdju*4 z7TpeJzxl%dXjd&o_8WxZOHK2I)->u3@cgPOMg0MC2UhBjKc-4-lhD#1Ds9xSR1H+J ze8YoO12;VWl@tW6jQA$uZ>J-gH@>y;#>S=QJ(*_PIR~yITIi%h3!QZMY(;A3dx?uk6v{eY#w>QTMgVN29R)>f*3=64A{Cn(+cI@+OLf6aU2v&xf2MB#?XeFo zF4mox_WrVZ|7XmKcD5u&W|+ax5V0@=#EXBWOy-AS=3=zrQ82ePb2-Dkb|!zo%=IPD zW0hdq{g#c&cz(cOdi5{B11c#vz0zQJuE+CCul^Ns3mLu2WLsl_TF!B|0(R&1T8QbN z19iSgZ4_EIaed#FY3^ET-j`|Kx72(z(|q)2kN?3PUl@-^7!@yUd|;~{+v5Jzrz;gUZw159;0CD4~h?I&hb z83_~Rd|cV&mt7c(oN+z|ALX--(5`xZwl41i#1{zm!TekXT_vX}l|BHf{tW_qf6y0j z=mVsoQ2BF)S>pg+OnslIwjn4u=7{@8c?^ig;R3iACH|5eQSY?*+I~4nC3K%!b6#Fp+0~9<@LGh8oOO!}~hYVkOFLtD` zmLDm^g^m>B@-yvYx@6lo<5beFuB;PRb{YxS>`}2)Dx6T|?aSNR?t0d{4&JF=Kj*wY zm31MGuMO3=&K;XMoTVImu)|-wP8Q(Fg zi3F=^6Iy3J5pi2Zxpe>%eZvT zcP_UF-w(_O?)tWXN`3R(wz*4lyEFAWvo0inRO5!Z$8Ngk4rUtKvK~tE3Mf@KH!`;Y z7($k+;q$frJ-G^seNFsbQh!RML!ggk=@96`?$gF$&?<~=%f_q|*E_zRoD0{ijB}uG z;yfuX3!6{m=$dUoFn5fnZO3_0mc~z{ePTP2Mr<|Eu|YjeJmy3I({!9ZJkP&63InXP(6&pMk#@ChUyANCnT5ZWe^W>uW6=$`QYHlo91ZFt<)W2FqWt#0} z;sjM&`PGzPXU{i|_OMgDdW}7YjAaIsao=<%bxbCiSPfIFNw+by>c007|3cUi_1_~6 z;wEV45oDdBDBg7hMCs#JLEQ8!;pCEVG9#S)m9YCG;farg-j9U69|>(A30v;DqoU|v w*n9LI=55h`Z@_sGm)o1~;X`z|9d@o4Pl~sq_XN7$+jq=GxABh!7GVwfKa$ot=Kufz literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/auth_calls_credential_list_mapping.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/auth_calls_credential_list_mapping.py new file mode 100644 index 00000000..4839f17d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/auth_calls_credential_list_mapping.py @@ -0,0 +1,582 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AuthCallsCredentialListMappingInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the CredentialListMapping resource. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar sid: The unique string that that we created to identify the CredentialListMapping resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + domain_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.sid: Optional[str] = payload.get("sid") + + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + "sid": sid or self.sid, + } + self._context: Optional[AuthCallsCredentialListMappingContext] = None + + @property + def _proxy(self) -> "AuthCallsCredentialListMappingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AuthCallsCredentialListMappingContext for this AuthCallsCredentialListMappingInstance + """ + if self._context is None: + self._context = AuthCallsCredentialListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AuthCallsCredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AuthCallsCredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AuthCallsCredentialListMappingInstance": + """ + Fetch the AuthCallsCredentialListMappingInstance + + + :returns: The fetched AuthCallsCredentialListMappingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AuthCallsCredentialListMappingInstance": + """ + Asynchronous coroutine to fetch the AuthCallsCredentialListMappingInstance + + + :returns: The fetched AuthCallsCredentialListMappingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AuthCallsCredentialListMappingContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, domain_sid: str, sid: str): + """ + Initialize the AuthCallsCredentialListMappingContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the CredentialListMapping resource to fetch. + :param domain_sid: The SID of the SIP domain that contains the resource to fetch. + :param sid: The Twilio-provided string that uniquely identifies the CredentialListMapping resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/Auth/Calls/CredentialListMappings/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the AuthCallsCredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AuthCallsCredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AuthCallsCredentialListMappingInstance: + """ + Fetch the AuthCallsCredentialListMappingInstance + + + :returns: The fetched AuthCallsCredentialListMappingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AuthCallsCredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AuthCallsCredentialListMappingInstance: + """ + Asynchronous coroutine to fetch the AuthCallsCredentialListMappingInstance + + + :returns: The fetched AuthCallsCredentialListMappingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AuthCallsCredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AuthCallsCredentialListMappingPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> AuthCallsCredentialListMappingInstance: + """ + Build an instance of AuthCallsCredentialListMappingInstance + + :param payload: Payload response from the API + """ + return AuthCallsCredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AuthCallsCredentialListMappingList(ListResource): + + def __init__(self, version: Version, account_sid: str, domain_sid: str): + """ + Initialize the AuthCallsCredentialListMappingList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the CredentialListMapping resources to read. + :param domain_sid: The SID of the SIP domain that contains the resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/Auth/Calls/CredentialListMappings.json".format( + **self._solution + ) + + def create( + self, credential_list_sid: str + ) -> AuthCallsCredentialListMappingInstance: + """ + Create the AuthCallsCredentialListMappingInstance + + :param credential_list_sid: The SID of the CredentialList resource to map to the SIP domain. + + :returns: The created AuthCallsCredentialListMappingInstance + """ + + data = values.of( + { + "CredentialListSid": credential_list_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthCallsCredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + async def create_async( + self, credential_list_sid: str + ) -> AuthCallsCredentialListMappingInstance: + """ + Asynchronously create the AuthCallsCredentialListMappingInstance + + :param credential_list_sid: The SID of the CredentialList resource to map to the SIP domain. + + :returns: The created AuthCallsCredentialListMappingInstance + """ + + data = values.of( + { + "CredentialListSid": credential_list_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthCallsCredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AuthCallsCredentialListMappingInstance]: + """ + Streams AuthCallsCredentialListMappingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AuthCallsCredentialListMappingInstance]: + """ + Asynchronously streams AuthCallsCredentialListMappingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthCallsCredentialListMappingInstance]: + """ + Lists AuthCallsCredentialListMappingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthCallsCredentialListMappingInstance]: + """ + Asynchronously lists AuthCallsCredentialListMappingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthCallsCredentialListMappingPage: + """ + Retrieve a single page of AuthCallsCredentialListMappingInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthCallsCredentialListMappingInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthCallsCredentialListMappingPage( + self._version, response, self._solution + ) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthCallsCredentialListMappingPage: + """ + Asynchronously retrieve a single page of AuthCallsCredentialListMappingInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthCallsCredentialListMappingInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthCallsCredentialListMappingPage( + self._version, response, self._solution + ) + + def get_page(self, target_url: str) -> AuthCallsCredentialListMappingPage: + """ + Retrieve a specific page of AuthCallsCredentialListMappingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthCallsCredentialListMappingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AuthCallsCredentialListMappingPage( + self._version, response, self._solution + ) + + async def get_page_async( + self, target_url: str + ) -> AuthCallsCredentialListMappingPage: + """ + Asynchronously retrieve a specific page of AuthCallsCredentialListMappingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthCallsCredentialListMappingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AuthCallsCredentialListMappingPage( + self._version, response, self._solution + ) + + def get(self, sid: str) -> AuthCallsCredentialListMappingContext: + """ + Constructs a AuthCallsCredentialListMappingContext + + :param sid: The Twilio-provided string that uniquely identifies the CredentialListMapping resource to fetch. + """ + return AuthCallsCredentialListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> AuthCallsCredentialListMappingContext: + """ + Constructs a AuthCallsCredentialListMappingContext + + :param sid: The Twilio-provided string that uniquely identifies the CredentialListMapping resource to fetch. + """ + return AuthCallsCredentialListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/auth_calls_ip_access_control_list_mapping.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/auth_calls_ip_access_control_list_mapping.py new file mode 100644 index 00000000..198f4fc4 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls/auth_calls_ip_access_control_list_mapping.py @@ -0,0 +1,586 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AuthCallsIpAccessControlListMappingInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IpAccessControlListMapping resource. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar sid: The unique string that that we created to identify the IpAccessControlListMapping resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + domain_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.sid: Optional[str] = payload.get("sid") + + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + "sid": sid or self.sid, + } + self._context: Optional[AuthCallsIpAccessControlListMappingContext] = None + + @property + def _proxy(self) -> "AuthCallsIpAccessControlListMappingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AuthCallsIpAccessControlListMappingContext for this AuthCallsIpAccessControlListMappingInstance + """ + if self._context is None: + self._context = AuthCallsIpAccessControlListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AuthCallsIpAccessControlListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AuthCallsIpAccessControlListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AuthCallsIpAccessControlListMappingInstance": + """ + Fetch the AuthCallsIpAccessControlListMappingInstance + + + :returns: The fetched AuthCallsIpAccessControlListMappingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AuthCallsIpAccessControlListMappingInstance": + """ + Asynchronous coroutine to fetch the AuthCallsIpAccessControlListMappingInstance + + + :returns: The fetched AuthCallsIpAccessControlListMappingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return ( + "".format( + context + ) + ) + + +class AuthCallsIpAccessControlListMappingContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, domain_sid: str, sid: str): + """ + Initialize the AuthCallsIpAccessControlListMappingContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IpAccessControlListMapping resource to fetch. + :param domain_sid: The SID of the SIP domain that contains the resource to fetch. + :param sid: The Twilio-provided string that uniquely identifies the IpAccessControlListMapping resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/Auth/Calls/IpAccessControlListMappings/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the AuthCallsIpAccessControlListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AuthCallsIpAccessControlListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AuthCallsIpAccessControlListMappingInstance: + """ + Fetch the AuthCallsIpAccessControlListMappingInstance + + + :returns: The fetched AuthCallsIpAccessControlListMappingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AuthCallsIpAccessControlListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AuthCallsIpAccessControlListMappingInstance: + """ + Asynchronous coroutine to fetch the AuthCallsIpAccessControlListMappingInstance + + + :returns: The fetched AuthCallsIpAccessControlListMappingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AuthCallsIpAccessControlListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return ( + "".format( + context + ) + ) + + +class AuthCallsIpAccessControlListMappingPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> AuthCallsIpAccessControlListMappingInstance: + """ + Build an instance of AuthCallsIpAccessControlListMappingInstance + + :param payload: Payload response from the API + """ + return AuthCallsIpAccessControlListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AuthCallsIpAccessControlListMappingList(ListResource): + + def __init__(self, version: Version, account_sid: str, domain_sid: str): + """ + Initialize the AuthCallsIpAccessControlListMappingList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IpAccessControlListMapping resources to read. + :param domain_sid: The SID of the SIP domain that contains the resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/Auth/Calls/IpAccessControlListMappings.json".format( + **self._solution + ) + + def create( + self, ip_access_control_list_sid: str + ) -> AuthCallsIpAccessControlListMappingInstance: + """ + Create the AuthCallsIpAccessControlListMappingInstance + + :param ip_access_control_list_sid: The SID of the IpAccessControlList resource to map to the SIP domain. + + :returns: The created AuthCallsIpAccessControlListMappingInstance + """ + + data = values.of( + { + "IpAccessControlListSid": ip_access_control_list_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthCallsIpAccessControlListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + async def create_async( + self, ip_access_control_list_sid: str + ) -> AuthCallsIpAccessControlListMappingInstance: + """ + Asynchronously create the AuthCallsIpAccessControlListMappingInstance + + :param ip_access_control_list_sid: The SID of the IpAccessControlList resource to map to the SIP domain. + + :returns: The created AuthCallsIpAccessControlListMappingInstance + """ + + data = values.of( + { + "IpAccessControlListSid": ip_access_control_list_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthCallsIpAccessControlListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AuthCallsIpAccessControlListMappingInstance]: + """ + Streams AuthCallsIpAccessControlListMappingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AuthCallsIpAccessControlListMappingInstance]: + """ + Asynchronously streams AuthCallsIpAccessControlListMappingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthCallsIpAccessControlListMappingInstance]: + """ + Lists AuthCallsIpAccessControlListMappingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthCallsIpAccessControlListMappingInstance]: + """ + Asynchronously lists AuthCallsIpAccessControlListMappingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthCallsIpAccessControlListMappingPage: + """ + Retrieve a single page of AuthCallsIpAccessControlListMappingInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthCallsIpAccessControlListMappingInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthCallsIpAccessControlListMappingPage( + self._version, response, self._solution + ) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthCallsIpAccessControlListMappingPage: + """ + Asynchronously retrieve a single page of AuthCallsIpAccessControlListMappingInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthCallsIpAccessControlListMappingInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthCallsIpAccessControlListMappingPage( + self._version, response, self._solution + ) + + def get_page(self, target_url: str) -> AuthCallsIpAccessControlListMappingPage: + """ + Retrieve a specific page of AuthCallsIpAccessControlListMappingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthCallsIpAccessControlListMappingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AuthCallsIpAccessControlListMappingPage( + self._version, response, self._solution + ) + + async def get_page_async( + self, target_url: str + ) -> AuthCallsIpAccessControlListMappingPage: + """ + Asynchronously retrieve a specific page of AuthCallsIpAccessControlListMappingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthCallsIpAccessControlListMappingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AuthCallsIpAccessControlListMappingPage( + self._version, response, self._solution + ) + + def get(self, sid: str) -> AuthCallsIpAccessControlListMappingContext: + """ + Constructs a AuthCallsIpAccessControlListMappingContext + + :param sid: The Twilio-provided string that uniquely identifies the IpAccessControlListMapping resource to fetch. + """ + return AuthCallsIpAccessControlListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> AuthCallsIpAccessControlListMappingContext: + """ + Constructs a AuthCallsIpAccessControlListMappingContext + + :param sid: The Twilio-provided string that uniquely identifies the IpAccessControlListMapping resource to fetch. + """ + return AuthCallsIpAccessControlListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__init__.py new file mode 100644 index 00000000..c10c7473 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__init__.py @@ -0,0 +1,71 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from typing import Optional + + +from twilio.base.list_resource import ListResource +from twilio.base.version import Version + +from twilio.rest.api.v2010.account.sip.domain.auth_types.auth_type_registrations.auth_registrations_credential_list_mapping import ( + AuthRegistrationsCredentialListMappingList, +) + + +class AuthTypeRegistrationsList(ListResource): + + def __init__(self, version: Version, account_sid: str, domain_sid: str): + """ + Initialize the AuthTypeRegistrationsList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the CredentialListMapping resource to fetch. + :param domain_sid: The SID of the SIP domain that contains the resource to fetch. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/Auth/Registrations.json".format( + **self._solution + ) + + self._credential_list_mappings: Optional[ + AuthRegistrationsCredentialListMappingList + ] = None + + @property + def credential_list_mappings(self) -> AuthRegistrationsCredentialListMappingList: + """ + Access the credential_list_mappings + """ + if self._credential_list_mappings is None: + self._credential_list_mappings = AuthRegistrationsCredentialListMappingList( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + return self._credential_list_mappings + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..550775cee403ab81f5cb4d4ddade62d0e2765a12 GIT binary patch literal 3145 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/auth_registrations_credential_list_mapping.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/auth_registrations_credential_list_mapping.py new file mode 100644 index 00000000..e4b1bf0d --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations/auth_registrations_credential_list_mapping.py @@ -0,0 +1,582 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class AuthRegistrationsCredentialListMappingInstance(InstanceResource): + """ + :ivar account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the CredentialListMapping resource. + :ivar date_created: The date and time in GMT that the resource was created specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar date_updated: The date and time in GMT that the resource was last updated specified in [RFC 2822](https://www.ietf.org/rfc/rfc2822.txt) format. + :ivar friendly_name: The string that you assigned to describe the resource. + :ivar sid: The unique string that that we created to identify the CredentialListMapping resource. + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + domain_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.sid: Optional[str] = payload.get("sid") + + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + "sid": sid or self.sid, + } + self._context: Optional[AuthRegistrationsCredentialListMappingContext] = None + + @property + def _proxy(self) -> "AuthRegistrationsCredentialListMappingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: AuthRegistrationsCredentialListMappingContext for this AuthRegistrationsCredentialListMappingInstance + """ + if self._context is None: + self._context = AuthRegistrationsCredentialListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the AuthRegistrationsCredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AuthRegistrationsCredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "AuthRegistrationsCredentialListMappingInstance": + """ + Fetch the AuthRegistrationsCredentialListMappingInstance + + + :returns: The fetched AuthRegistrationsCredentialListMappingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "AuthRegistrationsCredentialListMappingInstance": + """ + Asynchronous coroutine to fetch the AuthRegistrationsCredentialListMappingInstance + + + :returns: The fetched AuthRegistrationsCredentialListMappingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AuthRegistrationsCredentialListMappingContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, domain_sid: str, sid: str): + """ + Initialize the AuthRegistrationsCredentialListMappingContext + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the CredentialListMapping resource to fetch. + :param domain_sid: The SID of the SIP domain that contains the resource to fetch. + :param sid: The Twilio-provided string that uniquely identifies the CredentialListMapping resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/Auth/Registrations/CredentialListMappings/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the AuthRegistrationsCredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the AuthRegistrationsCredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> AuthRegistrationsCredentialListMappingInstance: + """ + Fetch the AuthRegistrationsCredentialListMappingInstance + + + :returns: The fetched AuthRegistrationsCredentialListMappingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return AuthRegistrationsCredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> AuthRegistrationsCredentialListMappingInstance: + """ + Asynchronous coroutine to fetch the AuthRegistrationsCredentialListMappingInstance + + + :returns: The fetched AuthRegistrationsCredentialListMappingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return AuthRegistrationsCredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class AuthRegistrationsCredentialListMappingPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> AuthRegistrationsCredentialListMappingInstance: + """ + Build an instance of AuthRegistrationsCredentialListMappingInstance + + :param payload: Payload response from the API + """ + return AuthRegistrationsCredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class AuthRegistrationsCredentialListMappingList(ListResource): + + def __init__(self, version: Version, account_sid: str, domain_sid: str): + """ + Initialize the AuthRegistrationsCredentialListMappingList + + :param version: Version that contains the resource + :param account_sid: The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the CredentialListMapping resources to read. + :param domain_sid: The SID of the SIP domain that contains the resources to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/Auth/Registrations/CredentialListMappings.json".format( + **self._solution + ) + + def create( + self, credential_list_sid: str + ) -> AuthRegistrationsCredentialListMappingInstance: + """ + Create the AuthRegistrationsCredentialListMappingInstance + + :param credential_list_sid: The SID of the CredentialList resource to map to the SIP domain. + + :returns: The created AuthRegistrationsCredentialListMappingInstance + """ + + data = values.of( + { + "CredentialListSid": credential_list_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthRegistrationsCredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + async def create_async( + self, credential_list_sid: str + ) -> AuthRegistrationsCredentialListMappingInstance: + """ + Asynchronously create the AuthRegistrationsCredentialListMappingInstance + + :param credential_list_sid: The SID of the CredentialList resource to map to the SIP domain. + + :returns: The created AuthRegistrationsCredentialListMappingInstance + """ + + data = values.of( + { + "CredentialListSid": credential_list_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return AuthRegistrationsCredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[AuthRegistrationsCredentialListMappingInstance]: + """ + Streams AuthRegistrationsCredentialListMappingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[AuthRegistrationsCredentialListMappingInstance]: + """ + Asynchronously streams AuthRegistrationsCredentialListMappingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthRegistrationsCredentialListMappingInstance]: + """ + Lists AuthRegistrationsCredentialListMappingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[AuthRegistrationsCredentialListMappingInstance]: + """ + Asynchronously lists AuthRegistrationsCredentialListMappingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthRegistrationsCredentialListMappingPage: + """ + Retrieve a single page of AuthRegistrationsCredentialListMappingInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthRegistrationsCredentialListMappingInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthRegistrationsCredentialListMappingPage( + self._version, response, self._solution + ) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> AuthRegistrationsCredentialListMappingPage: + """ + Asynchronously retrieve a single page of AuthRegistrationsCredentialListMappingInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of AuthRegistrationsCredentialListMappingInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return AuthRegistrationsCredentialListMappingPage( + self._version, response, self._solution + ) + + def get_page(self, target_url: str) -> AuthRegistrationsCredentialListMappingPage: + """ + Retrieve a specific page of AuthRegistrationsCredentialListMappingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthRegistrationsCredentialListMappingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return AuthRegistrationsCredentialListMappingPage( + self._version, response, self._solution + ) + + async def get_page_async( + self, target_url: str + ) -> AuthRegistrationsCredentialListMappingPage: + """ + Asynchronously retrieve a specific page of AuthRegistrationsCredentialListMappingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of AuthRegistrationsCredentialListMappingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return AuthRegistrationsCredentialListMappingPage( + self._version, response, self._solution + ) + + def get(self, sid: str) -> AuthRegistrationsCredentialListMappingContext: + """ + Constructs a AuthRegistrationsCredentialListMappingContext + + :param sid: The Twilio-provided string that uniquely identifies the CredentialListMapping resource to fetch. + """ + return AuthRegistrationsCredentialListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> AuthRegistrationsCredentialListMappingContext: + """ + Constructs a AuthRegistrationsCredentialListMappingContext + + :param sid: The Twilio-provided string that uniquely identifies the CredentialListMapping resource to fetch. + """ + return AuthRegistrationsCredentialListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/credential_list_mapping.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/credential_list_mapping.py new file mode 100644 index 00000000..b520f481 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/credential_list_mapping.py @@ -0,0 +1,568 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class CredentialListMappingInstance(InstanceResource): + """ + :ivar account_sid: The unique id of the Account that is responsible for this resource. + :ivar date_created: The date that this resource was created, given as GMT in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar date_updated: The date that this resource was last updated, given as GMT in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar domain_sid: The unique string that is created to identify the SipDomain resource. + :ivar friendly_name: A human readable descriptive text for this resource, up to 64 characters long. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar uri: The URI for this resource, relative to `https://api.twilio.com` + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + domain_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.domain_sid: Optional[str] = payload.get("domain_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.sid: Optional[str] = payload.get("sid") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + "sid": sid or self.sid, + } + self._context: Optional[CredentialListMappingContext] = None + + @property + def _proxy(self) -> "CredentialListMappingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: CredentialListMappingContext for this CredentialListMappingInstance + """ + if self._context is None: + self._context = CredentialListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the CredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "CredentialListMappingInstance": + """ + Fetch the CredentialListMappingInstance + + + :returns: The fetched CredentialListMappingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "CredentialListMappingInstance": + """ + Asynchronous coroutine to fetch the CredentialListMappingInstance + + + :returns: The fetched CredentialListMappingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialListMappingContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, domain_sid: str, sid: str): + """ + Initialize the CredentialListMappingContext + + :param version: Version that contains the resource + :param account_sid: The unique id of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this resource. + :param domain_sid: A 34 character string that uniquely identifies the SIP Domain that includes the resource to fetch. + :param sid: A 34 character string that uniquely identifies the resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/CredentialListMappings/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the CredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the CredentialListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> CredentialListMappingInstance: + """ + Fetch the CredentialListMappingInstance + + + :returns: The fetched CredentialListMappingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return CredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> CredentialListMappingInstance: + """ + Asynchronous coroutine to fetch the CredentialListMappingInstance + + + :returns: The fetched CredentialListMappingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return CredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class CredentialListMappingPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> CredentialListMappingInstance: + """ + Build an instance of CredentialListMappingInstance + + :param payload: Payload response from the API + """ + return CredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class CredentialListMappingList(ListResource): + + def __init__(self, version: Version, account_sid: str, domain_sid: str): + """ + Initialize the CredentialListMappingList + + :param version: Version that contains the resource + :param account_sid: The unique id of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this resource. + :param domain_sid: A 34 character string that uniquely identifies the SIP Domain that includes the resource to read. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/CredentialListMappings.json".format( + **self._solution + ) + + def create(self, credential_list_sid: str) -> CredentialListMappingInstance: + """ + Create the CredentialListMappingInstance + + :param credential_list_sid: A 34 character string that uniquely identifies the CredentialList resource to map to the SIP domain. + + :returns: The created CredentialListMappingInstance + """ + + data = values.of( + { + "CredentialListSid": credential_list_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + async def create_async( + self, credential_list_sid: str + ) -> CredentialListMappingInstance: + """ + Asynchronously create the CredentialListMappingInstance + + :param credential_list_sid: A 34 character string that uniquely identifies the CredentialList resource to map to the SIP domain. + + :returns: The created CredentialListMappingInstance + """ + + data = values.of( + { + "CredentialListSid": credential_list_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return CredentialListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[CredentialListMappingInstance]: + """ + Streams CredentialListMappingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[CredentialListMappingInstance]: + """ + Asynchronously streams CredentialListMappingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialListMappingInstance]: + """ + Lists CredentialListMappingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[CredentialListMappingInstance]: + """ + Asynchronously lists CredentialListMappingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialListMappingPage: + """ + Retrieve a single page of CredentialListMappingInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialListMappingInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialListMappingPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> CredentialListMappingPage: + """ + Asynchronously retrieve a single page of CredentialListMappingInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of CredentialListMappingInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return CredentialListMappingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> CredentialListMappingPage: + """ + Retrieve a specific page of CredentialListMappingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialListMappingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return CredentialListMappingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> CredentialListMappingPage: + """ + Asynchronously retrieve a specific page of CredentialListMappingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of CredentialListMappingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return CredentialListMappingPage(self._version, response, self._solution) + + def get(self, sid: str) -> CredentialListMappingContext: + """ + Constructs a CredentialListMappingContext + + :param sid: A 34 character string that uniquely identifies the resource to fetch. + """ + return CredentialListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> CredentialListMappingContext: + """ + Constructs a CredentialListMappingContext + + :param sid: A 34 character string that uniquely identifies the resource to fetch. + """ + return CredentialListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/ip_access_control_list_mapping.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/ip_access_control_list_mapping.py new file mode 100644 index 00000000..4dfecfe8 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/domain/ip_access_control_list_mapping.py @@ -0,0 +1,574 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page + + +class IpAccessControlListMappingInstance(InstanceResource): + """ + :ivar account_sid: The unique id of the Account that is responsible for this resource. + :ivar date_created: The date that this resource was created, given as GMT in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar date_updated: The date that this resource was last updated, given as GMT in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar domain_sid: The unique string that is created to identify the SipDomain resource. + :ivar friendly_name: A human readable descriptive text for this resource, up to 64 characters long. + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar uri: The URI for this resource, relative to `https://api.twilio.com` + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + domain_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.account_sid: Optional[str] = payload.get("account_sid") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.domain_sid: Optional[str] = payload.get("domain_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.sid: Optional[str] = payload.get("sid") + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + "sid": sid or self.sid, + } + self._context: Optional[IpAccessControlListMappingContext] = None + + @property + def _proxy(self) -> "IpAccessControlListMappingContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: IpAccessControlListMappingContext for this IpAccessControlListMappingInstance + """ + if self._context is None: + self._context = IpAccessControlListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the IpAccessControlListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the IpAccessControlListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "IpAccessControlListMappingInstance": + """ + Fetch the IpAccessControlListMappingInstance + + + :returns: The fetched IpAccessControlListMappingInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "IpAccessControlListMappingInstance": + """ + Asynchronous coroutine to fetch the IpAccessControlListMappingInstance + + + :returns: The fetched IpAccessControlListMappingInstance + """ + return await self._proxy.fetch_async() + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format( + context + ) + + +class IpAccessControlListMappingContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, domain_sid: str, sid: str): + """ + Initialize the IpAccessControlListMappingContext + + :param version: Version that contains the resource + :param account_sid: The unique id of the Account that is responsible for this resource. + :param domain_sid: A 34 character string that uniquely identifies the SIP domain. + :param sid: A 34 character string that uniquely identifies the resource to fetch. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + "sid": sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/IpAccessControlListMappings/{sid}.json".format( + **self._solution + ) + + def delete(self) -> bool: + """ + Deletes the IpAccessControlListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the IpAccessControlListMappingInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> IpAccessControlListMappingInstance: + """ + Fetch the IpAccessControlListMappingInstance + + + :returns: The fetched IpAccessControlListMappingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return IpAccessControlListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> IpAccessControlListMappingInstance: + """ + Asynchronous coroutine to fetch the IpAccessControlListMappingInstance + + + :returns: The fetched IpAccessControlListMappingInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return IpAccessControlListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=self._solution["sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class IpAccessControlListMappingPage(Page): + + def get_instance( + self, payload: Dict[str, Any] + ) -> IpAccessControlListMappingInstance: + """ + Build an instance of IpAccessControlListMappingInstance + + :param payload: Payload response from the API + """ + return IpAccessControlListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class IpAccessControlListMappingList(ListResource): + + def __init__(self, version: Version, account_sid: str, domain_sid: str): + """ + Initialize the IpAccessControlListMappingList + + :param version: Version that contains the resource + :param account_sid: The unique id of the Account that is responsible for this resource. + :param domain_sid: A 34 character string that uniquely identifies the SIP domain. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "domain_sid": domain_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/Domains/{domain_sid}/IpAccessControlListMappings.json".format( + **self._solution + ) + + def create( + self, ip_access_control_list_sid: str + ) -> IpAccessControlListMappingInstance: + """ + Create the IpAccessControlListMappingInstance + + :param ip_access_control_list_sid: The unique id of the IP access control list to map to the SIP domain. + + :returns: The created IpAccessControlListMappingInstance + """ + + data = values.of( + { + "IpAccessControlListSid": ip_access_control_list_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IpAccessControlListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + async def create_async( + self, ip_access_control_list_sid: str + ) -> IpAccessControlListMappingInstance: + """ + Asynchronously create the IpAccessControlListMappingInstance + + :param ip_access_control_list_sid: The unique id of the IP access control list to map to the SIP domain. + + :returns: The created IpAccessControlListMappingInstance + """ + + data = values.of( + { + "IpAccessControlListSid": ip_access_control_list_sid, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IpAccessControlListMappingInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[IpAccessControlListMappingInstance]: + """ + Streams IpAccessControlListMappingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[IpAccessControlListMappingInstance]: + """ + Asynchronously streams IpAccessControlListMappingInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[IpAccessControlListMappingInstance]: + """ + Lists IpAccessControlListMappingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[IpAccessControlListMappingInstance]: + """ + Asynchronously lists IpAccessControlListMappingInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> IpAccessControlListMappingPage: + """ + Retrieve a single page of IpAccessControlListMappingInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of IpAccessControlListMappingInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return IpAccessControlListMappingPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> IpAccessControlListMappingPage: + """ + Asynchronously retrieve a single page of IpAccessControlListMappingInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of IpAccessControlListMappingInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return IpAccessControlListMappingPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> IpAccessControlListMappingPage: + """ + Retrieve a specific page of IpAccessControlListMappingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of IpAccessControlListMappingInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return IpAccessControlListMappingPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> IpAccessControlListMappingPage: + """ + Asynchronously retrieve a specific page of IpAccessControlListMappingInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of IpAccessControlListMappingInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return IpAccessControlListMappingPage(self._version, response, self._solution) + + def get(self, sid: str) -> IpAccessControlListMappingContext: + """ + Constructs a IpAccessControlListMappingContext + + :param sid: A 34 character string that uniquely identifies the resource to fetch. + """ + return IpAccessControlListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=sid, + ) + + def __call__(self, sid: str) -> IpAccessControlListMappingContext: + """ + Constructs a IpAccessControlListMappingContext + + :param sid: A 34 character string that uniquely identifies the resource to fetch. + """ + return IpAccessControlListMappingContext( + self._version, + account_sid=self._solution["account_sid"], + domain_sid=self._solution["domain_sid"], + sid=sid, + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/ip_access_control_list/__init__.py b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/ip_access_control_list/__init__.py new file mode 100644 index 00000000..afa504c2 --- /dev/null +++ b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/ip_access_control_list/__init__.py @@ -0,0 +1,657 @@ +r""" + This code was generated by + ___ _ _ _ _ _ _ ____ ____ ____ _ ____ ____ _ _ ____ ____ ____ ___ __ __ + | | | | | | | | | __ | | |__| | __ | __ |___ |\ | |___ |__/ |__| | | | |__/ + | |_|_| | |___ | |__| |__| | | | |__] |___ | \| |___ | \ | | | |__| | \ + + Twilio - Api + This is the public Twilio REST API. + + NOTE: This class is auto generated by OpenAPI Generator. + https://openapi-generator.tech + Do not edit the class manually. +""" + +from datetime import datetime +from typing import Any, Dict, List, Optional, Union, Iterator, AsyncIterator +from twilio.base import deserialize, values +from twilio.base.instance_context import InstanceContext +from twilio.base.instance_resource import InstanceResource +from twilio.base.list_resource import ListResource +from twilio.base.version import Version +from twilio.base.page import Page +from twilio.rest.api.v2010.account.sip.ip_access_control_list.ip_address import ( + IpAddressList, +) + + +class IpAccessControlListInstance(InstanceResource): + """ + :ivar sid: A 34 character string that uniquely identifies this resource. + :ivar account_sid: The unique id of the [Account](https://www.twilio.com/docs/iam/api/account) that owns this resource. + :ivar friendly_name: A human readable descriptive text, up to 255 characters long. + :ivar date_created: The date that this resource was created, given as GMT in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar date_updated: The date that this resource was last updated, given as GMT in [RFC 2822](https://www.php.net/manual/en/class.datetime.php#datetime.constants.rfc2822) format. + :ivar subresource_uris: A list of the IpAddress resources associated with this IP access control list resource. + :ivar uri: The URI for this resource, relative to `https://api.twilio.com` + """ + + def __init__( + self, + version: Version, + payload: Dict[str, Any], + account_sid: str, + sid: Optional[str] = None, + ): + super().__init__(version) + + self.sid: Optional[str] = payload.get("sid") + self.account_sid: Optional[str] = payload.get("account_sid") + self.friendly_name: Optional[str] = payload.get("friendly_name") + self.date_created: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_created") + ) + self.date_updated: Optional[datetime] = deserialize.rfc2822_datetime( + payload.get("date_updated") + ) + self.subresource_uris: Optional[Dict[str, object]] = payload.get( + "subresource_uris" + ) + self.uri: Optional[str] = payload.get("uri") + + self._solution = { + "account_sid": account_sid, + "sid": sid or self.sid, + } + self._context: Optional[IpAccessControlListContext] = None + + @property + def _proxy(self) -> "IpAccessControlListContext": + """ + Generate an instance context for the instance, the context is capable of + performing various actions. All instance actions are proxied to the context + + :returns: IpAccessControlListContext for this IpAccessControlListInstance + """ + if self._context is None: + self._context = IpAccessControlListContext( + self._version, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + return self._context + + def delete(self) -> bool: + """ + Deletes the IpAccessControlListInstance + + + :returns: True if delete succeeds, False otherwise + """ + return self._proxy.delete() + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the IpAccessControlListInstance + + + :returns: True if delete succeeds, False otherwise + """ + return await self._proxy.delete_async() + + def fetch(self) -> "IpAccessControlListInstance": + """ + Fetch the IpAccessControlListInstance + + + :returns: The fetched IpAccessControlListInstance + """ + return self._proxy.fetch() + + async def fetch_async(self) -> "IpAccessControlListInstance": + """ + Asynchronous coroutine to fetch the IpAccessControlListInstance + + + :returns: The fetched IpAccessControlListInstance + """ + return await self._proxy.fetch_async() + + def update(self, friendly_name: str) -> "IpAccessControlListInstance": + """ + Update the IpAccessControlListInstance + + :param friendly_name: A human readable descriptive text, up to 255 characters long. + + :returns: The updated IpAccessControlListInstance + """ + return self._proxy.update( + friendly_name=friendly_name, + ) + + async def update_async(self, friendly_name: str) -> "IpAccessControlListInstance": + """ + Asynchronous coroutine to update the IpAccessControlListInstance + + :param friendly_name: A human readable descriptive text, up to 255 characters long. + + :returns: The updated IpAccessControlListInstance + """ + return await self._proxy.update_async( + friendly_name=friendly_name, + ) + + @property + def ip_addresses(self) -> IpAddressList: + """ + Access the ip_addresses + """ + return self._proxy.ip_addresses + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class IpAccessControlListContext(InstanceContext): + + def __init__(self, version: Version, account_sid: str, sid: str): + """ + Initialize the IpAccessControlListContext + + :param version: Version that contains the resource + :param account_sid: The unique id of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this resource. + :param sid: A 34 character string that uniquely identifies the resource to udpate. + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + "sid": sid, + } + self._uri = ( + "/Accounts/{account_sid}/SIP/IpAccessControlLists/{sid}.json".format( + **self._solution + ) + ) + + self._ip_addresses: Optional[IpAddressList] = None + + def delete(self) -> bool: + """ + Deletes the IpAccessControlListInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return self._version.delete(method="DELETE", uri=self._uri, headers=headers) + + async def delete_async(self) -> bool: + """ + Asynchronous coroutine that deletes the IpAccessControlListInstance + + + :returns: True if delete succeeds, False otherwise + """ + + headers = values.of({}) + + return await self._version.delete_async( + method="DELETE", uri=self._uri, headers=headers + ) + + def fetch(self) -> IpAccessControlListInstance: + """ + Fetch the IpAccessControlListInstance + + + :returns: The fetched IpAccessControlListInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = self._version.fetch(method="GET", uri=self._uri, headers=headers) + + return IpAccessControlListInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def fetch_async(self) -> IpAccessControlListInstance: + """ + Asynchronous coroutine to fetch the IpAccessControlListInstance + + + :returns: The fetched IpAccessControlListInstance + """ + + headers = values.of({}) + + headers["Accept"] = "application/json" + + payload = await self._version.fetch_async( + method="GET", uri=self._uri, headers=headers + ) + + return IpAccessControlListInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + def update(self, friendly_name: str) -> IpAccessControlListInstance: + """ + Update the IpAccessControlListInstance + + :param friendly_name: A human readable descriptive text, up to 255 characters long. + + :returns: The updated IpAccessControlListInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.update( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IpAccessControlListInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + async def update_async(self, friendly_name: str) -> IpAccessControlListInstance: + """ + Asynchronous coroutine to update the IpAccessControlListInstance + + :param friendly_name: A human readable descriptive text, up to 255 characters long. + + :returns: The updated IpAccessControlListInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.update_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IpAccessControlListInstance( + self._version, + payload, + account_sid=self._solution["account_sid"], + sid=self._solution["sid"], + ) + + @property + def ip_addresses(self) -> IpAddressList: + """ + Access the ip_addresses + """ + if self._ip_addresses is None: + self._ip_addresses = IpAddressList( + self._version, + self._solution["account_sid"], + self._solution["sid"], + ) + return self._ip_addresses + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + context = " ".join("{}={}".format(k, v) for k, v in self._solution.items()) + return "".format(context) + + +class IpAccessControlListPage(Page): + + def get_instance(self, payload: Dict[str, Any]) -> IpAccessControlListInstance: + """ + Build an instance of IpAccessControlListInstance + + :param payload: Payload response from the API + """ + return IpAccessControlListInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" + + +class IpAccessControlListList(ListResource): + + def __init__(self, version: Version, account_sid: str): + """ + Initialize the IpAccessControlListList + + :param version: Version that contains the resource + :param account_sid: The unique id of the [Account](https://www.twilio.com/docs/iam/api/account) responsible for this resource. + + """ + super().__init__(version) + + # Path Solution + self._solution = { + "account_sid": account_sid, + } + self._uri = "/Accounts/{account_sid}/SIP/IpAccessControlLists.json".format( + **self._solution + ) + + def create(self, friendly_name: str) -> IpAccessControlListInstance: + """ + Create the IpAccessControlListInstance + + :param friendly_name: A human readable descriptive text that describes the IpAccessControlList, up to 255 characters long. + + :returns: The created IpAccessControlListInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = self._version.create( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IpAccessControlListInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + async def create_async(self, friendly_name: str) -> IpAccessControlListInstance: + """ + Asynchronously create the IpAccessControlListInstance + + :param friendly_name: A human readable descriptive text that describes the IpAccessControlList, up to 255 characters long. + + :returns: The created IpAccessControlListInstance + """ + + data = values.of( + { + "FriendlyName": friendly_name, + } + ) + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Content-Type"] = "application/x-www-form-urlencoded" + + headers["Accept"] = "application/json" + + payload = await self._version.create_async( + method="POST", uri=self._uri, data=data, headers=headers + ) + + return IpAccessControlListInstance( + self._version, payload, account_sid=self._solution["account_sid"] + ) + + def stream( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> Iterator[IpAccessControlListInstance]: + """ + Streams IpAccessControlListInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = self.page(page_size=limits["page_size"]) + + return self._version.stream(page, limits["limit"]) + + async def stream_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> AsyncIterator[IpAccessControlListInstance]: + """ + Asynchronously streams IpAccessControlListInstance records from the API as a generator stream. + This operation lazily loads records as efficiently as possible until the limit + is reached. + The results are returned as a generator, so this operation is memory efficient. + + :param limit: Upper limit for the number of records to return. stream() + guarantees to never return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, stream() will attempt to read the + limit with the most efficient page size, i.e. min(limit, 1000) + + :returns: Generator that will yield up to limit results + """ + limits = self._version.read_limits(limit, page_size) + page = await self.page_async(page_size=limits["page_size"]) + + return self._version.stream_async(page, limits["limit"]) + + def list( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[IpAccessControlListInstance]: + """ + Lists IpAccessControlListInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return list( + self.stream( + limit=limit, + page_size=page_size, + ) + ) + + async def list_async( + self, + limit: Optional[int] = None, + page_size: Optional[int] = None, + ) -> List[IpAccessControlListInstance]: + """ + Asynchronously lists IpAccessControlListInstance records from the API as a list. + Unlike stream(), this operation is eager and will load `limit` records into + memory before returning. + + :param limit: Upper limit for the number of records to return. list() guarantees + never to return more than limit. Default is no limit + :param page_size: Number of records to fetch per request, when not set will use + the default value of 50 records. If no page_size is defined + but a limit is defined, list() will attempt to read the limit + with the most efficient page size, i.e. min(limit, 1000) + + :returns: list that will contain up to limit results + """ + return [ + record + async for record in await self.stream_async( + limit=limit, + page_size=page_size, + ) + ] + + def page( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> IpAccessControlListPage: + """ + Retrieve a single page of IpAccessControlListInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of IpAccessControlListInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = self._version.page( + method="GET", uri=self._uri, params=data, headers=headers + ) + return IpAccessControlListPage(self._version, response, self._solution) + + async def page_async( + self, + page_token: Union[str, object] = values.unset, + page_number: Union[int, object] = values.unset, + page_size: Union[int, object] = values.unset, + ) -> IpAccessControlListPage: + """ + Asynchronously retrieve a single page of IpAccessControlListInstance records from the API. + Request is executed immediately + + :param page_token: PageToken provided by the API + :param page_number: Page Number, this value is simply for client state + :param page_size: Number of records to return, defaults to 50 + + :returns: Page of IpAccessControlListInstance + """ + data = values.of( + { + "PageToken": page_token, + "Page": page_number, + "PageSize": page_size, + } + ) + + headers = values.of({"Content-Type": "application/x-www-form-urlencoded"}) + + headers["Accept"] = "application/json" + + response = await self._version.page_async( + method="GET", uri=self._uri, params=data, headers=headers + ) + return IpAccessControlListPage(self._version, response, self._solution) + + def get_page(self, target_url: str) -> IpAccessControlListPage: + """ + Retrieve a specific page of IpAccessControlListInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of IpAccessControlListInstance + """ + response = self._version.domain.twilio.request("GET", target_url) + return IpAccessControlListPage(self._version, response, self._solution) + + async def get_page_async(self, target_url: str) -> IpAccessControlListPage: + """ + Asynchronously retrieve a specific page of IpAccessControlListInstance records from the API. + Request is executed immediately + + :param target_url: API-generated URL for the requested results page + + :returns: Page of IpAccessControlListInstance + """ + response = await self._version.domain.twilio.request_async("GET", target_url) + return IpAccessControlListPage(self._version, response, self._solution) + + def get(self, sid: str) -> IpAccessControlListContext: + """ + Constructs a IpAccessControlListContext + + :param sid: A 34 character string that uniquely identifies the resource to udpate. + """ + return IpAccessControlListContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __call__(self, sid: str) -> IpAccessControlListContext: + """ + Constructs a IpAccessControlListContext + + :param sid: A 34 character string that uniquely identifies the resource to udpate. + """ + return IpAccessControlListContext( + self._version, account_sid=self._solution["account_sid"], sid=sid + ) + + def __repr__(self) -> str: + """ + Provide a friendly representation + + :returns: Machine friendly representation + """ + return "" diff --git a/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/ip_access_control_list/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/twilio/rest/api/v2010/account/sip/ip_access_control_list/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9772945e70be4f8ade0ee4fddbc33b3534ea373 GIT binary patch literal 27468 zcmeHwdvFw2x?lH9&r>7Kpcj&mph18bkVXQ`V*#@k53^ch84Ka9mGK=9Gc7cD9@_2^ zShBQnY?3Q-acuV1F5=cE#=DysUHit`o8&Hg^YBuYN?esxMRVnpR8#A^9Dq#H2VNiWIjeY)SioJt+-HNymUA=^St-T?4M9d%&Ia40u=` zDdA043{)h213vcdNK_`P2C7)xneZnA0|6FyB~~P>2dY`zov2CH4%D)^CsCKIAE;+> zZ(?P#VW2@2Y{C&CR&id4`INwWcHYl{MwVKM)GDRQOl@MRexwGJdNXwuOI?A~YNgst zZ62)&)<*ujC zUiDm-EL0B_3x`>&C%2L@g+#QRlil$NCD2IF=GDJpn@!uf$Lm;do42VElTTC3VdjRM$ znXRY8FMIZ#Yu02?nz-#j5*I&4tNxAtS06@FTIC!`VCaXT#9ed z7W15!1}gQq7xAiCEf7%}@Z;&jGZ3ppovxTLD8;JqzQXeE$9pwub}2QeDPXC+7HLkT ztw4^tN#SL2p#HcJtjn#!aHCO-mL^V3Cuq>d#6_L~;{qU<1r3}dW|OS|2P$!$dd7D7G@41tpnpf6?w8{!`T4#l56atiZ`)Qp z@Zq81P)f;ka^&h%Qk@LhLI!4qkfGIliKZDsWVDbv7^TXB@?cs`MlyGGcx0Fg-A9Lk z+E`^sIg2hoR+)>xi2?%mnCn7S+9LudRf%KiH!?qoJMNl8FT;GhJN^rlo;}b&G{M? zf}UQr0Uyy zgu^-eX(dx=Pi>->X)L*bPBy{@MNwDLw`K}jC|FIoJYg-J7@^G@brKTM*6Ykknvxh) z>nK}21vD1c3JQc7)e46-njB(=5E>p;*P